364 lines
13 KiB
C
Executable File
364 lines
13 KiB
C
Executable File
/****************************************************************************
|
|
|
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
|
|
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
|
be copied by any method or incorporated into another program without
|
|
the express written consent of Aerospace C.Power. This Information or any portion
|
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
|
liability for its use in any way and conveys no license or title under
|
|
any patent or copyright and makes no representation or warranty that this
|
|
Information is free from patent or copyright infringement.
|
|
|
|
****************************************************************************/
|
|
#ifndef _AT_COMMAND_H_
|
|
#define _AT_COMMAND_H_
|
|
|
|
#include "iot_flashinfo.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define INCLUDE_AT_COMMAND_DEBUG_PRINT 1
|
|
/* TODO , REMOVE DEBUG PRINTF WHEN MODULE OK. */
|
|
#if INCLUDE_AT_COMMAND_DEBUG_PRINT
|
|
|
|
|
|
#if (HW_PLATFORM == HW_PLATFORM_SIMU)
|
|
#define DINFOR(fmt, ...) do{\
|
|
iot_cus_printf("\r\n[grapp][at]info line:%04d@%s:" fmt "\r\n",\
|
|
__LINE__, __FILE__, ##__VA_ARGS__);\
|
|
}while(0)
|
|
|
|
#define DERROR(fmt, ...) do{\
|
|
iot_cus_printf("\r\n[grapp][at]error line:%04d@%s:" fmt "\r\n", \
|
|
__LINE__, __FILE__, ##__VA_ARGS__);\
|
|
}while(0)
|
|
#else
|
|
#define DINFOR(fmt, arg...) do{\
|
|
iot_cus_printf("\r\n[grapp][at]infor line:%04d@%s:" fmt "\r\n",\
|
|
__LINE__, __FILE__, ##arg);\
|
|
}while(0)
|
|
|
|
#define DERROR(fmt, arg...) do{\
|
|
iot_cus_printf("\r\n[grapp][at]error line:%04d@%s:" fmt "\r\n", \
|
|
__LINE__, __FILE__, ##arg);\
|
|
}while(0)
|
|
#endif
|
|
|
|
|
|
#else
|
|
|
|
#if (HW_PLATFORM == HW_PLATFORM_SIMU)
|
|
#define DINFOR(fmt, ...)
|
|
#define DERROR(fmt, ...)
|
|
|
|
#else
|
|
#define DINFOR(fmt, arg...)
|
|
#define DERROR(fmt, arg...)
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
/* The list of AT commands. This MUST contain all IDs of AT command. */
|
|
enum at_command_id_list_e
|
|
{
|
|
/* Command line : AT+LIST */
|
|
AT_CID_HELP = 0,
|
|
/* Command line : AT+MEMORY */
|
|
AT_CID_MEMORY = 1,
|
|
/* Command line : AT+TASK */
|
|
AT_CID_TASK = 2,
|
|
/* Command line : AT+TIME */
|
|
AT_CID_TIME = 3,
|
|
/* Command line : AT+SYSINFO */
|
|
AT_CID_SYSTEMINFO = 4,
|
|
/* Command line : AT+UART */
|
|
AT_CID_UART = 5,
|
|
/* Command line : AT+MAC */
|
|
AT_CID_MAC = 6,
|
|
/* Command line : AT+TOPO */
|
|
AT_CID_TOPO = 7,
|
|
/* Command line : AT+PING */
|
|
AT_CID_PING = 8,
|
|
/* Command line : AT+SEND */
|
|
AT_CID_SEND = 9,
|
|
/* Command line : AT+REBOOT */
|
|
AT_CID_REBOOT =10,
|
|
/* Command line : AT+WHO */
|
|
AT_CID_WHO =11,
|
|
/* Command line : AT+RFPOWER */
|
|
AT_CID_RFPOWER =12,
|
|
/* Command line : AT+WHITELIST */
|
|
AT_CID_WHITELIST =13,
|
|
/* Command line : AT+NETWORK */
|
|
AT_CID_NETWORK =14,
|
|
/* Command line : AT+FLASH */
|
|
AT_CID_FLASH =15,
|
|
/* Command line : AT+PMODE */
|
|
AT_CID_PMODE =16,
|
|
/* Command line : AT+SPI */
|
|
AT_CID_SPI =17,
|
|
/* Command line : AT+IIC */
|
|
AT_CID_IIC =18,
|
|
/* Command line : AT+GPIOCFG */
|
|
AT_CID_GPIOCFG =19,
|
|
/* Command line : AT+GPIOVAL */
|
|
AT_CID_GPIOVAL =20,
|
|
/* Command line : AT+SWMODE */
|
|
AT_CID_SWMODE =21,
|
|
/* Command line : AT+NETGROUP */
|
|
AT_CID_NETGROUP =22,
|
|
/* Command line : AT+HOSTPORT */
|
|
AT_CID_HOSTPORT =23,
|
|
/* ... */
|
|
|
|
AT_CID_MAX
|
|
};
|
|
|
|
/* Max length of name in AT command. */
|
|
#define AT_NAME_STR_LEN_MAX 64
|
|
|
|
/* Max length of aguments in AT command. */
|
|
#define AT_ARG_STR_LEN_MAX 192
|
|
|
|
/* Length of buffer for putting pices of AT command together. */
|
|
#define AT_HOOK_BUFFER_LEN (AT_NAME_STR_LEN_MAX + AT_ARG_STR_LEN_MAX)
|
|
|
|
/** const, STA DEVs max supported in network */
|
|
#define AT_STA_DEV_MAX STA_DEV_MAX
|
|
|
|
#define AT_TMR_CHECK_END_PMODE (1000 * 3) // //unit ms
|
|
|
|
|
|
/* Handle of an AT command to call downlayer. 'argc' not include command
|
|
name or opcode string.*/
|
|
typedef void (*at_fn_handle_send_t)(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
/* Handle of an AT command to response the resault. */
|
|
typedef void (*at_fn_handle_resp_t)(iot_pkt_t *resp);
|
|
|
|
/* Response to the host. AT command uses it, uplayer registered.*/
|
|
typedef uint32_t (*at_fn_response_from_at_t)(iot_pkt_t *resp);
|
|
|
|
/* Response to the AT command. Downlayer uses it, AT command registered.*/
|
|
typedef void (*at_fn_response_to_at_t)(iot_pkt_t *resp);
|
|
|
|
/* Send command to the downlayer. AT command uses it, Downlayer registered. */
|
|
typedef uint8_t (*at_fn_send_from_at_t)(iot_pkt_t *arg);
|
|
|
|
/* Send command string to AT command. uplayer uses it, AT command registered. */
|
|
typedef void (*at_fn_send_to_at_t)(uint8_t *str, uint32_t dlen);
|
|
|
|
typedef struct _at_command_line_t
|
|
{
|
|
/* AT command name. */
|
|
char **name;
|
|
/* strlen(cmd_name), just for searching command. */
|
|
uint8_t head_len;
|
|
/*
|
|
Timeout when after handle runout and waiting for response.n Seconds.
|
|
Zero means not timeout count on this command.
|
|
*/
|
|
uint8_t timeout;
|
|
/* The priority of this command. */
|
|
uint16_t prio;
|
|
/*
|
|
Handle to send this command. AT use it.
|
|
*/
|
|
at_fn_handle_send_t fn_send;
|
|
/*
|
|
Handle for response the resault form downlayer to uplayer.
|
|
*/
|
|
at_fn_handle_resp_t fn_resp;
|
|
}at_cmd_t;
|
|
|
|
/* Register callback handles for AT command module using. */
|
|
typedef struct _at_command_callback_t
|
|
{
|
|
/*
|
|
Provied by greeapp top uart , called by AT command moudle, send AT response
|
|
char* to host uart.
|
|
*/
|
|
at_fn_response_from_at_t fn_resp;
|
|
/*
|
|
Provided by plctxrx moudle. used by AT command moudle. send control command
|
|
to plctxrx moudle.
|
|
*/
|
|
at_fn_send_from_at_t fn_send;
|
|
}at_cb_t;
|
|
|
|
typedef struct _at_command_buffer_t
|
|
{
|
|
/*
|
|
Flag to tell if this buffer has a completed AT command.
|
|
TRUE : completed, FALSE : NOT.
|
|
*/
|
|
uint16_t cmd_flushed;
|
|
/* The point to store command in menber "c". */
|
|
uint16_t index;
|
|
/* Buffer to store AT command. */
|
|
uint8_t c[AT_HOOK_BUFFER_LEN];
|
|
}at_buf_t;
|
|
|
|
/*
|
|
This is the status of current AT command that executing. No need to protect
|
|
those items for there is one place to write / read.
|
|
*/
|
|
typedef struct _at_command_status_t
|
|
{
|
|
at_cmd_t *cur_cmd; /* Executing AT command */
|
|
uint16_t resp_index; /* Current response frame index of this AT command. */
|
|
uint16_t resp_total; /* Total response frames count of this AT command. */
|
|
uint16_t handle_runout; /* A flag to show if this AT cmd handle finished. */
|
|
uint16_t resp_finished; /* A flag to show if this response finished. */
|
|
}at_status_t;
|
|
|
|
typedef struct _at_command_device_t {
|
|
/* Role of this device as CCO or STA. */
|
|
uint8_t dev_role;
|
|
/* Mac address of this device. */
|
|
uint8_t mac[IOT_MAC_ADDR_LEN];
|
|
/* Reserved for byte completion. */
|
|
uint8_t resv;
|
|
} at_dev_t;
|
|
|
|
/*
|
|
General struct for online device list saved in AT layer local
|
|
and device list saved in flash.
|
|
*/
|
|
typedef struct _at_command_device_list_t {
|
|
/* The valid device number. */
|
|
uint8_t valid_dev_cnt;
|
|
/* Reserved for byte completion. */
|
|
uint8_t resv[3];
|
|
/* The device table. */
|
|
at_dev_t dev[AT_STA_DEV_MAX];
|
|
} at_dev_list_t;
|
|
|
|
typedef struct _at_cust_flash_info_header_t
|
|
{
|
|
/* Data length from first item to the end. */
|
|
uint16_t dlen;
|
|
/* Reserved for byte completion. */
|
|
uint8_t resv[2];
|
|
/* CRC32 for data what 'dlen' stands for. */
|
|
uint32_t dcrc;
|
|
}at_cust_flash_head_t;
|
|
|
|
/* The whitelist config enable/disable state. 0, disable, 1, enable.*/
|
|
typedef enum _at_whitelist_config_state_e
|
|
{
|
|
AT_WL_CFG_STATE_DISABLE,
|
|
AT_WL_CFG_STATE_ENABLE,
|
|
}at_wl_cfg_state_e;
|
|
|
|
/* Top level structure of AT command. */
|
|
typedef struct _at_command_context_t
|
|
{
|
|
/*
|
|
Magic key to tell if AT command module initialized.
|
|
mkey = 0x569a4323 : initialized, else NOT.
|
|
*/
|
|
uint32_t mkey;
|
|
/* Local device type. */
|
|
uint8_t dev_type;
|
|
/* Local mac address. */
|
|
uint8_t mac[IOT_MAC_ADDR_LEN];
|
|
/* The whitelist config enable/disable state. */
|
|
at_wl_cfg_state_e wl_cfg_state;
|
|
/* Task handle. */
|
|
iot_task_h task;
|
|
/* Semaphore. */
|
|
os_mutex_h sem;
|
|
/* Timer count down for response timout. */
|
|
timer_id_t tmr;
|
|
/* end transparent mode check timer */
|
|
timer_id_t end_tmode_tmr;
|
|
/* The status of current AT command */
|
|
at_status_t status;
|
|
/* Callback handles for AT command module using */
|
|
at_cb_t fn_callback;
|
|
/* Buffer to store pices of AT command in more than one uart frames. */
|
|
at_buf_t at_buffer;
|
|
/* Online device list saved in local. */
|
|
at_dev_list_t online_dev_list;
|
|
/* Table of all AT commands that registerd statically. */
|
|
at_cmd_t at_table[AT_CID_MAX];
|
|
/* transparent info */
|
|
at_transparent_t transp;
|
|
}at_context_t;
|
|
|
|
/* Initialize the AT module. */
|
|
iot_task_h iot_at_task_init(void);
|
|
|
|
/* API for de-initializing module. */
|
|
void iot_at_task_deinit(void);
|
|
|
|
at_context_t *iot_at_context_get(void);
|
|
|
|
/* at provided function, registed to top uart, receive command string */
|
|
uint8_t iot_at_command_proto_send_to_at(uint8_t *buf, uint16_t blen);
|
|
|
|
/* top uart provided send function, registed to at. */
|
|
uint8_t iot_at_command_fn_register_response_to_uart(at_fn_response_from_at_t fn);
|
|
|
|
/* plctxrx provided function. registed to at. */
|
|
uint8_t iot_at_command_fn_register_send_to_plc(at_fn_send_from_at_t fn);
|
|
|
|
/* at provided function, registed to plctxrx. receive command response */
|
|
uint8_t iot_at_command_plc_send_response_to_at(iot_pkt_t *p_resp_pkt);
|
|
|
|
|
|
|
|
/* ------------------The command handles----------------- */
|
|
void at_handle_command_help(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_command_mac(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_response_mac(iot_pkt_t *p_resp_pkt);
|
|
void at_handle_command_time(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_response_time(iot_pkt_t *p_resp_pkt);
|
|
void at_handle_command_systeminfo(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_response_systeminfo(iot_pkt_t *p_resp_pkt);
|
|
void at_handle_command_uart(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_response_uart(iot_pkt_t *p_resp_pkt);
|
|
void at_handle_command_topo(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_response_topo(iot_pkt_t *p_resp_pkt);
|
|
void at_handle_command_ping(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_command_send(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
uint32_t at_handle_transparent_data(uint8_t *buf, uint16_t blen);
|
|
void at_handle_command_pmode(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_response_send_receive(iot_pkt_t *p_resp_pkt);
|
|
void at_handle_command_memory(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_command_task(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_command_reboot(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_response_reboot(iot_pkt_t *p_resp_pkt);
|
|
void at_handle_command_who(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_response_who(iot_pkt_t *p_resp_pkt);
|
|
void at_handle_command_rfpower(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_response_rfpower(iot_pkt_t *p_resp_pkt);
|
|
void at_handle_command_whitelist(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_response_whitelist(iot_pkt_t *p_resp_pkt);
|
|
void at_handle_command_connect(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_response_connect(iot_pkt_t *p_resp_pkt);
|
|
void at_handle_command_disconnect(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_response_disconnect(iot_pkt_t *p_resp_pkt);
|
|
void at_handle_command_network(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_response_network(iot_pkt_t *p_resp_pkt);
|
|
void at_handle_command_flash(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_command_spi(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_command_iic(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_command_gpiocfg(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_command_gpioval(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_cmd_sw_uartmode(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_command_netgroup(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
void at_handle_command_host_port(uint32_t opcode, uint32_t argc, uint8_t *argv[]);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|