561 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			561 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /****************************************************************************
 | ||
|  | 
 | ||
|  | 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. | ||
|  | 
 | ||
|  | ****************************************************************************/ | ||
|  | /* os_ship header files */ | ||
|  | #include "os_task_api.h"
 | ||
|  | #include "os_event_api.h"
 | ||
|  | #include "os_timer_api.h"
 | ||
|  | #include "os_utils_api.h"
 | ||
|  | 
 | ||
|  | /* iot common header files */ | ||
|  | #include "iot_io_api.h"
 | ||
|  | #include "iot_module_api.h"
 | ||
|  | #include "iot_errno_api.h"
 | ||
|  | #include "iot_task_api.h"
 | ||
|  | #include "iot_pkt_api.h"
 | ||
|  | #include "iot_ipc_api.h"
 | ||
|  | #include "iot_sg_ext_api.h"
 | ||
|  | #include "iot_board_api.h"
 | ||
|  | #include "iot_oem_api.h"
 | ||
|  | #include "iot_plc_api.h"
 | ||
|  | 
 | ||
|  | #include "iot_grapp.h"
 | ||
|  | #include "iot_proto_common.h"
 | ||
|  | #include "iot_cus_task.h"
 | ||
|  | #include "iot_cus_ports.h"
 | ||
|  | #include "iot_proto_ge.h"
 | ||
|  | 
 | ||
|  | #if IOT_GE_EXT_TASK_ENABLE
 | ||
|  | 
 | ||
|  | #if IOT_CUS_APP_MULTI_PORTS
 | ||
|  | #define IOT_CUS_TASK_PORT_BUF_SIZE   200
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #define IOT_CUS_TASK_MSG_QUEUE        0
 | ||
|  | 
 | ||
|  | #if (IOT_PSRAM_ENABLE)
 | ||
|  | #define IOT_CUS_TASK_UART_BUF_SIZE    (2048 + 64)
 | ||
|  | #else
 | ||
|  | #define IOT_CUS_TASK_UART_BUF_SIZE    (128 + 64)
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | typedef struct _iot_cus_task_t { | ||
|  |     /* task handle */ | ||
|  |     iot_task_h          task; | ||
|  |     iot_uart_h          uart_h; | ||
|  |     /* timer handle */ | ||
|  |     timer_id_t          timer; | ||
|  |     /* local mac address. */ | ||
|  |     uint8_t             local_mac[IOT_MAC_ADDR_LEN]; | ||
|  |     /* cco mac */ | ||
|  |     uint8_t             cco_mac[IOT_MAC_ADDR_LEN]; | ||
|  |     /* module joined network */ | ||
|  |     uint32_t            module_ready; | ||
|  |     /* module started */ | ||
|  |     bool_t              module_started; | ||
|  | } iot_cus_task_t; | ||
|  | 
 | ||
|  | static iot_cus_task_t cus_task; | ||
|  | 
 | ||
|  | #define IOT_CUS_TASK_DATA_DUMP
 | ||
|  | 
 | ||
|  | #ifdef IOT_CUS_TASK_DATA_DUMP
 | ||
|  | #if (IOT_PSRAM_ENABLE)
 | ||
