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:
scsims
Date:
Thu Jul 07 13:54:06 2016 +0000
Revision:
22:a1276b7d3b2d
Parent:
19:9ab60b80872e
Added wifi_connected_to_ap extern to indicate when BSSS beacons have been lost/picked up. Also added some debugging to get a better idea as to what's going to and from the SPWF01SA.11 over the UART

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"
scsims 18:b265b3b696f1 38 #include "wifi_module.h"
mridup 0:dc55f40eb04f 39
mridup 0:dc55f40eb04f 40
mridup 0:dc55f40eb04f 41 #ifdef __cplusplus
mridup 0:dc55f40eb04f 42 extern "C" {
mridup 0:dc55f40eb04f 43 #endif
mridup 0:dc55f40eb04f 44
mridup 0:dc55f40eb04f 45 void Rx_irq_handler(void);
mridup 0:dc55f40eb04f 46 void Wifi_scheduler(void);
mridup 0:dc55f40eb04f 47 void Wifi_ticker(void);
mridup 0:dc55f40eb04f 48
mridup 0:dc55f40eb04f 49 #ifdef __cplusplus
mridup 0:dc55f40eb04f 50 }
mridup 0:dc55f40eb04f 51 #endif
mridup 0:dc55f40eb04f 52
mridup 0:dc55f40eb04f 53 extern void setSpwfSADevice(SpwfSADevice * dev);
mridup 0:dc55f40eb04f 54
scsims 18:b265b3b696f1 55 #define FORMAT_HEX_STRING "0x%08x"
scsims 18:b265b3b696f1 56 #define HEX_STRING_LENGTH 11
scsims 18:b265b3b696f1 57
mridup 12:3799f8475c8a 58 /**
mridup 12:3799f8475c8a 59 * @brief SpwfSADevice constructor
mridup 12:3799f8475c8a 60 * @param tx: Pin USART TX
mridup 12:3799f8475c8a 61 * rx: Pin USART RX
mridup 12:3799f8475c8a 62 * rst: reset pin for Spwf module
mridup 12:3799f8475c8a 63 * wkup: reset pin for Spwf module
mridup 12:3799f8475c8a 64 * rts: Pin USART RTS
mridup 12:3799f8475c8a 65 * @retval none
mridup 12:3799f8475c8a 66 */
mridup 0:dc55f40eb04f 67 SpwfSADevice::SpwfSADevice(PinName tx, PinName rx, PinName rst, PinName wkup, PinName rts):
mridup 0:dc55f40eb04f 68 uart_(tx,rx),
mridup 0:dc55f40eb04f 69 term_(SERIAL_TX, SERIAL_RX),
mridup 0:dc55f40eb04f 70 wakeup_(wkup, PIN_INPUT, PullNone, 0),
mridup 1:bd9db471d47d 71 rst_(rst, PIN_INPUT, PullNone, 1),
mridup 0:dc55f40eb04f 72 rts_(rts, PIN_INPUT, PullUp, 0)
mridup 0:dc55f40eb04f 73 {
mridup 0:dc55f40eb04f 74 setSpwfSADevice(this);
mridup 0:dc55f40eb04f 75 sync_wait_signal = false;
mridup 6:e7a3fca2df10 76 wait_for_incoming_client = false;
mridup 7:0fdd186a7d90 77 wait_for_socket_data = false;
mridup 0:dc55f40eb04f 78 }
mridup 0:dc55f40eb04f 79
mridup 12:3799f8475c8a 80 /**
mridup 12:3799f8475c8a 81 * @brief SpwfSADevice destructor
mridup 12:3799f8475c8a 82 * @param none
mridup 12:3799f8475c8a 83 * @retval none
mridup 12:3799f8475c8a 84 */
mridup 0:dc55f40eb04f 85 SpwfSADevice::~SpwfSADevice(void)
mridup 0:dc55f40eb04f 86 {
mridup 0:dc55f40eb04f 87 //de-constructor
mridup 0:dc55f40eb04f 88 }
mridup 0:dc55f40eb04f 89
mridup 12:3799f8475c8a 90 /**
mridup 12:3799f8475c8a 91 * @brief init function
mridup 12:3799f8475c8a 92 initializes timers, gpios, uart
mridup 12:3799f8475c8a 93 * @param none
mridup 12:3799f8475c8a 94 * @retval error value
mridup 12:3799f8475c8a 95 */
mridup 5:c83ffd44f40a 96 int SpwfSADevice::init(void)
mridup 0:dc55f40eb04f 97 {
mridup 0:dc55f40eb04f 98 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 99 Timer timer;
mridup 0:dc55f40eb04f 100
mridup 0:dc55f40eb04f 101 timer.start();
mridup 0:dc55f40eb04f 102 rst_.output();
mridup 0:dc55f40eb04f 103 wakeup_.output();
mridup 0:dc55f40eb04f 104 rts_.output();
mridup 0:dc55f40eb04f 105
mridup 0:dc55f40eb04f 106 term_.baud(9600);
mridup 0:dc55f40eb04f 107 term_.format(8, SerialBase::None, 1);
mridup 0:dc55f40eb04f 108
mridup 0:dc55f40eb04f 109 uart_.baud(115200);
mridup 0:dc55f40eb04f 110 uart_.format(8, SerialBase::None, 1);
mridup 0:dc55f40eb04f 111 uart_.set_flow_control(SerialBase::RTS, PA_12, NC);//RTSCTS
mridup 0:dc55f40eb04f 112 uart_.attach(Rx_irq_handler, SerialBase::RxIrq);
mridup 0:dc55f40eb04f 113
mridup 0:dc55f40eb04f 114 config.power=wifi_active;
scsims 18:b265b3b696f1 115 config.power_level=max;
mridup 0:dc55f40eb04f 116 config.dhcp=on;//use DHCP IP address
scsims 18:b265b3b696f1 117 config.ip_addr = "192.168.0.50";
scsims 18:b265b3b696f1 118 config.netmask_addr = "255.255.255.0";
scsims 18:b265b3b696f1 119 config.gateway_addr = "192.168.0.1";
scsims 18:b265b3b696f1 120 config.dns_addr = "192.168.0.1";
mridup 0:dc55f40eb04f 121
mridup 0:dc55f40eb04f 122 /*Initialize the tickers*/
mridup 0:dc55f40eb04f 123 wifi_isr.attach_us(Wifi_ticker, 1000); //decreasing the time period to 1ms may be causing overrun issue with UART?\
mridup 0:dc55f40eb04f 124 //UART error not evident but characters are sometimes missing in pipeline(ring_buffer)\
mridup 0:dc55f40eb04f 125 //specifically in the +WIND:25:WiFi Association with 'STM' successful WIND (why specifically this?)
mridup 0:dc55f40eb04f 126
mridup 8:0f302a13e21b 127 wifi_callback.attach_us(Wifi_scheduler, 5000);//How low can we go?
mridup 0:dc55f40eb04f 128
mridup 0:dc55f40eb04f 129 sync_wait_signal = false;
mridup 0:dc55f40eb04f 130 status = wifi_init(&config);
mridup 0:dc55f40eb04f 131 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 132 {
mridup 0:dc55f40eb04f 133 return -1;
mridup 0:dc55f40eb04f 134 }
mridup 0:dc55f40eb04f 135 while(!sync_wait_signal)
mridup 0:dc55f40eb04f 136 {
mridup 0:dc55f40eb04f 137 if (timer.read_ms() > _timeout) {
mridup 0:dc55f40eb04f 138 return -1;
mridup 0:dc55f40eb04f 139 }
mridup 0:dc55f40eb04f 140 __NOP();
mridup 0:dc55f40eb04f 141 }
mridup 0:dc55f40eb04f 142
mridup 0:dc55f40eb04f 143 return 0;
mridup 0:dc55f40eb04f 144 }
mridup 0:dc55f40eb04f 145
mridup 12:3799f8475c8a 146 /**
mridup 12:3799f8475c8a 147 * @brief network connect
mridup 12:3799f8475c8a 148 wrapper function for FW
mridup 12:3799f8475c8a 149 * @param ssid: Access Point (AP) Name String
mridup 12:3799f8475c8a 150 * sec_key: Password String for AP
mridup 12:3799f8475c8a 151 * priv_mode: type of security supported (FW mode)
mridup 12:3799f8475c8a 152 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 153 */
mridup 5:c83ffd44f40a 154 int SpwfSADevice::connect(char * ssid, char * sec_key, WiFi_Priv_Mode priv_mode)
mridup 0:dc55f40eb04f 155 {
mridup 0:dc55f40eb04f 156 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 157 Timer timer;
mridup 0:dc55f40eb04f 158
mridup 0:dc55f40eb04f 159 timer.start();
mridup 0:dc55f40eb04f 160 sync_wait_signal = false;
mridup 0:dc55f40eb04f 161 status = wifi_connect(ssid, sec_key, priv_mode);
mridup 0:dc55f40eb04f 162 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 163 {
mridup 0:dc55f40eb04f 164 return -1;
scsims 22:a1276b7d3b2d 165 }
mridup 0:dc55f40eb04f 166
mridup 0:dc55f40eb04f 167 while(!sync_wait_signal)
mridup 0:dc55f40eb04f 168 {
mridup 0:dc55f40eb04f 169 if (timer.read_ms() > _timeout) {
mridup 0:dc55f40eb04f 170 return -1;
mridup 0:dc55f40eb04f 171 }
mridup 0:dc55f40eb04f 172 __NOP();
mridup 0:dc55f40eb04f 173 }
mridup 0:dc55f40eb04f 174
mridup 0:dc55f40eb04f 175 return 0;
mridup 0:dc55f40eb04f 176 }
mridup 0:dc55f40eb04f 177
mridup 12:3799f8475c8a 178 /**
scsims 18:b265b3b696f1 179 * @brief start the mini access point
scsims 18:b265b3b696f1 180 * @param ssid: start with this SSID
scsims 18:b265b3b696f1 181 * @param sec_key: passphrase for STAtions to connect with
scsims 18:b265b3b696f1 182 * @param priv_mode: type of security to set up with
scsims 18:b265b3b696f1 183 * @param channel_num: WiFi channel to use
scsims 18:b265b3b696f1 184 * @param data_rates: bitmap of operational data rates to support
scsims 18:b265b3b696f1 185 * @retval NSAPI Error Type
scsims 18:b265b3b696f1 186 */
scsims 18:b265b3b696f1 187 int SpwfSADevice::start_access_point(char * ssid, char * sec_key, WiFi_Priv_Mode priv_mode, int channel_num, unsigned int data_rates)
scsims 18:b265b3b696f1 188 {
scsims 18:b265b3b696f1 189 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
scsims 18:b265b3b696f1 190 Timer timer;
scsims 18:b265b3b696f1 191
scsims 18:b265b3b696f1 192 timer.start();
scsims 18:b265b3b696f1 193
scsims 18:b265b3b696f1 194 // Reset the data rate values
scsims 18:b265b3b696f1 195 uint32_t modeNEnabled = 1;
scsims 18:b265b3b696f1 196 char oprMask[] = "0x003fffcf";
scsims 18:b265b3b696f1 197 if (0x3fffcf != data_rates)
scsims 18:b265b3b696f1 198 {
scsims 18:b265b3b696f1 199 // All data rates must be enabled to allow wireless N (high throughput/HT) mode
scsims 18:b265b3b696f1 200 modeNEnabled = 0;
scsims 18:b265b3b696f1 201 sprintf(oprMask, (const char*)FORMAT_HEX_STRING, data_rates);
scsims 18:b265b3b696f1 202
scsims 18:b265b3b696f1 203 // Different basic rate mask
scsims 18:b265b3b696f1 204 char basMask[HEX_STRING_LENGTH];
scsims 18:b265b3b696f1 205 sprintf(basMask, FORMAT_HEX_STRING, data_rates & 0xf);
scsims 18:b265b3b696f1 206 status = SET_Configuration_Addr(WIFI_BAS_RATE_MASK, basMask);
scsims 18:b265b3b696f1 207 if(status != WiFi_MODULE_SUCCESS) return -1;
scsims 18:b265b3b696f1 208 }
scsims 18:b265b3b696f1 209
scsims 18:b265b3b696f1 210 status = SET_Configuration_Value(WIFI_HT_MODE, modeNEnabled);
scsims 22:a1276b7d3b2d 211 if(status != WiFi_MODULE_SUCCESS && modeNEnabled) {
scsims 22:a1276b7d3b2d 212 return -1;
scsims 22:a1276b7d3b2d 213 }
scsims 18:b265b3b696f1 214 status = SET_Configuration_Addr(WIFI_OPR_RATE_MASK, oprMask);
scsims 18:b265b3b696f1 215 if(status != WiFi_MODULE_SUCCESS) return -1;
scsims 18:b265b3b696f1 216
scsims 18:b265b3b696f1 217 // Start the access point
scsims 18:b265b3b696f1 218 sync_wait_signal = false;
scsims 18:b265b3b696f1 219 status = wifi_ap_start((uint8_t*)ssid, (uint8_t)channel_num);
scsims 18:b265b3b696f1 220 if(status!=WiFi_MODULE_SUCCESS)
scsims 18:b265b3b696f1 221 {
scsims 18:b265b3b696f1 222 return -1;
scsims 18:b265b3b696f1 223 }
scsims 18:b265b3b696f1 224
scsims 18:b265b3b696f1 225 while(!sync_wait_signal)
scsims 18:b265b3b696f1 226 {
scsims 18:b265b3b696f1 227 if (timer.read_ms() > _timeout) {
scsims 18:b265b3b696f1 228 return -1;
scsims 18:b265b3b696f1 229 }
scsims 18:b265b3b696f1 230 __NOP();
scsims 18:b265b3b696f1 231 }
scsims 18:b265b3b696f1 232
scsims 18:b265b3b696f1 233 return 0;
scsims 18:b265b3b696f1 234 }
scsims 18:b265b3b696f1 235
scsims 18:b265b3b696f1 236 /**
mridup 12:3799f8475c8a 237 * @brief network disconnect
mridup 12:3799f8475c8a 238 wrapper function for FW
mridup 12:3799f8475c8a 239 * @param none
mridup 12:3799f8475c8a 240 * @retval error value
mridup 12:3799f8475c8a 241 */
mridup 5:c83ffd44f40a 242 int SpwfSADevice::disconnect()
mridup 0:dc55f40eb04f 243 {
mridup 0:dc55f40eb04f 244 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 245
mridup 0:dc55f40eb04f 246 status = wifi_disconnect();//will set to Idle Mode
mridup 0:dc55f40eb04f 247 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 248 {
mridup 0:dc55f40eb04f 249 return -1;
mridup 0:dc55f40eb04f 250 }
mridup 0:dc55f40eb04f 251
mridup 0:dc55f40eb04f 252 return 0;
mridup 0:dc55f40eb04f 253 }
mridup 0:dc55f40eb04f 254
mridup 12:3799f8475c8a 255 /**
mridup 12:3799f8475c8a 256 * @brief Get the local IP address
mridup 12:3799f8475c8a 257 * wrapper function for FW
mridup 12:3799f8475c8a 258 * @param none
mridup 12:3799f8475c8a 259 * @retval Null-terminated representation of the local IP address
mridup 12:3799f8475c8a 260 * or null if not yet connected
mridup 12:3799f8475c8a 261 */
mridup 0:dc55f40eb04f 262 const char *SpwfSADevice::getIPAddress()
mridup 0:dc55f40eb04f 263 {
mridup 0:dc55f40eb04f 264 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 265
mridup 0:dc55f40eb04f 266 status = WiFi_Get_IP_Address((uint8_t *)_ip_buffer);
mridup 0:dc55f40eb04f 267
mridup 0:dc55f40eb04f 268 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 269 {
mridup 0:dc55f40eb04f 270 return NULL;
mridup 0:dc55f40eb04f 271 } else
mridup 0:dc55f40eb04f 272 return _ip_buffer;
mridup 0:dc55f40eb04f 273 }
mridup 0:dc55f40eb04f 274
mridup 12:3799f8475c8a 275 /**
mridup 12:3799f8475c8a 276 * @brief Get the MAC address
mridup 12:3799f8475c8a 277 * wrapper function for FW
mridup 12:3799f8475c8a 278 * @param none
mridup 12:3799f8475c8a 279 * @retval Null-terminated representation of the MAC address
mridup 12:3799f8475c8a 280 * or null if not yet connected
mridup 12:3799f8475c8a 281 */
mridup 0:dc55f40eb04f 282 const char *SpwfSADevice::getMACAddress()
mridup 0:dc55f40eb04f 283 {
mridup 0:dc55f40eb04f 284 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 285
mridup 0:dc55f40eb04f 286 status = WiFi_Get_MAC_Address((uint8_t *)_mac_buffer);
mridup 0:dc55f40eb04f 287
mridup 0:dc55f40eb04f 288 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 289 {
mridup 0:dc55f40eb04f 290 return NULL;
mridup 0:dc55f40eb04f 291 } else
mridup 0:dc55f40eb04f 292 return _mac_buffer;
mridup 0:dc55f40eb04f 293 }
mridup 0:dc55f40eb04f 294
mridup 12:3799f8475c8a 295 /**
mridup 12:3799f8475c8a 296 * @brief connect to a remote socket
mridup 12:3799f8475c8a 297 * @param hostname: address of socket
mridup 12:3799f8475c8a 298 port_number: port number to connect
mridup 12:3799f8475c8a 299 protocol: TCP/UDP protocol
mridup 12:3799f8475c8a 300 * sock_id: pointer to socket ID returned by FW
mridup 12:3799f8475c8a 301 * @retval error value
mridup 12:3799f8475c8a 302 */
mridup 5:c83ffd44f40a 303 int SpwfSADevice::socket_client_open(uint8_t * hostname, uint32_t port_number, uint8_t * protocol, uint8_t * sock_id)
mridup 0:dc55f40eb04f 304 {
mridup 0:dc55f40eb04f 305 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 306
mridup 0:dc55f40eb04f 307 //Timeout of synchronous functions?
mridup 0:dc55f40eb04f 308 status = wifi_socket_client_open(hostname, port_number, protocol, sock_id);
mridup 0:dc55f40eb04f 309 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 310 {
mridup 7:0fdd186a7d90 311 *sock_id = 99;//make sure socket id is not set(set to out of bounds of SPWFSA_SOCKET_COUNT range)
mridup 0:dc55f40eb04f 312 return -1;
mridup 0:dc55f40eb04f 313 }
mridup 0:dc55f40eb04f 314
mridup 0:dc55f40eb04f 315 return 0;
mridup 0:dc55f40eb04f 316 }
mridup 0:dc55f40eb04f 317
mridup 12:3799f8475c8a 318 /**
mridup 12:3799f8475c8a 319 * @brief write to a remote socket
mridup 12:3799f8475c8a 320 * @param sock_id: FW ID of the socket
mridup 12:3799f8475c8a 321 DataLength: size of the data
mridup 12:3799f8475c8a 322 pData: pointer to data
mridup 12:3799f8475c8a 323 * @retval error value
mridup 12:3799f8475c8a 324 */
mridup 5:c83ffd44f40a 325 int SpwfSADevice::socket_client_write(uint8_t sock_id, uint16_t DataLength,char * pData)
mridup 0:dc55f40eb04f 326 {
mridup 8:0f302a13e21b 327 int status=0;//number of bytes
mridup 0:dc55f40eb04f 328
mridup 0:dc55f40eb04f 329 status = wifi_socket_client_write(sock_id, DataLength, pData);
mridup 0:dc55f40eb04f 330 //map error to enum ns_error_t
mridup 0:dc55f40eb04f 331
mridup 8:0f302a13e21b 332 if(status > 0)
mridup 0:dc55f40eb04f 333 {
mridup 8:0f302a13e21b 334 return status;
mridup 0:dc55f40eb04f 335 }
mridup 0:dc55f40eb04f 336 return 0;
mridup 0:dc55f40eb04f 337 }
mridup 0:dc55f40eb04f 338
mridup 12:3799f8475c8a 339 /**
mridup 12:3799f8475c8a 340 * @brief receive from a remote socket
mridup 12:3799f8475c8a 341 * @param sock_id: FW ID of the socket
mridup 12:3799f8475c8a 342 DataLength: size of the data
mridup 12:3799f8475c8a 343 pData: pointer to data
mridup 12:3799f8475c8a 344 * @retval error value
mridup 12:3799f8475c8a 345 */
mridup 5:c83ffd44f40a 346 int SpwfSADevice::socket_client_recv(uint8_t sock_id, uint16_t RecvLength,char * pData)
mridup 0:dc55f40eb04f 347 {
mridup 7:0fdd186a7d90 348 static Timer recv_timer;
mridup 7:0fdd186a7d90 349 //char debug_str[10];
mridup 7:0fdd186a7d90 350 static bool recv_call = true;
mridup 7:0fdd186a7d90 351
mridup 7:0fdd186a7d90 352 if(recv_call)
mridup 0:dc55f40eb04f 353 {
mridup 8:0f302a13e21b 354 //debug_print("\r\nrecv_call\r\n");
mridup 8:0f302a13e21b 355 //__disable_irq();
mridup 7:0fdd186a7d90 356 wait_for_socket_data = false;
mridup 8:0f302a13e21b 357 recv_buff = (uint8_t*)pData;
mridup 8:0f302a13e21b 358 //__enable_irq();
mridup 7:0fdd186a7d90 359 if(_timeout>0)
mridup 7:0fdd186a7d90 360 recv_timer.start();
mridup 7:0fdd186a7d90 361 recv_call = false;
mridup 7:0fdd186a7d90 362 bytes_to_read = RecvLength;
mridup 7:0fdd186a7d90 363 bytes_read=0;
mridup 7:0fdd186a7d90 364 }
mridup 7:0fdd186a7d90 365
mridup 7:0fdd186a7d90 366
mridup 7:0fdd186a7d90 367 if(wait_for_socket_data || recv_timer.read_ms() >= _timeout)
mridup 7:0fdd186a7d90 368 {
mridup 7:0fdd186a7d90 369 recv_call = true;
mridup 7:0fdd186a7d90 370 _timeout = 0;
mridup 7:0fdd186a7d90 371 wait_for_socket_data = true;
mridup 7:0fdd186a7d90 372 recv_timer.stop();
mridup 7:0fdd186a7d90 373 recv_timer.reset();
mridup 9:d2dfbf8e7f49 374 wait_ms(1);
mridup 7:0fdd186a7d90 375 if(bytes_read == 0) //<bytes_to_read??
mridup 7:0fdd186a7d90 376 return -1;//return error if no bytes are read!
mridup 7:0fdd186a7d90 377 else
mridup 0:dc55f40eb04f 378 return bytes_read;//return amount of data arrived so far
mridup 0:dc55f40eb04f 379 }
mridup 9:d2dfbf8e7f49 380 wait_ms(1); //CHECK:TODO: Need to wait to allow other IRQ's to run in case of non-blocking call?
mridup 7:0fdd186a7d90 381 return -1;
mridup 7:0fdd186a7d90 382 }
mridup 0:dc55f40eb04f 383
mridup 12:3799f8475c8a 384 /**
mridup 12:3799f8475c8a 385 * @brief scan the network
mridup 12:3799f8475c8a 386 * @param scan_result: scan result data pointer
mridup 12:3799f8475c8a 387 max_scan_number: size of the scan result
mridup 12:3799f8475c8a 388 * @retval error value
mridup 12:3799f8475c8a 389 */
mridup 0:dc55f40eb04f 390 void SpwfSADevice::network_scan(wifi_scan *scan_result, uint16_t max_scan_number)
mridup 0:dc55f40eb04f 391 {
mridup 0:dc55f40eb04f 392 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 393
mridup 0:dc55f40eb04f 394 status = wifi_network_scan(scan_result, max_scan_number);
mridup 0:dc55f40eb04f 395 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 396 {
mridup 0:dc55f40eb04f 397 return;
mridup 0:dc55f40eb04f 398 }
mridup 0:dc55f40eb04f 399 }
mridup 0:dc55f40eb04f 400
mridup 12:3799f8475c8a 401 /**
mridup 12:3799f8475c8a 402 * @brief HTTP GET from remote host
mridup 12:3799f8475c8a 403 * @param hostname: address of remote host
mridup 12:3799f8475c8a 404 path: path to resource
mridup 12:3799f8475c8a 405 port_number: port number
mridup 12:3799f8475c8a 406 * @retval none
mridup 12:3799f8475c8a 407 */
mridup 0:dc55f40eb04f 408 void SpwfSADevice::http_get(uint8_t * hostname, uint8_t * path, uint32_t port_number)
mridup 0:dc55f40eb04f 409 {
mridup 0:dc55f40eb04f 410 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 411
mridup 0:dc55f40eb04f 412 status = wifi_http_get((uint8_t *)hostname, (uint8_t *)path, port_number);
mridup 0:dc55f40eb04f 413 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 414 {
mridup 0:dc55f40eb04f 415 return;
mridup 0:dc55f40eb04f 416 }
mridup 0:dc55f40eb04f 417 }
mridup 0:dc55f40eb04f 418
mridup 12:3799f8475c8a 419 /**
mridup 12:3799f8475c8a 420 * @brief HTTP GET from remote host
mridup 12:3799f8475c8a 421 * @param url_path: complete url of remote resource
mridup 12:3799f8475c8a 422 * @retval none
mridup 12:3799f8475c8a 423 */
mridup 0:dc55f40eb04f 424 void SpwfSADevice::http_post(uint8_t * url_path)
mridup 0:dc55f40eb04f 425 {
mridup 0:dc55f40eb04f 426 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 427
mridup 0:dc55f40eb04f 428 status = wifi_http_post(url_path);
mridup 0:dc55f40eb04f 429 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 430 {
mridup 0:dc55f40eb04f 431 return;
mridup 0:dc55f40eb04f 432 }
mridup 0:dc55f40eb04f 433 }
mridup 0:dc55f40eb04f 434
mridup 12:3799f8475c8a 435 /**
mridup 12:3799f8475c8a 436 * @brief FW callback with data in socket
mridup 12:3799f8475c8a 437 * @param sock_id: FW ID of the socket
mridup 12:3799f8475c8a 438 data_ptr: pointer to data from FW
mridup 12:3799f8475c8a 439 message_size: total data to arrive
mridup 12:3799f8475c8a 440 chunk_size: size of the data in this callback (<= message_size)
mridup 12:3799f8475c8a 441 * @retval none
mridup 12:3799f8475c8a 442 */
mridup 0:dc55f40eb04f 443 void SpwfSADevice::signal_data_receive(uint8_t socket_id, uint8_t * data_ptr, uint32_t message_size, uint32_t chunk_size)
mridup 0:dc55f40eb04f 444 {
mridup 8:0f302a13e21b 445 char debug_str[50];
mridup 0:dc55f40eb04f 446 //Data will be copied or returned to user only if there is a pending request
mridup 0:dc55f40eb04f 447 //Copy data to pData
mridup 8:0f302a13e21b 448 //sprintf((char*)debug_str,"sock_id: %d, size: %d, chunk: %d\r\n",socket_id, message_size, chunk_size);
mridup 8:0f302a13e21b 449 //debug_print(debug_str);
mridup 5:c83ffd44f40a 450
mridup 7:0fdd186a7d90 451 if(recv_buff && !wait_for_socket_data)
mridup 0:dc55f40eb04f 452 {
mridup 8:0f302a13e21b 453 if((bytes_read + chunk_size)<= bytes_to_read)
mridup 0:dc55f40eb04f 454 {
mridup 8:0f302a13e21b 455 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 456 bytes_read += chunk_size;
mridup 0:dc55f40eb04f 457 }
mridup 0:dc55f40eb04f 458 else
mridup 0:dc55f40eb04f 459 {
mridup 8:0f302a13e21b 460 uint32_t x_size = (bytes_read + chunk_size) - bytes_to_read;
mridup 8:0f302a13e21b 461 memcpy(recv_buff + bytes_read, data_ptr, chunk_size-x_size);
mridup 8:0f302a13e21b 462 bytes_read += (chunk_size-x_size);
mridup 0:dc55f40eb04f 463 }
mridup 0:dc55f40eb04f 464
mridup 0:dc55f40eb04f 465 if(bytes_read >= bytes_to_read)
mridup 0:dc55f40eb04f 466 {
mridup 0:dc55f40eb04f 467 __disable_irq();
mridup 7:0fdd186a7d90 468 wait_for_socket_data = true;
mridup 0:dc55f40eb04f 469 __enable_irq();
mridup 0:dc55f40eb04f 470 }
mridup 0:dc55f40eb04f 471 }
mridup 0:dc55f40eb04f 472 else
mridup 0:dc55f40eb04f 473 {
mridup 0:dc55f40eb04f 474 debug_print("\r\n Socket:: Data Dropped: ");
mridup 8:0f302a13e21b 475 sprintf((char*)debug_str,"%d\r\n",chunk_size);
mridup 0:dc55f40eb04f 476 debug_print(debug_str);
mridup 0:dc55f40eb04f 477 __disable_irq();
mridup 7:0fdd186a7d90 478 wait_for_socket_data = true;
mridup 0:dc55f40eb04f 479 __enable_irq();
mridup 0:dc55f40eb04f 480 }
mridup 0:dc55f40eb04f 481 }
mridup 0:dc55f40eb04f 482
mridup 12:3799f8475c8a 483 /**
mridup 12:3799f8475c8a 484 * @brief synchronization function called from FW (used for connect,disconnect, ready, etc.)
mridup 12:3799f8475c8a 485 * @param code: Status code value returned
mridup 12:3799f8475c8a 486 * @retval none
mridup 12:3799f8475c8a 487 */
mridup 0:dc55f40eb04f 488 void SpwfSADevice::signal_synch_wait(WiFi_Status_t code)
mridup 0:dc55f40eb04f 489 {
mridup 0:dc55f40eb04f 490 if(code == WiFi_DISASSOCIATION)
mridup 0:dc55f40eb04f 491 {
mridup 0:dc55f40eb04f 492 //do nothing
mridup 0:dc55f40eb04f 493 }
mridup 0:dc55f40eb04f 494 else
mridup 0:dc55f40eb04f 495 {
mridup 0:dc55f40eb04f 496 __disable_irq();
mridup 0:dc55f40eb04f 497 sync_wait_signal = true;
mridup 0:dc55f40eb04f 498 __enable_irq();
mridup 0:dc55f40eb04f 499 }
mridup 0:dc55f40eb04f 500 }
mridup 0:dc55f40eb04f 501
mridup 12:3799f8475c8a 502 /**
mridup 12:3799f8475c8a 503 * @brief close a client socket
mridup 12:3799f8475c8a 504 * @param sock_close_id: FW ID of the socket to close
mridup 12:3799f8475c8a 505 * @retval error value
mridup 12:3799f8475c8a 506 */
mridup 5:c83ffd44f40a 507 int SpwfSADevice::socket_client_close(uint8_t sock_close_id)
mridup 0:dc55f40eb04f 508 {
mridup 0:dc55f40eb04f 509 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 510
mridup 0:dc55f40eb04f 511 status = wifi_socket_client_close(sock_close_id);
mridup 0:dc55f40eb04f 512 //map error to enum ns_error_t
mridup 0:dc55f40eb04f 513 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 514 {
mridup 0:dc55f40eb04f 515 return -1;
mridup 0:dc55f40eb04f 516 }
mridup 0:dc55f40eb04f 517
mridup 0:dc55f40eb04f 518 return 0;
mridup 0:dc55f40eb04f 519 }
mridup 0:dc55f40eb04f 520
mridup 12:3799f8475c8a 521 /**
mridup 12:3799f8475c8a 522 * @brief open a server socket
mridup 12:3799f8475c8a 523 * @param port_number: port number to listen on
mridup 12:3799f8475c8a 524 * protocol: TCP/UDP protocol
mridup 12:3799f8475c8a 525 * @retval error value
mridup 12:3799f8475c8a 526 */
mridup 6:e7a3fca2df10 527 int SpwfSADevice::socket_server_open(uint32_t port_number, uint8_t * protocol)
mridup 6:e7a3fca2df10 528 {
mridup 6:e7a3fca2df10 529 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 6:e7a3fca2df10 530
mridup 6:e7a3fca2df10 531 status = wifi_socket_server_open(port_number, protocol);
mridup 6:e7a3fca2df10 532 //map error to enum ns_error_t
mridup 6:e7a3fca2df10 533 if(status!=WiFi_MODULE_SUCCESS)
mridup 6:e7a3fca2df10 534 {
mridup 6:e7a3fca2df10 535 return -1;
mridup 6:e7a3fca2df10 536 }
mridup 6:e7a3fca2df10 537
mridup 6:e7a3fca2df10 538 return 0;
mridup 6:e7a3fca2df10 539 }
mridup 6:e7a3fca2df10 540
mridup 12:3799f8475c8a 541 /**
mridup 12:3799f8475c8a 542 * @brief write to a server socket
mridup 12:3799f8475c8a 543 * @param data_length: size of the data
mridup 12:3799f8475c8a 544 * pdata: pointer to data
mridup 12:3799f8475c8a 545 * @retval error value
mridup 12:3799f8475c8a 546 */
mridup 6:e7a3fca2df10 547 int SpwfSADevice::socket_server_write(uint16_t data_length,char * pdata)
mridup 6:e7a3fca2df10 548 {
mridup 8:0f302a13e21b 549 int status = 0;//number of bytes
mridup 6:e7a3fca2df10 550
mridup 6:e7a3fca2df10 551 status = wifi_socket_server_write(data_length, pdata);
mridup 6:e7a3fca2df10 552 //map error to enum ns_error_t
mridup 8:0f302a13e21b 553 if(status > 0)
mridup 6:e7a3fca2df10 554 {
mridup 8:0f302a13e21b 555 return status;
mridup 8:0f302a13e21b 556 }
mridup 6:e7a3fca2df10 557 return 0;
mridup 6:e7a3fca2df10 558 }
mridup 12:3799f8475c8a 559
mridup 12:3799f8475c8a 560 /**
mridup 12:3799f8475c8a 561 * @brief close a server socket
mridup 12:3799f8475c8a 562 * @param none (only one server socket supported)
mridup 12:3799f8475c8a 563 * @retval error value
mridup 12:3799f8475c8a 564 */
mridup 6:e7a3fca2df10 565 int SpwfSADevice::socket_server_close(void)
mridup 6:e7a3fca2df10 566 {
mridup 6:e7a3fca2df10 567 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 6:e7a3fca2df10 568
mridup 6:e7a3fca2df10 569 status = wifi_socket_server_close();
mridup 6:e7a3fca2df10 570 //map error to enum ns_error_t
mridup 6:e7a3fca2df10 571 if(status!=WiFi_MODULE_SUCCESS)
mridup 6:e7a3fca2df10 572 {
mridup 6:e7a3fca2df10 573 return -1;
mridup 6:e7a3fca2df10 574 }
mridup 6:e7a3fca2df10 575
mridup 6:e7a3fca2df10 576 return 0;
mridup 6:e7a3fca2df10 577 }
mridup 12:3799f8475c8a 578
mridup 12:3799f8475c8a 579 /**
mridup 12:3799f8475c8a 580 * @brief attach/remove IRQ handler to UART
mridup 12:3799f8475c8a 581 * @param attach: attach/remove boolean
mridup 12:3799f8475c8a 582 * @retval none
mridup 12:3799f8475c8a 583 */
mridup 0:dc55f40eb04f 584 void SpwfSADevice::spwf_attach_irq(wifi_bool attach)
mridup 0:dc55f40eb04f 585 {
mridup 0:dc55f40eb04f 586 if(attach)
mridup 0:dc55f40eb04f 587 {
mridup 0:dc55f40eb04f 588 uart_.attach(Rx_irq_handler, SerialBase::RxIrq);
mridup 0:dc55f40eb04f 589 }
mridup 0:dc55f40eb04f 590 else
mridup 0:dc55f40eb04f 591 {
mridup 0:dc55f40eb04f 592 uart_.attach(NULL, SerialBase::RxIrq);
mridup 0:dc55f40eb04f 593 }
mridup 0:dc55f40eb04f 594 }
mridup 0:dc55f40eb04f 595
mridup 12:3799f8475c8a 596 /**
mridup 12:3799f8475c8a 597 * @brief write byte(s) to the UART
mridup 12:3799f8475c8a 598 * @param cmd: pointer to data
mridup 12:3799f8475c8a 599 * size: size of data
mridup 12:3799f8475c8a 600 * @retval error value
mridup 12:3799f8475c8a 601 */
mridup 8:0f302a13e21b 602 int SpwfSADevice::spwf_send(const char * cmd, uint16_t size)
mridup 0:dc55f40eb04f 603 {
mridup 0:dc55f40eb04f 604 Timer timer;
mridup 8:0f302a13e21b 605 int i, bytes;
mridup 0:dc55f40eb04f 606 //timer.start();
mridup 0:dc55f40eb04f 607
mridup 0:dc55f40eb04f 608 //uart_.puts(cmd);//string may contain '\0' character in between hence not used
mridup 0:dc55f40eb04f 609
mridup 0:dc55f40eb04f 610 for(i=0;i<size;i++)
mridup 0:dc55f40eb04f 611 {
mridup 0:dc55f40eb04f 612 uart_.putc(cmd[i]);
mridup 0:dc55f40eb04f 613 //if (timer.read_ms() > _timeout) {
mridup 0:dc55f40eb04f 614 //return -1;
mridup 0:dc55f40eb04f 615 //}
mridup 0:dc55f40eb04f 616 }
mridup 8:0f302a13e21b 617
mridup 8:0f302a13e21b 618 bytes = (int) size - 2;//we send 2 bytes extra for module
mridup 8:0f302a13e21b 619 return bytes;
mridup 0:dc55f40eb04f 620 }
mridup 0:dc55f40eb04f 621
mridup 12:3799f8475c8a 622 /**
mridup 12:3799f8475c8a 623 * @brief read a byte from the UART
mridup 12:3799f8475c8a 624 * @param none
mridup 12:3799f8475c8a 625 * @retval byte character
mridup 12:3799f8475c8a 626 */
mridup 0:dc55f40eb04f 627 char SpwfSADevice::spwf_get(void)
mridup 0:dc55f40eb04f 628 {
mridup 0:dc55f40eb04f 629 return(uart_.getc());
mridup 0:dc55f40eb04f 630 }
mridup 0:dc55f40eb04f 631
mridup 12:3799f8475c8a 632 /**
mridup 12:3799f8475c8a 633 * @brief (re)set the SPWF wakeup GPIO pin
mridup 12:3799f8475c8a 634 * @param wake (re)set value
mridup 12:3799f8475c8a 635 * @retval none
mridup 12:3799f8475c8a 636 */
mridup 0:dc55f40eb04f 637 void SpwfSADevice::spwf_wakeup(int wake)
mridup 0:dc55f40eb04f 638 {
mridup 0:dc55f40eb04f 639 wakeup_.write(wake);
mridup 0:dc55f40eb04f 640 }
mridup 0:dc55f40eb04f 641
mridup 12:3799f8475c8a 642 /**
mridup 12:3799f8475c8a 643 * @brief (re)set the SPWF reset GPIO pin
mridup 12:3799f8475c8a 644 * @param reset (re)set value
mridup 12:3799f8475c8a 645 * @retval none
mridup 12:3799f8475c8a 646 */
mridup 0:dc55f40eb04f 647 void SpwfSADevice::spwf_reset(int reset)
mridup 0:dc55f40eb04f 648 {
mridup 0:dc55f40eb04f 649 rst_.write(reset);
mridup 0:dc55f40eb04f 650 }
mridup 0:dc55f40eb04f 651
mridup 12:3799f8475c8a 652 /**
mridup 12:3799f8475c8a 653 * @brief (re)set the SPWF RTS GPIO line
mridup 12:3799f8475c8a 654 * @param rts (re)set value
mridup 12:3799f8475c8a 655 * @retval none
mridup 12:3799f8475c8a 656 */
mridup 0:dc55f40eb04f 657 void SpwfSADevice::spwf_rts(int rts)
mridup 0:dc55f40eb04f 658 {
mridup 0:dc55f40eb04f 659 rts_.write(rts);
mridup 0:dc55f40eb04f 660 }
mridup 0:dc55f40eb04f 661
mridup 12:3799f8475c8a 662 /**
mridup 12:3799f8475c8a 663 * @brief read the SPWF RTS GPIO pin
mridup 12:3799f8475c8a 664 * @param none
mridup 12:3799f8475c8a 665 * @retval none
mridup 12:3799f8475c8a 666 */
mridup 0:dc55f40eb04f 667 int SpwfSADevice::spwf_read_rts()
mridup 0:dc55f40eb04f 668 {
mridup 0:dc55f40eb04f 669 return(rts_.read());
mridup 0:dc55f40eb04f 670 }
mridup 0:dc55f40eb04f 671
mridup 12:3799f8475c8a 672 /**
mridup 12:3799f8475c8a 673 * @brief send debug print to serial terminal
mridup 12:3799f8475c8a 674 * @param string: data for debug print
mridup 12:3799f8475c8a 675 * @retval none
mridup 12:3799f8475c8a 676 */
mridup 0:dc55f40eb04f 677 void SpwfSADevice::debug_print(const char * string)
mridup 0:dc55f40eb04f 678 {
mridup 0:dc55f40eb04f 679 term_.puts(string);
mridup 0:dc55f40eb04f 680 }
mridup 0:dc55f40eb04f 681
mridup 12:3799f8475c8a 682 /**
mridup 12:3799f8475c8a 683 * @brief (re)set the switch for incoming client (server socket)
mridup 12:3799f8475c8a 684 * @param set: boolean to (re)set
mridup 12:3799f8475c8a 685 * @retval none
mridup 12:3799f8475c8a 686 */
mridup 6:e7a3fca2df10 687 void SpwfSADevice::set_wait_for_incoming_client(bool set)
mridup 6:e7a3fca2df10 688 {
mridup 6:e7a3fca2df10 689 wait_for_incoming_client = set;
mridup 6:e7a3fca2df10 690 }
mridup 6:e7a3fca2df10 691
mridup 12:3799f8475c8a 692 /**
mridup 12:3799f8475c8a 693 * @brief get the switch for incoming client (server socket)
mridup 12:3799f8475c8a 694 * @param none
mridup 12:3799f8475c8a 695 * @retval boolean
mridup 12:3799f8475c8a 696 */
mridup 6:e7a3fca2df10 697 bool SpwfSADevice::get_wait_for_incoming_client()
mridup 6:e7a3fca2df10 698 {
mridup 6:e7a3fca2df10 699 return wait_for_incoming_client;
mridup 6:e7a3fca2df10 700 }
mridup 6:e7a3fca2df10 701