iowfehu;gdbjwHJAOPIHO?L

Fork of X_NUCLEO_IDW01M1 by ST

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