|  | static char dump_buf[1024 + 16]; | ||
|  | void iot_cus_task_data_dump_inner(void * buf, uint32_t len, uint32_t line) | ||
|  | { | ||
|  |     char *p = buf, *q = dump_buf; | ||
|  |     uint32_t i, buf_len; | ||
|  | 
 | ||
|  |     buf_len = iot_sprintf(q, "DUMP(%03d):", len); | ||
|  | 
 | ||
|  |     for(i = 0; (i < len) && (buf_len < 1024); i++, p++) { | ||
|  |         buf_len += iot_sprintf(q + buf_len, " %02X", ((int)*p) & 0xFF); | ||
|  |     } | ||
|  | 
 | ||
|  |     iot_cus_printf("\n[cus_task@%04d]:%s\n", line, dump_buf); | ||
|  | 
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | #define iot_cus_task_data_dump(buf, len) \
 | ||
|  |     iot_cus_task_data_dump_inner(buf, len, __LINE__) | ||
|  | #else
 | ||
|  | extern void iot_common_bin_dump(uint8_t *data, uint32_t dlen); | ||
|  | #define iot_cus_task_data_dump(buf, len) iot_common_bin_dump(buf,len)
 | ||
|  | #endif /* end IOT_PSRAM_ENABLE */
 | ||
|  | #else
 | ||
|  | #define iot_cus_task_data_dump(buf, len)
 | ||
|  | #endif /* end IOT_CUS_TASK_DATA_DUMP */
 | ||
|  | 
 | ||
|  | /* check frame and change to ge command */ | ||
|  | void iot_cus_task_frame_check(iot_pkt_t *pkt_data) | ||
|  | { | ||
|  |     /* trans to GE command */ | ||
|  |     iot_cus_task_message_to_ge(iot_pkt_data(pkt_data), | ||
|  |         iot_pkt_data_len(pkt_data)); | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief iot_cus_task_uart_send_func() - send data to uart port. | ||
|  |  * @param p_pkt_frame: pointer of pkt frame data buffer. | ||
|  |  * @return ERR_OK | ||
|  |  */ | ||
|  | uint32_t iot_cus_task_msg_post_to_uart(iot_pkt_t *p_pkt_frame) | ||
|  | { | ||
|  |     iot_cus_printf("[cus_task]post to uart.\n"); | ||
|  |     iot_uart_send(cus_task.uart_h, p_pkt_frame, NULL); | ||
|  | 
 | ||
|  |     return ERR_OK; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t iot_cus_task_ports_data_get_pid(uint8_t *data, uint32_t len) | ||
|  | { | ||
|  |     uint32_t pid = PID_MAX; | ||
|  |     ge_frame_data_send_set_subfn160_t *f_fea0; | ||
|  | 
 | ||
|  |     f_fea0 = (ge_frame_data_send_set_subfn160_t *)data; | ||
|  | 
 | ||
|  |     if (len < sizeof(ge_extend_fn_hdr_t) || | ||
|  |         f_fea0->hdr.hdr.preamble != GE_FRM_PREAMBLE_CODE) { | ||
|  |         goto out; | ||
|  |     } | ||
|  | 
 | ||
|  |     if ((PROTO_GE_PLC_SET_CMD != f_fea0->hdr.hdr.fn) | ||
|  |         || (PROTO_GE_DATA_CMD != f_fea0->hdr.subfn)) { | ||
|  |         pid = PID_UART; | ||
|  |         goto out; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (port_valid(f_fea0->port_id)) { | ||
|  |         pid = f_fea0->port_id; | ||
|  |     } | ||
|  | out: | ||
|  |     return pid; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t iot_cus_task_msg_msg_from_ge(iot_pkt_t *p_pkt_frame) | ||
|  | { | ||
|  |     iot_cus_task_msg_post(IOT_CUS_TASK_MT_GE, 0, p_pkt_frame); | ||
|  | 
 | ||
|  |     return ERR_OK; | ||
|  | } | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief iot_cus_task_uart_msg_process() - process the data from uart. | ||
|  |  * @param p_cus_msg: message received from uart. p_cus_msg->data will be | ||
|  |  *   freed by this handle but p_cus_msg will not. | ||
|  |  */ | ||
|  | static void iot_cus_task_uart_msg_process(iot_cus_task_msg_t *p_cus_msg) | ||
|  | { | ||
|  |     iot_cus_task_frame_check((iot_pkt_t*)p_cus_msg->data); | ||
|  | 
 | ||
|  |     iot_pkt_free((iot_pkt_t*)p_cus_msg->data); | ||
|  | 
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | static void iot_cus_task_ge_msg_process(iot_cus_task_msg_t *p_cus_msg) | ||
|  | { | ||
|  |     iot_pkt_t *p_pkt = (iot_pkt_t *)p_cus_msg->data; | ||
|  | 
 | ||
|  |     iot_cus_printf("[cus_task]frame receive from GE.\n"); | ||
|  | 
 | ||
|  |     iot_cus_task_data_dump(iot_pkt_data(p_pkt), | ||
|  |         iot_pkt_data_len(p_pkt)); | ||
|  | 
 | ||
|  | #if IOT_CUS_APP_MULTI_PORTS
 | ||
|  |     uint32_t port = iot_cus_task_ports_data_get_pid(iot_pkt_data(p_pkt), | ||
|  |         iot_pkt_data_len(p_pkt)); | ||
|  | 
 | ||
|  |     if ((PID_UART == port)) { | ||
|  |         iot_cus_task_msg_post_to_uart(p_pkt); | ||
|  |     } else if (port_valid(port)) { | ||
|  |         iot_cus_ports_send(port, iot_pkt_data(p_pkt), iot_pkt_data_len(p_pkt)); | ||
|  |         iot_pkt_free(p_pkt); | ||
|  |     } else { | ||
|  |         iot_cus_all_ports_write(iot_pkt_data(p_pkt), iot_pkt_data_len(p_pkt)); | ||
|  |         iot_pkt_free(p_pkt); | ||
|  |     } | ||
|  | #else
 | ||
|  |     iot_cus_task_msg_post_to_uart(p_pkt); | ||
|  | #endif
 | ||
|  | 
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief iot_cus_task_handle_timer_msg() - process data from local timer. | ||
|  |  * @msg : message. | ||
|  |  */ | ||
|  | static void iot_cus_task_handle_timer_msg(iot_cus_task_msg_t *msg) | ||
|  | { | ||
|  |     switch (msg->task_msg.id) { | ||
|  |         case IOT_CUS_TASK_MSG_ID_TMR_TIMEOUT: | ||
|  |         { | ||
|  |             if (!cus_task.module_started) { | ||
|  |                 if (iot_grapp_init_success()) { | ||
|  |                     cus_task.module_started = true; | ||
|  |                     iot_grapp_reg_fn_receive_from_ge(HOST_PORT_CUSTOM_TASK, | ||
|  |                         iot_cus_task_msg_msg_from_ge); | ||
|  |                     iot_grapp_set_uart_config(cus_task.uart_h); | ||
|  | #if IOT_CUS_APP_MULTI_PORTS
 | ||
|  |                     if (ERR_OK != iot_cus_ports_init()) { | ||
|  |                         iot_cus_printf("[cus_task]ports init failed.\n"); | ||
|  |                     } | ||
|  | #endif
 | ||
|  |                 } | ||
|  |             } else { | ||
|  | #if IOT_CUS_APP_MULTI_PORTS
 | ||
|  |                 iot_cus_ports_timer_handle(IOT_CUS_PORT_TIMER_PERIOD); | ||
|  | #endif
 | ||
|  |             } | ||
|  |             break; | ||
|  |         } | ||
|  |         default: | ||
|  |         { | ||
|  |             iot_cus_printf("[cus_task]unknown timer message id #%d.\n", | ||
|  |                 msg->task_msg.id); | ||
|  |             IOT_ASSERT(0); | ||
|  |             break; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief iot_cus_task_internal_msg_process() - process the data from cus-task. | ||
|  |  * @param p_cus_msg: message received from cus-task. p_cus_msg->data | ||
|  |  *   will be freed by this handle but p_cus_msg will not. | ||
|  |  */ | ||
|  | static void iot_cus_task_internal_msg_process(iot_cus_task_msg_t *p_cus_msg) | ||
|  | { | ||
|  |     switch (p_cus_msg->task_msg.id) { | ||
|  |         default: | ||
|  |         { | ||
|  |             IOT_ASSERT(0); | ||
|  |             break; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief iot_cus_task_msg_exe_func() - messages handle function. | ||
|  |  * @param task_h: handle of task. | ||
|  |  * @param p_msg: message that will be processed. | ||
|  |  */ | ||
|  | void iot_cus_task_msg_exe_func(iot_task_h task_h, iot_task_msg_t *p_msg) | ||
|  | { | ||
|  |     iot_cus_task_msg_t *p_cus_msg = (iot_cus_task_msg_t *)p_msg; | ||
|  | 
 | ||
|  |     switch (p_cus_msg->task_msg.type) | ||
|  |     { | ||
|  |         case IOT_CUS_TASK_MT_UART: | ||
|  |         { | ||
|  |             iot_cus_task_uart_msg_process(p_cus_msg); | ||
|  |             break; | ||
|  |         } | ||
|  |         case IOT_CUS_TASK_MT_TIMER: | ||
|  |         { | ||
|  |             iot_cus_task_handle_timer_msg(p_cus_msg); | ||
|  |             break; | ||
|  |         } | ||
|  |         case IOT_CUS_TASK_MT_INTERNAL: | ||
|  |         { | ||
|  |             iot_cus_task_internal_msg_process(p_cus_msg); | ||
|  |             break; | ||
|  |         } | ||
|  |         case IOT_CUS_TASK_MT_GE: | ||
|  |         { | ||
|  |             iot_cus_task_ge_msg_process(p_cus_msg); | ||
|  |             break; | ||
|  |         } | ||
|  |         default: | ||
|  |         { | ||
|  |             iot_pkt_free(p_cus_msg->data); | ||
|  |             IOT_ASSERT(0); | ||
|  |             break; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     iot_task_free_msg(task_h, p_msg); | ||
|  | 
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | void iot_cus_task_event_exe_func(iot_task_h task_h, uint32_t events) | ||
|  | { | ||
|  |     (void)task_h; | ||
|  | 
 | ||
|  | #if IOT_CUS_APP_MULTI_PORTS
 | ||
|  |     if (IOT_CUS_TASK_EID_EXT_PORTS & events) { | ||
|  |         iot_cus_ports_event_handle(); | ||
|  |     } | ||
|  | #endif
 | ||
|  | 
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief iot_cus_task_msg_cancel_func() - pull back messages that sent to this | ||
|  |  *   task. | ||
|  |  * @param task_h: handle of task. | ||
|  |  * @param p_msg: message that will be pull back. | ||
|  |  */ | ||
|  | void iot_cus_task_msg_cancel_func(iot_task_h task_h, iot_task_msg_t *p_msg) | ||
|  | { | ||
|  |     iot_cus_task_msg_t *p_cus_msg = (iot_cus_task_msg_t *)p_msg; | ||
|  | 
 | ||
|  |     switch(p_cus_msg->task_msg.type) | ||
|  |     { | ||
|  |         case IOT_CUS_TASK_MT_UART: | ||
|  |         case IOT_CUS_TASK_MT_TIMER: | ||
|  |         case IOT_CUS_TASK_MT_INTERNAL: | ||
|  |         { | ||
|  |             iot_pkt_free(p_cus_msg->data); | ||
|  |         } | ||
|  |         default: | ||
|  |         { | ||
|  |             IOT_ASSERT(0); | ||
|  |             break; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     iot_task_free_msg(task_h, p_msg); | ||
|  | 
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | void iot_cus_task_ports_data_patch_pid(uint32_t port, | ||
|  |     uint8_t* data, uint32_t len) | ||
|  | { | ||
|  |     ge_frame_data_send_set_subfn160_t *f_fea0; | ||
|  |     uint16_t crc = 0xff; | ||
|  | 
 | ||
|  |     f_fea0 = (ge_frame_data_send_set_subfn160_t *)data; | ||
|  | 
 | ||
|  |     if ((PROTO_GE_PLC_SET_CMD != f_fea0->hdr.hdr.fn) | ||
|  |         || (PROTO_GE_DATA_CMD != f_fea0->hdr.subfn)) { | ||
|  |         /* Do nothing. */ | ||
|  |         return; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (iot_proto_get_cco_mac(cus_task.cco_mac)) { | ||
|  |         /* didn't get the cco mac address, do nothing */ | ||
|  |         return; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (port_valid(port)) { | ||
|  |         f_fea0->port_id = port; | ||
|  |         os_mem_cpy(f_fea0->dest_mac, cus_task.cco_mac, IOT_MAC_ADDR_LEN); | ||
|  |     } else { | ||
|  |         f_fea0->port_id = PID_UART; | ||
|  |     } | ||
|  | 
 | ||
|  |     crc = ge_frm_checksum_calc(data, len - 3); | ||
|  |     os_mem_cpy(&data[len - 3], &crc, sizeof(uint8_t) * 2); | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief iot_cus_task_send_data_to_ge() - recveived command from ports, send to | ||
|  |  *                                       common proto | ||
|  |  * @param data: command data. | ||
|  |  * @param len : command data length. | ||
|  |  * @param pid : Port ID. | ||
|  |  * @return    : ERR_OK   - send successfully. | ||
|  |  *              ERR_FAIL - send failed. | ||
|  |  */ | ||
|  | uint8_t iot_cus_task_ports_data_send_to_ge(uint8_t * data, uint32_t len, | ||
|  |     uint32_t pid) | ||
|  | { | ||
|  |     iot_pkt_t* send_pkt = NULL; | ||
|  | 
 | ||
|  |     send_pkt = iot_pkt_alloc(len, IOT_CUS_TASK_ID); | ||
|  | 
 | ||
|  |     if (send_pkt) { | ||
|  |         /* copy data from buf to data packet */ | ||
|  |         os_mem_cpy(iot_pkt_put(send_pkt, len), data, len); | ||
|  | #if IOT_CUS_APP_MULTI_PORTS
 | ||
|  |         /* filter FE A0, rewrite the PORTID */ | ||
|  |         iot_cus_task_ports_data_patch_pid(pid, iot_pkt_data(send_pkt), len); | ||
|  | #endif
 | ||
|  |         /* alloc message to insert proto task msg queue */ | ||
|  |         iot_cus_task_msg_post(IOT_CUS_TASK_MT_UART, | ||
|  |               IOT_CUS_TASK_MSG_ID_CMD_HANDLE, send_pkt); | ||
|  |         return ERR_OK; | ||
|  |     } else { | ||
|  |         iot_cus_printf("[cus_task][err]no mem, frame len:%d\n", len); | ||
|  |         return ERR_FAIL; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | void iot_cus_task_ports_data_receive(uint32_t port, uint8_t *buf, uint32_t blen) | ||
|  | { | ||
|  |     void *send_fn = iot_cus_task_ports_data_send_to_ge; | ||
|  | 
 | ||
|  |     if ((NULL != buf) && (0 < blen)) { | ||
|  |         iot_proto_data_parse_and_post(buf, blen, send_fn, port); | ||
|  |     } | ||
|  | 
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief iot_cus_task_uart_receive_func() - Uart driver callback function | ||
|  |  *   when data received. | ||
|  |  * @param buffer: pointer of data buffer. | ||
|  |  * @param buffer_len: length of data received. | ||
|  |  * @param is_full_frame: tell if this is a whole frame in this buffer. | ||
|  |  * @param invalid_data_len: length of invalid data received. we ignore this. | ||
|  |  */ | ||
|  | void iot_cus_task_uart_receive_func(uint8_t* p_buffer, uint32_t buffer_len, | ||
|  |     bool_t is_full_frame, uint32_t invalid_data_len) | ||
|  | { | ||
|  |     (void)is_full_frame; | ||
|  |     (void)invalid_data_len; | ||
|  | 
 | ||
|  |     iot_cus_printf("uart recv buf_len=%d\n", buffer_len); | ||
|  |     iot_cus_task_ports_data_receive(PID_UART, p_buffer, buffer_len); | ||
|  | 
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | void iot_cus_task_msg_post(uint16_t msg_type, uint16_t msg_id, iot_pkt_t *data) | ||
|  | { | ||
|  |     iot_task_msg_t      *msg; | ||
|  |     iot_cus_task_msg_t  *task_msg; | ||
|  |     msg = iot_task_alloc_msg_with_reserved(cus_task.task, 0); | ||
|  |     if (NULL == msg) { | ||
|  |         if (NULL != data) { | ||
|  |             iot_pkt_free(data); | ||
|  |         } | ||
|  |         IOT_ASSERT(0); | ||
|  |         return; | ||
|  |     } | ||
|  | 
 | ||
|  |     task_msg = (iot_cus_task_msg_t*)msg; | ||
|  |     task_msg->task_msg.type = msg_type; | ||
|  |     task_msg->task_msg.id = msg_id; | ||
|  |     task_msg->data = data; | ||
|  |     task_msg->data2 = 0; | ||
|  |     iot_task_queue_msg(cus_task.task, &task_msg->task_msg, 0); | ||
|  | 
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | void iot_cus_task_event_post(uint32_t events) | ||
|  | { | ||
|  |     os_set_task_event_with_v(iot_task_get_os_task_h(cus_task.task), | ||
|  |         events); | ||
|  | 
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief iot_led_ctrl_task_timer_exe() - timer timeout callback function. | ||
|  |  * @timer_id : timer id with that timer who causes this api-call. | ||
|  |  * @arg : param past to this callback api. | ||
|  |  */ | ||
|  | void iot_cus_task_task_timer_exe(timer_id_t timer_id, void * arg) | ||
|  | { | ||
|  |     (void)timer_id; | ||
|  |     (void)arg; | ||
|  | 
 | ||
|  |     iot_cus_task_msg_post(IOT_CUS_TASK_MT_TIMER, | ||
|  |         IOT_CUS_TASK_MSG_ID_TMR_TIMEOUT, NULL); | ||
|  | 
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t iot_cus_task_uart_send(iot_pkt_t *p_pkt) | ||
|  | { | ||
|  |     uint32_t ret; | ||
|  | 
 | ||
|  |     ret = iot_uart_send(cus_task.task, p_pkt, NULL); | ||
|  | 
 | ||
|  |     return (ERR_OK == ret) ? ERR_OK : ERR_FAIL; | ||
|  | } | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief iot_cus_task_init() - The main entry to initialize our customer task. | ||
|  |  */ | ||
|  | uint32_t iot_cus_task_init(void) | ||
|  | { | ||
|  |     iot_task_config_t task_cfg; | ||
|  | 
 | ||
|  |     os_mem_set(&cus_task, 0, sizeof(iot_cus_task_t)); | ||
|  |     /* TODO : set unready. */ | ||
|  |     cus_task.module_ready = false; | ||
|  | 
 | ||
|  |     /* create task */ | ||
|  |     os_mem_set(&task_cfg, 0x0, sizeof(task_cfg)); | ||
|  |     task_cfg.stack_size = IOT_CUS_TASK_TASK_STACK_SIZE; | ||
|  |     task_cfg.task_prio = IOT_CUS_TASK_PROTO_TASK_PRIO; | ||
|  |     task_cfg.msg_size = sizeof(iot_cus_task_msg_t); | ||
|  |     task_cfg.msg_cnt = IOT_CUS_TASK_TASK_POOL_SIZE; | ||
|  |     task_cfg.queue_cnt = 1; | ||
|  |     task_cfg.queue_cfg[0].quota = 0; | ||
|  |     task_cfg.msg_exe_func = iot_cus_task_msg_exe_func; | ||
|  |     task_cfg.msg_cancel_func = iot_cus_task_msg_cancel_func; | ||
|  |     task_cfg.task_event_func = iot_cus_task_event_exe_func; | ||
|  | 
 | ||
|  |     cus_task.uart_h = iot_uart_open(iot_board_get_uart(UART_METER_PORT), | ||
|  |         iot_cus_task_uart_receive_func, IOT_CUS_TASK_UART_BUF_SIZE, NULL); | ||
|  | 
 | ||
|  |     iot_uart_set_threshold(cus_task.uart_h,  UART_THR_RXTIMEOUT, | ||
|  |         IOT_UART_DEFAULT_THDVALUE); | ||
|  |     iot_uart_set_threshold(cus_task.uart_h, UART_THR_NO_FMT_TIMEOUT, | ||
|  |         IOT_UART_DEFAULT_THDVALUE); | ||
|  |     cus_task.task = iot_task_create(IOT_CUS_TASK_ID, &task_cfg); | ||
|  | 
 | ||
|  |     if (NULL == cus_task.task) { | ||
|  |         iot_cus_printf("[cus_task]create task failed.\n"); | ||
|  |         return ERR_FAIL; | ||
|  |     } | ||
|  | 
 | ||
|  |     cus_task.timer = os_create_timer(IOT_CUS_TASK_ID, true, | ||
|  |         iot_cus_task_task_timer_exe, NULL); | ||
|  | 
 | ||
|  |     if (0 == cus_task.timer) { | ||
|  |         iot_cus_printf("[cus_task]create timer failed.\n"); | ||
|  |         iot_task_delete(cus_task.task); | ||
|  |         return ERR_FAIL; | ||
|  |     } | ||
|  | 
 | ||
|  |     os_start_timer(cus_task.timer, IOT_CUS_TASK_TIMER_PERIOD); | ||
|  | 
 | ||
|  |     iot_cus_printf("[cus_task]task create successfully.\n"); | ||
|  | 
 | ||
|  |     return ERR_OK; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t app_cus_task_entry() | ||
|  | { | ||
|  |     uint32_t ret = ERR_PENDING; | ||
|  | 
 | ||
|  |     if (ERR_OK == iot_cus_task_init()) | ||
|  |     { | ||
|  |         ret = ERR_OK; | ||
|  |     } | ||
|  | 
 | ||
|  |     return ret; | ||
|  | } | ||
|  | 
 | ||
|  | #endif /* IOT_GE_EXT_TASK_ENABLE */
 |