arduino stuffs
Diffstat (limited to 'libraries/Firmata/utility/WiFiStream.h')
| -rw-r--r-- | libraries/Firmata/utility/WiFiStream.h | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/libraries/Firmata/utility/WiFiStream.h b/libraries/Firmata/utility/WiFiStream.h new file mode 100644 index 0000000..1ad44bb --- /dev/null +++ b/libraries/Firmata/utility/WiFiStream.h @@ -0,0 +1,226 @@ +/* + WiFiStream.h + + An Arduino Stream extension for a WiFiClient or WiFiServer to be used + with legacy Arduino WiFi shield and other boards and shields that + are compatible with the Arduino WiFi library. + + Copyright (C) 2015-2016 Jesse Frush. All rights reserved. + Copyright (C) 2016 Jens B. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See file LICENSE.txt for further informations on licensing terms. + + Last updated April 23rd, 2016 + */ + +#ifndef WIFI_STREAM_H +#define WIFI_STREAM_H + +#include <inttypes.h> +#include <Stream.h> + +#define HOST_CONNECTION_DISCONNECTED 0 +#define HOST_CONNECTION_CONNECTED 1 + +extern "C" { + // callback function types + typedef void (*hostConnectionCallbackFunction)(byte); +} + +class WiFiStream : public Stream +{ +protected: + WiFiClient _client; + bool _connected = false; + hostConnectionCallbackFunction _currentHostConnectionCallback; + + //configuration members + IPAddress _local_ip; // DHCP + IPAddress _subnet; + IPAddress _gateway; + IPAddress _remote_ip; + uint16_t _port; + uint8_t _key_idx; //WEP + const char *_key = nullptr; //WEP + const char *_passphrase = nullptr; //WPA + char *_ssid = nullptr; + + /** + * check if TCP client is connected + * @return true if connected + */ + virtual bool connect_client() = 0; + +public: + /** constructor for TCP server */ + WiFiStream(uint16_t server_port) : _port(server_port) {} + + /** constructor for TCP client */ + WiFiStream(IPAddress server_ip, uint16_t server_port) : _remote_ip(server_ip), _port(server_port) {} + + inline void attach( hostConnectionCallbackFunction newFunction ) { _currentHostConnectionCallback = newFunction; } + +/****************************************************************************** + * network configuration + ******************************************************************************/ + +#ifndef ESP8266 + /** + * configure a static local IP address without defining the local network + * DHCP will be used as long as local IP address is not defined + */ + inline void config(IPAddress local_ip) + { + _local_ip = local_ip; + WiFi.config( local_ip ); + } +#endif + + /** + * configure a static local IP address + * DHCP will be used as long as local IP address is not defined + */ + inline void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet) + { + _local_ip = local_ip; + _subnet = subnet; + _gateway = gateway; +#ifndef ESP8266 + WiFi.config( local_ip, IPAddress(0, 0, 0, 0), gateway, subnet ); +#else + WiFi.config( local_ip, gateway, subnet ); +#endif + } + + /** + * @return local IP address + */ + inline IPAddress getLocalIP() + { + return WiFi.localIP(); + } + +/****************************************************************************** + * network functions + ******************************************************************************/ + + /** + * maintain WiFi and TCP connection + * @return true if WiFi and TCP connection are established + */ + virtual bool maintain() = 0; + +#ifdef ESP8266 + /** + * get status of TCP connection + * @return status of TCP connection + * CLOSED = 0 (typical) + * LISTEN = 1 (not used) + * SYN_SENT = 2 + * SYN_RCVD = 3 + * ESTABLISHED = 4 (typical) + * FIN_WAIT_1 = 5 + * FIN_WAIT_2 = 6 + * CLOSE_WAIT = 7 + * CLOSING = 8 + * LAST_ACK = 9 + * TIME_WAIT = 10 + */ + inline uint8_t status() + { + return _client.status(); + } +#endif + + /** + * close TCP client connection + */ + virtual void stop() = 0; + +/****************************************************************************** + * WiFi configuration + ******************************************************************************/ + + /** + * initialize WiFi without security (open) and initiate client connection + * if WiFi connection is already established + * @return WL_CONNECTED if WiFi connection is established + */ + inline int begin(char *ssid) + { + _ssid = ssid; + + WiFi.begin(ssid); + int result = WiFi.status(); + return WiFi.status(); + } + +#ifndef ESP8266 + /** + * initialize WiFi with WEP security and initiate client connection + * if WiFi connection is already established + * @return WL_CONNECTED if WiFi connection is established + */ + inline int begin(char *ssid, uint8_t key_idx, const char *key) + { + _ssid = ssid; + _key_idx = key_idx; + _key = key; + + WiFi.begin( ssid, key_idx, key ); + return WiFi.status(); + } +#endif + + /** + * initialize WiFi with WPA-PSK security and initiate client connection + * if WiFi connection is already established + * @return WL_CONNECTED if WiFi connection is established + */ + inline int begin(char *ssid, const char *passphrase) + { + _ssid = ssid; + _passphrase = passphrase; + + WiFi.begin(ssid, passphrase); + return WiFi.status(); + } + + +/****************************************************************************** + * stream functions + ******************************************************************************/ + + inline int available() + { + return connect_client() ? _client.available() : 0; + } + + inline void flush() + { + if( _client ) _client.flush(); + } + + inline int peek() + { + return connect_client() ? _client.peek(): 0; + } + + inline int read() + { + return connect_client() ? _client.read() : -1; + } + + inline size_t write(uint8_t byte) + { + return connect_client() ? _client.write( byte ) : 0; + } + +}; + +#endif //WIFI_STREAM_H |