Added support for the WNC M14A2A Cellular LTE Data Module.

Dependencies:   WNC14A2AInterface

Easy Connect

Easily add all supported connectivity methods to your mbed OS project

This project is derived from https://developer.mbed.org/teams/sandbox/code/simple-mbed-client-example/file/dd6231df71bb/easy-connect.lib. It give user the ability to switch between connectivity methods and includes support for the WNC14A2A Data Module. The `NetworkInterface` API makes this easy, but you still need a mechanism for the user to select the connection method, The selection is made by modifying the `mbed_app.json` file and using `easy_connect()` from your application.

Specifying connectivity method

To add support for the WNC14A2A, add the following to your ``mbed_app.json`` file:

mbed_app.json

{
    "config": {
        "network-interface":{
            "help": "options are ETHERNET,WIFI_ESP8266,WIFI_ODIN,MESH_LOWPAN_ND,MESH_THREAD,WNC14A2A",
            "value": "WNC14A2A"
        }
    },
}

After you choose `WNC14A2A` you'll also need to indicate if you want debug output or not by Enabling (true) or Disabling (false) WNC_DEBUG.

If WNC_DEBUG is enabled, there are 3 different levels of debug output (selected via bit settings). These debug levels are set using the following values:

ValueDescription
1Basic WNC driver debug output
2Comprehensive WNC driver debug output
4Network Layer debug output

You can have any combination of these three bit values for a total value of 0 – 7.

WNC Debug Settings

    "config": {
        "WNC_DEBUG": {
            "value": false
        },
        "WNC_DEBUG_SETTING": {
            "value": 4
        },
    }

Using Easy Connect from your application

Easy Connect has just one function which will either return a `NetworkInterface`-pointer or `NULL`:

Sample Code

#include "easy-connect.h"

int main(int, char**) {
    NetworkInterface* network = easy_connect(true); /* has 1 argument, enable_logging (pass in true to log to serial port) */
    if (!network) {
        printf("Connecting to the network failed... See serial output.\r\n");
        return 1;
    }
 
    // Rest of your program
}

Tested on

  • K64F with Ethernet.
  • AT&T Cellular IoT Starter Kit with WNC M14A2A Cellular Data Module

The WNCInterface class currently supports the following version(s):

  • MPSS: M14A2A_v11.50.164451 APSS: M14A2A_v11.53.164451

License

This library is released under the Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License and 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.

