Uart with ADXL362

Dependencies:   ADXL362

My Memo's for EV-COG-AD4050LZ Pinname

<<CODE>>
#define GPIO_PORT_SHIFT 12


typedef enum {
    P0_00  = (0 << GPIO_PORT_SHIFT | 0 ),
    P0_01  = (0 << GPIO_PORT_SHIFT | 1 ),
    P0_02  = (0 << GPIO_PORT_SHIFT | 2 ),
    P0_03  = (0 << GPIO_PORT_SHIFT | 3 ),
    P0_04  = (0 << GPIO_PORT_SHIFT | 4 ),
    P0_05  = (0 << GPIO_PORT_SHIFT | 5 ),
    P0_06  = (0 << GPIO_PORT_SHIFT | 6 ),
    P0_07  = (0 << GPIO_PORT_SHIFT | 7 ),
    P0_08  = (0 << GPIO_PORT_SHIFT | 8 ),
    P0_09  = (0 << GPIO_PORT_SHIFT | 9 ),
    P0_10 = (0 << GPIO_PORT_SHIFT | 10),
    P0_11 = (0 << GPIO_PORT_SHIFT | 11),
    P0_12 = (0 << GPIO_PORT_SHIFT | 12),
    P0_13 = (0 << GPIO_PORT_SHIFT | 13),
    P0_14 = (0 << GPIO_PORT_SHIFT | 14),
    P0_15 = (0 << GPIO_PORT_SHIFT | 15),
    P1_00  = (1 << GPIO_PORT_SHIFT | 0 ),
    P1_01  = (1 << GPIO_PORT_SHIFT | 1 ),
    P1_02  = (1 << GPIO_PORT_SHIFT | 2 ),
    P1_03  = (1 << GPIO_PORT_SHIFT | 3 ),
    P1_04  = (1 << GPIO_PORT_SHIFT | 4 ),
    P1_05  = (1 << GPIO_PORT_SHIFT | 5 ),
    P1_06  = (1 << GPIO_PORT_SHIFT | 6 ),
    P1_07  = (1 << GPIO_PORT_SHIFT | 7 ),
    P1_08  = (1 << GPIO_PORT_SHIFT | 8 ),
    P1_09  = (1 << GPIO_PORT_SHIFT | 9 ),
    P1_10 = (1 << GPIO_PORT_SHIFT | 10),
    P1_11 = (1 << GPIO_PORT_SHIFT | 11),
    P1_12 = (1 << GPIO_PORT_SHIFT | 12),
    P1_13 = (1 << GPIO_PORT_SHIFT | 13),
    P1_14 = (1 << GPIO_PORT_SHIFT | 14),
    P1_15 = (1 << GPIO_PORT_SHIFT | 15),
    P2_00  = (2 << GPIO_PORT_SHIFT | 0 ),
    P2_01  = (2 << GPIO_PORT_SHIFT | 1 ),
    P2_02  = (2 << GPIO_PORT_SHIFT | 2 ),
    P2_03  = (2 << GPIO_PORT_SHIFT | 3 ),
    P2_04  = (2 << GPIO_PORT_SHIFT | 4 ),
    P2_05  = (2 << GPIO_PORT_SHIFT | 5 ),
    P2_06  = (2 << GPIO_PORT_SHIFT | 6 ),
    P2_07  = (2 << GPIO_PORT_SHIFT | 7 ),
    P2_08  = (2 << GPIO_PORT_SHIFT | 8 ),
    P2_09  = (2 << GPIO_PORT_SHIFT | 9 ),
    P2_10 = (2 << GPIO_PORT_SHIFT | 10),
    P2_11 = (2 << GPIO_PORT_SHIFT | 11),

    // USB Pins
    USBTX = P0_10,
    USBRX = P0_11,
    USBTX1 = P1_15,
    USBRX1 = P2_00,

    // mbed original LED naming
    LED1 = P2_02,
    LED2 = P2_10,
    LED3 = LED2,
    LED4 = LED1,

    //Push buttons
    PB0 = P1_00,        // BTN1
    PB1 = P0_09,        // BTN2
    BUTTON1 = P1_00,    // BTN1
    BUTTON2 = P0_09,    // BTN2

    BOOT = P1_01,
    WAKE0 = P0_15,      // JP15 to select
    WAKE1 = P1_00,      // JP8 (BTN1 jumper) to select
    WAKE2 = P0_13,      // JP4 to select
    WAKE3 = P2_01,      // JP15 to select

    // SPI Pins
    SPI0_SCLK = P0_00,
    SPI0_MOSI = P0_01,
    SPI0_MISO = P0_02,
    SPI0_CS0 = P0_03,
    SPI0_CS1 = P1_10,
    SPI0_CS2 = P2_08,
    SPI0_CS3 = P2_09,

    SPI1_SCLK = P1_06,
    SPI1_MOSI = P1_07,
    SPI1_MISO = P1_08,
    SPI1_CS0 = P1_09,
    SPI1_CS1 = P2_11,
    SPI1_CS2 = P2_02,
    SPI1_CS3 = P1_10,

    SPI2_SCLK = P1_02,
    SPI2_MOSI = P1_03,
    SPI2_MISO = P1_04,
    SPI2_CS0 = P1_05,
    SPI2_CS1 = P0_09,
    SPI2_CS2 = P2_10,
    SPI2_CS3 = P2_07,

    // ADC Pins
    ADC_VIN0 = P2_03,
    ADC_VIN1 = P2_04,
    ADC_VIN2 = P2_05,
    ADC_VIN3 = P2_06,
    ADC_VIN4 = P2_07,
    ADC_VIN5 = P2_08,
    ADC_VIN6 = P2_09,
    ADC_VIN7 = P2_10,

    // Arduino Headers
    D0 = P0_10,        // UART0_TXD
    D1 = P0_11,        // UART0_RXD
    D2 = P0_15,        // INT_WAKE0
    D3 = P0_13,        // EXT_INT_WAKE2
    D4 = P0_09,        // EXT_SPI2_CS1
    D5 = P2_01,        // INT_WAKE3 or EXT_RTC1_SS1 via JP8
    D6 = P1_11,        // GPIO_27
    D7 = P0_12,        // GPIO_08 or GPIO_12 via JP7

    D8 = P1_12,         // GPIO_28
    D9 = P1_14,         // GPIO_30
    D10 = SPI0_CS2,     // P2_08
    D11 = SPI0_MOSI,    // P0_01
    D12 = SPI0_MISO,    // P0_02
    D13 = SPI0_SCLK,    // P0_00
    I2C_SCL = P0_04,    // I2C_SCL
    I2C_SDA = P0_05,    // I2C_SDA

    A0 = P2_03,         // ADC0
    A1 = P2_04,         // EXT_ADC1
    A2 = P2_05,         // EXT_ADC2
    A3 = P2_06,         // ADC3
    A4 = P2_07,         // SPI2_CS3
    A5 = P2_10,         // EXT_GPIO42

    // Not connected
    NC = (int)0xFFFFFFFF
} PinName;
<</CODE>>

