Garage Door Monitor and Opener

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Introduction

This system implements a simple garage door opener and environmental monitor. The hardware connects to the internet using Wi-Fi then on to the Pelion Device Management Platform which provides device monitoring and secure firmware updates over the air (FOTA). Pelion Device Management provides a flexible set of REST APIs which we will use to communicate to a web application running on an EC-2 instance in AWS. The web application will serve a web page where we can monitor and control our garage..

This project is intended to work on the DISCO-L475VG-IOT01A from ST Microelectronics It implements a simple actuator to drive a relay to simulate pushing the "open" button on older style garage doors which do not use a rolling code interface.

The system is designed to be mounted over the door so that the on board time of flight sensor can be used to detect if the door is open or closed.

The system also monitors temperature, humidity and barometric pressure.

https://os.mbed.com/media/uploads/JimCarver/garageopener.jpg

Hardware Requirements:

DISCO-L475G-IOT01A https://os.mbed.com/platforms/ST-Discovery-L475E-IOT01A/

Seeed Studio Grove Relay module https://www.seeedstudio.com/Grove-Relay.html

Seeed Studio Grove cable, I used this one: https://www.seeedstudio.com/Grove-4-pin-Male-Jumper-to-Grove-4-pin-Conversion-Cable-5-PCs-per-Pack.html

Connect to the PMOD connector like this:

https://os.mbed.com/media/uploads/JimCarver/opener.jpg

This shows how I installed so that the time of flight sensor can detect when the door is open

https://os.mbed.com/media/uploads/JimCarver/opener1.jpg https://os.mbed.com/media/uploads/JimCarver/opener2.jpg

To use the project:

You will also need a Pelion developers account.

I suggest you first use the Pelion quick state to become familiar with Pelion Device Management. https://os.mbed.com/guides/connect-device-to-pelion/1/?board=ST-Discovery-L475E-IOT01A

Web Interface

For my web interface I am running node-red under Ubuntu in an EC2 instance on AWS. This can run for 12 month within the constraints of their free tier. Here is a tutorial: https://nodered.org/docs/getting-started/aws

You will also need to install several node-red add ons:

sudo npm install -g node-red-dashboard

sudo npm install -g node-red-contrib-mbed-cloud

sudo npm istall -g node-red-contrib-moment

After starting node-red import the contents of GarageFlow.txt from the project, pin the flow into the page.

To enable your web app to access your Pelion account you need an API key.

First you will neet to use your Pelion account to create an API key.

https://os.mbed.com/media/uploads/JimCarver/api_portal.jpg

Now we need to apply that API key to your Node-Red flow.

https://os.mbed.com/media/uploads/JimCarver/api_node-red.jpg

Files at this revision

API Documentation at this revision

Comitter:
screamer
Date:
Sun Dec 16 13:54:34 2018 +0000
Parent:
18:a15bfe7aaebd
Child:
20:a9aab92d378b
Commit message:
Reorganize drivers

Changed in this revision

