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 */
 |