Files at this revision

API Documentation at this revision

Comitter:
APS_Lab
Date:
Fri Jan 11 07:06:37 2019 +0000
Commit message:
First update

Changed in this revision

.gitignore Show annotated file Show diff for this revision Revisions of this file
ADXL362.lib Show annotated file Show diff for this revision Revisions of this file
CONTRIBUTING.md Show annotated file Show diff for this revision Revisions of this file
README.md Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
mbed_app.json Show annotated file Show diff for this revision Revisions of this file
stats_report.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 5868fc6c16b3 .gitignore
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.gitignore	Fri Jan 11 07:06:37 2019 +0000
@@ -0,0 +1,4 @@
+.build
+.mbed
+projectfiles
+*.py*
diff -r 000000000000 -r 5868fc6c16b3 ADXL362.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ADXL362.lib	Fri Jan 11 07:06:37 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/APS_Lab/code/ADXL362/#860fafcf34d6
diff -r 000000000000 -r 5868fc6c16b3 CONTRIBUTING.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CONTRIBUTING.md	Fri Jan 11 07:06:37 2019 +0000
@@ -0,0 +1,5 @@
+# Contributing to Mbed OS
+
+Mbed OS is an open-source, device software platform for the Internet of Things. Contributions are an important part of the platform, and our goal is to make it as simple as possible to become a contributor.
+
+To encourage productive collaboration, as well as robust, consistent and maintainable code, we have a set of guidelines for [contributing to Mbed OS](https://os.mbed.com/docs/latest/reference/contributing.html).
diff -r 000000000000 -r 5868fc6c16b3 README.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README.md	Fri Jan 11 07:06:37 2019 +0000
@@ -0,0 +1,170 @@
+# Getting started example for Mbed OS
+
+This guide reviews the steps required to get Blinky with the addition of dynamic OS statistics working on an Mbed OS platform.
+
+Please install [mbed CLI](https://github.com/ARMmbed/mbed-cli#installing-mbed-cli).
+
+## Import the example application
+
+From the command-line, import the example:
+
+```
+mbed import mbed-os-example-blinky
+cd mbed-os-example-blinky
+```
+
+### Now compile
+
+Invoke `mbed compile`, and specify the name of your platform and your favorite toolchain (`GCC_ARM`, `ARM`, `IAR`). For example, for the ARM Compiler 5:
+
+```
+mbed compile -m K64F -t ARM
+```
+
+Your PC may take a few minutes to compile your code. At the end, you see the following result:
+
+```
+[snip]
++----------------------------+-------+-------+------+
+| Module             |     .text |    .data |     .bss |
+|--------------------|-----------|----------|----------|
+| [fill]             |    98(+0) |    0(+0) | 2211(+0) |
+| [lib]/c.a          | 27835(+0) | 2472(+0) |   89(+0) |
+| [lib]/gcc.a        |  3168(+0) |    0(+0) |    0(+0) |
+| [lib]/misc         |   248(+0) |    8(+0) |   28(+0) |
+| [lib]/nosys.a      |    32(+0) |    0(+0) |    0(+0) |
+| main.o             |   924(+0) |    0(+0) |   12(+0) |
+| mbed-os/components |   134(+0) |    0(+0) |    0(+0) |
+| mbed-os/drivers    |    56(+0) |    0(+0) |    0(+0) |
+| mbed-os/features   |    42(+0) |    0(+0) |  184(+0) |
+| mbed-os/hal        |  2087(+0) |    8(+0) |  152(+0) |
+| mbed-os/platform   |  3633(+0) |  260(+0) |  209(+0) |
+| mbed-os/rtos       |  9370(+0) |  168(+0) | 6053(+0) |
+| mbed-os/targets    |  9536(+0) |   12(+0) |  382(+0) |
+| Subtotals          | 57163(+0) | 2928(+0) | 9320(+0) |
+Total Static RAM memory (data + bss): 12248(+0) bytes
+Total Flash memory (text + data): 60091(+0) bytes
+
+Image: ./BUILD/K64F/GCC_ARM/mbed-os-example-blinky.bin
+```
+
+### Program your board
+
+1. Connect your mbed device to the computer over USB.
+1. Copy the binary file to the mbed device.
+1. Press the reset button to start the program.
+
+The LED on your platform turns on and off. The main thread will additionally take a snapshot of the device's runtime statistics and display it over serial to your PC. The snapshot includes:
+
+* System Information:
+    * Mbed OS Version: Will currently default to 999999
+    * Compiler ID
+        * ARM = 1
+        * GCC_ARM = 2
+        * IAR = 3
+    * [CPUID Register Information](#cpuid-register-information)
+    * [Compiler Version](#compiler-version)
+* CPU Statistics
+    * Percentage of runtime that the device has spent awake versus in sleep
+* Heap Statistics
+    * Current heap size
+    * Max heap size which refers to the largest the heap has grown to
+* Thread Statistics
+    * Provides information on all running threads in the OS including
+        * Thread ID
+        * Thread Name
+        * Thread State
+        * Thread Priority
+        * Thread Stack Size
+        * Thread Stack Space
+
+#### Compiler Version
+
+| Compiler | Version Layout |
+| -------- | -------------- |
+| ARM      | PVVbbbb (P = Major; VV = Minor; bbbb = build number) |
+| GCC      | VVRRPP  (VV = Version; RR = Revision; PP = Patch)    |
+| IAR      | VRRRPPP (V = Version; RRR = Revision; PPP = Patch)   |
+
+#### CPUID Register Information
+
+| Bit Field | Field Description | Values |
+| --------- | ----------------- | ------ |
+|[31:24]    | Implementer       | 0x41 = ARM |
+|[23:20]    | Variant           | Major revision 0x0  =  Revision 0 |
+|[19:16]    | Architecture      | 0xC  = Baseline Architecture |
+|           |                   | 0xF  = Constant (Mainline Architecture) |
+|[15:4]     | Part Number       | 0xC20 =  Cortex-M0 |
+|           |                   | 0xC60 = Cortex-M0+ |
+|           |                   | 0xC23 = Cortex-M3  |
+|           |                   | 0xC24 = Cortex-M4  |
+|           |                   | 0xC27 = Cortex-M7  |
+|           |                   | 0xD20 = Cortex-M23 |
+|           |                   | 0xD21 = Cortex-M33 |
+|[3:0]      | Revision          | Minor revision: 0x1 = Patch 1 |
+
+
+
+You can view individual examples and additional API information of the statistics collection tools at the bottom of the page in the [related links section](#related-links).
+
+
+### Output
+
+To view the serial output you can use any terminal client of your choosing such as [PuTTY](http://www.putty.org/) or [CoolTerm](http://freeware.the-meiers.org/).
+
+The default baud rate for this application is set to `115200` and may be modified in the `mbed_app.json` file.
+
+You can find more information on the Mbed OS configuration tools and serial communication in Mbed OS in the related [related links section](#related-links).
+
+The output should contain the following block transmitted at the blinking LED frequency (actual values may vary depending on your target, build profile, and toolchain):
+
+```
+=============================== SYSTEM INFO  ================================
+Mbed OS Version: 999999
+CPU ID: 0x410fc241
+Compiler ID: 2
+Compiler Version: 60300
+================= CPU STATS =================
+Idle: 98% Usage: 2%
+================ HEAP STATS =================
+Current heap: 1096
+Max heap size: 1096
+================ THREAD STATS ===============
+ID: 0x20001eac
+Name: main_thread
+State: 2
+Priority: 24
+Stack Size: 4096
+Stack Space: 3296
+
+ID: 0x20000f5c
+Name: idle_thread
+State: 1
+Priority: 1
+Stack Size: 512
+Stack Space: 352
+
+ID: 0x20000f18
+Name: timer_thread
+State: 3
+Priority: 40
+Stack Size: 768
+Stack Space: 664
+
+```
+
+## Troubleshooting
+
+If you have problems, you can review the [documentation](https://os.mbed.com/docs/latest/tutorials/debugging.html) for suggestions on what could be wrong and how to fix it.
+
+## Related Links
+
+* [Mbed OS Stats API](https://os.mbed.com/docs/latest/apis/mbed-statistics.html)
+* [Mbed OS Configuration](https://os.mbed.com/docs/latest/reference/configuration.html)
+* [Mbed OS Serial Communication](https://os.mbed.com/docs/latest/tutorials/serial-communication.html)
+
+### License and contributions
+
+The software is provided under Apache-2.0 license. Contributions to this project are accepted under the same license. Please see contributing.md for more info.
+
+This project contains code from other projects. The original license text is included in those source files. They must comply with our license guide.
diff -r 000000000000 -r 5868fc6c16b3 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Jan 11 07:06:37 2019 +0000
@@ -0,0 +1,301 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2018 ARM Limited
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include "mbed.h"
+#include "stats_report.h"
+#include "ADXL362.h"
+#include "math.h"
+
+#define G_2 1.0
+#define G_4 2.0
+#define G_8 4.0
+
+
+
+#define MODE_NORMAL 0
+#define MODE_LOW_POWER 1
+#define MODE_ULTRA_LOW_POWER 2
+
+DigitalOut led1(LED1);
+Serial PC(USBTX, USBRX);
+
+char Buf[128];
+char command[8];
+char mode[8];
+char val[8];
+int f_val;
+
+int set_mode(int m);
+int set_freq(int v);
+int set_grav(int v);
+void set_start(void);
+void set_stop(void);
+static void clearDisplay(void);
+static void drawCLI(ADXL362 *adxlCtrl, AccelTemp *getData);
+volatile int f_run = 0;
+volatile int f_wake = 0;
+SPI         *spi1;
+ADXL362     *adxlCtrl;
+AccelTemp GetData;
+DigitalIn ADXL_WAKE(WAKE2);
+ 
+        
+// main() runs in its own thread in the OS
+int main()
+{
+    PC.baud(115200);
+    PC.printf("EV-COG-AD4050LZ Demo\n");
+
+    spi1 = new SPI(SPI1_MOSI, SPI1_MISO, SPI1_SCLK);
+    adxlCtrl = new ADXL362(&PC, spi1); 
+
+    clearDisplay();
+    
+    while (true) {
+        // Blink LED and wait 0.5 seconds
+        led1 = !led1;
+        wait_ms(500);
+
+        PC.scanf("%s", command);
+        
+        if(strncmp(command, "set", 3) == 0)
+        {
+            PC.scanf("%s",mode);
+            
+            if(strncmp(mode, "freq", 4) == 0)
+            {
+                PC.scanf("%s", val);
+                f_val = atoi(val);
+                set_freq(f_val);
+            }
+            else if(strncmp(mode, "mode", 4) == 0)
+            {
+                PC.scanf("%s", val);
+                f_val = atoi(val);
+                set_mode(f_val);
+            }
+            else if(strncmp(mode, "grav", 4) == 0)
+            {
+                PC.scanf("%s", val);
+                f_val = atoi(val);
+                set_grav(f_val);
+            }
+            else if(strncmp(mode, "wakeup", 6) == 0)
+            {
+                PC.printf("ADXL362 wakeup mode\n");
+                adxlCtrl->set_wakeupmode();
+                f_wake = 1;
+                PC.printf("ADXL362 wakeup waiting......\n");
+                while(f_wake)
+                {
+                    if()
+                    {
+                        f_wake = 0;
+                        PC.printf("ADXL362 Wake-up\n");
+                    }
+                }
+                
+                
+            }else
+            {
+                PC.printf("Command Invalid\n");
+            }
+        }
+        else if(strncmp(command, "start", 5) == 0)
+        {
+            set_start();
+            while(f_run)
+            {
+                adxlCtrl->SensorRead(&GetData);
+                drawCLI(adxlCtrl, &GetData);
+                wait(0.5);
+            }
+        }
+        //else if(strncmp(command, "stop", 4) == 0)
+        //{
+        //    set_stop();
+        //}
+        else
+        {
+            PC.printf("Command Usage\n");
+            PC.printf("Command : only 'set'\n");
+            PC.printf("Mode    : 'freq' is ODR configuration\n");
+            PC.printf("        : ODR frequency from 12, 25, 50, 100, 200, 400Hz\n");
+            PC.printf("Mode    : 'grav' is select gravity\n");
+            PC.printf("        : 0:2g 1:4g 2:8g\n");
+            PC.printf("Mode    : 'mode' is power mode\n");
+            PC.printf("        : 0:Normal 1:Low Power 2:Ultra Low Power(freq is fixed at 100Hz)\n");
+            PC.printf("i.e.  'set mode 0'\n");
+            PC.printf("i.e.  'set freq 1000'\n");
+            PC.printf("i.e.  'start'\n");
+        }
+        // Following the main thread wait, report on the current system status
+        //sys_state.report_state();
+    }
+}
+
+
+int set_freq(int v)
+{
+    if((v < 12) || (v > 400)) 
+    {
+        PC.printf("ODR Freqency Range is over/under. Please configure for 12-400 Hz.\n");
+        return 1;
+    }
+    else
+    {
+        PC.printf("Set Frequency %d Hz\n", v);
+        return 0;
+    }
+}
+
+int set_grav(int v)
+{
+    switch(v)
+    {
+        case 0:
+            PC.printf("Set gravity 2g\n");
+            adxlCtrl->set_gravity(GRAVITY_2G);
+            break;
+        case 1:
+            PC.printf("Set gravity 4g\n");
+            adxlCtrl->set_gravity(GRAVITY_4G);
+            break;
+        case 2:
+            PC.printf("Set gravity 8g\n");
+            adxlCtrl->set_gravity(GRAVITY_8G);
+            break;
+        default:
+            PC.printf("Unknown Command\n");
+            break;
+    };
+    
+    return 0;
+}
+int set_mode(int m)
+{
+    switch(m)
+    {
+        case MODE_NORMAL:
+            PC.printf("Set Normal Mode\n");
+            adxlCtrl->set_powermode(POWER_CTL_PARAM_LOWNOISE_NORM);
+            break;
+        case MODE_LOW_POWER:
+            PC.printf("Set Low Power Mode\n");
+            adxlCtrl->set_powermode(POWER_CTL_PARAM_LOWNOISE_LOW);
+            break;
+        case MODE_ULTRA_LOW_POWER:
+            PC.printf("Set Ultra Low Power Mode\n");
+            adxlCtrl->set_powermode(POWER_CTL_PARAM_LOWNOISE_ULTRA);
+            break;
+        default:
+            PC.printf("Unknown Command\n");
+            break;
+    };
+    
+    return 0;
+}
+
+void set_start(void)
+{
+    f_run = 1;
+    adxlCtrl->start();
+    PC.printf("Start Accel\n");
+}
+
+void set_stop(void)
+{
+    f_run = 0;
+    adxlCtrl->stop();
+    PC.printf("Stop Accel\n");
+}
+
+static void clearDisplay(void)
+{
+    PC.printf("\033[2J");
+    PC.printf("\033[0;0H");
+    PC.printf("\033[0m\033[37m");    
+}
+
+static void drawCLI(ADXL362 *adxlCtrl, AccelTemp *getData)
+{
+    AccelTemp *min = adxlCtrl->GetMinInfo();
+    AccelTemp *max = adxlCtrl->GetMaxInfo();
+    AccelTemp *p;
+    float x, y, z, t;
+    
+    PC.printf("\033[2J");
+    
+    /* BLANK LINE */
+    
+    PC.printf("\033[0m\033[33m\033[1m");
+    PC.printf("\033[2;1H");
+    PC.printf("\033[K");
+    PC.printf("ACCELEROMETERs");
+    
+    PC.printf("\033[0m\033[37m");
+    PC.printf("\033[3;3H");
+    PC.printf("\033[K");
+    PC.printf("\033[3;10H-X---\033[3;20H-Y---\033[3;30H-Z---");
+    
+    PC.printf("\033[0m\033[35m");
+    PC.printf("\033[4;3H");
+    PC.printf("\033[K");
+    p = min;
+    x = sin(adxlCtrl->ConvAccel(p->ax));
+    y = adxlCtrl->ConvAccel(p->ay);
+    z = adxlCtrl->ConvAccel(p->az);
+    PC.printf("min\033[4;10H%04.2f\033[4;20H%04.2f\033[4;30H%04.2f", x, y, z);
+    
+    PC.printf("\033[0m\033[37m\033[1m");
+    PC.printf("\033[5;3H");
+    PC.printf("\033[K");
+    p = getData;
+    x = adxlCtrl->ConvAccel(p->ax);
+    y = adxlCtrl->ConvAccel(p->ay);
+    z = adxlCtrl->ConvAccel(p->az);
+    PC.printf("-->\033[5;10H%04.2f\033[5;20H%04.2f\033[5;30H%04.2f", x, y, z);
+    
+    PC.printf("\033[0m\033[36m");
+    PC.printf("\033[6;3H");
+    PC.printf("\033[K");
+    p = max;
+    x = adxlCtrl->ConvAccel(p->ax);
+    y = adxlCtrl->ConvAccel(p->ay);
+    z = adxlCtrl->ConvAccel(p->az);
+    PC.printf("max\033[6;10H%04.2f\033[6;20H%04.2f\033[6;30H%04.2f", x, y, z);
+    
+    /* BLANK LINE */
+        
+    PC.printf("\033[0m\033[31m\033[1m");
+    PC.printf("\033[8;1H");
+    PC.printf("\033[K");
+    PC.printf("Temperature");
+
+    /* BLANK LINE */
+
+    PC.printf("\033[0m\033[35m");
+    PC.printf("\033[10;3H");
+    PC.printf("\033[K");
+    p = min;
+    t = adxlCtrl->ConvThermal(p->tm);
+    PC.printf("min\033[10;10H%04.2f", t);
+
+    PC.printf("\033[0m\033[37m\033[1m");
+    PC.printf("\033[11;3H");
+    PC.printf("\033[K");
+    p = getData;
+    t = adxlCtrl->ConvThermal(p->tm);
+    PC.printf("-->\033[11;10H%04.2f", t);
+    
+    PC.printf("\033[0m\033[36m");
+    PC.printf("\033[12;3H");
+    PC.printf("\033[K");
+    p = max;
+    t = adxlCtrl->ConvThermal(p->tm);
+    PC.printf("max\033[12;10H%04.2f", t);
+}
+
+    
\ No newline at end of file
diff -r 000000000000 -r 5868fc6c16b3 mbed-os.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-os.lib	Fri Jan 11 07:06:37 2019 +0000
@@ -0,0 +1,1 @@
+https://github.com/ARMmbed/mbed-os/#c966348d3f9ca80843be7cdc9b748f06ea73ced0
diff -r 000000000000 -r 5868fc6c16b3 mbed_app.json
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_app.json	Fri Jan 11 07:06:37 2019 +0000
@@ -0,0 +1,12 @@
+{
+    "target_overrides": {
+        "*": {
+            "platform.stdio-baud-rate": 115200,
+            "platform.stack-stats-enabled": true,
+            "platform.heap-stats-enabled": true,
+            "platform.cpu-stats-enabled": true,
+            "platform.thread-stats-enabled": true,
+            "platform.sys-stats-enabled": true
+        }
+    }
+}
diff -r 000000000000 -r 5868fc6c16b3 stats_report.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stats_report.h	Fri Jan 11 07:06:37 2019 +0000
@@ -0,0 +1,121 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2018 ARM Limited
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#ifndef STATS_REPORT_H
+#define STATS_REPORT
+
+#include "mbed.h"
+
+/**
+ *  System Reporting library. Provides runtime information on device:
+ *      - CPU sleep, idle, and wake times
+ *      - Heap and stack usage
+ *      - Thread information
+ *      - Static system information
+ */
+class SystemReport {
+    mbed_stats_heap_t   heap_stats;
+    mbed_stats_cpu_t    cpu_stats;
+    mbed_stats_sys_t    sys_stats;
+
+    mbed_stats_thread_t *thread_stats;
+    uint8_t   thread_count;
+    uint8_t   max_thread_count;
+    uint32_t  sample_time_ms;
+
+public:
+    /**
+     *  SystemReport - Sample rate in ms is required to handle the CPU percent awake logic
+     */
+    SystemReport(uint32_t sample_rate) : max_thread_count(8), sample_time_ms(sample_rate)
+    {
+        thread_stats = new mbed_stats_thread_t[max_thread_count];
+
+        // Collect the static system information
+        mbed_stats_sys_get(&sys_stats);
+
+        printf("=============================== SYSTEM INFO  ================================\r\n");
+        printf("Mbed OS Version: %ld \r\n", sys_stats.os_version);
+        printf("CPU ID: 0x%lx \r\n", sys_stats.cpu_id);
+        printf("Compiler ID: %d \r\n", sys_stats.compiler_id);
+        printf("Compiler Version: %ld \r\n", sys_stats.compiler_version);
+    }
+
+    ~SystemReport(void)
+    {
+        free(thread_stats);
+    }
+
+    /**
+     *  Report on each Mbed OS Platform stats API
+     */
+    void report_state(void)
+    {
+        report_cpu_stats();
+        report_heap_stats();
+        report_thread_stats();
+
+        // Clear next line to separate subsequent report logs
+        printf("\r\n");
+    }
+
+    /**
+     *  Report CPU idle and awake time in terms of percentage
+     */
+    void report_cpu_stats(void)
+    {
+        static uint64_t prev_idle_time = 0;
+
+        printf("================= CPU STATS =================\r\n");
+
+        // Collect and print cpu stats
+        mbed_stats_cpu_get(&cpu_stats);
+
+        uint64_t diff = (cpu_stats.idle_time - prev_idle_time);
+        uint8_t idle = (diff * 100) / (sample_time_ms * 1000);  // usec;
+        uint8_t usage = 100 - ((diff * 100) / (sample_time_ms * 1000));  // usec;;
+        prev_idle_time = cpu_stats.idle_time;
+
+        printf("Idle: %d%% Usage: %d%% \r\n", idle, usage);
+    }
+
+    /**
+     *  Report current heap stats. Current heap refers to the current amount of
+     *  allocated heap. Max heap refers to the highest amount of heap allocated
+     *  since reset.
+     */
+    void report_heap_stats(void)
+    {
+        printf("================ HEAP STATS =================\r\n");
+
+        // Collect and print heap stats
+        mbed_stats_heap_get(&heap_stats);
+
+        printf("Current heap: %lu\r\n", heap_stats.current_size);
+        printf("Max heap size: %lu\r\n", heap_stats.max_size);
+    }
+
+    /**
+     *  Report active thread stats
+     */
+    void report_thread_stats(void)
+    {
+        printf("================ THREAD STATS ===============\r\n");
+
+        // Collect and print running thread stats
+        int count = mbed_stats_thread_get_each(thread_stats, max_thread_count);
+
+        for (int i = 0; i < count; i++) {
+            printf("ID: 0x%lx \r\n",        thread_stats[i].id);
+            printf("Name: %s \r\n",         thread_stats[i].name);
+            printf("State: %ld \r\n",       thread_stats[i].state);
+            printf("Priority: %ld \r\n",    thread_stats[i].priority);
+            printf("Stack Size: %ld \r\n",  thread_stats[i].stack_size);
+            printf("Stack Space: %ld \r\n", thread_stats[i].stack_space);
+        }
+    }
+};
+
+#endif // STATS_REPORT_H