void lm_at_parser(struct lm_at_state *s) { int state, c; switch(s->at_state) { case AT_MODE_COMMAND: for(;;) { /* handle incoming character */ c = sm_get_bit(&s->sm->tx_fifo); if (c == -1) break; if (c == '\n' || c == '\r') { /* line validation */ s->at_line[s->at_line_ptr] = '\0'; if (s->at_line_ptr != 0) { at_putc(s, '\n'); parse_at_line(s, s->at_line); } s->at_line_ptr = 0; } else if (c == '\b') { /* backspace */ if (s->at_line_ptr > 0) { s->at_line_ptr--; at_printf(s, "\b \b"); } } else { /* add new char */ if (s->at_line_ptr < (sizeof(s->at_line) - 1)) { s->at_line[s->at_line_ptr++] = c; at_putc(s, c); } } } break; case AT_MODE_DIALING: state = lm_get_state(s->sm); if (state == LM_STATE_IDLE) { at_printf(s, "ERROR\n"); s->at_state = AT_MODE_COMMAND; } else if (state == LM_STATE_CONNECTED) { at_printf(s, "CONNECT\n"); s->at_state = AT_MODE_CONNECTED; } break; case AT_MODE_CONNECTED: if (lm_get_state(s->sm) == LM_STATE_IDLE) { at_printf(s, "OK\n"); s->at_state = AT_MODE_COMMAND; } break; } }
static int at_write(const char *data, int size) { int i = 0; for ( ; i < size; i++) { if (at_putc(data[i]) < 0) { return -1; } } return i; }
static bool at_vsend(const char *command, va_list args) { char *_buffer = at._buffer; char *_send_delimiter = at._send_delimiter; if (vsprintf(_buffer, command, args) < 0) { return false; } for (int i = 0; _buffer[i]; i++) { if (at_putc(_buffer[i]) < 0) { return false; } } // Finish with newline for (int i = 0; _send_delimiter[i]; i++) { if (at_putc(_send_delimiter[i]) < 0) { return false; } } LOGD(MODULE_NAME, "AT> %s\r\n", _buffer); return true; }
static void at_printf(struct lm_at_state *s, char *fmt, ...) { char buf[256], *p; int c; va_list ap; va_start(ap, fmt); snprintf(buf, sizeof(buf), fmt, ap); p = buf; while (*p) { c = *p++; at_putc(s, c); } va_end(ap); }