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
Spwf_API/SpwfSADevice.cpp@18:b265b3b696f1, 2016-06-21 (annotated)
- 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?
User | Revision | Line number | New 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>© 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 |