SNIC UART Interface library for Murata Type-YD module
Dependents: WebSocketServerTest
Fork of SNICInterface_mod by
Diff: SNIC/SNIC_Core.cpp
- Revision:
- 29:6a0ba999597d
- Parent:
- 26:f2e1030964e4
- Child:
- 32:ae95309643aa
--- a/SNIC/SNIC_Core.cpp Tue Apr 01 07:19:19 2014 +0000 +++ b/SNIC/SNIC_Core.cpp Mon May 26 05:17:28 2014 +0000 @@ -15,18 +15,32 @@ #include "SNIC_UartMsgUtil.h" #include <string> -using namespace murata_wifi; +/** Wait signal ID of UART recv */ +#define UART_DISPATCH_SIGNAL 0x00000002 +#define UART_RECEIVE_SIGNAL 0x00000004 -#define UART_RECVBUF_SIZE 2048 +#define UART_RECVBUF_SIZE 2048 +#define UART_THREAD_STACK_SIZE 512 + typedef struct { - unsigned char buf[UART_RECVBUF_SIZE]; + tagMEMPOOL_BLOCK_T *mem_p; unsigned int size; - bool is_receive; }tagUART_RECVBUF_T; -tagUART_RECVBUF_T gUART_RCVBUF; -unsigned char gUART_TEMP_BUF[UART_RECVBUF_SIZE]; +/* + Define the global buffer using the area for Ethernet. +*/ +unsigned char gUART_TEMP_BUF[UART_RECVBUF_SIZE] __attribute__((section("AHBSRAM1"))); +unsigned char gUART_COMMAND_BUF[UART_REQUEST_PAYLOAD_MAX] __attribute__((section("AHBSRAM1"))); +unsigned char gPAYLOAD_ARRAY[UART_REQUEST_PAYLOAD_MAX] __attribute__((section("AHBSRAM1"))); +/** MemoryPool for payload of UART response */ +MemoryPool<tagMEMPOOL_BLOCK_T, MEMPOOL_PAYLOAD_NUM> mMemPoolPayload __attribute__((section("AHBSRAM1"))); +/** MemoryPool for UART receive */ +MemoryPool<tagMEMPOOL_BLOCK_T, MEMPOOL_UART_RECV_NUM> mMemPoolUartRecv __attribute__((section("AHBSRAM1"))); +Queue<tagMEMPOOL_BLOCK_T, MEMPOOL_UART_RECV_NUM> mUartRecvQueue; + +tagMEMPOOL_BLOCK_T *gUART_RCVBUF_p; C_SNIC_Core *C_SNIC_Core::mInstance_p = NULL; C_SNIC_Core *C_SNIC_Core::getInstance() @@ -49,13 +63,26 @@ mConnectInfo[i].is_connected = false; } - mUartRecvThread_p = NULL; + mUartRecvThread_p = NULL; + mUartRecvDispatchThread_p = NULL; } C_SNIC_Core::~C_SNIC_Core() { } +int C_SNIC_Core::resetModule( PinName reset ) +{ + DigitalOut reset_pin( reset ); + + reset_pin = 0; + wait(0.2); + reset_pin = 1; + wait(0.2); + + return 0; +} + int C_SNIC_Core::initUart(PinName tx, PinName rx, int baud) { // printf("[C_SNIC_Core::initUart]1\r\n"); @@ -65,36 +92,32 @@ 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; + gUART_RCVBUF_p = NULL; - // Create UART recv thread - mUartRecvThread_p = new Thread( C_SNIC_Core::uartRecvThread ); -// printf("[C_SNIC_Core::initUart]3\r\n"); - if( mUartRecvThread_p == NULL ) + mUart_p->attach( C_SNIC_Core::uartRecvCallback ); + // Create UART recv dispatch thread + mUartRecvDispatchThread_p = new Thread( C_SNIC_Core::uartRecvDispatchThread, NULL, osPriorityNormal, UART_THREAD_STACK_SIZE); + if( mUartRecvDispatchThread_p == NULL ) { - printf("[C_SNIC_Core::initUart] thread cread failed\r\n"); + printf("[C_SNIC_Core::initUart] thread create failed\r\n"); return -1; } return 0; } - -unsigned int C_SNIC_Core::preparationSendCommand( unsigned char cmd_id, unsigned char cmd_sid +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 ); + payload_len = C_SNIC_UartMsgUtil::makePayload( req_buf_len, req_buf_p, gPAYLOAD_ARRAY ); // Make all command request - command_len = C_SNIC_UartMsgUtil::makeRequest( cmd_id, payload_array, payload_len, command_p ); + command_len = C_SNIC_UartMsgUtil::makeRequest( cmd_id, gPAYLOAD_ARRAY, payload_len, command_p ); // Set data for response mUartCommand_p->setCommandID( cmd_id ); @@ -107,7 +130,6 @@ int C_SNIC_Core::sendUart( unsigned int len, unsigned char *data ) { int ret = 0; - mUartMutex.lock(); for( int i = 0; i < len; i++ ) { @@ -123,7 +145,7 @@ return ret; } -C_SNIC_Core::tagMEMPOOL_BLOCK_T *C_SNIC_Core::allocCmdBuf() +tagMEMPOOL_BLOCK_T *C_SNIC_Core::allocCmdBuf() { // Get buffer from MemoryPool return mMemPoolPayload.alloc(); @@ -134,6 +156,17 @@ mMemPoolPayload.free( buf_p ); } +tagMEMPOOL_BLOCK_T *C_SNIC_Core::allocUartRcvBuf() +{ + // Get buffer from MemoryPool + return mMemPoolUartRecv.alloc(); +} + +void C_SNIC_Core::freeUartRecvBuf( tagMEMPOOL_BLOCK_T *buf_p ) +{ + mMemPoolUartRecv.free( buf_p ); +} + C_SNIC_Core::tagCONNECT_INFO_T *C_SNIC_Core::getConnectInfo( int socket_id ) { if( (socket_id < 0) || (socket_id > MAX_SOCKET_ID) ) @@ -148,82 +181,46 @@ return mUartCommand_p; } -DigitalOut led1(LED1); -void C_SNIC_Core::uartRecvThread (void const *args_p) { +unsigned char *C_SNIC_Core::getCommandBuf() +{ + return gUART_COMMAND_BUF; +} +DigitalOut led1(LED1); + +void C_SNIC_Core::uartRecvCallback( void ) +{ C_SNIC_Core *instance_p = C_SNIC_Core::getInstance(); - if ( instance_p == NULL ) + 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 recvdata = 0; - int i; - - /* UART recv thread main loop */ - for (;;) - { - while( instance_p->mUart_p->readable() ) + // set signal +// instance_p->mUartRecvThread_p->signal_set( UART_RECEIVE_SIGNAL ); + if( 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 ) + // Check UART receiving buffer + if( gUART_RCVBUF_p != NULL ) { - gUART_RCVBUF.buf[ gUART_RCVBUF.size ] = (unsigned char)recvdata; - gUART_RCVBUF.size++; + gUART_RCVBUF_p->buf[ gUART_RCVBUF_p->size ] = (unsigned char)recvdata; + gUART_RCVBUF_p->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(); - } + // Add queue + mUartRecvQueue.put( gUART_RCVBUF_p ); - gUART_RCVBUF.size = 0; - gUART_RCVBUF.is_receive = false; + gUART_RCVBUF_p = NULL; + + // set signal for dispatch thread + instance_p->mUartRecvDispatchThread_p->signal_set( UART_DISPATCH_SIGNAL ); } } else @@ -232,15 +229,90 @@ 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; + gUART_RCVBUF_p = instance_p->allocUartRcvBuf(); + gUART_RCVBUF_p->size = 0; + // get buffer for Uart receive + gUART_RCVBUF_p->buf[ 0 ] = (unsigned char)recvdata; + + gUART_RCVBUF_p->size++; } } -// Thread::yield(); } - Thread::yield(); } } +void C_SNIC_Core::uartRecvDispatchThread (void const *args_p) +{ + C_SNIC_Core *instance_p = C_SNIC_Core::getInstance(); + C_SNIC_UartCommandManager *uartCmdMgr_p = instance_p->getUartCommand(); + + tagMEMPOOL_BLOCK_T *uartRecvBuf_p; + osEvent evt; + + for(;;) + { + // wait + Thread::signal_wait( UART_DISPATCH_SIGNAL ); + + // Get scanresults from queue + evt = mUartRecvQueue.get(500); + if (evt.status == osEventMessage) + { + do + { + uartRecvBuf_p = (tagMEMPOOL_BLOCK_T *)evt.value.p; + + { + int i; + printf("[rcv]:%d",uartRecvBuf_p->size ); +/* + for(i=0;i<uartRecvBuf_p->size;i++) + { + printf("%02x", uartRecvBuf_p->buf[i]); + } +*/ + printf("\r\n"); + } + + unsigned char command_id; + // Get payload from received data from UART. + int payload_len = C_SNIC_UartMsgUtil::getResponsePayload( uartRecvBuf_p->size, uartRecvBuf_p->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) ) + { + //lcd_printf("cid:%02x scid:%02x\r\n", command_id, gUART_TEMP_BUF[0]); + + // 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(); + } + // + instance_p->freeUartRecvBuf( uartRecvBuf_p ); + + evt = mUartRecvQueue.get(500); + Thread::yield(); + } while( evt.status == osEventMessage ); + } + } +}