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 "rtos.h"
MACRUM 0:35a2186cf186 21 #include "mbed-trace/mbed_trace.h"
MACRUM 0:35a2186cf186 22 #define TRACE_GROUP "SNIC"
MACRUM 0:35a2186cf186 23
MACRUM 0:35a2186cf186 24 #include "SNICInterface/SNIC/SNIC_UartCommandManager.h"
MACRUM 0:35a2186cf186 25 #include "SNICInterface/SNIC/SNIC_Core.h"
MACRUM 0:35a2186cf186 26 #include "SNICInterface/Socket/SNIC_Socket.h"
MACRUM 0:35a2186cf186 27 #include "SNICInterface/Socket/TCPSocketServer.h"
MACRUM 0:35a2186cf186 28
MACRUM 0:35a2186cf186 29 extern "C" void socket_event_handler(void);
MACRUM 0:35a2186cf186 30
MACRUM 0:35a2186cf186 31 C_SNIC_UartCommandManager::~C_SNIC_UartCommandManager()
MACRUM 0:35a2186cf186 32 {
MACRUM 0:35a2186cf186 33 }
MACRUM 0:35a2186cf186 34
MACRUM 0:35a2186cf186 35 void C_SNIC_UartCommandManager::setCommandID( unsigned char cmd_id )
MACRUM 0:35a2186cf186 36 {
MACRUM 0:35a2186cf186 37 mCommandID = cmd_id;
MACRUM 0:35a2186cf186 38 }
MACRUM 0:35a2186cf186 39
MACRUM 0:35a2186cf186 40 unsigned char C_SNIC_UartCommandManager::getCommandID()
MACRUM 0:35a2186cf186 41 {
MACRUM 0:35a2186cf186 42 return mCommandID;
MACRUM 0:35a2186cf186 43 }
MACRUM 0:35a2186cf186 44
MACRUM 0:35a2186cf186 45 void C_SNIC_UartCommandManager::setCommandSID( unsigned char cmd_sid )
MACRUM 0:35a2186cf186 46 {
MACRUM 0:35a2186cf186 47 mCommandSID = cmd_sid;
MACRUM 0:35a2186cf186 48 }
MACRUM 0:35a2186cf186 49
MACRUM 0:35a2186cf186 50 unsigned char C_SNIC_UartCommandManager::getCommandSID()
MACRUM 0:35a2186cf186 51 {
MACRUM 0:35a2186cf186 52 return mCommandSID;
MACRUM 0:35a2186cf186 53 }
MACRUM 0:35a2186cf186 54
MACRUM 0:35a2186cf186 55 void C_SNIC_UartCommandManager::setCommandStatus( unsigned char status )
MACRUM 0:35a2186cf186 56 {
MACRUM 0:35a2186cf186 57 mCommandStatus = status;
MACRUM 0:35a2186cf186 58 }
MACRUM 0:35a2186cf186 59
MACRUM 0:35a2186cf186 60 unsigned char C_SNIC_UartCommandManager::getCommandStatus()
MACRUM 0:35a2186cf186 61 {
MACRUM 0:35a2186cf186 62 return mCommandStatus;
MACRUM 0:35a2186cf186 63 }
MACRUM 0:35a2186cf186 64
MACRUM 0:35a2186cf186 65 void C_SNIC_UartCommandManager::setResponseBuf( unsigned char *buf_p )
MACRUM 0:35a2186cf186 66 {
MACRUM 0:35a2186cf186 67 mResponseBuf_p = buf_p;
MACRUM 0:35a2186cf186 68 }
MACRUM 0:35a2186cf186 69
MACRUM 0:35a2186cf186 70 unsigned char *C_SNIC_UartCommandManager::getResponseBuf()
MACRUM 0:35a2186cf186 71 {
MACRUM 0:35a2186cf186 72 return mResponseBuf_p;
MACRUM 0:35a2186cf186 73 }
MACRUM 0:35a2186cf186 74
MACRUM 0:35a2186cf186 75 void C_SNIC_UartCommandManager::setScanResultHandler( void (*handler_p)(tagSCAN_RESULT_T *scan_result) )
MACRUM 0:35a2186cf186 76 {
MACRUM 0:35a2186cf186 77 mScanResultHandler_p = handler_p;
MACRUM 0:35a2186cf186 78 }
MACRUM 0:35a2186cf186 79
MACRUM 0:35a2186cf186 80
MACRUM 0:35a2186cf186 81 int C_SNIC_UartCommandManager::wait()
MACRUM 0:35a2186cf186 82 {
MACRUM 0:35a2186cf186 83 int ret = 0;
MACRUM 0:35a2186cf186 84
MACRUM 0:35a2186cf186 85 // Get thread ID
MACRUM 0:35a2186cf186 86 mCommandThreadID = osThreadGetId();
MACRUM 0:35a2186cf186 87
MACRUM 0:35a2186cf186 88 // Signal flags that are reported as event are automatically cleared.
MACRUM 0:35a2186cf186 89 osEvent event_ret = osSignalWait( UART_COMMAND_SIGNAL, UART_COMMAND_WAIT_TIMEOUT);
MACRUM 0:35a2186cf186 90 if( event_ret.status != osEventSignal )
MACRUM 0:35a2186cf186 91 {
MACRUM 0:35a2186cf186 92 ret = -1;
MACRUM 0:35a2186cf186 93 }
MACRUM 0:35a2186cf186 94
MACRUM 0:35a2186cf186 95 return ret;
MACRUM 0:35a2186cf186 96 }
MACRUM 0:35a2186cf186 97
MACRUM 0:35a2186cf186 98 int C_SNIC_UartCommandManager::signal()
MACRUM 0:35a2186cf186 99 {
MACRUM 0:35a2186cf186 100 // set signal
MACRUM 0:35a2186cf186 101 return osSignalSet(mCommandThreadID, UART_COMMAND_SIGNAL);
MACRUM 0:35a2186cf186 102 }
MACRUM 0:35a2186cf186 103
MACRUM 0:35a2186cf186 104 bool C_SNIC_UartCommandManager::isWaitingCommand( unsigned int command_id, unsigned char *payload_p )
MACRUM 0:35a2186cf186 105 {
MACRUM 0:35a2186cf186 106 bool ret = false;
MACRUM 0:35a2186cf186 107
MACRUM 0:35a2186cf186 108 if( (command_id == getCommandID())
MACRUM 0:35a2186cf186 109 && (payload_p[0] == getCommandSID()) )
MACRUM 0:35a2186cf186 110 {
MACRUM 0:35a2186cf186 111 ret = true;
MACRUM 0:35a2186cf186 112 }
MACRUM 0:35a2186cf186 113 return ret;
MACRUM 0:35a2186cf186 114 }
MACRUM 0:35a2186cf186 115
MACRUM 0:35a2186cf186 116 void C_SNIC_UartCommandManager::scanResultIndicate( unsigned char *payload_p, int payload_len )
MACRUM 0:35a2186cf186 117 {
MACRUM 0:35a2186cf186 118 if( (payload_p == NULL) || (mScanResultHandler_p == NULL) )
MACRUM 0:35a2186cf186 119 {
MACRUM 0:35a2186cf186 120 return;
MACRUM 0:35a2186cf186 121 }
MACRUM 0:35a2186cf186 122
MACRUM 0:35a2186cf186 123 tagSCAN_RESULT_T scan_result;
MACRUM 0:35a2186cf186 124 int ap_count = payload_p[2];
MACRUM 0:35a2186cf186 125
MACRUM 0:35a2186cf186 126 if( ap_count == 0 )
MACRUM 0:35a2186cf186 127 {
MACRUM 0:35a2186cf186 128 mScanResultHandler_p( NULL );
MACRUM 0:35a2186cf186 129 }
MACRUM 0:35a2186cf186 130
MACRUM 0:35a2186cf186 131 unsigned char *ap_info_p = &payload_p[3];
MACRUM 0:35a2186cf186 132 int ap_info_idx = 0;
MACRUM 0:35a2186cf186 133
MACRUM 0:35a2186cf186 134 for( int i = 0; i < ap_count; i++ )
MACRUM 0:35a2186cf186 135 {
MACRUM 0:35a2186cf186 136 scan_result.is_complete = ap_count - i - 1;
MACRUM 0:35a2186cf186 137 scan_result.channel = ap_info_p[ap_info_idx];
MACRUM 0:35a2186cf186 138 ap_info_idx++;
MACRUM 0:35a2186cf186 139 scan_result.rssi = (signed)ap_info_p[ap_info_idx];
MACRUM 0:35a2186cf186 140 ap_info_idx++;
MACRUM 0:35a2186cf186 141 scan_result.security= ap_info_p[ap_info_idx];
MACRUM 0:35a2186cf186 142 ap_info_idx++;
MACRUM 0:35a2186cf186 143 memcpy( scan_result.bssid, &ap_info_p[ap_info_idx], BSSID_MAC_LENTH );
MACRUM 0:35a2186cf186 144 ap_info_idx += BSSID_MAC_LENTH;
MACRUM 0:35a2186cf186 145 scan_result.network_type= ap_info_p[ap_info_idx];
MACRUM 0:35a2186cf186 146 ap_info_idx++;
MACRUM 0:35a2186cf186 147 scan_result.max_rate= ap_info_p[ap_info_idx];
MACRUM 0:35a2186cf186 148 ap_info_idx++;
MACRUM 0:35a2186cf186 149 ap_info_idx++; // reserved
MACRUM 0:35a2186cf186 150 strcpy( scan_result.ssid, (char *)&ap_info_p[ap_info_idx] );
MACRUM 0:35a2186cf186 151 ap_info_idx += strlen( (char *)&ap_info_p[ap_info_idx] );
MACRUM 0:35a2186cf186 152 ap_info_idx++;
MACRUM 0:35a2186cf186 153
MACRUM 0:35a2186cf186 154 // Scanresult callback
MACRUM 0:35a2186cf186 155 mScanResultHandler_p( &scan_result );
MACRUM 0:35a2186cf186 156 }
MACRUM 0:35a2186cf186 157 }
MACRUM 0:35a2186cf186 158
MACRUM 0:35a2186cf186 159 void C_SNIC_UartCommandManager::bufferredPacket( unsigned char *payload_p, int payload_len )
MACRUM 0:35a2186cf186 160 {
MACRUM 0:35a2186cf186 161 int socket_id;
MACRUM 0:35a2186cf186 162 unsigned short recv_len;
MACRUM 0:35a2186cf186 163
MACRUM 0:35a2186cf186 164 if( (payload_p == NULL) || (payload_len == 0) )
MACRUM 0:35a2186cf186 165 {
MACRUM 0:35a2186cf186 166 return;
MACRUM 0:35a2186cf186 167 }
MACRUM 0:35a2186cf186 168 recv_len= ((payload_p[3]<<8) & 0xFF00) | payload_p[4];
MACRUM 0:35a2186cf186 169
MACRUM 0:35a2186cf186 170 C_SNIC_Core *instance_p = C_SNIC_Core::getInstance();
MACRUM 0:35a2186cf186 171
MACRUM 0:35a2186cf186 172 // Get socket id from payload
MACRUM 0:35a2186cf186 173 socket_id = payload_p[2];
MACRUM 0:35a2186cf186 174
MACRUM 0:35a2186cf186 175 // DEBUG_PRINT("bufferredPacket socket id:%d\r\n", socket_id);
MACRUM 0:35a2186cf186 176 // Get Connection information
MACRUM 0:35a2186cf186 177 C_SNIC_Core::tagCONNECT_INFO_T *con_info_p = instance_p->getConnectInfo( socket_id );
MACRUM 0:35a2186cf186 178 if( con_info_p == NULL )
MACRUM 0:35a2186cf186 179 {
MACRUM 0:35a2186cf186 180 return;
MACRUM 0:35a2186cf186 181 }
MACRUM 0:35a2186cf186 182
MACRUM 0:35a2186cf186 183 if( con_info_p->is_connected == false )
MACRUM 0:35a2186cf186 184 {
MACRUM 0:35a2186cf186 185 DEBUG_PRINT(" Socket id \"%d\" is not connected\r\n", socket_id);
MACRUM 0:35a2186cf186 186 return;
MACRUM 0:35a2186cf186 187 }
MACRUM 0:35a2186cf186 188
MACRUM 0:35a2186cf186 189 // Get receive length from payload
MACRUM 0:35a2186cf186 190 recv_len= ((payload_p[3]<<8) & 0xFF00) | payload_p[4];
MACRUM 0:35a2186cf186 191
MACRUM 0:35a2186cf186 192 con_info_p->mutex.lock();
MACRUM 0:35a2186cf186 193
MACRUM 0:35a2186cf186 194 //DEBUG_PRINT("bufferredPacket recv_len:%d\r\n", recv_len);
MACRUM 0:35a2186cf186 195 int i;
MACRUM 0:35a2186cf186 196 for(i = 0; i < recv_len; i++ )
MACRUM 0:35a2186cf186 197 {
MACRUM 0:35a2186cf186 198 if( con_info_p->recvbuf_p->isFull() )
MACRUM 0:35a2186cf186 199 {
MACRUM 0:35a2186cf186 200 DEBUG_PRINT("Receive buffer is full.\r\n");
MACRUM 0:35a2186cf186 201 break;
MACRUM 0:35a2186cf186 202 }
MACRUM 0:35a2186cf186 203 // Add to receive buffer
MACRUM 0:35a2186cf186 204 con_info_p->recvbuf_p->queue( payload_p[5+i] );
MACRUM 0:35a2186cf186 205 }
MACRUM 0:35a2186cf186 206 //DEBUG_PRINT("###Receive queue[%d]\r\n", i);
MACRUM 0:35a2186cf186 207
MACRUM 0:35a2186cf186 208 con_info_p->mutex.unlock();
MACRUM 0:35a2186cf186 209
MACRUM 0:35a2186cf186 210 con_info_p->snic_socket->event();
MACRUM 0:35a2186cf186 211 }
MACRUM 0:35a2186cf186 212
MACRUM 0:35a2186cf186 213 void C_SNIC_UartCommandManager::connectedTCPClient( unsigned char *payload_p, int payload_len )
MACRUM 0:35a2186cf186 214 {
MACRUM 0:35a2186cf186 215 if( (payload_p == NULL) || (payload_len == 0) )
MACRUM 0:35a2186cf186 216 {
MACRUM 0:35a2186cf186 217 return;
MACRUM 0:35a2186cf186 218 }
MACRUM 0:35a2186cf186 219
MACRUM 0:35a2186cf186 220 C_SNIC_Core *instance_p = C_SNIC_Core::getInstance();
MACRUM 0:35a2186cf186 221 int socket_id;
MACRUM 0:35a2186cf186 222 int server_id;
MACRUM 0:35a2186cf186 223
MACRUM 0:35a2186cf186 224 // Get socket id of client from payload
MACRUM 0:35a2186cf186 225 server_id = payload_p[2];
MACRUM 0:35a2186cf186 226
MACRUM 0:35a2186cf186 227 // Get Connection information
MACRUM 0:35a2186cf186 228 C_SNIC_Core::tagCONNECT_INFO_T *srv_info_p = instance_p->getConnectInfo( server_id );
MACRUM 0:35a2186cf186 229 if( srv_info_p == NULL || srv_info_p->is_accept == false)
MACRUM 0:35a2186cf186 230 {
MACRUM 0:35a2186cf186 231 return;
MACRUM 0:35a2186cf186 232 }
MACRUM 0:35a2186cf186 233
MACRUM 0:35a2186cf186 234 DEBUG_PRINT("[connectedTCPServer] socket id:%d\r\n", server_id);
MACRUM 0:35a2186cf186 235
MACRUM 0:35a2186cf186 236 // Get socket id of client from payload
MACRUM 0:35a2186cf186 237 socket_id = payload_p[3];
MACRUM 0:35a2186cf186 238
MACRUM 0:35a2186cf186 239 DEBUG_PRINT("[connectedTCPClient] socket id:%d\r\n", socket_id);
MACRUM 0:35a2186cf186 240
MACRUM 0:35a2186cf186 241 // Get Connection information
MACRUM 0:35a2186cf186 242 C_SNIC_Core::tagCONNECT_INFO_T *con_info_p = instance_p->getConnectInfo( socket_id );
MACRUM 0:35a2186cf186 243 if( con_info_p == NULL )
MACRUM 0:35a2186cf186 244 {
MACRUM 0:35a2186cf186 245 return;
MACRUM 0:35a2186cf186 246 }
MACRUM 0:35a2186cf186 247
MACRUM 0:35a2186cf186 248 if( con_info_p->recvbuf_p == NULL )
MACRUM 0:35a2186cf186 249 {
MACRUM 0:35a2186cf186 250 // DEBUG_PRINT( "create recv buffer[socket:%d]\r\n", socket_id);
MACRUM 0:35a2186cf186 251 con_info_p->recvbuf_p = new CircBuffer<char>(SNIC_UART_RECVBUF_SIZE);
MACRUM 0:35a2186cf186 252 }
MACRUM 0:35a2186cf186 253 con_info_p->is_connected = true;
MACRUM 0:35a2186cf186 254 con_info_p->is_received = false;
MACRUM 0:35a2186cf186 255 con_info_p->is_accept = true;
MACRUM 0:35a2186cf186 256 con_info_p->parent_socket = server_id;
MACRUM 0:35a2186cf186 257 con_info_p->from_ip = ((payload_p[4] << 24) | (payload_p[5] << 16) | (payload_p[6] << 8) | payload_p[7]);
MACRUM 0:35a2186cf186 258 con_info_p->from_port = ((payload_p[8] << 8) | payload_p[9]);
MACRUM 0:35a2186cf186 259 }
MACRUM 0:35a2186cf186 260
MACRUM 0:35a2186cf186 261 void C_SNIC_UartCommandManager::bufferredUDPPacket( unsigned char *payload_p, int payload_len )
MACRUM 0:35a2186cf186 262 {
MACRUM 0:35a2186cf186 263 if( (payload_p == NULL) || (payload_len == 0) )
MACRUM 0:35a2186cf186 264 {
MACRUM 0:35a2186cf186 265 return;
MACRUM 0:35a2186cf186 266 }
MACRUM 0:35a2186cf186 267
MACRUM 0:35a2186cf186 268 C_SNIC_Core *instance_p = C_SNIC_Core::getInstance();
MACRUM 0:35a2186cf186 269
MACRUM 0:35a2186cf186 270 // Get Connection information
MACRUM 0:35a2186cf186 271 // C_SNIC_Core::tagUDP_RECVINFO_T *con_info_p = instance_p->getUdpRecvInfo( payload_p[2] );
MACRUM 0:35a2186cf186 272 C_SNIC_Core::tagCONNECT_INFO_T *con_info_p = instance_p->getConnectInfo( payload_p[2] );
MACRUM 0:35a2186cf186 273 if( con_info_p == NULL )
MACRUM 0:35a2186cf186 274 {
MACRUM 0:35a2186cf186 275 return;
MACRUM 0:35a2186cf186 276 }
MACRUM 0:35a2186cf186 277
MACRUM 0:35a2186cf186 278 if( con_info_p->recvbuf_p == NULL )
MACRUM 0:35a2186cf186 279 {
MACRUM 0:35a2186cf186 280 // DEBUG_PRINT( "create recv buffer[socket:%d]\r\n", payload_p[2]);
MACRUM 0:35a2186cf186 281 con_info_p->recvbuf_p = new CircBuffer<char>(SNIC_UART_RECVBUF_SIZE);
MACRUM 0:35a2186cf186 282 }
MACRUM 0:35a2186cf186 283 con_info_p->mutex.lock();
MACRUM 0:35a2186cf186 284 con_info_p->is_received = true;
MACRUM 0:35a2186cf186 285
MACRUM 0:35a2186cf186 286 // Set remote IP address and remote port
MACRUM 0:35a2186cf186 287 con_info_p->from_ip = ((payload_p[3] << 24) | (payload_p[4] << 16) | (payload_p[5] << 8) | payload_p[6]);
MACRUM 0:35a2186cf186 288 con_info_p->from_port = ((payload_p[7] << 8) | payload_p[8]);
MACRUM 0:35a2186cf186 289
MACRUM 0:35a2186cf186 290 unsigned short recv_len;
MACRUM 0:35a2186cf186 291 // Get receive length from payload
MACRUM 0:35a2186cf186 292 recv_len= ((payload_p[9]<<8) & 0xFF00) | payload_p[10];
MACRUM 0:35a2186cf186 293 for( int i = 0; i < recv_len; i++ )
MACRUM 0:35a2186cf186 294 {
MACRUM 0:35a2186cf186 295 if( con_info_p->recvbuf_p->isFull() )
MACRUM 0:35a2186cf186 296 {
MACRUM 0:35a2186cf186 297 DEBUG_PRINT("Receive buffer is full.\r\n");
MACRUM 0:35a2186cf186 298 break;
MACRUM 0:35a2186cf186 299 }
MACRUM 0:35a2186cf186 300
MACRUM 0:35a2186cf186 301 // Add to receive buffer
MACRUM 0:35a2186cf186 302 con_info_p->recvbuf_p->queue( payload_p[11+i] );
MACRUM 0:35a2186cf186 303 }
MACRUM 0:35a2186cf186 304
MACRUM 0:35a2186cf186 305 con_info_p->mutex.unlock();
MACRUM 0:35a2186cf186 306
MACRUM 0:35a2186cf186 307 con_info_p->snic_socket->event();
MACRUM 0:35a2186cf186 308 }
MACRUM 0:35a2186cf186 309