drivers/network/WIFI_ISM43362.lib Show diff for this revision Revisions of this file
drivers/network/WIFI_ISM43362/ISM43362/ATParser/ATParser.cpp Show diff for this revision Revisions of this file
drivers/network/WIFI_ISM43362/ISM43362/ATParser/ATParser.h Show diff for this revision Revisions of this file
drivers/network/WIFI_ISM43362/ISM43362/ATParser/BufferedSpi/Buffer/MyBuffer.cpp Show diff for this revision Revisions of this file
drivers/network/WIFI_ISM43362/ISM43362/ATParser/BufferedSpi/Buffer/MyBuffer.h Show diff for this revision Revisions of this file
drivers/network/WIFI_ISM43362/ISM43362/ATParser/BufferedSpi/BufferedPrint.c Show diff for this revision Revisions of this file
drivers/network/WIFI_ISM43362/ISM43362/ATParser/BufferedSpi/BufferedSpi.cpp Show diff for this revision Revisions of this file
drivers/network/WIFI_ISM43362/ISM43362/ATParser/BufferedSpi/BufferedSpi.h Show diff for this revision Revisions of this file
drivers/network/WIFI_ISM43362/ISM43362/ISM43362.cpp Show diff for this revision Revisions of this file
drivers/network/WIFI_ISM43362/ISM43362/ISM43362.h Show diff for this revision Revisions of this file
drivers/network/WIFI_ISM43362/ISM43362Interface.cpp Show diff for this revision Revisions of this file
drivers/network/WIFI_ISM43362/ISM43362Interface.h Show diff for this revision Revisions of this file
drivers/network/WIFI_ISM43362/README.md Show diff for this revision Revisions of this file
drivers/network/WIFI_ISM43362/mbed_lib.json Show diff for this revision Revisions of this file
--- a/drivers/network/WIFI_ISM43362.lib	Sun Dec 16 13:53:42 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-https://github.com/ARMmbed/wifi-ism43362/#49d0f834dc420c98631fc33777aace9a31d8d584
--- a/drivers/network/WIFI_ISM43362/ISM43362/ATParser/ATParser.cpp	Sun Dec 16 13:53:42 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,454 +0,0 @@
-/* Copyright (c) 2015 ARM Limited
- *
- * 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.
- *
- * @section DESCRIPTION
- *
- * Parser for the AT command syntax
- *
- */
-
-#include "ATParser.h"
-#include "mbed_debug.h"
-
-#ifdef LF
-#undef LF
-#define LF  10
-#else
-#define LF  10
-#endif
-
-#ifdef CR
-#undef CR
-#define CR  13
-#else
-#define CR  13
-#endif
-#define MIN(a,b) (((a)<(b))?(a):(b))
-
-// activate / de-activate debug
-#define dbg_on           0
-#define AT_DATA_PRINT    0
-#define AT_COMMAND_PRINT 0
-#define AT_HEXA_DATA     0
-
-ATParser::ATParser(BufferedSpi &serial_spi, const char *delimiter, int buffer_size, int timeout) :
-    _serial_spi(&serial_spi),
-    _buffer_size(buffer_size), _in_prev(0), _oobs(NULL)
-{
-    _buffer = new char[buffer_size];
-    setTimeout(timeout);
-    setDelimiter(delimiter);
-}
-
-
-// getc/putc handling with timeouts
-int ATParser::putc(char c)
-{
-    return _serial_spi->putc(c);
-}
-
-int ATParser::getc()
-{
-    return _serial_spi->getc();
-}
-
-void ATParser::flush()
-{
-    _bufferMutex.lock();
-    while (_serial_spi->readable()) {
-        _serial_spi->getc();
-    }
-    _bufferMutex.unlock();
-}
-
-// read/write handling with timeouts
-int ATParser::write(const char *data, int size_of_data, int size_in_buff)
-{
-    int i = 0;
-    _bufferMutex.lock();
-    debug_if(dbg_on, "ATParser write: %d BYTES\r\n", size_of_data);
-    debug_if(AT_DATA_PRINT, "ATParser write: (ASCII) ", size_of_data);
-    for (; i < size_of_data; i++) {
-        debug_if(AT_DATA_PRINT, "%c", data[i]);
-        if (putc(data[i]) < 0) {
-            debug_if(AT_DATA_PRINT, "\r\n");
-            _bufferMutex.unlock();
-            return -1;
-        }
-    }
-    debug_if(AT_DATA_PRINT, "\r\n");
-
-    _serial_spi->buffsend(size_of_data + size_in_buff);
-    _bufferMutex.unlock();
-
-    return (size_of_data + size_in_buff);
-}
-
-int ATParser::read(char *data)
-{
-    int readsize;
-    int i = 0;
-
-    _bufferMutex.lock();
-
-    //this->flush();
-    if (!_serial_spi->readable()) {
-        readsize = _serial_spi->read();
-    } else {
-        debug_if(dbg_on, "Pending data when reading from WIFI\r\n");
-        return -1;
-    }
-
-    debug_if(dbg_on, "ATParser read: %d data avail in SPI\r\n", readsize);
-
-    if (readsize < 0) {
-        _bufferMutex.unlock();
-        return -1;
-    }
-
-    for (i = 0 ; i < readsize; i++) {
-        int c = getc();
-        if (c < 0) {
-            _bufferMutex.unlock();
-            return -1;
-        }
-        data[i] = c;
-    }
-
-#if AT_HEXA_DATA
-    debug_if(AT_DATA_PRINT, "ATParser read: (HEXA) ");
-    for (i = 0; i < readsize; i++) {
-        debug_if(AT_DATA_PRINT, "%2X ", data[i]);
-        if ((i + 1) % 20 == 0) {
-            debug_if(AT_DATA_PRINT, "\r\n");
-        }
-    }
-    debug_if(AT_DATA_PRINT, "\r\n");
-#endif
-    debug_if(AT_DATA_PRINT, "ATParser read: (ASCII) ");
-    for (i = 0; i < readsize; i++) {
-        debug_if(AT_DATA_PRINT, "%c", data[i]);
-    }
-    debug_if(AT_DATA_PRINT, "\r\n");
-
-    _bufferMutex.unlock();
-
-    return (readsize);
-}
-
-// printf/scanf handling
-int ATParser::vprintf(const char *format, va_list args)
-{
-    _bufferMutex.lock();
-    if (vsprintf(_buffer, format, args) < 0) {
-        _bufferMutex.unlock();
-        return false;
-    }
-
-    int i = 0;
-    for (; _buffer[i]; i++) {
-        if (putc(_buffer[i]) < 0) {
-            _bufferMutex.unlock();
-            return -1;
-        }
-    }
-    _bufferMutex.unlock();
-
-    return i;
-}
-
-int ATParser::vscanf(const char *format, va_list args)
-{
-    // Since format is const, we need to copy it into our buffer to
-    // add the line's null terminator and clobber value-matches with asterisks.
-    //
-    // We just use the beginning of the buffer to avoid unnecessary allocations.
-    int i = 0;
-    int offset = 0;
-
-    _bufferMutex.lock();
-
-    while (format[i]) {
-        if (format[i] == '%' && format[i + 1] != '%' && format[i + 1] != '*') {
-            _buffer[offset++] = '%';
-            _buffer[offset++] = '*';
-            i++;
-        } else {
-            _buffer[offset++] = format[i++];
-        }
-    }
-
-    // Scanf has very poor support for catching errors
-    // fortunately, we can abuse the %n specifier to determine
-    // if the entire string was matched.
-    _buffer[offset++] = '%';
-    _buffer[offset++] = 'n';
-    _buffer[offset++] = 0;
-
-    // To workaround scanf's lack of error reporting, we actually
-    // make two passes. One checks the validity with the modified
-    // format string that only stores the matched characters (%n).
-    // The other reads in the actual matched values.
-    //
-    // We keep trying the match until we succeed or some other error
-    // derails us.
-    int j = 0;
-
-    while (true) {
-        // Ran out of space
-        if (j + 1 >= _buffer_size - offset) {
-            _bufferMutex.unlock();
-            return false;
-        }
-        // Recieve next character
-        int c = getc();
-        if (c < 0) {
-            _bufferMutex.unlock();
-            return -1;
-        }
-        _buffer[offset + j++] = c;
-        _buffer[offset + j] = 0;
-
-        // Check for match
-        int count = -1;
-        sscanf(_buffer + offset, _buffer, &count);
-
-        // We only succeed if all characters in the response are matched
-        if (count == j) {
-            // Store the found results
-            vsscanf(_buffer + offset, format, args);
-            _bufferMutex.unlock();
-            return j;
-        }
-    }
-}
-
-
-// Command parsing with line handling
-bool ATParser::vsend(const char *command, va_list args)
-{
-    int i = 0, j = 0;
-    _bufferMutex.lock();
-    // Create and send command
-    if (vsprintf(_buffer, command, args) < 0) {
-        _bufferMutex.unlock();
-        return false;
-    }
-    /* get buffer length */
-    for (i = 0; _buffer[i]; i++) {
-    }
-
-    for (j = 0; _delimiter[j]; j++) {
-        _buffer[i + j] = _delimiter[j];
-    }
-    _buffer[i + j] = 0; // only to get a clean debug log
-
-    bool ret = !(_serial_spi->buffwrite(_buffer, i + j) < 0);
-
-    debug_if(AT_COMMAND_PRINT, "AT> %s\n", _buffer);
-    _bufferMutex.unlock();
-    return ret;
-}
-
-bool ATParser::vrecv(const char *response, va_list args)
-{
-    _bufferMutex.lock();
-
-    if (!_serial_spi->readable()) {
-        // debug_if(dbg_on, "NO DATA, read again\r\n");
-        if (_serial_spi->read() < 0) {
-            return false;
-        }
-    }
-    // else {
-    //      debug_if(dbg_on, "Pending data\r\n");
-    // }
-
-restart:
-    _aborted = false;
-    // Iterate through each line in the expected response
-    while (response[0]) {
-        // Since response is const, we need to copy it into our buffer to
-        // add the line's null terminator and clobber value-matches with asterisks.
-        //
-        // We just use the beginning of the buffer to avoid unnecessary allocations.
-        int i = 0;
-        int offset = 0;
-        bool whole_line_wanted = false;
-
-        while (response[i]) {
-            if (response[i] == '%' && response[i + 1] != '%' && response[i + 1] != '*') {
-                _buffer[offset++] = '%';
-                _buffer[offset++] = '*';
-                i++;
-            } else {
-                _buffer[offset++] = response[i++];
-                // Find linebreaks, taking care not to be fooled if they're in a %[^\n] conversion specification
-                if (response[i - 1] == '\n' && !(i >= 3 && response[i - 3] == '[' && response[i - 2] == '^')) {
-                    whole_line_wanted = true;
-                    break;
-                }
-            }
-        }
-
-        // Scanf has very poor support for catching errors
-        // fortunately, we can abuse the %n specifier to determine
-        // if the entire string was matched.
-        _buffer[offset++] = '%';
-        _buffer[offset++] = 'n';
-        _buffer[offset++] = 0;
-
-        // debug_if(dbg_on, "ATParser vrecv: AT? ====%s====\n", _buffer);
-        // To workaround scanf's lack of error reporting, we actually
-        // make two passes. One checks the validity with the modified
-        // format string that only stores the matched characters (%n).
-        // The other reads in the actual matched values.
-        //
-        // We keep trying the match until we succeed or some other error
-        // derails us.
-        int j = 0;
-
-        while (true) {
-            // Recieve next character
-            int c = getc();
-            if (c < 0) {
-                debug_if(dbg_on, "AT(Timeout)\n");
-                _bufferMutex.unlock();
-                return false;
-            }
-
-            // debug_if(AT_DATA_PRINT, "%2X ", c);
-
-            _buffer[offset + j++] = c;
-            _buffer[offset + j] = 0;
-
-            // Check for oob data
-            for (struct oob *oob = _oobs; oob; oob = oob->next) {
-                if ((unsigned)j == oob->len && memcmp(
-                            oob->prefix, _buffer + offset, oob->len) == 0) {
-                    debug_if(dbg_on, "AT! %s\n", oob->prefix);
-                    oob->cb();
-
-                    if (_aborted) {
-                        debug_if(dbg_on, "AT(Aborted)\n");
-                        _bufferMutex.unlock();
-                        return false;
-                    }
-                    // oob may have corrupted non-reentrant buffer,
-                    // so we need to set it up again
-                    goto restart;
-                }
-            }
-
-            // Check for match
-            int count = -1;
-            if (whole_line_wanted && c != '\n') {
-                // Don't attempt scanning until we get delimiter if they included it in format
-                // This allows recv("Foo: %s\n") to work, and not match with just the first character of a string
-                // (scanf does not itself match whitespace in its format string, so \n is not significant to it)
-            } else {
-                sscanf(_buffer + offset, _buffer, &count);
-            }
-
-            // We only succeed if all characters in the response are matched
-            if (count == j) {
-                debug_if(AT_COMMAND_PRINT, "AT= ====%s====\n", _buffer + offset);
-                // Reuse the front end of the buffer
-                memcpy(_buffer, response, i);
-                _buffer[i] = 0;
-
-                // Store the found results
-                vsscanf(_buffer + offset, _buffer, args);
-
-                // Jump to next line and continue parsing
-                response += i;
-                break;
-            }
-
-            // Clear the buffer when we hit a newline or ran out of space
-            // running out of space usually means we ran into binary data
-            if ((c == '\n')) {
-                // debug_if(dbg_on, "New line AT<<< %s", _buffer+offset);
-                j = 0;
-            }
-            if ((j + 1 >= (_buffer_size - offset))) {
-
-                debug_if(dbg_on, "Out of space AT<<< %s, j=%d", _buffer + offset, j);
-                j = 0;
-            }
-        }
-    }
-
-    _bufferMutex.unlock();
-
-    return true;
-}
-
-
-// Mapping to vararg functions
-int ATParser::printf(const char *format, ...)
-{
-    va_list args;
-    va_start(args, format);
-    int res = vprintf(format, args);
-    va_end(args);
-    return res;
-}
-
-int ATParser::scanf(const char *format, ...)
-{
-    va_list args;
-    va_start(args, format);
-    int res = vscanf(format, args);
-    va_end(args);
-    return res;
-}
-
-bool ATParser::send(const char *command, ...)
-{
-    va_list args;
-    va_start(args, command);
-    bool res = vsend(command, args);
-    va_end(args);
-    return res;
-}
-
-bool ATParser::recv(const char *response, ...)
-{
-    va_list args;
-    va_start(args, response);
-    bool res = vrecv(response, args);
-    va_end(args);
-    return res;
-}
-
-
-// oob registration
-void ATParser::oob(const char *prefix, Callback<void()> cb)
-{
-    struct oob *oob = new struct oob;
-    oob->len = strlen(prefix);
-    oob->prefix = prefix;
-    oob->cb = cb;
-    oob->next = _oobs;
-    _oobs = oob;
-}
-
-void ATParser::abort()
-{
-    _aborted = true;
-}
-
-
-
--- a/drivers/network/WIFI_ISM43362/ISM43362/ATParser/ATParser.h	Sun Dec 16 13:53:42 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,246 +0,0 @@
-/* Copyright (c) 2015 ARM Limited
- *
- * 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.
- *
- * @section DESCRIPTION
- *
- * Parser for the AT command syntax
- *
- */
-#ifndef AT_PARSER_H
-#define AT_PARSER_H
-
-#include "mbed.h"
-#include <cstdarg>
-#include <vector>
-#include "BufferedSpi.h"
-#include "Callback.h"
-
-#define DEFAULT_SPI_TIMEOUT 60000 /* 1 minute */
-
-/**
-* Parser class for parsing AT commands
-*
-* Here are some examples:
-* @code
-* ATParser at = ATParser(serial, "\r\n");
-* int value;
-* char buffer[100];
-*
-* at.send("AT") && at.recv("OK");
-* at.send("AT+CWMODE=%d", 3) && at.recv("OK");
-* at.send("AT+CWMODE?") && at.recv("+CWMODE:%d\r\nOK", &value);
-* at.recv("+IPD,%d:", &value);
-* at.read(buffer, value);
-* at.recv("OK");
-* @endcode
-*/
-class ATParser {
-private:
-    // Serial information
-    BufferedSpi *_serial_spi;
-    int _buffer_size;
-    char *_buffer;
-    Mutex _bufferMutex;
-
-    // Parsing information
-    const char *_delimiter;
-    int _delim_size;
-    char _in_prev;
-    volatile bool _aborted;
-
-    struct oob {
-        unsigned len;
-        const char *prefix;
-        mbed::Callback<void()> cb;
-        oob *next;
-    };
-    oob *_oobs;
-
-public:
-    /**
-    * Constructor
-    *
-    * @param serial spi interface to use for AT commands
-    * @param buffer_size size of internal buffer for transaction
-    * @param timeout timeout of the connection
-    * @param delimiter string of characters to use as line delimiters
-    */
-    ATParser(BufferedSpi &serial_spi, const char *delimiter = "\r\n", int buffer_size = 1440, int timeout = DEFAULT_SPI_TIMEOUT);
-
-    /**
-    * Destructor
-    */
-    ~ATParser()
-    {
-        while (_oobs) {
-            struct oob *oob = _oobs;
-            _oobs = oob->next;
-            delete oob;
-        }
-        delete[] _buffer;
-    }
-
-    /**
-    * Allows timeout to be changed between commands
-    *
-    * @param timeout timeout of the connection
-    */
-    void setTimeout(int timeout)
-    {
-        _serial_spi->setTimeout(timeout);
-    }
-
-    /**
-    * Sets string of characters to use as line delimiters
-    *
-    * @param delimiter string of characters to use as line delimiters
-    */
-    void setDelimiter(const char *delimiter)
-    {
-        _delimiter = delimiter;
-        _delim_size = strlen(delimiter);
-    }
-
-    /**
-     * Sends an AT command
-     *
-     * Sends a formatted command using printf style formatting
-     * @see printf
-     *
-     * @param command printf-like format string of command to send which
-     *                is appended with a newline
-     * @param ... all printf-like arguments to insert into command
-     * @return true only if command is successfully sent
-     */
-    bool send(const char *command, ...);
-
-    bool vsend(const char *command, va_list args);
-
-    /**
-     * Receive an AT response
-     *
-     * Receives a formatted response using scanf style formatting
-     * @see scanf
-     *
-     * Responses are parsed line at a time.
-     * Any received data that does not match the response is ignored until
-     * a timeout occurs.
-     *
-     * @param response scanf-like format string of response to expect
-     * @param ... all scanf-like arguments to extract from response
-     * @return true only if response is successfully matched
-     */
-    bool recv(const char *response, ...);
-    bool vrecv(const char *response, va_list args);
-
-
-    /**
-     * Write a single byte to the underlying stream
-     *
-     * @param c The byte to write
-     * @return The byte that was written or -1 during a timeout
-     */
-    int putc(char c);
-
-    /**
-     * Get a single byte from the underlying stream
-     *
-     * @return The byte that was read or -1 during a timeout
-     */
-    int getc();
-
-    /**
-     * Write an array of bytes to the underlying stream
-     * assuming the header of the command is already in _txbuffer
-     *
-     * @param data the array of bytes to write
-     * @param size_of_data number of bytes in data array
-     * @param size_in_buff number of bytes already in the internal buff
-     * @return number of bytes written or -1 on failure
-     */
-    int write(const char *data, int size_of_data, int size_in_buff);
-
-    /**
-     * Read an array of bytes from the underlying stream
-     *
-     * @param data the destination for the read bytes
-     * @param size number of bytes to read
-     * @return number of bytes read or -1 on failure
-     */
-    int read(char *data);
-
-    /**
-     * Direct printf to underlying stream
-     * @see printf
-     *
-     * @param format format string to pass to printf
-     * @param ... arguments to printf
-     * @return number of bytes written or -1 on failure
-     */
-    int printf(const char *format, ...);
-    int vprintf(const char *format, va_list args);
-
-    /**
-    * Direct scanf on underlying stream
-    * @see ::scanf
-    *
-    * @param format format string to pass to scanf
-    * @param ... arguments to scanf
-    * @return number of bytes read or -1 on failure
-    */
-    int scanf(const char *format, ...);
-
-    int vscanf(const char *format, va_list args);
-
-    /**
-     * Attach a callback for out-of-band data
-     *
-     * @param prefix string on when to initiate callback
-     * @param func callback to call when string is read
-     * @note out-of-band data is only processed during a scanf call
-     */
-    void oob(const char *prefix, mbed::Callback<void()> func);
-
-    /**
-     * Flushes the underlying stream
-     */
-    void flush();
-
-    /**
-     * Abort current recv
-     *
-     * Can be called from oob handler to interrupt the current
-     * recv operation.
-     */
-    void abort();
-
-    /**
-    * Process out-of-band data
-    *
-    * Process out-of-band data in the receive buffer. This function
-    * returns immediately if there is no data to process.
-    *
-    * @return true if oob data processed, false otherwise
-    */
-    bool process_oob(void);
-    /**
-    * Get buffer_size
-    */
-    int get_size(void)
-    {
-        return _buffer_size;
-    }
-
-};
-#endif
--- a/drivers/network/WIFI_ISM43362/ISM43362/ATParser/BufferedSpi/Buffer/MyBuffer.cpp	Sun Dec 16 13:53:42 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-
-/**
- * @file    Buffer.cpp
- * @brief   Software Buffer - Templated Ring Buffer for most data types
- * @author  sam grove
- * @version 1.0
- * @see
- *
- * Copyright (c) 2013
- *
- * 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.
- */
-
-#include "MyBuffer.h"
-
-template <class T>
-MyBuffer<T>::MyBuffer(uint32_t size)
-{
-    _buf = new T [size];
-    _size = size;
-    clear();
-
-    return;
-}
-
-template <class T>
-MyBuffer<T>::~MyBuffer()
-{
-    delete [] _buf;
-
-    return;
-}
-
-template <class T>
-uint32_t MyBuffer<T>::getSize()
-{
-    return this->_size;
-}
-
-template <class T>
-uint32_t MyBuffer<T>::getNbAvailable()
-{
-    if (_wloc >= _rloc) {
-        return (_wloc - _rloc);
-    } else {
-        return (_size - _rloc + _wloc);
-    }
-}
-
-template <class T>
-void MyBuffer<T>::clear(void)
-{
-    _wloc = 0;
-    _rloc = 0;
-    memset(_buf, 0, _size);
-
-    return;
-}
-
-template <class T>
-uint32_t MyBuffer<T>::peek(char c)
-{
-    return 1;
-}
-
-// make the linker aware of some possible types
-template class MyBuffer<uint8_t>;
-template class MyBuffer<int8_t>;
-template class MyBuffer<uint16_t>;
-template class MyBuffer<int16_t>;
-template class MyBuffer<uint32_t>;
-template class MyBuffer<int32_t>;
-template class MyBuffer<uint64_t>;
-template class MyBuffer<int64_t>;
-template class MyBuffer<char>;
-template class MyBuffer<wchar_t>;
--- a/drivers/network/WIFI_ISM43362/ISM43362/ATParser/BufferedSpi/Buffer/MyBuffer.h	Sun Dec 16 13:53:42 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-
-/**
- * @file    Buffer.h
- * @brief   Software Buffer - Templated Ring Buffer for most data types
- * @author  sam grove
- * @version 1.0
- * @see
- *
- * Copyright (c) 2013
- *
- * 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 MYBUFFER_H
-#define MYBUFFER_H
-
-#include <stdint.h>
-#include <string.h>
-
-/** A templated software ring buffer
- *
- * Example:
- * @code
- *  #include "mbed.h"
- *  #include "MyBuffer.h"
- *
- *  MyBuffer <char> buf;
- *
- *  int main()
- *  {
- *      buf = 'a';
- *      buf.put('b');
- *      char *head = buf.head();
- *      puts(head);
- *
- *      char whats_in_there[2] = {0};
- *      int pos = 0;
- *
- *      while(buf.available())
- *      {
- *          whats_in_there[pos++] = buf;
- *      }
- *      printf("%c %c\n", whats_in_there[0], whats_in_there[1]);
- *      buf.clear();
- *      error("done\n\n\n");
- *  }
- * @endcode
- */
-
-template <typename T>
-class MyBuffer {
-private:
-    T   *_buf;
-    volatile uint32_t   _wloc;
-    volatile uint32_t   _rloc;
-    uint32_t            _size;
-
-public:
-    /** Create a Buffer and allocate memory for it
-     *  @param size The size of the buffer
-     */
-    MyBuffer(uint32_t size = 0x100);
-
-    /** Get the size of the ring buffer
-     * @return the size of the ring buffer
-     */
-    uint32_t getSize();
-    uint32_t getNbAvailable();
-
-    /** Destry a Buffer and release it's allocated memory
-     */
-    ~MyBuffer();
-
-    /** Add a data element into the buffer
-     *  @param data Something to add to the buffer
-     */
-    void put(T data);
-
-    /** Remove a data element from the buffer
-     *  @return Pull the oldest element from the buffer
-     */
-    T get(void);
-
-    /** Get the address to the head of the buffer
-     *  @return The address of element 0 in the buffer
-     */
-    T *head(void);
-
-    /** Reset the buffer to 0. Useful if using head() to parse packeted data
-     */
-    void clear(void);
-
-    /** Determine if anything is readable in the buffer
-     *  @return 1 if something can be read, 0 otherwise
-     */
-    uint32_t available(void);
-
-    /** Overloaded operator for writing to the buffer
-     *  @param data Something to put in the buffer
-     *  @return
-     */
-    MyBuffer &operator= (T data)
-    {
-        put(data);
-        return *this;
-    }
-
-    /** Overloaded operator for reading from the buffer
-     *  @return Pull the oldest element from the buffer
-     */
-    operator int(void)
-    {
-        return get();
-    }
-
-    uint32_t peek(char c);
-
-};
-
-template <class T>
-inline void MyBuffer<T>::put(T data)
-{
-    _buf[_wloc++] = data;
-    _wloc %= (_size - 1);
-
-    return;
-}
-
-template <class T>
-inline T MyBuffer<T>::get(void)
-{
-    T data_pos = _buf[_rloc++];
-    _rloc %= (_size - 1);
-
-    return data_pos;
-}
-
-template <class T>
-inline T *MyBuffer<T>::head(void)
-{
-    T *data_pos = &_buf[0];
-
-    return data_pos;
-}
-
-template <class T>
-inline uint32_t MyBuffer<T>::available(void)
-{
-    return (_wloc == _rloc) ? 0 : 1;
-    //return 1;
-}
-
-#endif
-
--- a/drivers/network/WIFI_ISM43362/ISM43362/ATParser/BufferedSpi/BufferedPrint.c	Sun Dec 16 13:53:42 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2014-2015 ARM Limited. All rights reserved.
- * SPDX-License-Identifier: Apache-2.0
- * 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.
- */
-
-#include <stdarg.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "mbed_error.h"
-
-size_t BufferedSpiThunk(void *buf_serial, const void *s, size_t length);
-
-int BufferedPrintfC(void *stream, int size, const char* format, va_list arg)
-{
-    int r;
-    char buffer[512];
-    if (size >= 512) {
-        return -1;
-    }
-    memset(buffer, 0, size);
-    r = vsprintf(buffer, format, arg);
-    // this may not hit the heap but should alert the user anyways
-    if(r > (int32_t) size) {
-        error("%s %d buffer overwrite (max_buf_size: %d exceeded: %d)!\r\n", __FILE__, __LINE__, size, r);
-        return 0;
-    }
-    if ( r > 0 ) {
-        BufferedSpiThunk(stream, buffer, r);
-    }
-    return r;
-}
--- a/drivers/network/WIFI_ISM43362/ISM43362/ATParser/BufferedSpi/BufferedSpi.cpp	Sun Dec 16 13:53:42 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,333 +0,0 @@
-/**
- * @file    BufferedSpi.cpp
- * @brief   Software Buffer - Extends mbed SPI functionallity
- * @author  Armelle Duboc
- * @version 1.0
- * @see
- *
- * Copyright (c) STMicroelectronics 2017
- *
- * 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.
- */
-
-#include "BufferedSpi.h"
-#include <stdarg.h>
-#include "mbed_debug.h"
-#include "mbed_error.h"
-
-// change to true to add few SPI debug lines
-#define local_debug false
-
-extern "C" int BufferedPrintfC(void *stream, int size, const char *format, va_list arg);
-
-void BufferedSpi::DatareadyRising(void)
-{
-    if (_cmddata_rdy_rising_event == 1) {
-        _cmddata_rdy_rising_event = 0;
-    }
-}
-
-int BufferedSpi::wait_cmddata_rdy_high(void)
-{
-    Timer timer;
-    timer.start();
-
-    /* wait for dataready = 1 */
-    while (dataready.read() == 0) {
-        if (timer.read_ms() > _timeout) {
-            debug_if(local_debug, "ERROR: SPI write timeout\r\n");
-            return -1;
-        }
-    }
-
-    _cmddata_rdy_rising_event = 1;
-
-    return 0;
-}
-
-int BufferedSpi::wait_cmddata_rdy_rising_event(void)
-{
-    Timer timer;
-    timer.start();
-
-    while (_cmddata_rdy_rising_event == 1) {
-        if (timer.read_ms() > _timeout) {
-            _cmddata_rdy_rising_event = 0;
-            if (dataready.read() == 1) {
-                debug_if(local_debug, "ERROR: We missed rising event !! (timemout=%d)\r\n", _timeout);
-            }
-            debug_if(local_debug, "ERROR: SPI read timeout\r\n");
-            return -1;
-        }
-    }
-
-    return 0;
-}
-
-BufferedSpi::BufferedSpi(PinName mosi, PinName miso, PinName sclk, PinName _nss, PinName _datareadypin,
-                         uint32_t buf_size, uint32_t tx_multiple, const char *name)
-    : SPI(mosi, miso, sclk, NC), nss(_nss),  _txbuf((uint32_t)(tx_multiple * buf_size)), _rxbuf(buf_size), dataready(_datareadypin)
-{
-    this->_buf_size = buf_size;
-    this->_tx_multiple = tx_multiple;
-    this->_sigio_event = 0;
-
-    _datareadyInt = new InterruptIn(_datareadypin);
-    _datareadyInt->rise(callback(this, &BufferedSpi::DatareadyRising));
-
-    _cmddata_rdy_rising_event = 1;
-
-    return;
-}
-
-BufferedSpi::~BufferedSpi(void)
-{
-
-    return;
-}
-
-void BufferedSpi::frequency(int hz)
-{
-    SPI::frequency(hz);
-}
-
-void BufferedSpi::format(int bits, int mode)
-{
-    SPI::format(bits, mode);
-}
-
-void BufferedSpi::disable_nss()
-{
-    nss = 1;
-    wait_us(15);
-}
-
-void BufferedSpi::enable_nss()
-{
-    nss = 0;
-    wait_us(15);
-}
-
-int BufferedSpi::readable(void)
-{
-    return _rxbuf.available();  // note: look if things are in the buffer
-}
-
-int BufferedSpi::writeable(void)
-{
-    return 1;   // buffer allows overwriting by design, always true
-}
-
-int BufferedSpi::getc(void)
-{
-    if (_rxbuf.available()) {
-        return _rxbuf;
-    } else {
-        return -1;
-    }
-}
-
-int BufferedSpi::putc(int c)
-{
-    _txbuf = (char)c;
-
-    return c;
-}
-
-void BufferedSpi::flush_txbuf(void)
-{
-    _txbuf.clear();
-}
-
-int BufferedSpi::puts(const char *s)
-{
-    if (s != NULL) {
-        const char *ptr = s;
-
-        while (*(ptr) != 0) {
-            _txbuf = *(ptr++);
-        }
-        _txbuf = '\n';  // done per puts definition
-        BufferedSpi::txIrq();                // only write to hardware in one place
-        return (ptr - s) + 1;
-    }
-    return 0;
-}
-
-extern "C" size_t BufferedSpiThunk(void *buf_spi, const void *s, size_t length)
-{
-    BufferedSpi *buffered_spi = (BufferedSpi *)buf_spi;
-    return buffered_spi->buffwrite(s, length);
-}
-
-int BufferedSpi::printf(const char *format, ...)
-{
-    va_list arg;
-    va_start(arg, format);
-    int r = BufferedPrintfC((void *)this, this->_buf_size, format, arg);
-    va_end(arg);
-    return r;
-}
-
-ssize_t BufferedSpi::buffwrite(const void *s, size_t length)
-{
-    /* flush buffer from previous message */
-    this->flush_txbuf();
-
-    if (wait_cmddata_rdy_high() < 0) {
-        debug_if(local_debug, "BufferedSpi::buffwrite timeout (%d)\r\n", _timeout);
-        return -1;
-    }
-
-    this->enable_nss();
-
-    if (s != NULL && length > 0) {
-        /* 1st fill _txbuf */
-        const char *ptr = (const char *)s;
-        const char *end = ptr + length;
-
-        while (ptr != end) {
-            _txbuf = *(ptr++);
-        }
-        if (length & 1) { /* padding to send the last char */
-            _txbuf = '\n';
-            length++;
-        }
-
-        /* 2nd write in SPI */
-        BufferedSpi::txIrq();                // only write to hardware in one place
-
-        this->disable_nss();
-        return ptr - (const char *)s;
-    }
-    this->disable_nss();
-
-    return 0;
-}
-
-ssize_t BufferedSpi::buffsend(size_t length)
-{
-    /* wait for dataready = 1 */
-    if (wait_cmddata_rdy_high() < 0) {
-        debug_if(local_debug, "BufferedSpi::buffsend timeout (%d)\r\n", _timeout);
-        return -1;
-    }
-
-    this->enable_nss();
-
-    /* _txbuffer is already filled with data to send */
-    /* check if _txbuffer needs padding to send the last char */
-    if (length & 1) {
-        _txbuf = '\n';
-        length++;
-    }
-    BufferedSpi::txIrq();                // only write to hardware in one place
-
-    this->disable_nss();
-
-    return length;
-}
-
-ssize_t BufferedSpi::read()
-{
-    return this->read(0);
-}
-
-ssize_t BufferedSpi::read(uint32_t max)
-{
-    uint32_t len = 0;
-    uint8_t FirstRemoved = 1;
-    int tmp;
-
-    disable_nss();
-
-    /* wait for data ready is up */
-    if (wait_cmddata_rdy_rising_event() != 0) {
-        debug_if(local_debug, "BufferedSpi::read timeout (%d)\r\n", _timeout);
-        return -1;
-    }
-
-    enable_nss();
-    while (dataready.read() == 1 && (len < (_buf_size - 2))) {
-        tmp = SPI::write(0xAA);  // dummy write to receive 2 bytes
-
-        if (!((len == 0) && (tmp == 0x0A0D) && (FirstRemoved))) {
-            /* do not take into account the 2 firts \r \n char in the buffer */
-            if ((max == 0) || (len < max)) {
-                _rxbuf = (char)(tmp & 0x00FF);
-                _rxbuf = (char)((tmp >> 8) & 0xFF);
-                len += 2;
-            }
-        } else {
-            FirstRemoved = 0;
-        }
-    }
-    disable_nss();
-
-    if (len >= _buf_size) {
-        debug_if(local_debug, "firmware ERROR ES_WIFI_ERROR_STUFFING_FOREVER\r\n");
-        return -1;
-    }
-
-    debug_if(local_debug, "SPI READ %d BYTES\r\n", len);
-
-    return len;
-}
-
-void BufferedSpi::txIrq(void)
-{
-    /* write everything available in the _txbuffer */
-    int value = 0;
-    int dbg_cnt = 0;
-    while (_txbuf.available() && (_txbuf.getNbAvailable() > 0)) {
-        value = _txbuf.get();
-        if (_txbuf.available() && ((_txbuf.getNbAvailable() % 2) != 0)) {
-            value |= ((_txbuf.get() << 8) & 0XFF00);
-            SPI::write(value);
-            dbg_cnt++;
-        }
-    }
-    debug_if(local_debug, "SPI Sent %d BYTES\r\n", 2 * dbg_cnt);
-    // disable the TX interrupt when there is nothing left to send
-    BufferedSpi::attach(NULL, BufferedSpi::TxIrq);
-    // trigger callback if necessary
-    if (_cbs[TxIrq]) {
-        _cbs[TxIrq]();
-    }
-    return;
-}
-
-void BufferedSpi::prime(void)
-{
-    BufferedSpi::txIrq();                // only write to hardware in one place
-    return;
-}
-
-void BufferedSpi::attach(Callback<void()> func, IrqType type)
-{
-    _cbs[type] = func;
-}
-
-void BufferedSpi::sigio(Callback<void()> func)
-{
-    core_util_critical_section_enter();
-    _sigio_cb = func;
-    if (_sigio_cb) {
-        if (_sigio_event == 1) {
-            _sigio_cb();
-            _sigio_event = 0;
-        }
-    }
-    core_util_critical_section_exit();
-}
-
--- a/drivers/network/WIFI_ISM43362/ISM43362/ATParser/BufferedSpi/BufferedSpi.h	Sun Dec 16 13:53:42 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,234 +0,0 @@
-
-/**
- * @file    BufferedSpi.h
- * @brief   Software Buffer - Extends mbed SPI functionallity
- * @author  Armelle Duboc
- * @version 1.0
- * @see
- *
- * Copyright (c) STMicroelectronics 2017
- *
- * 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 BUFFEREDSPI_H
-#define BUFFEREDSPI_H
-
-#include "mbed.h"
-#include "MyBuffer.h"
-
-/** A spi port (SPI) for communication with wifi device
- *
- * Can be used for Full Duplex communication, or Simplex by specifying
- * one pin as NC (Not Connected)
- *
- * Example:
- * @code
- *  #include "mbed.h"
- *  #include "BufferedSerial.h"
- *
- *  BufferedSerial pc(USBTX, USBRX);
- *
- *  int main()
- *  {
- *      while(1)
- *      {
- *          Timer s;
- *
- *          s.start();
- *          pc.printf("Hello World - buffered\n");
- *          int buffered_time = s.read_us();
- *          wait(0.1f); // give time for the buffer to empty
- *
- *          s.reset();
- *          printf("Hello World - blocking\n");
- *          int polled_time = s.read_us();
- *          s.stop();
- *          wait(0.1f); // give time for the buffer to empty
- *
- *          pc.printf("printf buffered took %d us\n", buffered_time);
- *          pc.printf("printf blocking took %d us\n", polled_time);
- *          wait(0.5f);
- *      }
- *  }
- * @endcode
- */
-
-/**
- *  @class BufferedSpi
- *  @brief Software buffers and interrupt driven tx and rx for Serial
- */
-class BufferedSpi : public SPI {
-private:
-    DigitalOut    nss;
-    MyBuffer <char> _txbuf;
-    uint32_t      _buf_size;
-    uint32_t      _tx_multiple;
-    volatile int _timeout;
-    void txIrq(void);
-    void prime(void);
-
-    InterruptIn *_datareadyInt;
-    volatile int _cmddata_rdy_rising_event;
-    void DatareadyRising(void);
-    int wait_cmddata_rdy_rising_event(void);
-    int wait_cmddata_rdy_high(void);
-
-
-    Callback<void()> _cbs[2];
-
-    Callback<void()> _sigio_cb;
-    uint8_t          _sigio_event;
-
-public:
-    MyBuffer <char> _rxbuf;
-    DigitalIn dataready;
-    enum IrqType {
-        RxIrq = 0,
-        TxIrq,
-
-        IrqCnt
-    };
-
-    /** Create a BufferedSpi Port, connected to the specified transmit and receive pins
-     *  @param SPI mosi pin
-     *  @param SPI miso pin
-     *  @param SPI sclk pin
-     *  @param SPI nss pin
-     *  @param Dataready pin
-     *  @param buf_size printf() buffer size
-     *  @param tx_multiple amount of max printf() present in the internal ring buffer at one time
-     *  @param name optional name
-    */
-    BufferedSpi(PinName mosi, PinName miso, PinName sclk, PinName nss, PinName datareadypin, uint32_t buf_size = 2500, uint32_t tx_multiple = 1, const char *name = NULL);
-
-    /** Destroy a BufferedSpi Port
-     */
-    virtual ~BufferedSpi(void);
-
-    /** call to SPI frequency Function
-     */
-    virtual void frequency(int hz);
-
-    /** clear the transmit buffer
-     */
-    virtual void flush_txbuf(void);
-
-    /** call to SPI format function
-     */
-    virtual void format(int bits, int mode);
-
-    virtual void enable_nss(void);
-
-    virtual void disable_nss(void);
-
-    /** Check on how many bytes are in the rx buffer
-     *  @return 1 if something exists, 0 otherwise
-     */
-    virtual int readable(void);
-
-    /** Check to see if the tx buffer has room
-     *  @return 1 always has room and can overwrite previous content if too small / slow
-     */
-    virtual int writeable(void);
-
-    /** Get a single byte from the BufferedSpi Port.
-     *  Should check readable() before calling this.
-     *  @return A byte that came in on the SPI Port
-     */
-    virtual int getc(void);
-
-    /** Write a single byte to the BufferedSpi Port.
-     *  @param c The byte to write to the SPI Port
-     *  @return The byte that was written to the SPI Port Buffer
-     */
-    virtual int putc(int c);
-
-    /** Write a string to the BufferedSpi Port. Must be NULL terminated
-     *  @param s The string to write to the Spi Port
-     *  @return The number of bytes written to the Spi Port Buffer
-     */
-    virtual int puts(const char *s);
-
-    /** Write a formatted string to the BufferedSpi Port.
-     *  @param format The string + format specifiers to write to the Spi Port
-     *  @return The number of bytes written to the Spi Port Buffer
-     */
-    virtual int printf(const char *format, ...);
-
-    /** Write data to the Buffered Spi Port
-     *  @param s A pointer to data to send
-     *  @param length The amount of data being pointed to
-     *  @return The number of bytes written to the Spi Port Buffer
-     */
-    virtual ssize_t buffwrite(const void *s, std::size_t length);
-
-    /** Send datas to the Spi port that are already present
-     *  in the internal _txbuffer
-     *  @param length
-     *  @return the number of bytes written on the SPI port
-     */
-    virtual ssize_t buffsend(size_t length);
-
-    /** Read data from the Spi Port to the _rxbuf
-     *  @param max: optional. = max sieze of the input read
-     *  @return The number of bytes read from the SPI port and written to the _rxbuf
-     */
-    virtual ssize_t read();
-    virtual ssize_t read(uint32_t max);
-
-    /**
-    * Allows timeout to be changed between commands
-    *
-    * @param timeout timeout of the connection in ms
-    */
-    void setTimeout(int timeout)
-    {
-        /*  this is a safe guard timeout at SPI level in case module is stuck */
-        _timeout = timeout;
-    }
-
-    /** Register a callback once any data is ready for sockets
-     *  @param func     Function to call on state change
-     */
-    virtual void sigio(Callback<void()> func);
-
-    /** Attach a function to call whenever a serial interrupt is generated
-     *  @param func A pointer to a void function, or 0 to set as none
-     *  @param type Which serial interrupt to attach the member function to (Serial::RxIrq for receive, TxIrq for transmit buffer empty)
-     */
-    virtual void attach(Callback<void()> func, IrqType type = RxIrq);
-
-    /** Attach a member function to call whenever a serial interrupt is generated
-     *  @param obj pointer to the object to call the member function on
-     *  @param method pointer to the member function to call
-     *  @param type Which serial interrupt to attach the member function to (Serial::RxIrq for receive, TxIrq for transmit buffer empty)
-     */
-    template <typename T>
-    void attach(T *obj, void (T::*method)(), IrqType type = RxIrq)
-    {
-        attach(Callback<void()>(obj, method), type);
-    }
-
-    /** Attach a member function to call whenever a serial interrupt is generated
-     *  @param obj pointer to the object to call the member function on
-     *  @param method pointer to the member function to call
-     *  @param type Which serial interrupt to attach the member function to (Serial::RxIrq for receive, TxIrq for transmit buffer empty)
-     */
-    template <typename T>
-    void attach(T *obj, void (*method)(T *), IrqType type = RxIrq)
-    {
-        attach(Callback<void()>(obj, method), type);
-    }
-};
-#endif
--- a/drivers/network/WIFI_ISM43362/ISM43362/ISM43362.cpp	Sun Dec 16 13:53:42 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,699 +0,0 @@
-/* ISM43362 Example
-*
-* Copyright (c) STMicroelectronics 2018
- *
- * 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.
- */
-#include <string.h>
-#include "ISM43362.h"
-#include "mbed_debug.h"
-
-// activate / de-activate debug
-#define ism_debug 0
-
-ISM43362::ISM43362(PinName mosi, PinName miso, PinName sclk, PinName nss, PinName resetpin, PinName datareadypin, PinName wakeup, bool debug)
-    : _bufferspi(mosi, miso, sclk, nss, datareadypin),
-      _parser(_bufferspi),
-      _resetpin(resetpin),
-      _packets(0), _packets_end(&_packets)
-{
-    DigitalOut wakeup_pin(wakeup);
-    _bufferspi.format(16, 0); /* 16bits, ploarity low, phase 1Edge, master mode */
-    _bufferspi.frequency(20000000); /* up to 20 MHz */
-    _active_id = 0xFF;
-    _FwVersionId = 0;
-
-    _ism_debug = debug || ism_debug;
-    reset();
-}
-
-/**
-  * @brief  Parses and returns number from string.
-  * @param  ptr: pointer to string
-  * @param  cnt: pointer to the number of parsed digit
-  * @retval integer value.
-  */
-#define CHARISHEXNUM(x)                 (((x) >= '0' && (x) <= '9') || \
-                                         ((x) >= 'a' && (x) <= 'f') || \
-                                         ((x) >= 'A' && (x) <= 'F'))
-#define CHARISNUM(x)                    ((x) >= '0' && (x) <= '9')
-#define CHAR2NUM(x)                     ((x) - '0')
-
-
-extern "C" int32_t ParseNumber(char *ptr, uint8_t *cnt)
-{
-    uint8_t minus = 0, i = 0;
-    int32_t sum = 0;
-
-    if (*ptr == '-') {                                      /* Check for minus character */
-        minus = 1;
-        ptr++;
-        i++;
-    }
-    if (*ptr == 'C') {  /* input string from get_firmware_version is Cx.x.x.x */
-        ptr++;
-    }
-
-    while (CHARISNUM(*ptr) || (*ptr == '.')) { /* Parse number */
-        if (*ptr == '.') {
-            ptr++; // next char
-        } else {
-            sum = 10 * sum + CHAR2NUM(*ptr);
-            ptr++;
-            i++;
-        }
-    }
-
-    if (cnt != NULL) {                   /* Save number of characters used for number */
-        *cnt = i;
-    }
-    if (minus) {                         /* Minus detected */
-        return 0 - sum;
-    }
-    return sum;                          /* Return number */
-}
-
-uint32_t ISM43362::get_firmware_version(void)
-{
-    char tmp_buffer[250];
-    char *ptr, *ptr2;
-    char _fw_version[16];
-
-    /* Use %[^\n] instead of %s to allow having spaces in the string */
-    if (!(_parser.send("I?") && _parser.recv("%[^\n^\r]\r\n", tmp_buffer) && check_response())) {
-        debug_if(_ism_debug, "ISM43362: get_firmware_version is FAIL\r\n");
-        return 0;
-    }
-    debug_if(_ism_debug, "ISM43362: get_firmware_version = %s\r\n", tmp_buffer);
-
-    // Get the first version in the string
-    ptr = strtok((char *)tmp_buffer, ",");
-    ptr = strtok(NULL, ",");
-    ptr2 = strtok(NULL, ",");
-    if (ptr == NULL) {
-        debug_if(_ism_debug, "ISM43362: get_firmware_version decoding is FAIL\r\n");
-        return 0;
-    }
-    strncpy(_fw_version, ptr, ptr2 - ptr);
-    _FwVersionId = ParseNumber(_fw_version, NULL);
-
-    return _FwVersionId;
-}
-
-bool ISM43362::reset(void)
-{
-    char tmp_buffer[100];
-    debug_if(_ism_debug, "ISM43362: Reset Module\r\n");
-    _resetpin = 0;
-    wait_ms(10);
-    _resetpin = 1;
-    wait_ms(500);
-
-    /* Wait for prompt line : the string is "> ". */
-    /* As the space char is not detected by sscanf function in parser.recv, */
-    /* we need to use %[\n] */
-    if (!_parser.recv(">%[^\n]", tmp_buffer)) {
-        debug_if(_ism_debug, "ISM43362: Reset Module failed\r\n");
-        return false;
-    }
-    return true;
-}
-
-void ISM43362::print_rx_buff(void)
-{
-    char tmp[150] = {0};
-    uint16_t i = 0;
-    debug_if(_ism_debug, "ISM43362: ");
-    while (i  < 150) {
-        int c = _parser.getc();
-        if (c < 0) {
-            break;
-        }
-        tmp[i] = c;
-        debug_if(_ism_debug, "0x%2X ", c);
-        i++;
-    }
-    debug_if(_ism_debug, "\n");
-    debug_if(_ism_debug, "ISM43362: Buffer content =====%s=====\r\n", tmp);
-}
-
-/*  checks the standard OK response of the WIFI module, shouldbe:
- *  \r\nDATA\r\nOK\r\n>sp
- *  or
- *  \r\nERROR\r\nUSAGE\r\n>sp
- *  function returns true if OK, false otherwise. In case of error,
- *  print error content then flush buffer */
-bool ISM43362::check_response(void)
-{
-    char tmp_buffer[100];
-    if (!_parser.recv("OK\r\n")) {
-        print_rx_buff();
-        _parser.flush();
-        return false;
-    }
-
-    /*  Then we should get the prompt: "> " */
-    /* As the space char is not detected by sscanf function in parser.recv, */
-    /* we need to use %[\n] */
-    if (!_parser.recv(">%[^\n]", tmp_buffer)) {
-        debug_if(_ism_debug, "ISM43362: Missing prompt in WIFI resp\r\n");
-        print_rx_buff();
-        _parser.flush();
-        return false;
-    }
-
-    /*  Inventek module do stuffing / padding of data with 0x15,
-     *  in case buffer contains such */
-    while (1) {
-        int c = _parser.getc();
-        if (c == 0x15) {
-            // debug_if(_ism_debug, "ISM43362: Flush char 0x%x\n", c);
-            continue;
-        } else {
-            /*  How to put it back if needed ? */
-            break;
-        }
-    }
-    return true;
-}
-
-bool ISM43362::dhcp(bool enabled)
-{
-    return (_parser.send("C4=%d", enabled ? 1 : 0) && check_response());
-}
-
-int ISM43362::connect(const char *ap, const char *passPhrase, ism_security_t ap_sec)
-{
-    char tmp[256];
-
-    if (!(_parser.send("C1=%s", ap) && check_response())) {
-        return NSAPI_ERROR_PARAMETER;
-    }
-
-    if (!(_parser.send("C2=%s", passPhrase) && check_response())) {
-        return NSAPI_ERROR_PARAMETER;
-    }
-
-    /* Check security level is acceptable */
-    if (ap_sec > ISM_SECURITY_WPA_WPA2) {
-        debug_if(_ism_debug, "ISM43362: Unsupported security level %d\n", ap_sec);
-        return NSAPI_ERROR_UNSUPPORTED;
-    }
-
-    if (!(_parser.send("C3=%d", ap_sec) && check_response())) {
-        return NSAPI_ERROR_PARAMETER;
-    }
-
-    if (_parser.send("C0")) {
-        while (_parser.recv("%[^\n]\n", tmp)) {
-            if (strstr(tmp, "OK")) {
-                _parser.flush();
-                return NSAPI_ERROR_OK;
-            }
-            if (strstr(tmp, "JOIN")) {
-                if (strstr(tmp, "Failed")) {
-                    _parser.flush();
-                    return NSAPI_ERROR_AUTH_FAILURE;
-                }
-            }
-        }
-    }
-
-    return NSAPI_ERROR_NO_CONNECTION;
-}
-
-bool ISM43362::disconnect(void)
-{
-    return (_parser.send("CD") && check_response());
-}
-
-const char *ISM43362::getIPAddress(void)
-{
-    char tmp_ip_buffer[250];
-    char *ptr, *ptr2;
-
-    /* Use %[^\n] instead of %s to allow having spaces in the string */
-    if (!(_parser.send("C?")
-            && _parser.recv("%[^\n^\r]\r\n", tmp_ip_buffer)
-            && check_response())) {
-        debug_if(_ism_debug, "ISM43362: getIPAddress LINE KO: %s\n", tmp_ip_buffer);
-        return 0;
-    }
-
-    /* Get the IP address in the result */
-    /* TODO : check if the begining of the string is always = "eS-WiFi_AP_C47F51011231," */
-    ptr = strtok((char *)tmp_ip_buffer, ",");
-    ptr = strtok(NULL, ",");
-    ptr = strtok(NULL, ",");
-    ptr = strtok(NULL, ",");
-    ptr = strtok(NULL, ",");
-    ptr = strtok(NULL, ",");
-    ptr2 = strtok(NULL, ",");
-    if (ptr == NULL) {
-        return 0;
-    }
-    strncpy(_ip_buffer, ptr, ptr2 - ptr);
-
-    tmp_ip_buffer[59] = 0;
-    debug_if(_ism_debug, "ISM43362: receivedIPAddress: %s\n", _ip_buffer);
-
-    return _ip_buffer;
-}
-
-const char *ISM43362::getMACAddress(void)
-{
-    if (!(_parser.send("Z5") && _parser.recv("%s\r\n", _mac_buffer) && check_response())) {
-        debug_if(_ism_debug, "ISM43362: receivedMacAddress LINE KO: %s\n", _mac_buffer);
-        return 0;
-    }
-
-    debug_if(_ism_debug, "ISM43362: receivedMacAddress:%s, size=%d\r\n", _mac_buffer, sizeof(_mac_buffer));
-
-    return _mac_buffer;
-}
-
-const char *ISM43362::getGateway()
-{
-    char tmp[250];
-    /* Use %[^\n] instead of %s to allow having spaces in the string */
-    if (!(_parser.send("C?") && _parser.recv("%[^\n^\r]\r\n", tmp) && check_response())) {
-        debug_if(_ism_debug, "ISM43362: getGateway LINE KO: %s\r\n", tmp);
-        return 0;
-    }
-
-    /* Extract the Gateway in the received buffer */
-    char *ptr;
-    ptr = strtok(tmp, ",");
-    for (int i = 0; i < 7; i++) {
-        if (ptr == NULL) {
-            break;
-        }
-        ptr = strtok(NULL, ",");
-    }
-
-    strncpy(_gateway_buffer, ptr, sizeof(_gateway_buffer));
-
-    debug_if(_ism_debug, "ISM43362: getGateway: %s\r\n", _gateway_buffer);
-
-    return _gateway_buffer;
-}
-
-const char *ISM43362::getNetmask()
-{
-    char tmp[250];
-    /* Use %[^\n] instead of %s to allow having spaces in the string */
-    if (!(_parser.send("C?") && _parser.recv("%[^\n^\r]\r\n", tmp) && check_response())) {
-        debug_if(_ism_debug, "ISM43362: getNetmask LINE KO: %s\n", tmp);
-        return 0;
-    }
-
-    /* Extract Netmask in the received buffer */
-    char *ptr;
-    ptr = strtok(tmp, ",");
-    for (int i = 0; i < 6; i++) {
-        if (ptr == NULL) {
-            break;
-        }
-        ptr = strtok(NULL, ",");
-    }
-
-    strncpy(_netmask_buffer, ptr, sizeof(_netmask_buffer));
-
-    debug_if(_ism_debug, "ISM43362: getNetmask: %s\r\n", _netmask_buffer);
-
-    return _netmask_buffer;
-}
-
-int8_t ISM43362::getRSSI()
-{
-    int8_t rssi;
-    char tmp[25];
-
-    if (!(_parser.send("CR") && _parser.recv("%s\r\n", tmp) && check_response())) {
-        debug_if(_ism_debug, "ISM43362: getRSSI LINE KO: %s\r\n", tmp);
-        return 0;
-    }
-
-    rssi = ParseNumber(tmp, NULL);
-
-    debug_if(_ism_debug, "ISM43362: getRSSI: %d\r\n", rssi);
-
-    return rssi;
-}
-/**
-  * @brief  Parses Security type.
-  * @param  ptr: pointer to string
-  * @retval Encryption type.
-  */
-extern "C" nsapi_security_t ParseSecurity(char *ptr)
-{
-    if (strstr(ptr, "Open")) {
-        return NSAPI_SECURITY_NONE;
-    } else if (strstr(ptr, "WEP")) {
-        return NSAPI_SECURITY_WEP;
-    } else if (strstr(ptr, "WPA2 AES")) {
-        return NSAPI_SECURITY_WPA2;
-    } else if (strstr(ptr, "WPA WPA2")) {
-        return NSAPI_SECURITY_WPA_WPA2;
-    } else if (strstr(ptr, "WPA2 TKIP")) {
-        return NSAPI_SECURITY_UNKNOWN;    // no match in mbed
-    } else if (strstr(ptr, "WPA2")) {
-        return NSAPI_SECURITY_WPA2;    // catch any other WPA2 formula
-    } else if (strstr(ptr, "WPA")) {
-        return NSAPI_SECURITY_WPA;
-    } else {
-        return NSAPI_SECURITY_UNKNOWN;
-    }
-}
-
-/**
-  * @brief  Convert char in Hex format to integer.
-  * @param  a: character to convert
-  * @retval integer value.
-  */
-extern "C"  uint8_t Hex2Num(char a)
-{
-    if (a >= '0' && a <= '9') {                             /* Char is num */
-        return a - '0';
-    } else if (a >= 'a' && a <= 'f') {                      /* Char is lowercase character A - Z (hex) */
-        return (a - 'a') + 10;
-    } else if (a >= 'A' && a <= 'F') {                      /* Char is uppercase character A - Z (hex) */
-        return (a - 'A') + 10;
-    }
-
-    return 0;
-}
-
-/**
-  * @brief  Extract a hex number from a string.
-  * @param  ptr: pointer to string
-  * @param  cnt: pointer to the number of parsed digit
-  * @retval Hex value.
-  */
-extern "C" uint32_t ParseHexNumber(char *ptr, uint8_t *cnt)
-{
-    uint32_t sum = 0;
-    uint8_t i = 0;
-
-    while (CHARISHEXNUM(*ptr)) {         /* Parse number */
-        sum <<= 4;
-        sum += Hex2Num(*ptr);
-        ptr++;
-        i++;
-    }
-
-    if (cnt != NULL) {                  /* Save number of characters used for number */
-        *cnt = i;
-    }
-    return sum;                         /* Return number */
-}
-
-bool ISM43362::isConnected(void)
-{
-    return getIPAddress() != 0;
-}
-
-int ISM43362::scan(WiFiAccessPoint *res, unsigned limit)
-{
-    unsigned cnt = 0, num = 0;
-    char *ptr;
-    char tmp[256];
-
-    if (!(_parser.send("F0"))) {
-        debug_if(_ism_debug, "ISM43362: scan error\r\n");
-        return 0;
-    }
-
-    /* Parse the received buffer and fill AP buffer */
-    /* Use %[^\n] instead of %s to allow having spaces in the string */
-    while (_parser.recv("#%[^\n]\n", tmp)) {
-        if (limit != 0 && cnt >= limit) {
-            /* reached end */
-            break;
-        }
-        nsapi_wifi_ap_t ap = {0};
-        debug_if(_ism_debug, "ISM43362: received:%s\n", tmp);
-        ptr = strtok(tmp, ",");
-        num = 0;
-        while (ptr != NULL) {
-            switch (num++) {
-                case 0: /* Ignore index */
-                case 4: /* Ignore Max Rate */
-                case 5: /* Ignore Network Type */
-                case 7: /* Ignore Radio Band */
-                    break;
-                case 1:
-                    ptr[strlen(ptr) - 1] = 0;
-                    strncpy((char *)ap.ssid,  ptr + 1, 32);
-                    break;
-                case 2:
-                    for (int i = 0; i < 6; i++) {
-                        ap.bssid[i] = ParseHexNumber(ptr + (i * 3), NULL);
-                    }
-                    break;
-                case 3:
-                    ap.rssi = ParseNumber(ptr, NULL);
-                    break;
-                case 6:
-                    ap.security = ParseSecurity(ptr);
-                    break;
-                case 8:
-                    ap.channel = ParseNumber(ptr, NULL);
-                    num = 1;
-                    break;
-                default:
-                    break;
-            }
-            ptr = strtok(NULL, ",");
-        }
-        if (res != NULL) {
-            res[cnt] = WiFiAccessPoint(ap);
-        }
-        cnt++;
-    }
-
-    /* We may stop before having read all the APs list, so flush the rest of
-     * it as well as OK commands */
-    _parser.flush();
-
-    debug_if(_ism_debug, "ISM43362: End of Scan: cnt=%d\n", cnt);
-
-    return cnt;
-
-}
-
-bool ISM43362::open(const char *type, int id, const char *addr, int port)
-{
-    /* TODO : This is the implementation for the client socket, need to check if need to create openserver too */
-    //IDs only 0-3
-    if ((id < 0) || (id > 3)) {
-        debug_if(_ism_debug, "ISM43362: open: wrong id\n");
-        return false;
-    }
-    /* Set communication socket */
-    _active_id = id;
-    if (!(_parser.send("P0=%d", id) && check_response())) {
-        debug_if(_ism_debug, "ISM43362: open: P0 issue\n");
-        return false;
-    }
-    /* Set protocol */
-    if (!(_parser.send("P1=%s", type) && check_response())) {
-        debug_if(_ism_debug, "ISM43362: open: P1 issue\n");
-        return false;
-    }
-    /* Set address */
-    if (!(_parser.send("P3=%s", addr) && check_response())) {
-        debug_if(_ism_debug, "ISM43362: open: P3 issue\n");
-        return false;
-    }
-    if (!(_parser.send("P4=%d", port) && check_response())) {
-        debug_if(_ism_debug, "ISM43362: open: P4 issue\n");
-        return false;
-    }
-    /* Start client */
-    if (!(_parser.send("P6=1") && check_response())) {
-        debug_if(_ism_debug, "ISM43362: open: P6 issue\n");
-        return false;
-    }
-
-    /* request as much data as possible - i.e. module max size */
-    if (!(_parser.send("R1=%d", ES_WIFI_MAX_RX_PACKET_SIZE) && check_response())) {
-        debug_if(_ism_debug, "ISM43362: open: R1 issue\n");
-        return -1;
-    }
-
-    /* Non blocking mode : set Read Transport Timeout to 1ms */
-    if (!(_parser.send("R2=1") && check_response())) {
-        debug_if(_ism_debug, "ISM43362: open: R2 issue\n");
-        return -1;
-    }
-
-    debug_if(_ism_debug, "ISM43362: open ok with id %d type %s addr %s port %d\n", id, type, addr, port);
-
-    return true;
-}
-
-bool ISM43362::dns_lookup(const char *name, char *ip)
-{
-    char tmp[30];
-
-    if (!(_parser.send("D0=%s", name) && _parser.recv("%s\r\n", tmp)
-            && check_response())) {
-        debug_if(_ism_debug, "ISM43362 dns_lookup: D0 issue: %s\n", tmp);
-        return 0;
-    }
-
-    strncpy(ip, tmp, sizeof(tmp));
-
-    debug_if(_ism_debug, "ISM43362 dns_lookup: %s ok\n", ip);
-    return 1;
-}
-
-bool ISM43362::send(int id, const void *data, uint32_t amount)
-{
-    // The Size limit has to be checked on caller side.
-    if (amount > ES_WIFI_MAX_TX_PACKET_SIZE) {
-        debug_if(_ism_debug, "ISM43362 send: max issue\n");
-        return false;
-    }
-
-    /* Activate the socket id in the wifi module */
-    if ((id < 0) || (id > 3)) {
-        return false;
-    }
-    if (_active_id != id) {
-        _active_id = id;
-        if (!(_parser.send("P0=%d", id) && check_response())) {
-            debug_if(_ism_debug, "ISM43362 send: P0 issue\n");
-            return false;
-        }
-    }
-
-    /* set Write Transport Packet Size */
-    int i = _parser.printf("S3=%d\r", (int)amount);
-    if (i < 0) {
-        debug_if(_ism_debug, "ISM43362 send: S3 issue\n");
-        return false;
-    }
-    i = _parser.write((const char *)data, amount, i);
-    if (i < 0) {
-        return false;
-    }
-
-    if (!check_response()) {
-        return false;
-    }
-
-    debug_if(_ism_debug, "ISM43362 send: id %d amount %d\n", id, amount);
-    return true;
-}
-
-int ISM43362::check_recv_status(int id, void *data)
-{
-    int read_amount;
-
-    debug_if(_ism_debug, "ISM43362 check_recv_status: id %d\r\n", id);
-
-    /* Activate the socket id in the wifi module */
-    if ((id < 0) || (id > 3)) {
-        debug_if(_ism_debug, "ISM43362 check_recv_status: ERROR with id %d\r\n", id);
-        return -1;
-    }
-
-    if (_active_id != id) {
-        _active_id = id;
-        if (!(_parser.send("P0=%d", id) && check_response())) {
-            return -1;
-        }
-    }
-
-
-    if (!_parser.send("R0")) {
-        return -1;
-    }
-    read_amount = _parser.read((char *)data);
-
-    if (read_amount < 0) {
-        debug_if(_ism_debug, "ISM43362 check_recv_status: ERROR in data RECV, timeout?\r\n");
-        return -1; /* nothing to read */
-    }
-
-    /*  If there are spurious 0x15 at the end of the data, this is an error
-     *  we hall can get rid off of them :-(
-     *  This should not happen, but let's try to clean-up anyway
-     */
-    char *cleanup = (char *) data;
-    while ((read_amount > 0) && (cleanup[read_amount - 1] == 0x15)) {
-        // debug_if(_ism_debug, "ISM43362 check_recv_status: spurious 0X15 trashed\r\n");
-        /* Remove the trailling char then search again */
-        read_amount--;
-    }
-
-    if ((read_amount >= 6) && (strncmp("OK\r\n> ", (char *)data, 6) == 0)) {
-        // debug_if(_ism_debug, "ISM43362 check_recv_status: recv 2 nothing to read=%d\r\n", read_amount);
-        // read_amount -= 6;
-        return 0; /* nothing to read */
-    } else if ((read_amount >= 8) && (strncmp((char *)((uint32_t) data + read_amount - 8), "\r\nOK\r\n> ", 8)) == 0) {
-        /* bypass ""\r\nOK\r\n> " if present at the end of the chain */
-        read_amount -= 8;
-    } else {
-        debug_if(_ism_debug, "ISM43362 check_recv_status: ERROR, flushing %d bytes: ", read_amount);
-        // for (int i = 0; i < read_amount; i++) {
-        //      debug_if(_ism_debug, "%2X ", cleanup[i]);
-        // }
-        // debug_if(_ism_debug, "\r\n (ASCII)", cleanup);
-        cleanup[read_amount] = 0;
-        debug_if(_ism_debug, "%s\r\n", cleanup);
-        return -1; /* nothing to read */
-    }
-
-    debug_if(_ism_debug, "ISM43362 check_recv_status: id %d read_amount=%d\r\n", id, read_amount);
-    return read_amount;
-}
-
-bool ISM43362::close(int id)
-{
-    if ((id < 0) || (id > 3)) {
-        debug_if(_ism_debug, "ISM43362: Wrong socket number\n");
-        return false;
-    }
-    /* Set connection on this socket */
-    debug_if(_ism_debug, "ISM43362: CLOSE socket id=%d\n", id);
-    _active_id = id;
-    if (!(_parser.send("P0=%d", id) && check_response())) {
-        return false;
-    }
-    /* close this socket */
-    if (!(_parser.send("P6=0") && check_response())) {
-        return false;
-    }
-    return true;
-}
-
-bool ISM43362::readable()
-{
-    /* not applicable with SPI api */
-    return true;
-}
-
-bool ISM43362::writeable()
-{
-    /* not applicable with SPI api */
-    return true;
-}
-
-void ISM43362::attach(Callback<void()> func)
-{
-    /* not applicable with SPI api */
-}
-
--- a/drivers/network/WIFI_ISM43362/ISM43362/ISM43362.h	Sun Dec 16 13:53:42 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,250 +0,0 @@
-/* ISM43362Interface Example
- * Copyright (c) STMicroelectronics 2017
- *
- * 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 ISM43362_H
-#define ISM43362_H
-#include "ATParser.h"
-
-#define ES_WIFI_MAX_SSID_NAME_SIZE                  32
-#define ES_WIFI_MAX_PSWD_NAME_SIZE                  32
-#define ES_WIFI_PRODUCT_ID_SIZE                     32
-#define ES_WIFI_PRODUCT_NAME_SIZE                   32
-#define ES_WIFI_FW_REV_SIZE                         16
-#define ES_WIFI_API_REV_SIZE                        16
-#define ES_WIFI_STACK_REV_SIZE                      16
-#define ES_WIFI_RTOS_REV_SIZE                       16
-
-// The input range for AT Command 'R1' is 0 to 1200 bytes
-// 'R1' Set Read Transport Packet Size (bytes)
-#define ES_WIFI_MAX_RX_PACKET_SIZE                     1200
-// Module maxume DATA payload for Tx packet is 1460
-#define ES_WIFI_MAX_TX_PACKET_SIZE                     1460
-typedef enum ism_security {
-    ISM_SECURITY_NONE         = 0x0,      /*!< open access point */
-    ISM_SECURITY_WEP          = 0x1,      /*!< phrase conforms to WEP */
-    ISM_SECURITY_WPA          = 0x2,      /*!< phrase conforms to WPA */
-    ISM_SECURITY_WPA2         = 0x3,      /*!< phrase conforms to WPA2 */
-    ISM_SECURITY_WPA_WPA2     = 0x4,      /*!< phrase conforms to WPA/WPA2 */
-    ISM_SECURITY_UNKNOWN      = 0xFF,     /*!< unknown/unsupported security in scan results */
-} ism_security_t;
-
-extern "C" int32_t ParseNumber(char *ptr, uint8_t *cnt);
-
-/** ISM43362Interface class.
-    This is an interface to a ISM43362 radio.
- */
-class ISM43362 {
-public:
-    ISM43362(PinName mosi, PinName miso, PinName clk, PinName nss, PinName resetpin, PinName datareadypin, PinName wakeup, bool debug = false);
-
-    /**
-    * Check firmware version of ISM43362
-    *
-    * @return fw version or null if no version is read
-    */
-    uint32_t get_firmware_version(void);
-
-    /**
-    * Reset ISM43362
-    *
-    * @return true only if ISM43362 resets successfully
-    */
-    bool reset(void);
-
-    /**
-    * Enable/Disable DHCP
-    *
-    * @param enabled DHCP enabled when true
-    * @return true only if ISM43362 enables/disables DHCP successfully
-    */
-    bool dhcp(bool enabled);
-
-    /**
-    * Connect ISM43362 to AP
-    *
-    * @param ap the name of the AP
-    * @param passPhrase the password of AP
-    * @param ap_sec the security level of network AP
-    * @return nsapi_error enum
-    */
-    int connect(const char *ap, const char *passPhrase, ism_security_t ap_sec);
-
-    /**
-    * Disconnect ISM43362 from AP
-    *
-    * @return true only if ISM43362 is disconnected successfully
-    */
-    bool disconnect(void);
-
-    /**
-    * Get the IP address of ISM43362
-    *
-    * @return null-teriminated IP address or null if no IP address is assigned
-    */
-    const char *getIPAddress(void);
-
-    /**
-    * Get the MAC address of ISM43362
-    *
-    * @return null-terminated MAC address or null if no MAC address is assigned
-    */
-    const char *getMACAddress(void);
-
-    /** Get the local gateway
-    *
-    *  @return         Null-terminated representation of the local gateway
-    *                  or null if no network mask has been recieved
-    */
-    const char *getGateway();
-
-    /** Get the local network mask
-     *
-     *  @return         Null-terminated representation of the local network mask
-     *                  or null if no network mask has been recieved
-     */
-    const char *getNetmask();
-
-    /* Return RSSI for active connection
-     *
-     * @return      Measured RSSI
-     */
-    int8_t getRSSI();
-
-    /**
-    * Check if ISM43362 is conenected
-    *
-    * @return true only if the chip has an IP address
-    */
-    bool isConnected(void);
-
-    /** Scan for available networks
-     *
-     * @param  ap    Pointer to allocated array to store discovered AP
-     * @param  limit Size of allocated @a res array, or 0 to only count available AP
-     * @return       Number of entries in @a res, or if @a count was 0 number of available networks, negative on error
-     *               see @a nsapi_error
-     */
-    int scan(WiFiAccessPoint *res, unsigned limit);
-
-    /**Perform a dns query
-    *
-    * @param name Hostname to resolve
-    * @param ip   Buffer to store IP address
-    * @return 0 true on success, false on failure
-    */
-    bool dns_lookup(const char *name, char *ip);
-
-    /**
-    * Open a socketed connection
-    *
-    * @param type the type of socket to open "UDP" or "TCP"
-    * @param id id to give the new socket, valid 0-4
-    * @param port port to open connection with
-    * @param addr the IP address of the destination
-    * @return true only if socket opened successfully
-    */
-    bool open(const char *type, int id, const char *addr, int port);
-
-    /**
-    * Sends data to an open socket
-    *
-    * @param id id of socket to send to
-    * @param data data to be sent
-    * @param amount amount of data to be sent - max 1024
-    * @return true only if data sent successfully
-    */
-    bool send(int id, const void *data, uint32_t amount);
-
-    /**
-    * Receives data from an open socket
-    *
-    * @param id id to receive from
-    * @param data placeholder for returned information
-    * @param amount number of bytes to be received
-    * @return the number of bytes received
-    */
-    int32_t recv(int id, void *data, uint32_t amount);
-
-    /**
-    * Closes a socket
-    *
-    * @param id id of socket to close, valid only 0-4
-    * @return true only if socket is closed successfully
-    */
-    bool close(int id);
-
-    /**
-    * Checks if data is available
-    */
-    bool readable();
-
-    /**
-    * Checks if data can be written
-    */
-    bool writeable();
-
-    /**
-    * Attach a function to call whenever network state has changed
-    *
-    * @param func A pointer to a void function, or 0 to set as none
-    */
-    void attach(Callback<void()> func);
-
-    /**
-    * Check is datas are available to read for a socket
-    * @param id socket id
-    * @param data placeholder for returned information
-    * @param amount size to read for the check
-    * @return amount of read value, or -1 for errors
-    */
-    int check_recv_status(int id, void *data);
-
-    /**
-    * Attach a function to call whenever network state has changed
-    *
-    * @param obj pointer to the object to call the member function on
-    * @param method pointer to the member function to call
-    */
-    template <typename T, typename M>
-    void attach(T *obj, M method)
-    {
-        attach(Callback<void()>(obj, method));
-    }
-
-private:
-    BufferedSpi _bufferspi;
-    ATParser _parser;
-    DigitalOut _resetpin;
-    volatile int _active_id;
-    void print_rx_buff(void);
-    bool check_response(void);
-    struct packet {
-        struct packet *next;
-        int id;
-        uint32_t len;
-        // data follows
-    } *_packets, * *_packets_end;
-    void _packet_handler();
-    bool _ism_debug;
-
-    char _ip_buffer[16];
-    char _gateway_buffer[16];
-    char _netmask_buffer[16];
-    char _mac_buffer[18];
-    uint32_t _FwVersionId;
-};
-
-#endif
--- a/drivers/network/WIFI_ISM43362/ISM43362Interface.cpp	Sun Dec 16 13:53:42 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,555 +0,0 @@
-/* ISM43362 implementation of NetworkInterfaceAPI
- * Copyright (c) STMicroelectronics 2018
- *
- * 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.
- */
-
-#include <string.h>
-#include "ISM43362Interface.h"
-#include "mbed_debug.h"
-
-                                            // Product ID,FW Revision,API Revision,Stack Revision,RTOS Revision,CPU Clock,Product Name
-#define LATEST_FW_VERSION_NUMBER "C3.5.2.5" // ISM43362-M3G-L44-SPI,C3.5.2.5.STM,v3.5.2,v1.4.0.rc1,v8.2.1,120000000,Inventek eS-WiFi
-
-// activate / de-activate debug
-#define ism_interface_debug 0
-
-#define MIN(a,b) (((a)<(b))?(a):(b))
-
-// ISM43362Interface implementation
-ISM43362Interface::ISM43362Interface(bool debug)
-    : _ism(MBED_CONF_ISM43362_WIFI_MOSI, MBED_CONF_ISM43362_WIFI_MISO, MBED_CONF_ISM43362_WIFI_SCLK, MBED_CONF_ISM43362_WIFI_NSS, MBED_CONF_ISM43362_WIFI_RESET, MBED_CONF_ISM43362_WIFI_DATAREADY, MBED_CONF_ISM43362_WIFI_WAKEUP, debug)
-{
-    _ism_debug = ism_interface_debug || debug;
-    memset(_ids, 0, sizeof(_ids));
-    memset(_socket_obj, 0, sizeof(_socket_obj));
-    memset(_cbs, 0, sizeof(_cbs));
-    memset(ap_ssid, 0, sizeof(ap_ssid));
-    memset(ap_pass, 0, sizeof(ap_pass));
-    ap_sec = ISM_SECURITY_UNKNOWN;
-
-    thread_read_socket.start(callback(this, &ISM43362Interface::socket_check_read));
-
-    _mutex.lock();
-
-    // Check all supported firmware versions
-    _FwVersion = _ism.get_firmware_version();
-
-    if (!_FwVersion) {
-        error("ISM43362Interface: ERROR cannot read firmware version\r\n");
-    }
-
-    debug_if(_ism_debug, "ISM43362Interface: read_version = %lu\r\n", _FwVersion);
-    /* FW Revision should be with format "CX.X.X.X" with X as a single digit */
-    if ( (_FwVersion < 1000) || (_FwVersion > 9999) ) {
-        debug_if(_ism_debug, "ISM43362Interface: read_version issue\r\n");
-    }
-
-#if TARGET_DISCO_L475VG_IOT01A
-    if (_FwVersion < ParseNumber(LATEST_FW_VERSION_NUMBER, NULL)) {
-        debug_if(_ism_debug, "ISM43362Interface: please update FW\r\n");
-    }
-#endif
-
-    _mutex.unlock();
-}
-
-int ISM43362Interface::connect(const char *ssid, const char *pass, nsapi_security_t security,
-                               uint8_t channel)
-{
-    if (channel != 0) {
-        return NSAPI_ERROR_UNSUPPORTED;
-    }
-
-    nsapi_error_t credentials_status = set_credentials(ssid, pass, security);
-    if (credentials_status) {
-        return credentials_status;
-    }
-
-    return connect();
-}
-
-int ISM43362Interface::connect()
-{
-    if (strlen(ap_ssid) == 0) {
-        return NSAPI_ERROR_NO_SSID;
-    }
-
-    _mutex.lock();
-
-    if (!_ism.dhcp(true)) {
-        _mutex.unlock();
-        return NSAPI_ERROR_DHCP_FAILURE;
-    }
-
-    int connect_status = _ism.connect(ap_ssid, ap_pass, ap_sec);
-    debug_if(_ism_debug, "ISM43362Interface: connect_status %d\n", connect_status);
-
-    if (connect_status != NSAPI_ERROR_OK) {
-        _mutex.unlock();
-        return connect_status;
-    }
-
-    if (!_ism.getIPAddress()) {
-        _mutex.unlock();
-        return NSAPI_ERROR_DHCP_FAILURE;
-    }
-
-    _mutex.unlock();
-
-    return NSAPI_ERROR_OK;
-}
-
-nsapi_error_t ISM43362Interface::gethostbyname(const char *name, SocketAddress *address, nsapi_version_t version)
-{
-    if (strlen(name) == 0) {
-        return NSAPI_ERROR_NO_SOCKET;
-    }
-
-    _mutex.lock();
-    if (address->set_ip_address(name)) {
-        if (version != NSAPI_UNSPEC && address->get_ip_version() != version) {
-            _mutex.unlock();
-            return NSAPI_ERROR_DNS_FAILURE;
-        }
-
-        _mutex.unlock();
-        return NSAPI_ERROR_OK;
-    }
-
-    char *ipbuff = new char[NSAPI_IP_SIZE];
-    int ret = 0;
-    if (!_ism.dns_lookup(name, ipbuff)) {
-        ret = NSAPI_ERROR_DEVICE_ERROR;
-    } else {
-        address->set_ip_address(ipbuff);
-    }
-    _mutex.unlock();
-
-    delete[] ipbuff;
-
-    return ret;
-}
-
-int ISM43362Interface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
-{
-    if ((strlen(ssid) == 0) || (strlen(ssid) > 32)) {
-        return NSAPI_ERROR_PARAMETER;
-    }
-
-    if ((security != NSAPI_SECURITY_NONE) && (strcmp(pass, "") == 0)) {
-        return NSAPI_ERROR_PARAMETER;
-    }
-
-    if (strlen(pass) > 63) {
-        return NSAPI_ERROR_PARAMETER;
-    }
-
-    _mutex.lock();
-    memset(ap_ssid, 0, sizeof(ap_ssid));
-    strncpy(ap_ssid, ssid, sizeof(ap_ssid));
-
-    memset(ap_pass, 0, sizeof(ap_pass));
-    strncpy(ap_pass, pass, sizeof(ap_pass));
-
-    switch (security) {
-        case NSAPI_SECURITY_NONE:
-            ap_sec = ISM_SECURITY_NONE;
-            break;
-        case NSAPI_SECURITY_WEP:
-            ap_sec = ISM_SECURITY_WEP;
-            break;
-        case NSAPI_SECURITY_WPA:
-            ap_sec = ISM_SECURITY_WPA;
-            break;
-        case NSAPI_SECURITY_WPA2:
-            ap_sec = ISM_SECURITY_WPA2;
-            break;
-        case NSAPI_SECURITY_WPA_WPA2:
-            ap_sec = ISM_SECURITY_WPA_WPA2;
-            break;
-        default:
-            ap_sec = ISM_SECURITY_UNKNOWN;
-            break;
-    }
-    _mutex.unlock();
-
-    return NSAPI_ERROR_OK;
-}
-
-int ISM43362Interface::set_channel(uint8_t channel)
-{
-    return NSAPI_ERROR_UNSUPPORTED;
-}
-
-int ISM43362Interface::disconnect()
-{
-    _mutex.lock();
-
-    if (!_ism.disconnect()) {
-        _mutex.unlock();
-        return NSAPI_ERROR_DEVICE_ERROR;
-    }
-
-    _mutex.unlock();
-
-    return NSAPI_ERROR_OK;
-}
-
-const char *ISM43362Interface::get_ip_address()
-{
-    _mutex.lock();
-    const char *ret = _ism.getIPAddress();
-    _mutex.unlock();
-    return ret;
-}
-
-const char *ISM43362Interface::get_mac_address()
-{
-    _mutex.lock();
-    const char *ret = _ism.getMACAddress();
-    _mutex.unlock();
-    return ret;
-}
-
-const char *ISM43362Interface::get_gateway()
-{
-    _mutex.lock();
-    const char *ret = _ism.getGateway();
-    _mutex.unlock();
-    return ret;
-}
-
-const char *ISM43362Interface::get_netmask()
-{
-    _mutex.lock();
-    const char *ret = _ism.getNetmask();
-    _mutex.unlock();
-    return ret;
-}
-
-int8_t ISM43362Interface::get_rssi()
-{
-    _mutex.lock();
-    int8_t ret = _ism.getRSSI();
-    _mutex.unlock();
-    return ret;
-}
-
-int ISM43362Interface::scan(WiFiAccessPoint *res, unsigned count)
-{
-    _mutex.lock();
-    int ret = _ism.scan(res, count);
-    _mutex.unlock();
-    return ret;
-}
-
-struct ISM43362_socket {
-    int id;
-    nsapi_protocol_t proto;
-    volatile bool connected;
-    SocketAddress addr;
-    char read_data[1400];
-    volatile uint32_t read_data_size;
-};
-
-int ISM43362Interface::socket_open(void **handle, nsapi_protocol_t proto)
-{
-    // Look for an unused socket
-    int id = -1;
-    for (int i = 0; i < ISM43362_SOCKET_COUNT; i++) {
-        if (!_ids[i]) {
-            id = i;
-            _ids[i] = true;
-            break;
-        }
-    }
-
-    if (id == -1) {
-        return NSAPI_ERROR_NO_SOCKET;
-    }
-    _mutex.lock();
-    struct ISM43362_socket *socket = new struct ISM43362_socket;
-    if (!socket) {
-        _mutex.unlock();
-        return NSAPI_ERROR_NO_SOCKET;
-    }
-    socket->id = id;
-    debug_if(_ism_debug, "ISM43362Interface: socket_open, id=%d\n", socket->id);
-    memset(socket->read_data, 0, sizeof(socket->read_data));
-    socket->addr = 0;
-    socket->read_data_size = 0;
-    socket->proto = proto;
-    socket->connected = false;
-    *handle = socket;
-    _mutex.unlock();
-
-    return 0;
-}
-
-int ISM43362Interface::socket_close(void *handle)
-{
-    _mutex.lock();
-    struct ISM43362_socket *socket = (struct ISM43362_socket *)handle;
-    debug_if(_ism_debug, "ISM43362Interface: socket_close, id=%d\n", socket->id);
-    int err = 0;
-
-    if (!_ism.close(socket->id)) {
-        err = NSAPI_ERROR_DEVICE_ERROR;
-    }
-
-    socket->connected = false;
-    _ids[socket->id] = false;
-    _socket_obj[socket->id] = 0;
-    _mutex.unlock();
-    delete socket;
-    return err;
-}
-
-int ISM43362Interface::socket_bind(void *handle, const SocketAddress &address)
-{
-    return NSAPI_ERROR_UNSUPPORTED;
-}
-
-int ISM43362Interface::socket_listen(void *handle, int backlog)
-{
-    return NSAPI_ERROR_UNSUPPORTED;
-}
-
-int ISM43362Interface::socket_connect(void *handle, const SocketAddress &addr)
-{
-    _mutex.lock();
-    int ret = socket_connect_nolock(handle, addr);
-    _mutex.unlock();
-    return ret;
-}
-
-int ISM43362Interface::socket_connect_nolock(void *handle, const SocketAddress &addr)
-{
-    struct ISM43362_socket *socket = (struct ISM43362_socket *)handle;
-    const char *proto = (socket->proto == NSAPI_UDP) ? "1" : "0";
-    if (!_ism.open(proto, socket->id, addr.get_ip_address(), addr.get_port())) {
-        return NSAPI_ERROR_DEVICE_ERROR;
-    }
-    _ids[socket->id]  = true;
-    _socket_obj[socket->id] = (uint32_t)socket;
-    socket->connected = true;
-    return 0;
-
-}
-
-
-
-void ISM43362Interface::socket_check_read()
-{
-    while (1) {
-        for (int i = 0; i < ISM43362_SOCKET_COUNT; i++) {
-            _mutex.lock();
-            if (_socket_obj[i] != 0) {
-                struct ISM43362_socket *socket = (struct ISM43362_socket *)_socket_obj[i];
-                /* Check if there is something to read for this socket. But if it */
-                /* has already been read : don't read again */
-                if ((socket->connected) && (socket->read_data_size == 0) && _cbs[socket->id].callback) {
-                    /* if no callback is set, no need to read ?*/
-                    int read_amount = _ism.check_recv_status(socket->id, socket->read_data);
-                    // debug_if(_ism_debug, "ISM43362Interface socket_check_read: i %d read_amount %d \r\n", i, read_amount);
-                    if (read_amount > 0) {
-                        socket->read_data_size = read_amount;
-                    } else if (read_amount < 0) {
-                        /* Mark donw connection has been lost or closed */
-                        debug_if(_ism_debug, "ISM43362Interface socket_check_read: i %d closed\r\n", i, read_amount);
-                        socket->connected = false;
-                    }
-                    if (read_amount != 0) {
-                        /* There is something to read in this socket*/
-                        if (_cbs[socket->id].callback) {
-                            _cbs[socket->id].callback(_cbs[socket->id].data);
-                        }
-                    }
-                }
-            }
-            _mutex.unlock();
-        }
-        wait_ms(50);
-    }
-}
-
-int ISM43362Interface::socket_accept(void *server, void **socket, SocketAddress *addr)
-{
-    return NSAPI_ERROR_UNSUPPORTED;
-}
-
-int ISM43362Interface::socket_send(void *handle, const void *data, unsigned size)
-{
-    _mutex.lock();
-    int ret = socket_send_nolock(handle, data, size);
-    _mutex.unlock();
-    return ret;
-}
-
-/*  CAREFULL LOCK must be taken before callling this function */
-int ISM43362Interface::socket_send_nolock(void *handle, const void *data, unsigned size)
-{
-    struct ISM43362_socket *socket = (struct ISM43362_socket *)handle;
-
-    if (size > ES_WIFI_MAX_TX_PACKET_SIZE) {
-        size = ES_WIFI_MAX_TX_PACKET_SIZE;
-    }
-
-    if (!_ism.send(socket->id, data, size)) {
-        debug_if(_ism_debug, "ISM43362Interface: socket_send ERROR\r\n");
-        return NSAPI_ERROR_DEVICE_ERROR; // or WOULD_BLOCK ?
-    }
-
-    return size;
-}
-
-int ISM43362Interface::socket_recv(void *handle, void *data, unsigned size)
-{
-    _mutex.lock();
-    unsigned recv = 0;
-    struct ISM43362_socket *socket = (struct ISM43362_socket *)handle;
-    char *ptr = (char *)data;
-
-    // debug_if(_ism_debug, "ISM43362Interface socket_recv: req=%d read_data_size=%d connected %d\r\n", size, socket->read_data_size, socket->connected);
-
-    if (!socket->connected) {
-        _mutex.unlock();
-        return NSAPI_ERROR_CONNECTION_LOST;
-    }
-
-    if (socket->read_data_size == 0) {
-        /* if no callback is set, no need to read ?*/
-        int read_amount = _ism.check_recv_status(socket->id, socket->read_data);
-        if (read_amount > 0) {
-            socket->read_data_size = read_amount;
-        } else if (read_amount < 0) {
-            socket->connected = false;
-            debug_if(_ism_debug, "ISM43362Interface socket_recv: socket closed\r\n");
-            _mutex.unlock();
-            return NSAPI_ERROR_CONNECTION_LOST;
-        }
-    }
-
-    if (socket->read_data_size != 0) {
-        // debug_if(_ism_debug, "ISM43362Interface socket_recv: read_data_size=%d\r\n", socket->read_data_size);
-        uint32_t i = 0;
-        while ((i < socket->read_data_size) && (i < size)) {
-            *ptr++ = socket->read_data[i];
-            i++;
-        }
-
-        recv += i;
-
-        if (i >= socket->read_data_size) {
-            /* All the storeed data has been read, reset buffer */
-            memset(socket->read_data, 0, sizeof(socket->read_data));
-            socket->read_data_size = 0;
-            // debug_if(_ism_debug, "ISM43362Interface: Socket_recv buffer reset\r\n");
-        } else {
-            /*  In case there is remaining data in buffer, update socket content
-             *  For now by shift copy of all data (not very efficient to be
-             *  revised */
-            while (i < socket->read_data_size) {
-                socket->read_data[i - size] = socket->read_data[i];
-                i++;
-            }
-
-            socket->read_data_size -= size;
-        }
-    }
-    // else {
-    //     debug_if(_ism_debug, "ISM43362Interface socket_recv: Nothing in buffer\r\n");
-    // }
-
-    _mutex.unlock();
-
-    if (recv > 0) {
-        debug_if(_ism_debug, "ISM43362Interface socket_recv: recv=%d\r\n", recv);
-        return recv;
-    } else {
-        debug_if(_ism_debug, "ISM43362Interface socket_recv: returns WOULD BLOCK\r\n");
-        return NSAPI_ERROR_WOULD_BLOCK;
-    }
-}
-
-int ISM43362Interface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
-{
-    _mutex.lock();
-    struct ISM43362_socket *socket = (struct ISM43362_socket *)handle;
-
-    if (socket->connected && socket->addr != addr) {
-        if (!_ism.close(socket->id)) {
-            debug_if(_ism_debug, "ISM43362Interface: socket_sendto ERROR\r\n");
-            _mutex.unlock();
-            return NSAPI_ERROR_DEVICE_ERROR;
-        }
-        socket->connected = false;
-        _ids[socket->id] = false;
-        _socket_obj[socket->id] = 0;
-    }
-
-    if (!socket->connected) {
-        int err = socket_connect_nolock(socket, addr);
-        if (err < 0) {
-            _mutex.unlock();
-            return err;
-        }
-        socket->addr = addr;
-    }
-
-    int ret = socket_send_nolock(socket, data, size);
-
-    _mutex.unlock();
-
-    return ret;
-}
-
-int ISM43362Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
-{
-    int ret = socket_recv(handle, data, size);
-    _mutex.lock();
-    if ((ret >= 0) && addr) {
-        struct ISM43362_socket *socket = (struct ISM43362_socket *)handle;
-        *addr = socket->addr;
-    }
-    _mutex.unlock();
-    return ret;
-}
-
-void ISM43362Interface::socket_attach(void *handle, void (*cb)(void *), void *data)
-{
-    _mutex.lock();
-    struct ISM43362_socket *socket = (struct ISM43362_socket *)handle;
-    _cbs[socket->id].callback = cb;
-    _cbs[socket->id].data = data;
-    _mutex.unlock();
-}
-
-void ISM43362Interface::event()
-{
-    for (int i = 0; i < ISM43362_SOCKET_COUNT; i++) {
-        if (_cbs[i].callback) {
-            _cbs[i].callback(_cbs[i].data);
-        }
-    }
-}
-
-#if MBED_CONF_ISM43362_PROVIDE_DEFAULT
-
-WiFiInterface *WiFiInterface::get_default_instance() {
-    static ISM43362Interface ism;
-    return &ism;
-}
-
-#endif
--- a/drivers/network/WIFI_ISM43362/ISM43362Interface.h	Sun Dec 16 13:53:42 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,298 +0,0 @@
-/* ISM43362 implementation of NetworkInterfaceAPI
- * Copyright (c) STMicroelectronics 2017
- *
- * 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 ISM43362_INTERFACE_H
-#define ISM43362_INTERFACE_H
-
-#include "mbed.h"
-#include "ISM43362.h"
-
-
-#define ISM43362_SOCKET_COUNT 4
-
-/** ISM43362Interface class
- *  Implementation of the NetworkStack for the ISM43362
- */
-class ISM43362Interface : public NetworkStack, public WiFiInterface
-{
-public:
-    /** ISM43362Interface lifetime
-     * @param debug     Enable debugging
-     */
-    ISM43362Interface(bool debug = MBED_CONF_ISM43362_WIFI_DEBUG);
-
-    /** 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 int connect();
-
-    /** 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   This parameter is not supported, setting it to anything else than 0 will result in NSAPI_ERROR_UNSUPPORTED
-     *  @return          0 on success, or error code on failure
-     */
-    virtual int connect(const char *ssid, const char *pass, nsapi_security_t security = NSAPI_SECURITY_NONE,
-                        uint8_t channel = 0);
-
-    /** Translates a hostname to an IP address with specific version
-     *
-     *  The hostname may be either a domain name or an IP address. If the
-     *  hostname is an IP address, no network transactions will be performed.
-     *
-     *
-     *  @param host     Hostname to resolve
-     *  @param address  Destination for the host SocketAddress
-     *  @param version  IP version of address to resolve, NSAPI_UNSPEC indicates
-     *                  version is chosen by the stack (defaults to NSAPI_UNSPEC)
-     *  @return         0 on success, negative error code on failure
-     */
-    virtual nsapi_error_t gethostbyname(const char *name, SocketAddress *address, nsapi_version_t version = NSAPI_UNSPEC);
-
-    /** 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 int set_credentials(const char *ssid, const char *pass, nsapi_security_t security = NSAPI_SECURITY_NONE);
-
-    /** Set the WiFi network channel - NOT SUPPORTED
-     *
-     * This function is not supported and will return NSAPI_ERROR_UNSUPPORTED
-     *
-     *  @param channel   Channel on which the connection is to be made, or 0 for any (Default: 0)
-     *  @return          Not supported, returns NSAPI_ERROR_UNSUPPORTED
-     */
-    virtual int set_channel(uint8_t channel);
-
-    /** Stop the interface
-     *  @return             0 on success, negative on failure
-     */
-    virtual int disconnect();
-
-    /** Get the internally stored IP address
-     *  @return             IP address of the interface or null if not yet connected
-     */
-    virtual const char *get_ip_address();
-
-    /** Get the internally stored MAC address
-     *  @return             MAC address of the interface
-     */
-    virtual const char *get_mac_address();
-
-    /** Get the local gateway
-    *
-    *  @return         Null-terminated representation of the local gateway
-    *                  or null if no network mask has been recieved
-    */
-    virtual const char *get_gateway();
-
-    /** Get the local network mask
-     *
-     *  @return         Null-terminated representation of the local network mask
-     *                  or null if no network mask has been recieved
-     */
-    virtual const char *get_netmask();
-
-    /** Gets the current radio signal strength for active connection
-     *
-     * @return          Connection strength in dBm (negative value)
-     */
-    virtual int8_t get_rssi();
-
-    /** Scan for available networks
-     *
-     * This function will block.
-     *
-     * @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
-     * @return          Number of entries in @a, or if @a count was 0 number of available networks, negative on error
-     *                  see @a nsapi_error
-     */
-    virtual int scan(WiFiAccessPoint *res, unsigned count);
-
-    /** Translates a hostname to an IP address with specific version
-     *
-     *  The hostname may be either a domain name or an IP address. If the
-     *  hostname is an IP address, no network transactions will be performed.
-     *
-     *  If no stack-specific DNS resolution is provided, the hostname
-     *  will be resolve using a UDP socket on the stack.
-     *
-     *  @param address  Destination for the host SocketAddress
-     *  @param host     Hostname to resolve
-     *  @param version  IP version of address to resolve, NSAPI_UNSPEC indicates
-     *                  version is chosen by the stack (defaults to NSAPI_UNSPEC)
-     *  @return         0 on success, negative error code on failure
-     */
-    using NetworkInterface::gethostbyname;
-
-    /** Add a domain name server to list of servers to query
-     *
-     *  @param addr     Destination for the host address
-     *  @return         0 on success, negative error code on failure
-     */
-    using NetworkInterface::add_dns_server;
-
-protected:
-    /** Open a socket
-     *  @param handle       Handle in which to store new socket
-     *  @param proto        Type of socket to open, NSAPI_TCP or NSAPI_UDP
-     *  @return             0 on success, negative on failure
-     */
-    virtual int socket_open(void **handle, nsapi_protocol_t proto);
-
-    /** Close the socket
-     *  @param handle       Socket handle
-     *  @return             0 on success, negative on failure
-     *  @note On failure, any memory associated with the socket must still
-     *        be cleaned up
-     */
-    virtual int socket_close(void *handle);
-
-    /** Bind a server socket to a specific port
-     *  @param handle       Socket handle
-     *  @param address      Local address to listen for incoming connections on
-     *  @return             0 on success, negative on failure.
-     */
-    virtual int socket_bind(void *handle, const SocketAddress &address);
-
-    /** Start listening for incoming connections
-     *  @param handle       Socket handle
-     *  @param backlog      Number of pending connections that can be queued up at any
-     *                      one time [Default: 1]
-     *  @return             0 on success, negative on failure
-     */
-    virtual int socket_listen(void *handle, int backlog);
-
-    /** Connects this TCP socket to the server
-     *  @param handle       Socket handle
-     *  @param address      SocketAddress to connect to
-     *  @return             0 on success, negative on failure
-     */
-    virtual int socket_connect(void *handle, const SocketAddress &address);
-
-    /** Accept a new connection.
-     *  @param handle       Handle in which to store new socket
-     *  @param server       Socket handle to server to accept from
-     *  @return             0 on success, negative on failure
-     *  @note This call is not-blocking, if this call would block, must
-     *        immediately return NSAPI_ERROR_WOULD_WAIT
-     */
-    virtual int socket_accept(void *handle, void **socket, SocketAddress *address);
-
-    /** Send data to the remote host
-     *  @param handle       Socket handle
-     *  @param data         The buffer to send to the host
-     *  @param size         The length of the buffer to send
-     *  @return             Number of written bytes on success, negative on failure
-     *  @note This call is not-blocking, if this call would block, must
-     *        immediately return NSAPI_ERROR_WOULD_WAIT
-     */
-    virtual int socket_send(void *handle, const void *data, unsigned size);
-
-    /** Receive data from the remote host
-     *  @param handle       Socket handle
-     *  @param data         The buffer in which to store the data received from the host
-     *  @param size         The maximum length of the buffer
-     *  @return             Number of received bytes on success, negative on failure
-     *  @note This call is not-blocking, if this call would block, must
-     *        immediately return NSAPI_ERROR_WOULD_WAIT
-     */
-    virtual int socket_recv(void *handle, void *data, unsigned size);
-
-    /** Send a packet to a remote endpoint
-     *  @param handle       Socket handle
-     *  @param address      The remote SocketAddress
-     *  @param data         The packet to be sent
-     *  @param size         The length of the packet to be sent
-     *  @return             The number of written bytes on success, negative on failure
-     *  @note This call is not-blocking, if this call would block, must
-     *        immediately return NSAPI_ERROR_WOULD_WAIT
-     */
-    virtual int socket_sendto(void *handle, const SocketAddress &address, const void *data, unsigned size);
-
-    /** Receive a packet from a remote endpoint
-     *  @param handle       Socket handle
-     *  @param address      Destination for the remote SocketAddress or null
-     *  @param buffer       The buffer for storing the incoming packet data
-     *                      If a packet is too long to fit in the supplied buffer,
-     *                      excess bytes are discarded
-     *  @param size         The length of the buffer
-     *  @return             The number of received bytes on success, negative on failure
-     *  @note This call is not-blocking, if this call would block, must
-     *        immediately return NSAPI_ERROR_WOULD_WAIT
-     */
-    virtual int socket_recvfrom(void *handle, SocketAddress *address, void *buffer, unsigned size);
-
-    /** Register a callback on state change of the socket
-     *  @param handle       Socket handle
-     *  @param callback     Function to call on state change
-     *  @param data         Argument to pass to callback
-     *  @note Callback may be called in an interrupt context.
-     */
-    virtual void socket_attach(void *handle, void (*callback)(void *), void *data);
-
-    /** Provide access to the NetworkStack object
-     *
-     *  @return The underlying NetworkStack object
-     */
-    virtual NetworkStack *get_stack()
-    {
-        return this;
-    }
-
-private:
-    ISM43362 _ism;
-    bool _ids[ISM43362_SOCKET_COUNT];
-    uint32_t _socket_obj[ISM43362_SOCKET_COUNT]; // store addresses of socket handles
-    Mutex _mutex;
-    Thread thread_read_socket;
-    char ap_ssid[33]; /* 32 is what 802.11 defines as longest possible name; +1 for the \0 */
-    ism_security_t ap_sec;
-    uint8_t ap_ch;
-    char ap_pass[64]; /* The longest allowed passphrase */
-
-    bool _ism_debug;
-    uint32_t _FwVersion;
-
-    void event();
-    struct {
-        void (*callback)(void *);
-        void *data;
-    } _cbs[ISM43362_SOCKET_COUNT];
-
-    /** Function called by the socket read thread to check if data is available on the wifi module
-     *
-     */
-    virtual void socket_check_read();
-    int socket_send_nolock(void *handle, const void *data, unsigned size);
-    int socket_connect_nolock(void *handle, const SocketAddress &addr);
-
-};
-
-#endif
--- a/drivers/network/WIFI_ISM43362/README.md	Sun Dec 16 13:53:42 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-# ISM43362 WiFi driver for mbed-os
-
-The mbed OS driver for the ISM43362 WiFi module
-
-https://www.inventeksys.com/products-page/wifi-modules/ism4336-m3g-l44-e-embedded-serial-to-wifi-module/
-
-
-## Currently supported platforms
-
-ISM43362 module is soldered on the following platforms from STMicroelectronics
-
- * [DISCO_L475VG_IOT01A](https://os.mbed.com/platforms/ST-Discovery-L475E-IOT01A/)
- * [DISCO_F413ZH](https://os.mbed.com/platforms/ST-Discovery-F413H/)
-
-## Configuration
-
-Correct pins have already been configured for both supported platforms.
-
-Here is configured pins:
-
-- MBED_CONF_ISM43362_WIFI_MISO      : spi-miso pin for the ism43362 connection
-- MBED_CONF_ISM43362_WIFI_MOSI     : spi-mosi pin for the ism43362 connection
-- MBED_CONF_ISM43362_WIFI_SPI_SCLK  : spi-clock pin for the ism43362 connection
-- MBED_CONF_ISM43362_WIFI_SPI_NSS   : spi-nss pin for the ism43362 connection
-- MBED_CONF_ISM43362_WIFI_RESET     : Reset pin for the ism43362 wifi module
-- MBED_CONF_ISM43362_WIFI_DATAREADY : Data Ready pin for the ism43362 wifi module
-- MBED_CONF_ISM43362_WIFI_WAKEUP    : Wakeup pin for the ism43362 wifi module
-
-## Debug
-
-Some debug print on console can help to debug if necessary.
-
-- in ISM43362Interface.cpp file, set ism_interface_debug to 1
-- in ISM43362/ISM43362.cpp file, set ism_debug to 1
-- in ISM43362/ATParser/ATParser.cpp file, there are 3 different level : dbg_on / AT_DATA_PRINT / AT_COMMAND_PRINT
-
-Another way to enable these prints is overwrite MBED_CONF_ISM43362_WIFI_DEBUG in your json file:
-            "ism43362.wifi-debug": true
-
-
-## Firmware version
-
-This driver has been tested with C3.5.2.2 and C3.5.2.3.BETA9 firmware version
-
-## wifi module FW update
-
-Only Wifi module from DISCO_L475VG_IOT01A can be updated (HW limitation for DISCO_F413ZH).
-
-For more information about the wifi FW version, refer to the detailed procedure in
-http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32cube-embedded-software-expansion/x-cube-azure.html
--- a/drivers/network/WIFI_ISM43362/mbed_lib.json	Sun Dec 16 13:53:42 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-{
-    "name": "ism43362",
-    "config": {
-        "wifi-miso": {
-            "help": "SPI-MISO connection to external device",
-            "value": "NC"
-        },
-        "wifi-mosi": {
-            "help": "SPI-MOSI connection to external device",
-            "value": "NC"
-        },
-        "wifi-sclk": {
-            "help": "SPI-CLOCK connection to external device",
-            "value": "NC"
-        },
-        "wifi-nss": {
-            "help": "SPI chip select of external device",
-            "value": "NC"
-        },
-        "wifi-reset": {
-            "help": "ISM43362 reset",
-            "value": "NC"
-        },
-        "wifi-dataready": {
-            "help": "ISM43362 dataready",
-            "value": "NC"
-        },
-        "wifi-wakeup": {
-            "help": "ISM43362 wakeup",
-            "value": "NC"
-        },
-        "wifi-debug": {
-            "help": "Defines whether logging is on or off",
-            "value": false
-        },
-        "provide-default": {
-            "help": "Provide default WifiInterface. [true/false]",
-            "value": false
-        }
-    },
-    "target_overrides": {
-        "DISCO_F413ZH": {
-            "ism43362.wifi-miso": "PB_4",
-            "ism43362.wifi-mosi": "PB_5",
-            "ism43362.wifi-sclk": "PB_12",
-            "ism43362.wifi-nss": "PG_11",
-            "ism43362.wifi-reset": "PH_1",
-            "ism43362.wifi-dataready": "PG_12",
-            "ism43362.wifi-wakeup": "PB_15",
-            "ism43362.provide-default": true
-        },
-        "DISCO_L475VG_IOT01A": {
-            "ism43362.wifi-miso": "PC_11",
-            "ism43362.wifi-mosi": "PC_12",
-            "ism43362.wifi-sclk": "PC_10",
-            "ism43362.wifi-nss": "PE_0",
-            "ism43362.wifi-reset": "PE_8",
-            "ism43362.wifi-dataready": "PE_1",
-            "ism43362.wifi-wakeup": "PB_13",
-            "ism43362.provide-default": true
-        }
-     }
-}