Utility library for HSP SPo2 HR demo including user interface, board support adn accelerometer.

Files at this revision

API Documentation at this revision

Comitter:
gmehmet
Date:
Mon Dec 17 13:58:56 2018 +0300
Commit message:
create and put source to HSP demo utility repo

Changed in this revision

demoAccelerometer/bmi160.cpp Show annotated file Show diff for this revision Revisions of this file
demoAccelerometer/bmi160.h Show annotated file Show diff for this revision Revisions of this file
demoAccelerometer/bmi160_i2c.cpp Show annotated file Show diff for this revision Revisions of this file
demoAccelerometer/bmi160_spi.cpp Show annotated file Show diff for this revision Revisions of this file
demoPlatform/MAX20303.cpp Show annotated file Show diff for this revision Revisions of this file
demoPlatform/MAX20303.h Show annotated file Show diff for this revision Revisions of this file
demoPlatform/max32630hsp.cpp Show annotated file Show diff for this revision Revisions of this file
demoPlatform/max32630hsp.h Show annotated file Show diff for this revision Revisions of this file
demoUI/demoUI.cpp Show annotated file Show diff for this revision Revisions of this file
demoUI/demoUI.h Show annotated file Show diff for this revision Revisions of this file
demoUI/screen/BufferedDisplay.cpp Show annotated file Show diff for this revision Revisions of this file
demoUI/screen/BufferedDisplay.h Show annotated file Show diff for this revision Revisions of this file
demoUI/screen/GraphicsDisplay.cpp Show annotated file Show diff for this revision Revisions of this file
demoUI/screen/GraphicsDisplay.h Show annotated file Show diff for this revision Revisions of this file
demoUI/screen/LCDSettings.h Show annotated file Show diff for this revision Revisions of this file
demoUI/screen/LS013B7DH03.ZIP Show annotated file Show diff for this revision Revisions of this file
demoUI/screen/LS013B7DH03.cpp Show annotated file Show diff for this revision Revisions of this file
demoUI/screen/LS013B7DH03.h Show annotated file Show diff for this revision Revisions of this file
demoUI/screen/TextDisplay.cpp Show annotated file Show diff for this revision Revisions of this file
demoUI/screen/TextDisplay.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r a12d6976d64c demoAccelerometer/bmi160.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoAccelerometer/bmi160.cpp	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,723 @@
+/**********************************************************************
+* Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+**********************************************************************/
+
+
+#include "bmi160.h"
+
+
+const struct BMI160::AccConfig BMI160::DEFAULT_ACC_CONFIG = {SENS_2G,
+                                                             ACC_US_OFF,
+                                                             ACC_BWP_2,
+                                                             ACC_ODR_8};
+
+const struct BMI160::GyroConfig BMI160::DEFAULT_GYRO_CONFIG = {DPS_2000,
+                                                               GYRO_BWP_2,
+                                                               GYRO_ODR_8};
+
+
+//*****************************************************************************
+int32_t BMI160::setSensorPowerMode(Sensors sensor, PowerModes pwrMode)
+{
+    int32_t rtnVal = -1;
+
+    switch(sensor)
+    {
+        case MAG:
+            rtnVal = writeRegister(CMD, (MAG_SET_PMU_MODE | pwrMode));
+        break;
+
+        case GYRO:
+            rtnVal = writeRegister(CMD, (GYR_SET_PMU_MODE | pwrMode));
+        break;
+
+        case ACC:
+            rtnVal = writeRegister(CMD, (ACC_SET_PMU_MODE | pwrMode));
+        break;
+
+        default:
+            rtnVal = -1;
+        break;
+    }
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160::setSensorConfig(const AccConfig &config)
+{
+    uint8_t data[2];
+
+    data[0] = ((config.us << ACC_US_POS) | (config.bwp << ACC_BWP_POS) |
+               (config.odr << ACC_ODR_POS));
+    data[1] = config.range;
+
+    return writeBlock(ACC_CONF, ACC_RANGE, data);
+}
+
+
+//*****************************************************************************
+int32_t BMI160::setSensorConfig(const GyroConfig &config)
+{
+    uint8_t data[2];
+
+    data[0] = ((config.bwp << GYRO_BWP_POS) | (config.odr << GYRO_ODR_POS));
+    data[1] = config.range;
+
+    return writeBlock(GYR_CONF, GYR_RANGE, data);
+}
+
+
+//*****************************************************************************
+int32_t BMI160::getSensorConfig(AccConfig &config)
+{
+    uint8_t data[2];
+    int32_t rtnVal = readBlock(ACC_CONF, ACC_RANGE, data);
+
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        config.range = static_cast<BMI160::AccRange>(
+        (data[1] & ACC_RANGE_MASK));
+        config.us = static_cast<BMI160::AccUnderSampling>(
+        ((data[0] & ACC_US_MASK) >> ACC_US_POS));
+        config.bwp = static_cast<BMI160::AccBandWidthParam>(
+        ((data[0] & ACC_BWP_MASK) >> ACC_BWP_POS));
+        config.odr = static_cast<BMI160::AccOutputDataRate>(
+        ((data[0] & ACC_ODR_MASK) >> ACC_ODR_POS));
+    }
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160::getSensorConfig(GyroConfig &config)
+{
+    uint8_t data[2];
+    int32_t rtnVal = readBlock(GYR_CONF, GYR_RANGE, data);
+
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        config.range = static_cast<BMI160::GyroRange>(
+        (data[1] & GYRO_RANGE_MASK));
+        config.bwp = static_cast<BMI160::GyroBandWidthParam>(
+        ((data[0] & GYRO_BWP_MASK) >> GYRO_BWP_POS));
+        config.odr = static_cast<BMI160::GyroOutputDataRate>(
+        ((data[0] & GYRO_ODR_MASK) >> GYRO_ODR_POS));
+    }
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160::getSensorAxis(SensorAxis axis, AxisData &data, AccRange range)
+{
+    uint8_t localData[2];
+    int32_t rtnVal;
+
+    switch(axis)
+    {
+        case X_AXIS:
+            rtnVal = readBlock(DATA_14, DATA_15, localData);
+        break;
+
+        case Y_AXIS:
+            rtnVal = readBlock(DATA_16, DATA_17, localData);
+        break;
+
+        case Z_AXIS:
+            rtnVal = readBlock(DATA_18, DATA_19, localData);
+        break;
+
+        default:
+            rtnVal = -1;
+        break;
+    }
+
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        data.raw = ((localData[1] << 8) | localData[0]);
+        switch(range)
+        {
+            case SENS_2G:
+                data.scaled = (data.raw/SENS_2G_LSB_PER_G);
+            break;
+
+            case SENS_4G:
+                data.scaled = (data.raw/SENS_4G_LSB_PER_G);
+            break;
+
+            case SENS_8G:
+                data.scaled = (data.raw/SENS_8G_LSB_PER_G);
+            break;
+
+            case SENS_16G:
+                data.scaled = (data.raw/SENS_16G_LSB_PER_G);
+            break;
+        }
+    }
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160::getSensorAxis(SensorAxis axis, AxisData &data, GyroRange range)
+{
+    uint8_t localData[2];
+    int32_t rtnVal;
+
+    switch(axis)
+    {
+        case X_AXIS:
+            rtnVal = readBlock(DATA_8, DATA_9, localData);
+        break;
+
+        case Y_AXIS:
+            rtnVal = readBlock(DATA_10, DATA_11, localData);
+        break;
+
+        case Z_AXIS:
+            rtnVal = readBlock(DATA_12, DATA_13, localData);
+        break;
+
+        default:
+            rtnVal = -1;
+        break;
+    }
+
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        data.raw = ((localData[1] << 8) | localData[0]);
+        switch(range)
+        {
+            case DPS_2000:
+                data.scaled = (data.raw/SENS_2000_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_1000:
+                data.scaled = (data.raw/SENS_1000_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_500:
+                data.scaled = (data.raw/SENS_500_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_250:
+                data.scaled = (data.raw/SENS_250_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_125:
+                data.scaled = (data.raw/SENS_125_DPS_LSB_PER_DPS);
+            break;
+        }
+    }
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160::getSensorXYZ(SensorData &data, AccRange range)
+{
+    uint8_t localData[6];
+    int32_t rtnVal = readBlock(DATA_14, DATA_19, localData);
+
+	if (m_use_irq == true && bmi160_irq_asserted == false)
+		return -1;
+
+	bmi160_irq_asserted = false;
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        data.xAxis.raw = ((localData[1] << 8) | localData[0]);
+        data.yAxis.raw = ((localData[3] << 8) | localData[2]);
+        data.zAxis.raw = ((localData[5] << 8) | localData[4]);
+
+        switch(range)
+        {
+            case SENS_2G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_2G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_2G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_2G_LSB_PER_G);
+            break;
+
+            case SENS_4G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_4G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_4G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_4G_LSB_PER_G);
+            break;
+
+            case SENS_8G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_8G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_8G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_8G_LSB_PER_G);
+            break;
+
+            case SENS_16G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_16G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_16G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_16G_LSB_PER_G);
+            break;
+        }
+    }
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160::getSensorXYZ(SensorData &data, GyroRange range)
+{
+    uint8_t localData[6];
+    int32_t rtnVal = readBlock(DATA_8, DATA_13, localData);
+
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        data.xAxis.raw = ((localData[1] << 8) | localData[0]);
+        data.yAxis.raw = ((localData[3] << 8) | localData[2]);
+        data.zAxis.raw = ((localData[5] << 8) | localData[4]);
+
+        switch(range)
+        {
+            case DPS_2000:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_1000:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_500:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_500_DPS_LSB_PER_DPS);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_500_DPS_LSB_PER_DPS);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_500_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_250:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_250_DPS_LSB_PER_DPS);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_250_DPS_LSB_PER_DPS);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_250_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_125:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_125_DPS_LSB_PER_DPS);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_125_DPS_LSB_PER_DPS);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_125_DPS_LSB_PER_DPS);
+            break;
+        }
+    }
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160::getSensorXYZandSensorTime(SensorData &data,
+                                          SensorTime &sensorTime,
+                                          AccRange range)
+{
+    uint8_t localData[9];
+    int32_t rtnVal = readBlock(DATA_14, SENSORTIME_2, localData);
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        data.xAxis.raw = ((localData[1] << 8) | localData[0]);
+        data.yAxis.raw = ((localData[3] << 8) | localData[2]);
+        data.zAxis.raw = ((localData[5] << 8) | localData[4]);
+
+        switch(range)
+        {
+            case SENS_2G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_2G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_2G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_2G_LSB_PER_G);
+            break;
+
+            case SENS_4G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_4G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_4G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_4G_LSB_PER_G);
+            break;
+
+            case SENS_8G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_8G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_8G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_8G_LSB_PER_G);
+            break;
+
+            case SENS_16G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_16G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_16G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_16G_LSB_PER_G);
+            break;
+        }
+
+        sensorTime.raw = ((localData[8] << 16) | (localData[7] << 8) |
+                           localData[6]);
+        sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
+    }
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160::getSensorXYZandSensorTime(SensorData &data,
+                                          SensorTime &sensorTime,
+                                          GyroRange range)
+{
+    uint8_t localData[16];
+    int32_t rtnVal = readBlock(DATA_8, SENSORTIME_2, localData);
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        data.xAxis.raw = ((localData[1] << 8) | localData[0]);
+        data.yAxis.raw = ((localData[3] << 8) | localData[2]);
+        data.zAxis.raw = ((localData[5] << 8) | localData[4]);
+
+        switch(range)
+        {
+            case DPS_2000:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_1000:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_500:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_500_DPS_LSB_PER_DPS);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_500_DPS_LSB_PER_DPS);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_500_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_250:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_250_DPS_LSB_PER_DPS);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_250_DPS_LSB_PER_DPS);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_250_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_125:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_125_DPS_LSB_PER_DPS);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_125_DPS_LSB_PER_DPS);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_125_DPS_LSB_PER_DPS);
+            break;
+        }
+
+        sensorTime.raw = ((localData[14] << 16) | (localData[13] << 8) |
+                           localData[12]);
+        sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
+    }
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160::getGyroAccXYZandSensorTime(SensorData &accData,
+                                           SensorData &gyroData,
+                                           SensorTime &sensorTime,
+                                           AccRange accRange,
+                                           GyroRange gyroRange)
+{
+    uint8_t localData[16];
+    int32_t rtnVal = readBlock(DATA_8, SENSORTIME_2, localData);
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        gyroData.xAxis.raw = ((localData[1] << 8) | localData[0]);
+        gyroData.yAxis.raw = ((localData[3] << 8) | localData[2]);
+        gyroData.zAxis.raw = ((localData[5] << 8) | localData[4]);
+
+        accData.xAxis.raw = ((localData[7] << 8) | localData[6]);
+        accData.yAxis.raw = ((localData[9] << 8) | localData[8]);
+        accData.zAxis.raw = ((localData[11] << 8) | localData[10]);
+
+        switch(gyroRange)
+        {
+            case DPS_2000:
+                gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
+                gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
+                gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_1000:
+                gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
+                gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
+                gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_500:
+                gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_500_DPS_LSB_PER_DPS);
+                gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_500_DPS_LSB_PER_DPS);
+                gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_500_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_250:
+                gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_250_DPS_LSB_PER_DPS);
+                gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_250_DPS_LSB_PER_DPS);
+                gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_250_DPS_LSB_PER_DPS);
+            break;
+
+            case DPS_125:
+                gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_125_DPS_LSB_PER_DPS);
+                gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_125_DPS_LSB_PER_DPS);
+                gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_125_DPS_LSB_PER_DPS);
+            break;
+        }
+
+        switch(accRange)
+        {
+            case SENS_2G:
+                accData.xAxis.scaled = (accData.xAxis.raw/SENS_2G_LSB_PER_G);
+                accData.yAxis.scaled = (accData.yAxis.raw/SENS_2G_LSB_PER_G);
+                accData.zAxis.scaled = (accData.zAxis.raw/SENS_2G_LSB_PER_G);
+            break;
+
+            case SENS_4G:
+                accData.xAxis.scaled = (accData.xAxis.raw/SENS_4G_LSB_PER_G);
+                accData.yAxis.scaled = (accData.yAxis.raw/SENS_4G_LSB_PER_G);
+                accData.zAxis.scaled = (accData.zAxis.raw/SENS_4G_LSB_PER_G);
+            break;
+
+            case SENS_8G:
+                accData.xAxis.scaled = (accData.xAxis.raw/SENS_8G_LSB_PER_G);
+                accData.yAxis.scaled = (accData.yAxis.raw/SENS_8G_LSB_PER_G);
+                accData.zAxis.scaled = (accData.zAxis.raw/SENS_8G_LSB_PER_G);
+            break;
+
+            case SENS_16G:
+                accData.xAxis.scaled = (accData.xAxis.raw/SENS_16G_LSB_PER_G);
+                accData.yAxis.scaled = (accData.yAxis.raw/SENS_16G_LSB_PER_G);
+                accData.zAxis.scaled = (accData.zAxis.raw/SENS_16G_LSB_PER_G);
+            break;
+        }
+
+        sensorTime.raw = ((localData[14] << 16) | (localData[13] << 8) |
+                           localData[12]);
+        sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
+    }
+
+    return rtnVal;
+}
+
+int32_t BMI160::setSampleRate(int sample_rate)
+{
+	int sr_reg_val = -1;
+	int i;
+	const uint16_t odr_table[][2] = {
+	    {25, GYRO_ODR_6}, ///<25Hz
+        {50, GYRO_ODR_7}, ///<50Hz
+        {100, GYRO_ODR_8}, ///<100Hz
+        {200, GYRO_ODR_9}, ///<200Hz
+        {400, GYRO_ODR_10}, ///<400Hz
+        {800, GYRO_ODR_11}, ///<800Hz
+        {1600, GYRO_ODR_12}, ///<1600Hz
+        {3200, GYRO_ODR_13}, ///<3200Hz
+	};
+
+	int num_sr = sizeof(odr_table)/sizeof(odr_table[0]);
+	for (i = 0; i < num_sr; i++) {
+		if (sample_rate == odr_table[i][0]) {
+			sr_reg_val = odr_table[i][1];
+			break;
+		}
+	}
+
+	if (sr_reg_val == -1)
+		return -2;
+
+	AccConfig accConfigRead;
+	if (getSensorConfig(accConfigRead) == BMI160::RTN_NO_ERROR) {
+	accConfigRead.odr = (AccOutputDataRate)sr_reg_val;
+		return setSensorConfig(accConfigRead) == BMI160::RTN_NO_ERROR ? 0 : -1;
+	} else
+		return -1;
+}
+
+
+//*****************************************************************************
+int32_t BMI160::getSensorTime(SensorTime &sensorTime)
+{
+    uint8_t localData[3];
+    int32_t rtnVal = readBlock(SENSORTIME_0, SENSORTIME_2, localData);
+
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        sensorTime.raw = ((localData[2] << 16) | (localData[1] << 8) |
+                           localData[0]);
+        sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
+    }
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160::getTemperature(float *temp)
+{
+    uint8_t data[2];
+    uint16_t rawTemp;
+
+    int32_t rtnVal = readBlock(TEMPERATURE_0, TEMPERATURE_1, data);
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        rawTemp = ((data[1] << 8) | data[0]);
+        if(rawTemp & 0x8000)
+        {
+            *temp = (23.0F - ((0x10000 - rawTemp)/512.0F));
+        }
+        else
+        {
+            *temp = ((rawTemp/512.0F) + 23.0F);
+        }
+    }
+
+    return rtnVal;
+}
+
+//***********************************************************************************
+int32_t BMI160::BMI160_DefaultInitalize(){
+
+		//soft reset the accelerometer
+		writeRegister(CMD ,SOFT_RESET);
+		wait(0.1);
+
+	    //Power up sensors in normal mode
+	    if(setSensorPowerMode(BMI160::GYRO, BMI160::SUSPEND) != BMI160::RTN_NO_ERROR){
+	        printf("Failed to set gyroscope power mode\n");
+	    }
+
+	    wait(0.1);
+
+	    if(setSensorPowerMode(BMI160::ACC, BMI160::NORMAL) != BMI160::RTN_NO_ERROR){
+	        printf("Failed to set accelerometer power mode\n");
+	    }
+	    wait(0.1);
+
+	    BMI160::AccConfig accConfig;
+	    BMI160::AccConfig accConfigRead;
+	    accConfig.range = BMI160::SENS_2G;
+	    accConfig.us = BMI160::ACC_US_OFF;
+	    accConfig.bwp = BMI160::ACC_BWP_2;
+	    accConfig.odr = BMI160::ACC_ODR_6;
+	    if(setSensorConfig(accConfig) == BMI160::RTN_NO_ERROR)
+	    {
+	        if(getSensorConfig(accConfigRead) == BMI160::RTN_NO_ERROR)
+	        {
+	            if((accConfig.range != accConfigRead.range) ||
+	                    (accConfig.us != accConfigRead.us) ||
+	                    (accConfig.bwp != accConfigRead.bwp) ||
+	                    (accConfig.odr != accConfigRead.odr))
+	            {
+	                printf("ACC read data desn't equal set data\n\n");
+	                printf("ACC Set Range = %d\n", accConfig.range);
+	                printf("ACC Set UnderSampling = %d\n", accConfig.us);
+	                printf("ACC Set BandWidthParam = %d\n", accConfig.bwp);
+	                printf("ACC Set OutputDataRate = %d\n\n", accConfig.odr);
+	                printf("ACC Read Range = %d\n", accConfigRead.range);
+	                printf("ACC Read UnderSampling = %d\n", accConfigRead.us);
+	                printf("ACC Read BandWidthParam = %d\n", accConfigRead.bwp);
+	                printf("ACC Read OutputDataRate = %d\n\n", accConfigRead.odr);
+	            }
+
+	        }
+	        else
+	        {
+	             printf("Failed to read back accelerometer configuration\n");
+	        }
+	    }
+	    else
+	    {
+	        printf("Failed to set accelerometer configuration\n");
+	    }
+	    return 0;
+}
+
+//***********************************************************************************
+int32_t BMI160::enable_data_ready_interrupt() {
+	uint8_t data = 0;
+	uint8_t temp = 0;
+	int32_t result;
+
+	result = readRegister(INT_EN_1, &data);
+	temp = data & ~0x10;
+	data = temp | ((1 << 4) & 0x10);
+	/* Writing data to INT ENABLE 1 Address */
+	result |= writeRegister(INT_EN_1, data);
+
+	// configure in_out ctrl
+	//bmi160_get_regs(BMI160_INT_OUT_CTRL_ADDR, &data, 1, dev);
+	result |= readRegister(INT_OUT_CTRL, &data);
+	data = 0x09;
+	result |= writeRegister(INT_OUT_CTRL,data);
+
+	//config int latch
+	//bmi160_get_regs(BMI160_INT_LATCH_ADDR, &data, 1, dev);
+	result |= readRegister(INT_LATCH, &data);
+	data = 0x0F;
+	result |= writeRegister(INT_LATCH, data);
+
+	//bmi160_get_regs(BMI160_INT_MAP_1_ADDR, &data, 1, dev);
+	result |= readRegister(INT_MAP_1, &data);
+	data = 0x80;
+	result |= writeRegister(INT_MAP_1, data);
+
+	if(result != 0){
+		printf("BMI160::%s failed.\r\n", __func__);
+		return -1;
+	}
+
+	m_bmi160_irq->disable_irq();
+	m_bmi160_irq->mode(PullUp);
+	m_bmi160_irq->fall(this, &BMI160::irq_handler);
+	m_bmi160_irq->enable_irq();
+	return 0;
+}
+
+void BMI160::irq_handler() {
+	bmi160_irq_asserted = true;
+}
+
+int32_t BMI160::reset() {
+	if (m_use_irq)
+		m_bmi160_irq->disable_irq();
+	bmi160_irq_asserted = false;
+	writeRegister(CMD, SOFT_RESET);
+	return 0;
+}
diff -r 000000000000 -r a12d6976d64c demoAccelerometer/bmi160.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoAccelerometer/bmi160.h	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,845 @@
+/**********************************************************************
+* Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+**********************************************************************/
+
+
+#ifndef BMI160_H
+#define BMI160_H
+
+#include "mbed.h"
+
+/**
+@brief The BMI160 is a small, low power, low noise 16-bit inertial measurement
+unit designed for use in mobile applications like augmented reality or indoor
+navigation which require highly accurate, real-time sensor data.
+
+In full operation mode, with both the accelerometer and gyroscope enabled, the
+current consumption is typically 950 μA, enabling always-on applications in
+battery driven devices. It is available in a compact 14-pin 2.5 x 3.0 x 0.8 mm³
+LGA package."
+
+This class is an abstract base class and can not be instaniated, use BMI160_I2C
+or BMI160_SPI.
+*/
+class BMI160
+{
+public:
+
+    ///Return value on success.
+    static const uint8_t RTN_NO_ERROR = 0;
+
+    ///Sensor types
+    enum Sensors
+    {
+        MAG = 0, ///<Optional external sensor
+        GYRO,    ///<Angular rate sensor
+        ACC      ///<g sensor
+    };
+
+    ///Sensor Axis
+    enum SensorAxis
+    {
+        X_AXIS = 0,
+        Y_AXIS,
+        Z_AXIS
+    };
+
+    ///Structure for axis data
+    struct AxisData
+    {
+        int16_t raw;  ///<Axis raw data
+        float scaled; ///<Axis scaled data
+    };
+
+    ///Structure for sensor time data
+    struct SensorTime
+    {
+        uint32_t raw;  ///<raw SensorTime
+        float seconds; ///<SensorTime as seconds
+    };
+
+    ///Period of internal counter
+    static const float SENSOR_TIME_LSB = 39e-6;
+
+    ///Structure for holding sensor data
+    struct SensorData
+    {
+        AxisData xAxis; ///<Sensor X axis data
+        AxisData yAxis; ///<Sensor Y axis data
+        AxisData zAxis; ///<Sensor Z axis data
+    };
+
+
+    ///BMI160 registers
+    enum Registers
+    {
+        CHIP_ID = 0x00,  ///<Chip Identification.
+        ERR_REG = 0x02,  ///<Reports sensor error flags.  Flags reset when read.
+        PMU_STATUS,      ///<Reports current power mode for sensors.
+        DATA_0,          ///<MAG_X axis bits7:0
+        DATA_1,          ///<MAG_X axis bits15:8
+        DATA_2,          ///<MAG_Y axis bits7:0
+        DATA_3,          ///<MAG_Y axis bits15:8
+        DATA_4,          ///<MAG_Z axis bits7:0
+        DATA_5,          ///<MAG_Z axis bits15:8
+        DATA_6,          ///<RHALL bits7:0
+        DATA_7,          ///<RHALL bits15:8
+        DATA_8,          ///<GYR_X axis bits7:0
+        DATA_9,          ///<GYR_X axis bits15:8
+        DATA_10,         ///<GYR_Y axis bits7:0
+        DATA_11,         ///<GYR_Y axis bits15:8
+        DATA_12,         ///<GYR_Z axis bits7:0
+        DATA_13,         ///<GYR_Z axis bits15:8
+        DATA_14,         ///<ACC_X axis bits7:0
+        DATA_15,         ///<ACC_X axis bits15:8
+        DATA_16,         ///<ACC_Y axis bits7:0
+        DATA_17,         ///<ACC_Y axis bits15:8
+        DATA_18,         ///<ACC_Z axis bits7:0
+        DATA_19,         ///<ACC_Z axis bits15:8
+        SENSORTIME_0,    ///<24bit counter synchronized with data, bits7:0
+        SENSORTIME_1,    ///<24bit counter synchronized with data, bits15:8
+        SENSORTIME_2,    ///<24bit counter synchronized with data, bits23:16
+        STATUS,          ///<Reports sensors status flags
+        INT_STATUS_0,    ///<Contains interrupt status flags
+        INT_STATUS_1,    ///<Contains interrupt status flags
+        INT_STATUS_2,    ///<Contains interrupt status flags
+        INT_STATUS_3,    ///<Contains interrupt status flags
+        TEMPERATURE_0,   ///<Contains temperature of sensor, bits7:0
+        TEMPERATURE_1,   ///<Contains temperature of sensor, bits15:8
+        FIFO_LENGTH_0,   ///<Current fill level of FIFO, bits7:0
+        FIFO_LENGTH_1,   ///<Current fill level of FIFO, bits10:8
+        FIFO_DATA,       ///<FIFO data read out register, burst read
+        ACC_CONF = 0x40, ///<Set ODR, bandwidth, and read mode of accelerometer
+        ACC_RANGE,       ///<Sets accelerometer g-range
+        GYR_CONF,        ///<Set ODR, bandwidth, and read mode of gyroscope
+        GYR_RANGE,       ///<Sets gyroscope angular rate measurement range
+        MAG_CONF,        ///<Sets ODR of magnetometer interface
+        FIFO_DOWNS,      ///<Sets down sampling ratios of accel and gyro data
+                         ///<for FIFO
+        FIFO_CONFIG_0,   ///<Sets FIFO Watermark
+        FIFO_CONFIG_1,   ///<Sets which sensor data is available in FIFO,
+                         ///<Header/Headerless mode, Ext Int tagging, Sensortime
+        MAG_IF_0 = 0x4B, ///<Magnetometer 7-bit I2C address, bits7:1
+        MAG_IF_1,        ///<Magnetometer interface configuration
+        MAG_IF_2,        ///<Magnetometer address to read
+        MAG_IF_3,        ///<Magnetometer address to write
+        MAG_IF_4,        ///<Magnetometer data to write
+        INT_EN_0,        ///<Interrupt enable bits
+        INT_EN_1,        ///<Interrupt enable bits
+        INT_EN_2,        ///<Interrupt enable bits
+        INT_OUT_CTRL,    ///<Contains the behavioral configuration of INT pins
+        INT_LATCH,       ///<Contains the interrupt rest bit and the interrupt
+                         ///<mode selection
+        INT_MAP_0,       ///<Controls which interrupt signals are mapped to the
+                         ///<INT1 and INT2 pins
+        INT_MAP_1,       ///<Controls which interrupt signals are mapped to the
+                         ///<INT1 and INT2 pins
+        INT_MAP_2,       ///<Controls which interrupt signals are mapped to the
+                         ///<INT1 and INT2 pins
+        INT_DATA_0,      ///<Contains the data source definition for the two
+                         ///<interrupt groups
+        INT_DATA_1,      ///<Contains the data source definition for the two
+                         ///<interrupt groups
+        INT_LOWHIGH_0,   ///<Contains the configuration for the low g interrupt
+        INT_LOWHIGH_1,   ///<Contains the configuration for the low g interrupt
+        INT_LOWHIGH_2,   ///<Contains the configuration for the low g interrupt
+        INT_LOWHIGH_3,   ///<Contains the configuration for the low g interrupt
+        INT_LOWHIGH_4,   ///<Contains the configuration for the low g interrupt
+        INT_MOTION_0,    ///<Contains the configuration for the any motion and
+                         ///<no motion interrupts
+        INT_MOTION_1,    ///<Contains the configuration for the any motion and
+                         ///<no motion interrupts
+        INT_MOTION_2,    ///<Contains the configuration for the any motion and
+                         ///<no motion interrupts
+        INT_MOTION_3,    ///<Contains the configuration for the any motion and
+                         ///<no motion interrupts
+        INT_TAP_0,       ///<Contains the configuration for the tap interrupts
+        INT_TAP_1,       ///<Contains the configuration for the tap interrupts
+        INT_ORIENT_0,    ///<Contains the configuration for the oeientation
+                         ///<interrupt
+        INT_ORIENT_1,    ///<Contains the configuration for the oeientation
+                         ///<interrupt
+        INT_FLAT_0,      ///<Contains the configuration for the flat interrupt
+        INT_FLAT_1,      ///<Contains the configuration for the flat interrupt
+        FOC_CONF,        ///<Contains configuration for the fast offset
+                         ///<compensation for the accelerometer and gyroscope
+        CONF,            ///<Configuration of sensor, nvm_prog_en bit
+        IF_CONF,         ///<Contains settings for the digital interface
+        PMU_TRIGGER,     ///<Sets trigger conditions to change gyro power modes
+        SELF_TEST,       ///<Self test configuration
+        NV_CONF = 0x70,  ///<Contains settings for the digital interface
+        OFFSET_0,        ///<Contains offset comp values for acc_off_x7:0
+        OFFSET_1,        ///<Contains offset comp values for acc_off_y7:0
+        OFFSET_2,        ///<Contains offset comp values for acc_off_z7:0
+        OFFSET_3,        ///<Contains offset comp values for gyr_off_x7:0
+        OFFSET_4,        ///<Contains offset comp values for gyr_off_y7:0
+        OFFSET_5,        ///<Contains offset comp values for gyr_off_z7:0
+        OFFSET_6,        ///<gyr/acc offset enable bit and gyr_off_(zyx) bits9:8
+        STEP_CNT_0,      ///<Step counter bits 15:8
+        STEP_CNT_1,      ///<Step counter bits 7:0
+        STEP_CONF_0,     ///<Contains configuration of the step detector
+        STEP_CONF_1,     ///<Contains configuration of the step detector
+        CMD = 0x7E       ///<Command register triggers operations like
+                         ///<softreset, NVM programming, etc.
+    };
+
+
+    ///@name ERR_REG(0x02)
+    ///Error register data
+    ///@{
+
+    static const uint8_t FATAL_ERR_MASK = 0x01;
+    static const uint8_t FATAL_ERR_POS = 0x00;
+    static const uint8_t ERR_CODE_MASK = 0x1E;
+    static const uint8_t ERR_CODE_POS = 0x01;
+    static const uint8_t I2C_FAIL_ERR_MASK = 0x20;
+    static const uint8_t I2C_FAIL_ERR_POS = 0x05;
+    static const uint8_t DROP_CMD_ERR_MASK = 0x40;
+    static const uint8_t DROP_CMD_ERR_POS = 0x06;
+    static const uint8_t MAG_DRDY_ERR_MASK = 0x80;
+    static const uint8_t MAG_DRDY_ERR_POS = 0x08;
+
+    ///Enumerated error codes
+    enum ErrorCodes
+    {
+        NO_ERROR = 0,        ///<No Error
+        ERROR_1,             ///<Listed as error
+        ERROR_2,             ///<Listed as error
+        LPM_INT_PFD,         ///<Low-power mode and interrupt uses pre-filtered
+                             ///<data
+        ODR_MISMATCH = 0x06, ///<ODRs of enabled sensors in headerless mode do
+                             ///<not match
+        PFD_USED_LPM         ///<Pre-filtered data are used in low power mode
+    };
+    ///@}
+
+
+    ///@name ACC_CONF(0x40) and ACC_RANGE(0x41)
+    ///Data for configuring accelerometer
+    ///@{
+
+    static const uint8_t ACC_ODR_MASK = 0x0F;
+    static const uint8_t ACC_ODR_POS = 0x00;
+    static const uint8_t ACC_BWP_MASK = 0x70;
+    static const uint8_t ACC_BWP_POS = 0x04;
+    static const uint8_t ACC_US_MASK = 0x80;
+    static const uint8_t ACC_US_POS = 0x07;
+    static const uint8_t ACC_RANGE_MASK = 0x0F;
+    static const uint8_t ACC_RANGE_POS = 0x00;
+
+    ///Accelerometer output data rates
+    enum AccOutputDataRate
+    {
+        ACC_ODR_1 = 1,  ///< 25/32Hz
+        ACC_ODR_2,      ///< 25/16Hz
+        ACC_ODR_3,      ///< 25/8Hz
+        ACC_ODR_4,      ///< 25/4Hz
+        ACC_ODR_5,      ///< 25/2Hz
+        ACC_ODR_6,      ///< 25Hz
+        ACC_ODR_7,      ///< 50Hz
+        ACC_ODR_8,      ///< 100Hz
+        ACC_ODR_9,      ///< 200Hz
+        ACC_ODR_10,     ///< 400Hz
+        ACC_ODR_11,     ///< 800Hz
+        ACC_ODR_12      ///< 1600Hz
+    };
+
+    ///Accelerometer bandwidth parameters
+    enum AccBandWidthParam
+    {
+        ACC_BWP_0 = 0, ///< Average 1 cycle;  when acc_us = 0 OSR4
+        ACC_BWP_1,     ///< Average 2 cycles; when acc_us = 0 OSR2
+        ACC_BWP_2,     ///< Average 4 cycles; when acc_us = 0 normal mode
+        ACC_BWP_3,     ///< Average 8 cycles
+        ACC_BWP_4,     ///< Average 16 cycles
+        ACC_BWP_5,     ///< Average 32 cycles
+        ACC_BWP_6,     ///< Average 64 cycles
+        ACC_BWP_7      ///< Average 128 cycles
+    };
+
+    ///Accelerometer undersampling
+    enum AccUnderSampling
+    {
+        ACC_US_OFF = 0,
+        ACC_US_ON
+    };
+
+    ///Accelerometer ranges
+    enum AccRange
+    {
+        SENS_2G = 0x03,  ///<Accelerometer range +-2G
+        SENS_4G = 0x05,  ///<Accelerometer range +-4G
+        SENS_8G = 0x08,  ///<Accelerometer range +-8G
+        SENS_16G = 0x0C ///<Accelerometer range +-16G
+    };
+
+    static const float SENS_2G_LSB_PER_G = 16384.0F;
+    static const float SENS_4G_LSB_PER_G = 8192.0F;
+    static const float SENS_8G_LSB_PER_G = 4096.0F;
+    static const float SENS_16G_LSB_PER_G = 2048.0F;
+
+    ///Accelerometer configuration data structure
+    struct AccConfig
+    {
+        AccRange range;        ///<Accelerometer range
+        AccUnderSampling us;   ///<Accelerometr undersampling mode
+        AccBandWidthParam bwp; ///<Accelerometer bandwidth param
+        AccOutputDataRate odr; ///<Accelerometr output data rate
+    };
+
+    ///Accelerometer default configuration
+    static const AccConfig DEFAULT_ACC_CONFIG;
+    ///@}
+
+
+    ///@name GYR_CONF(0x42) and GYR_RANGE(0x43)
+    ///Data for configuring gyroscope
+    ///@{
+
+    static const uint8_t GYRO_ODR_MASK = 0x0F;
+    static const uint8_t GYRO_ODR_POS = 0x00;
+    static const uint8_t GYRO_BWP_MASK = 0x30;
+    static const uint8_t GYRO_BWP_POS = 0x04;
+    static const uint8_t GYRO_RANGE_MASK = 0x07;
+    static const uint8_t GYRO_RANGE_POS = 0x00;
+
+    ///Gyroscope output data rates
+    enum GyroOutputDataRate
+    {
+        GYRO_ODR_6 = 0x06,  ///<25Hz
+        GYRO_ODR_7 = 0x07,  ///<50Hz
+        GYRO_ODR_8 = 0x08,  ///<100Hz
+        GYRO_ODR_9 = 0x09,  ///<200Hz
+        GYRO_ODR_10 = 0x0A, ///<400Hz
+        GYRO_ODR_11 = 0x0B, ///<800Hz
+        GYRO_ODR_12 = 0x0C, ///<1600Hz
+        GYRO_ODR_13 = 0x0D  ///<3200Hz
+    };
+
+    ///Gyroscope bandwidth paramaters
+    enum GyroBandWidthParam
+    {
+        GYRO_BWP_0 = 0, ///<OSR4 Over Sampling Rate of 4
+        GYRO_BWP_1,     ///<OSR2 Over Sampling Rate of 2
+        GYRO_BWP_2      ///<Normal Mode, Equidistant Sampling
+    };
+
+    ///Gyroscope ranges
+    enum GyroRange
+    {
+        DPS_2000 = 0, ///<+-2000dps, 16.4LSB/dps
+        DPS_1000,     ///<+-1000dps, 32.8LSB/dps
+        DPS_500,      ///<+-500dps, 65.6LSB/dps
+        DPS_250,      ///<+-250dps, 131.2LSB/dps
+        DPS_125       ///<+-125dps, 262.4LSB/dps,
+    };
+
+    static const float SENS_2000_DPS_LSB_PER_DPS = 16.4F;
+    static const float SENS_1000_DPS_LSB_PER_DPS = 32.8F;
+    static const float SENS_500_DPS_LSB_PER_DPS = 65.6F;
+    static const float SENS_250_DPS_LSB_PER_DPS = 131.2F;
+    static const float SENS_125_DPS_LSB_PER_DPS = 262.4F;
+
+    ///Gyroscope configuration data structure
+    struct GyroConfig
+    {
+        GyroRange range;        ///<Gyroscope range
+        GyroBandWidthParam bwp; ///<Gyroscope bandwidth param
+        GyroOutputDataRate odr; ///<Gyroscope output data rate
+    };
+
+    ///Gyroscope default configuration
+    static const GyroConfig DEFAULT_GYRO_CONFIG;
+    ///@}
+
+
+    ///Enumerated power modes
+    enum PowerModes
+    {
+        SUSPEND = 0,  ///<Acc and Gyro, No sampling, No FIFO data readout
+        NORMAL,       ///<Acc and Gyro, Full chip operation
+        LOW_POWER,    ///<Acc duty-cycling between suspend and normal
+        FAST_START_UP ///<Gyro start up delay time to normal mode <= 10 ms
+    };
+
+
+    ///Enumerated commands used with CMD register
+    enum Commands
+    {
+        START_FOC = 0x03,        ///<Starts Fast Offset Calibrartion
+        ACC_SET_PMU_MODE = 0x10, ///<Sets acc power mode
+        GYR_SET_PMU_MODE = 0x14, ///<Sets gyro power mode
+        MAG_SET_PMU_MODE = 0x18, ///<Sets mag power mode
+        PROG_NVM = 0xA0,         ///<Writes NVM backed registers into NVM
+        FIFO_FLUSH = 0xB0,       ///<Clears FIFO
+        INT_RESET,               ///<Clears interrupt engine, INT_STATUS, and
+                                 ///<the interrupt pin
+        STEP_CNT_CLR,            ///<Triggers reset of the step counter
+        SOFT_RESET = 0xB6        ///<Triggers a reset including a reboot.
+    };
+
+
+    ///@brief BMI160 Destructor.\n
+    ///
+    ///On Entry:
+    ///@param[in] none
+    ///
+    ///On Exit:
+    ///@param[out] none
+    ///
+    ///@returns none
+    virtual ~BMI160(){ }
+
+
+    ///@brief Reads a single register.\n
+    ///
+    ///On Entry:
+    ///@param[in] data - pointer to memory for storing read data
+    ///
+    ///On Exit:
+    ///@param[out] data - holds contents of read register on success
+    ///
+    ///@returns 0 on success, non 0 on failure
+    virtual int32_t readRegister(Registers reg, uint8_t *data) = 0;
+
+
+    ///@brief Writes a single register.\n
+    ///
+    ///On Entry:
+    ///@param[in] data - data to write to register
+    ///
+    ///On Exit:
+    ///@param[out] none
+    ///
+    ///@returns 0 on success, non 0 on failure
+    virtual int32_t writeRegister(Registers reg, const uint8_t data) = 0;
+
+
+    ///@brief Reads a block of registers.\n
+    ///@detail User must ensure that all registers between 'startReg' and
+    ///'stopReg' exist and are readable.  Function reads up to, including,
+    ///'stopReg'.\n
+    ///
+    ///On Entry:
+    ///@param[in] startReg - register to start reading from
+    ///@param[in] stopReg - register to stop reading from
+    ///@param[in] data - pointer to memory for storing read data
+    ///
+    ///On Exit:
+    ///@param[out] data - holds contents of read registers on success
+    ///
+    ///@returns 0 on success, non 0 on failure
+    virtual int32_t readBlock(Registers startReg, Registers stopReg,
+    uint8_t *data) = 0;
+
+
+    ///@brief Writes a block of registers.\n
+    ///@detail User must ensure that all registers between 'startReg' and
+    ///'stopReg' exist and are writeable.  Function writes up to, including,
+    ///'stopReg'.\n
+    ///
+    ///On Entry:
+    ///@param[in] startReg - register to start writing at
+    ///@param[in] stopReg - register to stop writing at
+    ///@param[in] data - pointer to data to write to registers
+    ///
+    ///On Exit:
+    ///@param[out] none
+    ///
+    ///@returns 0 on success, non 0 on failure
+    virtual int32_t writeBlock(Registers startReg, Registers stopReg,
+    const uint8_t *data) = 0;
+
+
+    ///@brief Sets sensors power mode through CMD register.\n
+    ///@details Observe command execution times given in datasheet.\n
+    ///
+    ///On Entry:
+    ///@param[in] sensor - Sensor which power mode we are setting
+    ///@param[in] pwrMode - Desired powermode of the sensor
+    ///
+    ///On Exit:
+    ///@param[out]
+    ///
+    ///@returns 0 on success, non 0 on failure
+    int32_t setSensorPowerMode(Sensors sensor, PowerModes pwrMode);
+
+
+    ///@brief Configure sensor.\n
+    ///
+    ///On Entry:
+    ///@param[in] config - sSensor configuration data structure
+    ///
+    ///On Exit:
+    ///@param[out] none
+    ///
+    ///@returns 0 on success, non 0 on failure
+    int32_t setSensorConfig(const AccConfig &config);
+    int32_t setSensorConfig(const GyroConfig &config);
+
+
+    ///@brief Get sensor configuration.\n
+    ///
+    ///On Entry:
+    ///@param[in] config - Sensor configuration data structure
+    ///
+    ///On Exit:
+    ///@param[out] config - on success, holds sensor's current
+    ///configuration
+    ///
+    ///@returns 0 on success, non 0 on failure
+    int32_t getSensorConfig(AccConfig &config);
+    int32_t getSensorConfig(GyroConfig &config);
+
+
+    ///@brief Get sensor axis.\n
+    ///
+    ///On Entry:
+    ///@param[in] axis - Sensor axis
+    ///@param[in] data - AxisData structure
+    ///@param[in] range - Sensor range
+    ///
+    ///On Exit:
+    ///@param[out] data - Structure holds raw and scaled axis data
+    ///
+    ///@returns 0 on success, non 0 on failure
+    int32_t getSensorAxis(SensorAxis axis, AxisData &data, AccRange range);
+    int32_t getSensorAxis(SensorAxis axis, AxisData &data, GyroRange range);
+
+
+    ///@brief Get sensor xyz axis.\n
+    ///
+    ///On Entry:
+    ///@param[in] data - SensorData structure
+    ///@param[in] range - Sensor range
+    ///
+    ///On Exit:
+    ///@param[out] data - Structure holds raw and scaled data for all three axis
+    ///
+    ///@returns 0 on success, non 0 on failure
+    int32_t getSensorXYZ(SensorData &data, AccRange range);
+    int32_t getSensorXYZ(SensorData &data, GyroRange range);
+
+
+    ///@brief Get sensor xyz axis and sensor time.\n
+    ///
+    ///On Entry:
+    ///@param[in] data - SensorData structure
+    ///@param[in] sensorTime - SensorTime structure for data
+    ///@param[in] range - Sensor range
+    ///
+    ///On Exit:
+    ///@param[out] data - Structure holds raw and scaled data for all three axis
+    ///@param[out] sensorTime - Holds sensor time on success
+    ///
+    ///@returns 0 on success, non 0 on failure
+    int32_t getSensorXYZandSensorTime(SensorData &data, SensorTime &sensorTime,
+                                      AccRange range);
+    int32_t getSensorXYZandSensorTime(SensorData &data, SensorTime &sensorTime,
+                                      GyroRange range);
+
+
+    ///@brief Get Gyroscope/Accelerometer data and sensor time.\n
+    ///
+    ///On Entry:
+    ///@param[in] accData -  Sensor data structure for accelerometer
+    ///@param[in] gyroData - Sensor data structure for gyroscope
+    ///@param[in] sensorTime - SensorTime data structure
+    ///@param[in] accRange - Accelerometer range
+    ///@param[in] gyroRange - Gyroscope range
+    ///
+    ///On Exit:
+    ///@param[out] accData -  Synchronized accelerometer data
+    ///@param[out] gyroData - Synchronized gyroscope data
+    ///@param[out] sensorTime - Synchronized sensor time
+    ///
+    ///@returns 0 on success, non 0 on failure
+    int32_t getGyroAccXYZandSensorTime(SensorData &accData,
+                                       SensorData &gyroData,
+                                       SensorTime &sensorTime,
+                                       AccRange accRange, GyroRange gyroRange);
+
+
+    ///@brief Get sensor time.\n
+    ///
+    ///On Entry:
+    ///@param[in] sensorTime - SensorTime structure for data
+    ///
+    ///On Exit:
+    ///@param[out] sensorTime - Holds sensor time on success
+    ///
+    ///@returns returns 0 on success, non 0 on failure
+    int32_t getSensorTime(SensorTime &sensorTime);
+
+
+    ///@brief Get die temperature.\n
+    ///
+    ///On Entry:
+    ///@param[in] temp - pointer to float for temperature
+    ///
+    ///On Exit:
+    ///@param[out] temp - on success, holds the die temperature
+    ///
+    ///@returns 0 on success, non 0 on failure
+    int32_t getTemperature(float *temp);
+
+    // Initialize BMI160 with default parameters:
+    // set GYRO: Suspended, Acc Normal Mode, ODR:25 Hz
+    int32_t BMI160_DefaultInitalize();
+
+    //
+    //
+    int32_t enable_data_ready_interrupt();
+
+	//
+	// Set sample rate
+	// This function can be alled after BMI160_DefaultInitalize
+	int32_t setSampleRate(int sample_rate);
+
+	/// @brief Soft reset
+	///
+	int32_t reset();
+
+private:
+	bool m_use_irq;
+	bool bmi160_irq_asserted;
+	InterruptIn *m_bmi160_irq;
+	void irq_handler();
+
+protected:
+	BMI160(InterruptIn *int_pin): m_bmi160_irq(int_pin), m_use_irq(true) {
+		bmi160_irq_asserted = false;
+	}
+
+	BMI160(): m_use_irq(false) { }
+};
+
+
+/**
+@brief BMI160_I2C - supports BMI160 object with I2C interface
+*/
+class BMI160_I2C: public BMI160
+{
+public:
+
+    ///BMI160 default I2C address.
+    static const uint8_t I2C_ADRS_SDO_LO = 0x68;
+    ///BMI160 optional I2C address.
+    static const uint8_t I2C_ADRS_SDO_HI = 0x69;
+
+
+    ///@brief BMI160_I2C Constructor.\n
+    ///
+    ///On Entry:
+    ///@param[in] i2cBus - reference to I2C bus for this device
+    ///@param[in] i2cAdrs - 7-bit I2C address
+    ///
+    ///On Exit:
+    ///@param[out] none
+    ///
+    ///@returns none
+    BMI160_I2C(I2C *i2cBus, uint8_t i2cAdrs);
+
+    ///@brief BMI160_I2C Constructor.\n
+    ///
+    ///On Entry:
+    ///@param[in] i2cBus - reference to I2C bus for this device
+    ///@param[in] i2cAdrs - 7-bit I2C address
+    ///@param[in] int_pin - Interrupt pin
+    ///
+    ///On Exit:
+    ///@param[out] none
+    ///
+    ///@returns none
+	BMI160_I2C(I2C *i2cBus, uint8_t i2cAdrs, InterruptIn *int_pin);
+
+    ///@brief Reads a single register.\n
+    ///
+    ///On Entry:
+    ///@param[in] data - pointer to memory for storing read data
+    ///
+    ///On Exit:
+    ///@param[out] data - holds contents of read register on success
+    ///
+    ///@returns 0 on success, non 0 on failure
+    virtual int32_t readRegister(Registers reg, uint8_t *data);
+
+
+    ///@brief Writes a single register.\n
+    ///
+    ///On Entry:
+    ///@param[in] data - data to write to register
+    ///
+    ///On Exit:
+    ///@param[out] none
+    ///
+    ///@returns 0 on success, non 0 on failure
+    virtual int32_t writeRegister(Registers reg, const uint8_t data);
+
+
+    ///@brief Reads a block of registers.\n
+    ///@detail User must ensure that all registers between 'startReg' and
+    ///'stopReg' exist and are readable.  Function reads up to, including,
+    ///'stopReg'.\n
+    ///
+    ///On Entry:
+    ///@param[in] startReg - register to start reading from
+    ///@param[in] stopReg - register to stop reading from
+    ///@param[in] data - pointer to memory for storing read data
+    ///
+    ///On Exit:
+    ///@param[out] data - holds contents of read registers on success
+    ///
+    ///@returns 0 on success, non 0 on failure
+    virtual int32_t readBlock(Registers startReg, Registers stopReg,
+    uint8_t *data);
+
+
+    ///@brief Writes a block of registers.\n
+    ///@detail User must ensure that all registers between 'startReg' and
+    ///'stopReg' exist and are writeable.  Function writes up to, including,
+    ///'stopReg'.\n
+    ///
+    ///On Entry:
+    ///@param[in] startReg - register to start writing at
+    ///@param[in] stopReg - register to stop writing at
+    ///@param[in] data - pointer to data to write to registers
+    ///
+    ///On Exit:
+    ///@param[out] none
+    ///
+    ///@returns 0 on success, non 0 on failure
+    virtual int32_t writeBlock(Registers startReg, Registers stopReg,
+    const uint8_t *data);
+
+private:
+    I2C *m_i2cBus;
+    uint8_t m_Wadrs, m_Radrs;
+};
+
+
+/**
+@brief BMI160_SPI - supports BMI160 object with SPI interface
+*/
+class BMI160_SPI: public BMI160
+{
+public:
+
+    ///@brief BMI160_SPI Constructor.\n
+    ///
+    ///On Entry:
+    ///@param[in] spiBus - reference to SPI bus for this device
+    ///@param[in] cs - reference to DigitalOut used for chip select
+    ///
+    ///On Exit:
+    ///@param[out] none
+    ///
+    ///@returns none
+    BMI160_SPI(SPI *spiBus, DigitalOut &cs);
+
+
+    ///@brief Reads a single register.\n
+    ///
+    ///On Entry:
+    ///@param[in] data - pointer to memory for storing read data
+    ///
+    ///On Exit:
+    ///@param[out] data - holds contents of read register on success
+    ///
+    ///@returns 0 on success, non 0 on failure
+    virtual int32_t readRegister(Registers reg, uint8_t *data);
+
+
+    ///@brief Writes a single register.\n
+    ///
+    ///On Entry:
+    ///@param[in] data - data to write to register
+    ///
+    ///On Exit:
+    ///@param[out] none
+    ///
+    ///@returns 0 on success, non 0 on failure
+    virtual int32_t writeRegister(Registers reg, const uint8_t data);
+
+
+    ///@brief Reads a block of registers.\n
+    ///@detail User must ensure that all registers between 'startReg' and
+    ///'stopReg' exist and are readable.  Function reads up to, including,
+    ///'stopReg'.\n
+    ///
+    ///On Entry:
+    ///@param[in] startReg - register to start reading from
+    ///@param[in] stopReg - register to stop reading from
+    ///@param[in] data - pointer to memory for storing read data
+    ///
+    ///On Exit:
+    ///@param[out] data - holds contents of read registers on success
+    ///
+    ///@returns 0 on success, non 0 on failure
+    virtual int32_t readBlock(Registers startReg, Registers stopReg,
+    uint8_t *data);
+
+
+    ///@brief Writes a block of registers.\n
+    ///@detail User must ensure that all registers between 'startReg' and
+    ///'stopReg' exist and are writeable.  Function writes up to, including,
+    ///'stopReg'.\n
+    ///
+    ///On Entry:
+    ///@param[in] startReg - register to start writing at
+    ///@param[in] stopReg - register to stop writing at
+    ///@param[in] data - pointer to data to write to registers
+    ///
+    ///On Exit:
+    ///@param[out] none
+    ///
+    ///@returns 0 on success, non 0 on failure
+    virtual int32_t writeBlock(Registers startReg, Registers stopReg,
+    const uint8_t *data);
+
+private:
+
+    SPI *m_spiBus;
+    DigitalOut m_cs;
+};
+
+#endif /* BMI160_H */
+
+
+///@brief fx documentation template.\n
+///
+///On Entry:
+///@param[in] none
+///
+///On Exit:
+///@param[out] none
+///
+///@returns none
diff -r 000000000000 -r a12d6976d64c demoAccelerometer/bmi160_i2c.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoAccelerometer/bmi160_i2c.cpp	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,103 @@
+/**********************************************************************
+* Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+**********************************************************************/
+
+
+#include "bmi160.h"
+
+
+//*****************************************************************************
+BMI160_I2C::BMI160_I2C(I2C *i2cBus, uint8_t i2cAdrs)
+:m_i2cBus(i2cBus), m_Wadrs(i2cAdrs << 1), m_Radrs((i2cAdrs << 1) | 1)
+{
+
+}
+
+BMI160_I2C::BMI160_I2C(I2C *i2cBus, uint8_t i2cAdrs, InterruptIn *int_pin)
+:m_i2cBus(i2cBus), m_Wadrs(i2cAdrs << 1), m_Radrs((i2cAdrs << 1) | 1), BMI160(int_pin)
+{
+
+}
+
+//*****************************************************************************
+int32_t BMI160_I2C::readRegister(Registers reg, uint8_t *data)
+{
+    int32_t rtnVal = -1;
+    char packet[] = {static_cast<char>(reg)};
+
+    if(m_i2cBus->write(m_Wadrs, packet, 1) == 0)
+    {
+        rtnVal = m_i2cBus->read(m_Radrs, reinterpret_cast<char *>(data), 1);
+    }
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160_I2C::writeRegister(Registers reg, const uint8_t data)
+{
+    char packet[] = {static_cast<char>(reg), static_cast<char>(data)};
+
+    return m_i2cBus->write(m_Wadrs, packet, sizeof(packet));
+}
+
+
+//*****************************************************************************
+int32_t BMI160_I2C::readBlock(Registers startReg, Registers stopReg,
+uint8_t *data)
+{
+    int32_t rtnVal = -1;
+    int32_t numBytes = ((stopReg - startReg) + 1);
+    char packet[] = {static_cast<char>(startReg)};
+
+    if(m_i2cBus->write(m_Wadrs, packet, 1) == 0)
+    {
+        rtnVal = m_i2cBus->read(m_Radrs, reinterpret_cast<char *>(data), numBytes);
+    }
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160_I2C::writeBlock(Registers startReg, Registers stopReg,
+const uint8_t *data)
+{
+    int32_t numBytes = ((stopReg - startReg) + 1);
+    char packet[numBytes + 1];
+
+    packet[0] = static_cast<char>(startReg);
+
+    memcpy(packet + 1, data, numBytes);
+
+    return m_i2cBus->write(m_Wadrs, packet, sizeof(packet));
+}
diff -r 000000000000 -r a12d6976d64c demoAccelerometer/bmi160_spi.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoAccelerometer/bmi160_spi.cpp	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,80 @@
+/**********************************************************************
+* Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+**********************************************************************/
+
+
+#include "bmi160.h"
+
+
+//*****************************************************************************
+BMI160_SPI::BMI160_SPI(SPI *spiBus, DigitalOut &cs)
+:m_spiBus(spiBus), m_cs(cs)
+{
+
+}
+
+
+//*****************************************************************************
+int32_t BMI160_SPI::readRegister(Registers reg, uint8_t *data)
+{
+    int32_t rtnVal = -1;
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160_SPI::writeRegister(Registers reg, const uint8_t data)
+{
+    int32_t rtnVal = -1;
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160_SPI::readBlock(Registers startReg, Registers stopReg,
+uint8_t *data)
+{
+    int32_t rtnVal = -1;
+
+    return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160_SPI::writeBlock(Registers startReg, Registers stopReg,
+const uint8_t *data)
+{
+    int32_t rtnVal = -1;
+
+    return rtnVal;
+}
diff -r 000000000000 -r a12d6976d64c demoPlatform/MAX20303.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoPlatform/MAX20303.cpp	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,366 @@
+/*******************************************************************************
+ * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+ * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *******************************************************************************
+ */
+
+
+#include "MAX20303.h"
+
+
+
+//******************************************************************************
+MAX20303::MAX20303(I2C *i2c):
+	m_i2c(i2c), m_writeAddress(MAX20303_SLAVE_WR_ADDR),
+	m_readAddress(MAX20303_SLAVE_RD_ADDR)
+{
+}
+
+
+//******************************************************************************
+MAX20303::~MAX20303(void)
+{
+  //empty block
+}
+
+
+//******************************************************************************
+int MAX20303::LDO1Config()
+{
+	int32_t ret = 0;
+	uint8_t val;
+//	ret |= writeReg(MAX20303::REG_AP_CMDOUT, 0x40);
+//	ret |= writeReg(MAX20303::REG_AP_DATOUT0, 0x05);
+//	ret |= writeReg(MAX20303::REG_AP_DATOUT1, 0x34);
+//
+//	readReg(MAX20303::REG_AP_CMDOUT, val);
+//	readReg(MAX20303::REG_AP_DATOUT0, val);
+//	readReg(MAX20303::REG_AP_DATOUT1, val);
+	appcmdoutvalue_ = 0x40;
+	appdatainoutbuffer_[0] = 0x05;
+	appdatainoutbuffer_[1] = 0x34;
+	AppWrite(2);
+
+	return ret;
+}
+
+//******************************************************************************
+int MAX20303::LDO2Config()
+{
+	int32_t ret = 0;
+	uint8_t val;
+	appcmdoutvalue_ = 0x42;
+	appdatainoutbuffer_[0] = 0x01;
+	appdatainoutbuffer_[1] = 0x15;     // 0.9V + (0.1V * number)   =  3V
+	AppWrite(2);
+
+	return ret;
+}
+
+
+//******************************************************************************
+int MAX20303::writeReg(registers_t reg, uint8_t value)
+{
+	int32_t ret;
+
+	char cmdData[2] = {reg, value};
+
+	ret = m_i2c->write(m_writeAddress, cmdData, sizeof(cmdData));
+	//printf("MAX20303 write reg[0x%X]=0x%X, ret=%d\r\n", (uint32_t)reg, value, ret)
+
+	if (ret != 0)
+		return MAX20303_ERROR;
+
+	return MAX20303_NO_ERROR;
+}
+
+
+//******************************************************************************
+int MAX20303::readReg(registers_t reg, uint8_t &value)
+{
+	int32_t ret;
+
+	char data = reg;
+
+	ret = m_i2c->write(m_writeAddress, &data, sizeof(data));
+	if (ret != 0) {
+		printf("%s - failed - ret: %d\n", __func__);
+		return MAX20303_ERROR;
+	}
+
+	ret = m_i2c->read(m_readAddress, &data, sizeof(data));
+	if (ret != 0) {
+		printf("%s - failed - ret: %d\n", __func__);
+		return MAX20303_ERROR;
+	}
+
+	value = data;
+	printf("MAX20303 read reg[0x%X]=0x%X, ret=%d\r\n", (uint32_t)reg, value, ret);
+	return MAX20303_NO_ERROR;
+}
+
+//******************************************************************************
+int MAX20303::readRegMulti(registers_t reg, uint8_t *value, uint8_t len){
+	int32_t ret;
+	char data = reg;
+
+	ret = m_i2c->write(m_writeAddress, &data, sizeof(data));
+	if (ret != 0) {
+		printf("%s - failed - ret: %d\n", __func__);
+		return MAX20303_ERROR;
+	}
+
+	ret = m_i2c->read(m_readAddress, (char *)value, len);
+	if (ret != 0) {
+		printf("%s - failed - ret: %d\n", __func__);
+		return MAX20303_ERROR;
+	}
+
+	printf("MAX20303 read reg[0x%X]=0x%X, ret=%d\r\n", (uint32_t)reg, value, ret);
+	return MAX20303_NO_ERROR;
+}
+
+//******************************************************************************
+int MAX20303::writeRegMulti(registers_t reg, uint8_t *value, uint8_t len){
+	int32_t ret;
+	i2cbuffer_[0] = reg;
+	memcpy(&i2cbuffer_[1], value, len);
+
+	ret = m_i2c->write(m_writeAddress, (char *)i2cbuffer_, (len+1));
+	//printf("MAX20303 write reg[0x%X]=0x%X, ret=%d\r\n", (uint32_t)reg, value, ret)
+
+	if (ret != 0)
+		return MAX20303_ERROR;
+
+	return MAX20303_NO_ERROR;
+}
+//******************************************************************************
+int MAX20303::mv2bits(int mV)
+{
+    int regBits;
+
+    if (( MAX20303_LDO_MIN_MV <= mV) && (mV <= MAX20303_LDO_MAX_MV)) {
+        regBits = (mV -  MAX20303_LDO_MIN_MV) /  MAX20303_LDO_STEP_MV;
+    } else {
+        return -1;
+    }
+
+    return regBits;
+}
+//******************************************************************************
+int MAX20303::PowerOffthePMIC(){
+	int ret;
+	appdatainoutbuffer_[0] = 0xB2;
+	appcmdoutvalue_ = 0x80;
+	ret = AppWrite(1);
+
+	if(appcmdoutvalue_ != 0x80){
+		ret |= MAX20303_ERROR;
+	}
+
+	return ret;
+}
+//******************************************************************************
+int MAX20303::PowerOffDelaythePMIC(){
+	int ret;
+	appdatainoutbuffer_[0] = 0xB2;
+	appcmdoutvalue_ = 0x84;
+	ret = AppWrite(1);
+
+	if(appcmdoutvalue_ != 0x80){
+		ret |= MAX20303_ERROR;
+	}
+
+	return ret;
+}
+
+//******************************************************************************
+int MAX20303::SoftResetthePMIC(){
+	int ret;
+	appdatainoutbuffer_[0] = 0xB3;
+	appcmdoutvalue_ = 0x81;
+	ret = AppWrite(1);
+
+	if(appcmdoutvalue_ != 0x81){
+		ret |= MAX20303_ERROR;
+	}
+
+	return ret;
+}
+//******************************************************************************
+int MAX20303::HardResetthePMIC(){
+	int ret;
+	appdatainoutbuffer_[0] = 0xB4;
+	appcmdoutvalue_ = 0x82;
+	ret = AppWrite(1);
+
+	if(appcmdoutvalue_ != 0x82){
+		ret |= MAX20303_ERROR;
+	}
+
+	return ret;
+}
+
+//******************************************************************************
+int MAX20303::AppWrite(uint8_t dataoutlen){
+	int ret;
+
+	ret = writeRegMulti(MAX20303::REG_AP_DATOUT0, appdatainoutbuffer_, dataoutlen);
+	ret |= writeReg(MAX20303::REG_AP_CMDOUT, appcmdoutvalue_);
+	wait_ms(10);
+	ret |= readReg(MAX20303::REG_AP_RESPONSE, appcmdoutvalue_);
+
+	if(ret != 0)
+		return MAX20303_ERROR;
+
+	return MAX20303_NO_ERROR;
+}
+
+
+//******************************************************************************
+int MAX20303::AppRead(uint8_t datainlen){
+	int ret;
+
+	ret = writeReg(MAX20303::REG_AP_CMDOUT, appcmdoutvalue_);
+	wait_ms(10);
+	ret |= readRegMulti(MAX20303::REG_AP_RESPONSE, i2cbuffer_, datainlen);
+	if(ret != 0)
+		return MAX20303_ERROR;
+
+	return MAX20303_NO_ERROR;
+}
+
+//******************************************************************************
+char MAX20303::CheckPMICHWID(){
+	int ret;
+	uint8_t value = 0x00;
+
+	ret = readReg(MAX20303::REG_HARDWARE_ID, value);
+	if(ret != MAX20303_NO_ERROR)
+		return false;
+
+	if(value == 0x02)
+		return true;
+	else
+		return false;
+}
+
+//******************************************************************************
+int MAX20303::CheckPMICStatusRegisters(unsigned char buf_results[5]){
+	int ret;
+	ret  = readReg(MAX20303::REG_STATUS0, buf_results[0]);
+	ret |= readReg(MAX20303::REG_STATUS1, buf_results[1]);
+	ret |= readReg(MAX20303::REG_STATUS2, buf_results[2]);
+	ret |= readReg(MAX20303::REG_STATUS3, buf_results[3]);
+	ret |= readReg(MAX20303::REG_SYSTEM_ERROR, buf_results[4]);
+	return ret;
+}
+
+//******************************************************************************
+int MAX20303::Max20303_BatteryGauge(unsigned char *batterylevel){
+    int ret;
+    char data[2];
+
+    data[0] = 0x04;
+    ret = m_i2c->write(MAX20303_I2C_ADDR_FUEL_GAUGE, data, 1);
+    if(ret != 0){
+        printf("Max20303_FuelGauge has failed\r\n");
+    }
+
+    ret = m_i2c->read(MAX20303_I2C_ADDR_FUEL_GAUGE | 1, data, 2);
+    if(ret != 0){
+        printf("Max20303_FuelGauge has failed\r\n");
+    }
+
+    // if the level is more than 100 assume the battery is not connected
+    if(data[0] > 100){
+        *batterylevel = 0;
+    } else{
+
+        *batterylevel = data[0];
+    }
+    return 0;
+}
+
+
+//******************************************************************************
+int MAX20303::led0on(char enable) {
+
+	if(enable)
+		return writeReg(REG_LED0_DIRECT, 0x21);
+	else
+		return writeReg(REG_LED0_DIRECT, 0x01);
+}
+
+//******************************************************************************
+int MAX20303::led1on(char enable) {
+	if(enable)
+		return writeReg(REG_LED1_DIRECT, 0x21);
+	else
+		return writeReg(REG_LED1_DIRECT, 0x01);
+}
+
+//******************************************************************************
+int MAX20303::led2on(char enable) {
+	if(enable)
+		return writeReg(REG_LED2_DIRECT, 0x21);
+	else
+		return writeReg(REG_LED2_DIRECT, 0x01);
+}
+
+
+//******************************************************************************
+int MAX20303::BoostEnable(void) {
+	writeReg(REG_AP_DATOUT3, 0x00);	// 00 : 5V
+	writeReg(REG_AP_DATOUT0, 0x01);	// Boost Enabled
+	writeReg(REG_AP_CMDOUT, 0x30);
+	return MAX20303_NO_ERROR;
+}
+
+//******************************************************************************
+int MAX20303::BuckBoostEnable(void)
+{
+	int ret = 0;
+
+	ret |= writeReg( REG_AP_DATOUT0,  0x00);    // Reserved = 0x00
+	ret |= writeReg( REG_AP_DATOUT1,  0x04);    // BBstlSet = 0b'100   Buck Boost Peak current Limit = 200mA
+	ret |= writeReg( REG_AP_DATOUT2,  0x19);    // BBstVSet = 0b'11001  Buck Boost Output Voltage = 5V
+	ret |= writeReg( REG_AP_DATOUT3,  0x01);    // BBstRipRed = 1 Ripple Reduction
+	// BBstAct    = 1 Actively discharged in Hard-Reset or Enable Low
+	// BBstPas    = 1 Passively discharged in Hard-Reset or Enable Low
+	// BBstMd     = 1 Damping Enabled
+	// BBstInd    = 0  Inductance is 4.7uH
+	// BBstEn     = 0b'01 Enabled
+	ret |= writeReg( REG_AP_CMDOUT, 0x70);
+	if (ret != 0)
+		return MAX20303_ERROR;
+
+	return MAX20303_NO_ERROR;
+}
diff -r 000000000000 -r a12d6976d64c demoPlatform/MAX20303.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoPlatform/MAX20303.h	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+ * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *******************************************************************************
+ */
+#ifndef __MAX20303_H_
+#define __MAX20303_H_
+
+#include "mbed.h"
+
+#define MAX20303_SLAVE_ADDR		(0x50 >> 1)
+#define MAX20303_SLAVE_WR_ADDR		((MAX20303_SLAVE_ADDR << 1))
+#define MAX20303_SLAVE_RD_ADDR		((MAX20303_SLAVE_ADDR << 1) | 1)
+
+
+#define MAX20303_NO_ERROR   0
+#define MAX20303_ERROR      -1
+
+#define MAX20303_I2C_ADDR_FUEL_GAUGE	0x6c
+#define MAX20303_I2C_ADDR_FUEL_GAUGE    0x6C
+
+#define MAX20303_LDO_MIN_MV 800
+#define MAX20303_LDO_MAX_MV 3600
+#define MAX20303_LDO_STEP_MV 100
+
+#define MAX20303_OFF_COMMAND 0xB2
+
+class MAX20303
+{
+
+public:
+	/**
+	 * @brief   Register Addresses
+	 * @details Enumerated MAX20303 register addresses
+	 */
+	enum registers_t {
+		REG_HARDWARE_ID		= 0x00,		///< HardwareID Register
+		REG_FIRMWARE_REV	= 0x01,		///< FirmwareID Register
+		//					= 0x02,		///<
+		REG_INT0			= 0x03,		///< Int0 Register
+		REG_INT1			= 0x04,		///< Int1 Register
+		REG_INT2			= 0x05,		///< Int2 Register
+		REG_STATUS0			= 0x06,		///< Status Register 0
+		REG_STATUS1			= 0x07,		///< Status Register 1
+		REG_STATUS2			= 0x08,		///< Status Register 2
+		REG_STATUS3			= 0x09,		///< Status Register 2
+		//					= 0x0A,		///<
+		REG_SYSTEM_ERROR	= 0x0B,		///< SystemError Register
+		REG_INT_MASK0		= 0x0C,		///< IntMask0 Register
+		REG_INT_MASK1		= 0x0D,		///< IntMask1 Register
+		REG_INT_MASK2		= 0x0E,		///< IntMask1 Register
+		REG_AP_DATOUT0		= 0x0F,     ///< APDataOut0 Register
+		REG_AP_DATOUT1		= 0x10,     ///< APDataOut1 Register
+		REG_AP_DATOUT2		= 0x11,     ///< APDataOut2 Register
+		REG_AP_DATOUT3		= 0x12,     ///< APDataOut3 Register
+		REG_AP_DATOUT4		= 0x13,     ///< APDataOut4 Register
+		REG_AP_DATOUT5		= 0x14,     ///< APDataOut5 Register
+		REG_AP_DATOUT6		= 0x15,     ///< APDataOut6 Register
+		REG_AP_CMDOUT		= 0x17,     ///< APCmdOut Register
+		REG_AP_RESPONSE		= 0x18,     ///< APResponse Register
+		REG_AP_DATAIN0		= 0x19,
+		REG_AP_DATAIN1		= 0x1A,
+		REG_AP_DATAIN2		= 0x1B,
+		REG_AP_DATAIN3		= 0x1C,
+		REG_AP_DATAIN4		= 0x1D,
+		REG_AP_DATAIN5		= 0x1E,
+		//					= 0x1F,		///<
+		REG_LDO_DIRECT		= 0x20,
+		REG_MPC_DIRECTWRITE	= 0x21,
+		REG_MPC_DIRECTRED	= 0x22,
+
+		REG_LED_STEP_DIRECT	= 0x2C,
+		REG_LED0_DIRECT		= 0x2D,
+		REG_LED1_DIRECT		= 0x2E,
+		REG_LED2_DIRECT		= 0x2F,
+
+
+		REG_LDO1_CONFIG_WRITE = 0x40,
+		REG_LDO1_CONFIG_READ  = 0x41,
+		REG_LDO2_CONFIG_WRITE = 0x42,
+		REG_LDO2_CONFIG_READ  = 0x43
+
+		/*
+		REG_CHG_TMR = 0x0C,   ///< Charger Timers
+		REG_BUCK1_CFG = 0x0D,   ///< Buck 1 Configuration
+		REG_BUCK1_VSET = 0x0E,   ///< Buck 1 Voltage Setting
+		REG_BUCK2_CFG = 0x0F,   ///< Buck 2 Configuration
+		REG_BUCK2_VSET = 0x10,   ///< Buck 2 Voltage Setting
+		REG_RSVD_11 = 0x11,   ///< Reserved 0x11
+		REG_LDO1_CFG = 0x12,   ///< LDO 1 Configuration
+		REG_LDO1_VSET = 0x13,   ///< LDO 1 Voltage Setting
+		REG_LDO2_CFG = 0x14,   ///< LDO 2 Configuration
+		REG_LDO2_VSET = 0x15,   ///< LDO 2 Voltage Setting
+		REG_LDO3_CFG = 0x16,   ///< LDO 3 Configuration
+		REG_LDO3_VSET = 0x17,   ///< LDO 3 Voltage Setting
+		REG_THRM_CFG = 0x18,   ///< Thermistor Configuration
+		REG_MON_CFG = 0x19,   ///< Monitor Multiplexer Configuration
+		REG_BOOT_CFG = 0x1A,   ///< Boot Configuration
+		REG_PIN_STATUS = 0x1B,   ///< Pin Status
+		REG_BUCK_EXTRA = 0x1C,   ///< Additional Buck Settings
+		REG_PWR_CFG = 0x1D,   ///< Power Configuration
+		REG_NULL = 0x1E,   ///< Reserved 0x1E
+		REG_PWR_OFF = 0x1F,   ///< Power Off Register
+		*/
+	};
+
+	/**
+	* @brief  Constructor using reference to I2C object
+	* @param i2c - Reference to I2C object
+	* @param slaveAddress - 7-bit I2C address
+	*/
+	MAX20303(I2C *i2c);
+
+	/** @brief Destructor */
+	~MAX20303(void);
+
+	int led0on(char enable);
+	int led1on(char enable);
+	int led2on(char enable);
+	int BoostEnable(void);
+	int BuckBoostEnable(void);
+
+	/// @brief Enable the 1.8V output rail **/
+	int LDO1Config(void);
+
+	/// @brief Enable the 3V output rail **/
+	int LDO2Config(void);
+
+
+	int mv2bits(int mV);
+
+	/** @brief Power Off the board
+	 */
+	int PowerOffthePMIC();
+
+	/** @brief Power Off the board with 30ms delay
+	 */
+	int PowerOffDelaythePMIC();
+
+	/** @brief Soft reset the PMIC
+	 */
+	int SoftResetthePMIC();
+
+	/** @brief Hard reset the PMIC
+	 */
+	int HardResetthePMIC();
+
+	/** @brief check if can communicate with max20303
+	*/
+	char CheckPMICHWID();
+
+	/** @brief CheckPMICStatusRegisters
+	*/
+	int CheckPMICStatusRegisters(unsigned char buf_results[5]);
+
+    int Max20303_BatteryGauge(unsigned char *batterylevel);
+
+private:
+
+	int writeReg(registers_t reg, uint8_t value);
+	int readReg(registers_t reg, uint8_t &value);
+
+	int writeRegMulti(registers_t reg, uint8_t *value, uint8_t len);
+	int readRegMulti(registers_t reg, uint8_t *value, uint8_t len);
+
+	/// I2C object
+	I2C  *m_i2c;
+
+	/// Device slave addresses
+	uint8_t m_writeAddress, m_readAddress;
+
+	// Application Processor Interface Related Variables
+	uint8_t i2cbuffer_[16];
+	uint8_t appdatainoutbuffer_[8];
+	uint8_t appcmdoutvalue_;
+
+
+	/** @brief API Related Functions ***/
+
+	/***
+	 *  @brief  starts writing from ApResponse register 0x0F
+	 *  check the datasheet to determine the value of dataoutlen
+	 */
+	int AppWrite(uint8_t dataoutlen);
+
+	/** @brief starts reading from ApResponse register 0x18
+	 *  check the datasheet to determine the value of datainlen
+	 *  the result values are written into i2cbuffer
+	 *
+	*/
+	int AppRead(uint8_t datainlen);
+};
+
+#endif /* __MAX20303_H_ */
diff -r 000000000000 -r a12d6976d64c demoPlatform/max32630hsp.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoPlatform/max32630hsp.cpp	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,235 @@
+/*******************************************************************************
+ * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+ * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *******************************************************************************
+ */
+
+#include "mbed.h"
+#include "max3263x.h"
+#include "ioman_regs.h"
+#include "PinNames.h"
+#include "max32630hsp.h"
+
+
+//******************************************************************************
+MAX32630HSP::MAX32630HSP() : i2c(P5_7, P6_0), max20303(&i2c)
+{
+}
+
+//******************************************************************************
+MAX32630HSP::MAX32630HSP(vio_t vio) : i2c(P5_7, P6_0), max20303(&i2c)
+{
+
+    init(vio);
+}
+
+//******************************************************************************
+MAX32630HSP::MAX32630HSP(vio_t vio, InterruptIn *max32630hsp3_powerButtonInterrupt) : i2c(P5_7, P6_0), max20303(&i2c), m_max32630hsp3_powerButtonInterrupt(max32630hsp3_powerButtonInterrupt)
+{
+    init(vio);
+
+    m_max32630hsp3_powerButtonInterrupt->disable_irq();
+    m_max32630hsp3_powerButtonInterrupt->rise(this, &MAX32630HSP::event_powerButtonReleased);
+    m_max32630hsp3_powerButtonInterrupt->mode(PullUp);
+	m_max32630hsp3_powerButtonInterrupt->enable_irq();
+}
+
+
+//******************************************************************************
+MAX32630HSP::~MAX32630HSP()
+{
+
+}
+
+
+//******************************************************************************
+int MAX32630HSP::init(vio_t hdrVio)
+{
+	/* Wait for pmic to settle down */
+	wait_ms(800);
+
+
+
+	/*Set LDO1 to 1.8v*/
+	max20303.LDO1Config();
+
+	/*Set LDO2 to 3v*/
+    max20303.LDO2Config();
+
+	//max20303.BoostEnable();
+	max20303.BuckBoostEnable();
+
+
+	max20303.led0on(0);
+	max20303.led1on(0);
+	max20303.led2on(0);
+
+	/* Wait for pmic to settle down */
+    wait_ms(200);
+
+    // Set LED pins to 3.3V
+    vddioh(P2_4, VIO_3V3);
+    vddioh(P2_5, VIO_3V3);
+    vddioh(P2_6, VIO_3V3);
+
+    // set i2c pins to 1.8V
+    vddioh(P3_4, VIO_1V8);
+    vddioh(P3_5, VIO_1V8);
+    //ble module pins to 1.8V
+    vddioh(P0_0, VIO_1V8);
+    vddioh(P0_1, VIO_1V8);
+    vddioh(P0_2, VIO_1V8);
+    vddioh(P0_3, VIO_1V8);
+
+    // Set header pins to hdrVio
+    vddioh(P3_0, hdrVio);
+    vddioh(P3_1, hdrVio);
+    vddioh(P3_2, hdrVio);
+    vddioh(P3_3, hdrVio);
+    vddioh(P4_0, hdrVio);
+    vddioh(P4_1, hdrVio);
+    vddioh(P4_2, hdrVio);
+    vddioh(P4_3, hdrVio);
+    vddioh(P4_4, hdrVio);
+    vddioh(P4_5, hdrVio);
+    vddioh(P4_6, hdrVio);
+    vddioh(P4_7, hdrVio);
+    vddioh(P5_0, hdrVio);
+    vddioh(P5_1, hdrVio);
+    vddioh(P5_2, hdrVio);
+    vddioh(P5_3, hdrVio);
+    vddioh(P5_4, hdrVio);
+    vddioh(P5_5, hdrVio);
+    vddioh(P5_6, hdrVio);
+
+
+    button_longpressdetected = false;
+
+    return 0;
+}
+
+
+void MAX32630HSP::event_powerButtonPressed(void) {
+
+	max20303.led0on(0);
+	max20303.led1on(0);
+	max20303.led2on(1);
+
+	/* Button press detected. Wait for button release */
+    m_max32630hsp3_powerButtonInterrupt->disable_irq();
+    m_max32630hsp3_powerButtonInterrupt->rise(this, &MAX32630HSP::event_powerButtonReleased);
+    m_max32630hsp3_powerButtonInterrupt->mode(PullUp);
+	m_max32630hsp3_powerButtonInterrupt->enable_irq();
+
+	/* Button press detected. Start Timeout object for checking long key press event */
+	button_timeout.attach( this, &MAX32630HSP::event_longpresscheck , 2.0 );
+
+	/* Button is pressed */
+	button_status = true;
+}
+
+//******************************************************************************
+void MAX32630HSP::event_powerButtonReleased(void) {
+
+
+	if ( button_longpressdetected ) {
+
+		/* Power of the PMIC if long key press is detected */
+		max20303.PowerOffDelaythePMIC();
+
+	}
+	else {
+
+		/* Button released before a long key press is detected */
+		button_status = false;
+
+	}
+
+	/* Button is released. Stop timeout object */
+	button_timeout.detach();
+
+	max20303.led0on(0);
+	max20303.led1on(0);
+	max20303.led2on(0);
+
+	/* Button is released. Expect for button press event next time */
+    m_max32630hsp3_powerButtonInterrupt->disable_irq();
+    m_max32630hsp3_powerButtonInterrupt->fall(this, &MAX32630HSP::event_powerButtonPressed);
+    m_max32630hsp3_powerButtonInterrupt->mode(PullUp);
+	m_max32630hsp3_powerButtonInterrupt->enable_irq();
+
+
+}
+
+void MAX32630HSP::event_longpresscheck(void) {
+
+	/* This is the callback for timeout object to detect long key press for power down */
+
+	if ( button_status == 1 ) {
+
+		/* If button_status is still 1 when timeout is triggered, it will be interpreted as a long key press */
+		button_longpressdetected = true;
+
+		/* The PMIC will be powered of when the button is released */
+		max20303.led0on(0);
+		max20303.led1on(1);
+		max20303.led2on(0);
+	}
+
+}
+
+void MAX32630HSP::enableDisplay(void)
+{
+	vddioh(P6_4, VIO_3V3); //EXTCOM
+	vddioh(P6_1, VIO_3V3); //SCLK
+	vddioh(P6_2, VIO_3V3); //MOSI1
+	vddioh(P6_5, VIO_3V3); //SCS
+	vddioh(P6_4, VIO_3V3); //EXTCOM
+	vddioh(P6_6, VIO_3V3); //DISP
+}
+
+//******************************************************************************
+int MAX32630HSP::vddioh(PinName pin, vio_t vio)
+{
+    __IO uint32_t *use_vddioh = &((mxc_ioman_regs_t *)MXC_IOMAN)->use_vddioh_0;
+
+    if (pin == NOT_CONNECTED) {
+        return -1;
+    }
+
+    use_vddioh += PINNAME_TO_PORT(pin) >> 2;
+    if (vio) {
+        *use_vddioh |= (1 << (PINNAME_TO_PIN(pin) + ((PINNAME_TO_PORT(pin) & 0x3) << 3)));
+    } else {
+        *use_vddioh &= ~(1 << (PINNAME_TO_PIN(pin) + ((PINNAME_TO_PORT(pin) & 0x3) << 3)));
+    }
+
+    return 0;
+}
diff -r 000000000000 -r a12d6976d64c demoPlatform/max32630hsp.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoPlatform/max32630hsp.h	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+ * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *******************************************************************************
+ */
+
+#ifndef _MAX32630HSP_H_
+#define _MAX32630HSP_H_
+
+#include "mbed.h"
+#include "MAX20303.h"
+
+
+/**
+ * @brief MAX32630HSP Board Support Library
+ *
+ * @details The MAX32630HSP is a rapid development application board for
+ * ultra low power wearable applications.  It includes common peripherals and
+ * expansion connectors all power optimized for getting the longest life from
+ * the battery.  This library configures the power and I/O for the board.
+ * <br>https://www.maximintegrated.com/max32630hsp
+ *
+ * @code
+ * #include "mbed.h"
+ * #include "max32630hsp.h"
+ *
+ * DigitalOut led1(LED1);
+ * MAX32630HSP icarus(MAX32630HSP::VIO_3V3);
+ *
+ * // main() runs in its own thread in the OS
+ * // (note the calls to Thread::wait below for delays)
+ * int main()
+ * {
+ *     // initialize power and I/O on MAX32630HSP board
+ *     icarus.init();
+ *
+ *     while (true) {
+ *         led1 = !led1;
+ *         Thread::wait(500);
+ *     }
+ * }
+ * @endcode
+ */
+
+// Sharp LS013B7DH03 Memory Display
+#define SCK_PIN     		P6_1
+#define MOSI_PIN    		P6_2
+#define CS_PIN      		P6_5
+#define EXTCOM_PIN  		P6_4
+#define DISP_PIN    		P6_6
+#define DISPSEL_PIN 		NC
+#define	PIN_POWERBUTTON		P7_6
+#define	PIN_UPBUTTON		P2_3
+#define	PIN_DOWNBUTTON		P6_5
+
+class MAX32630HSP
+{
+public:
+// max32630hsp configuration utilities
+
+    /**
+      * @brief   IO Voltage
+      * @details Enumerated options for operating voltage
+      */
+    typedef enum {
+        VIO_1V8 = 0x00,    ///< 1.8V IO voltage at headers (from BUCK2)
+        VIO_3V3 = 0x01,    ///< 3.3V IO voltage at headers (from LDO2)
+    } vio_t;
+
+    enum ButtonStatus {
+    	BUTTONSTATUS_RELEASED = 1,
+		BUTTONSTATUS_PRESSED
+    } ;
+
+    /**
+        * MAX32630HSP constructor.
+        *
+        */
+    MAX32630HSP();
+
+    /**
+        * MAX32630HSP constructor.
+        *
+        */
+    MAX32630HSP(vio_t vio);
+
+    /**
+        * MAX32630HSP constructor.
+        *
+        */
+    MAX32630HSP(vio_t vio, InterruptIn *max32630hsp3_powerButtonInterrupt);
+
+    /**
+        * MAX32630HSP destructor.
+        */
+    ~MAX32630HSP();
+
+    //InterruptIn _interruptIn_PowerButton;
+
+    /**
+     * @brief   Initialize MAX32630HSP board
+     * @details Initializes PMIC and I/O on MAX32630HSP board.
+     *  Configures PMIC to enable LDO2 and LDO3 at 3.3V.
+     *  Disables resisitive pulldown on MON(AIN_0)
+     *  Sets default I/O voltages to 3V3 for micro SD card.
+     *  Sets I/O voltage for header pins to hdrVio specified.
+     * @param hdrVio I/O voltage for header pins
+     * @returns 0 if no errors, -1 if error.
+    */
+    int init(vio_t hdrVio);
+
+    /**
+     * @brief   Sets I/O Voltage
+     * @details Sets the voltage rail to be used for a given pin.
+     *  VIO_1V8 selects VDDIO which is supplied by Buck2, which is set at 1.8V,
+     *  VIO_3V3 selects VDDIOH which is supplied by LDO2, which is typically 3.3V/
+     * @param   pin Pin whose voltage supply is being assigned.
+     * @param   vio Voltage rail to be used for specified pin.
+     * @returns 0 if no errors, -1 if error.
+    */
+    int vddioh(PinName pin, vio_t vio);
+
+    /**Interrupt Hander for Power Button Press**/
+
+    //InterruptIn _interruptIn_UpButton(PIN_UPBUTTON);
+    //InterruptIn _interruptIn_DownButton(PIN_DOWNBUTTON);
+
+    /* Set vddio for Sharp LS013B7DH03 Display */
+	void enableDisplay(void);
+
+    /// Local I2C bus for configuring PMIC and accessing BMI160 IMU.
+    I2C i2c;
+
+    /// MAX20303 PMIC Instance
+    MAX20303 max20303;
+
+
+    InterruptIn *m_max32630hsp3_powerButtonInterrupt;
+    bool	button_status;
+    bool	button_longpressdetected;
+    Timeout	button_timeout;
+
+    ButtonStatus status_powerButton;
+    ButtonStatus status_upButton;
+    ButtonStatus status_downButton;
+    void event_powerButtonPressed(void);
+    void event_powerButtonReleased(void);
+    void event_longpresscheck(void);
+};
+
+#endif /* _MAX32630HSP_H_ */
diff -r 000000000000 -r a12d6976d64c demoUI/demoUI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoUI/demoUI.cpp	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,398 @@
+/*******************************************************************************
+ * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+ * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *******************************************************************************
+ */
+
+/*
+ * Note: This API i intended for demo purposes and specific to display screen LS013B7DH03. Being targeted for result display only
+ *       performance/memory measures are not taken into account! It is kept simple and some rules of embedded sw developmentare are
+ *       sacrified for being easily understandable.
+ *
+ * */
+
+#include "demoUI.h"
+/*demo specific display screen driver*/
+#include "screen/LS013B7DH03.h"
+
+const unsigned char UbuntuCondensed16x21[] = {
+		49, 16,21,3,
+        0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char
+        0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xCF, 0x01, 0xFC, 0xCF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char !
+        0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char "
+        0x0B, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0xFE, 0x01, 0xFC, 0x1F, 0x00, 0x7C, 0x10, 0x00, 0x40, 0x10, 0x00, 0x40, 0xF0, 0x01, 0xC0, 0xFF, 0x01, 0xFC, 0x1F, 0x00, 0x7C, 0x10, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char #
+        0x08, 0x00, 0x00, 0x00, 0xE0, 0x60, 0x00, 0xF0, 0xC1, 0x00, 0x18, 0xC3, 0x00, 0x1E, 0xC7, 0x07, 0x1E, 0xC6, 0x07, 0x18, 0xFE, 0x00, 0x18, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char $
+        0x0D, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0xFC, 0x03, 0x00, 0x04, 0x02, 0x01, 0xFC, 0xE3, 0x01, 0xF8, 0x79, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0xF0, 0xFC, 0x00, 0x3C, 0xFE, 0x01, 0x04, 0x02, 0x01, 0x00, 0xFE, 0x01, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char %
+        0x0A, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x78, 0xFE, 0x00, 0xFC, 0xC7, 0x01, 0x8C, 0x83, 0x01, 0x8C, 0x8F, 0x01, 0xFC, 0x9C, 0x01, 0x78, 0xF0, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x8E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char &
+        0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char '
+        0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0xF0, 0xFF, 0x03, 0x3C, 0x00, 0x0F, 0x06, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char (
+        0x04, 0x06, 0x00, 0x18, 0x3C, 0x00, 0x0F, 0xF0, 0xFF, 0x03, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char )
+        0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x58, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x58, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char *
+        0x09, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x80, 0x7F, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char +
+        0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x80, 0x0F, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ,
+        0x05, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char -
+        0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char .
+        0x06, 0x00, 0x80, 0x1F, 0x00, 0xF8, 0x07, 0x80, 0x7F, 0x00, 0xF8, 0x07, 0x00, 0x7E, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char /
+        0x08, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0xF8, 0xFF, 0x00, 0x1C, 0xC0, 0x01, 0x0C, 0x80, 0x01, 0x1C, 0xC0, 0x01, 0xF8, 0xFF, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 0
+        0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 1
+        0x07, 0x00, 0x00, 0x00, 0x08, 0xC0, 0x01, 0x0C, 0xF8, 0x01, 0x0C, 0x9C, 0x01, 0x0C, 0x87, 0x01, 0xFC, 0x83, 0x01, 0xF8, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 2
+        0x08, 0x00, 0x00, 0x00, 0x08, 0xC0, 0x00, 0x0C, 0x80, 0x01, 0x0C, 0x83, 0x01, 0x0C, 0x83, 0x01, 0x9C, 0xC7, 0x01, 0xF8, 0xFF, 0x00, 0xF0, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 3
+        0x08, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x80, 0x1F, 0x00, 0xF0, 0x19, 0x00, 0x3C, 0x18, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 4
+        0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xFC, 0x83, 0x01, 0xFC, 0x83, 0x01, 0x0C, 0x83, 0x01, 0x0C, 0xC7, 0x01, 0x0C, 0xFE, 0x00, 0x0C, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 5
+        0x08, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0xF0, 0xFF, 0x00, 0x78, 0xC3, 0x01, 0x18, 0x83, 0x01, 0x0C, 0x83, 0x01, 0x0C, 0xFF, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 6
+        0x08, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0xC0, 0x01, 0x0C, 0xFC, 0x01, 0x8C, 0x1F, 0x00, 0xEC, 0x01, 0x00, 0x7C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 7
+        0x08, 0x00, 0x00, 0x00, 0xF0, 0x78, 0x00, 0xF8, 0xFD, 0x00, 0x0C, 0x87, 0x01, 0x0C, 0x82, 0x01, 0x0C, 0x87, 0x01, 0xF8, 0xFD, 0x00, 0x78, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 8
+        0x08, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0xF8, 0x83, 0x01, 0x0C, 0x87, 0x01, 0x0C, 0xC6, 0x00, 0x1C, 0xF6, 0x00, 0xF8, 0x7F, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 9
+        0x03, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0x01, 0xE0, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char :
+        0x04, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x18, 0xE0, 0x80, 0x0F, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ;
+        0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x11, 0x00, 0x80, 0x31, 0x00, 0xC0, 0x60, 0x00, 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char <
+        0x08, 0x00, 0x00, 0x00, 0x80, 0x31, 0x00, 0x80, 0x31, 0x00, 0x80, 0x31, 0x00, 0x80, 0x31, 0x00, 0x80, 0x31, 0x00, 0x80, 0x31, 0x00, 0x80, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char =
+        0x08, 0x00, 0x00, 0x00, 0xC0, 0x60, 0x00, 0xC0, 0x60, 0x00, 0x80, 0x31, 0x00, 0x00, 0x11, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char >
+        0x07, 0x08, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0xCE, 0x01, 0x0C, 0xCF, 0x01, 0x8C, 0x03, 0x00, 0xF8, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ?
+        0x10, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0xE0, 0xFF, 0x01, 0xF0, 0xC0, 0x03, 0x38, 0x00, 0x07, 0x18, 0x3E, 0x0E, 0x0C, 0x7F, 0x0C, 0x8C, 0x61, 0x0C, 0x8C, 0x61, 0x0C, 0x8C, 0x3F, 0x0C, 0x8C, 0x7F, 0x0C, 0x1C, 0x60, 0x00, 0x18, 0x60, 0x00, 0x70, 0x70, 0x00, 0xE0, 0x3F, 0x00, 0xC0, 0x1F, 0x00,  // Code for char @
+        0x0B, 0x00, 0x80, 0x01, 0x00, 0xF8, 0x01, 0x00, 0x7F, 0x00, 0xE0, 0x3F, 0x00, 0xFC, 0x30, 0x00, 0x0C, 0x30, 0x00, 0xFC, 0x30, 0x00, 0xE0, 0x37, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char A
+        0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x0C, 0x83, 0x01, 0x0C, 0x83, 0x01, 0x0C, 0x83, 0x01, 0x9C, 0xC7, 0x01, 0xF8, 0xFF, 0x00, 0xF0, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char B
+        0x09, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0xF0, 0x7F, 0x00, 0x38, 0xE0, 0x00, 0x0C, 0xC0, 0x01, 0x0C, 0x80, 0x01, 0x0C, 0x80, 0x01, 0x0C, 0x80, 0x01, 0x18, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char C
+        0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x0C, 0x80, 0x01, 0x0C, 0x80, 0x01, 0x0C, 0x80, 0x01, 0x1C, 0xC0, 0x01, 0x38, 0xE0, 0x00, 0xF0, 0x7F, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char D
+        0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x0C, 0x83, 0x01, 0x0C, 0x83, 0x01, 0x0C, 0x83, 0x01, 0x0C, 0x83, 0x01, 0x0C, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char E
+        0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x0C, 0x03, 0x00, 0x0C, 0x03, 0x00, 0x0C, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char F
+        0x0A, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0xF0, 0x7F, 0x00, 0x38, 0xE0, 0x00, 0x1C, 0xC0, 0x01, 0x0C, 0x80, 0x01, 0x0C, 0x80, 0x01, 0x0C, 0x80, 0x01, 0x0C, 0xFE, 0x01, 0x08, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char G
+        0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char H
+        0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char I
+        0x06, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0xFC, 0xFF, 0x01, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char J
+        0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x80, 0x03, 0x00, 0xE0, 0x07, 0x00, 0x78, 0x1C, 0x00, 0x1C, 0xF8, 0x00, 0x04, 0xE0, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char K
+        0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char L
+        0x0E, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x1C, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x70, 0x00, 0x00, 0x7E, 0x00, 0xE0, 0x0F, 0x00, 0xFC, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xE0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char M
+        0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x7C, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char N
+        0x0C, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0xF0, 0x7F, 0x00, 0x38, 0xE0, 0x00, 0x1C, 0xC0, 0x01, 0x0C, 0x80, 0x01, 0x0C, 0x80, 0x01, 0x0C, 0x80, 0x01, 0x1C, 0xC0, 0x01, 0x38, 0xE0, 0x00, 0xF0, 0x7F, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char O
+        0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0E, 0x00, 0xF8, 0x07, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char P
+        0x0C, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0xF0, 0x7F, 0x00, 0x38, 0xE0, 0x00, 0x1C, 0xC0, 0x01, 0x0C, 0x80, 0x01, 0x0C, 0x80, 0x07, 0x0C, 0x80, 0x0F, 0x1C, 0xC0, 0x0D, 0x38, 0xE0, 0x18, 0xF0, 0x7F, 0x18, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char Q
+        0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x3E, 0x00, 0xF8, 0xF7, 0x00, 0xF0, 0xC3, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char R
+        0x07, 0x00, 0x00, 0x00, 0xF0, 0xC0, 0x00, 0xF8, 0x83, 0x01, 0x8C, 0x83, 0x01, 0x0C, 0x87, 0x01, 0x0C, 0xFE, 0x00, 0x1C, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char S
+        0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xFC, 0xFF, 0x01, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char T
+        0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0xC0, 0x01, 0xFC, 0xFF, 0x00, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char U
+        0x09, 0x1C, 0x00, 0x00, 0xFC, 0x03, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x80, 0x01, 0x00, 0xFC, 0x01, 0xE0, 0x7F, 0x00, 0xFC, 0x07, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char V
+        0x0F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0x80, 0xFF, 0x01, 0x00, 0x80, 0x01, 0x00, 0xF8, 0x01, 0x80, 0x7F, 0x00, 0xF0, 0x07, 0x00, 0x70, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x80, 0x01, 0x80, 0xFF, 0x01, 0xFC, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char W
+        0x09, 0x04, 0x00, 0x01, 0x1C, 0xC0, 0x01, 0x78, 0xF0, 0x00, 0xE0, 0x1F, 0x00, 0x80, 0x07, 0x00, 0xE0, 0x1F, 0x00, 0x78, 0xF0, 0x00, 0x1C, 0xC0, 0x01, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char X
+        0x0A, 0x04, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0xFF, 0x01, 0x00, 0xFF, 0x01, 0xC0, 0x03, 0x00, 0xF8, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char Y
+        0x08, 0x00, 0x00, 0x00, 0x0C, 0xC0, 0x01, 0x0C, 0xF0, 0x01, 0x0C, 0xBE, 0x01, 0x8C, 0x8F, 0x01, 0xEC, 0x81, 0x01, 0x7C, 0x80, 0x01, 0x1C, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char Z
+        0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x1F, 0xFE, 0xFF, 0x1F, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char [
+        0x06, 0x7E, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x80, 0x7F, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char BackSlash
+        0x04, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0xFE, 0xFF, 0x1F, 0xFE, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ]
+        0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xE0, 0x03, 0x00, 0x7C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ^
+        0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char _
+        0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char `
+        0x07, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xC0, 0xFC, 0x01, 0xC0, 0x8C, 0x01, 0xC0, 0x8C, 0x01, 0xC0, 0xFF, 0x01, 0x80, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char a
+        0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0xFE, 0xFF, 0x01, 0xC0, 0x80, 0x01, 0xC0, 0x80, 0x01, 0xC0, 0xC1, 0x01, 0x80, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char b
+        0x07, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0xFF, 0x00, 0xC0, 0xC1, 0x01, 0xC0, 0x80, 0x01, 0xC0, 0x80, 0x01, 0xC0, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char c
+        0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0xFF, 0x00, 0xC0, 0xC1, 0x01, 0xC0, 0x80, 0x01, 0xC0, 0x80, 0x01, 0xFE, 0xFF, 0x01, 0xFE, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char d
+        0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0xFF, 0x00, 0xC0, 0xCD, 0x01, 0xC0, 0x8C, 0x01, 0xC0, 0x8C, 0x01, 0x80, 0x8F, 0x01, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char e
+        0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xFE, 0xFF, 0x01, 0xC6, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char f
+        0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0xFF, 0x18, 0xC0, 0xC1, 0x19, 0xC0, 0x80, 0x19, 0xC0, 0x80, 0x19, 0xC0, 0xFF, 0x0F, 0xC0, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char g
+        0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0xFE, 0xFF, 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x80, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char h
+        0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xFF, 0x01, 0xCC, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char i
+        0x04, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0xCC, 0xFF, 0x1F, 0xCC, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char j
+        0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0xFE, 0xFF, 0x01, 0x00, 0x1C, 0x00, 0x80, 0xFF, 0x00, 0xC0, 0xE3, 0x01, 0x40, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char k
+        0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char l
+        0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0xC0, 0xFF, 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x80, 0xFF, 0x01, 0xC0, 0xFF, 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x80, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char m
+        0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0xC0, 0xFF, 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char n
+        0x09, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0xFF, 0x00, 0xC0, 0xC1, 0x01, 0xC0, 0x80, 0x01, 0xC0, 0x80, 0x01, 0xC0, 0xC1, 0x01, 0x80, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char o
+        0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x1F, 0xC0, 0xFF, 0x1F, 0xC0, 0x80, 0x01, 0xC0, 0x80, 0x01, 0xC0, 0xC1, 0x01, 0x80, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char p
+        0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0xFF, 0x00, 0xC0, 0xC1, 0x01, 0xC0, 0x80, 0x01, 0xC0, 0x80, 0x01, 0xC0, 0xFF, 0x1F, 0xC0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char q
+        0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0xC0, 0xFF, 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char r
+        0x06, 0x00, 0x00, 0x00, 0x80, 0x87, 0x01, 0xC0, 0x8F, 0x01, 0xC0, 0x9C, 0x01, 0xC0, 0xF8, 0x01, 0xC0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char s
+        0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x00, 0xF8, 0xFF, 0x01, 0xC0, 0x80, 0x01, 0xC0, 0x80, 0x01, 0xC0, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char t
+        0x08, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0xC0, 0xFF, 0x01, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char u
+        0x08, 0xC0, 0x01, 0x00, 0xC0, 0x7F, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0xFE, 0x01, 0xC0, 0x7F, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char v
+        0x0B, 0xC0, 0x03, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x80, 0x01, 0x00, 0xFE, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x80, 0x01, 0x00, 0xFE, 0x01, 0xC0, 0xFF, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char w
+        0x08, 0x40, 0x00, 0x01, 0xC0, 0xC1, 0x01, 0x80, 0xF7, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x80, 0xF7, 0x00, 0xC0, 0xC1, 0x01, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char x
+        0x07, 0xC0, 0x01, 0x18, 0xC0, 0x3F, 0x18, 0x00, 0xFE, 0x1F, 0x00, 0xE0, 0x0F, 0x00, 0xFE, 0x03, 0xC0, 0x3F, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char y
+        0x06, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x01, 0xC0, 0xF8, 0x01, 0xC0, 0xBE, 0x01, 0xC0, 0x87, 0x01, 0xC0, 0x81, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char z
+        0x06, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xFC, 0xFF, 0x0F, 0xFE, 0xF3, 0x1F, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char {
+        0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x1F, 0xFE, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char |
+        0x05, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0xFE, 0xF3, 0x1F, 0xFC, 0xFF, 0x0F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char }
+        0x09, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ~
+        0x06, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00   // Code for char 
+        };
+
+
+
+static const unsigned char maxim128Bitmaps[] =
+{
+
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //              #########
+		0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //            ##############
+		0x00, 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, //          ##################                                               ##
+		0x00, 0x01, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, //        #####################                                              ##
+		0x00, 0x03, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //       ########################
+		0x00, 0x07, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //      ##########################
+		0x00, 0x0F, 0xFF, 0xFF, 0xFE, 0x00, 0x2F, 0xB8, 0x7C, 0xE3, 0x32, 0x7B, 0xC0, 0x00, 0x00, 0x00, //     ###########################           # ##### ###    #####  ###   ##  ##  #  #### ####
+		0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0x00, 0x3F, 0xFC, 0x7E, 0x77, 0x33, 0xFF, 0xE0, 0x00, 0x00, 0x00, //    #############################          ############   ######  ### ###  ##  #############
+		0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0x80, 0x31, 0x8C, 0x02, 0x3E, 0x33, 0x1C, 0x60, 0x00, 0x00, 0x00, //    ##############################         ##   ##   ##        #   #####   ##  ##   ###   ##
+		0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x31, 0x8C, 0x1E, 0x1C, 0x33, 0x18, 0x60, 0x00, 0x00, 0x00, //   ###############################         ##   ##   ##     ####    ###    ##  ##   ##    ##
+		0x00, 0x3E, 0x01, 0xF8, 0x0F, 0xC0, 0x31, 0x8C, 0xFA, 0x1C, 0x33, 0x18, 0x60, 0x00, 0x00, 0x00, //   #####        ######       ######        ##   ##   ##  ##### #    ###    ##  ##   ##    ##
+		0x00, 0x7E, 0x00, 0xF0, 0x07, 0xE0, 0x31, 0x8C, 0xC2, 0x1E, 0x33, 0x18, 0x60, 0x00, 0x00, 0x00, //  ######         ####         ######       ##   ##   ##  ##    #    ####   ##  ##   ##    ##
+		0x00, 0x7E, 0x18, 0xE1, 0x87, 0xE0, 0x31, 0x8C, 0xC6, 0x37, 0x33, 0x18, 0x60, 0x00, 0x00, 0x00, //  ######    ##   ###    ##    ######       ##   ##   ##  ##   ##   ## ###  ##  ##   ##    ##
+		0x00, 0xFE, 0x18, 0xE3, 0x87, 0xE0, 0x31, 0x8C, 0xEE, 0x63, 0xB3, 0x18, 0x60, 0x00, 0x00, 0x00, // #######    ##   ###   ###    ######       ##   ##   ##  ### ###  ##   ### ##  ##   ##    ##
+		0x00, 0xFE, 0x1C, 0xC3, 0x87, 0xE0, 0x31, 0x8C, 0x7A, 0xE1, 0xB3, 0x18, 0x60, 0x00, 0x00, 0x00, // #######    ###  ##    ###    ######       ##   ##   ##   #### # ###    ## ##  ##   ##    ##
+		0x00, 0xFE, 0x1C, 0xC7, 0x87, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // #######    ###  ##   ####    ######
+		0x00, 0xFE, 0x1F, 0x87, 0x87, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // #######    ######    ####    ######
+		0x00, 0xFE, 0x1F, 0x8F, 0x87, 0xE0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, // #######    ######   #####    ######       ##                                                                      ##
+		0x00, 0xFE, 0x1F, 0x0F, 0x87, 0xE0, 0x30, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, // #######    #####    #####    ######       ##            ##                                    ##                  ##
+		0x00, 0xFE, 0x1E, 0x0F, 0x87, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, // #######    ####     #####    ######                     ##                                    ##                  ##
+		0x00, 0xFE, 0x1E, 0x07, 0x87, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, // #######    ####      ####    ######                     ##                                    ##                  ##
+		0x00, 0xFE, 0x1E, 0x07, 0x87, 0xE0, 0x33, 0xF1, 0xF3, 0xF1, 0xFD, 0xBB, 0xE7, 0xE7, 0xC3, 0xF0, // #######    ####      ####    ######       ##  ######   #####  ######   ####### ## ### #####  ######  #####    ######
+		0x00, 0x7E, 0x1C, 0x43, 0x87, 0xE0, 0x33, 0x98, 0xC2, 0x31, 0x19, 0xE4, 0x33, 0x0C, 0x66, 0x30, //  ######    ###   #    ###    ######       ##  ###  ##   ##    #   ##   #   ##  ####  #    ##  ##    ##   ##  ##   ##
+		0x00, 0x7E, 0x18, 0x63, 0x87, 0xE0, 0x33, 0x18, 0xC6, 0x1B, 0x19, 0xC0, 0x33, 0x0C, 0x66, 0x30, //  ######    ##    ##   ###    ######       ##  ##   ##   ##   ##    ## ##   ##  ###        ##  ##    ##   ##  ##   ##
+		0x00, 0x7E, 0x18, 0xE1, 0x87, 0xC0, 0x33, 0x18, 0xC7, 0xFB, 0x19, 0x81, 0xF3, 0x1F, 0xEE, 0x30, //  ######    ##   ###    ##    #####        ##  ##   ##   ##   ######## ##   ##  ##      #####  ##   ######## ###   ##
+		0x00, 0x3E, 0x10, 0xF1, 0x87, 0xC0, 0x33, 0x18, 0xC7, 0xF1, 0xF1, 0x87, 0xB3, 0x1F, 0xCC, 0x30, //   #####    #    ####   ##    #####        ##  ##   ##   ##   #######   #####   ##    #### ##  ##   #######  ##    ##
+		0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x33, 0x18, 0xC6, 0x01, 0xE1, 0x86, 0x33, 0x0C, 0x0E, 0x30, //   ###############################         ##  ##   ##   ##   ##        ####    ##    ##   ##  ##    ##      ###   ##
+		0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0x80, 0x33, 0x18, 0xC6, 0x09, 0x81, 0x84, 0x33, 0x8C, 0x26, 0x30, //    ##############################         ##  ##   ##   ##   ##     #  ##      ##    #    ##  ###   ##    #  ##   ##
+		0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0x00, 0x33, 0x18, 0xF3, 0xF1, 0xF9, 0x87, 0xF1, 0xEF, 0xE7, 0xF0, //     ############################          ##  ##   ##   ####  ######   ######  ##    #######   #### #######  #######
+		0x00, 0x07, 0xFF, 0xFF, 0xFE, 0x00, 0x33, 0x18, 0x71, 0xE3, 0x1D, 0x83, 0xD0, 0xE3, 0x83, 0x90, //      ##########################           ##  ##   ##    ###   ####   ##   ### ##     #### #    ###   ###     ###  #
+		0x00, 0x03, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, //       ########################                                       ##     ##
+		0x00, 0x01, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, //        ######################                                         ### ####
+		0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, //         ####################                                           #####
+		0x00, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //           ################
+		0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //             ###########
+		0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //                 ####
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+// Bitmap sizes for maxim128
+const unsigned char maxim128WidthPages   = 16;
+const unsigned char maxim128HeightPixels = 36;
+
+#define	PIN_displayCS		P0_7
+#define	PIN_displayEXTCOM	P6_4
+#define	PIN_MODE_BUTTON		P6_5
+#define	PIN_MODE_BUTTON		P2_3
+
+//#define USE_BIGFONT
+
+
+typedef struct{
+	PwmOut *dispPWM;
+	SPI *dispPSI;
+	DigitalOut 	*dispCS;
+	silabs::LS013B7DH03 *display;
+	InterruptIn  *button;
+	uint8_t buttonMode;
+	volatile uint8_t algoMode;
+	volatile uint8_t prevAlgoMode;
+	char buffer[32];
+
+}demo_ui_t;
+
+static demo_ui_t demoUIDEV;
+
+/*need protection with mutex or update in critical section outside isr context*/
+static unsigned int dispCnt = 0;
+
+void button_isr(void){
+
+    int i;
+    volatile uint32_t isr_delay  = 0;
+    demoUIDEV.button->disable_irq();
+    demoUIDEV.algoMode = 1- demoUIDEV.algoMode;
+
+    for(i = 10000000 ; i; i--){
+    	isr_delay++;
+    }
+    dispCnt = 0;
+    demoUIDEV.button->enable_irq();
+}
+
+
+void demoUI_init_(demo_ui_t *demoUIDEV )
+{
+
+	static PwmOut	           displayPWM(PIN_displayEXTCOM);
+	static SPI                 displaySPI(P0_5, P0_6, P0_4, NC);
+	static DigitalOut 	       displayCS(PIN_displayCS);
+	static silabs::LS013B7DH03 display(&displaySPI , &displayCS);
+    static InterruptIn         button(PIN_MODE_BUTTON);
+
+	demoUIDEV->dispCS  = &displayCS;
+	demoUIDEV->dispPWM = &displayPWM;
+	demoUIDEV->dispPSI = &displaySPI;
+	demoUIDEV->display = &display;
+
+	demoUIDEV->button = &button;
+	demoUIDEV->buttonMode = 0;
+	demoUIDEV->algoMode       = DISPLAY_WHRM;
+	demoUIDEV->prevAlgoMode   = DISPLAY_WHRM;
+
+	demoUIDEV->dispPSI->frequency(1000000);
+	demoUIDEV->dispPWM->period_ms(16);
+	demoUIDEV->dispPWM->pulsewidth_ms(8);
+	demoUIDEV->display->clearImmediate(NULL);
+#if defined(USE_BIGFONT)
+	display.set_font(UbuntuCondensed16x21);
+#endif
+	demoUIDEV->button->fall(button_isr);
+	demoUIDEV->button->disable_irq();
+	wait_ms(20);
+	demoUIDEV->button->enable_irq();
+}
+
+
+void demoUI_display_algo_estimations_(demo_ui_t *demoUIDEV , int integer)
+{
+
+
+	//demoUIDEV->display->locate(3,10);
+	demoUIDEV->display->foreground(Black);
+	demoUIDEV->display->background(White);
+
+#if defined(USE_BIGFONT)
+	demoUIDEV->display->locate(2,6);
+
+#else
+	demoUIDEV->display->locate(2,4);
+#endif
+
+    switch( demoUIDEV->algoMode ){
+      case DISPLAY_WHRM:
+#if defined(USE_BIGFONT)
+    	    demoUIDEV->display->locate(2,22);
+			demoUIDEV->display->printf("HEART RATE");
+
+			if(integer > 10 && integer < 100)
+				 snprintf(demoUIDEV->buffer, 32, "BpS: %s%d ","  ", integer);
+			else if( integer > 100 &&  integer < 205)
+			   snprintf(demoUIDEV->buffer, 32, "BpS: %s%d "," ", integer);
+#else
+
+    	     demoUIDEV->display->printf("HEART RATE  ");
+    	     if(integer > 10 && integer < 100)
+                    snprintf(demoUIDEV->buffer, 32, "BpS: %s%d   ","  ", integer);
+      	     else if( integer > 100 &&  integer < 205)
+      	            snprintf(demoUIDEV->buffer, 32, "BpS: %s%d   "," ", integer);
+#endif
+    	     break;
+
+      case DISPLAY_WSPo2:
+#if defined(USE_BIGFONT)
+    	      demoUIDEV->display->locate(2,22);
+    	      demoUIDEV->display->printf("BLD OXYGEN");
+    	  	  if(integer >= 0 && integer < 100)
+      		         snprintf(demoUIDEV->buffer, 32, "SPo2: %s%d   ","%%", integer);
+#else
+    	     demoUIDEV->display->printf("BLOOD OXYGEN");
+    	      if( integer < 80 ){
+    	    	   dispCnt++;
+
+    	    	   unsigned int quanta =  (dispCnt >> 2) & 0x00000003;
+    	    	   if( quanta == 0)
+    	    		   snprintf(demoUIDEV->buffer, 32, "COMPUTING     ");
+                   else if( quanta == 1)
+    	    		   snprintf(demoUIDEV->buffer, 32, "COMPUTING.    ");
+    	    	   else if( quanta == 2)
+    	    		   snprintf(demoUIDEV->buffer, 32, "COMPUTING..   ");
+    	    	   else
+    	    		   snprintf(demoUIDEV->buffer, 32, "COMPUTING...  ");
+
+                   if( dispCnt > 100 &&  dispCnt < 120 )
+                	    snprintf(demoUIDEV->buffer, 32, "LOW SNR       ");
+                   else if( dispCnt > 120)
+                	    dispCnt = 0;
+     	      }
+    	      else{
+    	    	  snprintf(demoUIDEV->buffer, 32, "SPo2: %s%d    ","%%", integer);
+    	    	  dispCnt = 0;
+    	      }
+
+#endif
+              break;
+
+     }
+#if defined(USE_BIGFONT)
+    demoUIDEV->display->locate(10,42);
+#else
+    demoUIDEV->display->locate(2,6);
+#endif
+    demoUIDEV->display->printf(demoUIDEV->buffer);
+
+    demoUIDEV->display->showBMP((uint8_t*)maxim128Bitmaps, 128, 40, 0, 86);
+    demoUIDEV->display->update();
+
+	/*DEBUG*///wait_ms(20);
+}
+
+void demoUI_display_set_algoMode_( demo_ui_t *demoUIDEV , int algo){
+
+	demoUIDEV->algoMode = (algo == 0)? DISPLAY_WHRM : DISPLAY_WSPo2;
+}
+int demoUI_display_get_algoMode_(demo_ui_t *demoUIDEV){
+   return (demoUIDEV->algoMode);
+}
+
+void demoUI_init(void ){
+	demoUI_init_(&demoUIDEV);
+	demoUI_display_set_algoMode_(&demoUIDEV ,DISPLAY_WHRM);
+	return;
+}
+
+void demoUI_display_algo_estimations(int integer){
+	demoUI_display_algo_estimations_(&demoUIDEV,integer);
+	return;
+
+}
+
+void demoUI_display_set_algoMode(int algo){
+	demoUI_display_set_algoMode_(&demoUIDEV ,algo);
+	return;
+}
+
+int demoUI_display_get_mode(void){
+   return demoUI_display_get_algoMode_(&demoUIDEV);
+}
+
+void demoUI_display(int algoResult){
+     static bool is_initialized = false;
+     if( !is_initialized){
+    	 demoUI_init_(&demoUIDEV);
+    	 is_initialized = true;
+    	 return;
+     }
+     demoUI_display_algo_estimations_(&demoUIDEV,algoResult);
+}
+
+
+
+
+
+
+
+
diff -r 000000000000 -r a12d6976d64c demoUI/demoUI.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoUI/demoUI.h	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+ * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *******************************************************************************
+ */
+
+#ifndef SOURCE_DEMOUI_DEMOUI_H_
+#define SOURCE_DEMOUI_DEMOUI_H_
+
+#include <events/mbed_events.h>
+#include <mbed.h>
+
+#include "screen/LS013B7DH03.h"
+
+enum{
+	DISPLAY_WHRM  = 0,
+	DISPLAY_WSPo2 = 1
+};
+
+#define USE_DEMO_DISPDEV
+#if defined(USE_DEMO_DISPDEV)
+
+
+	void demoUI_init();
+	void demoUI_display_algo_estimations(int integer);
+	void demoUI_display_set_algoMode(int algo);
+	int demoUI_display_get_mode(void);
+	void demoUI_display(int algoResult);
+
+
+
+#else
+	void start_demo_display(void);
+	void display_algo_estimations( uint8_t mode , int integer, int fraction);
+	void setup_mode_button(void);
+
+#endif
+
+
+extern volatile uint8_t algoMode;
+
+#endif /* SOURCE_DEMOUI_DEMOUI_H_ */
diff -r 000000000000 -r a12d6976d64c demoUI/screen/BufferedDisplay.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoUI/screen/BufferedDisplay.cpp	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,139 @@
+/***************************************************************************//**
+ * @file BufferedDisplay.cpp
+ * @brief Buffered version of GraphicsDisplay
+ *******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
+ * obligation to support this Software. Silicon Labs is providing the
+ * Software "AS IS", with no express or implied warranties of any kind,
+ * including, but not limited to, any implied warranties of merchantability
+ * or fitness for any particular purpose or warranties against infringement
+ * of any proprietary rights of a third party.
+ *
+ * Silicon Labs will not be liable for any consequential, incidental, or
+ * special damages, or any other relief, or for any claim by any third party,
+ * arising from your use of this Software.
+ *
+ ******************************************************************************/
+
+#include "../screen/BufferedDisplay.h"
+
+#define SWAP8(a) ((((a) & 0x80) >> 7) | (((a) & 0x40) >> 5) | (((a) & 0x20) >> 3) | (((a) & 0x10) >> 1) | (((a) & 0x08) << 1) | (((a) & 0x04) << 3) | (((a) & 0x02) << 5) | (((a) & 0x01) << 7))
+
+namespace silabs {
+
+	BufferedDisplay::BufferedDisplay(const char *name) : GraphicsDisplay(name) {
+		memset((uint8_t*)_pixelBuffer, White, sizeof(_pixelBuffer));	// init full frame buffer
+		memset((uint8_t*)_dirtyRows, 0xFF, sizeof(_dirtyRows)); 		// init dirty status
+	}
+
+	/**
+	 * Override of GraphicsDisplay's pixel()
+	 */
+
+	void BufferedDisplay::pixel(int x, int y, int colour) {
+	    /* Apply constraint to x and y */
+	    if(x < 0 || y < 0) return;
+	    if(x >= DISPLAY_WIDTH || y >= DISPLAY_HEIGHT) return;
+	    
+	    /***************************************************************************************************************** 
+	     * The display expects LSB input, while the SPI is configured for 8bit MSB transfers. Therefore, we should  
+	     * construct the framebuffer accordingly, so that an MSB transmission will put pixel 0 first on the wire.
+	     *
+	     * So the actual pixel layout in framebuffer (for 128x128) is as follows:
+	     * {                                                    //Framebuffer
+	     *	{                                                   //Line 0
+	     *	 {p0, p1, p2, p3, p4, p5, p6, p7},                  //Line 0 byte 0 (byte 0)
+	     *   {p8, p9,p10,p11,p12,p13,p14,p15},                  //Line 0 byte 1 (byte 1)
+	     *   ...
+	     *   {p120,p121,p122,p123,p124,p125,p126,p127}          //Line 0 byte 15 (byte 15)
+	     *  },        
+	     *  {													//Line 1
+	     *	 {p128,p129,p130,p131,p132,p133,p134,p135},         //Line 1 byte 0 (byte 16)
+	     *   ...
+	     *  },
+	     *  ...
+	     *  {													//Line 127
+	     *	 {...},              								//Line 127 byte 0 (byte 2032)
+	     *   ...
+	     *   {...}												//Line 127 byte 15 (byte 2047) = 128*128 bits
+	     *	}
+	     * }
+	     *
+	     * This means that to calculate the actual bit position in the framebuffer byte, we need to swap the bit 
+	     * order of the lower three bits. So pixel 7 becomes bit offset 0, 6 -> 1, 5 -> 2, 4->3, 3->4, 2->5, 1->6 and 0->7.
+	     *****************************************************************************************************************/
+	    uint8_t swapx = 7 - ((unsigned int)x & 0x07);
+	    x = ((unsigned int)x & 0xFFFFFFF8) | swapx;
+
+	    /* Since we are dealing with 1-bit pixels, we can avoid having to do bitshift and comparison operations twice.
+	     * Basically, do the comparison with the requested state and current state, and if it changed, do an XOR on the framebuffer pixel and set the line to dirty.
+	     */
+	    bool change = ((_pixelBuffer[((y * DISPLAY_WIDTH) + x) / DISPLAY_BUFFER_TYPE_SIZE] & (1 << (x & DISPLAY_BUFFER_TYPE_MASK))) != ((colour & 0x01) << (x & DISPLAY_BUFFER_TYPE_MASK)));
+		if(change) {
+			/* Pixel's value and requested value are different, so since it's binary, we can simply do an XOR */
+            _pixelBuffer[((y * DISPLAY_WIDTH) + x) / DISPLAY_BUFFER_TYPE_SIZE] ^= (1 << (x & DISPLAY_BUFFER_TYPE_MASK));
+
+            /* notify dirty status of this line */
+            _dirtyRows[y / DISPLAY_BUFFER_TYPE_SIZE] |= (1 << (y & DISPLAY_BUFFER_TYPE_MASK));
+		}
+	}
+
+	int BufferedDisplay::width() {
+		return DISPLAY_WIDTH;
+	}
+	int BufferedDisplay::height() {
+		return DISPLAY_HEIGHT;
+	}
+
+	/**
+	 * Function to move bitmap into frame buffer
+	 * arguments:
+	 * 	* bitmap: pointer to uint8 array containing horizontal pixel data
+	 * 	* bmpWidth: width of the bitmap in pixels (must be multiple of 8)
+	 * 	* bmpHeight: height of the bitmap in pixels
+	 * 	* startX: starting position to apply bitmap in horizontal direction (0 = leftmost) (must be multiple of 8)
+	 * 	* startY: starting position to apply bitmap in vertical direction (0 = topmost)
+	 */
+	void BufferedDisplay::showBMP(const uint8_t* bitmap, const uint32_t bmpWidth, const uint32_t bmpHeight, const uint32_t startX, const uint32_t startY) {
+		uint32_t bmpLine = 0, y = startY, bytesPerLine = ((bmpWidth >= (DISPLAY_WIDTH - startX)) ? (DISPLAY_WIDTH - startX) : bmpWidth) / 8;
+
+		/* Apply constraints */
+		if((bmpWidth & 0x07) != 0) return;
+		if((startX & 0x07) != 0) return;
+		if(startX >= DISPLAY_WIDTH) return;
+		
+		//Superflouous due to for-loop check
+		//if((startY >= DISPLAY_HEIGHT) return;
+
+		/* Copy over bytes to the framebuffer, do not write outside framebuffer boundary */
+		for(; y < DISPLAY_HEIGHT; y++) {
+			/* Check that we are not writing more than the BMP height */
+			if(bmpLine >= bmpHeight) break;
+			
+			/* Copy over one line (bmpLine) from the BMP file to the corresponding line (y) in the pixel buffer */
+			memcpy( (void*) &(((uint8_t*)_pixelBuffer)[((y * DISPLAY_WIDTH) + startX) / 8]),
+					(const void*) &(bitmap[bmpLine * (bmpWidth / 8)]),
+					bytesPerLine);
+
+			/* Set dirty status for the line we just overwrote */
+			_dirtyRows[y / DISPLAY_BUFFER_TYPE_SIZE] |= (1 << (y % DISPLAY_BUFFER_TYPE_SIZE));
+			bmpLine++;
+		}
+
+		return;
+	}
+}
diff -r 000000000000 -r a12d6976d64c demoUI/screen/BufferedDisplay.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoUI/screen/BufferedDisplay.h	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,81 @@
+/***************************************************************************//**
+ * @file BufferedDisplay.h
+ * @brief Framebuffered version of GraphicsDisplay
+ *******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
+ * obligation to support this Software. Silicon Labs is providing the
+ * Software "AS IS", with no express or implied warranties of any kind,
+ * including, but not limited to, any implied warranties of merchantability
+ * or fitness for any particular purpose or warranties against infringement
+ * of any proprietary rights of a third party.
+ *
+ * Silicon Labs will not be liable for any consequential, incidental, or
+ * special damages, or any other relief, or for any claim by any third party,
+ * arising from your use of this Software.
+ *
+ ******************************************************************************/
+
+#ifndef SILABS_BUFFEREDDISPLAY_H
+#define SILABS_BUFFEREDDISPLAY_H
+
+#include "../screen/GraphicsDisplay.h"
+#include "../screen/LCDSettings.h"
+
+namespace silabs {
+/** Framebuffered version of GraphicsDisplay
+ * 
+ * This has been implemented as part of the MemoryLCD library.
+ */
+class BufferedDisplay : public GraphicsDisplay {
+
+public:
+
+	BufferedDisplay(const char *name=NULL);
+
+	/**
+	 * Override of GraphicsDisplay pixel() function to set a pixel in the buffer
+     *
+     * @param x      Zero-based x-axis index of pixel to set. 0 = leftmost.
+     * @param y      Zero-based y-axis index of pixel to set. 0 = topmost.
+     * @param colour Colour value to set pixel to. In this implementation, only LSB is taken into account.
+	 */
+	virtual void pixel(int x, int y, int colour);
+	virtual int width();
+	virtual int height();
+
+	/**
+	 * Function to move bitmap into frame buffer
+	 * 
+	 * @param bitmap      pointer to uint8 array containing horizontal pixel data
+	 * @param bmpWidth    width of the bitmap in pixels (must be multiple of 8)
+	 * @param bmpHeight   height of the bitmap in pixels
+	 * @param startX      starting position to apply bitmap in horizontal direction (0 = leftmost) (must be multiple of 8)
+	 * @param startY      starting position to apply bitmap in vertical direction (0 = topmost)
+	 */
+	void showBMP(const uint8_t* bitmap, const uint32_t bmpWidth, const uint32_t bmpHeight, const uint32_t startX, const uint32_t startY);
+
+protected:
+	volatile DISPLAY_BUFFER_TYPE _pixelBuffer[DISPLAY_BUFFER_ELEMENTS]; // one full frame buffer
+	volatile DISPLAY_BUFFER_TYPE _dirtyRows[DISPLAY_HEIGHT/DISPLAY_BUFFER_TYPE_SIZE]; // 1 bit per row to indicate dirty status
+};
+
+} // namespace silabs
+
+
+
+
+#endif //SILABS_BUFFEREDDISPLAY_H
diff -r 000000000000 -r a12d6976d64c demoUI/screen/GraphicsDisplay.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoUI/screen/GraphicsDisplay.cpp	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,456 @@
+/* mbed GraphicsDisplay Display Library Base Class
+ * Copyright (c) 2007-2009 sford
+ * Released under the MIT License: http://mbed.org/license/mit
+ */
+ 
+#include "../screen/GraphicsDisplay.h"
+
+#define incx() x++, dxt += d2xt, t += dxt
+#define incy() y--, dyt += d2yt, t += dyt
+
+const unsigned char FONT8x8[97][8] = {
+{0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00}, // columns, rows, num_bytes_per_char
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // space 0x20
+{0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00}, // !
+{0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00}, // "
+{0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00}, // #
+{0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00}, // $
+{0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00}, // %
+{0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00}, // &
+{0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00}, // '
+{0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00}, // (
+{0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00}, // )
+{0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00}, // *
+{0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00}, // +
+{0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30}, // ,
+{0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00}, // -
+{0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00}, // .
+{0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00}, // / (forward slash)
+{0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00}, // 0 0x30
+{0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00}, // 1
+{0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00}, // 2
+{0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00}, // 3
+{0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00}, // 4
+{0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00}, // 5
+{0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00}, // 6
+{0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00}, // 7
+{0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00}, // 8
+{0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00}, // 9
+{0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00}, // :
+{0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30}, // ;
+{0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00}, // <
+{0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00}, // =
+{0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00}, // >
+{0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00}, // ?
+{0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00}, // @ 0x40
+{0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00}, // A
+{0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00}, // B
+{0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00}, // C
+{0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00}, // D
+{0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00}, // E
+{0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00}, // F
+{0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00}, // G
+{0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00}, // H
+{0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // I
+{0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00}, // J
+{0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00}, // K
+{0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00}, // L
+{0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00}, // M
+{0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00}, // N
+{0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00}, // O
+{0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00}, // P 0x50
+{0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00}, // Q
+{0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00}, // R
+{0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00}, // S
+{0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00}, // T
+{0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00}, // U
+{0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00}, // V
+{0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00}, // W
+{0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00}, // X
+{0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00}, // Y
+{0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00}, // Z
+{0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00}, // [
+{0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00}, // \ (back slash)
+{0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00}, // ]
+{0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00}, // ^
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF}, // _
+{0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00}, // ` 0x60
+{0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00}, // a
+{0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00}, // b
+{0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00}, // c
+{0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00}, // d
+{0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00}, // e
+{0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00}, // f
+{0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C}, // g
+{0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00}, // h
+{0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00}, // i
+{0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C}, // j
+{0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00}, // k
+{0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // l
+{0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00}, // m
+{0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00}, // n
+{0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00}, // o
+{0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78}, // p
+{0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F}, // q
+{0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00}, // r
+{0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00}, // s
+{0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00}, // t
+{0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00}, // u
+{0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00}, // v
+{0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00}, // w
+{0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00}, // x
+{0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C}, // y
+{0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00}, // z
+{0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00}, // {
+{0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00}, // |
+{0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00}, // }
+{0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00}, // ~
+{0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00}}; // DEL
+    
+GraphicsDisplay::GraphicsDisplay(const char *name):TextDisplay(name) {
+    foreground((uint16_t)Black);
+    background((uint16_t)White);
+    // current pixel location
+	_x = 0;
+	_y = 0;
+	// window settings
+	_x1 = 0;
+	_x2 = 0;
+	_y1 = 0;
+	_y2 = 0;
+}
+    
+void GraphicsDisplay::character(int column, int row, int value) { 
+    if(externalfont){ // send external font
+        unsigned int hor,vert,offset,bpl,j,i,b;
+        const unsigned char* sign;
+        unsigned char z,w;
+        if ((value < 31) || (value > 127)) return;   // test char range
+        // read font parameter from start of array
+        offset = font[0];                    // bytes / char
+        hor = font[1];                       // get hor size of font
+        vert = font[2];                      // get vert size of font
+        bpl = font[3];                       // bytes per line
+        if (char_x + hor > width()) {
+            char_x = 0;
+            char_y = char_y + vert;
+            if (char_y >= height() - font[2]) {
+                char_y = 0;
+            }
+        }     
+        window(char_x, char_y,hor,vert); // char box
+        sign = &font[((value -32) * offset) + 4]; // start of char bitmap
+        w = sign[0];                          // width of actual char
+        for (j=0; j<vert; j++) {  //  vert line
+            for (i=0; i<hor; i++) {   //  horz line
+                z =  sign[bpl * i + ((j & 0xF8) >> 3)+1];
+                b = 1 << (j & 0x07);
+                if (( z & b ) == 0x00) {               
+                    putp(_foreground);              
+                } 
+                else {                     
+                    putp(_background);                                
+                }
+            }
+        }
+        if ((w + 2) < hor) {                   // x offset to next char
+            char_x += w + 2;
+            }
+            else char_x += hor;
+    }   
+    // send default font            
+    else {
+        blitbit(column * 8, row * 8, 8, 8, (char*)&(FONT8x8[value - 0x1F][0]));
+    }
+}
+
+void GraphicsDisplay::window(int x, int y, int w, int h) {
+    // current pixel location
+    _x = x;
+    _y = y;
+    // window settings
+    _x1 = x;
+    _x2 = x + w - 1;
+    _y1 = y;
+    _y2 = y + h - 1;
+}
+    
+void GraphicsDisplay::putp(int colour) {
+    // put pixel at current pixel location
+    pixel(_x, _y, colour);
+    // update pixel location based on window settings
+    _x++;
+    if(_x > _x2) {
+        _x = _x1;
+        _y++;
+        if(_y > _y2) {
+            _y = _y1;
+        }
+    }
+}
+
+void GraphicsDisplay::rect(int x0, int y0, int x1, int y1, int color) {
+    if (x1 > x0) hline(x0,x1,y0,color);
+    else  hline(x1,x0,y0,color);
+    if (y1 > y0) vline(x0,y0,y1,color);
+    else vline(x0,y1,y0,color);
+    if (x1 > x0) hline(x0,x1,y1,color);
+    else  hline(x1,x0,y1,color);
+    if (y1 > y0) vline(x1,y0,y1,color);
+    else vline(x1,y1,y0,color);
+    return;
+}
+ 
+void GraphicsDisplay::fillrect(int x0, int y0, int w, int h, int colour) {
+    unsigned long int index=0;
+    if (w < 0) {
+        x0 = x0 + w;
+        w = -w;
+    }
+    if (h < 0) {
+        y0 = y0 + h;
+        h = -h;
+    }
+    window(x0,y0,w,h);
+    int num = h*w;
+    for( index = 0; index<num; index++ ) {
+       putp(colour); 
+    }
+    return;
+}
+
+void GraphicsDisplay::fill(int x, int y, int w, int h, int colour) { 
+    fillrect(x, y, w, h, colour);
+}
+
+void GraphicsDisplay::circle(int x, int y, int r,int colour){
+	int ce = -r;
+	int cx = r;
+	int cy = 0;
+	while(cx >= cy){
+		pixel(x+cx,y+cy,colour);
+		pixel(x-cx,y-cy,colour);
+		pixel(x-cx,y+cy,colour);
+		pixel(x+cx,y-cy,colour);
+		pixel(x+cy,y+cx,colour);
+		pixel(x-cy,y+cx,colour);
+		pixel(x-cy,y-cx,colour);
+		pixel(x+cy,y-cx,colour);
+		ce += 2*cy++ + 1;
+		if(ce >= 0){
+			ce -= 2*cx---1;	
+		}
+		
+	}
+
+}
+
+// To draw circle set a and b to the same values
+void GraphicsDisplay::ellipse(int xc, int yc, int a, int b, unsigned int colour)
+{
+    /* e(x,y) = b^2*x^2 + a^2*y^2 - a^2*b^2 */
+    int x = 0, y = b;
+    long a2 = (long)a*a, b2 = (long)b*b;
+    long crit1 = -(a2/4 + a%2 + b2);
+    long crit2 = -(b2/4 + b%2 + a2);
+    long crit3 = -(b2/4 + b%2);
+    long t = -a2*y;                         // e(x+1/2,y-1/2) - (a^2+b^2)/4
+    long dxt = 2*b2*x, dyt = -2*a2*y;
+    long d2xt = 2*b2, d2yt = 2*a2;
+ 
+    while (y>=0 && x<=a) {
+        pixel(xc+x, yc+y, colour);
+        if (x!=0 || y!=0)
+            pixel(xc-x, yc-y, colour);
+        if (x!=0 && y!=0) {
+            pixel(xc+x, yc-y, colour);
+            pixel(xc-x, yc+y, colour);
+        }
+        if (t + b2*x <= crit1 ||            // e(x+1,y-1/2) <= 0
+                t + a2*y <= crit3)          // e(x+1/2,y) <= 0
+            incx();
+        else if (t - a2*y > crit2)          // e(x+1/2,y-1) > 0
+            incy();
+        else {
+            incx();
+            incy();
+        }
+    }
+}
+// To draw circle set a and b to the same values
+void GraphicsDisplay::fillellipse(int xc, int yc, int a, int b, unsigned int colour)
+{
+    /* e(x,y) = b^2*x^2 + a^2*y^2 - a^2*b^2 */
+    int x = 0, y = b;
+    int rx = x, ry = y;
+    unsigned int width = 1;
+    unsigned int height = 1;
+    long a2 = (long)a*a, b2 = (long)b*b;
+    long crit1 = -(a2/4 + a%2 + b2);
+    long crit2 = -(b2/4 + b%2 + a2);
+    long crit3 = -(b2/4 + b%2);
+    long t = -a2*y;                         // e(x+1/2,y-1/2) - (a^2+b^2)/4
+    long dxt = 2*b2*x, dyt = -2*a2*y;
+    long d2xt = 2*b2, d2yt = 2*a2;
+    if (b == 0) {
+        fillrect(xc-a, yc, 2*a+1, 1, colour);
+        return;
+    }
+    while (y>=0 && x<=a) {
+        if (t + b2*x <= crit1 ||            // e(x+1,y-1/2) <= 0
+                t + a2*y <= crit3) {        // e(x+1/2,y) <= 0
+            if (height == 1)
+                ;                           // draw nothing
+            else if (ry*2+1 > (height-1)*2) {
+                fillrect(xc-rx, yc-ry, width, height-1, colour);
+                fillrect(xc-rx, yc+ry+1, width, 1-height, colour);
+                ry -= height-1;
+                height = 1;
+            } else {
+                fillrect(xc-rx, yc-ry, width, ry*2+1, colour);
+                ry -= ry;
+                height = 1;
+            }
+            incx();
+            rx++;
+            width += 2;
+        } else if (t - a2*y > crit2) {      // e(x+1/2,y-1) > 0
+            incy();
+            height++;
+        } else {
+            if (ry*2+1 > height*2) {
+                fillrect(xc-rx, yc-ry, width, height, colour);
+                fillrect(xc-rx, yc+ry+1, width, -height, colour);
+            } else {
+                fillrect(xc-rx, yc-ry, width, ry*2+1, colour);
+            }
+            incx();
+            incy();
+            rx++;
+            width += 2;
+            ry -= height;
+            height = 1;
+        }
+    }
+    if (ry > height) {
+        fillrect(xc-rx, yc-ry, width, height, colour);
+        fillrect(xc-rx, yc+ry+1, width, -height, colour);
+    } else {
+        fillrect(xc-rx, yc-ry, width, ry*2+1, colour);
+    }
+}
+ 
+ 
+void GraphicsDisplay::line(int x0, int y0, int x1, int y1, int colour) {
+    //window(x0, y, w, h);
+    int   dx = 0, dy = 0;
+    int   dx_sym = 0, dy_sym = 0;
+    int   dx_x2 = 0, dy_x2 = 0;
+    int   di = 0;
+    dx = x1-x0;
+    dy = y1-y0;
+ 
+    if (dx == 0) {        /* vertical line */
+        if (y1 > y0) vline(x0,y0,y1,colour);
+        else vline(x0,y1,y0,colour);
+        return;
+    }
+    if (dx > 0) {
+        dx_sym = 1;
+    } else {
+        dx_sym = -1;
+    }
+    if (dy == 0) {        /* horizontal line */
+        if (x1 > x0) hline(x0,x1,y0,colour);
+        else  hline(x1,x0,y0,colour);
+        return;
+    }
+    if (dy > 0) {
+        dy_sym = 1;
+    } else {
+        dy_sym = -1;
+    }
+    dx = dx_sym*dx;
+    dy = dy_sym*dy;
+    dx_x2 = dx*2;
+    dy_x2 = dy*2;
+    if (dx >= dy) {
+        di = dy_x2 - dx;
+        while (x0 != x1) {
+ 
+            pixel(x0, y0, colour);
+            x0 += dx_sym;
+            if (di<0) {
+                di += dy_x2;
+            } else {
+                di += dy_x2 - dx_x2;
+                y0 += dy_sym;
+            }
+        }
+        pixel(x0, y0, colour);
+    } else {
+        di = dx_x2 - dy;
+        while (y0 != y1) {
+            pixel(x0, y0, colour);
+            y0 += dy_sym;
+            if (di < 0) {
+                di += dx_x2;
+            } else {
+                di += dx_x2 - dy_x2;
+                x0 += dx_sym;
+            }
+        }
+        pixel(x0, y0, colour);
+    }
+    return;
+}
+ 
+void GraphicsDisplay::hline(int x0, int x1, int y, int colour) {
+    int w;
+    w = x1 - x0 + 1;
+    window(x0,y,w,1);
+    for (int x=0; x<w; x++) {
+        putp(colour);
+    }
+    return;
+}
+ 
+void GraphicsDisplay::vline(int x, int y0, int y1, int colour) {
+    int h;
+    h = y1 - y0 + 1;
+    window(x,y0,1,h);
+    for (int y=0; y<h; y++) {
+        putp(colour);
+    }
+    return;
+}
+
+void GraphicsDisplay::cls() {
+    fill(0, 0, width(), height(), _background);
+}
+    
+void GraphicsDisplay::blit(int x, int y, int w, int h, const int *colour) { 
+    window(x, y, w, h);
+    for(int i=0; i<w*h; i++) {
+        putp(colour[i]);
+    }
+}
+    
+void GraphicsDisplay::blitbit(int x, int y, int w, int h, const char* colour) {
+    window(x, y, w, h);
+    for(int i = 0; i < w*h; i++) {
+        char byte = colour[i >> 3];
+        int offset = i & 0x7;
+        int c = ((byte << (offset)) & 0x80) ? _foreground : _background;
+        putp(c);
+    }
+}
+    
+int GraphicsDisplay::columns() { 
+    return width() / 8; 
+}
+
+int GraphicsDisplay::rows() { 
+    return height() / 8; 
+}
+
diff -r 000000000000 -r a12d6976d64c demoUI/screen/GraphicsDisplay.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoUI/screen/GraphicsDisplay.h	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,68 @@
+/* mbed GraphicsDisplay Display Library Base Class
+ * Copyright (c) 2007-2009 sford
+ * Released under the MIT License: http://mbed.org/license/mit
+ *
+ * A library for providing a common base class for Graphics displays
+ * To port a new display, derive from this class and implement
+ * the constructor (setup the display), pixel (put a pixel
+ * at a location), width and height functions. Everything else
+ * (locate, printf, putc, cls, window, putp, fill, blit, blitbit) 
+ * will come for free. You can also provide a specialised implementation
+ * of window and putp to speed up the results
+ */
+
+#ifndef MBED_GRAPHICSDISPLAY_H
+#define MBED_GRAPHICSDISPLAY_H
+
+#include "../screen/TextDisplay.h"
+
+class GraphicsDisplay : public TextDisplay {
+
+public:         
+          
+    GraphicsDisplay(const char* name);
+     
+    virtual void pixel(int x, int y, int colour) = 0;
+    virtual int width() = 0;
+    virtual int height() = 0;
+        
+    virtual void window(int x, int y, int w, int h);
+    virtual void putp(int colour);
+    
+    virtual void cls();
+    virtual void rect(int x0, int y0, int x1, int y1, int colour);
+    virtual void fillrect(int x0, int y0, int w, int h, int colour);
+    // fill equals fillrect, name has been kept to not break compatibility
+    virtual void fill(int x, int y, int w, int h, int colour);
+    
+    // To draw circle using ellipse, set a and b to the same values
+    virtual void ellipse(int xc, int yc, int a, int b, unsigned int colour);
+    virtual void fillellipse(int xc, int yc, int a, int b, unsigned int colour);
+    virtual void circle(int x, int y, int r, int colour);
+    
+    virtual void hline(int x0, int x1, int y, int colour);
+    virtual void vline(int x0, int y0, int y1, int colour);
+    virtual void line(int x0, int y0, int x1, int y1, int colour);
+    
+    virtual void blit(int x, int y, int w, int h, const int *colour);    
+    virtual void blitbit(int x, int y, int w, int h, const char* colour);
+    
+    virtual void character(int column, int row, int value);
+    virtual int columns();
+    virtual int rows();
+    
+protected:
+
+    // pixel location
+    short _x;
+    short _y;
+    
+    // window location
+    short _x1;
+    short _x2;
+    short _y1;
+    short _y2;
+
+};
+
+#endif
diff -r 000000000000 -r a12d6976d64c demoUI/screen/LCDSettings.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoUI/screen/LCDSettings.h	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,29 @@
+#ifndef LCDSETTINGS_H
+#define LCDSETTINGS_H
+
+/** MemoryLCD width in pixels */ 
+#define DISPLAY_WIDTH				(128)
+
+/** MemoryLCD height in pixels */
+#define DISPLAY_HEIGHT				(128)
+
+/** Data type for storing buffer the pixel buffer */
+#if	((DISPLAY_WIDTH % 32) == 0)
+#define	DISPLAY_BUFFER_TYPE			uint32_t
+#define DISPLAY_BUFFER_TYPE_MASK    (0x1F)
+#else
+#define DISPLAY_BUFFER_TYPE			uint8_t
+#define DISPLAY_BUFFER_TYPE_MASK    (0x07)
+#endif
+
+#define DISPLAY_BUFFER_TYPE_SIZE	(sizeof(DISPLAY_BUFFER_TYPE) * 8)
+#define DISPLAY_BUFFER_ELEMENTS 	((DISPLAY_WIDTH*DISPLAY_HEIGHT)/DISPLAY_BUFFER_TYPE_SIZE)
+
+/** Maximum length of a printf to the display */
+#define MAX_PRINTF_CHARS			40
+
+/** Color definitions */
+#define White						0xFFFFFFFF
+#define Black						0x00000000
+
+#endif
diff -r 000000000000 -r a12d6976d64c demoUI/screen/LS013B7DH03.ZIP
Binary file demoUI/screen/LS013B7DH03.ZIP has changed
diff -r 000000000000 -r a12d6976d64c demoUI/screen/LS013B7DH03.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoUI/screen/LS013B7DH03.cpp	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,245 @@
+/***************************************************************************//**
+ * @file LS013B7DH03.cpp
+ * @brief Driver class for the Sharp LS013B7DH03 memory LCD on some kits.
+ *******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
+ * obligation to support this Software. Silicon Labs is providing the
+ * Software "AS IS", with no express or implied warranties of any kind,
+ * including, but not limited to, any implied warranties of merchantability
+ * or fitness for any particular purpose or warranties against infringement
+ * of any proprietary rights of a third party.
+ *
+ * Silicon Labs will not be liable for any consequential, incidental, or
+ * special damages, or any other relief, or for any claim by any third party,
+ * arising from your use of this Software.
+ *
+ ******************************************************************************/
+
+#include "../screen/LS013B7DH03.h"
+
+#include <mbed.h>
+#include "SPI.h"
+//#include "Peripherals.h"
+
+/* LS013B7DH03 SPI commands */
+#define LS013B7DH03_CMD_UPDATE     (0x01)
+#define LS013B7DH03_CMD_ALL_CLEAR  (0x04)
+
+/* Macro to switch endianness on char value */
+#define SWAP8(a) ((((a) & 0x80) >> 7) | (((a) & 0x40) >> 5) | (((a) & 0x20) >> 3) | (((a) & 0x10) >> 1) | (((a) & 0x08) << 1) | (((a) & 0x04) << 3) | (((a) & 0x02) << 5) | (((a) & 0x01) << 7))
+
+namespace silabs {
+
+
+LS013B7DH03::LS013B7DH03(mbed::SPI * spi, DigitalOut * CS, const char *name) : BufferedDisplay( name )  {
+	//Save pointer to ChipSelect pin
+	_CS = CS;
+	_CS->write(0);
+	DigitalOut DISP(P6_6);
+
+//Save pointer to ExtCom pin
+///	_EXTCOM = ExtCom;
+///	_EXTCOM->write(0);
+
+	DISP  = 0;
+	wait_ms(1);
+	DISP = 1;
+
+	//Save pointer to spi peripheral
+	_spi = spi;
+	//_spi->frequency(600000);
+	_spi->format( 8, 0 );
+
+	_internalEventCallback.attach(this, &LS013B7DH03::_cbHandler);
+
+	//Initialize
+	//_spi->set_dma_usage((DMAUsage)DMA_USAGE_NEVER);
+	_refreshCount = 0;
+	_lcdPolarity = 0;
+	_state = IDLE;
+	_completionCallbackPtr = NULL;
+	_rowCount = 0;
+
+	//Start toggling the EXTCOM pin
+	//_displayToggler.attach(this, &LS013B7DH03::toggle, 0.008f);
+}
+
+/**
+ * Call this function at 55 ~ 65 Hz to keep the display up-to-date.
+ */
+void LS013B7DH03::toggle() {
+//	_EXTCOM->write(!_EXTCOM->read());
+//	_refreshCount++;
+}
+
+/**
+ * Function to get internal refresh counter
+ */
+uint32_t LS013B7DH03::getRefreshTicks() {
+	return _refreshCount;
+}
+
+/**
+ * Call this function to push all changes to the display
+ */
+int LS013B7DH03::update( cbptr_t callback ) {
+	uint32_t rowCount = 0;
+	bool update = false;
+
+	// Check if something actually changed in the pixelbuffer
+	for(rowCount = 0; rowCount < DISPLAY_HEIGHT/DISPLAY_BUFFER_TYPE_SIZE; rowCount++) {
+		if(_dirtyRows[rowCount] != 0) update = true;
+	}
+
+	if(update == false) return LS013B7DH03_NO_ACTION;
+
+	// Watch out to not mess up a transfer
+	if(_state != IDLE) return LS013B7DH03_ERROR_BUSY;
+
+	_completionCallbackPtr = callback;
+
+	// Take control
+	_state = WAIT_WRITE;
+	_rowCount = 0;
+
+	//Initialize the command vector
+	_cmd[0] = (uint8_t)SWAP8(LS013B7DH03_CMD_UPDATE);
+	_cmd[1] = SWAP8(1);
+
+	// Activate LCD
+	_CS->write(1);
+	_csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.01f);
+
+	return LS013B7DH03_OK;
+}
+
+/**
+ * Function to test display buffer
+ */
+int LS013B7DH03::showDemo() {
+	for(uint32_t i = 0; i < DISPLAY_BUFFER_ELEMENTS; i+=2) {
+		_pixelBuffer[i] = 0x00555345;
+	}
+	memset((void*)_dirtyRows, 0x33, sizeof(_dirtyRows));
+
+	return LS013B7DH03_OK;
+}
+
+/**
+ * Call this function to immediately clear the display
+ */
+int LS013B7DH03::clearImmediate( cbptr_t callback ) {
+	// Watch out to not mess up a transfer
+	if(_state != IDLE) return LS013B7DH03_ERROR_BUSY;
+
+	_state = WAIT_CLEAR;
+	_completionCallbackPtr = callback;
+
+	// Clear out the pixel buffer
+	memset((void*)_pixelBuffer, White, sizeof(_pixelBuffer));
+	memset((void*)_dirtyRows, 0, sizeof(_dirtyRows));
+
+	_cmd[0] = (uint8_t)(SWAP8(LS013B7DH03_CMD_ALL_CLEAR | _lcdPolarity));
+	_cmd[1] = 0;
+
+	// Wait for the ChipSelect line
+	_CS->write(1);
+	_csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.01f);
+
+	return LS013B7DH03_OK;
+}
+
+void LS013B7DH03::_cbHandlerTimeout( void ) {
+	this->_cbHandler(0);
+}
+
+void LS013B7DH03::_cbHandler( int event ) {
+	if((_state == WAIT_WRITE) || (_state == WRITING))
+	{
+		_state = WRITING;
+		while(_rowCount < DISPLAY_HEIGHT) {
+			// Determine the next line to send
+			if((_dirtyRows[_rowCount / DISPLAY_BUFFER_TYPE_SIZE] & (1 << (_rowCount % DISPLAY_BUFFER_TYPE_SIZE))) != 0) {
+
+				// Row is dirty, send an update to the display
+				_cmd[1] = (uint8_t)SWAP8(_rowCount + 1);
+				memcpy((void*)&(_cmd[2]), (const void*)&(_pixelBuffer[_rowCount*(DISPLAY_WIDTH/DISPLAY_BUFFER_TYPE_SIZE)]), DISPLAY_WIDTH / DISPLAY_BUFFER_TYPE_SIZE * sizeof(DISPLAY_BUFFER_TYPE));
+
+				if(_spi->write((const char*)_cmd, (2 + (DISPLAY_WIDTH / DISPLAY_BUFFER_TYPE_SIZE * sizeof(DISPLAY_BUFFER_TYPE))) , (char*)NULL, 0/*, _internalEventCallback, SPI_EVENT_COMPLETE*/) != (2 + (DISPLAY_WIDTH / DISPLAY_BUFFER_TYPE_SIZE * sizeof(DISPLAY_BUFFER_TYPE)))) {
+					// SPI is busy, with another transaction. This means the data to the LCD has been corrupted, so fail here.
+					_state = DONE;
+					//printf("Failed at _cbHandler\n");
+					// Make sure the handler is called again
+					_csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.1f);
+				}else{	//sc...
+					_csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.001f);
+				}
+
+				// Transaction is in progress, so update row state
+				_dirtyRows[_rowCount / DISPLAY_BUFFER_TYPE_SIZE] &= ~(1 << (_rowCount % DISPLAY_BUFFER_TYPE_SIZE));
+				_rowCount++;
+				return;
+			}
+
+			// Row wasn't touched, so check the next row
+			_rowCount++;
+		}
+
+		// Done sending!
+		_cmd[1] = 0xFF;
+		_state = TRANSFERS_DONE;
+		if(_spi->write((const char*)_cmd, 2, (char*)NULL, 0/*, _internalEventCallback, SPI_EVENT_COMPLETE*/) != 2) {
+			// SPI is busy, with another transaction. This means the data to the LCD has been corrupted, so fail here.
+			_state = DONE;
+
+			// Make sure the handler is called again
+			_csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.1f);
+		}else{	//sc...
+			_csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.001f);
+		}
+		return;
+	}
+	else if (_state == WAIT_CLEAR)
+	{
+		_state = TRANSFERS_DONE;
+		if(_spi->write((const char*)_cmd, 2, (char*)NULL, 0/*, _internalEventCallback, SPI_EVENT_COMPLETE*/) != 2) {
+			// SPI is busy, with another transaction. This means the data to the LCD has been corrupted, so fail here.
+			_state = DONE;
+
+			// Make sure the handler is called again
+			_csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.1f);
+		}else{	//sc...
+			_csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.001f);
+		}
+		return;
+	}
+	else if (_state == TRANSFERS_DONE)
+	{
+		_state = DONE;
+		_csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.01f);
+		return;
+	}
+	else if (_state == DONE)
+	{
+		_CS->write(0);
+		_state = IDLE;
+		if(_completionCallbackPtr != 0) _completionCallbackPtr();
+		return;
+	}
+}
+
+} // namespace silabs
diff -r 000000000000 -r a12d6976d64c demoUI/screen/LS013B7DH03.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoUI/screen/LS013B7DH03.h	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,123 @@
+/***************************************************************************//**
+ * @file LS013B7DH03.h
+ * @brief Driver class for the Sharp LS013B7DH03 memory LCD on some kits.
+ *******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
+ * obligation to support this Software. Silicon Labs is providing the
+ * Software "AS IS", with no express or implied warranties of any kind,
+ * including, but not limited to, any implied warranties of merchantability
+ * or fitness for any particular purpose or warranties against infringement
+ * of any proprietary rights of a third party.
+ *
+ * Silicon Labs will not be liable for any consequential, incidental, or
+ * special damages, or any other relief, or for any claim by any third party,
+ * arising from your use of this Software.
+ *
+ ******************************************************************************/
+
+#ifndef SILABS_LS013B7DH03_H
+#define SILABS_LS013B7DH03_H
+
+#include "platform.h"
+#include <mbed.h>
+#include "../screen/BufferedDisplay.h"
+#include "../screen/LCDSettings.h"
+//#include "Peripherals.h"
+
+typedef void (*cbptr_t)(void);
+
+#define LS013B7DH03_ERROR_BUSY		-1
+#define LS013B7DH03_ERROR_SPI_BUSY	-2
+#define LS013B7DH03_NO_ACTION		-3
+#define LS013B7DH03_ERROR_ARGUMENT	-4
+#define	LS013B7DH03_OK				0
+
+typedef enum {
+	IDLE,			// No operation currently ongoing
+	CLEARING,		// In the process of clearing the display
+	WRITING,		// In the process of sending a display update
+	WAIT_CLEAR,		// Going to clear after CS pin timeout
+	WAIT_WRITE,		// Going to write after CS pin timeout
+	TRANSFERS_DONE, // Last transfer in progress
+	DONE			// Done with transmission, waiting for CS pin to become high
+} LS013B7DH03_state_t;
+
+namespace silabs {
+class LS013B7DH03 : public BufferedDisplay {
+
+public:
+
+	LS013B7DH03(SPI * spi, DigitalOut * CS,  const char *name=NULL);
+
+	/**
+	 * Call this function to push all changes to the display
+	 */
+	int update( cbptr_t callback = NULL );
+
+	/**
+	 * Immediately clear the display: set pixel buffer to zero and clear out the display.
+	 */
+	int clearImmediate( cbptr_t callback = NULL );
+
+	/**
+	 * Function to test display buffer
+	 */
+	int showDemo();
+
+
+
+	/**
+	 * Function to get internal refresh counter
+	 */
+	uint32_t getRefreshTicks();
+
+
+protected:
+	mbed::SPI *_spi;
+	//mbed::DigitalOut *_EXTCOM;
+	mbed::DigitalOut *_CS;
+
+	mbed::Ticker _displayToggler;
+	mbed::Timeout _csTimeout;
+
+	event_callback_t _internalEventCallback;
+	volatile uint32_t _refreshCount;
+	uint8_t _lcdPolarity;
+	LS013B7DH03_state_t _state;
+	cbptr_t _completionCallbackPtr;
+	volatile uint32_t _rowCount;
+	uint8_t _cmd[2 + (DISPLAY_WIDTH / DISPLAY_BUFFER_TYPE_SIZE * sizeof(DISPLAY_BUFFER_TYPE))];
+
+	/**
+	 * Callback handler for internal SPI transfers.
+	 */
+	void _cbHandler( int event );
+
+	/**
+	 * Callback handler for internal SPI transfers triggered by timeout.
+	 */
+	void _cbHandlerTimeout( void );
+
+	/**
+	 * Call this function at 55 ~ 65 Hz to keep the display from losing contrast.
+	 */
+	void toggle();
+};
+
+} // namespace silabs
+
+#endif //SILABS_LS013B7DH03_H
diff -r 000000000000 -r a12d6976d64c demoUI/screen/TextDisplay.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoUI/screen/TextDisplay.cpp	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,93 @@
+/* mbed TextDisplay Display Library Base Class
+ * Copyright (c) 2007-2009 sford
+ * Released under the MIT License: http://mbed.org/license/mit
+ */
+ 
+#include "../screen/TextDisplay.h"
+
+#include <cstdarg>
+
+TextDisplay::TextDisplay(const char *name){
+    _row = 0;
+    _column = 0;
+
+    if (name == NULL) {
+        _path = NULL;
+    } else {
+        _path = new char[strlen(name) + 2];
+        sprintf(_path, "/%s", name);
+    }
+}
+    
+int TextDisplay::_putc(int value) {
+    if(value == '\n') {
+        _column = 0;
+        _row++;
+        if(_row >= rows()) {
+            _row = 0;
+        }
+    } else {
+        character(_column, _row, value);
+        _column++;
+        if(_column >= columns()) {
+            _column = 0;
+            _row++;
+            if(_row >= rows()) {
+                _row = 0;
+            }
+        }
+    }
+    return value;
+}
+
+// crude cls implementation, should generally be overwritten in derived class
+void TextDisplay::cls() {
+    locate(0, 0);
+    for(int i=0; i<columns()*rows(); i++) {
+        _putc(' ');
+    }
+}
+
+void TextDisplay::set_font(const unsigned char * f) {
+    font = f;
+    if(font==NULL) {
+    	externalfont = 0;  // set display.font
+    	locate(0, 0);
+    }    
+    else{
+    	externalfont = 1;
+    	locate(0, 0);
+    }
+}
+
+void TextDisplay::locate(int column, int row) {
+    _column = column;
+    _row = row;
+    char_x = column;
+    char_y = row;
+}
+
+int TextDisplay::_getc() {
+    return -1;
+}
+        
+void TextDisplay::foreground(uint16_t colour) {
+    _foreground = colour;
+}
+
+void TextDisplay::background(uint16_t colour) {
+    _background = colour;
+}
+
+void TextDisplay::printf(const char* format, ...) {
+	char buffer[MAX_PRINTF_CHARS + 1] = { 0 };
+	uint32_t iterator = 0;
+	va_list args;
+	va_start(args, format);
+	vsprintf(buffer, format, args);
+	va_end(args);
+
+	while((buffer[iterator] != 0) && (iterator < MAX_PRINTF_CHARS)) {
+		_putc(buffer[iterator++]);
+	}
+}
diff -r 000000000000 -r a12d6976d64c demoUI/screen/TextDisplay.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demoUI/screen/TextDisplay.h	Mon Dec 17 13:58:56 2018 +0300
@@ -0,0 +1,92 @@
+/* mbed TextDisplay Library Base Class
+ * Copyright (c) 2007-2009 sford
+ * Released under the MIT License: http://mbed.org/license/mit
+ *
+ * A common base class for Text displays
+ * To port a new display, derive from this class and implement
+ * the constructor (setup the display), character (put a character
+ * at a location), rows and columns (number of rows/cols) functions.
+ * Everything else (locate, printf, putc, cls) will come for free
+ *
+ * The model is the display will wrap at the right and bottom, so you can
+ * keep writing and will always get valid characters. The location is 
+ * maintained internally to the class to make this easy
+ */
+
+#ifndef MBED_TEXTDISPLAY_H
+#define MBED_TEXTDISPLAY_H
+
+#include "../screen/LCDSettings.h"
+#include "mbed.h"
+
+class TextDisplay {
+public:
+
+  // functions needing implementation in derived implementation class
+  /** Create a TextDisplay interface
+     *
+     * @param name The name used in the path to access the strean through the filesystem
+     */
+    TextDisplay(const char *name = NULL);
+
+    /** output a character at the given position
+     *
+     * @param column column where charater must be written
+     * @param  row where character must be written
+     * @param c the character to be written to the TextDisplay
+     */
+    virtual void character(int column, int row, int c) = 0;
+
+    /** return number if rows on TextDisplay
+     * @result number of rows
+     */
+    virtual int rows() = 0;
+
+    /** return number if columns on TextDisplay
+    * @result number of rows
+    */
+    virtual int columns() = 0;
+    
+    // Sets external font usage, eg. dispaly.set_font(Arial12x12);
+    // This uses pixel positioning.
+    // display.set_font(NULL); returns to internal default font.
+    void set_font(const unsigned char * f);
+    
+    // set position of the next character or string print.
+    // External font, set pixel x(column),y(row) position.
+    // internal(default) font, set character column and row position 
+    virtual void locate(int column, int row);
+    
+    // functions that come for free, but can be overwritten
+
+    /** clear screen
+    */
+    virtual void cls();
+    virtual void foreground(uint16_t colour);
+    virtual void background(uint16_t colour);
+    // putc (from Stream)
+    // printf (from Stream)
+    virtual void printf(const char* format, ...);
+    
+protected:
+
+    virtual int _putc(int value);
+    virtual int _getc();
+    
+    // external font functions
+    const unsigned char* font;
+    int externalfont;
+ 
+    // character location
+    uint16_t _column;
+    uint16_t _row;
+    unsigned int char_x;
+    unsigned int char_y;
+
+    // colours
+    uint16_t _foreground;
+    uint16_t _background;
+    char *_path;
+};
+
+#endif