Generic Pelion Device Management example for various Advantech modules.

This example is known to work great on the following platforms:

Example Functionality

This example showcases the following device functionality:

  • On timer button increment, simulate Pelion LWM2M button resource change

Use this example with Mbed CLI

1. Import the application into your desktop:

mbed import https://os.mbed.com/teams/Advantech/code/pelion-example-common
cd pelion-example-common

2. Download your developer certificate from pelion portal

3. Compile the program

mbed compile -t <toolchain> -m <TARGET_BOARD>

(supported toolchains : GCC_ARM / ARM / IAR)

4. Copy the binary file pelion-example-common.bin to your mbed device.

Revision:
0:43ff9e3bc244
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/drivers/network/COMPONENT_WIFI_ISM43362/ISM43362/ATParser/BufferedSpi/BufferedSpi.h	Tue Mar 12 13:48:39 2019 +0800
@@ -0,0 +1,234 @@
+
+/**
+ * @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