783 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			783 lines
		
	
	
		
			22 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. | ||
|  | 
 | ||
|  | ****************************************************************************/ | ||
|  | 
 | ||
|  | #include "os_task.h"
 | ||
|  | #include "os_utils.h"
 | ||
|  | #include "os_mem.h"
 | ||
|  | 
 | ||
|  | #include "communicator.h"
 | ||
|  | 
 | ||
|  | #include "iot_errno.h"
 | ||
|  | #include "iot_dbglog_api.h"
 | ||
|  | #include "iot_io.h"
 | ||
|  | #include "iot_uart_h.h"
 | ||
|  | #include "iot_frame_parse.h"
 | ||
|  | #include "iot_config.h"
 | ||
|  | 
 | ||
|  | #include "iot_cli_module_config.h"
 | ||
|  | 
 | ||
|  | #define MAX_IP_LIST_NUM 100
 | ||
|  | #define MAX_IP_LEN 64
 | ||
|  | 
 | ||
|  | #ifdef CLI_MINI_MODE_ENABLE
 | ||
|  | #define COMMUNI_UART_BUF_SIZE 512
 | ||
|  | #else
 | ||
|  | #ifdef CLI_FULL_FEATURE_ENABLE
 | ||
|  | #if RUN_IN_PSRAM
 | ||
|  | #define COMMUNI_UART_BUF_SIZE 4096
 | ||
|  | #else /* RUN_IN_PSRAM */
 | ||
|  | #define COMMUNI_UART_BUF_SIZE 2048
 | ||
|  | #endif /* RUN_IN_PSRAM */
 | ||
|  | #else
 | ||
|  | #define COMMUNI_UART_BUF_SIZE 2048
 | ||
|  | #endif
 | ||
|  | #endif // CLI_MINI_MODE_ENABLE
 | ||
|  | 
 | ||
|  | #if HW_PLATFORM == HW_PLATFORM_SIMU
 | ||
|  | #include "simulator_txrx.h"
 | ||
|  | #else
 | ||
|  | #include "iot_uart.h"
 | ||
|  | int cli_uart_fd; | ||
|  | #define CLI_UART_PORT 1
 | ||
|  | os_mutex_h cli_uart_mutex; | ||
|  | 
 | ||
|  | #endif
 | ||
|  | extern uint8_t cli_ftm_mode; | ||
|  | commnucator_t communicator; | ||
|  | static void communicator_rx_task(void *pvParameters); | ||
|  | 
 | ||
|  | #if HW_PLATFORM == HW_PLATFORM_SIMU
 | ||
|  | uint8_t cli_sock_recv_buf[1024 * 3]; | ||
|  | #elif (IOT_CLI_INF_MODE == IOT_CLI_INF_MODE_LWIP_SOCKET)
 | ||
|  | uint8_t cli_sock_recv_buf[COMMUNI_UART_BUF_SIZE]; | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if ((HW_PLATFORM == HW_PLATFORM_SIMU) || (IOT_CLI_INF_MODE == IOT_CLI_INF_MODE_LWIP_SOCKET))
 | ||
|  | static void communicator_rx_cli_task(void *lpparameters); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if HW_PLATFORM == HW_PLATFORM_SIMU
 | ||
|  | static int8_t is_ipaddress_accept(char* ipaddr); | ||
|  | extern uint32_t g_ip_addr; | ||
|  | 
 | ||
