customized SNICInterface
Fork of NySNICInterface by
Diff: SNIC/SNIC_Core.cpp
- Revision:
- 20:dd736d328de6
- Child:
- 22:a9ec0cad4f84
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SNIC/SNIC_Core.cpp Thu Mar 27 06:52:04 2014 +0000 @@ -0,0 +1,242 @@ +/******************* Murata Manufacturing Co.,Ltd. 2014 ***************** + * + * Filename: SNIC_Core.cpp + * + * Purpose: This module has implementation of internal common function for API. + * + * $Author: kishino $ + * + * $Date: 2014/03/26 $ + * + * $Revision: 0.0.0.1 $ + * ***********************************************************************/ +#include "mbed.h" +#include "SNIC_Core.h" +#include "SNIC_UartMsgUtil.h" +#include <string> + +using namespace murata_wifi; + +#define UART_RECVBUF_SIZE 2048 +typedef struct +{ + unsigned char buf[UART_RECVBUF_SIZE]; + unsigned int size; + bool is_receive; +}tagUART_RECVBUF_T; +tagUART_RECVBUF_T gUART_RCVBUF; +unsigned char gUART_TEMP_BUF[UART_RECVBUF_SIZE]; + +C_SNIC_Core *C_SNIC_Core::mInstance_p = NULL; + +C_SNIC_Core *C_SNIC_Core::getInstance() +{ + if( mInstance_p == NULL ) + { + mInstance_p = new C_SNIC_Core(); + } + return mInstance_p; +} + +C_SNIC_Core::C_SNIC_Core() +{ + int i; + + mUartCommand_p = new C_SNIC_UartCommandManager(); + for( i = 0; i < MAX_SOCKET_ID+1; i++ ) + { + mConnectInfo[i].recvbuf_p = NULL; + mConnectInfo[i].is_connected = false; + } + + mUartRecvThread_p = NULL; +} + +int C_SNIC_Core::initUart(PinName tx, PinName rx, int baud) +{ +// printf("[C_SNIC_Core::initUart]1\r\n"); + + mUartRequestSeq = 0; + + mUart_p = new RawSerial( tx, rx ); + mUart_p->baud( baud ); + mUart_p->format(8, SerialBase::None, 1); + +// printf("[C_SNIC_Core::initUart]2\r\n"); + // Initialize uart + gUART_RCVBUF.is_receive = false; + gUART_RCVBUF.size = 0; + + // Create UART recv thread + mUartRecvThread_p = new Thread( C_SNIC_Core::uartRecvThread ); +// printf("[C_SNIC_Core::initUart]3\r\n"); + if( mUartRecvThread_p == NULL ) + { + printf("[C_SNIC_Core::initUart] thread cread failed\r\n"); + return -1; + } + + return 0; +} + +unsigned int C_SNIC_Core::preparationSendCommand( unsigned char cmd_id, unsigned char cmd_sid + , unsigned char *req_buf_p, unsigned int req_buf_len + , unsigned char *response_buf_p, unsigned char *command_p ) +{ + unsigned char payload_array[UART_REQUEST_PAYLOAD_MAX]; + unsigned short payload_len; + unsigned int command_len = 0; + + // Make command payload + payload_len = C_SNIC_UartMsgUtil::makePayload( req_buf_len, req_buf_p, payload_array ); + // Make all command request + command_len = C_SNIC_UartMsgUtil::makeRequest( cmd_id, payload_array, payload_len, command_p ); + + // Set data for response + mUartCommand_p->setCommandID( cmd_id ); + mUartCommand_p->setCommandSID( cmd_sid | 0x80 ); + mUartCommand_p->setResponseBuf( response_buf_p ); + + return command_len; +} + +int C_SNIC_Core::sendUart( unsigned int len, unsigned char *data ) +{ + int ret = 0; + + mUartMutex.lock(); + for( int i = 0; i < len; i++ ) + { + // Write to UART + ret = mUart_p->putc( data[i] ); + if( ret == -1 ) + { + ret = -1; + break; + } + } + mUartMutex.unlock(); + return ret; +} + +tagMEMPOOL_BLOCK_T *C_SNIC_Core::allocCmdBuf() +{ + // Get buffer from MemoryPool + return mMemPoolPayload.alloc(); +} + +void C_SNIC_Core::freeCmdBuf( tagMEMPOOL_BLOCK_T *buf_p ) +{ + mMemPoolPayload.free( buf_p ); +} + +tagCONNECT_INFO_T *C_SNIC_Core::getConnectInfo( int socket_id ) +{ + if( (socket_id < 0) || (socket_id > MAX_SOCKET_ID) ) + { + return NULL; + } + return &mConnectInfo[socket_id]; +} + +C_SNIC_UartCommandManager *C_SNIC_Core::getUartCommand() +{ + return mUartCommand_p; +} + +DigitalOut led1(LED1); +void C_SNIC_Core::uartRecvThread (void const *args_p) { + + C_SNIC_Core *instance_p = C_SNIC_Core::getInstance(); + if ( instance_p == NULL ) + { + printf("Socket constructor error: no wifly instance available!\r\n"); + } + C_SNIC_UartCommandManager *uartCmdMgr_p = instance_p->getUartCommand(); + + int recvdata = 0; + int i; + + /* UART recv thread main loop */ + for (;;) + { + while( instance_p->mUart_p->readable() ) + { + // Receive data from UART. + instance_p->mUartMutex.lock(); + recvdata = instance_p->mUart_p->getc(); + instance_p->mUartMutex.unlock(); + + // Check UART receiving flg + if( gUART_RCVBUF.is_receive ) + { + gUART_RCVBUF.buf[ gUART_RCVBUF.size ] = (unsigned char)recvdata; + gUART_RCVBUF.size++; + // Check received data is EOM. + if( recvdata == UART_CMD_EOM ) + { + led1 = 0; +#if 0 + printf("[recv]\r\n"); + for( i = 0; i < gUART_RCVBUF.size; i++ ) + { + printf("%02x ", gUART_RCVBUF.buf[i]); + } + printf("\r\n"); +#endif + unsigned char command_id; + // Get payload from received data from UART. + int payload_len = C_SNIC_UartMsgUtil::getResponsePayload( gUART_RCVBUF.size, gUART_RCVBUF.buf + , &command_id, gUART_TEMP_BUF ); + + // Check receive a TCP or UDP packet + if( (command_id == UART_CMD_ID_SNIC) && (gUART_TEMP_BUF[0] == UART_CMD_SID_SNIC_CONNECTION_RECV_IND) ) + { + // Packet buffering + uartCmdMgr_p->bufferredPacket( gUART_TEMP_BUF, payload_len ); + } + + // Check scan results indication + else if( (command_id == UART_CMD_ID_WIFI) && (gUART_TEMP_BUF[0] == UART_CMD_SID_WIFI_SCAN_RESULT_IND) ) + { + // Scan result indicate + uartCmdMgr_p->scanResultIndicate( gUART_TEMP_BUF, payload_len ); + } + // Checks in the command which is waiting. + else if( uartCmdMgr_p->isWaitingCommand(command_id, gUART_TEMP_BUF) ) + { + // Get buffer for payload data + unsigned char *payload_buf_p = uartCmdMgr_p->getResponseBuf(); + if( payload_buf_p != NULL ) + { + memcpy( payload_buf_p, gUART_TEMP_BUF, payload_len ); + uartCmdMgr_p->setResponseBuf( NULL ); + } + // Set status + uartCmdMgr_p->setCommandStatus( gUART_TEMP_BUF[2] ); + // Set signal for command response wait. + uartCmdMgr_p->signal(); + } + + gUART_RCVBUF.size = 0; + gUART_RCVBUF.is_receive = false; + } + } + else + { + // Check received data is SOM. + if( recvdata == UART_CMD_SOM ) + { + led1 = 1; + gUART_RCVBUF.size = 0; + gUART_RCVBUF.buf[ gUART_RCVBUF.size ] = (unsigned char)recvdata; + gUART_RCVBUF.size++; + gUART_RCVBUF.is_receive = true; + } + } +// Thread::yield(); + } + Thread::yield(); + } +} +