예제 #1
0
파일: atparser.c 프로젝트: geofft/linmodem
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;
    }
}
예제 #2
0
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;
}
예제 #3
0
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;
}
예제 #4
0
파일: atparser.c 프로젝트: geofft/linmodem
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);
}