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:
Wed Jun 22 14:53:11 2016 +0000
Revision:
19:9ab60b80872e
Parent:
18:b265b3b696f1
Child:
22:a1276b7d3b2d
Removed (and put guards around) printf's

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;
mridup 0:dc55f40eb04f 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 18:b265b3b696f1 211 if(status != WiFi_MODULE_SUCCESS) return -1;
scsims 18:b265b3b696f1 212 status = SET_Configuration_Addr(WIFI_OPR_RATE_MASK, oprMask);
scsims 18:b265b3b696f1 213 if(status != WiFi_MODULE_SUCCESS) return -1;
scsims 18:b265b3b696f1 214
scsims 18:b265b3b696f1 215 // Start the access point
scsims 18:b265b3b696f1 216 sync_wait_signal = false;
scsims 18:b265b3b696f1 217 status = wifi_ap_start((uint8_t*)ssid, (uint8_t)channel_num);
scsims 18:b265b3b696f1 218 if(status!=WiFi_MODULE_SUCCESS)
scsims 18:b265b3b696f1 219 {
scsims 18:b265b3b696f1 220 return -1;
scsims 18:b265b3b696f1 221 }
scsims 18:b265b3b696f1 222
scsims 18:b265b3b696f1 223 while(!sync_wait_signal)
scsims 18:b265b3b696f1 224 {
scsims 18:b265b3b696f1 225 if (timer.read_ms() > _timeout) {
scsims 18:b265b3b696f1 226 return -1;
scsims 18:b265b3b696f1 227 }
scsims 18:b265b3b696f1 228 __NOP();
scsims 18:b265b3b696f1 229 }
scsims 18:b265b3b696f1 230
scsims 18:b265b3b696f1 231 return 0;
scsims 18:b265b3b696f1 232 }
scsims 18:b265b3b696f1 233
scsims 18:b265b3b696f1 234 /**
mridup 12:3799f8475c8a 235 * @brief network disconnect
mridup 12:3799f8475c8a 236 wrapper function for FW
mridup 12:3799f8475c8a 237 * @param none
mridup 12:3799f8475c8a 238 * @retval error value
mridup 12:3799f8475c8a 239 */
mridup 5:c83ffd44f40a 240 int SpwfSADevice::disconnect()
mridup 0:dc55f40eb04f 241 {
mridup 0:dc55f40eb04f 242 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 243
mridup 0:dc55f40eb04f 244 status = wifi_disconnect();//will set to Idle Mode
mridup 0:dc55f40eb04f 245 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 246 {
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 Get the local IP address
mridup 12:3799f8475c8a 255 * wrapper function for FW
mridup 12:3799f8475c8a 256 * @param none
mridup 12:3799f8475c8a 257 * @retval Null-terminated representation of the local IP address
mridup 12:3799f8475c8a 258 * or null if not yet connected
mridup 12:3799f8475c8a 259 */
mridup 0:dc55f40eb04f 260 const char *SpwfSADevice::getIPAddress()
mridup 0:dc55f40eb04f 261 {
mridup 0:dc55f40eb04f 262 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 263
mridup 0:dc55f40eb04f 264 status = WiFi_Get_IP_Address((uint8_t *)_ip_buffer);
mridup 0:dc55f40eb04f 265
mridup 0:dc55f40eb04f 266 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 267 {
mridup 0:dc55f40eb04f 268 return NULL;
mridup 0:dc55f40eb04f 269 } else
mridup 0:dc55f40eb04f 270 return _ip_buffer;
mridup 0:dc55f40eb04f 271 }
mridup 0:dc55f40eb04f 272
mridup 12:3799f8475c8a 273 /**
mridup 12:3799f8475c8a 274 * @brief Get the MAC address
mridup 12:3799f8475c8a 275 * wrapper function for FW
mridup 12:3799f8475c8a 276 * @param none
mridup 12:3799f8475c8a 277 * @retval Null-terminated representation of the MAC address
mridup 12:3799f8475c8a 278 * or null if not yet connected
mridup 12:3799f8475c8a 279 */
mridup 0:dc55f40eb04f 280 const char *SpwfSADevice::getMACAddress()
mridup 0:dc55f40eb04f 281 {
mridup 0:dc55f40eb04f 282 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 283
mridup 0:dc55f40eb04f 284 status = WiFi_Get_MAC_Address((uint8_t *)_mac_buffer);
mridup 0:dc55f40eb04f 285
mridup 0:dc55f40eb04f 286 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 287 {
mridup 0:dc55f40eb04f 288 return NULL;
mridup 0:dc55f40eb04f 289 } else
mridup 0:dc55f40eb04f 290 return _mac_buffer;
mridup 0:dc55f40eb04f 291 }
mridup 0:dc55f40eb04f 292
mridup 12:3799f8475c8a 293 /**
mridup 12:3799f8475c8a 294 * @brief connect to a remote socket
mridup 12:3799f8475c8a 295 * @param hostname: address of socket
mridup 12:3799f8475c8a 296 port_number: port number to connect
mridup 12:3799f8475c8a 297 protocol: TCP/UDP protocol
mridup 12:3799f8475c8a 298 * sock_id: pointer to socket ID returned by FW
mridup 12:3799f8475c8a 299 * @retval error value
mridup 12:3799f8475c8a 300 */
mridup 5:c83ffd44f40a 301 int SpwfSADevice::socket_client_open(uint8_t * hostname, uint32_t port_number, uint8_t * protocol, uint8_t * sock_id)
mridup 0:dc55f40eb04f 302 {
mridup 0:dc55f40eb04f 303 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 304
mridup 0:dc55f40eb04f 305 //Timeout of synchronous functions?
mridup 0:dc55f40eb04f 306 status = wifi_socket_client_open(hostname, port_number, protocol, sock_id);
mridup 0:dc55f40eb04f 307 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 308 {
mridup 7:0fdd186a7d90 309 *sock_id = 99;//make sure socket id is not set(set to out of bounds of SPWFSA_SOCKET_COUNT range)
mridup 0:dc55f40eb04f 310 return -1;
mridup 0:dc55f40eb04f 311 }
mridup 0:dc55f40eb04f 312
mridup 0:dc55f40eb04f 313 return 0;
mridup 0:dc55f40eb04f 314 }
mridup 0:dc55f40eb04f 315
mridup 12:3799f8475c8a 316 /**
mridup 12:3799f8475c8a 317 * @brief write to a remote socket
mridup 12:3799f8475c8a 318 * @param sock_id: FW ID of the socket
mridup 12:3799f8475c8a 319 DataLength: size of the data
mridup 12:3799f8475c8a 320 pData: pointer to data
mridup 12:3799f8475c8a 321 * @retval error value
mridup 12:3799f8475c8a 322 */
mridup 5:c83ffd44f40a 323 int SpwfSADevice::socket_client_write(uint8_t sock_id, uint16_t DataLength,char * pData)
mridup 0:dc55f40eb04f 324 {
mridup 8:0f302a13e21b 325 int status=0;//number of bytes
mridup 0:dc55f40eb04f 326
mridup 0:dc55f40eb04f 327 status = wifi_socket_client_write(sock_id, DataLength, pData);
mridup 0:dc55f40eb04f 328 //map error to enum ns_error_t
mridup 0:dc55f40eb04f 329
mridup 8:0f302a13e21b 330 if(status > 0)
mridup 0:dc55f40eb04f 331 {
mridup 8:0f302a13e21b 332 return status;
mridup 0:dc55f40eb04f 333 }
mridup 0:dc55f40eb04f 334 return 0;
mridup 0:dc55f40eb04f 335 }
mridup 0:dc55f40eb04f 336
mridup 12:3799f8475c8a 337 /**
mridup 12:3799f8475c8a 338 * @brief receive from a remote socket
mridup 12:3799f8475c8a 339 * @param sock_id: FW ID of the socket
mridup 12:3799f8475c8a 340 DataLength: size of the data
mridup 12:3799f8475c8a 341 pData: pointer to data
mridup 12:3799f8475c8a 342 * @retval error value
mridup 12:3799f8475c8a 343 */
mridup 5:c83ffd44f40a 344 int SpwfSADevice::socket_client_recv(uint8_t sock_id, uint16_t RecvLength,char * pData)
mridup 0:dc55f40eb04f 345 {
mridup 7:0fdd186a7d90 346 static Timer recv_timer;
mridup 7:0fdd186a7d90 347 //char debug_str[10];
mridup 7:0fdd186a7d90 348 static bool recv_call = true;
mridup 7:0fdd186a7d90 349
mridup 7:0fdd186a7d90 350 if(recv_call)
mridup 0:dc55f40eb04f 351 {
mridup 8:0f302a13e21b 352 //debug_print("\r\nrecv_call\r\n");
mridup 8:0f302a13e21b 353 //__disable_irq();
mridup 7:0fdd186a7d90 354 wait_for_socket_data = false;
mridup 8:0f302a13e21b 355 recv_buff = (uint8_t*)pData;
mridup 8:0f302a13e21b 356 //__enable_irq();
mridup 7:0fdd186a7d90 357 if(_timeout>0)
mridup 7:0fdd186a7d90 358 recv_timer.start();
mridup 7:0fdd186a7d90 359 recv_call = false;
mridup 7:0fdd186a7d90 360 bytes_to_read = RecvLength;
mridup 7:0fdd186a7d90 361 bytes_read=0;
mridup 7:0fdd186a7d90 362 }
mridup 7:0fdd186a7d90 363
mridup 7:0fdd186a7d90 364
mridup 7:0fdd186a7d90 365 if(wait_for_socket_data || recv_timer.read_ms() >= _timeout)
mridup 7:0fdd186a7d90 366 {
mridup 7:0fdd186a7d90 367 recv_call = true;
mridup 7:0fdd186a7d90 368 _timeout = 0;
mridup 7:0fdd186a7d90 369 wait_for_socket_data = true;
mridup 7:0fdd186a7d90 370 recv_timer.stop();
mridup 7:0fdd186a7d90 371 recv_timer.reset();
mridup 9:d2dfbf8e7f49 372 wait_ms(1);
mridup 7:0fdd186a7d90 373 if(bytes_read == 0) //<bytes_to_read??
mridup 7:0fdd186a7d90 374 return -1;//return error if no bytes are read!
mridup 7:0fdd186a7d90 375 else
mridup 0:dc55f40eb04f 376 return bytes_read;//return amount of data arrived so far
mridup 0:dc55f40eb04f 377 }
mridup 9:d2dfbf8e7f49 378 wait_ms(1); //CHECK:TODO: Need to wait to allow other IRQ's to run in case of non-blocking call?
mridup 7:0fdd186a7d90 379 return -1;
mridup 7:0fdd186a7d90 380 }
mridup 0:dc55f40eb04f 381
mridup 12:3799f8475c8a 382 /**
mridup 12:3799f8475c8a 383 * @brief scan the network
mridup 12:3799f8475c8a 384 * @param scan_result: scan result data pointer
mridup 12:3799f8475c8a 385 max_scan_number: size of the scan result
mridup 12:3799f8475c8a 386 * @retval error value
mridup 12:3799f8475c8a 387 */
mridup 0:dc55f40eb04f 388 void SpwfSADevice::network_scan(wifi_scan *scan_result, uint16_t max_scan_number)
mridup 0:dc55f40eb04f 389 {
mridup 0:dc55f40eb04f 390 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 391
mridup 0:dc55f40eb04f 392 status = wifi_network_scan(scan_result, max_scan_number);
mridup 0:dc55f40eb04f 393 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 394 {
mridup 0:dc55f40eb04f 395 return;
mridup 0:dc55f40eb04f 396 }
mridup 0:dc55f40eb04f 397 }
mridup 0:dc55f40eb04f 398
mridup 12:3799f8475c8a 399 /**
mridup 12:3799f8475c8a 400 * @brief HTTP GET from remote host
mridup 12:3799f8475c8a 401 * @param hostname: address of remote host
mridup 12:3799f8475c8a 402 path: path to resource
mridup 12:3799f8475c8a 403 port_number: port number
mridup 12:3799f8475c8a 404 * @retval none
mridup 12:3799f8475c8a 405 */
mridup 0:dc55f40eb04f 406 void SpwfSADevice::http_get(uint8_t * hostname, uint8_t * path, uint32_t port_number)
mridup 0:dc55f40eb04f 407 {
mridup 0:dc55f40eb04f 408 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 409
mridup 0:dc55f40eb04f 410 status = wifi_http_get((uint8_t *)hostname, (uint8_t *)path, port_number);
mridup 0:dc55f40eb04f 411 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 412 {
mridup 0:dc55f40eb04f 413 return;
mridup 0:dc55f40eb04f 414 }
mridup 0:dc55f40eb04f 415 }
mridup 0:dc55f40eb04f 416
mridup 12:3799f8475c8a 417 /**
mridup 12:3799f8475c8a 418 * @brief HTTP GET from remote host
mridup 12:3799f8475c8a 419 * @param url_path: complete url of remote resource
mridup 12:3799f8475c8a 420 * @retval none
mridup 12:3799f8475c8a 421 */
mridup 0:dc55f40eb04f 422 void SpwfSADevice::http_post(uint8_t * url_path)
mridup 0:dc55f40eb04f 423 {
mridup 0:dc55f40eb04f 424 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 425
mridup 0:dc55f40eb04f 426 status = wifi_http_post(url_path);
mridup 0:dc55f40eb04f 427 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 428 {
mridup 0:dc55f40eb04f 429 return;
mridup 0:dc55f40eb04f 430 }
mridup 0:dc55f40eb04f 431 }
mridup 0:dc55f40eb04f 432
mridup 12:3799f8475c8a 433 /**
mridup 12:3799f8475c8a 434 * @brief FW callback with data in socket
mridup 12:3799f8475c8a 435 * @param sock_id: FW ID of the socket
mridup 12:3799f8475c8a 436 data_ptr: pointer to data from FW
mridup 12:3799f8475c8a 437 message_size: total data to arrive
mridup 12:3799f8475c8a 438 chunk_size: size of the data in this callback (<= message_size)
mridup 12:3799f8475c8a 439 * @retval none
mridup 12:3799f8475c8a 440 */
mridup 0:dc55f40eb04f 441 void SpwfSADevice::signal_data_receive(uint8_t socket_id, uint8_t * data_ptr, uint32_t message_size, uint32_t chunk_size)
mridup 0:dc55f40eb04f 442 {
mridup 8:0f302a13e21b 443 char debug_str[50];
mridup 0:dc55f40eb04f 444 //Data will be copied or returned to user only if there is a pending request
mridup 0:dc55f40eb04f 445 //Copy data to pData
mridup 8:0f302a13e21b 446 //sprintf((char*)debug_str,"sock_id: %d, size: %d, chunk: %d\r\n",socket_id, message_size, chunk_size);
mridup 8:0f302a13e21b 447 //debug_print(debug_str);
mridup 5:c83ffd44f40a 448
mridup 7:0fdd186a7d90 449 if(recv_buff && !wait_for_socket_data)
mridup 0:dc55f40eb04f 450 {
mridup 8:0f302a13e21b 451 if((bytes_read + chunk_size)<= bytes_to_read)
mridup 0:dc55f40eb04f 452 {
mridup 8:0f302a13e21b 453 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 454 bytes_read += chunk_size;
mridup 0:dc55f40eb04f 455 }
mridup 0:dc55f40eb04f 456 else
mridup 0:dc55f40eb04f 457 {
mridup 8:0f302a13e21b 458 uint32_t x_size = (bytes_read + chunk_size) - bytes_to_read;
mridup 8:0f302a13e21b 459 memcpy(recv_buff + bytes_read, data_ptr, chunk_size-x_size);
mridup 8:0f302a13e21b 460 bytes_read += (chunk_size-x_size);
mridup 0:dc55f40eb04f 461 }
mridup 0:dc55f40eb04f 462
mridup 0:dc55f40eb04f 463 if(bytes_read >= bytes_to_read)
mridup 0:dc55f40eb04f 464 {
mridup 0:dc55f40eb04f 465 __disable_irq();
mridup 7:0fdd186a7d90 466 wait_for_socket_data = true;
mridup 0:dc55f40eb04f 467 __enable_irq();
mridup 0:dc55f40eb04f 468 }
mridup 0:dc55f40eb04f 469 }
mridup 0:dc55f40eb04f 470 else
mridup 0:dc55f40eb04f 471 {
mridup 0:dc55f40eb04f 472 debug_print("\r\n Socket:: Data Dropped: ");
mridup 8:0f302a13e21b 473 sprintf((char*)debug_str,"%d\r\n",chunk_size);
mridup 0:dc55f40eb04f 474 debug_print(debug_str);
mridup 0:dc55f40eb04f 475 __disable_irq();
mridup 7:0fdd186a7d90 476 wait_for_socket_data = true;
mridup 0:dc55f40eb04f 477 __enable_irq();
mridup 0:dc55f40eb04f 478 }
mridup 0:dc55f40eb04f 479 }
mridup 0:dc55f40eb04f 480
mridup 12:3799f8475c8a 481 /**
mridup 12:3799f8475c8a 482 * @brief synchronization function called from FW (used for connect,disconnect, ready, etc.)
mridup 12:3799f8475c8a 483 * @param code: Status code value returned
mridup 12:3799f8475c8a 484 * @retval none
mridup 12:3799f8475c8a 485 */
mridup 0:dc55f40eb04f 486 void SpwfSADevice::signal_synch_wait(WiFi_Status_t code)
mridup 0:dc55f40eb04f 487 {
mridup 0:dc55f40eb04f 488 if(code == WiFi_DISASSOCIATION)
mridup 0:dc55f40eb04f 489 {
mridup 0:dc55f40eb04f 490 //do nothing
mridup 0:dc55f40eb04f 491 }
mridup 0:dc55f40eb04f 492 else
mridup 0:dc55f40eb04f 493 {
mridup 0:dc55f40eb04f 494 __disable_irq();
mridup 0:dc55f40eb04f 495 sync_wait_signal = true;
mridup 0:dc55f40eb04f 496 __enable_irq();
mridup 0:dc55f40eb04f 497 }
mridup 0:dc55f40eb04f 498 }
mridup 0:dc55f40eb04f 499
mridup 12:3799f8475c8a 500 /**
mridup 12:3799f8475c8a 501 * @brief close a client socket
mridup 12:3799f8475c8a 502 * @param sock_close_id: FW ID of the socket to close
mridup 12:3799f8475c8a 503 * @retval error value
mridup 12:3799f8475c8a 504 */
mridup 5:c83ffd44f40a 505 int SpwfSADevice::socket_client_close(uint8_t sock_close_id)
mridup 0:dc55f40eb04f 506 {
mridup 0:dc55f40eb04f 507 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 508
mridup 0:dc55f40eb04f 509 status = wifi_socket_client_close(sock_close_id);
mridup 0:dc55f40eb04f 510 //map error to enum ns_error_t
mridup 0:dc55f40eb04f 511 if(status!=WiFi_MODULE_SUCCESS)
mridup 0:dc55f40eb04f 512 {
mridup 0:dc55f40eb04f 513 return -1;
mridup 0:dc55f40eb04f 514 }
mridup 0:dc55f40eb04f 515
mridup 0:dc55f40eb04f 516 return 0;
mridup 0:dc55f40eb04f 517 }
mridup 0:dc55f40eb04f 518
mridup 12:3799f8475c8a 519 /**
mridup 12:3799f8475c8a 520 * @brief open a server socket
mridup 12:3799f8475c8a 521 * @param port_number: port number to listen on
mridup 12:3799f8475c8a 522 * protocol: TCP/UDP protocol
mridup 12:3799f8475c8a 523 * @retval error value
mridup 12:3799f8475c8a 524 */
mridup 6:e7a3fca2df10 525 int SpwfSADevice::socket_server_open(uint32_t port_number, uint8_t * protocol)
mridup 6:e7a3fca2df10 526 {
mridup 6:e7a3fca2df10 527 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 6:e7a3fca2df10 528
mridup 6:e7a3fca2df10 529 status = wifi_socket_server_open(port_number, protocol);
mridup 6:e7a3fca2df10 530 //map error to enum ns_error_t
mridup 6:e7a3fca2df10 531 if(status!=WiFi_MODULE_SUCCESS)
mridup 6:e7a3fca2df10 532 {
mridup 6:e7a3fca2df10 533 return -1;
mridup 6:e7a3fca2df10 534 }
mridup 6:e7a3fca2df10 535
mridup 6:e7a3fca2df10 536 return 0;
mridup 6:e7a3fca2df10 537 }
mridup 6:e7a3fca2df10 538
mridup 12:3799f8475c8a 539 /**
mridup 12:3799f8475c8a 540 * @brief write to a server socket
mridup 12:3799f8475c8a 541 * @param data_length: size of the data
mridup 12:3799f8475c8a 542 * pdata: pointer to data
mridup 12:3799f8475c8a 543 * @retval error value
mridup 12:3799f8475c8a 544 */
mridup 6:e7a3fca2df10 545 int SpwfSADevice::socket_server_write(uint16_t data_length,char * pdata)
mridup 6:e7a3fca2df10 546 {
mridup 8:0f302a13e21b 547 int status = 0;//number of bytes
mridup 6:e7a3fca2df10 548
mridup 6:e7a3fca2df10 549 status = wifi_socket_server_write(data_length, pdata);
mridup 6:e7a3fca2df10 550 //map error to enum ns_error_t
mridup 8:0f302a13e21b 551 if(status > 0)
mridup 6:e7a3fca2df10 552 {
mridup 8:0f302a13e21b 553 return status;
mridup 8:0f302a13e21b 554 }
mridup 6:e7a3fca2df10 555 return 0;
mridup 6:e7a3fca2df10 556 }
mridup 12:3799f8475c8a 557
mridup 12:3799f8475c8a 558 /**
mridup 12:3799f8475c8a 559 * @brief close a server socket
mridup 12:3799f8475c8a 560 * @param none (only one server socket supported)
mridup 12:3799f8475c8a 561 * @retval error value
mridup 12:3799f8475c8a 562 */
mridup 6:e7a3fca2df10 563 int SpwfSADevice::socket_server_close(void)
mridup 6:e7a3fca2df10 564 {
mridup 6:e7a3fca2df10 565 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 6:e7a3fca2df10 566
mridup 6:e7a3fca2df10 567 status = wifi_socket_server_close();
mridup 6:e7a3fca2df10 568 //map error to enum ns_error_t
mridup 6:e7a3fca2df10 569 if(status!=WiFi_MODULE_SUCCESS)
mridup 6:e7a3fca2df10 570 {
mridup 6:e7a3fca2df10 571 return -1;
mridup 6:e7a3fca2df10 572 }
mridup 6:e7a3fca2df10 573
mridup 6:e7a3fca2df10 574 return 0;
mridup 6:e7a3fca2df10 575 }
mridup 12:3799f8475c8a 576
mridup 12:3799f8475c8a 577 /**
mridup 12:3799f8475c8a 578 * @brief attach/remove IRQ handler to UART
mridup 12:3799f8475c8a 579 * @param attach: attach/remove boolean
mridup 12:3799f8475c8a 580 * @retval none
mridup 12:3799f8475c8a 581 */
mridup 0:dc55f40eb04f 582 void SpwfSADevice::spwf_attach_irq(wifi_bool attach)
mridup 0:dc55f40eb04f 583 {
mridup 0:dc55f40eb04f 584 if(attach)
mridup 0:dc55f40eb04f 585 {
mridup 0:dc55f40eb04f 586 uart_.attach(Rx_irq_handler, SerialBase::RxIrq);
mridup 0:dc55f40eb04f 587 }
mridup 0:dc55f40eb04f 588 else
mridup 0:dc55f40eb04f 589 {
mridup 0:dc55f40eb04f 590 uart_.attach(NULL, SerialBase::RxIrq);
mridup 0:dc55f40eb04f 591 }
mridup 0:dc55f40eb04f 592 }
mridup 0:dc55f40eb04f 593
mridup 12:3799f8475c8a 594 /**
mridup 12:3799f8475c8a 595 * @brief write byte(s) to the UART
mridup 12:3799f8475c8a 596 * @param cmd: pointer to data
mridup 12:3799f8475c8a 597 * size: size of data
mridup 12:3799f8475c8a 598 * @retval error value
mridup 12:3799f8475c8a 599 */
mridup 8:0f302a13e21b 600 int SpwfSADevice::spwf_send(const char * cmd, uint16_t size)
mridup 0:dc55f40eb04f 601 {
mridup 0:dc55f40eb04f 602 Timer timer;
mridup 8:0f302a13e21b 603 int i, bytes;
mridup 0:dc55f40eb04f 604 //timer.start();
mridup 0:dc55f40eb04f 605
mridup 0:dc55f40eb04f 606 //uart_.puts(cmd);//string may contain '\0' character in between hence not used
mridup 0:dc55f40eb04f 607
mridup 0:dc55f40eb04f 608 for(i=0;i<size;i++)
mridup 0:dc55f40eb04f 609 {
mridup 0:dc55f40eb04f 610 uart_.putc(cmd[i]);
mridup 0:dc55f40eb04f 611 //if (timer.read_ms() > _timeout) {
mridup 0:dc55f40eb04f 612 //return -1;
mridup 0:dc55f40eb04f 613 //}
mridup 0:dc55f40eb04f 614 }
mridup 8:0f302a13e21b 615
mridup 8:0f302a13e21b 616 bytes = (int) size - 2;//we send 2 bytes extra for module
mridup 8:0f302a13e21b 617 return bytes;
mridup 0:dc55f40eb04f 618 }
mridup 0:dc55f40eb04f 619
mridup 12:3799f8475c8a 620 /**
mridup 12:3799f8475c8a 621 * @brief read a byte from the UART
mridup 12:3799f8475c8a 622 * @param none
mridup 12:3799f8475c8a 623 * @retval byte character
mridup 12:3799f8475c8a 624 */
mridup 0:dc55f40eb04f 625 char SpwfSADevice::spwf_get(void)
mridup 0:dc55f40eb04f 626 {
mridup 0:dc55f40eb04f 627 return(uart_.getc());
mridup 0:dc55f40eb04f 628 }
mridup 0:dc55f40eb04f 629
mridup 12:3799f8475c8a 630 /**
mridup 12:3799f8475c8a 631 * @brief (re)set the SPWF wakeup GPIO pin
mridup 12:3799f8475c8a 632 * @param wake (re)set value
mridup 12:3799f8475c8a 633 * @retval none
mridup 12:3799f8475c8a 634 */
mridup 0:dc55f40eb04f 635 void SpwfSADevice::spwf_wakeup(int wake)
mridup 0:dc55f40eb04f 636 {
mridup 0:dc55f40eb04f 637 wakeup_.write(wake);
mridup 0:dc55f40eb04f 638 }
mridup 0:dc55f40eb04f 639
mridup 12:3799f8475c8a 640 /**
mridup 12:3799f8475c8a 641 * @brief (re)set the SPWF reset GPIO pin
mridup 12:3799f8475c8a 642 * @param reset (re)set value
mridup 12:3799f8475c8a 643 * @retval none
mridup 12:3799f8475c8a 644 */
mridup 0:dc55f40eb04f 645 void SpwfSADevice::spwf_reset(int reset)
mridup 0:dc55f40eb04f 646 {
mridup 0:dc55f40eb04f 647 rst_.write(reset);
mridup 0:dc55f40eb04f 648 }
mridup 0:dc55f40eb04f 649
mridup 12:3799f8475c8a 650 /**
mridup 12:3799f8475c8a 651 * @brief (re)set the SPWF RTS GPIO line
mridup 12:3799f8475c8a 652 * @param rts (re)set value
mridup 12:3799f8475c8a 653 * @retval none
mridup 12:3799f8475c8a 654 */
mridup 0:dc55f40eb04f 655 void SpwfSADevice::spwf_rts(int rts)
mridup 0:dc55f40eb04f 656 {
mridup 0:dc55f40eb04f 657 rts_.write(rts);
mridup 0:dc55f40eb04f 658 }
mridup 0:dc55f40eb04f 659
mridup 12:3799f8475c8a 660 /**
mridup 12:3799f8475c8a 661 * @brief read the SPWF RTS GPIO pin
mridup 12:3799f8475c8a 662 * @param none
mridup 12:3799f8475c8a 663 * @retval none
mridup 12:3799f8475c8a 664 */
mridup 0:dc55f40eb04f 665 int SpwfSADevice::spwf_read_rts()
mridup 0:dc55f40eb04f 666 {
mridup 0:dc55f40eb04f 667 return(rts_.read());
mridup 0:dc55f40eb04f 668 }
mridup 0:dc55f40eb04f 669
mridup 12:3799f8475c8a 670 /**
mridup 12:3799f8475c8a 671 * @brief send debug print to serial terminal
mridup 12:3799f8475c8a 672 * @param string: data for debug print
mridup 12:3799f8475c8a 673 * @retval none
mridup 12:3799f8475c8a 674 */
mridup 0:dc55f40eb04f 675 void SpwfSADevice::debug_print(const char * string)
mridup 0:dc55f40eb04f 676 {
mridup 0:dc55f40eb04f 677 term_.puts(string);
mridup 0:dc55f40eb04f 678 }
mridup 0:dc55f40eb04f 679
mridup 12:3799f8475c8a 680 /**
mridup 12:3799f8475c8a 681 * @brief (re)set the switch for incoming client (server socket)
mridup 12:3799f8475c8a 682 * @param set: boolean to (re)set
mridup 12:3799f8475c8a 683 * @retval none
mridup 12:3799f8475c8a 684 */
mridup 6:e7a3fca2df10 685 void SpwfSADevice::set_wait_for_incoming_client(bool set)
mridup 6:e7a3fca2df10 686 {
mridup 6:e7a3fca2df10 687 wait_for_incoming_client = set;
mridup 6:e7a3fca2df10 688 }
mridup 6:e7a3fca2df10 689
mridup 12:3799f8475c8a 690 /**
mridup 12:3799f8475c8a 691 * @brief get the switch for incoming client (server socket)
mridup 12:3799f8475c8a 692 * @param none
mridup 12:3799f8475c8a 693 * @retval boolean
mridup 12:3799f8475c8a 694 */
mridup 6:e7a3fca2df10 695 bool SpwfSADevice::get_wait_for_incoming_client()
mridup 6:e7a3fca2df10 696 {
mridup 6:e7a3fca2df10 697 return wait_for_incoming_client;
mridup 6:e7a3fca2df10 698 }
mridup 6:e7a3fca2df10 699