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
 |