Committer:
group-Avnet
Date:
Wed Apr 19 01:08:11 2017 +0000
Revision:
0:478cfd88041f
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-Avnet 0:478cfd88041f 1
group-Avnet 0:478cfd88041f 2 /**
group-Avnet 0:478cfd88041f 3 * @file Buffer.h
group-Avnet 0:478cfd88041f 4 * @brief Software Buffer - Templated Ring Buffer for most data types
group-Avnet 0:478cfd88041f 5 * @author sam grove
group-Avnet 0:478cfd88041f 6 * @version 1.0
group-Avnet 0:478cfd88041f 7 * @see
group-Avnet 0:478cfd88041f 8 *
group-Avnet 0:478cfd88041f 9 * Copyright (c) 2013
group-Avnet 0:478cfd88041f 10 *
group-Avnet 0:478cfd88041f 11 * Licensed under the Apache License, Version 2.0 (the "License");
group-Avnet 0:478cfd88041f 12 * you may not use this file except in compliance with the License.
group-Avnet 0:478cfd88041f 13 * You may obtain a copy of the License at
group-Avnet 0:478cfd88041f 14 *
group-Avnet 0:478cfd88041f 15 * http://www.apache.org/licenses/LICENSE-2.0
group-Avnet 0:478cfd88041f 16 *
group-Avnet 0:478cfd88041f 17 * Unless required by applicable law or agreed to in writing, software
group-Avnet 0:478cfd88041f 18 * distributed under the License is distributed on an "AS IS" BASIS,
group-Avnet 0:478cfd88041f 19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
group-Avnet 0:478cfd88041f 20 * See the License for the specific language governing permissions and
group-Avnet 0:478cfd88041f 21 * limitations under the License.
group-Avnet 0:478cfd88041f 22 */
group-Avnet 0:478cfd88041f 23
group-Avnet 0:478cfd88041f 24 #ifndef MYBUFFER_H
group-Avnet 0:478cfd88041f 25 #define MYBUFFER_H
group-Avnet 0:478cfd88041f 26
group-Avnet 0:478cfd88041f 27 #include <stdint.h>
group-Avnet 0:478cfd88041f 28 #include <string.h>
group-Avnet 0:478cfd88041f 29
group-Avnet 0:478cfd88041f 30 /** A templated software ring buffer
group-Avnet 0:478cfd88041f 31 *
group-Avnet 0:478cfd88041f 32 * Example:
group-Avnet 0:478cfd88041f 33 * @code
group-Avnet 0:478cfd88041f 34 * #include "mbed.h"
group-Avnet 0:478cfd88041f 35 * #include "MyBuffer.h"
group-Avnet 0:478cfd88041f 36 *
group-Avnet 0:478cfd88041f 37 * MyBuffer <char> buf;
group-Avnet 0:478cfd88041f 38 *
group-Avnet 0:478cfd88041f 39 * int main()
group-Avnet 0:478cfd88041f 40 * {
group-Avnet 0:478cfd88041f 41 * buf = 'a';
group-Avnet 0:478cfd88041f 42 * buf.put('b');
group-Avnet 0:478cfd88041f 43 * char *head = buf.head();
group-Avnet 0:478cfd88041f 44 * puts(head);
group-Avnet 0:478cfd88041f 45 *
group-Avnet 0:478cfd88041f 46 * char whats_in_there[2] = {0};
group-Avnet 0:478cfd88041f 47 * int pos = 0;
group-Avnet 0:478cfd88041f 48 *
group-Avnet 0:478cfd88041f 49 * while(buf.available())
group-Avnet 0:478cfd88041f 50 * {
group-Avnet 0:478cfd88041f 51 * whats_in_there[pos++] = buf;
group-Avnet 0:478cfd88041f 52 * }
group-Avnet 0:478cfd88041f 53 * printf("%c %c\n", whats_in_there[0], whats_in_there[1]);
group-Avnet 0:478cfd88041f 54 * buf.clear();
group-Avnet 0:478cfd88041f 55 * error("done\n\n\n");
group-Avnet 0:478cfd88041f 56 * }
group-Avnet 0:478cfd88041f 57 * @endcode
group-Avnet 0:478cfd88041f 58 */
group-Avnet 0:478cfd88041f 59
group-Avnet 0:478cfd88041f 60 template <typename T>
group-Avnet 0:478cfd88041f 61 class MyBuffer
group-Avnet 0:478cfd88041f 62 {
group-Avnet 0:478cfd88041f 63 private:
group-Avnet 0:478cfd88041f 64 T *_buf;
group-Avnet 0:478cfd88041f 65 volatile uint32_t _wloc;
group-Avnet 0:478cfd88041f 66 volatile uint32_t _rloc;
group-Avnet 0:478cfd88041f 67 uint32_t _size;
group-Avnet 0:478cfd88041f 68
group-Avnet 0:478cfd88041f 69 public:
group-Avnet 0:478cfd88041f 70 /** Create a Buffer and allocate memory for it
group-Avnet 0:478cfd88041f 71 * @param size The size of the buffer
group-Avnet 0:478cfd88041f 72 */
group-Avnet 0:478cfd88041f 73 MyBuffer(uint32_t size = 0x100);
group-Avnet 0:478cfd88041f 74
group-Avnet 0:478cfd88041f 75 /** Get the size of the ring buffer
group-Avnet 0:478cfd88041f 76 * @return the size of the ring buffer
group-Avnet 0:478cfd88041f 77 */
group-Avnet 0:478cfd88041f 78 uint32_t getSize();
group-Avnet 0:478cfd88041f 79
group-Avnet 0:478cfd88041f 80 /** Destry a Buffer and release it's allocated memory
group-Avnet 0:478cfd88041f 81 */
group-Avnet 0:478cfd88041f 82 ~MyBuffer();
group-Avnet 0:478cfd88041f 83
group-Avnet 0:478cfd88041f 84 /** Add a data element into the buffer
group-Avnet 0:478cfd88041f 85 * @param data Something to add to the buffer
group-Avnet 0:478cfd88041f 86 */
group-Avnet 0:478cfd88041f 87 void put(T data);
group-Avnet 0:478cfd88041f 88
group-Avnet 0:478cfd88041f 89 /** Remove a data element from the buffer
group-Avnet 0:478cfd88041f 90 * @return Pull the oldest element from the buffer
group-Avnet 0:478cfd88041f 91 */
group-Avnet 0:478cfd88041f 92 T get(void);
group-Avnet 0:478cfd88041f 93
group-Avnet 0:478cfd88041f 94 /** Get the address to the head of the buffer
group-Avnet 0:478cfd88041f 95 * @return The address of element 0 in the buffer
group-Avnet 0:478cfd88041f 96 */
group-Avnet 0:478cfd88041f 97 T *head(void);
group-Avnet 0:478cfd88041f 98
group-Avnet 0:478cfd88041f 99 /** Reset the buffer to 0. Useful if using head() to parse packeted data
group-Avnet 0:478cfd88041f 100 */
group-Avnet 0:478cfd88041f 101 void clear(void);
group-Avnet 0:478cfd88041f 102
group-Avnet 0:478cfd88041f 103 /** Determine if anything is readable in the buffer
group-Avnet 0:478cfd88041f 104 * @return 1 if something can be read, 0 otherwise
group-Avnet 0:478cfd88041f 105 */
group-Avnet 0:478cfd88041f 106 uint32_t available(void);
group-Avnet 0:478cfd88041f 107
group-Avnet 0:478cfd88041f 108 /** Overloaded operator for writing to the buffer
group-Avnet 0:478cfd88041f 109 * @param data Something to put in the buffer
group-Avnet 0:478cfd88041f 110 * @return
group-Avnet 0:478cfd88041f 111 */
group-Avnet 0:478cfd88041f 112 MyBuffer &operator= (T data)
group-Avnet 0:478cfd88041f 113 {
group-Avnet 0:478cfd88041f 114 put(data);
group-Avnet 0:478cfd88041f 115 return *this;
group-Avnet 0:478cfd88041f 116 }
group-Avnet 0:478cfd88041f 117
group-Avnet 0:478cfd88041f 118 /** Overloaded operator for reading from the buffer
group-Avnet 0:478cfd88041f 119 * @return Pull the oldest element from the buffer
group-Avnet 0:478cfd88041f 120 */
group-Avnet 0:478cfd88041f 121 operator int(void)
group-Avnet 0:478cfd88041f 122 {
group-Avnet 0:478cfd88041f 123 return get();
group-Avnet 0:478cfd88041f 124 }
group-Avnet 0:478cfd88041f 125
group-Avnet 0:478cfd88041f 126 uint32_t peek(char c);
group-Avnet 0:478cfd88041f 127
group-Avnet 0:478cfd88041f 128 };
group-Avnet 0:478cfd88041f 129
group-Avnet 0:478cfd88041f 130 template <class T>
group-Avnet 0:478cfd88041f 131 inline void MyBuffer<T>::put(T data)
group-Avnet 0:478cfd88041f 132 {
group-Avnet 0:478cfd88041f 133 _buf[_wloc++] = data;
group-Avnet 0:478cfd88041f 134 _wloc %= (_size-1);
group-Avnet 0:478cfd88041f 135
group-Avnet 0:478cfd88041f 136 return;
group-Avnet 0:478cfd88041f 137 }
group-Avnet 0:478cfd88041f 138
group-Avnet 0:478cfd88041f 139 template <class T>
group-Avnet 0:478cfd88041f 140 inline T MyBuffer<T>::get(void)
group-Avnet 0:478cfd88041f 141 {
group-Avnet 0:478cfd88041f 142 T data_pos = _buf[_rloc++];
group-Avnet 0:478cfd88041f 143 _rloc %= (_size-1);
group-Avnet 0:478cfd88041f 144
group-Avnet 0:478cfd88041f 145 return data_pos;
group-Avnet 0:478cfd88041f 146 }
group-Avnet 0:478cfd88041f 147
group-Avnet 0:478cfd88041f 148 template <class T>
group-Avnet 0:478cfd88041f 149 inline T *MyBuffer<T>::head(void)
group-Avnet 0:478cfd88041f 150 {
group-Avnet 0:478cfd88041f 151 T *data_pos = &_buf[0];
group-Avnet 0:478cfd88041f 152
group-Avnet 0:478cfd88041f 153 return data_pos;
group-Avnet 0:478cfd88041f 154 }
group-Avnet 0:478cfd88041f 155
group-Avnet 0:478cfd88041f 156 template <class T>
group-Avnet 0:478cfd88041f 157 inline uint32_t MyBuffer<T>::available(void)
group-Avnet 0:478cfd88041f 158 {
group-Avnet 0:478cfd88041f 159 return (_wloc == _rloc) ? 0 : 1;
group-Avnet 0:478cfd88041f 160 }
group-Avnet 0:478cfd88041f 161
group-Avnet 0:478cfd88041f 162 #endif
group-Avnet 0:478cfd88041f 163