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:
Tue Jun 21 20:20:50 2016 +0000
Revision:
18:b265b3b696f1
Parent:
12:3799f8475c8a
Child:
19:9ab60b80872e
Added SPWFInterface::start_access_point() to allow the module to be put into AP mode. Operational data rates are configurable as is the channel number. AP's have to be open as the underlying driver only appears to support open APs at the moment

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