Murata Type YD Wi-Fi driver

Dependents:   easy-connect-type-yd

Committer:
MACRUM
Date:
Wed Jul 12 10:49:10 2017 +0000
Revision:
0:35a2186cf186
Initial commit

Who changed what in which revision?

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