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