User | Revision | Line number | New contents of line |
komoritan |
0:7251441ac366
|
1
|
/* Copyright (C) 2014 Murata Manufacturing Co.,Ltd., MIT License
|
komoritan |
0:7251441ac366
|
2
|
* muRata, SWITCH SCIENCE Wi-FI module TypeYD SNIC-UART.
|
komoritan |
0:7251441ac366
|
3
|
*
|
komoritan |
0:7251441ac366
|
4
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
komoritan |
0:7251441ac366
|
5
|
* and associated documentation files (the "Software"), to deal in the Software without restriction,
|
komoritan |
0:7251441ac366
|
6
|
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
|
komoritan |
0:7251441ac366
|
7
|
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
|
komoritan |
0:7251441ac366
|
8
|
* furnished to do so, subject to the following conditions:
|
komoritan |
0:7251441ac366
|
9
|
*
|
komoritan |
0:7251441ac366
|
10
|
* The above copyright notice and this permission notice shall be included in all copies or
|
komoritan |
0:7251441ac366
|
11
|
* substantial portions of the Software.
|
komoritan |
0:7251441ac366
|
12
|
*
|
komoritan |
0:7251441ac366
|
13
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
komoritan |
0:7251441ac366
|
14
|
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
komoritan |
0:7251441ac366
|
15
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
komoritan |
0:7251441ac366
|
16
|
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
komoritan |
0:7251441ac366
|
17
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
komoritan |
0:7251441ac366
|
18
|
*/
|
komoritan |
0:7251441ac366
|
19
|
#include "SNIC_UartCommandManager.h"
|
komoritan |
0:7251441ac366
|
20
|
#include "SNIC_Core.h"
|
komoritan |
0:7251441ac366
|
21
|
|
komoritan |
0:7251441ac366
|
22
|
C_SNIC_UartCommandManager::~C_SNIC_UartCommandManager()
|
komoritan |
0:7251441ac366
|
23
|
{
|
komoritan |
0:7251441ac366
|
24
|
}
|
komoritan |
0:7251441ac366
|
25
|
|
komoritan |
0:7251441ac366
|
26
|
void C_SNIC_UartCommandManager::setCommandID( unsigned char cmd_id )
|
komoritan |
0:7251441ac366
|
27
|
{
|
komoritan |
0:7251441ac366
|
28
|
mCommandID = cmd_id;
|
komoritan |
0:7251441ac366
|
29
|
}
|
komoritan |
0:7251441ac366
|
30
|
|
komoritan |
0:7251441ac366
|
31
|
unsigned char C_SNIC_UartCommandManager::getCommandID()
|
komoritan |
0:7251441ac366
|
32
|
{
|
komoritan |
0:7251441ac366
|
33
|
return mCommandID;
|
komoritan |
0:7251441ac366
|
34
|
}
|
komoritan |
0:7251441ac366
|
35
|
|
komoritan |
0:7251441ac366
|
36
|
void C_SNIC_UartCommandManager::setCommandSID( unsigned char cmd_sid )
|
komoritan |
0:7251441ac366
|
37
|
{
|
komoritan |
0:7251441ac366
|
38
|
mCommandSID = cmd_sid;
|
komoritan |
0:7251441ac366
|
39
|
}
|
komoritan |
0:7251441ac366
|
40
|
|
komoritan |
0:7251441ac366
|
41
|
unsigned char C_SNIC_UartCommandManager::getCommandSID()
|
komoritan |
0:7251441ac366
|
42
|
{
|
komoritan |
0:7251441ac366
|
43
|
return mCommandSID;
|
komoritan |
0:7251441ac366
|
44
|
}
|
komoritan |
0:7251441ac366
|
45
|
|
komoritan |
0:7251441ac366
|
46
|
void C_SNIC_UartCommandManager::setCommandStatus( unsigned char status )
|
komoritan |
0:7251441ac366
|
47
|
{
|
komoritan |
0:7251441ac366
|
48
|
mCommandStatus = status;
|
komoritan |
0:7251441ac366
|
49
|
}
|
komoritan |
0:7251441ac366
|
50
|
|
komoritan |
0:7251441ac366
|
51
|
unsigned char C_SNIC_UartCommandManager::getCommandStatus()
|
komoritan |
0:7251441ac366
|
52
|
{
|
komoritan |
0:7251441ac366
|
53
|
return mCommandStatus;
|
komoritan |
0:7251441ac366
|
54
|
}
|
komoritan |
0:7251441ac366
|
55
|
|
komoritan |
0:7251441ac366
|
56
|
void C_SNIC_UartCommandManager::setResponseBuf( unsigned char *buf_p )
|
komoritan |
0:7251441ac366
|
57
|
{
|
komoritan |
0:7251441ac366
|
58
|
mResponseBuf_p = buf_p;
|
komoritan |
0:7251441ac366
|
59
|
}
|
komoritan |
0:7251441ac366
|
60
|
|
komoritan |
0:7251441ac366
|
61
|
unsigned char *C_SNIC_UartCommandManager::getResponseBuf()
|
komoritan |
0:7251441ac366
|
62
|
{
|
komoritan |
0:7251441ac366
|
63
|
return mResponseBuf_p;
|
komoritan |
0:7251441ac366
|
64
|
}
|
komoritan |
0:7251441ac366
|
65
|
|
komoritan |
0:7251441ac366
|
66
|
void C_SNIC_UartCommandManager::setScanResultHandler( void (*handler_p)(tagSCAN_RESULT_T *scan_result) )
|
komoritan |
0:7251441ac366
|
67
|
{
|
komoritan |
0:7251441ac366
|
68
|
mScanResultHandler_p = handler_p;
|
komoritan |
0:7251441ac366
|
69
|
}
|
komoritan |
0:7251441ac366
|
70
|
|
komoritan |
0:7251441ac366
|
71
|
|
komoritan |
0:7251441ac366
|
72
|
int C_SNIC_UartCommandManager::wait()
|
komoritan |
0:7251441ac366
|
73
|
{
|
komoritan |
0:7251441ac366
|
74
|
int ret = 0;
|
komoritan |
0:7251441ac366
|
75
|
|
komoritan |
0:7251441ac366
|
76
|
// Get thread ID
|
komoritan |
0:7251441ac366
|
77
|
mCommandThreadID = osThreadGetId();
|
komoritan |
0:7251441ac366
|
78
|
|
komoritan |
0:7251441ac366
|
79
|
// Signal flags that are reported as event are automatically cleared.
|
komoritan |
0:7251441ac366
|
80
|
osEvent event_ret = osSignalWait( UART_COMMAND_SIGNAL, UART_COMMAND_WAIT_TIMEOUT);
|
komoritan |
0:7251441ac366
|
81
|
if( event_ret.status != osEventSignal )
|
komoritan |
0:7251441ac366
|
82
|
{
|
komoritan |
0:7251441ac366
|
83
|
ret = -1;
|
komoritan |
0:7251441ac366
|
84
|
}
|
komoritan |
0:7251441ac366
|
85
|
|
komoritan |
0:7251441ac366
|
86
|
return ret;
|
komoritan |
0:7251441ac366
|
87
|
}
|
komoritan |
0:7251441ac366
|
88
|
|
komoritan |
0:7251441ac366
|
89
|
int C_SNIC_UartCommandManager::signal()
|
komoritan |
0:7251441ac366
|
90
|
{
|
komoritan |
0:7251441ac366
|
91
|
// set signal
|
komoritan |
0:7251441ac366
|
92
|
return osSignalSet(mCommandThreadID, UART_COMMAND_SIGNAL);
|
komoritan |
0:7251441ac366
|
93
|
}
|
komoritan |
0:7251441ac366
|
94
|
|
komoritan |
0:7251441ac366
|
95
|
bool C_SNIC_UartCommandManager::isWaitingCommand( unsigned int command_id, unsigned char *payload_p )
|
komoritan |
0:7251441ac366
|
96
|
{
|
komoritan |
0:7251441ac366
|
97
|
bool ret = false;
|
komoritan |
0:7251441ac366
|
98
|
|
komoritan |
0:7251441ac366
|
99
|
if( (command_id == getCommandID())
|
komoritan |
0:7251441ac366
|
100
|
&& (payload_p[0] == getCommandSID()) )
|
komoritan |
0:7251441ac366
|
101
|
{
|
komoritan |
0:7251441ac366
|
102
|
ret = true;
|
komoritan |
0:7251441ac366
|
103
|
}
|
komoritan |
0:7251441ac366
|
104
|
return ret;
|
komoritan |
0:7251441ac366
|
105
|
}
|
komoritan |
0:7251441ac366
|
106
|
|
komoritan |
0:7251441ac366
|
107
|
void C_SNIC_UartCommandManager::scanResultIndicate( unsigned char *payload_p, int payload_len )
|
komoritan |
0:7251441ac366
|
108
|
{
|
komoritan |
0:7251441ac366
|
109
|
if( (payload_p == NULL) || (mScanResultHandler_p == NULL) )
|
komoritan |
0:7251441ac366
|
110
|
{
|
komoritan |
0:7251441ac366
|
111
|
return;
|
komoritan |
0:7251441ac366
|
112
|
}
|
komoritan |
0:7251441ac366
|
113
|
|
komoritan |
0:7251441ac366
|
114
|
tagSCAN_RESULT_T scan_result;
|
komoritan |
0:7251441ac366
|
115
|
int ap_count = payload_p[2];
|
komoritan |
0:7251441ac366
|
116
|
|
komoritan |
0:7251441ac366
|
117
|
if( ap_count == 0 )
|
komoritan |
0:7251441ac366
|
118
|
{
|
komoritan |
0:7251441ac366
|
119
|
mScanResultHandler_p( NULL );
|
komoritan |
0:7251441ac366
|
120
|
}
|
komoritan |
0:7251441ac366
|
121
|
|
komoritan |
0:7251441ac366
|
122
|
unsigned char *ap_info_p = &payload_p[3];
|
komoritan |
0:7251441ac366
|
123
|
int ap_info_idx = 0;
|
komoritan |
0:7251441ac366
|
124
|
|
komoritan |
0:7251441ac366
|
125
|
for( int i = 0; i < ap_count; i++ )
|
komoritan |
0:7251441ac366
|
126
|
{
|
komoritan |
0:7251441ac366
|
127
|
scan_result.channel = ap_info_p[ap_info_idx];
|
komoritan |
0:7251441ac366
|
128
|
ap_info_idx++;
|
komoritan |
0:7251441ac366
|
129
|
scan_result.rssi = (signed)ap_info_p[ap_info_idx];
|
komoritan |
0:7251441ac366
|
130
|
ap_info_idx++;
|
komoritan |
0:7251441ac366
|
131
|
scan_result.security= ap_info_p[ap_info_idx];
|
komoritan |
0:7251441ac366
|
132
|
ap_info_idx++;
|
komoritan |
0:7251441ac366
|
133
|
memcpy( scan_result.bssid, &ap_info_p[ap_info_idx], BSSID_MAC_LENTH );
|
komoritan |
0:7251441ac366
|
134
|
ap_info_idx += BSSID_MAC_LENTH;
|
komoritan |
0:7251441ac366
|
135
|
scan_result.network_type= ap_info_p[ap_info_idx];
|
komoritan |
0:7251441ac366
|
136
|
ap_info_idx++;
|
komoritan |
0:7251441ac366
|
137
|
scan_result.max_rate= ap_info_p[ap_info_idx];
|
komoritan |
0:7251441ac366
|
138
|
ap_info_idx++;
|
komoritan |
0:7251441ac366
|
139
|
ap_info_idx++; // reserved
|
komoritan |
0:7251441ac366
|
140
|
strcpy( scan_result.ssid, (char *)&ap_info_p[ap_info_idx] );
|
komoritan |
0:7251441ac366
|
141
|
ap_info_idx += strlen( (char *)&ap_info_p[ap_info_idx] );
|
komoritan |
0:7251441ac366
|
142
|
ap_info_idx++;
|
komoritan |
0:7251441ac366
|
143
|
|
komoritan |
0:7251441ac366
|
144
|
// Scanresult callback
|
komoritan |
0:7251441ac366
|
145
|
mScanResultHandler_p( &scan_result );
|
komoritan |
0:7251441ac366
|
146
|
}
|
komoritan |
0:7251441ac366
|
147
|
}
|
komoritan |
0:7251441ac366
|
148
|
|
komoritan |
0:7251441ac366
|
149
|
void C_SNIC_UartCommandManager::bufferredPacket( unsigned char *payload_p, int payload_len )
|
komoritan |
0:7251441ac366
|
150
|
{
|
komoritan |
0:7251441ac366
|
151
|
if( (payload_p == NULL) || (payload_len == 0) )
|
komoritan |
0:7251441ac366
|
152
|
{
|
komoritan |
0:7251441ac366
|
153
|
return;
|
komoritan |
0:7251441ac366
|
154
|
}
|
komoritan |
0:7251441ac366
|
155
|
|
komoritan |
0:7251441ac366
|
156
|
C_SNIC_Core *instance_p = C_SNIC_Core::getInstance();
|
komoritan |
0:7251441ac366
|
157
|
|
komoritan |
0:7251441ac366
|
158
|
int socket_id;
|
komoritan |
0:7251441ac366
|
159
|
unsigned short recv_len;
|
komoritan |
0:7251441ac366
|
160
|
|
komoritan |
0:7251441ac366
|
161
|
// Get socket id from payload
|
komoritan |
0:7251441ac366
|
162
|
socket_id = payload_p[2];
|
komoritan |
0:7251441ac366
|
163
|
|
komoritan |
0:7251441ac366
|
164
|
// DEBUG_PRINT("bufferredPacket socket id:%d\r\n", socket_id);
|
komoritan |
0:7251441ac366
|
165
|
// Get Connection information
|
komoritan |
0:7251441ac366
|
166
|
C_SNIC_Core::tagCONNECT_INFO_T *con_info_p = instance_p->getConnectInfo( socket_id );
|
komoritan |
0:7251441ac366
|
167
|
if( con_info_p == NULL )
|
komoritan |
0:7251441ac366
|
168
|
{
|
komoritan |
0:7251441ac366
|
169
|
return;
|
komoritan |
0:7251441ac366
|
170
|
}
|
komoritan |
0:7251441ac366
|
171
|
|
komoritan |
0:7251441ac366
|
172
|
if( con_info_p->is_connected == false )
|
komoritan |
0:7251441ac366
|
173
|
{
|
komoritan |
0:7251441ac366
|
174
|
DEBUG_PRINT(" Socket id \"%d\" is not connected\r\n", socket_id);
|
komoritan |
0:7251441ac366
|
175
|
return;
|
komoritan |
0:7251441ac366
|
176
|
}
|
komoritan |
0:7251441ac366
|
177
|
|
komoritan |
0:7251441ac366
|
178
|
// Get receive length from payload
|
komoritan |
0:7251441ac366
|
179
|
recv_len= ((payload_p[3]<<8) & 0xFF00) | payload_p[4];
|
komoritan |
0:7251441ac366
|
180
|
|
komoritan |
0:7251441ac366
|
181
|
while( con_info_p->is_receive_complete == false )
|
komoritan |
0:7251441ac366
|
182
|
{
|
komoritan |
0:7251441ac366
|
183
|
Thread::yield();
|
komoritan |
0:7251441ac366
|
184
|
}
|
komoritan |
0:7251441ac366
|
185
|
|
komoritan |
0:7251441ac366
|
186
|
// DEBUG_PRINT("bufferredPacket recv_len:%d\r\n", recv_len);
|
komoritan |
0:7251441ac366
|
187
|
int i;
|
komoritan |
0:7251441ac366
|
188
|
for(i = 0; i < recv_len; i++ )
|
komoritan |
0:7251441ac366
|
189
|
{
|
komoritan |
0:7251441ac366
|
190
|
if( con_info_p->recvbuf_p->isFull() )
|
komoritan |
0:7251441ac366
|
191
|
{
|
komoritan |
0:7251441ac366
|
192
|
DEBUG_PRINT("Receive buffer is full.\r\n");
|
komoritan |
0:7251441ac366
|
193
|
break;
|
komoritan |
0:7251441ac366
|
194
|
}
|
komoritan |
0:7251441ac366
|
195
|
// Add to receive buffer
|
komoritan |
0:7251441ac366
|
196
|
con_info_p->recvbuf_p->queue( payload_p[5+i] );
|
komoritan |
0:7251441ac366
|
197
|
}
|
komoritan |
0:7251441ac366
|
198
|
//DEBUG_PRINT("###Receive queue[%d]\r\n", i);
|
komoritan |
0:7251441ac366
|
199
|
con_info_p->mutex.lock();
|
komoritan |
0:7251441ac366
|
200
|
con_info_p->is_receive_complete = false;
|
komoritan |
0:7251441ac366
|
201
|
con_info_p->is_received = true;
|
komoritan |
0:7251441ac366
|
202
|
con_info_p->mutex.unlock();
|
komoritan |
0:7251441ac366
|
203
|
// Thread::yield();
|
komoritan |
0:7251441ac366
|
204
|
}
|
komoritan |
0:7251441ac366
|
205
|
|
komoritan |
0:7251441ac366
|
206
|
void C_SNIC_UartCommandManager::connectedTCPClient( unsigned char *payload_p, int payload_len )
|
komoritan |
0:7251441ac366
|
207
|
{
|
komoritan |
0:7251441ac366
|
208
|
if( (payload_p == NULL) || (payload_len == 0) )
|
komoritan |
0:7251441ac366
|
209
|
{
|
komoritan |
0:7251441ac366
|
210
|
return;
|
komoritan |
0:7251441ac366
|
211
|
}
|
komoritan |
0:7251441ac366
|
212
|
|
komoritan |
0:7251441ac366
|
213
|
C_SNIC_Core *instance_p = C_SNIC_Core::getInstance();
|
komoritan |
0:7251441ac366
|
214
|
int socket_id;
|
komoritan |
0:7251441ac366
|
215
|
|
komoritan |
0:7251441ac366
|
216
|
// Get socket id of client from payload
|
komoritan |
0:7251441ac366
|
217
|
socket_id = payload_p[3];
|
komoritan |
0:7251441ac366
|
218
|
|
komoritan |
0:7251441ac366
|
219
|
DEBUG_PRINT("[connectedTCPClient] socket id:%d\r\n", socket_id);
|
komoritan |
0:7251441ac366
|
220
|
|
komoritan |
0:7251441ac366
|
221
|
// Get Connection information
|
komoritan |
0:7251441ac366
|
222
|
C_SNIC_Core::tagCONNECT_INFO_T *con_info_p = instance_p->getConnectInfo( socket_id );
|
komoritan |
0:7251441ac366
|
223
|
if( con_info_p == NULL )
|
komoritan |
0:7251441ac366
|
224
|
{
|
komoritan |
0:7251441ac366
|
225
|
return;
|
komoritan |
0:7251441ac366
|
226
|
}
|
komoritan |
0:7251441ac366
|
227
|
|
komoritan |
0:7251441ac366
|
228
|
if( con_info_p->recvbuf_p == NULL )
|
komoritan |
0:7251441ac366
|
229
|
{
|
komoritan |
0:7251441ac366
|
230
|
// DEBUG_PRINT( "create recv buffer[socket:%d]\r\n", socket_id);
|
komoritan |
0:7251441ac366
|
231
|
con_info_p->recvbuf_p = new CircBuffer<char>(SNIC_UART_RECVBUF_SIZE);
|
komoritan |
0:7251441ac366
|
232
|
}
|
komoritan |
0:7251441ac366
|
233
|
con_info_p->is_connected = true;
|
komoritan |
0:7251441ac366
|
234
|
con_info_p->is_received = false;
|
komoritan |
0:7251441ac366
|
235
|
con_info_p->is_accept = true;
|
komoritan |
0:7251441ac366
|
236
|
con_info_p->parent_socket = payload_p[2];
|
komoritan |
0:7251441ac366
|
237
|
}
|
komoritan |
0:7251441ac366
|
238
|
|
komoritan |
0:7251441ac366
|
239
|
void C_SNIC_UartCommandManager::bufferredUDPPacket( unsigned char *payload_p, int payload_len )
|
komoritan |
0:7251441ac366
|
240
|
{
|
komoritan |
0:7251441ac366
|
241
|
if( (payload_p == NULL) || (payload_len == 0) )
|
komoritan |
0:7251441ac366
|
242
|
{
|
komoritan |
0:7251441ac366
|
243
|
return;
|
komoritan |
0:7251441ac366
|
244
|
}
|
komoritan |
0:7251441ac366
|
245
|
|
komoritan |
0:7251441ac366
|
246
|
C_SNIC_Core *instance_p = C_SNIC_Core::getInstance();
|
komoritan |
0:7251441ac366
|
247
|
|
komoritan |
0:7251441ac366
|
248
|
// Get Connection information
|
komoritan |
0:7251441ac366
|
249
|
C_SNIC_Core::tagUDP_RECVINFO_T *con_info_p = instance_p->getUdpRecvInfo( payload_p[2] );
|
komoritan |
0:7251441ac366
|
250
|
if( con_info_p == NULL )
|
komoritan |
0:7251441ac366
|
251
|
{
|
komoritan |
0:7251441ac366
|
252
|
return;
|
komoritan |
0:7251441ac366
|
253
|
}
|
komoritan |
0:7251441ac366
|
254
|
|
komoritan |
0:7251441ac366
|
255
|
if( con_info_p->recvbuf_p == NULL )
|
komoritan |
0:7251441ac366
|
256
|
{
|
komoritan |
0:7251441ac366
|
257
|
// DEBUG_PRINT( "create recv buffer[socket:%d]\r\n", payload_p[2]);
|
komoritan |
0:7251441ac366
|
258
|
con_info_p->recvbuf_p = new CircBuffer<char>(SNIC_UART_RECVBUF_SIZE);
|
komoritan |
0:7251441ac366
|
259
|
}
|
komoritan |
0:7251441ac366
|
260
|
con_info_p->mutex.lock();
|
komoritan |
0:7251441ac366
|
261
|
con_info_p->is_received = true;
|
komoritan |
0:7251441ac366
|
262
|
con_info_p->mutex.unlock();
|
komoritan |
0:7251441ac366
|
263
|
|
komoritan |
0:7251441ac366
|
264
|
// Set remote IP address and remote port
|
komoritan |
0:7251441ac366
|
265
|
con_info_p->from_ip = ((payload_p[3] << 24) | (payload_p[4] << 16) | (payload_p[5] << 8) | payload_p[6]);
|
komoritan |
0:7251441ac366
|
266
|
con_info_p->from_port = ((payload_p[7] << 8) | payload_p[8]);
|
komoritan |
0:7251441ac366
|
267
|
|
komoritan |
0:7251441ac366
|
268
|
unsigned short recv_len;
|
komoritan |
0:7251441ac366
|
269
|
// Get receive length from payload
|
komoritan |
0:7251441ac366
|
270
|
recv_len= ((payload_p[9]<<8) & 0xFF00) | payload_p[10];
|
komoritan |
0:7251441ac366
|
271
|
for( int i = 0; i < recv_len; i++ )
|
komoritan |
0:7251441ac366
|
272
|
{
|
komoritan |
0:7251441ac366
|
273
|
if( con_info_p->recvbuf_p->isFull() )
|
komoritan |
0:7251441ac366
|
274
|
{
|
komoritan |
0:7251441ac366
|
275
|
DEBUG_PRINT("Receive buffer is full.\r\n");
|
komoritan |
0:7251441ac366
|
276
|
break;
|
komoritan |
0:7251441ac366
|
277
|
}
|
komoritan |
0:7251441ac366
|
278
|
|
komoritan |
0:7251441ac366
|
279
|
// Add to receive buffer
|
komoritan |
0:7251441ac366
|
280
|
con_info_p->recvbuf_p->queue( payload_p[11+i] );
|
komoritan |
0:7251441ac366
|
281
|
}
|
komoritan |
0:7251441ac366
|
282
|
}
|