Websocket_Sample for MurataTypeYD

Dependencies:   mbed picojson

Committer:
komoritan
Date:
Thu Mar 12 12:14:38 2015 +0000
Revision:
0:14bd24b5a77f
fixed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
komoritan 0:14bd24b5a77f 1 /* Copyright (C) 2014 Murata Manufacturing Co.,Ltd., MIT License
komoritan 0:14bd24b5a77f 2 * muRata, SWITCH SCIENCE Wi-FI module TypeYD SNIC-UART.
komoritan 0:14bd24b5a77f 3 *
komoritan 0:14bd24b5a77f 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
komoritan 0:14bd24b5a77f 5 * and associated documentation files (the "Software"), to deal in the Software without restriction,
komoritan 0:14bd24b5a77f 6 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
komoritan 0:14bd24b5a77f 7 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
komoritan 0:14bd24b5a77f 8 * furnished to do so, subject to the following conditions:
komoritan 0:14bd24b5a77f 9 *
komoritan 0:14bd24b5a77f 10 * The above copyright notice and this permission notice shall be included in all copies or
komoritan 0:14bd24b5a77f 11 * substantial portions of the Software.
komoritan 0:14bd24b5a77f 12 *
komoritan 0:14bd24b5a77f 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
komoritan 0:14bd24b5a77f 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
komoritan 0:14bd24b5a77f 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
komoritan 0:14bd24b5a77f 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
komoritan 0:14bd24b5a77f 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
komoritan 0:14bd24b5a77f 18 */
komoritan 0:14bd24b5a77f 19 #include "mbed.h"
komoritan 0:14bd24b5a77f 20 #include "SNIC_Core.h"
komoritan 0:14bd24b5a77f 21 #include "SNIC_UartMsgUtil.h"
komoritan 0:14bd24b5a77f 22 #include <string>
komoritan 0:14bd24b5a77f 23
komoritan 0:14bd24b5a77f 24 /** Wait signal ID of UART recv */
komoritan 0:14bd24b5a77f 25 #define UART_DISPATCH_SIGNAL 0x00000002
komoritan 0:14bd24b5a77f 26
komoritan 0:14bd24b5a77f 27 #define UART_RECVBUF_SIZE 2048
komoritan 0:14bd24b5a77f 28 #define UART_THREAD_STACK_SIZE 512
komoritan 0:14bd24b5a77f 29 #define UART_FIXED_HEADER_SIZE 3
komoritan 0:14bd24b5a77f 30 #define UART_FIXED_SIZE_IN_FRAME 6
komoritan 0:14bd24b5a77f 31 #define UART_RECV_QUEUE_TIMEOUT 500
komoritan 0:14bd24b5a77f 32
komoritan 0:14bd24b5a77f 33 typedef struct
komoritan 0:14bd24b5a77f 34 {
komoritan 0:14bd24b5a77f 35 tagMEMPOOL_BLOCK_T *mem_p;
komoritan 0:14bd24b5a77f 36 unsigned int size;
komoritan 0:14bd24b5a77f 37 }tagUART_RECVBUF_T;
komoritan 0:14bd24b5a77f 38
komoritan 0:14bd24b5a77f 39 /*
komoritan 0:14bd24b5a77f 40 Define the global buffer using the area for Ethernet.
komoritan 0:14bd24b5a77f 41 */
komoritan 0:14bd24b5a77f 42 unsigned char gUART_TEMP_BUF[UART_RECVBUF_SIZE] __attribute__((section("AHBSRAM1")));
komoritan 0:14bd24b5a77f 43 unsigned char gUART_COMMAND_BUF[UART_REQUEST_PAYLOAD_MAX] __attribute__((section("AHBSRAM1")));
komoritan 0:14bd24b5a77f 44 /** MemoryPool for payload of UART response */
komoritan 0:14bd24b5a77f 45 //MemoryPool<tagMEMPOOL_BLOCK_T, MEMPOOL_PAYLOAD_NUM> mMemPoolPayload __attribute__((section("AHBSRAM1")));
komoritan 0:14bd24b5a77f 46 MemoryPool<tagMEMPOOL_BLOCK_T, MEMPOOL_PAYLOAD_NUM> mMemPoolPayload __attribute__((section("AHBSRAM0")));
komoritan 0:14bd24b5a77f 47 /** MemoryPool for UART receive */
komoritan 0:14bd24b5a77f 48 MemoryPool<tagMEMPOOL_BLOCK_T, MEMPOOL_UART_RECV_NUM> mMemPoolUartRecv __attribute__((section("AHBSRAM0")));
komoritan 0:14bd24b5a77f 49 Queue<tagMEMPOOL_BLOCK_T, MEMPOOL_UART_RECV_NUM> mUartRecvQueue;
komoritan 0:14bd24b5a77f 50
komoritan 0:14bd24b5a77f 51 tagMEMPOOL_BLOCK_T *gUART_RCVBUF_p;
komoritan 0:14bd24b5a77f 52 int gUART_RECV_COUNT = 0;
komoritan 0:14bd24b5a77f 53
komoritan 0:14bd24b5a77f 54 C_SNIC_Core *C_SNIC_Core::mInstance_p = NULL;
komoritan 0:14bd24b5a77f 55
komoritan 0:14bd24b5a77f 56 C_SNIC_Core *C_SNIC_Core::getInstance()
komoritan 0:14bd24b5a77f 57 {
komoritan 0:14bd24b5a77f 58 if( mInstance_p == NULL )
komoritan 0:14bd24b5a77f 59 {
komoritan 0:14bd24b5a77f 60 mInstance_p = new C_SNIC_Core();
komoritan 0:14bd24b5a77f 61 }
komoritan 0:14bd24b5a77f 62 return mInstance_p;
komoritan 0:14bd24b5a77f 63 }
komoritan 0:14bd24b5a77f 64
komoritan 0:14bd24b5a77f 65 C_SNIC_Core::C_SNIC_Core()
komoritan 0:14bd24b5a77f 66 {
komoritan 0:14bd24b5a77f 67 int i;
komoritan 0:14bd24b5a77f 68
komoritan 0:14bd24b5a77f 69 mUartCommand_p = new C_SNIC_UartCommandManager();
komoritan 0:14bd24b5a77f 70 for( i = 0; i < MAX_SOCKET_ID+1; i++ )
komoritan 0:14bd24b5a77f 71 {
komoritan 0:14bd24b5a77f 72 mConnectInfo[i].recvbuf_p = NULL;
komoritan 0:14bd24b5a77f 73 mConnectInfo[i].is_connected = false;
komoritan 0:14bd24b5a77f 74 mConnectInfo[i].is_receive_complete = true;
komoritan 0:14bd24b5a77f 75
komoritan 0:14bd24b5a77f 76 mUdpRecvInfo[i].recvbuf_p = NULL;
komoritan 0:14bd24b5a77f 77 mUdpRecvInfo[i].is_received = false;
komoritan 0:14bd24b5a77f 78 }
komoritan 0:14bd24b5a77f 79
komoritan 0:14bd24b5a77f 80 mUartRecvThread_p = NULL;
komoritan 0:14bd24b5a77f 81 mUartRecvDispatchThread_p = NULL;
komoritan 0:14bd24b5a77f 82 }
komoritan 0:14bd24b5a77f 83
komoritan 0:14bd24b5a77f 84 C_SNIC_Core::~C_SNIC_Core()
komoritan 0:14bd24b5a77f 85 {
komoritan 0:14bd24b5a77f 86 }
komoritan 0:14bd24b5a77f 87
komoritan 0:14bd24b5a77f 88 int C_SNIC_Core::resetModule( PinName reset )
komoritan 0:14bd24b5a77f 89 {
komoritan 0:14bd24b5a77f 90 DigitalOut reset_pin( reset );
komoritan 0:14bd24b5a77f 91
komoritan 0:14bd24b5a77f 92 reset_pin = 0;
komoritan 0:14bd24b5a77f 93 wait(0.3);
komoritan 0:14bd24b5a77f 94 reset_pin = 1;
komoritan 0:14bd24b5a77f 95 wait(0.3);
komoritan 0:14bd24b5a77f 96
komoritan 0:14bd24b5a77f 97 return 0;
komoritan 0:14bd24b5a77f 98 }
komoritan 0:14bd24b5a77f 99
komoritan 0:14bd24b5a77f 100 int C_SNIC_Core::initUart(PinName tx, PinName rx, int baud)
komoritan 0:14bd24b5a77f 101 {
komoritan 0:14bd24b5a77f 102 mUartRequestSeq = 0;
komoritan 0:14bd24b5a77f 103
komoritan 0:14bd24b5a77f 104 mUart_p = new RawSerial( tx, rx );
komoritan 0:14bd24b5a77f 105 mUart_p->baud( baud );
komoritan 0:14bd24b5a77f 106 mUart_p->format(8, SerialBase::None, 1);
komoritan 0:14bd24b5a77f 107
komoritan 0:14bd24b5a77f 108 // Initialize uart
komoritan 0:14bd24b5a77f 109 gUART_RCVBUF_p = NULL;
komoritan 0:14bd24b5a77f 110
komoritan 0:14bd24b5a77f 111 mUart_p->attach( C_SNIC_Core::uartRecvCallback );
komoritan 0:14bd24b5a77f 112 // Create UART recv dispatch thread
komoritan 0:14bd24b5a77f 113 mUartRecvDispatchThread_p = new Thread( C_SNIC_Core::uartRecvDispatchThread, NULL, osPriorityNormal, UART_THREAD_STACK_SIZE);
komoritan 0:14bd24b5a77f 114 if( mUartRecvDispatchThread_p == NULL )
komoritan 0:14bd24b5a77f 115 {
komoritan 0:14bd24b5a77f 116 DEBUG_PRINT("[C_SNIC_Core::initUart] thread create failed\r\n");
komoritan 0:14bd24b5a77f 117 return -1;
komoritan 0:14bd24b5a77f 118 }
komoritan 0:14bd24b5a77f 119
komoritan 0:14bd24b5a77f 120 return 0;
komoritan 0:14bd24b5a77f 121 }
komoritan 0:14bd24b5a77f 122 unsigned int C_SNIC_Core::preparationSendCommand( unsigned char cmd_id, unsigned char cmd_sid
komoritan 0:14bd24b5a77f 123 , unsigned char *req_buf_p, unsigned int req_buf_len
komoritan 0:14bd24b5a77f 124 , unsigned char *response_buf_p, unsigned char *command_p )
komoritan 0:14bd24b5a77f 125 {
komoritan 0:14bd24b5a77f 126 unsigned int command_len = 0;
komoritan 0:14bd24b5a77f 127
komoritan 0:14bd24b5a77f 128 // Make all command request
komoritan 0:14bd24b5a77f 129 command_len = C_SNIC_UartMsgUtil::makeRequest( cmd_id, req_buf_p, req_buf_len, command_p );
komoritan 0:14bd24b5a77f 130
komoritan 0:14bd24b5a77f 131 // Set data for response
komoritan 0:14bd24b5a77f 132 mUartCommand_p->setCommandID( cmd_id );
komoritan 0:14bd24b5a77f 133 mUartCommand_p->setCommandSID( cmd_sid | 0x80 );
komoritan 0:14bd24b5a77f 134 mUartCommand_p->setResponseBuf( response_buf_p );
komoritan 0:14bd24b5a77f 135
komoritan 0:14bd24b5a77f 136 return command_len;
komoritan 0:14bd24b5a77f 137 }
komoritan 0:14bd24b5a77f 138
komoritan 0:14bd24b5a77f 139 int C_SNIC_Core::sendUart( unsigned int len, unsigned char *data )
komoritan 0:14bd24b5a77f 140 {
komoritan 0:14bd24b5a77f 141 int ret = 0;
komoritan 0:14bd24b5a77f 142 mUartMutex.lock();
komoritan 0:14bd24b5a77f 143 for( int i = 0; i < len; i++ )
komoritan 0:14bd24b5a77f 144 {
komoritan 0:14bd24b5a77f 145 // Write to UART
komoritan 0:14bd24b5a77f 146 ret = mUart_p->putc( data[i] );
komoritan 0:14bd24b5a77f 147 if( ret == -1 )
komoritan 0:14bd24b5a77f 148 {
komoritan 0:14bd24b5a77f 149 break;
komoritan 0:14bd24b5a77f 150 }
komoritan 0:14bd24b5a77f 151 }
komoritan 0:14bd24b5a77f 152 mUartMutex.unlock();
komoritan 0:14bd24b5a77f 153
komoritan 0:14bd24b5a77f 154 return ret;
komoritan 0:14bd24b5a77f 155 }
komoritan 0:14bd24b5a77f 156
komoritan 0:14bd24b5a77f 157 tagMEMPOOL_BLOCK_T *C_SNIC_Core::allocCmdBuf()
komoritan 0:14bd24b5a77f 158 {
komoritan 0:14bd24b5a77f 159 // Get buffer from MemoryPool
komoritan 0:14bd24b5a77f 160 return mMemPoolPayload.alloc();
komoritan 0:14bd24b5a77f 161 }
komoritan 0:14bd24b5a77f 162
komoritan 0:14bd24b5a77f 163 void C_SNIC_Core::freeCmdBuf( tagMEMPOOL_BLOCK_T *buf_p )
komoritan 0:14bd24b5a77f 164 {
komoritan 0:14bd24b5a77f 165 mMemPoolPayload.free( buf_p );
komoritan 0:14bd24b5a77f 166 }
komoritan 0:14bd24b5a77f 167
komoritan 0:14bd24b5a77f 168 tagMEMPOOL_BLOCK_T *C_SNIC_Core::allocUartRcvBuf()
komoritan 0:14bd24b5a77f 169 {
komoritan 0:14bd24b5a77f 170 // Get buffer from MemoryPool
komoritan 0:14bd24b5a77f 171 return mMemPoolUartRecv.alloc();
komoritan 0:14bd24b5a77f 172 }
komoritan 0:14bd24b5a77f 173
komoritan 0:14bd24b5a77f 174 void C_SNIC_Core::freeUartRecvBuf( tagMEMPOOL_BLOCK_T *buf_p )
komoritan 0:14bd24b5a77f 175 {
komoritan 0:14bd24b5a77f 176 mMemPoolUartRecv.free( buf_p );
komoritan 0:14bd24b5a77f 177 }
komoritan 0:14bd24b5a77f 178
komoritan 0:14bd24b5a77f 179 C_SNIC_Core::tagCONNECT_INFO_T *C_SNIC_Core::getConnectInfo( int socket_id )
komoritan 0:14bd24b5a77f 180 {
komoritan 0:14bd24b5a77f 181 if( (socket_id < 0) || (socket_id > MAX_SOCKET_ID) )
komoritan 0:14bd24b5a77f 182 {
komoritan 0:14bd24b5a77f 183 return NULL;
komoritan 0:14bd24b5a77f 184 }
komoritan 0:14bd24b5a77f 185 return &mConnectInfo[socket_id];
komoritan 0:14bd24b5a77f 186 }
komoritan 0:14bd24b5a77f 187
komoritan 0:14bd24b5a77f 188 C_SNIC_Core::tagUDP_RECVINFO_T *C_SNIC_Core::getUdpRecvInfo( int socket_id )
komoritan 0:14bd24b5a77f 189 {
komoritan 0:14bd24b5a77f 190 if( (socket_id < 0) || (socket_id > MAX_SOCKET_ID) )
komoritan 0:14bd24b5a77f 191 {
komoritan 0:14bd24b5a77f 192 return NULL;
komoritan 0:14bd24b5a77f 193 }
komoritan 0:14bd24b5a77f 194 return &mUdpRecvInfo[socket_id];
komoritan 0:14bd24b5a77f 195 }
komoritan 0:14bd24b5a77f 196
komoritan 0:14bd24b5a77f 197 C_SNIC_UartCommandManager *C_SNIC_Core::getUartCommand()
komoritan 0:14bd24b5a77f 198 {
komoritan 0:14bd24b5a77f 199 return mUartCommand_p;
komoritan 0:14bd24b5a77f 200 }
komoritan 0:14bd24b5a77f 201
komoritan 0:14bd24b5a77f 202 unsigned char *C_SNIC_Core::getCommandBuf()
komoritan 0:14bd24b5a77f 203 {
komoritan 0:14bd24b5a77f 204 return gUART_COMMAND_BUF;
komoritan 0:14bd24b5a77f 205 }
komoritan 0:14bd24b5a77f 206
komoritan 0:14bd24b5a77f 207 void C_SNIC_Core::lockAPI( void )
komoritan 0:14bd24b5a77f 208 {
komoritan 0:14bd24b5a77f 209 mAPIMutex.lock();
komoritan 0:14bd24b5a77f 210 }
komoritan 0:14bd24b5a77f 211
komoritan 0:14bd24b5a77f 212 void C_SNIC_Core::unlockAPI( void )
komoritan 0:14bd24b5a77f 213 {
komoritan 0:14bd24b5a77f 214 mAPIMutex.unlock();
komoritan 0:14bd24b5a77f 215 }
komoritan 0:14bd24b5a77f 216
komoritan 0:14bd24b5a77f 217 void C_SNIC_Core::uartRecvCallback( void )
komoritan 0:14bd24b5a77f 218 {
komoritan 0:14bd24b5a77f 219 C_SNIC_Core *instance_p = C_SNIC_Core::getInstance();
komoritan 0:14bd24b5a77f 220 if( instance_p != NULL )
komoritan 0:14bd24b5a77f 221 {
komoritan 0:14bd24b5a77f 222 int recvdata = 0;
komoritan 0:14bd24b5a77f 223
komoritan 0:14bd24b5a77f 224 // Check received data from UART.
komoritan 0:14bd24b5a77f 225 while( instance_p->mUart_p->readable() )
komoritan 0:14bd24b5a77f 226 {
komoritan 0:14bd24b5a77f 227 // Receive data from UART.
komoritan 0:14bd24b5a77f 228 recvdata = instance_p->mUart_p->getc();
komoritan 0:14bd24b5a77f 229
komoritan 0:14bd24b5a77f 230 // Check UART receiving buffer
komoritan 0:14bd24b5a77f 231 if( gUART_RCVBUF_p != NULL )
komoritan 0:14bd24b5a77f 232 {
komoritan 0:14bd24b5a77f 233 gUART_RCVBUF_p->buf[ gUART_RCVBUF_p->size ] = (unsigned char)recvdata;
komoritan 0:14bd24b5a77f 234 gUART_RCVBUF_p->size++;
komoritan 0:14bd24b5a77f 235
komoritan 0:14bd24b5a77f 236 if( gUART_RCVBUF_p->size == UART_FIXED_HEADER_SIZE )
komoritan 0:14bd24b5a77f 237 {
komoritan 0:14bd24b5a77f 238 // get demand size
komoritan 0:14bd24b5a77f 239 unsigned short payload_len = ( ( (gUART_RCVBUF_p->buf[1] & ~0x80) & 0xff) | ( ( (gUART_RCVBUF_p->buf[2] & ~0xC0) << 7) & 0xff80) );
komoritan 0:14bd24b5a77f 240 gUART_RCVBUF_p->demand_size = payload_len + UART_FIXED_SIZE_IN_FRAME;
komoritan 0:14bd24b5a77f 241 if( gUART_RCVBUF_p->demand_size > MEMPOOL_BLOCK_SIZE )
komoritan 0:14bd24b5a77f 242 {
komoritan 0:14bd24b5a77f 243 gUART_RCVBUF_p->demand_size = MEMPOOL_BLOCK_SIZE;
komoritan 0:14bd24b5a77f 244 }
komoritan 0:14bd24b5a77f 245 }
komoritan 0:14bd24b5a77f 246
komoritan 0:14bd24b5a77f 247 if( gUART_RCVBUF_p->demand_size > 0 )
komoritan 0:14bd24b5a77f 248 {
komoritan 0:14bd24b5a77f 249 // Check size of received data.
komoritan 0:14bd24b5a77f 250 if( gUART_RCVBUF_p->size >= gUART_RCVBUF_p->demand_size )
komoritan 0:14bd24b5a77f 251 {
komoritan 0:14bd24b5a77f 252 // Add queue
komoritan 0:14bd24b5a77f 253 mUartRecvQueue.put( gUART_RCVBUF_p );
komoritan 0:14bd24b5a77f 254
komoritan 0:14bd24b5a77f 255 gUART_RCVBUF_p = NULL;
komoritan 0:14bd24b5a77f 256
komoritan 0:14bd24b5a77f 257 if( gUART_RECV_COUNT >= MEMPOOL_UART_RECV_NUM )
komoritan 0:14bd24b5a77f 258 {
komoritan 0:14bd24b5a77f 259 instance_p->mUart_p->attach( NULL );
komoritan 0:14bd24b5a77f 260 }
komoritan 0:14bd24b5a77f 261 // set signal for dispatch thread
komoritan 0:14bd24b5a77f 262 instance_p->mUartRecvDispatchThread_p->signal_set( UART_DISPATCH_SIGNAL );
komoritan 0:14bd24b5a77f 263 break;
komoritan 0:14bd24b5a77f 264 }
komoritan 0:14bd24b5a77f 265 }
komoritan 0:14bd24b5a77f 266 }
komoritan 0:14bd24b5a77f 267 else
komoritan 0:14bd24b5a77f 268 {
komoritan 0:14bd24b5a77f 269 // Check received data is SOM.
komoritan 0:14bd24b5a77f 270 if( recvdata == UART_CMD_SOM )
komoritan 0:14bd24b5a77f 271 {
komoritan 0:14bd24b5a77f 272 gUART_RCVBUF_p = instance_p->allocUartRcvBuf();
komoritan 0:14bd24b5a77f 273 gUART_RECV_COUNT++;
komoritan 0:14bd24b5a77f 274 gUART_RCVBUF_p->size = 0;
komoritan 0:14bd24b5a77f 275 gUART_RCVBUF_p->demand_size = 0;
komoritan 0:14bd24b5a77f 276
komoritan 0:14bd24b5a77f 277 // get buffer for Uart receive
komoritan 0:14bd24b5a77f 278 gUART_RCVBUF_p->buf[ 0 ] = (unsigned char)recvdata;
komoritan 0:14bd24b5a77f 279
komoritan 0:14bd24b5a77f 280 gUART_RCVBUF_p->size++;
komoritan 0:14bd24b5a77f 281 }
komoritan 0:14bd24b5a77f 282 }
komoritan 0:14bd24b5a77f 283 }
komoritan 0:14bd24b5a77f 284 }
komoritan 0:14bd24b5a77f 285 }
komoritan 0:14bd24b5a77f 286
komoritan 0:14bd24b5a77f 287 void C_SNIC_Core::uartRecvDispatchThread (void const *args_p)
komoritan 0:14bd24b5a77f 288 {
komoritan 0:14bd24b5a77f 289 C_SNIC_Core *instance_p = C_SNIC_Core::getInstance();
komoritan 0:14bd24b5a77f 290 C_SNIC_UartCommandManager *uartCmdMgr_p = instance_p->getUartCommand();
komoritan 0:14bd24b5a77f 291
komoritan 0:14bd24b5a77f 292 tagMEMPOOL_BLOCK_T *uartRecvBuf_p;
komoritan 0:14bd24b5a77f 293 osEvent evt;
komoritan 0:14bd24b5a77f 294
komoritan 0:14bd24b5a77f 295 for(;;)
komoritan 0:14bd24b5a77f 296 {
komoritan 0:14bd24b5a77f 297 // wait
komoritan 0:14bd24b5a77f 298 Thread::signal_wait( UART_DISPATCH_SIGNAL );
komoritan 0:14bd24b5a77f 299
komoritan 0:14bd24b5a77f 300 // Get scanresults from queue
komoritan 0:14bd24b5a77f 301 evt = mUartRecvQueue.get(UART_RECV_QUEUE_TIMEOUT);
komoritan 0:14bd24b5a77f 302 if (evt.status == osEventMessage)
komoritan 0:14bd24b5a77f 303 {
komoritan 0:14bd24b5a77f 304 do
komoritan 0:14bd24b5a77f 305 {
komoritan 0:14bd24b5a77f 306 uartRecvBuf_p = (tagMEMPOOL_BLOCK_T *)evt.value.p;
komoritan 0:14bd24b5a77f 307
komoritan 0:14bd24b5a77f 308 #if 0 /* for Debug */
komoritan 0:14bd24b5a77f 309 {
komoritan 0:14bd24b5a77f 310 int i;
komoritan 0:14bd24b5a77f 311 for(i=0;i<uartRecvBuf_p->size;i++)
komoritan 0:14bd24b5a77f 312 {
komoritan 0:14bd24b5a77f 313 DEBUG_PRINT("%02x", uartRecvBuf_p->buf[i]);
komoritan 0:14bd24b5a77f 314 }
komoritan 0:14bd24b5a77f 315 DEBUG_PRINT("\r\n");
komoritan 0:14bd24b5a77f 316 }
komoritan 0:14bd24b5a77f 317 #endif
komoritan 0:14bd24b5a77f 318 unsigned char command_id;
komoritan 0:14bd24b5a77f 319 // Get payload from received data from UART.
komoritan 0:14bd24b5a77f 320 int payload_len = C_SNIC_UartMsgUtil::getResponsePayload( uartRecvBuf_p->size, uartRecvBuf_p->buf
komoritan 0:14bd24b5a77f 321 , &command_id, gUART_TEMP_BUF );
komoritan 0:14bd24b5a77f 322 // Check receive a TCP packet
komoritan 0:14bd24b5a77f 323 if( (command_id == UART_CMD_ID_SNIC) && (gUART_TEMP_BUF[0] == UART_CMD_SID_SNIC_CONNECTION_RECV_IND) )
komoritan 0:14bd24b5a77f 324 {
komoritan 0:14bd24b5a77f 325 // Packet buffering
komoritan 0:14bd24b5a77f 326 uartCmdMgr_p->bufferredPacket( gUART_TEMP_BUF, payload_len );
komoritan 0:14bd24b5a77f 327 }
komoritan 0:14bd24b5a77f 328 // Check connected from TCP client
komoritan 0:14bd24b5a77f 329 else if( (command_id == UART_CMD_ID_SNIC) && (gUART_TEMP_BUF[0] == UART_CMD_SID_SNIC_TCP_CLIENT_SOCKET_IND) )
komoritan 0:14bd24b5a77f 330 {
komoritan 0:14bd24b5a77f 331 // Connected from TCP client
komoritan 0:14bd24b5a77f 332 uartCmdMgr_p->connectedTCPClient( gUART_TEMP_BUF, payload_len );
komoritan 0:14bd24b5a77f 333 }
komoritan 0:14bd24b5a77f 334 // Check receive UDP packet
komoritan 0:14bd24b5a77f 335 else if( (command_id == UART_CMD_ID_SNIC) && (gUART_TEMP_BUF[0] == UART_CMD_SID_SNIC_UDP_RECV_IND) )
komoritan 0:14bd24b5a77f 336 {
komoritan 0:14bd24b5a77f 337 // UDP packet buffering
komoritan 0:14bd24b5a77f 338 uartCmdMgr_p->bufferredUDPPacket( gUART_TEMP_BUF, payload_len );
komoritan 0:14bd24b5a77f 339 }
komoritan 0:14bd24b5a77f 340 // Check scan results indication
komoritan 0:14bd24b5a77f 341 else if( (command_id == UART_CMD_ID_WIFI) && (gUART_TEMP_BUF[0] == UART_CMD_SID_WIFI_SCAN_RESULT_IND) )
komoritan 0:14bd24b5a77f 342 {
komoritan 0:14bd24b5a77f 343 // Scan result indicate
komoritan 0:14bd24b5a77f 344 uartCmdMgr_p->scanResultIndicate( gUART_TEMP_BUF, payload_len );
komoritan 0:14bd24b5a77f 345 }
komoritan 0:14bd24b5a77f 346 // Checks in the command which is waiting.
komoritan 0:14bd24b5a77f 347 else if( uartCmdMgr_p->isWaitingCommand(command_id, gUART_TEMP_BUF) )
komoritan 0:14bd24b5a77f 348 {
komoritan 0:14bd24b5a77f 349 // Get buffer for payload data
komoritan 0:14bd24b5a77f 350 unsigned char *payload_buf_p = uartCmdMgr_p->getResponseBuf();
komoritan 0:14bd24b5a77f 351 if( payload_buf_p != NULL )
komoritan 0:14bd24b5a77f 352 {
komoritan 0:14bd24b5a77f 353 memcpy( payload_buf_p, gUART_TEMP_BUF, payload_len );
komoritan 0:14bd24b5a77f 354 uartCmdMgr_p->setResponseBuf( NULL );
komoritan 0:14bd24b5a77f 355 }
komoritan 0:14bd24b5a77f 356 // Set status
komoritan 0:14bd24b5a77f 357 uartCmdMgr_p->setCommandStatus( gUART_TEMP_BUF[2] );
komoritan 0:14bd24b5a77f 358 // Set signal for command response wait.
komoritan 0:14bd24b5a77f 359 uartCmdMgr_p->signal();
komoritan 0:14bd24b5a77f 360 }
komoritan 0:14bd24b5a77f 361 else
komoritan 0:14bd24b5a77f 362 {
komoritan 0:14bd24b5a77f 363 //DEBUG_PRINT(" The received data is not expected.\r\n");
komoritan 0:14bd24b5a77f 364 }
komoritan 0:14bd24b5a77f 365
komoritan 0:14bd24b5a77f 366 //
komoritan 0:14bd24b5a77f 367 instance_p->freeUartRecvBuf( uartRecvBuf_p );
komoritan 0:14bd24b5a77f 368 gUART_RECV_COUNT--;
komoritan 0:14bd24b5a77f 369 if( gUART_RECV_COUNT == (MEMPOOL_UART_RECV_NUM-1) )
komoritan 0:14bd24b5a77f 370 {
komoritan 0:14bd24b5a77f 371 instance_p->mUart_p->attach( C_SNIC_Core::uartRecvCallback ); //debug
komoritan 0:14bd24b5a77f 372 }
komoritan 0:14bd24b5a77f 373
komoritan 0:14bd24b5a77f 374 evt = mUartRecvQueue.get(500);
komoritan 0:14bd24b5a77f 375 } while( evt.status == osEventMessage );
komoritan 0:14bd24b5a77f 376 }
komoritan 0:14bd24b5a77f 377 }
komoritan 0:14bd24b5a77f 378 }