272 lines
5.7 KiB
C
272 lines
5.7 KiB
C
/*************
|
|
app_datetime.c
|
|
SDK_LICENSE
|
|
***************/
|
|
|
|
#include "phy_console.h"
|
|
#include "uart.h"
|
|
#include "error.h"
|
|
#include "OSAL.h"
|
|
#include "string.h"
|
|
#include "pwrmgr.h"
|
|
#include "log.h"
|
|
|
|
|
|
typedef enum
|
|
{
|
|
CONS_ST_IDLE,
|
|
CONS_ST_RX,
|
|
CONS_ST_CMD
|
|
} cons_state_t;
|
|
|
|
typedef struct
|
|
{
|
|
cons_state_t state;
|
|
uint16_t rx_cnt;
|
|
uint8_t rx_buf[CONS_CMD_RXBUF_MAX];
|
|
const cons_cmd_t* cmd_list;
|
|
cons_callback_t callback;
|
|
} cons_ctx_t;
|
|
|
|
cons_ctx_t s_cons_ctx;
|
|
|
|
|
|
void console_parse_cmd(void)
|
|
{
|
|
uint16_t i,j;
|
|
uint16_t cmd_id = 0;
|
|
char* param_table[CONS_PARAM_NUM_MAX];
|
|
cons_ctx_t* pctx = &s_cons_ctx;
|
|
const cons_cmd_t* cmd_list = pctx->cmd_list;
|
|
uint8_t* prx = s_cons_ctx.rx_buf;
|
|
char* pcmd = NULL;
|
|
char* pparam = NULL;
|
|
uint8_t param_num = 0;
|
|
|
|
//LOG("\n");
|
|
//for(i = 0; i< pctx->rx_cnt; i++)
|
|
// LOG("%x ",prx[i]);
|
|
// LOG("\n");
|
|
|
|
//parse "at"
|
|
for(i = 1; i< pctx->rx_cnt; i++)
|
|
{
|
|
if(prx[i-1] == 'a' && prx[i] == 't')
|
|
{
|
|
i++;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(i == pctx->rx_cnt)
|
|
{
|
|
LOG("Parse filed, did not found \"at\"\n");
|
|
return;
|
|
}
|
|
|
|
//parse cmd
|
|
{
|
|
pcmd = (char*)prx+i;
|
|
|
|
for(; i< pctx->rx_cnt; i++)
|
|
{
|
|
if(prx[i] == ' ' || prx[i] == '\0' )
|
|
{
|
|
prx[i] = '\0';
|
|
break;
|
|
}
|
|
|
|
if(prx[i] < 0x20 || prx[i] > 0x7d)
|
|
{
|
|
LOG("Parse failed, cmd has illegal character\n");
|
|
return;
|
|
}
|
|
}
|
|
|
|
if(osal_strlen(pcmd) == 0)
|
|
{
|
|
LOG("Parse failed, cmd is empty\n");
|
|
return;
|
|
}
|
|
|
|
for(j = 0; j<CONS_CMD_NUM_MAX; j++)
|
|
{
|
|
if(cmd_list[j].cmd_id == 0 || cmd_list[j].cmd_name == NULL )
|
|
{
|
|
LOG("Parse failed, cmd is not match cmdlist\n");
|
|
return;
|
|
}
|
|
|
|
if(strcmp(pcmd, cmd_list[j].cmd_name) == 0)
|
|
{
|
|
//match
|
|
cmd_id = cmd_list[j].cmd_id;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(cmd_id == 0)
|
|
{
|
|
LOG("Parse failed, cmd is not match cmdlist_1\n");
|
|
return;
|
|
}
|
|
}
|
|
i++;
|
|
//parse parameter
|
|
pparam = (char*)prx+i;
|
|
|
|
for(; i< pctx->rx_cnt; i++)
|
|
{
|
|
if(prx[i] == ' ')
|
|
{
|
|
prx[i] = '\0';
|
|
|
|
if(osal_strlen(pparam) == 0)
|
|
{
|
|
break;
|
|
}
|
|
|
|
param_table[param_num] = pparam;
|
|
param_num++;
|
|
|
|
if(param_num >= CONS_PARAM_NUM_MAX)
|
|
break;
|
|
|
|
pparam = (char*)prx+i+1;
|
|
continue;
|
|
}
|
|
|
|
if(prx[i] == '\0')
|
|
{
|
|
if(osal_strlen(pparam) == 0)
|
|
{
|
|
break;
|
|
}
|
|
|
|
param_table[param_num] = pparam;
|
|
param_num++;
|
|
break;
|
|
}
|
|
|
|
if(prx[i] < 0x20 || prx[i] > 0x7d)
|
|
{
|
|
LOG("Parse failed, parameter has illegal character\n");
|
|
return;
|
|
}
|
|
}
|
|
|
|
pctx->callback(cmd_id, param_num, param_table);
|
|
}
|
|
|
|
|
|
void console_sleep_handler(void)
|
|
{
|
|
hal_gpio_fmux(P10, Bit_DISABLE); //enable fullmux fuction; enable or disable
|
|
hal_gpio_wakeup_set(P10, NEGEDGE);
|
|
}
|
|
|
|
void console_wakeup_handler(void)
|
|
{
|
|
int i;
|
|
hal_gpio_write(P14, 0);
|
|
hal_gpio_write(P14, 1);
|
|
hal_gpio_write(P14, 0);
|
|
|
|
for(i = 0; i< 20; i++)
|
|
{
|
|
if(hal_gpio_read(P10)==0)
|
|
{
|
|
hal_pwrmgr_lock(MOD_CONSOLE);
|
|
break;
|
|
}
|
|
}
|
|
|
|
hal_gpio_write(P14, 0);
|
|
hal_gpio_write(P14, 1);
|
|
hal_gpio_write(P14, 0);
|
|
s_cons_ctx.state = CONS_ST_IDLE;
|
|
}
|
|
|
|
void console_rx_handler(uart_Evt_t* pev)
|
|
{
|
|
cons_ctx_t* pctx = &s_cons_ctx;
|
|
uint8_t* prx = s_cons_ctx.rx_buf;
|
|
|
|
switch(pev->type)
|
|
{
|
|
case UART_EVT_TYPE_RX_DATA:
|
|
case UART_EVT_TYPE_RX_DATA_TO:
|
|
{
|
|
uint8_t i;
|
|
uint8_t* prx_msg = pev->data;
|
|
|
|
//for(i = 0; i< pev->len; i++)
|
|
// LOG("%x ",pev->data[i]);
|
|
//LOG("\n");
|
|
if(pctx->state == CONS_ST_IDLE)
|
|
{
|
|
hal_pwrmgr_lock(MOD_CONSOLE);
|
|
pctx->state = CONS_ST_RX;
|
|
}
|
|
|
|
if(pctx->state == CONS_ST_RX)
|
|
{
|
|
for(i = 0; i< pev->len; i++)
|
|
{
|
|
if(prx_msg[i] == '\r' ||prx_msg[i] == '\n')
|
|
{
|
|
prx[pctx->rx_cnt] = 0;
|
|
pctx->rx_cnt++;
|
|
pctx->state = CONS_ST_CMD;
|
|
console_parse_cmd();
|
|
pctx->state = CONS_ST_IDLE;
|
|
pctx->rx_cnt = 0;
|
|
hal_pwrmgr_unlock(MOD_CONSOLE);
|
|
break;
|
|
}
|
|
|
|
prx[pctx->rx_cnt] = prx_msg[i];
|
|
pctx->rx_cnt++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hal_pwrmgr_unlock(MOD_CONSOLE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
int console_init(const cons_cmd_t* cmdlist, cons_callback_t callback)
|
|
{
|
|
uart_Cfg_t cfg =
|
|
{
|
|
.tx_pin = P9,
|
|
.rx_pin = P10,
|
|
.rts_pin = GPIO_DUMMY,
|
|
.cts_pin = GPIO_DUMMY,
|
|
.baudrate = 115200,
|
|
.use_fifo = TRUE,
|
|
.hw_fwctrl = FALSE,
|
|
.use_tx_buf = FALSE,
|
|
.parity = FALSE,
|
|
.evt_handler = console_rx_handler,
|
|
};
|
|
|
|
if(callback == NULL)
|
|
return PPlus_ERR_INVALID_PARAM;
|
|
|
|
hal_pwrmgr_register(MOD_CONSOLE, console_sleep_handler, console_wakeup_handler);
|
|
hal_uart_init(cfg,UART0);//uart init
|
|
s_cons_ctx.cmd_list = cmdlist;
|
|
s_cons_ctx.state = CONS_ST_IDLE;
|
|
s_cons_ctx.rx_cnt = 0;
|
|
s_cons_ctx.callback = callback;
|
|
return PPlus_SUCCESS;
|
|
}
|
|
|