Extending the X_NUCLEO_IDW01M1 to allow configuration of the board as an access point

Dependents:   X_NUCLEO_IDW01M1_AP_Test

Fork of X_NUCLEO_IDW01M1 by ST

Committer:
mridup
Date:
Sat May 14 08:31:39 2016 +0000
Revision:
12:3799f8475c8a
Parent:
9:d2dfbf8e7f49
Child:
18:b265b3b696f1
comments added.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 0:dc55f40eb04f 1 /* mbed Microcontroller Library
mridup 12:3799f8475c8a 2 * Copyright (c) 20015 ARM Limited
mridup 0:dc55f40eb04f 3 *
mridup 0:dc55f40eb04f 4 * Licensed under the Apache License, Version 2.0 (the "License");
mridup 0:dc55f40eb04f 5 * you may not use this file except in compliance with the License.
mridup 0:dc55f40eb04f 6 * You may obtain a copy of the License at
mridup 0:dc55f40eb04f 7 *
mridup 0:dc55f40eb04f 8 * http://www.apache.org/licenses/LICENSE-2.0
mridup 0:dc55f40eb04f 9 *
mridup 0:dc55f40eb04f 10 * Unless required by applicable law or agreed to in writing, software
mridup 0:dc55f40eb04f 11 * distributed under the License is distributed on an "AS IS" BASIS,
mridup 0:dc55f40eb04f 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mridup 0:dc55f40eb04f 13 * See the License for the specific language governing permissions and
mridup 0:dc55f40eb04f 14 * limitations under the License.
mridup 0:dc55f40eb04f 15 */
mridup 0:dc55f40eb04f 16
mridup 0:dc55f40eb04f 17 /**
mridup 0:dc55f40eb04f 18 ******************************************************************************
mridup 0:dc55f40eb04f 19 * @file SpwfSADevice.cpp
mridup 0:dc55f40eb04f 20 * @author STMicroelectronics
mridup 0:dc55f40eb04f 21 * @brief Implementation of SpwfSADevice class for Wi-Fi mbed
mridup 0:dc55f40eb04f 22 ******************************************************************************
mridup 0:dc55f40eb04f 23 * @copy
mridup 0:dc55f40eb04f 24 *
mridup 0:dc55f40eb04f 25 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
mridup 0:dc55f40eb04f 26 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
mridup 0:dc55f40eb04f 27 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
mridup 0:dc55f40eb04f 28 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
mridup 0:dc55f40eb04f 29 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
mridup 0:dc55f40eb04f 30 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
mridup 0:dc55f40eb04f 31 *
mridup 0:dc55f40eb04f 32 * <h2><center>&copy; COPYRIGHT 2016 STMicroelectronics</center></h2>
mridup 0:dc55f40eb04f 33 ******************************************************************************
mridup 0:dc55f40eb04f 34 */
mridup 0:dc55f40eb04f 35
mridup 0:dc55f40eb04f 36
mridup 0:dc55f40eb04f 37 #include "SpwfSADevice.h"
mridup 0:dc55f40eb04f 38
mridup 0:dc55f40eb04f 39
mridup 0:dc55f40eb04f 40 #ifdef __cplusplus
mridup 0:dc55f40eb04f 41 extern "C" {
mridup 0:dc55f40eb04f 42 #endif
mridup 0:dc55f40eb04f 43
mridup 0:dc55f40eb04f 44 void Rx_irq_handler(void);
mridup 0:dc55f40eb04f 45 void Wifi_scheduler(void);
mridup 0:dc55f40eb04f 46 void Wifi_ticker(void);
mridup 0:dc55f40eb04f 47
mridup 0:dc55f40eb04f 48 #ifdef __cplusplus
mridup 0:dc55f40eb04f 49 }
mridup 0:dc55f40eb04f 50 #endif
mridup 0:dc55f40eb04f 51
mridup 0:dc55f40eb04f 52 extern void setSpwfSADevice(SpwfSADevice * dev);
mridup 0:dc55f40eb04f 53
mridup 12:3799f8475c8a 54 /**
mridup 12:3799f8475c8a 55 * @brief SpwfSADevice constructor
mridup 12:3799f8475c8a 56 * @param tx: Pin USART TX
mridup 12:3799f8475c8a 57 * rx: Pin USART RX
mridup 12:3799f8475c8a 58 * rst: reset pin for Spwf module
mridup 12:3799f8475c8a 59 * wkup: reset pin for Spwf module
mridup 12:3799f8475c8a 60 * rts: Pin USART RTS
mridup 12:3799f8475c8a 61 * @retval none
mridup 12:3799f8475c8a 62 */
mridup 0:dc55f40eb04f 63 SpwfSADevice::SpwfSADevice(PinName tx, PinName rx, PinName rst, PinName wkup, PinName rts):
mridup 0:dc55f40eb04f 64 uart_(tx,rx),
mridup 0:dc55f40eb04f 65 term_(SERIAL_TX, SERIAL_RX),
mridup 0:dc55f40eb04f 66 wakeup_(wkup, PIN_INPUT, PullNone, 0),
mridup 1:bd9db471d47d 67 rst_(rst, PIN_INPUT, PullNone, 1),
mridup 0:dc55f40eb04f 68 rts_(rts, PIN_INPUT, PullUp, 0)
mridup 0:dc55f40eb04f 69 {
mridup 0:dc55f40eb04f 70 setSpwfSADevice(this);
mridup 0:dc55f40eb04f 71 sync_wait_signal = false;
mridup 6:e7a3fca2df10 72 wait_for_incoming_client = false;
mridup 7:0fdd186a7d90 73 wait_for_socket_data = false;
mridup 0:dc55f40eb04f 74 }
mridup 0:dc55f40eb04f 75
mridup 12:3799f8475c8a 76 /**
mridup 12:3799f8475c8a 77 * @brief SpwfSADevice destructor
mridup 12:3799f8475c8a 78 * @param none
mridup 12:3799f8475c8a 79 * @retval none
mridup 12:3799f8475c8a 80 */
mridup 0:dc55f40eb04f 81 SpwfSADevice::~SpwfSADevice(void)
mridup 0:dc55f40eb04f 82 {
mridup 0:dc55f40eb04f 83 //de-constructor
mridup 0:dc55f40eb04f 84 }
mridup 0:dc55f40eb04f 85
mridup 12:3799f8475c8a 86 /**
mridup 12:3799f8475c8a 87 * @brief init function
mridup 12:3799f8475c8a 88 initializes timers, gpios, uart
mridup 12:3799f8475c8a 89 * @param none
mridup 12:3799f8475c8a 90 * @retval error value
mridup 12:3799f8475c8a 91 */
mridup 5:c83ffd44f40a 92 int SpwfSADevice::init(void)
mridup 0:dc55f40eb04f 93 {
mridup 0:dc55f40eb04f 94 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 95 Timer timer;
mridup 0:dc55f40eb04f 96
mridup 0:dc55f40eb04f 97 timer.start();
mridup 0:dc55f40eb04f 98 rst_.output();
mridup 0:dc55f40eb04f 99 wakeup_.output();
mridup 0:dc55f40eb04f 100 rts_.output();
mridup 0:dc55f40eb04f 101
mridup 0:dc55f40eb04f 102 term_.baud(9600);
mridup 0:dc55f40eb04f 103 term_.format(8, SerialBase::None, 1);
mridup 0:dc55f40eb04f 104
mridup 0:dc55f40eb04f 105 uart_.baud(115200);
mridup 0:dc55f40eb04f 106 uart_.format(8, SerialBase::None, 1);
mridup 0:dc55f40eb04f 107 uart_.set_flow_control(SerialBase::RTS, PA_12, NC);//RTSCTS
mridup 0:dc55f40eb04f 108 uart_.attach(Rx_irq_handler, SerialBase::RxIrq);
mridup 0:dc55f40eb04f 109
mridup 0:dc55f40eb04f 110 config.power=wifi_active;
mridup 0:dc55f40eb04f 111 config.power_level=high;
mridup 0:dc55f40eb04f 112 config.dhcp=on;//use DHCP IP address
mridup 0:dc55f40eb04f 113
mridup 0:dc55f40eb04f 114 /*Initialize the tickers*/
mridup 0:dc55f40eb04f 115 wifi_isr.attach_us(Wifi_ticker, 1000); //decreasing the time period to 1ms may be causing overrun issue with UART?\
mridup 0:dc55f40eb04f 116 //UART error not evident but characters are sometimes missing in pipeline(ring_buffer)\
mridup 0:dc55f40eb04f 117 //specifically in the +WIND:25:WiFi Association with 'STM' successful WIND (why specifically this?)
mridup 0:dc55f40eb04f 118
mridup 8:0f302a13e21b 119 wifi_callback.attach_us(Wifi_scheduler, 5000);//How low can we go?
mridup 0:dc55f40eb04f 120
mridup 0:dc55f40eb04f 121 sync_wait_signal = false;
mridup 0:dc55f40eb04f 122 status = wifi_init(&config);
mridup 0:dc55f40eb04f 123 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 124 {
mridup 0:dc55f40eb04f 125 return -1;
mridup 0:dc55f40eb04f 126 }
mridup 0:dc55f40eb04f 127
mridup 0:dc55f40eb04f 128 while(!sync_wait_signal)
mridup 0:dc55f40eb04f 129 {
mridup 0:dc55f40eb04f 130 if (timer.read_ms() > _timeout) {
mridup 0:dc55f40eb04f 131 return -1;
mridup 0:dc55f40eb04f 132 }
mridup 0:dc55f40eb04f 133 __NOP();
mridup 0:dc55f40eb04f 134 }
mridup 0:dc55f40eb04f 135
mridup 0:dc55f40eb04f 136 return 0;
mridup 0:dc55f40eb04f 137 }
mridup 0:dc55f40eb04f 138
mridup 12:3799f8475c8a 139 /**
mridup 12:3799f8475c8a 140 * @brief network connect
mridup 12:3799f8475c8a 141 wrapper function for FW
mridup 12:3799f8475c8a 142 * @param ssid: Access Point (AP) Name String
mridup 12:3799f8475c8a 143 * sec_key: Password String for AP
mridup 12:3799f8475c8a 144 * priv_mode: type of security supported (FW mode)
mridup 12:3799f8475c8a 145 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 146 */
mridup 5:c83ffd44f40a 147 int SpwfSADevice::connect(char * ssid, char * sec_key, WiFi_Priv_Mode priv_mode)
mridup 0:dc55f40eb04f 148 {
mridup 0:dc55f40eb04f 149 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 150 Timer timer;
mridup 0:dc55f40eb04f 151
mridup 0:dc55f40eb04f 152 timer.start();
mridup 0:dc55f40eb04f 153 sync_wait_signal = false;
mridup 0:dc55f40eb04f 154 status = wifi_connect(ssid, sec_key, priv_mode);
mridup 0:dc55f40eb04f 155 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 156 {
mridup 0:dc55f40eb04f 157 return -1;
mridup 0:dc55f40eb04f 158 }
mridup 0:dc55f40eb04f 159
mridup 0:dc55f40eb04f 160 while(!sync_wait_signal)
mridup 0:dc55f40eb04f 161 {
mridup 0:dc55f40eb04f 162 if (timer.read_ms() > _timeout) {
mridup 0:dc55f40eb04f 163 return -1;
mridup 0:dc55f40eb04f 164 }
mridup 0:dc55f40eb04f 165 __NOP();
mridup 0:dc55f40eb04f 166 }
mridup 0:dc55f40eb04f 167
mridup 0:dc55f40eb04f 168 return 0;
mridup 0:dc55f40eb04f 169 }
mridup 0:dc55f40eb04f 170
mridup 12:3799f8475c8a 171 /**
mridup 12:3799f8475c8a 172 * @brief network disconnect
mridup 12:3799f8475c8a 173 wrapper function for FW
mridup 12:3799f8475c8a 174 * @param none
mridup 12:3799f8475c8a 175 * @retval error value
mridup 12:3799f8475c8a 176 */
mridup 5:c83ffd44f40a 177 int SpwfSADevice::disconnect()
mridup 0:dc55f40eb04f 178 {
mridup 0:dc55f40eb04f 179 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 180
mridup 0:dc55f40eb04f 181 status = wifi_disconnect();//will set to Idle Mode
mridup 0:dc55f40eb04f 182 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 183 {
mridup 0:dc55f40eb04f 184 return -1;
mridup 0:dc55f40eb04f 185 }
mridup 0:dc55f40eb04f 186
mridup 0:dc55f40eb04f 187 return 0;
mridup 0:dc55f40eb04f 188 }
mridup 0:dc55f40eb04f 189
mridup 12:3799f8475c8a 190 /**
mridup 12:3799f8475c8a 191 * @brief Get the local IP address
mridup 12:3799f8475c8a 192 * wrapper function for FW
mridup 12:3799f8475c8a 193 * @param none
mridup 12:3799f8475c8a 194 * @retval Null-terminated representation of the local IP address
mridup 12:3799f8475c8a 195 * or null if not yet connected
mridup 12:3799f8475c8a 196 */
mridup 0:dc55f40eb04f 197 const char *SpwfSADevice::getIPAddress()
mridup 0:dc55f40eb04f 198 {
mridup 0:dc55f40eb04f 199 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 200
mridup 0:dc55f40eb04f 201 status = WiFi_Get_IP_Address((uint8_t *)_ip_buffer);
mridup 0:dc55f40eb04f 202
mridup 0:dc55f40eb04f 203 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 204 {
mridup 0:dc55f40eb04f 205 return NULL;
mridup 0:dc55f40eb04f 206 } else
mridup 0:dc55f40eb04f 207 return _ip_buffer;
mridup 0:dc55f40eb04f 208 }
mridup 0:dc55f40eb04f 209
mridup 12:3799f8475c8a 210 /**
mridup 12:3799f8475c8a 211 * @brief Get the MAC address
mridup 12:3799f8475c8a 212 * wrapper function for FW
mridup 12:3799f8475c8a 213 * @param none
mridup 12:3799f8475c8a 214 * @retval Null-terminated representation of the MAC address
mridup 12:3799f8475c8a 215 * or null if not yet connected
mridup 12:3799f8475c8a 216 */
mridup 0:dc55f40eb04f 217 const char *SpwfSADevice::getMACAddress()
mridup 0:dc55f40eb04f 218 {
mridup 0:dc55f40eb04f 219 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 220
mridup 0:dc55f40eb04f 221 status = WiFi_Get_MAC_Address((uint8_t *)_mac_buffer);
mridup 0:dc55f40eb04f 222
mridup 0:dc55f40eb04f 223 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 224 {
mridup 0:dc55f40eb04f 225 return NULL;
mridup 0:dc55f40eb04f 226 } else
mridup 0:dc55f40eb04f 227 return _mac_buffer;
mridup 0:dc55f40eb04f 228 }
mridup 0:dc55f40eb04f 229
mridup 12:3799f8475c8a 230 /**
mridup 12:3799f8475c8a 231 * @brief connect to a remote socket
mridup 12:3799f8475c8a 232 * @param hostname: address of socket
mridup 12:3799f8475c8a 233 port_number: port number to connect
mridup 12:3799f8475c8a 234 protocol: TCP/UDP protocol
mridup 12:3799f8475c8a 235 * sock_id: pointer to socket ID returned by FW
mridup 12:3799f8475c8a 236 * @retval error value
mridup 12:3799f8475c8a 237 */
mridup 5:c83ffd44f40a 238 int SpwfSADevice::socket_client_open(uint8_t * hostname, uint32_t port_number, uint8_t * protocol, uint8_t * sock_id)
mridup 0:dc55f40eb04f 239 {
mridup 0:dc55f40eb04f 240 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 241
mridup 0:dc55f40eb04f 242 //Timeout of synchronous functions?
mridup 0:dc55f40eb04f 243 status = wifi_socket_client_open(hostname, port_number, protocol, sock_id);
mridup 0:dc55f40eb04f 244 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 245 {
mridup 7:0fdd186a7d90 246 *sock_id = 99;//make sure socket id is not set(set to out of bounds of SPWFSA_SOCKET_COUNT range)
mridup 0:dc55f40eb04f 247 return -1;
mridup 0:dc55f40eb04f 248 }
mridup 0:dc55f40eb04f 249
mridup 0:dc55f40eb04f 250 return 0;
mridup 0:dc55f40eb04f 251 }
mridup 0:dc55f40eb04f 252
mridup 12:3799f8475c8a 253 /**
mridup 12:3799f8475c8a 254 * @brief write to a remote socket
mridup 12:3799f8475c8a 255 * @param sock_id: FW ID of the socket
mridup 12:3799f8475c8a 256 DataLength: size of the data
mridup 12:3799f8475c8a 257 pData: pointer to data
mridup 12:3799f8475c8a 258 * @retval error value
mridup 12:3799f8475c8a 259 */
mridup 5:c83ffd44f40a 260 int SpwfSADevice::socket_client_write(uint8_t sock_id, uint16_t DataLength,char * pData)
mridup 0:dc55f40eb04f 261 {
mridup 8:0f302a13e21b 262 int status=0;//number of bytes
mridup 0:dc55f40eb04f 263
mridup 0:dc55f40eb04f 264 status = wifi_socket_client_write(sock_id, DataLength, pData);
mridup 0:dc55f40eb04f 265 //map error to enum ns_error_t
mridup 0:dc55f40eb04f 266
mridup 8:0f302a13e21b 267 if(status > 0)
mridup 0:dc55f40eb04f 268 {
mridup 8:0f302a13e21b 269 return status;
mridup 0:dc55f40eb04f 270 }
mridup 0:dc55f40eb04f 271 return 0;
mridup 0:dc55f40eb04f 272 }
mridup 0:dc55f40eb04f 273
mridup 12:3799f8475c8a 274 /**
mridup 12:3799f8475c8a 275 * @brief receive from a remote socket
mridup 12:3799f8475c8a 276 * @param sock_id: FW ID of the socket
mridup 12:3799f8475c8a 277 DataLength: size of the data
mridup 12:3799f8475c8a 278 pData: pointer to data
mridup 12:3799f8475c8a 279 * @retval error value
mridup 12:3799f8475c8a 280 */
mridup 5:c83ffd44f40a 281 int SpwfSADevice::socket_client_recv(uint8_t sock_id, uint16_t RecvLength,char * pData)
mridup 0:dc55f40eb04f 282 {
mridup 7:0fdd186a7d90 283 static Timer recv_timer;
mridup 7:0fdd186a7d90 284 //char debug_str[10];
mridup 7:0fdd186a7d90 285 static bool recv_call = true;
mridup 7:0fdd186a7d90 286
mridup 7:0fdd186a7d90 287 if(recv_call)
mridup 0:dc55f40eb04f 288 {
mridup 8:0f302a13e21b 289 //debug_print("\r\nrecv_call\r\n");
mridup 8:0f302a13e21b 290 //__disable_irq();
mridup 7:0fdd186a7d90 291 wait_for_socket_data = false;
mridup 8:0f302a13e21b 292 recv_buff = (uint8_t*)pData;
mridup 8:0f302a13e21b 293 //__enable_irq();
mridup 7:0fdd186a7d90 294 if(_timeout>0)
mridup 7:0fdd186a7d90 295 recv_timer.start();
mridup 7:0fdd186a7d90 296 recv_call = false;
mridup 7:0fdd186a7d90 297 bytes_to_read = RecvLength;
mridup 7:0fdd186a7d90 298 bytes_read=0;
mridup 7:0fdd186a7d90 299 }
mridup 7:0fdd186a7d90 300
mridup 7:0fdd186a7d90 301
mridup 7:0fdd186a7d90 302 if(wait_for_socket_data || recv_timer.read_ms() >= _timeout)
mridup 7:0fdd186a7d90 303 {
mridup 7:0fdd186a7d90 304 recv_call = true;
mridup 7:0fdd186a7d90 305 _timeout = 0;
mridup 7:0fdd186a7d90 306 wait_for_socket_data = true;
mridup 7:0fdd186a7d90 307 recv_timer.stop();
mridup 7:0fdd186a7d90 308 recv_timer.reset();
mridup 9:d2dfbf8e7f49 309 wait_ms(1);
mridup 7:0fdd186a7d90 310 if(bytes_read == 0) //<bytes_to_read??
mridup 7:0fdd186a7d90 311 return -1;//return error if no bytes are read!
mridup 7:0fdd186a7d90 312 else
mridup 0:dc55f40eb04f 313 return bytes_read;//return amount of data arrived so far
mridup 0:dc55f40eb04f 314 }
mridup 9:d2dfbf8e7f49 315 wait_ms(1); //CHECK:TODO: Need to wait to allow other IRQ's to run in case of non-blocking call?
mridup 7:0fdd186a7d90 316 return -1;
mridup 7:0fdd186a7d90 317 }
mridup 0:dc55f40eb04f 318
mridup 12:3799f8475c8a 319 /**
mridup 12:3799f8475c8a 320 * @brief scan the network
mridup 12:3799f8475c8a 321 * @param scan_result: scan result data pointer
mridup 12:3799f8475c8a 322 max_scan_number: size of the scan result
mridup 12:3799f8475c8a 323 * @retval error value
mridup 12:3799f8475c8a 324 */
mridup 0:dc55f40eb04f 325 void SpwfSADevice::network_scan(wifi_scan *scan_result, uint16_t max_scan_number)
mridup 0:dc55f40eb04f 326 {
mridup 0:dc55f40eb04f 327 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 328
mridup 0:dc55f40eb04f 329 status = wifi_network_scan(scan_result, max_scan_number);
mridup 0:dc55f40eb04f 330 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 331 {
mridup 0:dc55f40eb04f 332 return;
mridup 0:dc55f40eb04f 333 }
mridup 0:dc55f40eb04f 334 }
mridup 0:dc55f40eb04f 335
mridup 12:3799f8475c8a 336 /**
mridup 12:3799f8475c8a 337 * @brief HTTP GET from remote host
mridup 12:3799f8475c8a 338 * @param hostname: address of remote host
mridup 12:3799f8475c8a 339 path: path to resource
mridup 12:3799f8475c8a 340 port_number: port number
mridup 12:3799f8475c8a 341 * @retval none
mridup 12:3799f8475c8a 342 */
mridup 0:dc55f40eb04f 343 void SpwfSADevice::http_get(uint8_t * hostname, uint8_t * path, uint32_t port_number)
mridup 0:dc55f40eb04f 344 {
mridup 0:dc55f40eb04f 345 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 346
mridup 0:dc55f40eb04f 347 status = wifi_http_get((uint8_t *)hostname, (uint8_t *)path, port_number);
mridup 0:dc55f40eb04f 348 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 349 {
mridup 0:dc55f40eb04f 350 return;
mridup 0:dc55f40eb04f 351 }
mridup 0:dc55f40eb04f 352 }
mridup 0:dc55f40eb04f 353
mridup 12:3799f8475c8a 354 /**
mridup 12:3799f8475c8a 355 * @brief HTTP GET from remote host
mridup 12:3799f8475c8a 356 * @param url_path: complete url of remote resource
mridup 12:3799f8475c8a 357 * @retval none
mridup 12:3799f8475c8a 358 */
mridup 0:dc55f40eb04f 359 void SpwfSADevice::http_post(uint8_t * url_path)
mridup 0:dc55f40eb04f 360 {
mridup 0:dc55f40eb04f 361 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 362
mridup 0:dc55f40eb04f 363 status = wifi_http_post(url_path);
mridup 0:dc55f40eb04f 364 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 365 {
mridup 0:dc55f40eb04f 366 return;
mridup 0:dc55f40eb04f 367 }
mridup 0:dc55f40eb04f 368 }
mridup 0:dc55f40eb04f 369
mridup 12:3799f8475c8a 370 /**
mridup 12:3799f8475c8a 371 * @brief FW callback with data in socket
mridup 12:3799f8475c8a 372 * @param sock_id: FW ID of the socket
mridup 12:3799f8475c8a 373 data_ptr: pointer to data from FW
mridup 12:3799f8475c8a 374 message_size: total data to arrive
mridup 12:3799f8475c8a 375 chunk_size: size of the data in this callback (<= message_size)
mridup 12:3799f8475c8a 376 * @retval none
mridup 12:3799f8475c8a 377 */
mridup 0:dc55f40eb04f 378 void SpwfSADevice::signal_data_receive(uint8_t socket_id, uint8_t * data_ptr, uint32_t message_size, uint32_t chunk_size)
mridup 0:dc55f40eb04f 379 {
mridup 8:0f302a13e21b 380 char debug_str[50];
mridup 0:dc55f40eb04f 381 //Data will be copied or returned to user only if there is a pending request
mridup 0:dc55f40eb04f 382 //Copy data to pData
mridup 8:0f302a13e21b 383 //sprintf((char*)debug_str,"sock_id: %d, size: %d, chunk: %d\r\n",socket_id, message_size, chunk_size);
mridup 8:0f302a13e21b 384 //debug_print(debug_str);
mridup 5:c83ffd44f40a 385
mridup 7:0fdd186a7d90 386 if(recv_buff && !wait_for_socket_data)
mridup 0:dc55f40eb04f 387 {
mridup 8:0f302a13e21b 388 if((bytes_read + chunk_size)<= bytes_to_read)
mridup 0:dc55f40eb04f 389 {
mridup 8:0f302a13e21b 390 memcpy(recv_buff + bytes_read, data_ptr, chunk_size);//only copy bytes_to_read asked by user//rest of the data is lost!!
mridup 8:0f302a13e21b 391 bytes_read += chunk_size;
mridup 0:dc55f40eb04f 392 }
mridup 0:dc55f40eb04f 393 else
mridup 0:dc55f40eb04f 394 {
mridup 8:0f302a13e21b 395 uint32_t x_size = (bytes_read + chunk_size) - bytes_to_read;
mridup 8:0f302a13e21b 396 memcpy(recv_buff + bytes_read, data_ptr, chunk_size-x_size);
mridup 8:0f302a13e21b 397 bytes_read += (chunk_size-x_size);
mridup 0:dc55f40eb04f 398 }
mridup 0:dc55f40eb04f 399
mridup 0:dc55f40eb04f 400 if(bytes_read >= bytes_to_read)
mridup 0:dc55f40eb04f 401 {
mridup 0:dc55f40eb04f 402 __disable_irq();
mridup 7:0fdd186a7d90 403 wait_for_socket_data = true;
mridup 0:dc55f40eb04f 404 __enable_irq();
mridup 0:dc55f40eb04f 405 }
mridup 0:dc55f40eb04f 406 }
mridup 0:dc55f40eb04f 407 else
mridup 0:dc55f40eb04f 408 {
mridup 0:dc55f40eb04f 409 debug_print("\r\n Socket:: Data Dropped: ");
mridup 8:0f302a13e21b 410 sprintf((char*)debug_str,"%d\r\n",chunk_size);
mridup 0:dc55f40eb04f 411 debug_print(debug_str);
mridup 0:dc55f40eb04f 412 __disable_irq();
mridup 7:0fdd186a7d90 413 wait_for_socket_data = true;
mridup 0:dc55f40eb04f 414 __enable_irq();
mridup 0:dc55f40eb04f 415 }
mridup 0:dc55f40eb04f 416 }
mridup 0:dc55f40eb04f 417
mridup 12:3799f8475c8a 418 /**
mridup 12:3799f8475c8a 419 * @brief synchronization function called from FW (used for connect,disconnect, ready, etc.)
mridup 12:3799f8475c8a 420 * @param code: Status code value returned
mridup 12:3799f8475c8a 421 * @retval none
mridup 12:3799f8475c8a 422 */
mridup 0:dc55f40eb04f 423 void SpwfSADevice::signal_synch_wait(WiFi_Status_t code)
mridup 0:dc55f40eb04f 424 {
mridup 0:dc55f40eb04f 425 if(code == WiFi_DISASSOCIATION)
mridup 0:dc55f40eb04f 426 {
mridup 0:dc55f40eb04f 427 //do nothing
mridup 0:dc55f40eb04f 428 }
mridup 0:dc55f40eb04f 429 else
mridup 0:dc55f40eb04f 430 {
mridup 0:dc55f40eb04f 431 __disable_irq();
mridup 0:dc55f40eb04f 432 sync_wait_signal = true;
mridup 0:dc55f40eb04f 433 __enable_irq();
mridup 0:dc55f40eb04f 434 }
mridup 0:dc55f40eb04f 435 }
mridup 0:dc55f40eb04f 436
mridup 12:3799f8475c8a 437 /**
mridup 12:3799f8475c8a 438 * @brief close a client socket
mridup 12:3799f8475c8a 439 * @param sock_close_id: FW ID of the socket to close
mridup 12:3799f8475c8a 440 * @retval error value
mridup 12:3799f8475c8a 441 */
mridup 5:c83ffd44f40a 442 int SpwfSADevice::socket_client_close(uint8_t sock_close_id)
mridup 0:dc55f40eb04f 443 {
mridup 0:dc55f40eb04f 444 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 445
mridup 0:dc55f40eb04f 446 status = wifi_socket_client_close(sock_close_id);
mridup 0:dc55f40eb04f 447 //map error to enum ns_error_t
mridup 0:dc55f40eb04f 448 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 449 {
mridup 0:dc55f40eb04f 450 return -1;
mridup 0:dc55f40eb04f 451 }
mridup 0:dc55f40eb04f 452
mridup 0:dc55f40eb04f 453 return 0;
mridup 0:dc55f40eb04f 454 }
mridup 0:dc55f40eb04f 455
mridup 12:3799f8475c8a 456 /**
mridup 12:3799f8475c8a 457 * @brief open a server socket
mridup 12:3799f8475c8a 458 * @param port_number: port number to listen on
mridup 12:3799f8475c8a 459 * protocol: TCP/UDP protocol
mridup 12:3799f8475c8a 460 * @retval error value
mridup 12:3799f8475c8a 461 */
mridup 6:e7a3fca2df10 462 int SpwfSADevice::socket_server_open(uint32_t port_number, uint8_t * protocol)
mridup 6:e7a3fca2df10 463 {
mridup 6:e7a3fca2df10 464 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 6:e7a3fca2df10 465
mridup 6:e7a3fca2df10 466 status = wifi_socket_server_open(port_number, protocol);
mridup 6:e7a3fca2df10 467 //map error to enum ns_error_t
mridup 6:e7a3fca2df10 468 if(status!=WiFi_MODULE_SUCCESS)
mridup 6:e7a3fca2df10 469 {
mridup 6:e7a3fca2df10 470 return -1;
mridup 6:e7a3fca2df10 471 }
mridup 6:e7a3fca2df10 472
mridup 6:e7a3fca2df10 473 return 0;
mridup 6:e7a3fca2df10 474 }
mridup 6:e7a3fca2df10 475
mridup 12:3799f8475c8a 476 /**
mridup 12:3799f8475c8a 477 * @brief write to a server socket
mridup 12:3799f8475c8a 478 * @param data_length: size of the data
mridup 12:3799f8475c8a 479 * pdata: pointer to data
mridup 12:3799f8475c8a 480 * @retval error value
mridup 12:3799f8475c8a 481 */
mridup 6:e7a3fca2df10 482 int SpwfSADevice::socket_server_write(uint16_t data_length,char * pdata)
mridup 6:e7a3fca2df10 483 {
mridup 8:0f302a13e21b 484 int status = 0;//number of bytes
mridup 6:e7a3fca2df10 485
mridup 6:e7a3fca2df10 486 status = wifi_socket_server_write(data_length, pdata);
mridup 6:e7a3fca2df10 487 //map error to enum ns_error_t
mridup 8:0f302a13e21b 488 if(status > 0)
mridup 6:e7a3fca2df10 489 {
mridup 8:0f302a13e21b 490 return status;
mridup 8:0f302a13e21b 491 }
mridup 6:e7a3fca2df10 492 return 0;
mridup 6:e7a3fca2df10 493 }
mridup 12:3799f8475c8a 494
mridup 12:3799f8475c8a 495 /**
mridup 12:3799f8475c8a 496 * @brief close a server socket
mridup 12:3799f8475c8a 497 * @param none (only one server socket supported)
mridup 12:3799f8475c8a 498 * @retval error value
mridup 12:3799f8475c8a 499 */
mridup 6:e7a3fca2df10 500 int SpwfSADevice::socket_server_close(void)
mridup 6:e7a3fca2df10 501 {
mridup 6:e7a3fca2df10 502 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 6:e7a3fca2df10 503
mridup 6:e7a3fca2df10 504 status = wifi_socket_server_close();
mridup 6:e7a3fca2df10 505 //map error to enum ns_error_t
mridup 6:e7a3fca2df10 506 if(status!=WiFi_MODULE_SUCCESS)
mridup 6:e7a3fca2df10 507 {
mridup 6:e7a3fca2df10 508 return -1;
mridup 6:e7a3fca2df10 509 }
mridup 6:e7a3fca2df10 510
mridup 6:e7a3fca2df10 511 return 0;
mridup 6:e7a3fca2df10 512 }
mridup 12:3799f8475c8a 513
mridup 12:3799f8475c8a 514 /**
mridup 12:3799f8475c8a 515 * @brief attach/remove IRQ handler to UART
mridup 12:3799f8475c8a 516 * @param attach: attach/remove boolean
mridup 12:3799f8475c8a 517 * @retval none
mridup 12:3799f8475c8a 518 */
mridup 0:dc55f40eb04f 519 void SpwfSADevice::spwf_attach_irq(wifi_bool attach)
mridup 0:dc55f40eb04f 520 {
mridup 0:dc55f40eb04f 521 if(attach)
mridup 0:dc55f40eb04f 522 {
mridup 0:dc55f40eb04f 523 uart_.attach(Rx_irq_handler, SerialBase::RxIrq);
mridup 0:dc55f40eb04f 524 }
mridup 0:dc55f40eb04f 525 else
mridup 0:dc55f40eb04f 526 {
mridup 0:dc55f40eb04f 527 uart_.attach(NULL, SerialBase::RxIrq);
mridup 0:dc55f40eb04f 528 }
mridup 0:dc55f40eb04f 529 }
mridup 0:dc55f40eb04f 530
mridup 12:3799f8475c8a 531 /**
mridup 12:3799f8475c8a 532 * @brief write byte(s) to the UART
mridup 12:3799f8475c8a 533 * @param cmd: pointer to data
mridup 12:3799f8475c8a 534 * size: size of data
mridup 12:3799f8475c8a 535 * @retval error value
mridup 12:3799f8475c8a 536 */
mridup 8:0f302a13e21b 537 int SpwfSADevice::spwf_send(const char * cmd, uint16_t size)
mridup 0:dc55f40eb04f 538 {
mridup 0:dc55f40eb04f 539 Timer timer;
mridup 8:0f302a13e21b 540 int i, bytes;
mridup 0:dc55f40eb04f 541 //timer.start();
mridup 0:dc55f40eb04f 542
mridup 0:dc55f40eb04f 543 //uart_.puts(cmd);//string may contain '\0' character in between hence not used
mridup 0:dc55f40eb04f 544
mridup 0:dc55f40eb04f 545 for(i=0;i<size;i++)
mridup 0:dc55f40eb04f 546 {
mridup 0:dc55f40eb04f 547 uart_.putc(cmd[i]);
mridup 0:dc55f40eb04f 548 //if (timer.read_ms() > _timeout) {
mridup 0:dc55f40eb04f 549 //return -1;
mridup 0:dc55f40eb04f 550 //}
mridup 0:dc55f40eb04f 551 }
mridup 8:0f302a13e21b 552
mridup 8:0f302a13e21b 553 bytes = (int) size - 2;//we send 2 bytes extra for module
mridup 8:0f302a13e21b 554 return bytes;
mridup 0:dc55f40eb04f 555 }
mridup 0:dc55f40eb04f 556
mridup 12:3799f8475c8a 557 /**
mridup 12:3799f8475c8a 558 * @brief read a byte from the UART
mridup 12:3799f8475c8a 559 * @param none
mridup 12:3799f8475c8a 560 * @retval byte character
mridup 12:3799f8475c8a 561 */
mridup 0:dc55f40eb04f 562 char SpwfSADevice::spwf_get(void)
mridup 0:dc55f40eb04f 563 {
mridup 0:dc55f40eb04f 564 return(uart_.getc());
mridup 0:dc55f40eb04f 565 }
mridup 0:dc55f40eb04f 566
mridup 12:3799f8475c8a 567 /**
mridup 12:3799f8475c8a 568 * @brief (re)set the SPWF wakeup GPIO pin
mridup 12:3799f8475c8a 569 * @param wake (re)set value
mridup 12:3799f8475c8a 570 * @retval none
mridup 12:3799f8475c8a 571 */
mridup 0:dc55f40eb04f 572 void SpwfSADevice::spwf_wakeup(int wake)
mridup 0:dc55f40eb04f 573 {
mridup 0:dc55f40eb04f 574 wakeup_.write(wake);
mridup 0:dc55f40eb04f 575 }
mridup 0:dc55f40eb04f 576
mridup 12:3799f8475c8a 577 /**
mridup 12:3799f8475c8a 578 * @brief (re)set the SPWF reset GPIO pin
mridup 12:3799f8475c8a 579 * @param reset (re)set value
mridup 12:3799f8475c8a 580 * @retval none
mridup 12:3799f8475c8a 581 */
mridup 0:dc55f40eb04f 582 void SpwfSADevice::spwf_reset(int reset)
mridup 0:dc55f40eb04f 583 {
mridup 0:dc55f40eb04f 584 rst_.write(reset);
mridup 0:dc55f40eb04f 585 }
mridup 0:dc55f40eb04f 586
mridup 12:3799f8475c8a 587 /**
mridup 12:3799f8475c8a 588 * @brief (re)set the SPWF RTS GPIO line
mridup 12:3799f8475c8a 589 * @param rts (re)set value
mridup 12:3799f8475c8a 590 * @retval none
mridup 12:3799f8475c8a 591 */
mridup 0:dc55f40eb04f 592 void SpwfSADevice::spwf_rts(int rts)
mridup 0:dc55f40eb04f 593 {
mridup 0:dc55f40eb04f 594 rts_.write(rts);
mridup 0:dc55f40eb04f 595 }
mridup 0:dc55f40eb04f 596
mridup 12:3799f8475c8a 597 /**
mridup 12:3799f8475c8a 598 * @brief read the SPWF RTS GPIO pin
mridup 12:3799f8475c8a 599 * @param none
mridup 12:3799f8475c8a 600 * @retval none
mridup 12:3799f8475c8a 601 */
mridup 0:dc55f40eb04f 602 int SpwfSADevice::spwf_read_rts()
mridup 0:dc55f40eb04f 603 {
mridup 0:dc55f40eb04f 604 return(rts_.read());
mridup 0:dc55f40eb04f 605 }
mridup 0:dc55f40eb04f 606
mridup 12:3799f8475c8a 607 /**
mridup 12:3799f8475c8a 608 * @brief send debug print to serial terminal
mridup 12:3799f8475c8a 609 * @param string: data for debug print
mridup 12:3799f8475c8a 610 * @retval none
mridup 12:3799f8475c8a 611 */
mridup 0:dc55f40eb04f 612 void SpwfSADevice::debug_print(const char * string)
mridup 0:dc55f40eb04f 613 {
mridup 0:dc55f40eb04f 614 term_.puts(string);
mridup 0:dc55f40eb04f 615 }
mridup 0:dc55f40eb04f 616
mridup 12:3799f8475c8a 617 /**
mridup 12:3799f8475c8a 618 * @brief (re)set the switch for incoming client (server socket)
mridup 12:3799f8475c8a 619 * @param set: boolean to (re)set
mridup 12:3799f8475c8a 620 * @retval none
mridup 12:3799f8475c8a 621 */
mridup 6:e7a3fca2df10 622 void SpwfSADevice::set_wait_for_incoming_client(bool set)
mridup 6:e7a3fca2df10 623 {
mridup 6:e7a3fca2df10 624 wait_for_incoming_client = set;
mridup 6:e7a3fca2df10 625 }
mridup 6:e7a3fca2df10 626
mridup 12:3799f8475c8a 627 /**
mridup 12:3799f8475c8a 628 * @brief get the switch for incoming client (server socket)
mridup 12:3799f8475c8a 629 * @param none
mridup 12:3799f8475c8a 630 * @retval boolean
mridup 12:3799f8475c8a 631 */
mridup 6:e7a3fca2df10 632 bool SpwfSADevice::get_wait_for_incoming_client()
mridup 6:e7a3fca2df10 633 {
mridup 6:e7a3fca2df10 634 return wait_for_incoming_client;
mridup 6:e7a3fca2df10 635 }
mridup 6:e7a3fca2df10 636