|  | int socket_init(commnuicator_handle pcommnu, caller_type_t caller, uint8_t work_mode) | ||
|  | { | ||
|  |     uint32_t bind_port = (uint32_t)UDP_BROADCAST_PORT_NUMBER; | ||
|  |     if (work_mode == WORKMODE_RF) | ||
|  |     { | ||
|  |         bind_port = (uint32_t)UDP_BROADCAST_PORT_NUMBER_RF; | ||
|  |     } | ||
|  |     os_sock_addr bind_address; | ||
|  |     uint32_t recv_timeout = OS_TICK(999000); | ||
|  |     if (caller == CALLER_HW_SIMULATOR) | ||
|  |     { | ||
|  |         pcommnu->udprecvsocket = os_udpsocket(); | ||
|  |         if (pcommnu->udprecvsocket == OS_INVALID_SOCKET) | ||
|  |         { | ||
|  |             return -1; | ||
|  |         } | ||
|  |         os_setsock_recvtimeout_opt(pcommnu->udprecvsocket, recv_timeout); | ||
|  | 
 | ||
|  |         bind_address.sin_port = | ||
|  |             (uint16_t)bind_port & 0xffffUL; | ||
|  |         bind_address.sin_port = os_htons(bind_address.sin_port); | ||
|  | 
 | ||
|  |         /* Bind the socket to the port that the client task will send to. */ | ||
|  |         os_sock_bind(pcommnu->udprecvsocket, bind_address); | ||
|  |     } | ||
|  | #if 0
 | ||
|  |     if (!pcommnu->csrecvsock) | ||
|  |     { | ||
|  |         pcommnu->csrecvsock = os_udpsocket(); | ||
|  |         if (pcommnu->csrecvsock == OS_INVALID_SOCKET) | ||
|  |         { | ||
|  |             return -1; | ||
|  |         } | ||
|  |         os_setsock_recvtimeout_opt(pcommnu->csrecvsock, recv_timeout); | ||
|  | 
 | ||
|  |         bind_address.sin_port = | ||
|  |             (uint16_t)((uint32_t)UDP_CHANNEL_SIMULATION_RECV_PORT) & 0xffffUL; | ||
|  |         bind_address.sin_port = os_htons(bind_address.sin_port); | ||
|  | 
 | ||
|  |         /* Bind the socket to the port that the client task will send to. */ | ||
|  |         os_sock_bind(pcommnu->csrecvsock, bind_address); | ||
|  |     } | ||
|  | #endif
 | ||
|  | 
 | ||
|  |     if (!pcommnu->udpsendsocket) | ||
|  |     { | ||
|  |         pcommnu->udpsendsocket = os_udpsocket(); | ||
|  |         if (pcommnu->udpsendsocket == OS_INVALID_SOCKET) | ||
|  |         { | ||
|  |             return -1; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     if (caller == CALLER_PLC_CLI) | ||
|  |     { | ||
|  |         pcommnu->clirecvsocket = os_udpsocket(); | ||
|  |         if (pcommnu->clirecvsocket == OS_INVALID_SOCKET) { | ||
|  |             return -1; | ||
|  |         } | ||
|  |         os_setsock_recvtimeout_opt(pcommnu->clirecvsocket, recv_timeout); | ||
|  | 
 | ||
|  |         bind_address.sin_port = | ||
|  |             (uint16_t)((uint32_t)UDP_CLI_RECV_PORT) & 0xffffUL; | ||
|  |         bind_address.sin_port = os_htons(bind_address.sin_port); | ||
|  |         /* Bind the socket to the port that the client task will send to. */ | ||
|  |         os_sock_bind(pcommnu->clirecvsocket, bind_address); | ||
|  |     } | ||
|  |     return 0; | ||
|  | } | ||
|  | int socket_deinit(commnuicator_handle pcommnu) | ||
|  | { | ||
|  | #if HW_PLATFORM == HW_PLATFORM_SIMU
 | ||
|  |     if (pcommnu->udpsendsocket) | ||
|  |     { | ||
|  |         os_close_socket(pcommnu->udpsendsocket); | ||
|  |     } | ||
|  |     if (pcommnu->udprecvsocket) | ||
|  |     { | ||
|  |         os_close_socket(pcommnu->udprecvsocket); | ||
|  |     } | ||
|  |     if (pcommnu->csrecvsock) | ||
|  |     { | ||
|  |         os_close_socket(pcommnu->csrecvsock); | ||
|  |     } | ||
|  |     if (pcommnu->clirecvsocket) | ||
|  |     { | ||
|  |         os_close_socket(pcommnu->clirecvsocket); | ||
|  |     } | ||
|  | #endif
 | ||
|  |     return 0; | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | void* Find(const uint8_t *pSour, const uint8_t *pDest, int SourLen, int DestLen) | ||
|  | { | ||
|  |     int i = 0, j = 0; | ||
|  |     while (i < SourLen && j < DestLen) | ||
|  |     { | ||
|  |         if (*(pSour + i) == *(pDest + j)) | ||
|  |         { | ||
|  |             i++; | ||
|  |             j++; | ||
|  |         } | ||
|  |         else | ||
|  |         { | ||
|  |             i = i - j + 1; | ||
|  |             j = 0; | ||
|  |         } | ||
|  |     } | ||
|  |     if (j == DestLen) | ||
|  |     { | ||
|  |         return (void*)(pSour + (i - DestLen)); | ||
|  |     } | ||
|  |     else | ||
|  |     { | ||
|  |         return NULL; | ||
|  |     } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | bool_t IsFullFrame(commnuicator_handle pcommnu, uint8_t* pdata_buffer, uint32_t data_buf_len, uint8_t* pread_buffer, uint32_t* pread_buf_len) | ||
|  | { | ||
|  |     //static char Buf[MAX_SERIAL_BUFFER * 2];
 | ||
|  |     static unsigned long nFrameStart = 0; | ||
|  |     static unsigned long nFrameEnd = 0; | ||
|  |     static unsigned long nCurrectPos = 0; | ||
|  |     uint8_t *pdest = NULL; | ||
|  | 
 | ||
|  |     //printf("**************nCurrentPos=(%d)***********\n", nCurrectPos);
 | ||
|  |     if (!pread_buf_len) | ||
|  |         return false; | ||
|  |     if (pread_buffer && (pread_buf_len != 0)) | ||
|  |     { | ||
|  |         if (nCurrectPos + *pread_buf_len > data_buf_len) | ||
|  |         { | ||
|  |             //zero the memory
 | ||
|  |             os_mem_set((void*)pdata_buffer, 0, data_buf_len); | ||
|  |             nFrameStart = 0; | ||
|  |             nCurrectPos = 0; | ||
|  |             return false; | ||
|  |         } | ||
|  |         else | ||
|  |         { | ||
|  |             os_mem_cpy((void*)(pdata_buffer+nCurrectPos), pread_buffer, *pread_buf_len); | ||
|  |             nCurrectPos = nCurrectPos + *pread_buf_len; | ||
|  |             os_mem_set(pdata_buffer+nCurrectPos, 0, data_buf_len - nCurrectPos); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | framebegin: | ||
|  |     pdest = (uint8_t*)Find(pdata_buffer, (uint8_t*)"##", data_buf_len, 2); | ||
|  |     if (pdest) | ||
|  |     { | ||
|  |         nFrameStart = (unsigned long)(pdest - pdata_buffer); | ||
|  | 
 | ||
|  |         //printf("found ##, (nCurrectPos=%d, dwRealRead=%d)\n", nCurrectPos, *pread_buf_len);
 | ||
|  |     } | ||
|  |     else//didn't find the start frame"##"
 | ||
|  |     { | ||
|  |         pdest = (uint8_t*)Find(pdata_buffer, (uint8_t*)"#", data_buf_len, 2); | ||
|  |         if (pdest) //fount the # wait for next package
 | ||
|  |         { | ||
|  |             os_mem_set(pdata_buffer, 0, data_buf_len);//zero the memory
 | ||
|  |             os_mem_cpy(pdata_buffer, "#", 1); | ||
|  |             nFrameStart = 0; | ||
|  |             nCurrectPos = 1; | ||
|  |             //printf("found #, (nCurrectPos=%d, dwRealRead=%d)\n", nCurrectPos, *pread_buf_len);
 | ||
|  |             return false; | ||
|  |         } | ||
|  |         else | ||
|  |         { | ||
|  |             os_mem_set(pdata_buffer, 0, data_buf_len);//zero the memory
 | ||
|  |             nFrameStart = 0; | ||
|  |             nCurrectPos = 0; | ||
|  |             //printf("no ## drop the data, (nCurrectPos=%d, dwRealRead=%d)\n", nCurrectPos, *pread_buf_len);
 | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | frameend: | ||
|  | 
 | ||
|  |     pdest = (uint8_t*)Find(pdata_buffer, (uint8_t*)"@@", data_buf_len, 2); | ||
|  |     if (pdest) | ||
|  |     { | ||
|  |         nFrameEnd = (unsigned long)(pdest - pdata_buffer + 2); | ||
|  |         //printf("found @@, (nCurrectPos=%d, dwRealRead=%d)\n", nCurrectPos, dwRealRead);
 | ||
|  | 
 | ||
|  |         if (nFrameStart == nFrameEnd) //"@@ is ahaead of ## move ## to head of buffer
 | ||
|  |         { | ||
|  | 
 | ||
|  |             os_mem_cpy(pdata_buffer, pdata_buffer+nFrameStart, nCurrectPos - nFrameStart); | ||
|  | 
 | ||
|  | 
 | ||
|  |             nCurrectPos = nCurrectPos - nFrameStart; | ||
|  |             *pread_buf_len = *pread_buf_len - nFrameStart; | ||
|  |             nFrameStart = 0; | ||
|  |             os_mem_set(pdata_buffer, 0, data_buf_len - nCurrectPos); | ||
|  |             goto frameend; | ||
|  |         } | ||
|  |         else | ||
|  |         { | ||
|  |             *pread_buf_len = nFrameEnd - nFrameStart; | ||
|  |             //memcpy(pReadBuf, &Buf[nFrameStart], dwRealRead);
 | ||
|  | 
 | ||
|  |             //memcpy(Buf1, &Buf[nFrameStart], nFrameEnd - nFrameStart);
 | ||
|  |             //printf("**************get a full command, size is %d ***********, (nCurrectPos=%d, dwRealRead=%d)\n", nFrameEnd - nFrameStart, nCurrectPos, dwRealRead);
 | ||
|  |             //ParseCliCommand(pdata_buffer + 2, nFrameEnd - nFrameStart - 2); //+2 is for removing the ## -2 is for removing the @@
 | ||
|  |             iot_uart_head* head = (iot_uart_head*)(pdata_buffer + 2); | ||
|  |             pcommnu->rx_ctrl_cb(pcommnu->ref_caller_ptr, pdata_buffer + 2 + sizeof(head), head->data_len, 0); | ||
|  |         } | ||
|  | 
 | ||
|  | 
 | ||
|  |         nFrameStart = nFrameEnd; | ||
|  |         nCurrectPos = nCurrectPos - *pread_buf_len; | ||
|  |         if (nCurrectPos > 0) | ||
|  |         { | ||
|  | 
 | ||
|  |             *pread_buf_len = nCurrectPos; | ||
|  | 
 | ||
|  |             //printf("(nCurrectPos > 0) goto begin, (nCurrectPos=%d, dwRealRead=%d)\n", nCurrectPos, dwRealRead);
 | ||
|  |             os_mem_cpy(pdata_buffer, pdata_buffer+nFrameEnd, nCurrectPos); | ||
|  |             os_mem_set(pdata_buffer+nCurrectPos, 0, data_buf_len - nCurrectPos); | ||
|  |             goto framebegin; | ||
|  |         } | ||
|  |         return true; | ||
|  |     } | ||
|  |     else | ||
|  |     { | ||
|  |         return false; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | commnuicator_handle com_handle; | ||
|  | 
 | ||
|  | void receive_func(uint8_t* buffer, uint32_t buffer_len, bool_t is_full_frame, | ||
|  |     uint32_t invalid_data_len) | ||
|  | { | ||
|  |     iot_printf("communicate receive_func(len=%d, is full%d, invalid_data%d)\n", | ||
|  |         buffer_len, is_full_frame, invalid_data_len); | ||
|  |     if (com_handle && com_handle->rx_ctrl_cb && is_full_frame) | ||
|  |         com_handle->rx_ctrl_cb(com_handle->ref_caller_ptr, | ||
|  |             iot_frame_data(buffer, com_handle->uart_frame)+ invalid_data_len, | ||
|  |             iot_frame_data_len(buffer_len, com_handle->uart_frame)- invalid_data_len, NULL); | ||
|  | } | ||
|  | 
 | ||
|  | #if HW_PLATFORM == HW_PLATFORM_SIMU
 | ||
|  | int uart_win_init(commnuicator_handle pcommnu) | ||
|  | { | ||
|  |     if (!pcommnu) | ||
|  |         return -1; | ||
|  | 
 | ||
|  |     pcommnu->uart_handle = (void*)iot_uart_open(pcommnu->com_num, receive_func, | ||
|  |         COMMUNI_UART_BUF_SIZE, &(pcommnu->uart_frame)); | ||
|  | 
 | ||
|  |     com_handle = pcommnu; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint8_t uart_win_deinit(commnuicator_handle pcommnu) | ||
|  | { | ||
|  |     if (!pcommnu) | ||
|  |         return 0; | ||
|  | 
 | ||
|  |     CloseHandle(((iot_uart_h_t*)(pcommnu->uart_handle))->uart_handle); | ||
|  |     ((iot_uart_h_t*)(pcommnu->uart_handle))->uart_handle = INVALID_HANDLE_VALUE; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t uart_win_send(commnuicator_handle pcommnu, iot_pkt_t *pkt) | ||
|  | { | ||
|  |     return iot_uart_send(pcommnu->uart_handle, pkt, | ||
|  |         &(pcommnu->uart_frame)); | ||
|  | } | ||
|  | 
 | ||
|  | #else
 | ||
|  | bool_t uart_init(commnuicator_handle pcommnu) | ||
|  | { | ||
|  |     bool_t ret = false; | ||
|  | 
 | ||
|  |     if (!pcommnu) | ||
|  |         return ret; | ||
|  | 
 | ||
|  |     pcommnu->uart_handle = (void*)iot_uart_open(pcommnu->com_num, receive_func, | ||
|  |         COMMUNI_UART_BUF_SIZE, &(pcommnu->uart_frame)); | ||
|  | 
 | ||
|  |     if (pcommnu->uart_handle) | ||
|  |     { | ||
|  |         ret = true; | ||
|  |         com_handle = pcommnu; | ||
|  |     } | ||
|  | 
 | ||
|  |     return ret; | ||
|  | } | ||
|  | 
 | ||
|  | uint8_t uart_deinit(commnuicator_handle pcommnu) | ||
|  | { | ||
|  |     iot_uart_close(pcommnu->uart_handle); | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t uart_receive_bytes(uint8_t *buf, uint32_t len) | ||
|  | { | ||
|  |     //return 0;
 | ||
|  |     return uart_read(cli_uart_fd, buf, len); | ||
|  | } | ||
|  | 
 | ||
|  | uint8_t uart_receive(commnuicator_handle pcommnu, uint8_t* buffer_read, uint32_t buffer_len) | ||
|  | { | ||
|  |     //return 0;
 | ||
|  |     uint32_t dwWantRead = 500; | ||
|  |     uint32_t dwRealRead = 0; | ||
|  |     uint8_t* pReadBuf = (uint8_t *)os_mem_malloc(IOT_COMMUNICATOR_MID, dwWantRead); | ||
|  | 
 | ||
|  |     if (!pReadBuf) | ||
|  |         return 1; | ||
|  | 
 | ||
|  |     if (!pcommnu || !buffer_read) | ||
|  |         return 0; | ||
|  |     os_mem_set(buffer_read, 0, buffer_len); | ||
|  | 
 | ||
|  |     while(1){ | ||
|  |         os_mem_set(pReadBuf, 0, dwWantRead); | ||
|  |         dwRealRead = uart_receive_bytes(pReadBuf, dwWantRead); | ||
|  |         if (dwRealRead>0){ | ||
|  |             iot_printf("12321(%d)\n", dwRealRead); | ||
|  |             if (IsFullFrame(pcommnu, buffer_read, buffer_len, pReadBuf, (uint32_t*)&dwRealRead)) | ||
|  |             { | ||
|  |                 dwWantRead = 500; | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  |     os_mem_free(pReadBuf); | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t uart_send(commnuicator_handle pcommnu, iot_pkt_t *pkt) | ||
|  | { | ||
|  | 
 | ||
|  | return iot_uart_send((iot_uart_h_t*)pcommnu->uart_handle, pkt, | ||
|  |         &(pcommnu->uart_frame)); | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if (IOT_CLI_INF_MODE == IOT_CLI_INF_MODE_LWIP_SOCKET)
 | ||
|  | void iot_lwip_socket_init(commnuicator_handle pcommnu) | ||
|  | { | ||
|  |     pcommnu->lwip_tcp_raw_socket = cli_open_lwip_tcp_socket(UDP_CLI_RECV_PORT); | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | uint8_t interfaces_init(commnuicator_handle pcommnu, caller_type_t caller, uint8_t work_mode) | ||
|  | { | ||
|  |     (void)caller; | ||
|  | #if HW_PLATFORM == HW_PLATFORM_SIMU
 | ||
|  |     if (pcommnu->type == COMMUNICATOR_SOCKET) | ||
|  |         socket_init(pcommnu, caller, work_mode); | ||
|  |     else if (pcommnu->type == COMMUNICATOR_UART) | ||
|  |         uart_win_init(pcommnu); | ||
|  | #else
 | ||
|  |     if (cli_ftm_mode == 1) { | ||
|  |         pcommnu->type = COMMUNICATOR_UART; | ||
|  |         uart_init(pcommnu); | ||
|  |     } | ||
|  |     else { | ||
|  | #if (IOT_CLI_INF_MODE == IOT_CLI_INF_MODE_LWIP_SOCKET)
 | ||
|  |         pcommnu->type = COMMUNICATOR_LWIP_SOCKET; | ||
|  |         iot_lwip_socket_init(pcommnu); | ||
|  | #elif (IOT_CLI_INF_MODE == IOT_CLI_INF_MODE_APP)
 | ||
|  |         pcommnu->type = COMMUNICATOR_APP; | ||
|  | #else
 | ||
|  |         pcommnu->type = COMMUNICATOR_UART; | ||
|  |         uart_init(pcommnu); | ||
|  | #endif
 | ||
|  |     } | ||
|  | #endif
 | ||
|  | 
 | ||
|  |     return 0; | ||
|  | } | ||
|  | uint8_t interfaces_deinit(commnuicator_handle pcommnu) | ||
|  | { | ||
|  | #if HW_PLATFORM == HW_PLATFORM_SIMU
 | ||
|  |     if (pcommnu->type == COMMUNICATOR_SOCKET) | ||
|  |         socket_deinit(pcommnu); | ||
|  |     else if (pcommnu->type == COMMUNICATOR_UART) | ||
|  |         uart_win_deinit(pcommnu); | ||
|  | #else
 | ||
|  |     if (pcommnu->type == COMMUNICATOR_UART) | ||
|  |         uart_deinit(pcommnu); | ||
|  | #endif
 | ||
|  |     return 0; | ||
|  | } | ||
|  | uint8_t commnunicator_init(commnuicator_handle pcommnu, | ||
|  |     void *caller_module, caller_type_t caller, uint8_t work_mode) | ||
|  | { | ||
|  |     if (pcommnu->is_initiated == 0) { | ||
|  |         interfaces_init(pcommnu, caller, work_mode); | ||
|  |     } | ||
|  |     pcommnu->is_initiated = 1; | ||
|  |     pcommnu->ref_caller_ptr = caller_module; | ||
|  | 
 | ||
|  |     if (caller == CALLER_HW_SIMULATOR) { | ||
|  |         os_create_task(communicator_rx_task, pcommnu, | ||
|  |             COMMUNICATOR_RX_TASK_PRIO); | ||
|  |     } | ||
|  | #if ((HW_PLATFORM == HW_PLATFORM_SIMU) || (IOT_CLI_INF_MODE == IOT_CLI_INF_MODE_LWIP_SOCKET))
 | ||
|  |     if (caller == CALLER_PLC_CLI) { | ||
|  |         os_create_task(communicator_rx_cli_task, pcommnu, | ||
|  |             COMMUNICATOR_RX_CLI_TASK_PRIO); | ||
|  |     } | ||
|  | #endif
 | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint8_t commnunicator_deinit(commnuicator_handle pcommnu) | ||
|  | { | ||
|  |     if (pcommnu->is_initiated == 1) { | ||
|  |         interfaces_deinit(pcommnu); | ||
|  |     } | ||
|  |     pcommnu->is_initiated = 0; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | int commnuicator_register_callback_packet_recv(commnuicator_handle pcommnu, | ||
|  |     communicator_rx_cb rx_cb) | ||
|  | { | ||
|  |     if (NULL == pcommnu) | ||
|  |     { | ||
|  |         iot_printf("%s: invalid parameter\n", __FUNCTION__); | ||
|  |         return -1; | ||
|  |     } | ||
|  |     pcommnu->rx_ctrl_cb = rx_cb; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | int commnuicator_register_callback_tx_comp(commnuicator_handle pcommnu, | ||
|  |     communicator_tx_comp_cb tx_comp_cb) | ||
|  | { | ||
|  |     if (NULL == pcommnu) | ||
|  |     { | ||
|  |         iot_printf("%s: invalid parameter\n", __FUNCTION__); | ||
|  |         return -1; | ||
|  |     } | ||
|  |     pcommnu->tx_comp_cb = tx_comp_cb; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | int commnuicator_register_cb_ext_tx_comp(commnuicator_handle pcommnu, | ||
|  |     communicator_tx_comp_cb tx_comp_cb) | ||
|  | { | ||
|  |     if (NULL == pcommnu) | ||
|  |     { | ||
|  |         iot_printf("%s: invalid parameter\n", __FUNCTION__); | ||
|  |         return -1; | ||
|  |     } | ||
|  |     pcommnu->ext_tx_cb = tx_comp_cb; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | int commnuicator_deregister_callback_packet_recv(commnuicator_handle pcommnu) | ||
|  | { | ||
|  |     if (NULL == pcommnu) | ||
|  |     { | ||
|  |         iot_printf("%s: invalid parameter\n", __FUNCTION__); | ||
|  |         return -1; | ||
|  |     } | ||
|  |     pcommnu->rx_ctrl_cb = NULL; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | /* return - the num of bytes txed */ | ||
|  | int package_send(commnuicator_handle pcommnu, uint32_t port, | ||
|  |     iot_pkt_t *pkt) | ||
|  | { | ||
|  |     if (!pcommnu || !pkt) { | ||
|  |         iot_printf("%s: invalid parameter\n", __FUNCTION__); | ||
|  |         if (pkt) | ||
|  |             iot_pkt_free(pkt); | ||
|  |         return 0; | ||
|  |     } | ||
|  | #if HW_PLATFORM == HW_PLATFORM_SIMU
 | ||
|  |     if (pcommnu->type == COMMUNICATOR_SOCKET) | ||
|  |     { | ||
|  |         uint32_t cur_sent_len = 0; | ||
|  |         uint32_t sent_len_all = 0; | ||
|  |         uint32_t len_to_send = 0; | ||
|  |         os_sock_addr dest_addr; | ||
|  |         uint32_t buffer_len = iot_pkt_data_len(pkt); | ||
|  |         uint8_t *buffer_to_send = iot_pkt_data(pkt); | ||
|  |         dest_addr.sin_addr = 0xffffffffUL; | ||
|  |         dest_addr.sin_port = | ||
|  |             (uint16_t)((uint32_t)port) & 0xffffUL; | ||
|  |         dest_addr.sin_port = os_htons(dest_addr.sin_port); | ||
|  |         IOT_ASSERT(buffer_len <= RTOS_MAX_UDP_PAYLOAD); | ||
|  | 
 | ||
|  |         while (sent_len_all < buffer_len) | ||
|  |         { | ||
|  |             len_to_send = buffer_len - sent_len_all; | ||
|  | 
 | ||
|  |             cur_sent_len = os_sendto(pcommnu->udpsendsocket, | ||
|  |                 (void *)&buffer_to_send[sent_len_all], len_to_send, 0, | ||
|  |                 &dest_addr, sizeof(dest_addr)); | ||
|  |             sent_len_all += cur_sent_len; | ||
|  |         } | ||
|  |         if (pcommnu->tx_comp_cb) | ||
|  |         { | ||
|  |             pcommnu->tx_comp_cb(pcommnu->ref_caller_ptr, | ||
|  |                 (void *)buffer_to_send, buffer_len); | ||
|  |         } | ||
|  |         iot_pkt_free(pkt); | ||
|  |         return sent_len_all; | ||
|  |     } | ||
|  |     else if (pcommnu->type == COMMUNICATOR_UART) | ||
|  |     { | ||
|  |         return uart_win_send(pcommnu, pkt); | ||
|  |     } | ||
|  |     else | ||
|  |     { | ||
|  |         iot_pkt_free(pkt); | ||
|  |         return 0; | ||
|  |     } | ||
|  | 
 | ||
|  | #else
 | ||
|  |     if (pcommnu->type == COMMUNICATOR_UART) | ||
|  |     { | ||
|  |         return uart_send(pcommnu, pkt); | ||
|  |     } | ||
|  | #if (IOT_CLI_INF_MODE == IOT_CLI_INF_MODE_LWIP_SOCKET)
 | ||
|  |     else if (pcommnu->type == COMMUNICATOR_LWIP_SOCKET) | ||
|  |     { | ||
|  |         uint32_t ret = 0; | ||
|  |         uint32_t buffer_len = iot_pkt_data_len(pkt); | ||
|  |         uint8_t *buffer_to_send = iot_pkt_data(pkt); | ||
|  | 
 | ||
|  |         ret = cli_lwip_send(pcommnu->lwip_tcp_con_socket, | ||
|  |             buffer_to_send, buffer_len); | ||
|  |         iot_pkt_free(pkt); | ||
|  |         return ret; | ||
|  |     } | ||
|  | #endif
 | ||
|  | #if (IOT_CLI_INF_MODE == IOT_CLI_INF_MODE_APP)
 | ||
|  |     else if (pcommnu->type == COMMUNICATOR_APP) | ||
|  |     { | ||
|  |         if (NULL != pcommnu->ext_tx_cb) { | ||
|  |             pcommnu->ext_tx_cb(NULL, iot_pkt_data(pkt), | ||
|  |                 iot_pkt_data_len(pkt)); | ||
|  |         } | ||
|  |         iot_pkt_free(pkt); | ||
|  |         return 0; | ||
|  |     } | ||
|  | #endif
 | ||
|  |     else | ||
|  |     { | ||
|  |         iot_pkt_free(pkt); | ||
|  |         return 0; | ||
|  |     } | ||
|  | #endif
 | ||
|  | } | ||
|  | 
 | ||
|  | int package_send_with_rawdata(commnuicator_handle pcommnu, uint32_t port, | ||
|  |     uint8_t* data, uint32_t data_len) | ||
|  | { | ||
|  |     if (!pcommnu || !data) { | ||
|  |         iot_printf("%s: invalid parameter\n", __FUNCTION__); | ||
|  |         return 0; | ||
|  |     } | ||
|  | #if HW_PLATFORM == HW_PLATFORM_SIMU
 | ||
|  |     if (pcommnu->type == COMMUNICATOR_SOCKET) | ||
|  |     { | ||
|  |         uint32_t cur_sent_len = 0; | ||
|  |         uint32_t sent_len_all = 0; | ||
|  |         uint32_t len_to_send = 0; | ||
|  |         os_sock_addr dest_addr; | ||
|  |         dest_addr.sin_addr = 0xffffffffUL; | ||
|  |         dest_addr.sin_port = | ||
|  |             (uint16_t)((uint32_t)port) & 0xffffUL; | ||
|  |         dest_addr.sin_port = os_htons(dest_addr.sin_port); | ||
|  |         IOT_ASSERT(data_len <= RTOS_MAX_UDP_PAYLOAD); | ||
|  | 
 | ||
|  |         while (sent_len_all < data_len) | ||
|  |         { | ||
|  |             len_to_send = data_len - sent_len_all; | ||
|  | 
 | ||
|  |             cur_sent_len = os_sendto(pcommnu->udpsendsocket, | ||
|  |                 (void *)&data[sent_len_all], len_to_send, 0, | ||
|  |                 &dest_addr, sizeof(dest_addr)); | ||
|  |             sent_len_all += cur_sent_len; | ||
|  |         } | ||
|  |         if (pcommnu->tx_comp_cb) | ||
|  |         { | ||
|  |             pcommnu->tx_comp_cb(pcommnu->ref_caller_ptr, | ||
|  |                 (void *)data, data_len); | ||
|  |         } | ||
|  |         return sent_len_all; | ||
|  |     } | ||
|  |     else | ||
|  |     { | ||
|  |         return 0; | ||
|  |     } | ||
|  | #else
 | ||
|  |     return 0; | ||
|  | #endif
 | ||
|  | } | ||
|  | 
 | ||
|  | static void communicator_rx_task(void *lpparameters) | ||
|  | { | ||
|  | #if HW_PLATFORM == HW_PLATFORM_SIMU
 | ||
|  |     int32_t lBytes; | ||
|  |     os_sock_addr client_addr; | ||
|  |     uint32_t client_len = sizeof(client_addr); | ||
|  |     uint8_t recvbuff[1024 * 3]; | ||
|  |     int8_t buffer[MAX_IP_ADDR_LEN] = { 0 }; | ||
|  |     commnuicator_handle commu = (commnuicator_handle)lpparameters; | ||
|  |     if (!commu) | ||
|  |         return; | ||
|  | 
 | ||
|  |     for (;; ) | ||
|  |     { | ||
|  |         os_mem_set(recvbuff, 0, sizeof(recvbuff)); | ||
|  |         lBytes = os_recv_from(commu->udprecvsocket, | ||
|  |             recvbuff, sizeof(recvbuff), 0, | ||
|  |             &client_addr, &client_len); | ||
|  |         if (lBytes < 0) | ||
|  |         { | ||
|  |             continue; | ||
|  |         } | ||
|  |         os_mem_set(buffer, 0, sizeof(buffer)); | ||
|  |         os_ntoa(client_addr.sin_addr, buffer); | ||
|  | 
 | ||
|  |         commu->rx_ctrl_cb(commu->ref_caller_ptr, recvbuff, | ||
|  |             lBytes, buffer); | ||
|  |     } | ||
|  | 
 | ||
|  | #else
 | ||
|  |     (void)lpparameters; | ||
|  | #endif
 | ||
|  | } | ||
|  | 
 | ||
|  | #if ((HW_PLATFORM == HW_PLATFORM_SIMU) || (IOT_CLI_INF_MODE == IOT_CLI_INF_MODE_LWIP_SOCKET))
 | ||
|  | 
 | ||
|  | static void communicator_rx_cli_task(void *lpparameters) | ||
|  | { | ||
|  |     (void)lpparameters; | ||
|  | #if HW_PLATFORM == HW_PLATFORM_SIMU
 | ||
|  |     if (((commnuicator_handle)lpparameters)->type == COMMUNICATOR_SOCKET) | ||
|  |     { | ||
|  |         commnuicator_handle commu = (commnuicator_handle)lpparameters; | ||
|  |         int8_t buffer[64] = { 0 }; | ||
|  |         os_sock_addr client_addr; | ||
|  |         uint32_t client_len = sizeof(client_addr); | ||
|  |         for (;; ) | ||
|  |         { | ||
|  |             os_mem_set(cli_sock_recv_buf, 0, sizeof(cli_sock_recv_buf)); | ||
|  |             int32_t lBytes = os_recv_from(commu->clirecvsocket, | ||
|  |                 cli_sock_recv_buf, sizeof(cli_sock_recv_buf), 0, | ||
|  |                 &client_addr, &client_len); | ||
|  | 
 | ||
|  |             if (lBytes < 0) | ||
|  |             { | ||
|  |                 continue; | ||
|  |             } | ||
|  |             os_mem_set(buffer, 0, sizeof(buffer)); | ||
|  |             os_ntoa(client_addr.sin_addr, buffer); | ||
|  |             if (g_ip_addr == client_addr.sin_addr) | ||
|  |             { | ||
|  |                 continue; | ||
|  |             } | ||
|  |             if (commu->rx_ctrl_cb) | ||
|  |             { | ||
|  |                 commu->rx_ctrl_cb(commu->ref_caller_ptr, cli_sock_recv_buf, | ||
|  |                     lBytes, NULL); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | #endif /*#if HW_PLATFORM == HW_PLATFORM_SIMU*/
 | ||
|  | #if (IOT_CLI_INF_MODE == IOT_CLI_INF_MODE_LWIP_SOCKET)
 | ||
|  |     if (((commnuicator_handle)lpparameters)->type == COMMUNICATOR_LWIP_SOCKET) | ||
|  |     { | ||
|  |         commnuicator_handle commu = (commnuicator_handle)lpparameters; | ||
|  |         for (;; ) | ||
|  |         { | ||
|  |             int sock = cli_lwip_accept(commu->lwip_tcp_raw_socket); | ||
|  |             if (sock < 0) { | ||
|  |                 continue; | ||
|  |             } | ||
|  |             commu->lwip_tcp_con_socket = sock; | ||
|  |             for (;;) | ||
|  |             { | ||
|  |                 os_mem_set(cli_sock_recv_buf, 0, sizeof(cli_sock_recv_buf)); | ||
|  |                 int32_t lBytes = cli_lwip_read(commu->lwip_tcp_con_socket, | ||
|  |                     cli_sock_recv_buf, sizeof(cli_sock_recv_buf)); | ||
|  | 
 | ||
|  |                 if (lBytes <= 0) | ||
|  |                 { | ||
|  |                     break; | ||
|  |                 } | ||
|  |                 if (commu->rx_ctrl_cb) | ||
|  |                 { | ||
|  |                     commu->rx_ctrl_cb(commu->ref_caller_ptr, cli_sock_recv_buf, | ||
|  |                         lBytes, NULL); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | #endif /*IOT_CLI_INF_MODE == IOT_CLI_INF_MODE_LWIP_SOCKET*/
 | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 |