Initial commit

Dependencies:   FastPWM

Revision:
0:bb348c97df44
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-dev-master/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.h	Wed Sep 16 01:11:49 2020 +0000
@@ -0,0 +1,288 @@
+/* ODIN-W2 implementation of WiFiInterface
+ * Copyright (c) 2016 u-blox Malmö AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ODIN_WIFI_INTERFACE_H
+#define ODIN_WIFI_INTERFACE_H
+
+#include "WiFiInterface.h"
+#ifdef DEVICE_WIFI_AP
+#include "WiFiSoftAPInterface.h"
+#endif
+
+#include "mbed.h"
+#include "netsocket/WiFiAccessPoint.h"
+#include "netsocket/EMACInterface.h"
+#include "nsapi_types.h"
+#include "lwip/netif.h"
+#include "rtos.h"
+#include "cb_wlan.h"
+
+#define ODIN_WIFI_MAX_MAC_ADDR_STR  (18)
+#define ODIN_WIFI_SCAN_CACHE_SIZE   (5)
+
+struct odin_wifi_msg_s;
+struct user_connect_s;
+struct user_scan_s;
+struct user_ap_start_s;
+struct wlan_status_started_s;
+struct wlan_status_connected_s;
+struct wlan_status_connection_failure_s;
+struct wlan_scan_indication_s;
+
+/** OdinWiFiInterface class
+ *  Implementation of the WiFiInterface for the ODIN-W2 module
+ */
+
+class OdinWiFiInterface : public WiFiInterface, public EMACInterface
+
+{
+public:
+    /** OdinWiFiInterface lifetime
+     */
+    OdinWiFiInterface();
+    
+    OdinWiFiInterface(bool debug);
+
+    ~OdinWiFiInterface();
+    
+    /** Set the WiFi network credentials
+     *
+     *  @param ssid      Name of the network to connect to
+     *  @param pass      Security passphrase to connect to the network
+     *  @param security  Type of encryption for connection
+     *                   (defaults to NSAPI_SECURITY_NONE)
+     *  @return          0 on success, or error code on failure
+     */
+    virtual nsapi_error_t set_credentials(const char *ssid, const char *pass, nsapi_security_t security = NSAPI_SECURITY_NONE);
+    
+    /** Set the WiFi network channel
+     *
+     *  @param channel   Channel on which the connection is to be made, or 0 for any (Default: 0)
+     *  @return          0 on success, or error code on failure
+     */
+    virtual nsapi_error_t set_channel(uint8_t channel);
+    
+    /** Start the interface
+     *
+     *  Attempts to connect to a WiFi network.
+     *
+     *  @param ssid      Name of the network to connect to
+     *  @param pass      Security passphrase to connect to the network
+     *  @param security  Type of encryption for connection (Default: NSAPI_SECURITY_NONE)
+     *  @param channel   Channel on which the connection is to be made, or 0 for any (Default: 0)
+     *  @return          0 on success, or error code on failure
+     */
+    virtual nsapi_error_t connect(
+        const char *ssid,
+        const char *pass,
+        nsapi_security_t security = NSAPI_SECURITY_NONE,
+        uint8_t channel = 0);
+
+    /** Start the interface
+     *
+     *  Attempts to connect to a WiFi network. Requires ssid and passphrase to be set.
+     *  If passphrase is invalid, NSAPI_ERROR_AUTH_ERROR is returned.
+     *
+     *  @return         0 on success, negative error code on failure
+     */
+    virtual nsapi_error_t connect();
+
+    /** Stop the interface
+     *
+     *  @return         0 on success, or error code on failure
+     */
+    virtual nsapi_error_t disconnect();
+
+
+
+    
+    /** Gets the current radio signal strength for active connection
+     *
+     *  @return         Connection strength in dBm (negative value),
+     *                  or 0 if measurement impossible
+     */
+    virtual int8_t get_rssi();
+
+    /** Scan for available networks
+     *
+     *  If the network interface is set to non-blocking mode, scan will attempt to scan
+     *  for WiFi networks asynchronously and return NSAPI_ERROR_WOULD_BLOCK. If a callback
+     *  is attached, the callback will be called when the operation has completed.
+     *
+     * @param  ap       Pointer to allocated array to store discovered AP
+     * @param  count    Size of allocated @a res array, or 0 to only count available AP
+     * @param  timeout  Timeout in milliseconds; 0 for no timeout (Default: 0)
+     * @return          Number of entries in @a, or if @a count was 0 number of available networks, negative on error
+     *                  see @a nsapi_error
+     */
+    virtual nsapi_size_or_error_t scan(WiFiAccessPoint *res, nsapi_size_t count);
+
+    /** Sets timeout for connection setup. Note that the time for DHCP retrieval is not included.
+     *
+     *  @param timeout  Timeout in ms. Use 0 for waiting forever. The timeout might take up to X sec longer than
+     *                  specified since the Wi-Fi driver might need some time to finish and cleanup.
+     *  @return         0 on success, negative error code on failure
+     */
+    virtual nsapi_error_t set_timeout(int ms);
+
+private:
+
+    enum OdinWifiState {
+        S_NOT_INITIALISED = 1,
+        S_WAIT_START,
+        S_STARTED,
+        S_WAIT_STOP,
+
+        S_STA_IDLE,
+        S_STA_WAIT_CONNECT,
+        S_STA_CONNECTED,
+        S_STA_DISCONNECTED_WAIT_CONNECT,
+        S_STA_CONNECTION_FAIL_WAIT_DISCONNECT,
+        //S_STA_LINK_LOSS_WAIT_DISCONNECT,
+        S_STA_WAIT_DISCONNECT,
+
+        S_AP_IDLE,
+        S_AP_WAIT_START,
+        S_AP_STARTED,
+        S_AP_WAIT_STOP,
+        S_AP_FAIL_WAIT_STOP,
+        S_AP_WAIT_DRV_STOP,
+        S_AP_WAIT_DRV_START,
+
+        S_INVALID
+    };
+
+    struct sta_s {
+        const char          *ssid;
+        const char          *passwd;
+        nsapi_security_t    security;
+        uint8_t             channel;
+        int                 timeout_ms;
+    };
+
+    struct ap_s {
+        const char          *ssid;
+        const char          *passwd;
+        nsapi_security_t    security;
+        uint8_t             channel;
+        bool                use_dhcp;
+
+        char                ip_address[IPADDR_STRLEN_MAX];
+        char                netmask[IPADDR_STRLEN_MAX];
+        char                gateway[IPADDR_STRLEN_MAX];
+
+        int                 cnt_connected;
+
+        nsapi_error_t       error_code;
+        uint16_t            beacon_interval;
+    };
+
+    struct scan_cache_s {
+        int                 count;
+        uint8_t             last_channel;
+        cbWLAN_MACAddress   bssid[ODIN_WIFI_SCAN_CACHE_SIZE];
+    };
+
+    OdinWifiState entry_connect_fail_wait_disconnect();
+    OdinWifiState entry_wait_connect();
+    OdinWifiState entry_wait_disconnect();
+    //OdinWifiState entry_link_loss_wait_disconnect(void);
+    OdinWifiState entry_ap_wait_start();
+    OdinWifiState entry_ap_started();
+    OdinWifiState entry_ap_wait_stop();
+    OdinWifiState entry_ap_fail_wait_stop();
+    OdinWifiState entry_ap_wait_drv_stop();
+    OdinWifiState entry_ap_wait_drv_start();
+
+    void handle_in_msg();
+    void handle_cached_msg();
+
+    void handle_user_connect(user_connect_s *user_connect);
+    void handle_user_disconnect();
+    void handle_user_scan(user_scan_s *user_scan);
+    void handle_user_connect_timeout();
+    void handle_user_stop();
+
+    void handle_user_ap_start(user_ap_start_s *user_ap_start);
+    void handle_user_ap_stop();
+
+    void handle_wlan_status_started(wlan_status_started_s *start);
+    void handle_wlan_status_stopped(void);
+    void handle_wlan_status_error(void);
+    void handle_wlan_status_connecting(void);
+    void handle_wlan_status_connected(wlan_status_connected_s *wlan_connect);
+    void handle_wlan_status_connection_failure(wlan_status_connection_failure_s *connect_failure);
+    void handle_wlan_status_disconnected(void);
+    void handle_wlan_scan_indication();
+
+    void handle_wlan_status_ap_up();
+    void handle_wlan_status_ap_down();
+
+    void init(bool debug);
+    nsapi_error_t wlan_set_channel(uint8_t channel);
+    nsapi_error_t wlan_connect(
+            const char          *ssid,
+            const char          *passwd,
+            nsapi_security_t    security);
+    nsapi_error_t wlan_ap_start(
+            const char          *ssid,
+            const char          *pass,
+            nsapi_security_t    security,
+            uint8_t             channel,
+            uint16_t            beacon_interval);
+
+    void timeout_user_connect();
+    void update_scan_list(cbWLAN_ScanIndicationInfo *scan_info);
+    void send_user_response_msg(unsigned int type, nsapi_error_t error_code);
+    void wlan_status_indication(cbWLAN_StatusIndicationInfo status, void *data);
+    void wlan_scan_indication(cbWLAN_ScanIndicationInfo *scan_info, cb_boolean is_last_result);
+
+    static bool                 _wlan_initialized; // Controls that cbWLAN is initiated only once
+    static int32_t              _target_id;
+
+    OdinWifiState       _state;
+    OdinWifiState       _state_sta;
+    OdinWifiState       _state_ap;
+
+    struct sta_s        _sta;
+    struct ap_s         _ap;
+    char                _mac_addr_str[ODIN_WIFI_MAX_MAC_ADDR_STR];
+
+    cbWLAN_StatusConnectedInfo      _wlan_status_connected_info;
+    cbWLAN_StatusDisconnectedInfo   _wlan_status_disconnected_info;
+
+    bool                            _scan_active;
+    WiFiAccessPoint                 *_scan_list;
+    nsapi_size_t                    _scan_list_size;
+    nsapi_size_t                    _scan_list_cnt;
+    struct scan_cache_s             _scan_cache;
+
+    friend struct wlan_callb_s;
+
+    Mutex                               _mutex;
+    Queue<odin_wifi_msg_s, 6>           _in_queue;
+    Queue<odin_wifi_msg_s, 1>           _out_queue;
+    Queue<odin_wifi_msg_s, 1>           _cache_queue;
+    MemoryPool<odin_wifi_msg_s, 7>      *_msg_pool;
+    Thread                              _thread;
+    //Timeout                             _timeout; //Randomly lost interrupts/callbacks; replaced by Timer
+    Timer                               _timer;
+
+    bool    _debug;
+    int     _dbg_timeout;
+};
+
+#endif