| 446 | } |
| 447 | |
| 448 | static void server_parser(at_server_t server) |
| 449 | { |
| 450 | #define ESC_KEY 0x1B |
| 451 | #define BACKSPACE_KEY 0x08 |
| 452 | #define DELECT_KEY 0x7F |
| 453 | |
| 454 | char cur_cmd_name[AT_CMD_NAME_LEN] = { 0 }; |
| 455 | at_cmd_t cur_cmd = RT_NULL; |
| 456 | char *cur_cmd_args = RT_NULL, ch, last_ch; |
| 457 | at_result_t result; |
| 458 | |
| 459 | RT_ASSERT(server); |
| 460 | RT_ASSERT(server->status != AT_STATUS_UNINITIALIZED); |
| 461 | |
| 462 | while (1) |
| 463 | { |
| 464 | server->get_char(server, &ch, RT_WAITING_FOREVER); |
| 465 | if (ESC_KEY == ch) |
| 466 | { |
| 467 | break; |
| 468 | } |
| 469 | |
| 470 | if (ch == BACKSPACE_KEY || ch == DELECT_KEY) |
| 471 | { |
| 472 | if (server->cur_recv_len) |
| 473 | server->cur_recv_len--; |
| 474 | if (server->echo_mode) |
| 475 | at_server_printf("\b \b"); |
| 476 | } |
| 477 | else if (ch == AT_CMD_LF && last_ch == AT_CMD_CR) |
| 478 | { |
| 479 | /* skip '\n' if we get "\r\n" */ |
| 480 | } |
| 481 | else |
| 482 | { |
| 483 | if (server->cur_recv_len < sizeof(server->recv_buffer) - 1) |
| 484 | { |
| 485 | server->recv_buffer[server->cur_recv_len++] = ch; |
| 486 | if (ch == AT_CMD_CR || ch == AT_CMD_LF) |
| 487 | { |
| 488 | if (server->echo_mode) |
| 489 | at_server_printf("%c%c", AT_CMD_CR, AT_CMD_LF); |
| 490 | server->recv_buffer[server->cur_recv_len] = '\0'; |
| 491 | result = AT_RESULT_FAILE; |
| 492 | if (at_cmd_get_name(server->recv_buffer, cur_cmd_name) == RT_EOK) |
| 493 | { |
| 494 | cur_cmd = at_find_cmd(cur_cmd_name); |
| 495 | if (cur_cmd) |
| 496 | { |
| 497 | cur_cmd_args = server->recv_buffer + strlen(cur_cmd_name); |
| 498 | result = at_cmd_process(cur_cmd, cur_cmd_args); |
| 499 | } |
| 500 | } |
| 501 | |
| 502 | at_server_print_result(result); |
| 503 | server->cur_recv_len = 0; |
| 504 | } |
| 505 | else |
nothing calls this directly
no test coverage detected