ban4jp - / SNICInterface_PullReq

Dependents:   SNIC-httpclient-example SNIC-ntpclient-example

Fork of SNICInterface by muRata

Committer:
kishino
Date:
Tue Mar 18 01:13:52 2014 +0000
Revision:
9:a98b45e766c8
Parent:
8:50d2509479cd
Child:
10:49ffd373066b
[Refactoring]Updated that function for get buffer from memorypool.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kishino 0:61c402886fbb 1 #include "mbed.h"
kishino 8:50d2509479cd 2 #include "SNICwifi.h"
kishino 8:50d2509479cd 3 #include "SNICwifi_uartmsg.h"
kishino 0:61c402886fbb 4 #include <string>
kishino 0:61c402886fbb 5 //#include <algorithm>
kishino 0:61c402886fbb 6
kishino 2:0ba43344c814 7 using namespace murata_wifi;
kishino 2:0ba43344c814 8
kishino 2:0ba43344c814 9 #define UART_RECVBUF_SIZE 2048
kishino 2:0ba43344c814 10 typedef struct
kishino 2:0ba43344c814 11 {
kishino 2:0ba43344c814 12 unsigned char buf[UART_RECVBUF_SIZE];
kishino 2:0ba43344c814 13 unsigned int size;
kishino 2:0ba43344c814 14 bool is_receive;
kishino 2:0ba43344c814 15 }tagUART_RECVBUF_T;
kishino 2:0ba43344c814 16 tagUART_RECVBUF_T gUART_RCVBUF;
kishino 3:9f90024d7fb2 17 unsigned char gUART_TEMP_BUF[UART_RECVBUF_SIZE];
kishino 2:0ba43344c814 18
kishino 8:50d2509479cd 19 C_SNICwifi *C_SNICwifi::mInstance_p;
kishino 0:61c402886fbb 20
kishino 8:50d2509479cd 21 C_SNICwifi::C_SNICwifi(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm, int baud):
kishino 6:70f522934032 22 mUart(tx, rx)
kishino 0:61c402886fbb 23 {
kishino 0:61c402886fbb 24 mUartRecvThread_p = NULL;
kishino 0:61c402886fbb 25 mInstance_p = this;
kishino 0:61c402886fbb 26 mUartRequestSeq = 0;
kishino 0:61c402886fbb 27
kishino 2:0ba43344c814 28 // Initialize uart
kishino 2:0ba43344c814 29 gUART_RCVBUF.is_receive = false;
kishino 2:0ba43344c814 30 gUART_RCVBUF.size = 0;
kishino 2:0ba43344c814 31 mUart.baud( 115200 );
kishino 2:0ba43344c814 32 mUart.format(8, SerialBase::None, 1);
kishino 0:61c402886fbb 33 }
kishino 0:61c402886fbb 34
kishino 8:50d2509479cd 35 int C_SNICwifi::initUart()
kishino 0:61c402886fbb 36 {
kishino 0:61c402886fbb 37 // Create UART recv thread
kishino 8:50d2509479cd 38 mUartRecvThread_p = new Thread( C_SNICwifi::uartRecvThread );
kishino 0:61c402886fbb 39 if( mUartRecvThread_p == NULL )
kishino 0:61c402886fbb 40 {
kishino 8:50d2509479cd 41 printf("[C_SNICwifi::initUart] thread cread failed\r\n");
kishino 0:61c402886fbb 42 return -1;
kishino 0:61c402886fbb 43 }
kishino 2:0ba43344c814 44
kishino 0:61c402886fbb 45 return 0;
kishino 0:61c402886fbb 46 }
kishino 0:61c402886fbb 47
kishino 8:50d2509479cd 48 int C_SNICwifi::sendUart( unsigned int len, unsigned char *data )
kishino 0:61c402886fbb 49 {
kishino 2:0ba43344c814 50 int ret = 0;
kishino 2:0ba43344c814 51
kishino 2:0ba43344c814 52 mUartMutex.lock();
kishino 2:0ba43344c814 53 for( int i = 0; i < len; i++ )
kishino 2:0ba43344c814 54 {
kishino 2:0ba43344c814 55 // Write to UART
kishino 2:0ba43344c814 56 ret = mUart.putc( data[i] );
kishino 2:0ba43344c814 57 if( ret == -1 )
kishino 2:0ba43344c814 58 {
kishino 2:0ba43344c814 59 ret = -1;
kishino 2:0ba43344c814 60 break;
kishino 2:0ba43344c814 61 }
kishino 2:0ba43344c814 62 }
kishino 2:0ba43344c814 63 mUartMutex.unlock();
kishino 2:0ba43344c814 64 return ret;
kishino 0:61c402886fbb 65 }
kishino 0:61c402886fbb 66
kishino 9:a98b45e766c8 67 tagMEMPOOL_BLOCK_T *C_SNICwifi::getAlocCmdBuf()
kishino 9:a98b45e766c8 68 {
kishino 9:a98b45e766c8 69 // Get buffer from MemoryPool
kishino 9:a98b45e766c8 70 return mMemPoolPayload.alloc();
kishino 9:a98b45e766c8 71 }
kishino 9:a98b45e766c8 72
kishino 9:a98b45e766c8 73 void C_SNICwifi::freeCmdBuf( tagMEMPOOL_BLOCK_T *buf_p )
kishino 9:a98b45e766c8 74 {
kishino 9:a98b45e766c8 75 mMemPoolPayload.free( buf_p );
kishino 9:a98b45e766c8 76 }
kishino 9:a98b45e766c8 77
kishino 8:50d2509479cd 78 void C_SNICwifi::uartRecvThread (void const *args_p) {
kishino 2:0ba43344c814 79
kishino 8:50d2509479cd 80 C_SNICwifi *instance_p = C_SNICwifi::getInstance();
kishino 0:61c402886fbb 81 if ( instance_p == NULL )
kishino 0:61c402886fbb 82 {
kishino 0:61c402886fbb 83 printf("Socket constructor error: no wifly instance available!\r\n");
kishino 0:61c402886fbb 84 }
kishino 0:61c402886fbb 85
kishino 0:61c402886fbb 86 int recvdata = 0;
kishino 2:0ba43344c814 87 int i;
kishino 2:0ba43344c814 88
kishino 0:61c402886fbb 89 /* UART recv thread main loop */
kishino 0:61c402886fbb 90 for (;;)
kishino 0:61c402886fbb 91 {
kishino 2:0ba43344c814 92 while( instance_p->mUart.readable() )
kishino 2:0ba43344c814 93 {
kishino 2:0ba43344c814 94 // Receive data from UART.
kishino 2:0ba43344c814 95 instance_p->mUartMutex.lock();
kishino 2:0ba43344c814 96 recvdata = instance_p->mUart.getc();
kishino 2:0ba43344c814 97 instance_p->mUartMutex.unlock();
kishino 7:e88ccbe0225f 98
kishino 2:0ba43344c814 99 // Check UART receiving flg
kishino 2:0ba43344c814 100 if( gUART_RCVBUF.is_receive )
kishino 2:0ba43344c814 101 {
kishino 2:0ba43344c814 102 gUART_RCVBUF.buf[ gUART_RCVBUF.size ] = (unsigned char)recvdata;
kishino 2:0ba43344c814 103 gUART_RCVBUF.size++;
kishino 2:0ba43344c814 104 // Check received data is EOM.
kishino 2:0ba43344c814 105 if( recvdata == UART_CMD_EOM )
kishino 2:0ba43344c814 106 {
kishino 3:9f90024d7fb2 107 /*
kishino 2:0ba43344c814 108 printf("[recv]\r\n");
kishino 2:0ba43344c814 109 for( i = 0; i < gUART_RCVBUF.size; i++ )
kishino 2:0ba43344c814 110 {
kishino 2:0ba43344c814 111 printf("%02x ", gUART_RCVBUF.buf[i]);
kishino 2:0ba43344c814 112 }
kishino 2:0ba43344c814 113 printf("\r\n");
kishino 5:ef3befe3edad 114 */
kishino 2:0ba43344c814 115 unsigned char command_id;
kishino 3:9f90024d7fb2 116 // Get payload from received data from UART.
kishino 8:50d2509479cd 117 int payload_len = C_SNIC_UartMsg::getResponsePayload( gUART_RCVBUF.size, gUART_RCVBUF.buf
kishino 3:9f90024d7fb2 118 , &command_id, gUART_TEMP_BUF );
kishino 3:9f90024d7fb2 119 /*
kishino 3:9f90024d7fb2 120 printf("[payload]\r\n");
kishino 3:9f90024d7fb2 121 for( i = 0; i < payload_len; i++ )
kishino 3:9f90024d7fb2 122 {
kishino 3:9f90024d7fb2 123 printf("%02x ", gUART_TEMP_BUF[i]);
kishino 3:9f90024d7fb2 124 }
kishino 3:9f90024d7fb2 125 printf("\r\n");
kishino 5:ef3befe3edad 126 */
kishino 3:9f90024d7fb2 127 // Check scan results indication
kishino 3:9f90024d7fb2 128 if( (command_id == UART_CMD_ID_WIFI) || (gUART_TEMP_BUF[0] == UART_CMD_SID_WIFI_SCAN_RESULT_IND) )
kishino 3:9f90024d7fb2 129 {
kishino 3:9f90024d7fb2 130 // Scan result indicate
kishino 3:9f90024d7fb2 131 instance_p->mUartCommand.scanResultIndicate( gUART_TEMP_BUF, payload_len );
kishino 3:9f90024d7fb2 132 }
kishino 2:0ba43344c814 133
kishino 3:9f90024d7fb2 134 // Checks in the command which is waiting.
kishino 3:9f90024d7fb2 135 if( instance_p->mUartCommand.isWaitingCommand(command_id, gUART_TEMP_BUF) )
kishino 2:0ba43344c814 136 {
kishino 3:9f90024d7fb2 137 // Get buffer for payload data
kishino 3:9f90024d7fb2 138 unsigned char *payload_buf_p = instance_p->mUartCommand.getResponseBuf();
kishino 3:9f90024d7fb2 139 if( payload_buf_p != NULL )
kishino 2:0ba43344c814 140 {
kishino 3:9f90024d7fb2 141 memcpy( payload_buf_p, gUART_TEMP_BUF, payload_len );
kishino 3:9f90024d7fb2 142 instance_p->mUartCommand.setResponseBuf( NULL );
kishino 2:0ba43344c814 143 }
kishino 3:9f90024d7fb2 144 // Set status
kishino 3:9f90024d7fb2 145 instance_p->mUartCommand.setCommandStatus( gUART_TEMP_BUF[2] );
kishino 3:9f90024d7fb2 146 // Set signal for command response wait.
kishino 3:9f90024d7fb2 147 instance_p->mUartCommand.signal();
kishino 2:0ba43344c814 148 }
kishino 3:9f90024d7fb2 149
kishino 2:0ba43344c814 150 gUART_RCVBUF.size = 0;
kishino 2:0ba43344c814 151 gUART_RCVBUF.is_receive = false;
kishino 2:0ba43344c814 152 }
kishino 2:0ba43344c814 153 }
kishino 2:0ba43344c814 154 else
kishino 2:0ba43344c814 155 {
kishino 2:0ba43344c814 156 // Check received data is SOM.
kishino 2:0ba43344c814 157 if( recvdata == UART_CMD_SOM )
kishino 2:0ba43344c814 158 {
kishino 2:0ba43344c814 159 gUART_RCVBUF.size = 0;
kishino 2:0ba43344c814 160 gUART_RCVBUF.buf[ gUART_RCVBUF.size ] = (unsigned char)recvdata;
kishino 2:0ba43344c814 161 gUART_RCVBUF.size++;
kishino 2:0ba43344c814 162 gUART_RCVBUF.is_receive = true;
kishino 2:0ba43344c814 163 }
kishino 2:0ba43344c814 164 }
kishino 7:e88ccbe0225f 165 // Thread::yield();
kishino 2:0ba43344c814 166 }
kishino 2:0ba43344c814 167 Thread::yield();
kishino 0:61c402886fbb 168 }
kishino 0:61c402886fbb 169 }
kishino 0:61c402886fbb 170