KDDI Fx0 hackathon
/
MurataTypeYD_Websocket_Sample_full
Websocket_Sample for MurataTypeYD
SNICInterface_mod/SNIC/SNIC_Core.cpp@0:14bd24b5a77f, 2015-03-12 (annotated)
- Committer:
- komoritan
- Date:
- Thu Mar 12 12:14:38 2015 +0000
- Revision:
- 0:14bd24b5a77f
fixed
Who changed what in which revision?
User | Revision | Line number | New 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 | } |