TEST
Dependencies: max32630fthr Adafruit_FeatherOLED USBDevice
Revision 1:f60eafbf009a, committed 2019-04-10
- Comitter:
- gmehmet
- Date:
- Wed Apr 10 14:56:25 2019 +0300
- Parent:
- 0:07d28b5db986
- Child:
- 2:58c2d53dea38
- Commit message:
- upload from local
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.config Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,100 @@ +# +# Automatically generated file; DO NOT EDIT. +# MAXIM MAX326XXX mBED EVKit platform configuration +# +#CONFIG_CONFIG_NAME="icarus_hsp3_0" +#CONFIG_CONFIG_NAME="Pegasus_MAX86140_SmartSensor" +#CONFIG_CONFIG_NAME="Pegasus_MAX30101_SmartSensor" + +# +# Platform setup + +CONFIG_PLATFORM_MAX32630HSP=y + +CONFIG_MAXIM_PLATFORM_NAME="icarus" + + +# +# ECG Sensor setup +# +CONFIG_ENABLE_ECG=y +CONFIG_ECG_MAX30001=y + +# +# TP Sensor setup +# +CONFIG_ENABLE_TP=y +CONFIG_TP_MAX30205=y + +# +# Accelerometer setup +# +CONFIG_ENABLE_ACCEL=y + + +# +# SmartSensor setup +# +CONFIG_ENABLE_SMARTSENSOR=y +CONFIG_ENABLE_SS_BOOTLOADER=y +CONFIG_ENABLE_SS_MAX8614X=y + + +# +# Bootloader Configuration +# +CONFIG_BOOTLOADER_USES_MFIO=y + +# +# DISPLAY setup +# +CONFIG_LCD_LS013B7DH03=y +CONFIG_LCD_WATCHINTERFACE=y + + +# +# Algorithm setup +# +CONFIG_ENABLE_WHRM_AND_SPO2=y + + + + +# +# BLE setup +# +CONFIG_ENABLE_BLE=y +CONFIG_USE_BLE_TICKER_TO_CHECK_TRANSFER=y + +# +# Data streaming setup +# +#CONFIG_ENABLE_BLETEST_COMM=y +CONFIG_ENABLE_SS_GENERICCMDCOMM=y + +# +# Memory debug setup +# +# CONFIG_ENABLE_MEMORY_DEBUG is not set + +# +# LED status setup +# +CONFIG_ENABLE_LED_STATUS=y + +# +# EventStat Setup +# +#CONFIG_ENABLE_EVENTSTATS=y + +# +# Debug messages setup +# +#CONFIG_SHOW_DEBUG_MSGS=y +#CONFIG_SHOW_INFO_MSGS=y +#CONFIG_SHOW_I2C_DEBUG_MESSAGES=y + + +#File Storage System. Either enable or disable both +CONFIG_ENABLE_MX25U=y +CONFIG_ENABLE_USBMSD=y
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.mbed Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,2 @@ +TARGET=MAX32630FTHR +TOOLCHAIN=GCC_ARM
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Drivers/Adafruit_FeatherOLED.lib Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,1 @@ +https://developer.mbed.org/users/switches/code/Adafruit_FeatherOLED/#a267f00528be
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BLE_ICARUS/BLE_ICARUS.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,255 @@
+#include "BLE_ICARUS.h"
+
+#include "../../Utilities/mxm_assert.h"
+#include "queue.h"
+#include "Peripherals.h"
+#include "../../version.h"
+
+
+UUID customServiceUUID("00001523-1212-efde-1523-785feabcd123");
+UUID notifyCharUUID( "00001011-1212-efde-1523-785feabcd123");
+UUID configRWCharUUID("00001027-1212-efde-1523-785feabcd123");
+
+const static char DEVICE_NAME[] = FIRMWARE_VERSION;
+static const uint16_t uuid16_list[] = {0xFFFF}; //Custom UUID, FFFF is reserved for development
+
+// BLE defines
+#define BLE_TICKER_PERIOD 0.050 //Ticker period in order of seconds
+#define BLE_CONN_INT_PACKET 2 //Ticker period in order of seconds
+#define BLE_NOTIFY_CHAR_ARR_SIZE 20
+#define BLE_READWRITE_CHAR_ARR_SIZE 16
+#define MAX_BLE_QUEUE 128
+// end of BLE defines
+
+#if defined(USE_BLE_TICKER_TO_CHECK_TRANSFER)
+Ticker TICKER_BLE;
+static volatile unsigned char BLE_CAN_TRANSFER = 0;
+
+static void Ble_Can_Transfer_Toggle(){
+ BLE_CAN_TRANSFER = true;
+}
+
+static inline char Ble_Can_Transfer_Check(){
+ return BLE_CAN_TRANSFER;
+}
+
+static inline void Ble_Can_Transfer_Set(unsigned char en){
+ BLE_CAN_TRANSFER = en;
+}
+
+#endif
+
+/* Set Up custom Characteristics */
+static uint8_t notifyValue[BLE_NOTIFY_CHAR_ARR_SIZE] = {0};
+GattCharacteristic notifyChar(notifyCharUUID, notifyValue, BLE_NOTIFY_CHAR_ARR_SIZE, BLE_NOTIFY_CHAR_ARR_SIZE, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
+
+static uint8_t configValue[BLE_READWRITE_CHAR_ARR_SIZE] = {3,0,254,37};
+ReadWriteArrayGattCharacteristic<uint8_t, sizeof(configValue)> writeChar(configRWCharUUID, configValue);
+
+/* Set up custom service */
+GattCharacteristic *characteristics[] = {&writeChar,¬ifyChar};
+GattService customService(customServiceUUID, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *));
+
+// Temporary Fixes to be removed
+volatile BLE_State bleState = BLE_STARTING;
+
+// end of Temporary Fixes to be removed
+
+// sc...
+struct queue_t BLEQUEUE;
+static uint8_t BLEOutBuffer[BLE_NOTIFY_CHAR_ARR_SIZE * MAX_BLE_QUEUE];
+
+static DSInterface *BLE_DS_INTERFACE;
+
+
+/*
+ * Handle writes to writeCharacteristic
+ */
+void writeCharCallback(const GattWriteCallbackParams *params)
+{
+ uint8_t data[BLE_READWRITE_CHAR_ARR_SIZE] = {0};
+ /* Check to see what characteristic was written, by handle */
+ printf("writeCharCallback %p\r\n", Thread::gettid());
+ if(params->handle == writeChar.getValueHandle()) {
+ printf("Data received: length = %d, data = 0x",params->len);
+ for(int x=0; x < params->len; x++) {
+ if ((BLE_DS_INTERFACE != NULL) && (params->data[x] != 0)) {
+ BLE_DS_INTERFACE->build_command((char)params->data[x]);
+ }
+ printf("%x-", params->data[x]);
+ }
+ printf("\n\r");
+ }
+ /* Update the notifyChar with the value of writeChar */
+ BLE::Instance(BLE::DEFAULT_INSTANCE).gattServer().write(writeChar.getValueHandle(), data, BLE_READWRITE_CHAR_ARR_SIZE);
+}
+
+/**
+ * This function is called when the ble initialization process has failed
+ */
+void onBleInitError(BLE &ble, ble_error_t error)
+{
+ printf("errro %d\r\n", __LINE__);
+ /* Avoid compiler warnings */
+ (void) ble;
+ (void) error;
+ /* Initialization error handling should go here */
+}
+
+/* Restart Advertising on disconnection*/
+void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
+{
+ pr_debug("disconnectionCallback %p\r\n", Thread::gettid());
+#if defined(USE_BLE_TICKER_TO_CHECK_TRANSFER)
+ TICKER_BLE.detach();
+ pr_debug("detached disconnectionCallback\r\n");
+ Ble_Can_Transfer_Set(false);
+#endif
+ bleState = BLE_DISCONNECTED;
+ BLE::Instance().gap().startAdvertising();
+ BLE_DS_INTERFACE->ds_set_ble_status(false);
+ queue_reset(&BLEQUEUE);
+}
+
+/* Connection */
+void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
+{
+ pr_err("connectionCallback %p\r\n", Thread::gettid());
+
+ Gap::ConnectionParams_t newParams = {
+ .minConnectionInterval = 6, /**< Minimum Connection Interval in 1.25 ms units, see BLE_GAP_CP_LIMITS.*/
+ .maxConnectionInterval = 9, /**< Maximum Connection Interval in 1.25 ms units, see BLE_GAP_CP_LIMITS.*/
+ .slaveLatency = 0, /**< Slave Latency in number of connection events, see BLE_GAP_CP_LIMITS.*/
+ .connectionSupervisionTimeout = 600 /**< Connection Supervision Timeout in 10 ms units, see BLE_GAP_CP_LIMITS.*/
+ };
+
+ BLE::Instance().gap().updateConnectionParams(params->handle, &newParams);
+ BLE::Instance().gap().stopAdvertising();
+ BLE_DS_INTERFACE->ds_set_ble_status(true);
+#if defined(USE_BLE_TICKER_TO_CHECK_TRANSFER)
+ TICKER_BLE.attach(&Ble_Can_Transfer_Toggle, BLE_TICKER_PERIOD);
+ pr_debug("Attached connectionCallback\r\n");
+#endif
+ //m.sensor_enable(1);
+ bleState = BLE_CONNECTED;
+}
+
+/**
+ * Callback triggered when the ble initialization process has finished
+ */
+void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
+{
+ int ret;
+ BLE& ble = params->ble;
+ ble_error_t error = params->error;
+
+ if (error != BLE_ERROR_NONE) {
+ printf("errro %d\r\n", __LINE__);
+ /* In case of error, forward the error handling to onBleInitError */
+ onBleInitError(ble, error);
+ printf("errro %d\r\n", __LINE__);
+ return;
+ }
+ /* Ensure that it is the default instance of BLE */
+ if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
+ printf("errro %d\r\n", __LINE__);
+ return;
+ }
+ ble.gap().onDisconnection(disconnectionCallback);
+ ble.gap().onConnection(connectionCallback);
+ ble.gattServer().onDataWritten(writeCharCallback);
+ /* Setup advertising */
+ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); // BLE only, no classic BT
+ ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // advertising type
+ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); // add name
+ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); // UUID's broadcast in advertising packet
+ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_TAG);
+ ble.gap().setAdvertisingInterval(100); // 100ms.
+ /* Add our custom service */
+ ble.gattServer().addService(customService);
+ printf("bleInitComplete\n");
+ ble.gap().startAdvertising();
+
+ ret = queue_init(&BLEQUEUE, BLEOutBuffer, BLE_NOTIFY_CHAR_ARR_SIZE, BLE_NOTIFY_CHAR_ARR_SIZE * MAX_BLE_QUEUE);
+ if(ret != 0)
+ printf("queue_init has failed\r\n");
+}
+
+int BLE_Icarus_TransferData(uint8_t data_transfer[20]){
+ int ret;
+ ret = BLE::Instance(BLE::DEFAULT_INSTANCE).gattServer().write(notifyChar.getValueHandle(), data_transfer, 20);
+ return ret;
+}
+
+int BLE_Icarus_TransferDataFromQueue(){
+ int ret;
+ uint8_t data_transfer[20];
+ unsigned char i;
+
+ if (BLEQUEUE.num_item >= 1) {
+#if defined(USE_BLE_TICKER_TO_CHECK_TRANSFER)
+ if(!Ble_Can_Transfer_Check())
+ return 0;
+#endif
+ for(i = 0; i < BLE_CONN_INT_PACKET; ++i){
+ ret = dequeue(&BLEQUEUE, data_transfer);
+ if(ret < 0)
+ break;
+ pr_debug("dequeued data for tx, %d remain\r\n", BLEQUEUE.num_item);
+ BLE::Instance(BLE::DEFAULT_INSTANCE).gattServer().write(notifyChar.getValueHandle(), data_transfer, 20);
+ }
+#if defined(USE_BLE_TICKER_TO_CHECK_TRANSFER)
+ TICKER_BLE.attach(&Ble_Can_Transfer_Toggle, BLE_TICKER_PERIOD);
+ Ble_Can_Transfer_Set(false);
+#endif
+ }
+
+ return 0;
+}
+
+
+//TODO: check that function for memory safety (no overflow should occur)
+int BLE_Icarus_AddtoQueue(uint8_t *data_transfer, int32_t buf_size, int32_t data_size) {
+ int ret = 0;
+ //printf("size is: %d\r\n", size);
+ // TODO: Append a known character to the byte array in case size is
+ // less than 20 bytes
+ while ((data_size % BLE_NOTIFY_CHAR_ARR_SIZE) && data_size < buf_size)
+ data_transfer[data_size++] = 0;
+ mxm_assert_msg(!(data_size % 20), "BLE packet size must be multiple of 20 bytes");
+
+ while(data_size > 0){
+ ret = enqueue(&BLEQUEUE, data_transfer);
+ data_size -= BLE_NOTIFY_CHAR_ARR_SIZE;
+ data_transfer += BLE_NOTIFY_CHAR_ARR_SIZE;
+ }
+
+ if(ret != 0)
+ printf("BLE_Icarus_AddtoQueue has failed\r\n");
+
+ return ret;
+}
+
+
+int BLE_Icarus_SetDSInterface(DSInterface *comm_obj) {
+ BLE_DS_INTERFACE = comm_obj;
+ return 0;
+}
+
+bool BLE_Icarus_Interface_Exists()
+{
+ return (bleState == BLE_CONNECTED);
+}
+
+int BLE_ICARUS_Get_Mac_Address(char MacAdress[6]){
+ /* Print out device MAC address to the console*/
+ Gap::AddressType_t addr_type;
+ Gap::Address_t address;
+ if(BLE::Instance().gap().getAddress(&addr_type, address) != 0)
+ return -1;
+ for (int i = 5; i >= 0; i--){
+ MacAdress[5-i] = address[i];
+ }
+ pr_info("BLE_ADV_NAME:%s", DEVICE_NAME);
+ return 0;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BLE_ICARUS/BLE_ICARUS.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,66 @@
+#ifndef _BLE_ICARUS_H_
+#define _BLE_ICARUS_H_
+
+
+#include "mbed.h"
+#include "ble/BLE.h"
+#include "DSInterface.h"
+
+
+
+
+
+
+
+enum BLE_State {
+ BLE_DOWN,
+ BLE_STARTING,
+ BLE_ADVERTISING,
+ BLE_CONNECTED,
+ BLE_DISCONNECTED,
+};
+
+extern volatile BLE_State bleState;
+
+/**
+ * Callback triggered when the ble initialization process has finished
+ */
+void bleInitComplete(BLE::InitializationCompleteCallbackContext *params);
+
+int BLE_Icarus_TransferData(uint8_t data_transfer[20]);
+
+int BLE_Icarus_AddtoQueue(uint8_t *data_transfer, int32_t buf_size, int32_t data_size);
+
+int BLE_Icarus_SetDSInterface(DSInterface *comm_obj);
+
+int BLE_Icarus_TransferDataFromQueue();
+
+bool BLE_Icarus_Interface_Exists();
+
+int BLE_ICARUS_Get_Mac_Address(char MacAdress[6]);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BMI160/bmi160.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,724 @@
+/**********************************************************************
+* 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;
+
+ if (m_use_irq == true && bmi160_irq_asserted == false)
+ return -1;
+
+ rtnVal = readBlock(DATA_14, DATA_19, localData);
+ 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;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BMI160/bmi160.h Wed Apr 10 14:56:25 2019 +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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BMI160/bmi160_i2c.cpp Wed Apr 10 14:56:25 2019 +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));
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BMI160/bmi160_spi.cpp Wed Apr 10 14:56:25 2019 +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;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/Arial10x10.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,104 @@
+//GLCD FontName : Arial
+//GLCD FontSize : 10 x 10
+
+const unsigned char Arial10x10[] = {
+ 21,10,10,2,
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
+ 0x01, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char !
+ 0x03, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char "
+ 0x05, 0xE4, 0x00, 0x3C, 0x00, 0xE7, 0x00, 0x3C, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char #
+ 0x05, 0x46, 0x00, 0x89, 0x00, 0xFF, 0x01, 0x89, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char $
+ 0x09, 0x06, 0x00, 0x09, 0x00, 0x89, 0x00, 0x66, 0x00, 0x18, 0x00, 0x66, 0x00, 0x91, 0x00, 0x90, 0x00, 0x60, 0x00, 0x00, 0x00, // Code for char %
+ 0x06, 0x60, 0x00, 0x96, 0x00, 0x89, 0x00, 0x99, 0x00, 0x66, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char &
+ 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char '
+ 0x03, 0xFC, 0x00, 0x02, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char (
+ 0x03, 0x01, 0x02, 0x02, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char )
+ 0x03, 0x0A, 0x00, 0x07, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char *
+ 0x05, 0x10, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char +
+ 0x02, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ,
+ 0x03, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char -
+ 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char .
+ 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char /
+ 0x05, 0x7E, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 0
+ 0x03, 0x04, 0x00, 0x02, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 1
+ 0x05, 0x82, 0x00, 0xC1, 0x00, 0xA1, 0x00, 0x91, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 2
+ 0x05, 0x42, 0x00, 0x81, 0x00, 0x89, 0x00, 0x89, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 3
+ 0x05, 0x30, 0x00, 0x2C, 0x00, 0x22, 0x00, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 4
+ 0x05, 0x4C, 0x00, 0x8B, 0x00, 0x89, 0x00, 0x89, 0x00, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 5
+ 0x05, 0x7E, 0x00, 0x89, 0x00, 0x89, 0x00, 0x89, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 6
+ 0x05, 0x01, 0x00, 0xE1, 0x00, 0x19, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 7
+ 0x05, 0x76, 0x00, 0x89, 0x00, 0x89, 0x00, 0x89, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 8
+ 0x05, 0x4E, 0x00, 0x91, 0x00, 0x91, 0x00, 0x91, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 9
+ 0x01, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char :
+ 0x01, 0x84, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ;
+ 0x05, 0x10, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char <
+ 0x05, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char =
+ 0x05, 0x44, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char >
+ 0x05, 0x02, 0x00, 0x01, 0x00, 0xB1, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ?
+ 0x0A, 0xF8, 0x00, 0x06, 0x01, 0x72, 0x02, 0x89, 0x02, 0x85, 0x02, 0x45, 0x02, 0xF9, 0x02, 0x8D, 0x02, 0x42, 0x02, 0x3C, 0x01, // Code for char @
+ 0x07, 0xC0, 0x00, 0x30, 0x00, 0x2E, 0x00, 0x21, 0x00, 0x2E, 0x00, 0x30, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char A
+ 0x06, 0xFF, 0x00, 0x89, 0x00, 0x89, 0x00, 0x89, 0x00, 0x89, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char B
+ 0x06, 0x3C, 0x00, 0x42, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char C
+ 0x06, 0xFF, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char D
+ 0x05, 0xFF, 0x00, 0x89, 0x00, 0x89, 0x00, 0x89, 0x00, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char E
+ 0x05, 0xFF, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char F
+ 0x07, 0x3C, 0x00, 0x42, 0x00, 0x81, 0x00, 0x81, 0x00, 0x91, 0x00, 0x52, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char G
+ 0x06, 0xFF, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char H
+ 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char I
+ 0x04, 0x60, 0x00, 0x80, 0x00, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char J
+ 0x06, 0xFF, 0x00, 0x10, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x62, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char K
+ 0x05, 0xFF, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char L
+ 0x07, 0xFF, 0x00, 0x06, 0x00, 0x38, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x06, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char M
+ 0x06, 0xFF, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x40, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char N
+ 0x07, 0x3C, 0x00, 0x42, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char O
+ 0x05, 0xFF, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char P
+ 0x07, 0x3C, 0x00, 0x42, 0x00, 0x81, 0x00, 0xA1, 0x00, 0xA1, 0x00, 0x42, 0x00, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Q
+ 0x06, 0xFF, 0x00, 0x09, 0x00, 0x09, 0x00, 0x19, 0x00, 0x69, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char R
+ 0x06, 0x46, 0x00, 0x89, 0x00, 0x89, 0x00, 0x91, 0x00, 0x91, 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char S
+ 0x05, 0x01, 0x00, 0x01, 0x00, 0xFF, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char T
+ 0x06, 0x7F, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char U
+ 0x07, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char V
+ 0x0A, 0x3C, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x30, 0x00, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0x00, // Code for char W
+ 0x06, 0x81, 0x00, 0x66, 0x00, 0x18, 0x00, 0x18, 0x00, 0x66, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char X
+ 0x07, 0x01, 0x00, 0x06, 0x00, 0x08, 0x00, 0xF0, 0x00, 0x08, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Y
+ 0x06, 0x80, 0x00, 0xC1, 0x00, 0xB1, 0x00, 0x8D, 0x00, 0x83, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Z
+ 0x02, 0xFF, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char [
+ 0x03, 0x03, 0x00, 0x3C, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char BackSlash
+ 0x02, 0x01, 0x02, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ]
+ 0x05, 0x08, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ^
+ 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char _
+ 0x02, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char `
+ 0x05, 0x68, 0x00, 0x94, 0x00, 0x94, 0x00, 0x54, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char a
+ 0x05, 0xFF, 0x00, 0x48, 0x00, 0x84, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char b
+ 0x05, 0x78, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char c
+ 0x05, 0x78, 0x00, 0x84, 0x00, 0x84, 0x00, 0x48, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char d
+ 0x05, 0x78, 0x00, 0x94, 0x00, 0x94, 0x00, 0x94, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char e
+ 0x03, 0x04, 0x00, 0xFE, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char f
+ 0x05, 0x78, 0x02, 0x84, 0x02, 0x84, 0x02, 0x48, 0x02, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char g
+ 0x05, 0xFF, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char h
+ 0x01, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char i
+ 0x01, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char j
+ 0x04, 0xFF, 0x00, 0x10, 0x00, 0x68, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char k
+ 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char l
+ 0x07, 0xFC, 0x00, 0x08, 0x00, 0x04, 0x00, 0xFC, 0x00, 0x04, 0x00, 0x04, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char m
+ 0x05, 0xFC, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char n
+ 0x05, 0x78, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char o
+ 0x05, 0xFC, 0x03, 0x48, 0x00, 0x84, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char p
+ 0x05, 0x78, 0x00, 0x84, 0x00, 0x84, 0x00, 0x48, 0x00, 0xFC, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char q
+ 0x03, 0xFC, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char r
+ 0x05, 0x48, 0x00, 0x94, 0x00, 0x94, 0x00, 0xA4, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char s
+ 0x02, 0xFF, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char t
+ 0x05, 0x7C, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char u
+ 0x05, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char v
+ 0x09, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x04, 0x00, 0x38, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x00, // Code for char w
+ 0x05, 0x84, 0x00, 0x48, 0x00, 0x30, 0x00, 0x48, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char x
+ 0x05, 0x0C, 0x00, 0x30, 0x02, 0xC0, 0x01, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char y
+ 0x05, 0x84, 0x00, 0xC4, 0x00, 0xB4, 0x00, 0x8C, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char z
+ 0x03, 0x10, 0x00, 0xEE, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char {
+ 0x01, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char |
+ 0x04, 0x00, 0x00, 0x01, 0x02, 0xEE, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char }
+ 0x05, 0x18, 0x00, 0x08, 0x00, 0x18, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ~
+ 0x03, 0xFF, 0x00, 0x81, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Code for char
+ };
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/Arial28x28.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,489 @@
+//GLCD FontName : @Arial_Unicode_MS28x28
+//GLCD FontSize : 28 x 28
+
+/** Arial Font italic with 27*28 pixel matrix for use with SPI_TFT lib
+*/
+const unsigned char Arial28x28[] = {
+113,28,28,4,
+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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x3F, 0x38, 0x00, 0xFE, 0x7F, 0x38, 0x00, 0xFE, 0x3F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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, 0x7E, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00,
+0x00, 0xFE, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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 "
+
+0x0F, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x38, 0x00, 0x80, 0xC1, 0x3F, 0x00, 0x80, 0xFF, 0x07, 0x00, 0xF8, 0xFF, 0x00, 0x00, 0xFE, 0xC1, 0x00, 0x00, 0x8E, 0xC1, 0x00,
+0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x38, 0x00, 0x80, 0xC1, 0x3F, 0x00, 0x80, 0xFF, 0x07, 0x00, 0xF8, 0xFF, 0x00, 0x00, 0xFE, 0xC1, 0x00, 0x00, 0x8E, 0xC1, 0x00, 0x00,
+0x80, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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 #
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x81, 0x03, 0x00, 0xF8, 0x83, 0x0F, 0x00, 0xFC, 0x87, 0x1F, 0x00, 0x0C, 0x07, 0x1E, 0x00, 0x06, 0x0E, 0x38, 0x00, 0x06, 0x0E, 0x30,
+0x00, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x01, 0x06, 0x1C, 0x30, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x1C, 0x38, 0x1C, 0x00, 0x7C, 0xF8, 0x1F, 0x00, 0x78, 0xF0, 0x0F, 0x00,
+0x60, 0xC0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char $
+
+0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x06, 0x0C, 0x40,
+0x00, 0x06, 0x0C, 0x70, 0x00, 0x0E, 0x06, 0x3C, 0x00, 0xFC, 0x07, 0x0F, 0x00, 0xF0, 0x81, 0x03, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00,
+0x80, 0x07, 0x00, 0x00, 0xC0, 0x81, 0x0F, 0x00, 0xF0, 0xE0, 0x3F, 0x00, 0x3C, 0x70, 0x70, 0x00, 0x0E, 0x30, 0x60, 0x00, 0x02, 0x30, 0x60, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00,
+0x70, 0x70, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char %
+
+0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x70, 0xF8, 0x1F, 0x00, 0xFC, 0x39, 0x1C, 0x00, 0xFC, 0x0F, 0x38, 0x00, 0x0E, 0x0F, 0x30,
+0x00, 0x06, 0x0E, 0x30, 0x00, 0x06, 0x1E, 0x30, 0x00, 0x0E, 0x3B, 0x38, 0x00, 0xFE, 0x73, 0x18, 0x00, 0xFC, 0xE1, 0x1C, 0x00, 0x78, 0xC0, 0x0F, 0x00, 0x00, 0xC0, 0x07, 0x00,
+0x00, 0xF0, 0x07, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x38, 0x00, 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, 0x00, 0x00, // Code for char &
+
+0x04, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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 '
+
+0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00,
+0x80, 0xFF, 0x1F, 0x00, 0xE0, 0x03, 0x7C, 0x00, 0x78, 0x00, 0xE0, 0x01, 0x1C, 0x00, 0x80, 0x03, 0x0E, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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, 0x1C, 0x00, 0x80, 0x03, 0x78, 0x00, 0xE0, 0x01, 0xE0, 0x03, 0x7C, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x00, 0xFC, 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, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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 )
+
+0x0A, 0x10, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0xB0, 0x03, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00,
+0x00, 0xB0, 0x03, 0x00, 0x00, 0x18, 0x01, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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 *
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00,
+0x00, 0xE0, 0xFF, 0x07, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, 0x38, 0x03, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x00,
+0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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, 0x30, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0xFC, 0x01, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x3E, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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 /
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x01, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x38,
+0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0xF0, 0xFF, 0x07, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
+0x00, 0xFC, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x30, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x3F, 0x00, 0x0E, 0x80, 0x3B, 0x00, 0x0E, 0xC0, 0x39,
+0x00, 0x0E, 0xE0, 0x38, 0x00, 0x0E, 0x70, 0x38, 0x00, 0x0E, 0x3C, 0x38, 0x00, 0x1E, 0x1E, 0x38, 0x00, 0xFC, 0x0F, 0x38, 0x00, 0xF8, 0x03, 0x38, 0x00, 0xF0, 0x01, 0x38, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x3C, 0x00, 0x0E, 0x1C, 0x38,
+0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x1E, 0x1E, 0x3C, 0x00, 0xFC, 0x3F, 0x1C, 0x00, 0xF8, 0xF3, 0x1F, 0x00, 0xF0, 0xF1, 0x0F, 0x00, 0x00, 0xC0, 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, 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
+
+0x0F, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0xCE, 0x01, 0x00, 0x00, 0xC7, 0x01, 0x00, 0xC0, 0xC3, 0x01, 0x00, 0xE0, 0xC0, 0x01,
+0x00, 0x70, 0xC0, 0x01, 0x00, 0x1C, 0xC0, 0x01, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0xC0, 0x01, 0x00,
+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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 4
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, 0xF0, 0x1F, 0x0F, 0x00, 0xFE, 0x1F, 0x1F, 0x00, 0xFE, 0x0E, 0x1E, 0x00, 0x0E, 0x06, 0x38, 0x00, 0x0E, 0x07, 0x38,
+0x00, 0x0E, 0x07, 0x38, 0x00, 0x0E, 0x07, 0x38, 0x00, 0x0E, 0x0F, 0x3C, 0x00, 0x0E, 0x1E, 0x1E, 0x00, 0x0E, 0xFE, 0x1F, 0x00, 0x0E, 0xFC, 0x07, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x01, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0x7C, 0x38, 0x1E, 0x00, 0x1C, 0x1C, 0x3C, 0x00, 0x0E, 0x0E, 0x38,
+0x00, 0x0E, 0x0E, 0x38, 0x00, 0x0E, 0x0E, 0x38, 0x00, 0x0E, 0x1E, 0x3C, 0x00, 0x1E, 0x3E, 0x1E, 0x00, 0x3C, 0xFC, 0x1F, 0x00, 0x38, 0xF8, 0x0F, 0x00, 0x30, 0xE0, 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, 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
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x3C, 0x00, 0x0E, 0xC0, 0x3F, 0x00, 0x0E, 0xF8, 0x3F,
+0x00, 0x0E, 0xFE, 0x03, 0x00, 0x8E, 0x3F, 0x00, 0x00, 0xCE, 0x07, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0xF0, 0xE1, 0x0F, 0x00, 0xF8, 0xF7, 0x1F, 0x00, 0xFC, 0x37, 0x1C, 0x00, 0x1E, 0x1E, 0x3C, 0x00, 0x0E, 0x1C, 0x38,
+0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x1E, 0x3E, 0x38, 0x00, 0xFC, 0x37, 0x1C, 0x00, 0xF8, 0xF7, 0x1F, 0x00, 0xF0, 0xE1, 0x0F, 0x00, 0x00, 0xC0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x06, 0x00, 0xF8, 0x0F, 0x0E, 0x00, 0xFC, 0x1F, 0x1E, 0x00, 0x3C, 0x3E, 0x3C, 0x00, 0x1E, 0x3C, 0x38, 0x00, 0x0E, 0x38, 0x38,
+0x00, 0x0E, 0x38, 0x38, 0x00, 0x0E, 0x38, 0x38, 0x00, 0x1E, 0x1C, 0x1C, 0x00, 0x3C, 0x0E, 0x1F, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0xC0, 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,
+0x00, 0x00, 0x00, 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
+
+0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x38, 0x00, 0x80, 0x03, 0x38, 0x00, 0x80, 0x03, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x38, 0x02, 0x80, 0x03, 0x38, 0x03, 0x80, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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 ;
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x63, 0x00,
+0x00, 0x00, 0x63, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 0xC0, 0x80, 0x01, 0x00, 0xC0, 0x80, 0x01, 0x00, 0x60, 0x00, 0x03, 0x00, 0x60, 0x00, 0x03, 0x00,
+0x30, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char <
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x00,
+0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00,
+0x80, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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 =
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x60, 0x80, 0x01, 0x00, 0x60, 0x80, 0x01, 0x00, 0xC0, 0x80, 0x01, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x80, 0xC1, 0x00,
+0x00, 0x80, 0x61, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 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, 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 >
+
+0x0E, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x06, 0xC0, 0x39,
+0x00, 0x06, 0xF0, 0x39, 0x00, 0x06, 0x78, 0x38, 0x00, 0x0E, 0x3C, 0x00, 0x00, 0x1C, 0x0E, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xF0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ?
+
+0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x80, 0x07, 0x78, 0x00, 0xE0, 0x01, 0xE0, 0x00, 0x70, 0x00, 0xC0,
+0x01, 0x38, 0xE0, 0x87, 0x03, 0x18, 0xF8, 0x0F, 0x07, 0x1C, 0xFE, 0x1F, 0x06, 0x0C, 0x1F, 0x3C, 0x06, 0x0E, 0x07, 0x30, 0x0E, 0x86, 0x03, 0x30, 0x0C, 0x86, 0x01, 0x30, 0x0C,
+0x86, 0x01, 0x18, 0x0C, 0x86, 0x01, 0x0C, 0x0C, 0x06, 0x03, 0x1F, 0x0C, 0x06, 0xFF, 0x3F, 0x0C, 0x86, 0xFF, 0x3F, 0x0C, 0x8C, 0xFF, 0x31, 0x0C, 0x8C, 0x07, 0x30, 0x04, 0x1C,
+0x00, 0x18, 0x06, 0x38, 0x00, 0x18, 0x06, 0x70, 0x00, 0x0E, 0x03, 0xE0, 0x81, 0x07, 0x03, 0xC0, 0xFF, 0x81, 0x01, 0x00, 0x7E, 0xC0, 0x00, 0x00, 0x00, 0x40, 0x00, // Code for char @
+
+0x13, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xE0, 0xFF, 0x00,
+0x00, 0xF8, 0xE3, 0x00, 0x00, 0x7E, 0xE0, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x7E, 0xE0, 0x00, 0x00, 0xF8, 0xE3, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
+0x00, 0xFC, 0x03, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38,
+0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x1E, 0x1E, 0x38, 0x00, 0xFC, 0x3F, 0x1C, 0x00,
+0xF8, 0xF3, 0x1F, 0x00, 0xF0, 0xE1, 0x0F, 0x00, 0x00, 0xC0, 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, 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
+
+0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0xF8, 0x80, 0x0F, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x1C,
+0x00, 0x1E, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x3C, 0x00,
+0x1C, 0x00, 0x1E, 0x00, 0x7C, 0x00, 0x0F, 0x00, 0xF8, 0xC0, 0x0F, 0x00, 0xF0, 0xC0, 0x03, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38,
+0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x1C, 0x00,
+0x3C, 0x00, 0x1E, 0x00, 0xF8, 0x80, 0x0F, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0xE0, 0xFF, 0x03, 0x00, 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, 0x00, // Code for char D
+
+0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38,
+0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00,
+0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00,
+0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00,
+0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0xF8, 0x80, 0x0F, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x1E,
+0x00, 0x1C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x38, 0x38, 0x00, 0x0E, 0x38, 0x38, 0x00,
+0x0E, 0x38, 0x38, 0x00, 0x1E, 0x38, 0x3C, 0x00, 0x1C, 0x38, 0x1C, 0x00, 0x7C, 0x38, 0x1C, 0x00, 0xF8, 0xF8, 0x0F, 0x00, 0xF0, 0xF8, 0x0F, 0x00, 0x40, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char G
+
+0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00,
+0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00,
+0x00, 0x1C, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38,
+0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xFE, 0xFF, 0x1F, 0x00, 0xFE, 0xFF, 0x0F, 0x00, 0xFE, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x1C, 0x00,
+0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0xC0, 0x79, 0x00, 0x00, 0xE0, 0xF0, 0x00, 0x00, 0x70, 0xC0, 0x01, 0x00, 0x38, 0x80, 0x07, 0x00,
+0x1C, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x06, 0x00, 0x38, 0x00, 0x02, 0x00, 0x30, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38,
+0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00,
+0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x00,
+0x00, 0xF0, 0x3F, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0xF8, 0x3F, 0x00,
+0x00, 0xFF, 0x03, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00,
+0x00, 0x00, 0x00, 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 M
+
+0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00,
+0x00, 0xE0, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00,
+0x00, 0x00, 0x1E, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0xF8, 0x80, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x1C, 0x00, 0x1C,
+0x00, 0x1C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00,
+0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0xF8, 0x80, 0x0F, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0xC0, 0xFF, 0x01, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char O
+
+0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00,
+0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1E, 0x00, 0x00, 0x1E, 0x0E, 0x00, 0x00,
+0xFC, 0x0F, 0x00, 0x00, 0xF8, 0x07, 0x00, 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, 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 P
+
+0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0xF8, 0x80, 0x0F, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x1C,
+0x00, 0x1C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x3A, 0x00, 0x0E, 0x00, 0x3B, 0x00, 0x0E, 0x00, 0x3E, 0x00,
+0x1C, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0xF8, 0x80, 0x3F, 0x00, 0xF0, 0xFF, 0x77, 0x00, 0xC0, 0xFF, 0x71, 0x00, 0x00, 0x7F, 0x20, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00,
+0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0E, 0x3C, 0x00, 0x00, 0x0E, 0x7C, 0x00, 0x00, 0x0E, 0xFC, 0x00, 0x00,
+0x1E, 0xDE, 0x01, 0x00, 0x1E, 0xCE, 0x03, 0x00, 0xFC, 0x8F, 0x0F, 0x00, 0xF8, 0x07, 0x1E, 0x00, 0xF0, 0x03, 0x3C, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0xF0, 0x81, 0x07, 0x00, 0xF8, 0x83, 0x0F, 0x00, 0xFC, 0x07, 0x1E, 0x00, 0x1C, 0x07, 0x1C, 0x00, 0x0E, 0x0E, 0x3C,
+0x00, 0x0E, 0x0E, 0x38, 0x00, 0x0E, 0x0E, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x0E, 0x1C, 0x38, 0x00, 0x1E, 0x1C, 0x38, 0x00, 0x1C, 0x38, 0x3C, 0x00, 0x7C, 0x78, 0x1C, 0x00,
+0x78, 0xF8, 0x1F, 0x00, 0x60, 0xF0, 0x0F, 0x00, 0x00, 0xC0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char S
+
+0x11, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00,
+0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00,
+0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0xFE, 0xFF, 0x07, 0x00, 0xFE, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3C,
+0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x1C, 0x00,
+0x00, 0x00, 0x1E, 0x00, 0xFE, 0xFF, 0x0F, 0x00, 0xFE, 0xFF, 0x07, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char U
+
+0x13, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0xF8, 0x0F,
+0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0xFF, 0x01, 0x00,
+0xE0, 0x3F, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x1B, 0x0E, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0x38,
+0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x80, 0xFF, 0x07, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00,
+0xFE, 0x01, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00,
+0xF8, 0x3F, 0x00, 0x80, 0xFF, 0x07, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char W
+
+0x13, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x30, 0x00, 0x06, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x78, 0xC0, 0x07, 0x00, 0xF0, 0xE1, 0x01,
+0x00, 0xC0, 0xFB, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0xC0, 0xFB, 0x00, 0x00, 0xF0, 0xE1, 0x01, 0x00, 0x78, 0xC0, 0x07, 0x00,
+0x3C, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x06, 0x00, 0x3C, 0x00, 0x02, 0x00, 0x30, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x13, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xC0, 0x07, 0x00,
+0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00,
+0xF0, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x3E, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x0E, 0x80, 0x3B, 0x00, 0x0E, 0xC0, 0x39, 0x00, 0x0E, 0xF0, 0x38,
+0x00, 0x0E, 0x78, 0x38, 0x00, 0x0E, 0x3C, 0x38, 0x00, 0x0E, 0x1E, 0x38, 0x00, 0x0E, 0x07, 0x38, 0x00, 0x8E, 0x03, 0x38, 0x00, 0xCE, 0x01, 0x38, 0x00, 0xEE, 0x00, 0x38, 0x00,
+0x7E, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x07, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x0F, 0xFE, 0xFF, 0xFF, 0x0F, 0xFE, 0xFF, 0xFF, 0x0F, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x00,
+0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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, 0x06, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x3E,
+0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x06, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0xFE, 0xFF, 0xFF, 0x0F, 0xFE, 0xFF, 0xFF, 0x0F, 0xFE, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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 ]
+
+0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00,
+0x00, 0x0E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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 ^
+
+0x18, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
+0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C,
+0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00,
+0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char _
+
+0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1E, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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 `
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0F, 0x00, 0x00, 0x8E, 0x1F, 0x00, 0x00, 0x8F, 0x3F, 0x00, 0x00, 0xC3, 0x39, 0x00, 0x80, 0xC1, 0x30, 0x00, 0x80, 0xC1, 0x30,
+0x00, 0x80, 0xC1, 0x30, 0x00, 0x80, 0xC1, 0x10, 0x00, 0x80, 0x61, 0x18, 0x00, 0x80, 0x63, 0x0C, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0xFE, 0x3F, 0x00,
+0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0E, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x07, 0x0C, 0x00, 0x00, 0x03, 0x18, 0x00, 0x80, 0x01, 0x30,
+0x00, 0x80, 0x01, 0x30, 0x00, 0x80, 0x01, 0x30, 0x00, 0x80, 0x03, 0x38, 0x00, 0x00, 0x07, 0x1C, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0xF8, 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, 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
+
+0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x07, 0x1C, 0x00, 0x80, 0x03, 0x38, 0x00, 0x80, 0x01, 0x30,
+0x00, 0x80, 0x01, 0x30, 0x00, 0x80, 0x01, 0x30, 0x00, 0x80, 0x03, 0x38, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x0C, 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, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x07, 0x1C, 0x00, 0x80, 0x03, 0x38, 0x00, 0x80, 0x01, 0x30,
+0x00, 0x80, 0x01, 0x30, 0x00, 0x80, 0x01, 0x30, 0x00, 0x00, 0x03, 0x18, 0x00, 0x00, 0x07, 0x0C, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x67, 0x1C, 0x00, 0x80, 0x63, 0x38, 0x00, 0x80, 0x61, 0x30,
+0x00, 0x80, 0x61, 0x30, 0x00, 0x80, 0x61, 0x30, 0x00, 0x80, 0x63, 0x38, 0x00, 0x00, 0x67, 0x3C, 0x00, 0x00, 0x7F, 0x1E, 0x00, 0x00, 0x7E, 0x0E, 0x00, 0x00, 0x78, 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, 0x00, 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
+
+0x09, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xF8, 0xFF, 0x3F, 0x00, 0xFC, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x86, 0x01, 0x00, 0x00, 0x86, 0x01, 0x00,
+0x00, 0x86, 0x01, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x83, 0x01, 0x00, 0xFE, 0x8F, 0x07, 0x00, 0xFF, 0x9F, 0x07, 0x00, 0x07, 0x1C, 0x0E, 0x80, 0x03, 0x38, 0x0C, 0x80, 0x01, 0x30,
+0x0C, 0x80, 0x01, 0x30, 0x0C, 0x80, 0x01, 0x30, 0x0C, 0x00, 0x03, 0x18, 0x0E, 0x00, 0x06, 0x1C, 0x07, 0x80, 0xFF, 0xFF, 0x07, 0x80, 0xFF, 0xFF, 0x03, 0x80, 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, 0x00, 0x00, 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
+
+0x0E, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x01, 0x00,
+0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0xFE, 0x3F, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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, 0x8E, 0xFF, 0x3F, 0x00, 0x8E, 0xFF, 0x3F, 0x00, 0x8E, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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, 0x00, 0x0C, 0x8E, 0xFF, 0xFF, 0x0F, 0x8E, 0xFF, 0xFF, 0x07, 0x8E, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x78, 0x00,
+0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xCE, 0x03, 0x00, 0x00, 0x8F, 0x07, 0x00, 0x00, 0x07, 0x0F, 0x00, 0x80, 0x03, 0x1E, 0x00, 0x80, 0x01, 0x38, 0x00, 0x80, 0x00, 0x30, 0x00,
+0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x04, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x16, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x01, 0x00,
+0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x06, 0x00, 0x00,
+0x00, 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00,
+0xFE, 0x3F, 0x00, 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 m
+
+0x0E, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x01, 0x00,
+0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0xFE, 0x3F, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x07, 0x1C, 0x00, 0x80, 0x03, 0x38, 0x00, 0x80, 0x01, 0x30,
+0x00, 0x80, 0x01, 0x30, 0x00, 0x80, 0x01, 0x30, 0x00, 0x80, 0x03, 0x38, 0x00, 0x00, 0x07, 0x1C, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0xF8, 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, 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
+
+0x0E, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x80, 0xFF, 0xFF, 0x0F, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x03, 0x18, 0x00, 0x80, 0x01, 0x30,
+0x00, 0x80, 0x01, 0x30, 0x00, 0x80, 0x01, 0x30, 0x00, 0x80, 0x03, 0x38, 0x00, 0x00, 0x07, 0x1C, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0xF8, 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, 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
+
+0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x07, 0x1C, 0x00, 0x80, 0x03, 0x38, 0x00, 0x80, 0x01, 0x30,
+0x00, 0x80, 0x01, 0x30, 0x00, 0x80, 0x01, 0x30, 0x00, 0x00, 0x03, 0x18, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x80, 0xFF, 0xFF, 0x0F, 0x80, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char q
+
+0x0A, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x01, 0x00,
+0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x06, 0x00, 0x00, 0x3F, 0x1E, 0x00, 0x00, 0x7F, 0x1E, 0x00, 0x80, 0x73, 0x38, 0x00, 0x80, 0xF1, 0x30, 0x00, 0x80, 0xE1, 0x30,
+0x00, 0x80, 0xE1, 0x31, 0x00, 0x80, 0xC3, 0x31, 0x00, 0x00, 0xCF, 0x39, 0x00, 0x00, 0xCF, 0x1F, 0x00, 0x00, 0x8C, 0x1F, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0xF8, 0xFF, 0x3F, 0x00, 0xFC, 0xFF, 0x3F, 0x00, 0x80, 0x01, 0x30, 0x00, 0x80, 0x01, 0x30,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0E, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30,
+0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x80, 0xFF, 0x3F, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0F, 0x80, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x3F,
+0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00,
+0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x14, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x38,
+0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0xC0, 0x3F, 0x00,
+0x00, 0x00, 0x38, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x80, 0x3F, 0x00, 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, // Code for char w
+
+0x0E, 0x80, 0x00, 0x20, 0x00, 0x80, 0x01, 0x30, 0x00, 0x80, 0x03, 0x38, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x1E, 0x0F, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0xF0, 0x01,
+0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x1E, 0x0F, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x80, 0x03, 0x38, 0x00, 0x80, 0x01, 0x30, 0x00, 0x80, 0x00, 0x20, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0F, 0x80, 0x01, 0x00, 0x00, 0x80, 0x07, 0x00, 0x0C, 0x80, 0x1F, 0x00, 0x0C, 0x00, 0xFE, 0x00, 0x0C, 0x00, 0xF8, 0x03, 0x0E, 0x00, 0xE0, 0x8F, 0x07, 0x00, 0x80, 0xFF,
+0x03, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00,
+0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x80, 0x01, 0x3C, 0x00, 0x80, 0x01, 0x3E, 0x00, 0x80, 0x01, 0x3F, 0x00, 0x80, 0x81, 0x33, 0x00, 0x80, 0xC1, 0x31,
+0x00, 0x80, 0xE1, 0x30, 0x00, 0x80, 0x79, 0x30, 0x00, 0x80, 0x3D, 0x30, 0x00, 0x80, 0x1F, 0x30, 0x00, 0x80, 0x07, 0x30, 0x00, 0x80, 0x03, 0x30, 0x00, 0x80, 0x01, 0x30, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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
+
+0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
+0x00, 0xF8, 0x00, 0x00, 0xF0, 0x9F, 0xFF, 0x00, 0xF8, 0x07, 0xFE, 0x01, 0x0C, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x06, 0x02, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char {
+
+0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x0F, 0xFE, 0xFF, 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,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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, 0x0C, 0x00, 0x00, 0x03, 0xF8, 0x0F, 0xFE, 0x01, 0xF0, 0x9F, 0xFF, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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 }
+
+0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00,
+0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 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, 0x00,
+0x00, 0x00, 0x00, 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 ~
+
+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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 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 };
+
+};
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/BufferedDisplay.cpp Wed Apr 10 14:56:25 2019 +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 "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;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/BufferedDisplay.h Wed Apr 10 14:56:25 2019 +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 "GraphicsDisplay.h"
+#include "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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/GraphicsDisplay.cpp Wed Apr 10 14:56:25 2019 +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 "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;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/GraphicsDisplay.h Wed Apr 10 14:56:25 2019 +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 "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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Drivers/LS013B7DH03/LCDSettings.h Wed Apr 10 14:56:25 2019 +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
Binary file Drivers/LS013B7DH03/LS013B7DH03.ZIP has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/LS013B7DH03.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,254 @@
+/***************************************************************************//**
+ * @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 <mbed.h>
+#include "LS013B7DH03.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] = 0x00FFF000;
+ }
+ memset((void*)_dirtyRows, 0xFF, sizeof(_dirtyRows));
+
+ return LS013B7DH03_OK;
+}
+
+/**
+ * Function to get internal refresh counter
+ */
+int LS013B7DH03::executeOnceLCD() {
+ if(interrupt_received)
+ _cbHandler(0);
+}
+
+/**
+ * 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 ) {
+ interrupt_received = true;
+ //this->_cbHandler(0);
+}
+
+void LS013B7DH03::_cbHandler( int event ) {
+ interrupt_received = false;
+ 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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/LS013B7DH03.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,133 @@
+/***************************************************************************//**
+ * @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 "LCDSettings.h"
+#include "BufferedDisplay.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();
+
+ /**
+ * Function to get internal refresh counter
+ */
+ int executeOnceLCD();
+
+
+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();
+
+ /**
+ *
+ */
+ bool interrupt_received;
+};
+
+} // namespace silabs
+
+#endif //SILABS_LS013B7DH03_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/Neu44x36.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,103 @@
+//GLCD FontName : Neuropolitical_Rg44x36
+//GLCD FontSize : 44 x 36
+
+const unsigned char Neu44x36[] = {
+ 221,44,36,5,
+ 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x3F, 0x1F, 0x00, 0xC0, 0xFF, 0x3F, 0x1F, 0x00, 0xC0, 0xFF, 0x3F, 0x1F, 0x00, 0xC0, 0xFF, 0x3F, 0x1F, 0x00, 0xC0, 0xFF, 0x3F, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0xE0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 "
+ 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x00, 0x70, 0xE0, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0xFF, 0xE0, 0x00, 0x00, 0xC0, 0x71, 0xE0, 0x00, 0x00, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x00, 0x70, 0xE0, 0x1F, 0x00, 0x00, 0x70, 0xFE, 0x1F, 0x00, 0x00, 0xFE, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x03, 0x00, 0xC0, 0xFF, 0xE3, 0x00, 0x00, 0xC0, 0x77, 0xE0, 0x00, 0x00, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x00, 0x70, 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 #
+ 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x1E, 0x00, 0x80, 0xFF, 0x07, 0x1E, 0x00, 0x80, 0xFF, 0x0F, 0x1E, 0x00, 0xC0, 0xFF, 0x0F, 0x1E, 0x00, 0xC0, 0x87, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0xBF, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 $
+ 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0xC0, 0xC1, 0x01, 0x00, 0x00, 0xC0, 0xC1, 0x01, 0x00, 0x00, 0xC0, 0xC1, 0x01, 0x00, 0x00, 0xC0, 0xC1, 0x01, 0x10, 0x00, 0xC0, 0xC1, 0x01, 0x18, 0x00, 0xC0, 0xC1, 0x01, 0x1C, 0x00, 0xC0, 0xC1, 0x01, 0x1F, 0x00, 0xC0, 0xFF, 0x81, 0x1F, 0x00, 0xC0, 0xFF, 0xC1, 0x07, 0x00, 0x80, 0xFF, 0xF0, 0x03, 0x00, 0x00, 0x3E, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0xF8, 0xF1, 0x07, 0x00, 0x00, 0xFC, 0xF8, 0x0F, 0x00, 0x00, 0x3F, 0xFC, 0x1F, 0x00, 0x80, 0x1F, 0x1C, 0x1E, 0x00, 0xC0, 0x07, 0x1C, 0x1C, 0x00, 0xC0, 0x03, 0x1C, 0x1C, 0x00, 0xC0, 0x00, 0x1C, 0x1C, 0x00, 0x40, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0xE0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char %
+ 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0x00, 0x7F, 0xFE, 0x0F, 0x00, 0x80, 0xFF, 0xFE, 0x1F, 0x00, 0xC0, 0xFF, 0x1F, 0x1F, 0x00, 0xC0, 0xFF, 0x0F, 0x1E, 0x00, 0xC0, 0xC3, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x03, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x0F, 0x1E, 0x00, 0xC0, 0x83, 0x1F, 0x1E, 0x00, 0xC0, 0x83, 0x1F, 0x1E, 0x00, 0xC0, 0x83, 0x3F, 0x1E, 0x00, 0xC0, 0x83, 0x7B, 0x1E, 0x00, 0xC0, 0xC3, 0x7B, 0x1E, 0x00, 0xC0, 0xC3, 0xF1, 0x1E, 0x00, 0xC0, 0xFF, 0xE1, 0x1E, 0x00, 0xC0, 0xFF, 0xE1, 0x1F, 0x00, 0x80, 0xFF, 0xC0, 0x1F, 0x00, 0x80, 0xFF, 0x80, 0x0F, 0x00, 0x00, 0x3E, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x60, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0xE0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0x01, 0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0x0E, 0x00, 0x00, 0x00, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x1E, 0x00, 0x00, 0x00, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 )
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x8C, 0x0F, 0x00, 0x00, 0x00, 0xDC, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0x00, 0xDC, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 *
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 ,
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x80, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 .
+ 0x11, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 /
+ 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0x07, 0x00, 0x1F, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x07, 0x00, 0x1F, 0x00, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x87, 0x0F, 0x1E, 0x00, 0xC0, 0xFF, 0x0F, 0x1E, 0x00, 0x80, 0xFF, 0x0F, 0x1E, 0x00, 0x80, 0xFF, 0x07, 0x1E, 0x00, 0x00, 0xFF, 0x03, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0xFF, 0x1F, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0xFD, 0x0F, 0x00, 0x00, 0xFE, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x7F, 0x00, 0x00, 0xC0, 0xFF, 0x7F, 0x00, 0x00, 0xC0, 0xFF, 0x7F, 0x00, 0x00, 0xC0, 0xFF, 0x7F, 0x00, 0x00, 0xC0, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x07, 0x1E, 0x00, 0xC0, 0xFF, 0x07, 0x1E, 0x00, 0xC0, 0xFF, 0x07, 0x1E, 0x00, 0xC0, 0xFF, 0x07, 0x1E, 0x00, 0xC0, 0xFF, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x0F, 0x1F, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFE, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0x87, 0x07, 0x1F, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0xC0, 0x83, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x80, 0x9F, 0x1F, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x07, 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, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x10, 0x00, 0xC0, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1F, 0x00, 0xC0, 0x03, 0x80, 0x1F, 0x00, 0xC0, 0x03, 0xC0, 0x1F, 0x00, 0xC0, 0x03, 0xF0, 0x0F, 0x00, 0xC0, 0x03, 0xF8, 0x07, 0x00, 0xC0, 0x03, 0xFC, 0x03, 0x00, 0xC0, 0x03, 0xFE, 0x01, 0x00, 0xC0, 0x03, 0x7F, 0x00, 0x00, 0xC0, 0xC3, 0x3F, 0x00, 0x00, 0xC0, 0xE3, 0x1F, 0x00, 0x00, 0xC0, 0xF3, 0x0F, 0x00, 0x00, 0xC0, 0xFB, 0x03, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xF8, 0x07, 0x00, 0x80, 0xFF, 0xFD, 0x0F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0x1F, 0x1F, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x07, 0x0F, 0x1E, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xFF, 0xFD, 0x0F, 0x00, 0x00, 0xFE, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0xC0, 0xFF, 0x07, 0x00, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0x00, 0xC0, 0xCF, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x07, 0x0F, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x81, 0x1F, 0x00, 0x00, 0xF8, 0x81, 0x1F, 0x00, 0x00, 0xF8, 0x81, 0x1F, 0x00, 0x00, 0xF8, 0x81, 0x1F, 0x00, 0x00, 0xF8, 0x81, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x40, 0x00, 0x00, 0xF8, 0x81, 0x7F, 0x00, 0x00, 0xF8, 0x81, 0x7F, 0x00, 0x00, 0xF8, 0x81, 0x7F, 0x00, 0x00, 0xF8, 0x81, 0x1F, 0x00, 0x00, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 ;
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0xC0, 0x79, 0x00, 0x00, 0x00, 0xE0, 0x79, 0x00, 0x00, 0x00, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x78, 0xE0, 0x01, 0x00, 0x00, 0x78, 0xC0, 0x01, 0x00, 0x00, 0x3C, 0xC0, 0x03, 0x00, 0x00, 0x3C, 0x80, 0x03, 0x00, 0x00, 0x1E, 0x80, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x00, 0x0F, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 <
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 =
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x80, 0x07, 0x00, 0x00, 0x3C, 0xC0, 0x03, 0x00, 0x00, 0x38, 0xC0, 0x03, 0x00, 0x00, 0x78, 0xE0, 0x01, 0x00, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xE0, 0x71, 0x00, 0x00, 0x00, 0xE0, 0x79, 0x00, 0x00, 0x00, 0xC0, 0x3B, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 >
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x00, 0x00, 0x3F, 0x1F, 0x00, 0x00, 0x00, 0x3F, 0x1F, 0x00, 0x00, 0x00, 0x3F, 0x0E, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x87, 0x0F, 0x00, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0x00, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 ?
+ 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x07, 0x00, 0x80, 0x03, 0x00, 0x07, 0x00, 0x80, 0x03, 0x00, 0x07, 0x00, 0x80, 0x03, 0x00, 0x07, 0x7C, 0x80, 0x03, 0x00, 0x87, 0xFF, 0x83, 0x03, 0x00, 0x87, 0xFF, 0x83, 0x03, 0x00, 0xC7, 0xFF, 0x87, 0x03, 0x00, 0xC7, 0x83, 0x07, 0x00, 0x00, 0xC7, 0x01, 0x07, 0x00, 0x00, 0xC7, 0x01, 0x07, 0x00, 0x00, 0xC7, 0x01, 0x07, 0x00, 0x00, 0xC7, 0x01, 0x07, 0x00, 0x00, 0xC7, 0x01, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 @
+ 0x22, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0xFC, 0xF3, 0x00, 0x00, 0x00, 0xFF, 0xF1, 0x00, 0x00, 0x80, 0x7F, 0xF0, 0x00, 0x00, 0xC0, 0x3F, 0xF0, 0x00, 0x00, 0xC0, 0x0F, 0xF0, 0x00, 0x00, 0xC0, 0x0F, 0xF0, 0x00, 0x00, 0xC0, 0x1F, 0xF0, 0x00, 0x00, 0x80, 0x7F, 0xF0, 0x00, 0x00, 0x00, 0xFF, 0xF1, 0x00, 0x00, 0x00, 0xFE, 0xF3, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char A
+ 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x07, 0x0F, 0x1E, 0x00, 0xC0, 0xFF, 0x1F, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0xFD, 0x0F, 0x00, 0x00, 0xFE, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 B
+ 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0x07, 0x00, 0x1F, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x07, 0x00, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0x07, 0x0F, 0x1F, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0x07, 0x0F, 0x00, 0x00, 0xC0, 0x07, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0xC0, 0x03, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0x07, 0x00, 0x1F, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x00, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x07, 0x00, 0xC0, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0xF8, 0xFD, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0x01, 0x00, 0x00, 0x7E, 0xF8, 0x01, 0x00, 0x00, 0x3F, 0xF0, 0x03, 0x00, 0x00, 0x1F, 0xE0, 0x07, 0x00, 0x80, 0x0F, 0xC0, 0x0F, 0x00, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0xC0, 0x07, 0x00, 0x1F, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x01, 0x00, 0x1C, 0x00, 0xC0, 0x00, 0x00, 0x1C, 0x00, 0x40, 0x00, 0x00, 0x18, 0x00, 0x40, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x01, 0x00, 0xC0, 0xFF, 0xFF, 0x07, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 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 M
+ 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0x07, 0x00, 0x1F, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x07, 0x00, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 O
+ 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0xC0, 0x07, 0x3E, 0x00, 0x00, 0xC0, 0xFF, 0x3F, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFE, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 P
+ 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0x07, 0x00, 0x1F, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x3E, 0x00, 0xC0, 0x07, 0x00, 0x7F, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0xFF, 0xFF, 0xF7, 0x01, 0x00, 0xFE, 0xFF, 0xC3, 0x01, 0x00, 0xE0, 0x3F, 0x80, 0x01, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0x03, 0x1E, 0x00, 0x00, 0xC0, 0x03, 0x1E, 0x00, 0x00, 0xC0, 0x03, 0x3E, 0x00, 0x00, 0xC0, 0x03, 0x7E, 0x00, 0x00, 0xC0, 0x03, 0x7E, 0x00, 0x00, 0xC0, 0x03, 0xFE, 0x00, 0x00, 0xC0, 0x03, 0xFE, 0x01, 0x00, 0xC0, 0x03, 0xFE, 0x01, 0x00, 0xC0, 0x03, 0xFE, 0x03, 0x00, 0xC0, 0x03, 0xDE, 0x07, 0x00, 0xC0, 0x03, 0xDE, 0x07, 0x00, 0xC0, 0x03, 0x9E, 0x0F, 0x00, 0xC0, 0x03, 0x9E, 0x1F, 0x00, 0xC0, 0x03, 0x1E, 0x1F, 0x00, 0xC0, 0x03, 0x1E, 0x1E, 0x00, 0xC0, 0x07, 0x1F, 0x1E, 0x00, 0xC0, 0xFF, 0x1F, 0x1C, 0x00, 0x80, 0xFF, 0x0F, 0x1C, 0x00, 0x80, 0xFF, 0x0F, 0x18, 0x00, 0x80, 0xFF, 0x07, 0x10, 0x00, 0x00, 0xFE, 0x03, 0x10, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x1E, 0x00, 0x00, 0xFF, 0x03, 0x1E, 0x00, 0x80, 0xFF, 0x07, 0x1E, 0x00, 0xC0, 0xFF, 0x0F, 0x1E, 0x00, 0xC0, 0xFF, 0x0F, 0x1E, 0x00, 0xC0, 0x87, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0xC0, 0x03, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x01, 0x00, 0xC0, 0xFF, 0xFF, 0x07, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x07, 0x00, 0xC0, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x22, 0x40, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x2C, 0x40, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0x80, 0xFF, 0x03, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, // Code for char W
+ 0x21, 0x00, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x18, 0x00, 0xC0, 0x00, 0x00, 0x1C, 0x00, 0xC0, 0x01, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0x1F, 0x00, 0xC0, 0x07, 0x80, 0x1F, 0x00, 0xC0, 0x0F, 0xC0, 0x1F, 0x00, 0xC0, 0x1F, 0xE0, 0x0F, 0x00, 0x80, 0x3F, 0xE0, 0x07, 0x00, 0x00, 0x7F, 0xF0, 0x03, 0x00, 0x00, 0xFE, 0xF8, 0x01, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0x01, 0x00, 0x00, 0x7E, 0xF8, 0x03, 0x00, 0x00, 0x3F, 0xF0, 0x07, 0x00, 0x80, 0x1F, 0xE0, 0x0F, 0x00, 0xC0, 0x0F, 0xC0, 0x1F, 0x00, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0xC0, 0x07, 0x00, 0x1F, 0x00, 0xC0, 0x03, 0x00, 0x1E, 0x00, 0xC0, 0x01, 0x00, 0x1C, 0x00, 0xC0, 0x00, 0x00, 0x18, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x40, 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, 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
+ 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0xC0, 0xFF, 0x1F, 0x00, 0x00, 0xC0, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0xC0, 0x03, 0x00, 0x1F, 0x00, 0xC0, 0x03, 0x80, 0x1F, 0x00, 0xC0, 0x03, 0xC0, 0x1F, 0x00, 0xC0, 0x03, 0xC0, 0x1F, 0x00, 0xC0, 0x03, 0xE0, 0x1F, 0x00, 0xC0, 0x03, 0xF0, 0x1F, 0x00, 0xC0, 0x03, 0xF8, 0x1F, 0x00, 0xC0, 0x03, 0xFC, 0x1F, 0x00, 0xC0, 0x03, 0xFE, 0x1E, 0x00, 0xC0, 0x03, 0x7F, 0x1E, 0x00, 0xC0, 0x83, 0x3F, 0x1E, 0x00, 0xC0, 0xC3, 0x1F, 0x1E, 0x00, 0xC0, 0xC3, 0x0F, 0x1E, 0x00, 0xC0, 0xE3, 0x07, 0x1E, 0x00, 0xC0, 0xF3, 0x03, 0x1E, 0x00, 0xC0, 0xFB, 0x01, 0x1E, 0x00, 0xC0, 0xFF, 0x00, 0x1E, 0x00, 0xC0, 0xFF, 0x00, 0x1E, 0x00, 0xC0, 0x7F, 0x00, 0x1E, 0x00, 0xC0, 0x3F, 0x00, 0x1E, 0x00, 0xC0, 0x1F, 0x00, 0x1E, 0x00, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x80, 0x03, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 [
+ 0x11, 0x20, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x08, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 ]
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 ^
+ 0x16, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 `
+ 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x78, 0x1C, 0x1C, 0x00, 0x00, 0x78, 0x1C, 0x1C, 0x00, 0x00, 0x78, 0x1C, 0x1C, 0x00, 0x00, 0x78, 0x1C, 0x1C, 0x00, 0x00, 0x78, 0x1C, 0x1C, 0x00, 0x00, 0x78, 0x1C, 0x1C, 0x00, 0x00, 0x78, 0x1C, 0x1C, 0x00, 0x00, 0xF8, 0x1C, 0x1E, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x03, 0x00, 0xE0, 0xFF, 0xFF, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 0x0F, 0x00, 0xE0, 0xFF, 0xFF, 0x0F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0xC0, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 b
+ 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x0F, 0x00, 0xE0, 0xFF, 0xFF, 0x0F, 0x00, 0xE0, 0xFF, 0xFF, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0x38, 0x1E, 0x00, 0x00, 0x78, 0x38, 0x1E, 0x00, 0x00, 0x78, 0x38, 0x1E, 0x00, 0x00, 0x78, 0x38, 0x1E, 0x00, 0x00, 0x78, 0x38, 0x1E, 0x00, 0x00, 0x78, 0x38, 0x1E, 0x00, 0x00, 0x78, 0x38, 0x1E, 0x00, 0x00, 0x78, 0x38, 0x1E, 0x00, 0x00, 0x78, 0x38, 0x00, 0x00, 0x00, 0x78, 0x38, 0x00, 0x00, 0x00, 0x78, 0x38, 0x00, 0x00, 0x00, 0x78, 0x38, 0x00, 0x00, 0x00, 0x78, 0x38, 0x00, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0x79, 0x00, 0x00, 0x00, 0xE0, 0x79, 0x00, 0x00, 0x00, 0xE0, 0x79, 0x00, 0x00, 0x00, 0xE0, 0x79, 0x00, 0x00, 0x00, 0xE0, 0x79, 0x00, 0x00, 0x00, 0xE0, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0xF0, 0xFF, 0x03, 0x00, 0x00, 0xF0, 0xFF, 0x03, 0x00, 0x00, 0xF8, 0xFF, 0x07, 0x00, 0x00, 0xF8, 0xFF, 0x07, 0x00, 0x00, 0xF8, 0x80, 0x07, 0x00, 0x00, 0x78, 0x80, 0x07, 0x00, 0x00, 0x78, 0x80, 0x07, 0x00, 0x00, 0x78, 0x80, 0x07, 0x00, 0x00, 0x78, 0x80, 0x07, 0x00, 0x00, 0x78, 0x80, 0xC7, 0x03, 0x00, 0x78, 0x80, 0xC7, 0x03, 0x00, 0x78, 0x80, 0xC7, 0x03, 0x00, 0x78, 0x80, 0xC7, 0x03, 0x00, 0x78, 0x80, 0xC7, 0x03, 0x00, 0x78, 0x80, 0xC7, 0x03, 0x00, 0x78, 0x80, 0xC7, 0x03, 0x00, 0xF8, 0x80, 0xC7, 0x03, 0x00, 0xF8, 0xFF, 0xFF, 0x03, 0x00, 0xF0, 0xFF, 0xFF, 0x03, 0x00, 0xF0, 0xFF, 0xFF, 0x01, 0x00, 0xE0, 0xFF, 0xFF, 0x01, 0x00, 0xC0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFB, 0xFF, 0x1F, 0x00, 0xE0, 0xFB, 0xFF, 0x1F, 0x00, 0xE0, 0xFB, 0xFF, 0x1F, 0x00, 0xE0, 0xFB, 0xFF, 0x1F, 0x00, 0xE0, 0xFB, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x07, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xE0, 0x03, 0xC0, 0x01, 0x00, 0xF0, 0x03, 0xE0, 0xFB, 0xFF, 0xFF, 0x01, 0xE0, 0xFB, 0xFF, 0xFF, 0x01, 0xE0, 0xFB, 0xFF, 0xFF, 0x00, 0xE0, 0xFB, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x01, 0x00, 0x00, 0xC0, 0xE7, 0x03, 0x00, 0x00, 0xE0, 0xE3, 0x07, 0x00, 0x00, 0xF0, 0xC1, 0x0F, 0x00, 0x00, 0xF0, 0x81, 0x0F, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x08, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0xC0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 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, 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 m
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x80, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 o
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x03, 0x00, 0xE0, 0xFF, 0xFF, 0x03, 0x00, 0xF0, 0xFF, 0xFF, 0x03, 0x00, 0xF0, 0xFF, 0xFF, 0x03, 0x00, 0xF8, 0xFF, 0xFF, 0x03, 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0xC0, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 p
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x03, 0x00, 0xF0, 0xFF, 0xFF, 0x03, 0x00, 0xF0, 0xFF, 0xFF, 0x03, 0x00, 0xE0, 0xFF, 0xFF, 0x03, 0x00, 0xC0, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x1E, 0x00, 0x00, 0xF8, 0x1F, 0x1E, 0x00, 0x00, 0xF8, 0x1F, 0x1E, 0x00, 0x00, 0xF8, 0x1F, 0x1E, 0x00, 0x00, 0xF8, 0x1C, 0x1E, 0x00, 0x00, 0x78, 0x1C, 0x1E, 0x00, 0x00, 0x78, 0x1C, 0x1E, 0x00, 0x00, 0x78, 0x1C, 0x1E, 0x00, 0x00, 0x78, 0x1C, 0x1E, 0x00, 0x00, 0x78, 0x1C, 0x1E, 0x00, 0x00, 0x78, 0x1C, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x1E, 0x00, 0x00, 0x00, 0x1C, 0x1E, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0xF0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0E, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x03, 0x00, 0x00, 0xF8, 0xFF, 0x07, 0x00, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0x00, 0xF8, 0xFF, 0x07, 0x00, 0x00, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x24, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0x80, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 w
+ 0x19, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x81, 0x1F, 0x00, 0x00, 0xF0, 0xC3, 0x0F, 0x00, 0x00, 0xE0, 0xE7, 0x07, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x01, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0xE7, 0x07, 0x00, 0x00, 0xF0, 0xC3, 0x0F, 0x00, 0x00, 0xF8, 0x81, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0x00, 0xF8, 0xFF, 0x03, 0x00, 0x00, 0xF8, 0xFF, 0x07, 0x00, 0x00, 0xF8, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x80, 0xC7, 0x03, 0x00, 0x00, 0x80, 0xC7, 0x03, 0x00, 0x00, 0x80, 0xC7, 0x03, 0x00, 0x00, 0x80, 0xC7, 0x03, 0x00, 0x00, 0x80, 0xC7, 0x03, 0x00, 0x00, 0x80, 0xC7, 0x03, 0x00, 0x00, 0x80, 0xC7, 0x03, 0x00, 0x00, 0x80, 0xC7, 0x03, 0x00, 0x00, 0x80, 0xE7, 0x03, 0x00, 0xF8, 0xFF, 0xFF, 0x03, 0x00, 0xF8, 0xFF, 0xFF, 0x01, 0x00, 0xF8, 0xFF, 0xFF, 0x01, 0x00, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x80, 0x1F, 0x00, 0x00, 0x78, 0xC0, 0x1F, 0x00, 0x00, 0x78, 0xE0, 0x1F, 0x00, 0x00, 0x78, 0xF0, 0x1F, 0x00, 0x00, 0x78, 0xF8, 0x1E, 0x00, 0x00, 0x78, 0x78, 0x1E, 0x00, 0x00, 0x78, 0x3C, 0x1E, 0x00, 0x00, 0x78, 0x1E, 0x1E, 0x00, 0x00, 0x78, 0x0F, 0x1E, 0x00, 0x00, 0xF8, 0x0F, 0x1E, 0x00, 0x00, 0xF8, 0x07, 0x1E, 0x00, 0x00, 0xF8, 0x03, 0x1E, 0x00, 0x00, 0xF8, 0x01, 0x1E, 0x00, 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0B, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFB, 0xFF, 0x0F, 0xFF, 0xFF, 0xFB, 0xFF, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFB, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 }
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x80, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0xF8, 0xFF, 0xFF, 0x0F, 0x00, 0xF8, 0xFF, 0xFF, 0x0F, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0xF8, 0xFF, 0xFF, 0x0F, 0x00, 0xF8, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ };
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/TextDisplay.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,92 @@
+/* mbed TextDisplay Display Library Base Class
+ * Copyright (c) 2007-2009 sford
+ * Released under the MIT License: http://mbed.org/license/mit
+ */
+
+#include "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++]);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/TextDisplay.h Wed Apr 10 14:56:25 2019 +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 "mbed.h"
+#include "LCDSettings.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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/UbuntuCondensed38x47.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,152 @@
+/*
+ * UbuntuCondensed38x47.h
+ *
+ * Created on: Aug 15, 2018
+ * Author: Gokhan.Bektas
+ */
+
+#ifndef DRIVERS_LS013B7DH03_UBUNTUCONDENSED38X47_H_
+#define DRIVERS_LS013B7DH03_UBUNTUCONDENSED38X47_H_
+
+
+
+//Font Generated by MikroElektronika GLCD Font Creator 1.2.0.0
+//MikroElektrnika 2011
+//http://www.mikroe.com
+
+//GLCD FontName : Ubuntu_Condensed38x47
+//GLCD FontSize : 38 x 47
+
+const unsigned char UbuntuCondensed38x47[] = {
+
+ 229, 38,47,6,
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0xFF, 0xFF, 0x00, 0x7E, 0x00, 0xE0, 0xFF, 0xFF, 0x0F, 0x7E, 0x00, 0xE0, 0xFF, 0xFF, 0x0F, 0x7E, 0x00, 0xE0, 0xFF, 0xFF, 0x0F, 0x7E, 0x00, 0xE0, 0xFF, 0xFF, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 !
+ 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 "
+ 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x1C, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x1C, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x1C, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x1C, 0x38, 0x00, 0x00, 0xC0, 0x01, 0xFC, 0x3F, 0x00, 0x00, 0xC0, 0xE1, 0xFF, 0x3F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x1C, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x1C, 0x00, 0x00, 0xE0, 0xC0, 0x01, 0x1C, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x1C, 0x38, 0x00, 0x00, 0xC0, 0x01, 0xFC, 0x3F, 0x00, 0x00, 0xC0, 0xE1, 0xFF, 0x3F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x1C, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x1C, 0x00, 0x00, 0xE0, 0xC0, 0x01, 0x1C, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x1C, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x1C, 0x00, 0x00, 0x00, 0xC0, 0x01, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 #
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x06, 0x00, 0x00, 0xFE, 0x07, 0x80, 0x0F, 0x00, 0x00, 0xFF, 0x0F, 0x80, 0x0F, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x1F, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x1F, 0x00, 0xC0, 0x0F, 0x7F, 0x00, 0x1E, 0x00, 0xFE, 0x07, 0x7E, 0x00, 0xFE, 0x07, 0xFE, 0x03, 0xFC, 0x00, 0xFE, 0x07, 0xFE, 0x03, 0xF8, 0x01, 0xFE, 0x07, 0xFE, 0x03, 0xF8, 0x01, 0xFF, 0x07, 0xFE, 0x03, 0xF0, 0x87, 0xFF, 0x07, 0xC0, 0x07, 0xE0, 0xFF, 0x1F, 0x00, 0xC0, 0x07, 0xE0, 0xFF, 0x0F, 0x00, 0x80, 0x07, 0xC0, 0xFF, 0x07, 0x00, 0x80, 0x01, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 $
+ 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x3F, 0x00, 0x20, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x3F, 0x00, 0xF0, 0xFF, 0x3F, 0xC0, 0x3F, 0x00, 0xF0, 0xFF, 0x3F, 0xF8, 0x3F, 0x00, 0xE0, 0xFF, 0x1F, 0xFE, 0x1F, 0x00, 0xC0, 0xFF, 0x8F, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0xF3, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0xFE, 0x07, 0x00, 0xC0, 0xFF, 0x83, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xC0, 0xFF, 0x3F, 0x00, 0xE0, 0x1F, 0xE0, 0xFF, 0x7F, 0x00, 0xE0, 0x07, 0xE0, 0xFF, 0x7F, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0x78, 0x00, 0x20, 0x00, 0xE0, 0x01, 0x78, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xFE, 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, 0x00, 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 %
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x03, 0x00, 0x00, 0x3F, 0xC0, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xE0, 0xFF, 0x0F, 0x00, 0xE0, 0xFF, 0xF3, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0x83, 0x1F, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x3E, 0x00, 0xF0, 0xC1, 0x7F, 0x00, 0x3E, 0x00, 0xF0, 0x00, 0x7F, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0xFF, 0x01, 0x3C, 0x00, 0xF0, 0x80, 0xFF, 0x03, 0x3C, 0x00, 0xF0, 0xC1, 0xF7, 0x0F, 0x3E, 0x00, 0xF0, 0xFF, 0xE7, 0x1F, 0x3E, 0x00, 0xE0, 0xFF, 0xC3, 0x3F, 0x1F, 0x00, 0xE0, 0xFF, 0x01, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0x3F, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x3E, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 '
+ 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, 0xFE, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x3F, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0x01, 0xC0, 0xFF, 0x1F, 0xFE, 0x0F, 0x00, 0x00, 0xF8, 0x3F, 0xFF, 0x01, 0x00, 0x00, 0xC0, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x38, 0x04, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x38, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x01, 0x00, 0x00, 0xC0, 0x7F, 0xFE, 0x0F, 0x00, 0x00, 0xF8, 0x3F, 0xFC, 0xFF, 0x01, 0xC0, 0xFF, 0x1F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0xFE, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 )
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x80, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x80, 0xCF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x07, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x07, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x07, 0x00, 0x00, 0x00, 0x00, 0xCF, 0x03, 0x00, 0x00, 0x00, 0x80, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 *
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 -
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 .
+ 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x7F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x01, 0x00, 0x80, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 /
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xF0, 0x0F, 0x00, 0x80, 0x7F, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x00, 0xF0, 0x0F, 0x00, 0x80, 0x7F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xE0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x3F, 0x00, 0xE0, 0x03, 0x00, 0xE0, 0x3F, 0x00, 0xE0, 0x03, 0x00, 0xF8, 0x3F, 0x00, 0xF0, 0x01, 0x00, 0xFE, 0x3F, 0x00, 0xF0, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0xF0, 0x00, 0x80, 0x7F, 0x3C, 0x00, 0xF0, 0x00, 0xE0, 0x1F, 0x3C, 0x00, 0xF0, 0x00, 0xF0, 0x07, 0x3C, 0x00, 0xF0, 0x01, 0xFC, 0x03, 0x3C, 0x00, 0xF0, 0x03, 0xFF, 0x00, 0x3C, 0x00, 0xE0, 0xFF, 0x7F, 0x00, 0x3C, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x3C, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0x3C, 0x00, 0x80, 0xFF, 0x03, 0x00, 0x3C, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x00, 0xF0, 0x01, 0x78, 0x00, 0x7C, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xFC, 0x00, 0x7C, 0x00, 0xF0, 0x03, 0xFF, 0x01, 0x7C, 0x00, 0xE0, 0xFF, 0xFF, 0x03, 0x3F, 0x00, 0xE0, 0xFF, 0xEF, 0xFF, 0x3F, 0x00, 0xC0, 0xFF, 0xEF, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0xC3, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFC, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x3C, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x3C, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x3C, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x3C, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x3C, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x3C, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x7C, 0x00, 0xE0, 0xFF, 0x3F, 0x00, 0x7C, 0x00, 0xE0, 0xFF, 0x3F, 0x00, 0x78, 0x00, 0xE0, 0xFF, 0x3F, 0x00, 0x78, 0x00, 0xE0, 0xFF, 0x7F, 0x00, 0x78, 0x00, 0xE0, 0x01, 0x7C, 0x00, 0x78, 0x00, 0xE0, 0x01, 0x7C, 0x00, 0x78, 0x00, 0xE0, 0x01, 0xFC, 0x00, 0x7C, 0x00, 0xE0, 0x01, 0xF8, 0x00, 0x3E, 0x00, 0xE0, 0x01, 0xF8, 0x03, 0x3F, 0x00, 0xE0, 0x01, 0xF0, 0xFF, 0x3F, 0x00, 0xE0, 0x01, 0xF0, 0xFF, 0x1F, 0x00, 0xE0, 0x01, 0xE0, 0xFF, 0x0F, 0x00, 0xE0, 0x01, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0x7F, 0x80, 0x7F, 0x00, 0x80, 0x3F, 0x3C, 0x00, 0x7C, 0x00, 0x80, 0x1F, 0x3C, 0x00, 0x78, 0x00, 0xC0, 0x0F, 0x3C, 0x00, 0x78, 0x00, 0xC0, 0x07, 0x3C, 0x00, 0x78, 0x00, 0xE0, 0x03, 0x7C, 0x00, 0x7C, 0x00, 0xE0, 0x03, 0xFC, 0x01, 0x7F, 0x00, 0xE0, 0x01, 0xF8, 0xFF, 0x3F, 0x00, 0xE0, 0x01, 0xF8, 0xFF, 0x3F, 0x00, 0xE0, 0x01, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x3E, 0x00, 0xE0, 0x01, 0x00, 0xF0, 0x3F, 0x00, 0xE0, 0x01, 0x00, 0xFF, 0x3F, 0x00, 0xE0, 0x01, 0xF0, 0xFF, 0x3F, 0x00, 0xE0, 0x01, 0xFE, 0xFF, 0x3F, 0x00, 0xE0, 0x81, 0xFF, 0xFF, 0x01, 0x00, 0xE0, 0xF1, 0xFF, 0x07, 0x00, 0x00, 0xE0, 0xFD, 0x7F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x0F, 0x00, 0x80, 0xFF, 0x03, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0x87, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xCF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0x07, 0x7F, 0x00, 0xF0, 0x03, 0xFF, 0x01, 0x7C, 0x00, 0xF0, 0x01, 0xFE, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xFE, 0x03, 0x7C, 0x00, 0xF0, 0x03, 0xFF, 0x07, 0x3F, 0x00, 0xE0, 0xFF, 0xDF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xCF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0x07, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0x01, 0xFE, 0x07, 0x00, 0x00, 0x7E, 0x00, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x3C, 0x00, 0xC0, 0xFF, 0x7F, 0x00, 0x3C, 0x00, 0xE0, 0xFF, 0xFF, 0x00, 0x3C, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x3E, 0x00, 0xF0, 0x03, 0xFC, 0x01, 0x3E, 0x00, 0xF0, 0x01, 0xF0, 0x01, 0x1F, 0x00, 0xF0, 0x00, 0xE0, 0x81, 0x1F, 0x00, 0xF0, 0x00, 0xE0, 0xC1, 0x0F, 0x00, 0xF0, 0x01, 0xE0, 0xF1, 0x0F, 0x00, 0xF0, 0x07, 0xF0, 0xFF, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0xC0, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xF0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x7E, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x7E, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x7E, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x7E, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x7E, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 :
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0xE0, 0x01, 0x00, 0xFE, 0x3F, 0x00, 0xF0, 0x03, 0x00, 0xFE, 0x3F, 0x00, 0xF0, 0x03, 0x00, 0xFE, 0x1F, 0x00, 0xF0, 0x03, 0x00, 0xFE, 0x07, 0x00, 0xF0, 0x03, 0x00, 0x7E, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xE0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 ;
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x78, 0x00, 0x00, 0x00, 0x80, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x80, 0x07, 0xF0, 0x00, 0x00, 0x00, 0xC0, 0x07, 0xF0, 0x01, 0x00, 0x00, 0xE0, 0x03, 0xE0, 0x03, 0x00, 0x00, 0xE0, 0x03, 0xE0, 0x03, 0x00, 0x00, 0xC0, 0x01, 0xC0, 0x01, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 <
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 =
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0xC0, 0x01, 0xC0, 0x01, 0x00, 0x00, 0xE0, 0x03, 0xE0, 0x03, 0x00, 0x00, 0xE0, 0x03, 0xE0, 0x03, 0x00, 0x00, 0xC0, 0x07, 0xF0, 0x01, 0x00, 0x00, 0x80, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x80, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 >
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0x80, 0x0F, 0x7E, 0x00, 0xF0, 0x00, 0xE0, 0x0F, 0x7E, 0x00, 0xF0, 0x00, 0xF0, 0x0F, 0x7E, 0x00, 0xF0, 0x00, 0xF8, 0x0F, 0x7E, 0x00, 0xF0, 0x00, 0xFC, 0x0F, 0x7E, 0x00, 0xF0, 0x01, 0xFF, 0x00, 0x3C, 0x00, 0xF0, 0x83, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 ?
+ 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0x07, 0xC0, 0xFF, 0x01, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x03, 0x80, 0x3F, 0x00, 0x00, 0xF8, 0x03, 0xC0, 0x1F, 0x00, 0x00, 0xE0, 0x07, 0xC0, 0x07, 0xF0, 0x1F, 0xC0, 0x0F, 0xE0, 0x07, 0xFC, 0x7F, 0x80, 0x0F, 0xE0, 0x03, 0xFE, 0xFF, 0x81, 0x0F, 0xE0, 0x01, 0xFF, 0xFF, 0x03, 0x1F, 0xF0, 0x81, 0xFF, 0xFF, 0x03, 0x1F, 0xF0, 0x81, 0x1F, 0xF0, 0x07, 0x1E, 0xF0, 0xC0, 0x07, 0xC0, 0x07, 0x1E, 0xF0, 0xC0, 0x07, 0x80, 0x07, 0x1E, 0xF0, 0xC0, 0x03, 0x80, 0x07, 0x1E, 0xF0, 0xC0, 0x03, 0x80, 0x07, 0x1E, 0xF0, 0xC0, 0x03, 0x80, 0x07, 0x1E, 0xF0, 0xC0, 0xFF, 0xFF, 0x07, 0x1E, 0xF0, 0xC0, 0xFF, 0xFF, 0x03, 0x1F, 0xF0, 0xC1, 0xFF, 0xFF, 0x03, 0x0F, 0xE0, 0x81, 0xFF, 0xFF, 0x07, 0x0F, 0xE0, 0x83, 0xFF, 0xFF, 0x07, 0x00, 0xE0, 0x03, 0x00, 0x80, 0x07, 0x00, 0xC0, 0x07, 0x00, 0x80, 0x07, 0x00, 0xC0, 0x1F, 0x00, 0x80, 0x07, 0x00, 0x80, 0x3F, 0x00, 0xC0, 0x07, 0x00, 0x00, 0xFF, 0x01, 0xF0, 0x07, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xC0, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, // Code for char @
+ 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x3F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xF8, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x1C, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x1C, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0xFF, 0x0F, 0x1C, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x1C, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 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, 0xC0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x03, 0x7C, 0x00, 0x3E, 0x00, 0xE0, 0x03, 0x7C, 0x00, 0x3E, 0x00, 0xC0, 0x0F, 0xFF, 0x00, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0x81, 0x1F, 0x00, 0x80, 0xFF, 0xEF, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0xE7, 0xFF, 0x0F, 0x00, 0x00, 0xFF, 0xC3, 0xFF, 0x07, 0x00, 0x00, 0xFC, 0x80, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 B
+ 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0x7F, 0x00, 0xF8, 0x1F, 0x00, 0xE0, 0x0F, 0x00, 0x80, 0x3F, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x3F, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7E, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x3E, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x3E, 0x00, 0x40, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x3E, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x1F, 0x00, 0xC0, 0x0F, 0x00, 0x80, 0x1F, 0x00, 0x80, 0x1F, 0x00, 0xC0, 0x0F, 0x00, 0x80, 0xFF, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xF0, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x38, 0x00, 0x00, 0x00, 0xE0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0x7F, 0x00, 0xF8, 0x1F, 0x00, 0xE0, 0x0F, 0x00, 0xC0, 0x3F, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x3F, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7E, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xC0, 0xFF, 0x7F, 0x00, 0xF0, 0x01, 0xC0, 0xFF, 0x7F, 0x00, 0xE0, 0x03, 0xC0, 0xFF, 0x3F, 0x00, 0xE0, 0x03, 0xC0, 0xFF, 0x3F, 0x00, 0x40, 0x00, 0xC0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 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, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xF0, 0xCF, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x87, 0x3F, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x7F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFE, 0x01, 0x00, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0x00, 0xE0, 0x1F, 0x00, 0xF0, 0x0F, 0x00, 0xE0, 0x0F, 0x00, 0xE0, 0x3F, 0x00, 0xE0, 0x03, 0x00, 0xC0, 0x3F, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x3F, 0x00, 0x60, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 M
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0x00, 0xF8, 0x1F, 0x00, 0xE0, 0x0F, 0x00, 0x80, 0x3F, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x3E, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x3E, 0x00, 0xE0, 0x0F, 0x00, 0x80, 0x3F, 0x00, 0xC0, 0x7F, 0x00, 0xF0, 0x1F, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x80, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 O
+ 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x00, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x00, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x00, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x00, 0x00, 0xE0, 0x01, 0xE0, 0x03, 0x00, 0x00, 0xE0, 0x03, 0xE0, 0x03, 0x00, 0x00, 0xC0, 0x07, 0xF0, 0x01, 0x00, 0x00, 0xC0, 0x0F, 0xF8, 0x01, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 P
+ 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0x00, 0xF8, 0x1F, 0x00, 0xE0, 0x0F, 0x00, 0x80, 0x3F, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x3E, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF8, 0x01, 0xF0, 0x00, 0x00, 0x00, 0xF8, 0x07, 0xF0, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0xF0, 0x01, 0x00, 0x00, 0xFC, 0x1F, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x3F, 0xE0, 0x03, 0x00, 0x00, 0x3E, 0x3E, 0xE0, 0x0F, 0x00, 0x80, 0x3F, 0x3C, 0xC0, 0x7F, 0x00, 0xF0, 0x1F, 0x7C, 0x80, 0xFF, 0xFF, 0xFF, 0x0F, 0x7C, 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0x78, 0x00, 0xFE, 0xFF, 0xFF, 0x03, 0x18, 0x00, 0xF0, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x80, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x00, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x00, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x00, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x00, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x00, 0x00, 0xE0, 0x03, 0xE0, 0x07, 0x00, 0x00, 0xE0, 0x03, 0xE0, 0x1F, 0x00, 0x00, 0xC0, 0x07, 0xF0, 0x7F, 0x00, 0x00, 0xC0, 0x0F, 0xFC, 0xFF, 0x01, 0x00, 0xC0, 0xFF, 0xFF, 0xFE, 0x07, 0x00, 0x80, 0xFF, 0xFF, 0xFC, 0x3F, 0x00, 0x00, 0xFF, 0x7F, 0xF0, 0x3F, 0x00, 0x00, 0xFE, 0x3F, 0xC0, 0x3F, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3E, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x3E, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0x7C, 0x00, 0xC0, 0xFF, 0x1F, 0x00, 0x7C, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x78, 0x00, 0xE0, 0x83, 0x3F, 0x00, 0x78, 0x00, 0xF0, 0x01, 0x7E, 0x00, 0x78, 0x00, 0xF0, 0x01, 0x7C, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xF8, 0x01, 0x7C, 0x00, 0xF0, 0x00, 0xF0, 0x03, 0x7C, 0x00, 0xF0, 0x00, 0xF0, 0x07, 0x3F, 0x00, 0xF0, 0x01, 0xE0, 0xFF, 0x3F, 0x00, 0xE0, 0x01, 0xC0, 0xFF, 0x1F, 0x00, 0xE0, 0x01, 0x80, 0xFF, 0x0F, 0x00, 0x60, 0x00, 0x00, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFC, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x3F, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xE0, 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 W
+ 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x3F, 0x00, 0xE0, 0x0F, 0x00, 0xC0, 0x3F, 0x00, 0xE0, 0x3F, 0x00, 0xF0, 0x3F, 0x00, 0xE0, 0xFF, 0x00, 0xFC, 0x3F, 0x00, 0x80, 0xFF, 0x83, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0xEF, 0xFF, 0x01, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x8F, 0xFF, 0x01, 0x00, 0x80, 0xFF, 0x03, 0xFE, 0x0F, 0x00, 0xE0, 0xFF, 0x00, 0xF8, 0x3F, 0x00, 0xE0, 0x3F, 0x00, 0xE0, 0x3F, 0x00, 0xE0, 0x0F, 0x00, 0x80, 0x3F, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x3E, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x16, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x3F, 0x00, 0xE0, 0x01, 0x00, 0xE0, 0x3F, 0x00, 0xE0, 0x01, 0x00, 0xF8, 0x3F, 0x00, 0xE0, 0x01, 0x00, 0xFE, 0x3F, 0x00, 0xE0, 0x01, 0x80, 0xFF, 0x3F, 0x00, 0xE0, 0x01, 0xE0, 0xFF, 0x3D, 0x00, 0xE0, 0x01, 0xF0, 0x3F, 0x3C, 0x00, 0xE0, 0x01, 0xFC, 0x0F, 0x3C, 0x00, 0xE0, 0x01, 0xFF, 0x03, 0x3C, 0x00, 0xE0, 0xC1, 0xFF, 0x00, 0x3C, 0x00, 0xE0, 0xF1, 0x3F, 0x00, 0x3C, 0x00, 0xE0, 0xF9, 0x0F, 0x00, 0x3C, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0x3C, 0x00, 0xE0, 0xFF, 0x01, 0x00, 0x3C, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 [
+ 0x0F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0A, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 ]
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 ^
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 `
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0x00, 0x60, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0xE0, 0x01, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0x01, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0x80, 0x0F, 0x7C, 0x00, 0x00, 0xF0, 0x80, 0x07, 0x78, 0x00, 0x00, 0xF0, 0x80, 0x03, 0x70, 0x00, 0x00, 0xF0, 0x80, 0x03, 0x70, 0x00, 0x00, 0xF0, 0x80, 0x03, 0x70, 0x00, 0x00, 0xF0, 0x81, 0x03, 0x70, 0x00, 0x00, 0xF0, 0x83, 0x03, 0x70, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x7E, 0x00, 0x00, 0xE0, 0x0F, 0x80, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 b
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0x0F, 0x80, 0x3F, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x7E, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x7C, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x3C, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0x0F, 0x80, 0x3F, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x7E, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x78, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0x8F, 0x87, 0x3F, 0x00, 0x00, 0xF0, 0x81, 0x07, 0x3E, 0x00, 0x00, 0xF0, 0x80, 0x07, 0x7C, 0x00, 0x00, 0x70, 0x80, 0x07, 0x7C, 0x00, 0x00, 0x70, 0x80, 0x07, 0x78, 0x00, 0x00, 0x70, 0x80, 0x07, 0x78, 0x00, 0x00, 0xF0, 0x80, 0x07, 0x78, 0x00, 0x00, 0xF0, 0x83, 0x07, 0x78, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x78, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x7C, 0x00, 0x00, 0xC0, 0xFF, 0x07, 0x3C, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x38, 0x00, 0x00, 0x00, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x3E, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x1E, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x01, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x07, 0x30, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x38, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x78, 0x00, 0xE0, 0x0F, 0xC0, 0x3F, 0x70, 0x00, 0xF0, 0x03, 0x00, 0x3F, 0x70, 0x00, 0xF0, 0x01, 0x00, 0x3E, 0x70, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0x70, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0x70, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0x7C, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0xE0, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xE1, 0xFF, 0xFF, 0x3F, 0x00, 0xF0, 0xE1, 0xFF, 0xFF, 0x3F, 0x00, 0xF0, 0xE1, 0xFF, 0xFF, 0x3F, 0x00, 0xF0, 0xE1, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xF0, 0xE1, 0xFF, 0xFF, 0xFF, 0x7F, 0xF0, 0xE1, 0xFF, 0xFF, 0xFF, 0x3F, 0xF0, 0xE1, 0xFF, 0xFF, 0xFF, 0x3F, 0xF0, 0xE1, 0xFF, 0xFF, 0xFF, 0x1F, 0xE0, 0xE0, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFE, 0x03, 0x00, 0x00, 0xE0, 0x3F, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0x1F, 0xF0, 0x3F, 0x00, 0x00, 0xE0, 0x07, 0xC0, 0x3F, 0x00, 0x00, 0xE0, 0x01, 0x80, 0x3F, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x20, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 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, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0xFD, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 m
+ 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0x0F, 0x80, 0x3F, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x7E, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x7E, 0x00, 0x00, 0xE0, 0x0F, 0x80, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 o
+ 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x7E, 0x00, 0x00, 0xE0, 0x0F, 0x80, 0x7F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x07, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 p
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x07, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0x0F, 0x80, 0x7F, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x7E, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 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, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x30, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x38, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x78, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x78, 0x00, 0x00, 0xF0, 0xFF, 0x03, 0x70, 0x00, 0x00, 0xF0, 0xE1, 0x07, 0x70, 0x00, 0x00, 0xF0, 0xC0, 0x07, 0x70, 0x00, 0x00, 0x70, 0x80, 0x0F, 0x78, 0x00, 0x00, 0x70, 0x00, 0x3F, 0x7C, 0x00, 0x00, 0x70, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xF0, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0xE0, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x60, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xE0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x7E, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x7C, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x78, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x78, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x78, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x3F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xE0, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x3F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 w
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x3F, 0x00, 0x00, 0xE0, 0x0F, 0x80, 0x3F, 0x00, 0x00, 0xE0, 0x3F, 0xE0, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xF8, 0x3F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xE0, 0xFF, 0xF8, 0x3F, 0x00, 0x00, 0xE0, 0x3F, 0xE0, 0x3F, 0x00, 0x00, 0xE0, 0x0F, 0x80, 0x3F, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x3E, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x70, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x70, 0x00, 0xE0, 0xFF, 0x0F, 0x00, 0x70, 0x00, 0xE0, 0xFF, 0xFF, 0x00, 0x78, 0x00, 0x80, 0xFF, 0xFF, 0x07, 0x7E, 0x00, 0x00, 0xE0, 0xFF, 0xBF, 0x3F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0xE0, 0x01, 0x80, 0x3F, 0x00, 0x00, 0xE0, 0x01, 0xE0, 0x3F, 0x00, 0x00, 0xE0, 0x01, 0xFC, 0x3F, 0x00, 0x00, 0xE0, 0x01, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xC1, 0xFF, 0x3F, 0x00, 0x00, 0xE0, 0xF1, 0xFF, 0x3C, 0x00, 0x00, 0xE0, 0xF9, 0x3F, 0x3C, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x3C, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x3C, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x3C, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x3C, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x3C, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFE, 0xFF, 0x7F, 0xFE, 0xFF, 0x3F, 0xFE, 0xFF, 0x3F, 0xFC, 0xFF, 0x3F, 0xFF, 0xFF, 0x0F, 0xF0, 0xFF, 0x7F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 {
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 |
+ 0x0C, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xFF, 0x0F, 0xF0, 0xFF, 0x7F, 0xFE, 0xFF, 0x3F, 0xFC, 0xFF, 0x3F, 0xFE, 0xFF, 0x7F, 0xFE, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xC0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 }
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x60, 0x00, 0x00, 0x00, 0x18, 0x00, 0x60, 0x00, 0x00, 0x00, 0x18, 0x00, 0x60, 0x00, 0x00, 0x00, 0x18, 0x00, 0x60, 0x00, 0x00, 0x00, 0x18, 0x00, 0x60, 0x00, 0x00, 0x00, 0x18, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ };
+
+
+/*
+0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+0x00, 0x00, 0x00, 0x00, 0x00, 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
+*/
+
+#endif /* DRIVERS_LS013B7DH03_UBUNTUCONDENSED38X47_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/mbed_logo.c Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,396 @@
+#include "mbed_logo.h"
+
+#if 0
+const unsigned char mbed_enabled_logo[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
+ 0x00, 0x08, 0x1f, 0x00, 0xf8, 0x01, 0xe3, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
+ 0x00, 0x0c, 0x7f, 0x81, 0xfc, 0x01, 0xef, 0xe0, 0x00, 0x07, 0xf0, 0x00, 0x07, 0xfb, 0x80, 0x00,
+ 0x00, 0x0e, 0xff, 0xe7, 0xfe, 0x01, 0xff, 0xf8, 0x00, 0x1f, 0xfc, 0x00, 0x1f, 0xff, 0x80, 0x00,
+ 0x00, 0x0f, 0xc0, 0xfe, 0x1f, 0x01, 0xf0, 0x3c, 0x00, 0x3c, 0x0c, 0x00, 0x1f, 0xff, 0x80, 0x00,
+ 0x00, 0x0f, 0x80, 0xf8, 0x0f, 0x01, 0xe0, 0x0c, 0x00, 0x30, 0x0f, 0x00, 0x78, 0x07, 0x80, 0x00,
+ 0x00, 0x0f, 0x00, 0x70, 0x0f, 0x81, 0xe0, 0x07, 0x00, 0x70, 0x07, 0x80, 0x70, 0x03, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x07, 0x81, 0xe0, 0x03, 0x80, 0xe0, 0x03, 0x80, 0xf0, 0x03, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x07, 0x81, 0xe0, 0x03, 0xc0, 0xc0, 0x01, 0xc1, 0xf0, 0x03, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x03, 0x81, 0xe0, 0x01, 0xc1, 0xc0, 0x01, 0xc1, 0xe0, 0x03, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x03, 0x81, 0xe0, 0x01, 0xe1, 0xc0, 0x01, 0xc1, 0xc0, 0x03, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x03, 0x81, 0xe0, 0x01, 0xe1, 0xff, 0xff, 0xc3, 0xc0, 0x03, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x03, 0x81, 0xe0, 0x01, 0xe1, 0xff, 0xff, 0x83, 0xc0, 0x03, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x03, 0x81, 0xe0, 0x01, 0xc1, 0x80, 0x00, 0x03, 0xc0, 0x03, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x03, 0x81, 0xe0, 0x01, 0xc1, 0xc0, 0x00, 0x01, 0xc0, 0x03, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x03, 0x81, 0xe0, 0x01, 0x80, 0xc0, 0x00, 0x01, 0xe0, 0x03, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x03, 0x81, 0xe0, 0x03, 0x80, 0xc0, 0x00, 0x01, 0xe0, 0x03, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x03, 0x81, 0xe0, 0x03, 0x00, 0x60, 0x00, 0x00, 0xf0, 0x03, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x03, 0x81, 0xe0, 0x07, 0x00, 0x70, 0x00, 0x00, 0xf0, 0x03, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x03, 0x81, 0xe0, 0xfe, 0x00, 0x38, 0x00, 0x00, 0xf8, 0x03, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x03, 0x81, 0xff, 0xfe, 0x00, 0x1f, 0xfe, 0x00, 0x7f, 0xff, 0x80, 0x00,
+ 0x00, 0x0e, 0x00, 0x70, 0x03, 0x81, 0xff, 0xf8, 0x00, 0x07, 0xfe, 0x00, 0x3f, 0xff, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x07, 0xe0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x0f, 0xc0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x1f, 0x80, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x3f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x7e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x01, 0xf8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x03, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x87, 0xe0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xcf, 0xc0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+ 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+ 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+ 0x00, 0x06, 0x00, 0x04, 0x3c, 0x01, 0xf0, 0x0c, 0x78, 0x03, 0x00, 0x38, 0x00, 0x7e, 0xc0, 0x00,
+ 0x00, 0x06, 0x00, 0x06, 0xfe, 0x03, 0xfc, 0x0d, 0x8c, 0x03, 0x00, 0xfe, 0x00, 0xff, 0xc0, 0x00,
+ 0x00, 0x06, 0x00, 0x07, 0x81, 0x00, 0x06, 0x0d, 0x06, 0x03, 0x01, 0x01, 0x01, 0x80, 0xc0, 0x00,
+ 0x00, 0x07, 0xf8, 0x06, 0x01, 0x00, 0x02, 0x0e, 0x03, 0x03, 0x02, 0x00, 0x83, 0x00, 0xc0, 0x00,
+ 0x00, 0x06, 0x00, 0x06, 0x01, 0x00, 0x02, 0x0c, 0x01, 0x83, 0x06, 0x00, 0x83, 0x00, 0xc0, 0x00,
+ 0x00, 0x06, 0x00, 0x06, 0x01, 0x00, 0x3e, 0x0c, 0x01, 0x83, 0x06, 0x00, 0x82, 0x00, 0xc0, 0x00,
+ 0x00, 0x06, 0x00, 0x06, 0x01, 0x00, 0xfe, 0x0c, 0x01, 0x83, 0x07, 0xff, 0x86, 0x00, 0xc0, 0x00,
+ 0x00, 0x06, 0x00, 0x06, 0x01, 0x03, 0x82, 0x0c, 0x01, 0x83, 0x06, 0x00, 0x06, 0x00, 0xc0, 0x00,
+ 0x00, 0x06, 0x00, 0x06, 0x01, 0x04, 0x02, 0x0c, 0x01, 0x83, 0x06, 0x00, 0x06, 0x00, 0xc0, 0x00,
+ 0x00, 0x06, 0x00, 0x06, 0x01, 0x04, 0x02, 0x0c, 0x01, 0x83, 0x06, 0x00, 0x06, 0x00, 0xc0, 0x00,
+ 0x00, 0x06, 0x00, 0x06, 0x01, 0x04, 0x02, 0x0c, 0x03, 0x03, 0x02, 0x00, 0x02, 0x00, 0xc0, 0x00,
+ 0x00, 0x06, 0x00, 0x06, 0x01, 0x06, 0x06, 0x0c, 0x07, 0x03, 0x03, 0x00, 0x03, 0x80, 0xc0, 0x00,
+ 0x00, 0x06, 0x06, 0x06, 0x01, 0x02, 0x0f, 0x0c, 0x04, 0x03, 0x01, 0xff, 0x01, 0xff, 0xc0, 0x00,
+ 0x00, 0x0f, 0xfe, 0x06, 0x01, 0x03, 0xf9, 0x8f, 0xf8, 0x03, 0x80, 0xfe, 0x00, 0xff, 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, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+#endif
+
+const unsigned char maxim_integrated_logo[] =
+{
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00
+ ,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00
+ ,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00
+ ,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00
+ ,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00
+ ,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00
+ ,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00
+ ,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00
+ ,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00
+ ,0x00,0x00,0x3f,0xff,0xe0,0x00,0x03,0xff,0xff,0xc0,0x00,0x03,0xff,0xfc,0x00,0x00
+ ,0x00,0x00,0x7f,0xff,0x80,0x00,0x01,0xff,0xff,0x80,0x00,0x01,0xff,0xfe,0x00,0x00
+ ,0x00,0x00,0x7f,0xff,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0xff,0xfe,0x00,0x00
+ ,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x7f,0xfe,0x00,0x00,0x00,0xff,0xff,0x00,0x00
+ ,0x00,0x00,0xff,0xfe,0x00,0x00,0x00,0x7f,0xfe,0x00,0x00,0x00,0x7f,0xff,0x00,0x00
+ ,0x00,0x01,0xff,0xfe,0x00,0x00,0x00,0x3f,0xfc,0x00,0x00,0x00,0x7f,0xff,0x80,0x00
+ ,0x00,0x01,0xff,0xfe,0x00,0x00,0x00,0x3f,0xfc,0x00,0x00,0x00,0x7f,0xff,0x80,0x00
+ ,0x00,0x01,0xff,0xfe,0x00,0x00,0x00,0x1f,0xf8,0x00,0x00,0x00,0x7f,0xff,0xc0,0x00
+ ,0x00,0x03,0xff,0xfe,0x00,0x00,0x00,0x1f,0xf8,0x00,0x00,0x00,0x7f,0xff,0xc0,0x00
+ ,0x00,0x03,0xff,0xfe,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x7f,0xff,0xc0,0x00
+ ,0x00,0x03,0xff,0xfe,0x00,0x1f,0x80,0x07,0xe0,0x01,0xf8,0x00,0x7f,0xff,0xc0,0x00
+ ,0x00,0x07,0xff,0xfe,0x00,0x1f,0x80,0x07,0xe0,0x01,0xf8,0x00,0x7f,0xff,0xe0,0x00
+ ,0x00,0x07,0xff,0xfe,0x00,0x1f,0xc0,0x07,0xc0,0x03,0xf8,0x00,0x7f,0xff,0xe0,0x00
+ ,0x00,0x07,0xff,0xfe,0x00,0x1f,0xe0,0x07,0xc0,0x03,0xf8,0x00,0x7f,0xff,0xe0,0x00
+ ,0x00,0x07,0xff,0xfe,0x00,0x1f,0xe0,0x0f,0x80,0x07,0xf8,0x00,0x7f,0xff,0xe0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xf0,0x1f,0x80,0x0f,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xf0,0x1f,0x00,0x0f,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xf8,0x3f,0x00,0x1f,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xf8,0x3e,0x00,0x1f,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xfc,0x7e,0x00,0x3f,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xfc,0x7c,0x00,0x3f,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xfe,0xf8,0x00,0x7f,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xff,0xf8,0x00,0x7f,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xff,0xf0,0x00,0xff,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xff,0xf0,0x01,0xff,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xff,0xe0,0x01,0xff,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xff,0xe0,0x03,0xff,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xff,0xc0,0x03,0xff,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xff,0xc0,0x01,0xff,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xff,0x80,0x01,0xff,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xff,0x00,0x00,0xff,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xff,0x00,0x00,0xff,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xfe,0x00,0x00,0x7f,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xfe,0x00,0x00,0x7f,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x0f,0xff,0xfe,0x00,0x1f,0xfc,0x00,0x00,0x3f,0xf8,0x00,0x7f,0xff,0xf0,0x00
+ ,0x00,0x07,0xff,0xfe,0x00,0x1f,0xfc,0x00,0x00,0x3f,0xf8,0x00,0x7f,0xff,0xe0,0x00
+ ,0x00,0x07,0xff,0xfe,0x00,0x1f,0xf8,0x00,0x00,0x1f,0xf8,0x00,0x7f,0xff,0xe0,0x00
+ ,0x00,0x07,0xff,0xfe,0x00,0x1f,0xf8,0x00,0x00,0x0f,0xf8,0x00,0x7f,0xff,0xe0,0x00
+ ,0x00,0x07,0xff,0xfe,0x00,0x1f,0xf0,0x00,0x00,0x0f,0xf8,0x00,0x7f,0xff,0xe0,0x00
+ ,0x00,0x03,0xff,0xfe,0x00,0x1f,0xe0,0x01,0x80,0x07,0xf8,0x00,0x7f,0xff,0xe0,0x00
+ ,0x00,0x03,0xff,0xfe,0x00,0x1f,0xe0,0x01,0x80,0x07,0xf8,0x00,0x7f,0xff,0xc0,0x00
+ ,0x00,0x03,0xff,0xfe,0x00,0x1f,0xc0,0x03,0xc0,0x03,0xf8,0x00,0x7f,0xff,0xc0,0x00
+ ,0x00,0x03,0xff,0xfe,0x00,0x1f,0xc0,0x03,0xe0,0x03,0xf8,0x00,0x7f,0xff,0xc0,0x00
+ ,0x00,0x01,0xff,0xfe,0x00,0x1f,0x80,0x07,0xe0,0x01,0xf8,0x00,0x7f,0xff,0x80,0x00
+ ,0x00,0x01,0xff,0xfe,0x00,0x1f,0x80,0x0f,0xf0,0x01,0xf8,0x00,0x7f,0xff,0x80,0x00
+ ,0x00,0x00,0xff,0xfe,0x00,0x1f,0x00,0x0f,0xf0,0x00,0xf8,0x00,0x7f,0xff,0x00,0x00
+ ,0x00,0x00,0xff,0xfe,0x00,0x1f,0x00,0x1f,0xf8,0x00,0x78,0x00,0x7f,0xff,0x00,0x00
+ ,0x00,0x00,0x7f,0xfe,0x00,0x1e,0x00,0x1f,0xf8,0x00,0x78,0x00,0x7f,0xff,0x00,0x00
+ ,0x00,0x00,0x7f,0xfe,0x00,0x1c,0x00,0x3f,0xfc,0x00,0x38,0x00,0x7f,0xfe,0x00,0x00
+ ,0x00,0x00,0x3f,0xfe,0x00,0x1c,0x00,0x3f,0xfc,0x00,0x38,0x00,0x7f,0xfe,0x00,0x00
+ ,0x00,0x00,0x3f,0xfe,0x00,0x3c,0x00,0x7f,0xfe,0x00,0x3c,0x00,0x7f,0xfc,0x00,0x00
+ ,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00
+ ,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00
+ ,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00
+ ,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00
+ ,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00
+ ,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00
+ ,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00
+ ,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00
+ ,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+};
+
+
+const unsigned char maxim128Bitmaps[] =
+{
+ 0x00, 0x07, 0xFC, 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, 0x7F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // ################## ##
+ 0x01, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // ##################### ##
+ 0x03, 0xFF, 0xFF, 0xFC, 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, // ##########################
+ 0x0F, 0xFF, 0xFF, 0xFE, 0x00, 0x2F, 0xB8, 0x7C, 0xE3, 0x32, 0x7B, 0xC0, 0x00, 0x00, 0x00, // ########################### # ##### ### ##### ### ## ## # #### ####
+ 0x1F, 0xFF, 0xFF, 0xFF, 0x00, 0x3F, 0xFC, 0x7E, 0x77, 0x33, 0xFF, 0xE0, 0x00, 0x00, 0x00, // ############################# ############ ###### ### ### ## #############
+ 0x1F, 0xFF, 0xFF, 0xFF, 0x80, 0x31, 0x8C, 0x02, 0x3E, 0x33, 0x1C, 0x60, 0x00, 0x00, 0x00, // ############################## ## ## ## # ##### ## ## ### ##
+ 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x31, 0x8C, 0x1E, 0x1C, 0x33, 0x18, 0x60, 0x00, 0x00, 0x00, // ############################### ## ## ## #### ### ## ## ## ##
+ 0x3E, 0x01, 0xF8, 0x0F, 0xC0, 0x31, 0x8C, 0xFA, 0x1C, 0x33, 0x18, 0x60, 0x00, 0x00, 0x00, // ##### ###### ###### ## ## ## ##### # ### ## ## ## ##
+ 0x7E, 0x00, 0xF0, 0x07, 0xE0, 0x31, 0x8C, 0xC2, 0x1E, 0x33, 0x18, 0x60, 0x00, 0x00, 0x00, // ###### #### ###### ## ## ## ## # #### ## ## ## ##
+ 0x7E, 0x18, 0xE1, 0x87, 0xE0, 0x31, 0x8C, 0xC6, 0x37, 0x33, 0x18, 0x60, 0x00, 0x00, 0x00, // ###### ## ### ## ###### ## ## ## ## ## ## ### ## ## ## ##
+ 0xFE, 0x18, 0xE3, 0x87, 0xE0, 0x31, 0x8C, 0xEE, 0x63, 0xB3, 0x18, 0x60, 0x00, 0x00, 0x00, // ####### ## ### ### ###### ## ## ## ### ### ## ### ## ## ## ##
+ 0xFE, 0x1C, 0xC3, 0x87, 0xE0, 0x31, 0x8C, 0x7A, 0xE1, 0xB3, 0x18, 0x60, 0x00, 0x00, 0x00, // ####### ### ## ### ###### ## ## ## #### # ### ## ## ## ## ##
+ 0xFE, 0x1C, 0xC7, 0x87, 0xE0, 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, // ####### ###### #### ######
+ 0xFE, 0x1F, 0x8F, 0x87, 0xE0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, // ####### ###### ##### ###### ## ##
+ 0xFE, 0x1F, 0x0F, 0x87, 0xE0, 0x30, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, // ####### ##### ##### ###### ## ## ## ##
+ 0xFE, 0x1E, 0x0F, 0x87, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, // ####### #### ##### ###### ## ## ##
+ 0xFE, 0x1E, 0x07, 0x87, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, // ####### #### #### ###### ## ## ##
+ 0xFE, 0x1E, 0x07, 0x87, 0xE0, 0x33, 0xF1, 0xF3, 0xF1, 0xFD, 0xBB, 0xE7, 0xE7, 0xC3, 0xF0, // ####### #### #### ###### ## ###### ##### ###### ####### ## ### ##### ###### ##### ######
+ 0x7E, 0x1C, 0x43, 0x87, 0xE0, 0x33, 0x98, 0xC2, 0x31, 0x19, 0xE4, 0x33, 0x0C, 0x66, 0x30, // ###### ### # ### ###### ## ### ## ## # ## # ## #### # ## ## ## ## ## ##
+ 0x7E, 0x18, 0x63, 0x87, 0xE0, 0x33, 0x18, 0xC6, 0x1B, 0x19, 0xC0, 0x33, 0x0C, 0x66, 0x30, // ###### ## ## ### ###### ## ## ## ## ## ## ## ## ### ## ## ## ## ## ##
+ 0x7E, 0x18, 0xE1, 0x87, 0xC0, 0x33, 0x18, 0xC7, 0xFB, 0x19, 0x81, 0xF3, 0x1F, 0xEE, 0x30, // ###### ## ### ## ##### ## ## ## ## ######## ## ## ## ##### ## ######## ### ##
+ 0x3E, 0x10, 0xF1, 0x87, 0xC0, 0x33, 0x18, 0xC7, 0xF1, 0xF1, 0x87, 0xB3, 0x1F, 0xCC, 0x30, // ##### # #### ## ##### ## ## ## ## ####### ##### ## #### ## ## ####### ## ##
+ 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x33, 0x18, 0xC6, 0x01, 0xE1, 0x86, 0x33, 0x0C, 0x0E, 0x30, // ############################### ## ## ## ## ## #### ## ## ## ## ## ### ##
+ 0x1F, 0xFF, 0xFF, 0xFF, 0x80, 0x33, 0x18, 0xC6, 0x09, 0x81, 0x84, 0x33, 0x8C, 0x26, 0x30, // ############################## ## ## ## ## ## # ## ## # ## ### ## # ## ##
+ 0x0F, 0xFF, 0xFF, 0xFF, 0x00, 0x33, 0x18, 0xF3, 0xF1, 0xF9, 0x87, 0xF1, 0xEF, 0xE7, 0xF0, // ############################ ## ## ## #### ###### ###### ## ####### #### ####### #######
+ 0x07, 0xFF, 0xFF, 0xFE, 0x00, 0x33, 0x18, 0x71, 0xE3, 0x1D, 0x83, 0xD0, 0xE3, 0x83, 0x90, // ########################## ## ## ## ### #### ## ### ## #### # ### ### ### #
+ 0x03, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, // ######################## ## ##
+ 0x01, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, // ###################### ### ####
+ 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, // #################### #####
+ 0x00, 0x3F, 0xFF, 0xC0, 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, 0xF0, 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;
+
+
+const unsigned char BLELogoBitmap[] =
+{
+ 0x18, 0x00, // ##
+ 0x1C, 0x00, // ###
+ 0x1E, 0x00, // ####
+ 0x1B, 0x00, // ## ##
+ 0x19, 0x80, // ## ##
+ 0xDB, 0x00, // ## ## ##
+ 0x7E, 0x00, // ######
+ 0x1C, 0x00, // ###
+ 0x7E, 0x00, // ######
+ 0xDB, 0x00, // ## ## ##
+ 0x19, 0x80, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x1E, 0x00, // ####
+ 0x1C, 0x00, // ###
+ 0x18, 0x00, // ##
+};
+
+// Bitmap sizes for bLLOGO9x11
+const unsigned char BLELogoWidthPages = 2;
+const unsigned char BLELogoHeightPixels = 15;
+
+
+const unsigned char USBLogoBitmap[] =
+{
+ 0x08, 0x00, // #
+ 0x1C, 0x00, // ###
+ 0x3E, 0x00, // #####
+ 0x08, 0x00, // #
+ 0x09, 0x80, // # ##
+ 0x09, 0x80, // # ##
+ 0xC9, 0x00, // ## # #
+ 0x4B, 0x00, // # # ##
+ 0x4C, 0x00, // # ##
+ 0x28, 0x00, // # #
+ 0x18, 0x00, // ##
+ 0x08, 0x00, // #
+ 0x1C, 0x00, // ###
+ 0x1C, 0x00, // ###
+ 0x08, 0x00, // #
+};
+
+// Bitmap sizes for uSBLOGO9x15
+const unsigned char uSBLOGO9x15WidthPages = 2;
+const unsigned char uSBLOGO9x15HeightPixels = 15;
+
+//
+// Font data for Microsoft Sans Serif 8pt
+//
+
+// Character bitmaps for Microsoft Sans Serif 8pt
+const unsigned char AM_Bitmap[] =
+{
+ // @0 'A' (7 pixels wide)
+ 0x10, 0x82,// #
+ 0x10, 0x82,// #
+ 0x28, 0xC6,// # #
+ 0x28, 0xC6,// # #
+ 0x44, 0xAA,// # #
+ 0x44, 0xAA,// # #
+ 0x7C, 0x92,// #####
+ 0x82, 0x92,// # #
+ 0x82, 0x82,// # #
+};
+
+// Character bitmaps for Microsoft Sans Serif 8pt
+const unsigned char PM_Bitmap[] =
+{
+ // @9 'P' (6 pixels wide)
+ 0xF8, 0x82,// #####
+ 0x84, 0x82,// # #
+ 0x84, 0xC6,// # #
+ 0x84, 0xC6,// # #
+ 0xF8, 0xAA,// #####
+ 0x80, 0xAA,// #
+ 0x80, 0x92,// #
+ 0x80, 0x92,// #
+ 0x80, 0x82,// #
+};
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/mbed_logo.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,45 @@
+/** 128*128 1bpp version of the mbed-enabled logo */
+#if 0
+extern const unsigned char mbed_enabled_logo[];
+#endif
+extern const unsigned char maxim_integrated_logo[];
+extern const unsigned char maxim128Bitmaps[];
+extern const unsigned char BLELogoBitmap[];
+extern const unsigned char USBLogoBitmap[];
+
+#ifndef MBED_LOGO_H
+#define MBED_LOGO_H
+
+typedef struct
+{
+ const unsigned char width;
+ const unsigned char height;
+ const unsigned short offset;
+
+} FONT_CHAR_INFO;
+
+typedef struct
+{
+ const unsigned char height;
+ const char startCh;
+ const char endCh;
+ const FONT_CHAR_INFO* charDesc;
+ const unsigned char* bitmap;
+
+} FONT_INFO;
+
+// Font data for Ubuntu Condensed 28pt
+extern const unsigned char ubuntuCondensed_28ptBitmaps[];
+extern const FONT_INFO ubuntuCondensed_28ptFontInfo;
+extern const FONT_CHAR_INFO ubuntuCondensed_28ptDescriptors[];
+// Bitmap info for maxim128
+
+//extern const unsigned char maxim128WidthPages;
+//extern const unsigned char maxim128HeightPixels;
+
+// Font data for Microsoft Sans Serif 8pt
+extern const unsigned char AM_Bitmap[];
+extern const unsigned char PM_Bitmap[];
+
+
+#endif // MBED_LOGO_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/ubuntucondensed16x21.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,111 @@
+
+//WARNING: This Font Require X-GLCD Lib.
+// You can not use it with MikroE GLCD Lib.
+
+//Font Generated by MikroElektronika GLCD Font Creator 1.2.0.0
+//MikroElektronika 2011
+//http://www.mikroe.com
+
+//GLCD FontName : Ubuntu_Condensed16x21
+//GLCD FontSize : 16 x 21
+
+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
+ };
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/ubuntucondensed20x26.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,118 @@
+#ifndef DRIVERS_LS013B7DH03_UBUNTUCONDENSED20X26_H_
+#define DRIVERS_LS013B7DH03_UBUNTUCONDENSED20X26_H_
+
+//WARNING: This Font Require X-GLCD Lib.
+// You can not use it with MikroE GLCD Lib.
+
+//Font Generated by MikroElektronika GLCD Font Creator 1.2.0.0
+//MikroElektronika 2011
+//http://www.mikroe.com
+
+//GLCD FontName : Ubuntu_Condensed20x26
+//GLCD FontSize : 20 x 26
+
+const unsigned char UbuntuCondensed20x26[] = {
+ // number of columns, char width , char height, number of bytes for height
+ 81, 20,26,4,
+ // first column is the character width
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0xFC, 0x7F, 0x1C, 0x00, 0xFC, 0x7F, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 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 "
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x1C, 0x00, 0x80, 0xF9, 0x1F, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0xFC, 0xC7, 0x00, 0x00, 0x9C, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x1C, 0x00, 0x80, 0xF9, 0x1F, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0xFC, 0xC7, 0x00, 0x00, 0x9C, 0xC1, 0x00, 0x00, 0x80, 0xC1, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x08, 0x00, 0xF0, 0x07, 0x1C, 0x00, 0x30, 0x0E, 0x18, 0x00, 0x18, 0x1C, 0x18, 0x00, 0x1F, 0x18, 0xF8, 0x00, 0x1F, 0x38, 0xF8, 0x00, 0x18, 0x70, 0x1C, 0x00, 0x18, 0xE0, 0x0F, 0x00, 0x00, 0xC0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char $
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x10, 0x00, 0xFC, 0x0F, 0x1E, 0x00, 0xF0, 0xC3, 0x0F, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x3E, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0xF8, 0xE1, 0x07, 0x00, 0x3C, 0xF8, 0x1F, 0x00, 0x04, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char %
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0xF0, 0xF0, 0x0F, 0x00, 0xF8, 0x3B, 0x0C, 0x00, 0x1C, 0x0F, 0x18, 0x00, 0x0C, 0x1E, 0x18, 0x00, 0x0C, 0x3E, 0x18, 0x00, 0x0C, 0x73, 0x18, 0x00, 0xF8, 0xE1, 0x0C, 0x00, 0xF0, 0xC0, 0x0F, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x38, 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, // Code for char &
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0xF0, 0xFF, 0x3F, 0x00, 0xFE, 0x00, 0xFC, 0x01, 0x0F, 0x00, 0xC0, 0x03, 0x02, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 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, 0x02, 0x00, 0x00, 0x01, 0x0F, 0x00, 0xC0, 0x03, 0xFE, 0x00, 0xFC, 0x01, 0xF0, 0xFF, 0x3F, 0x00, 0x80, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 )
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0xA0, 0x03, 0x00, 0x00, 0xAC, 0x01, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xBC, 0x01, 0x00, 0x00, 0xA0, 0x03, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x01, 0x00, 0x00, 0xFC, 0x01, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x1C, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xF0, 0x03, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0xFE, 0x01, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x3F, 0x00, 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, 0x00, 0x00, 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, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x38, 0x00, 0x0E, 0x00, 0xF0, 0xFF, 0x07, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 0
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 1
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x00, 0x1C, 0x80, 0x1F, 0x00, 0x0C, 0xE0, 0x19, 0x00, 0x0C, 0x70, 0x18, 0x00, 0x0C, 0x38, 0x18, 0x00, 0x1C, 0x0E, 0x18, 0x00, 0xF8, 0x07, 0x18, 0x00, 0xF0, 0x01, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 2
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x1C, 0x1E, 0x18, 0x00, 0xF8, 0x3F, 0x0C, 0x00, 0xF0, 0xF1, 0x0F, 0x00, 0x00, 0xE0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 3
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x80, 0xDF, 0x00, 0x00, 0xE0, 0xC7, 0x00, 0x00, 0xF8, 0xC0, 0x00, 0x00, 0x3C, 0xC0, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x00, 0xC0, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 4
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xF8, 0x07, 0x18, 0x00, 0xFC, 0x07, 0x18, 0x00, 0x0C, 0x06, 0x18, 0x00, 0x0C, 0x0E, 0x18, 0x00, 0x0C, 0x0C, 0x1C, 0x00, 0x0C, 0x1C, 0x0E, 0x00, 0x0C, 0xF8, 0x07, 0x00, 0x0C, 0xF0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 5
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0xF0, 0x06, 0x1E, 0x00, 0x38, 0x06, 0x18, 0x00, 0x18, 0x06, 0x18, 0x00, 0x1C, 0x06, 0x18, 0x00, 0x0C, 0x0E, 0x1C, 0x00, 0x0C, 0xFC, 0x0F, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 6
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x0C, 0xC0, 0x1F, 0x00, 0x0C, 0xF8, 0x01, 0x00, 0x0C, 0x1E, 0x00, 0x00, 0x8C, 0x03, 0x00, 0x00, 0xEC, 0x00, 0x00, 0x00, 0x3C, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 7
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xC1, 0x03, 0x00, 0xF8, 0xF3, 0x0F, 0x00, 0x18, 0x3F, 0x0C, 0x00, 0x0C, 0x1C, 0x18, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x0C, 0x1C, 0x18, 0x00, 0x0C, 0x1C, 0x18, 0x00, 0x1C, 0x36, 0x0C, 0x00, 0xF8, 0xE3, 0x0F, 0x00, 0xF0, 0xC1, 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, 0x00, // Code for char 8
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0xF8, 0x1F, 0x18, 0x00, 0x1C, 0x38, 0x18, 0x00, 0x0C, 0x30, 0x1C, 0x00, 0x0C, 0x30, 0x0C, 0x00, 0x0C, 0x30, 0x0E, 0x00, 0x3C, 0xB0, 0x07, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0xE0, 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, 0x00, // Code for char 9
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x1C, 0x00, 0xC0, 0x01, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xC0, 0x01, 0x80, 0x01, 0xC0, 0x01, 0xFC, 0x01, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x8C, 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, // Code for char =
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x08, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x0C, 0x70, 0x1C, 0x00, 0x0C, 0x7C, 0x1C, 0x00, 0x0C, 0x0E, 0x00, 0x00, 0x1C, 0x07, 0x00, 0x00, 0xF8, 0x03, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ?
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0xE0, 0x03, 0x3C, 0x00, 0x70, 0x00, 0x70, 0x00, 0x38, 0x00, 0xE0, 0x00, 0x18, 0xFC, 0xC0, 0x00, 0x1C, 0xFF, 0xC3, 0x01, 0x0C, 0x03, 0x87, 0x01, 0x8C, 0x01, 0x86, 0x01, 0x8C, 0x01, 0x86, 0x01, 0x8C, 0x01, 0x86, 0x01, 0x8C, 0xFF, 0x83, 0x01, 0x98, 0xFF, 0x87, 0x01, 0x18, 0x00, 0x06, 0x00, 0x30, 0x00, 0x06, 0x00, 0xE0, 0x00, 0x07, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0x00, 0x00, // Code for char @
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0xFF, 0x07, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0xFC, 0xC1, 0x00, 0x00, 0x1C, 0xC0, 0x00, 0x00, 0xFC, 0xC0, 0x00, 0x00, 0xE0, 0xCF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0x80, 0x1F, 0x00, 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, // Code for char A
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x18, 0x1E, 0x1C, 0x00, 0xF8, 0x3F, 0x0E, 0x00, 0xF0, 0xF1, 0x07, 0x00, 0x00, 0xE0, 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, // Code for char B
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0x70, 0x80, 0x07, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x38, 0x00, 0x0E, 0x00, 0xF0, 0x80, 0x07, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0x80, 0xFF, 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
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x18, 0x00, 0x0C, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char E
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 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, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char F
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0x70, 0x80, 0x07, 0x00, 0x18, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x1C, 0xF0, 0x1F, 0x00, 0x08, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char G
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 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, // Code for char H
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x09, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0xFC, 0xFF, 0x0F, 0x00, 0xFC, 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, 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
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x80, 0x33, 0x00, 0x00, 0xE0, 0x60, 0x00, 0x00, 0x70, 0xC0, 0x01, 0x00, 0x3C, 0x80, 0x07, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x1C, 0x00, 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, // Code for char K
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char L
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x3C, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x80, 0x3F, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char M
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x78, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x80, 0x07, 0x00, 0xFC, 0xFF, 0x0F, 0x00, 0xFC, 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, // Code for char N
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x78, 0x00, 0x0F, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0x80, 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, // Code for char O
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x1C, 0x38, 0x00, 0x00, 0x38, 0x1C, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0xE0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char P
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x78, 0x00, 0x0C, 0x00, 0xF8, 0x00, 0x0C, 0x00, 0xD8, 0x01, 0x18, 0x00, 0x8C, 0x01, 0x78, 0x00, 0x0F, 0x03, 0xE0, 0xFF, 0x03, 0x03, 0x80, 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, // Code for char Q
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x1C, 0xF8, 0x00, 0x00, 0x38, 0xDC, 0x03, 0x00, 0xF0, 0x8F, 0x0F, 0x00, 0xE0, 0x07, 0x1E, 0x00, 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, // Code for char R
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x08, 0x00, 0xF8, 0x03, 0x1C, 0x00, 0x18, 0x07, 0x18, 0x00, 0x0C, 0x0E, 0x18, 0x00, 0x0C, 0x1C, 0x18, 0x00, 0x0C, 0x18, 0x18, 0x00, 0x0C, 0x38, 0x0C, 0x00, 0x0C, 0xF0, 0x0F, 0x00, 0x08, 0xC0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char S
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char T
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x03, 0x00, 0xFC, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0E, 0x00, 0xFC, 0xFF, 0x0F, 0x00, 0xFC, 0xFF, 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, // Code for char U
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0xFC, 0x07, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0xFC, 0x03, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char V
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0xC0, 0xFF, 0x07, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0xC0, 0xFF, 0x07, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char W
+ 0x0C, 0x04, 0x00, 0x10, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x78, 0x00, 0x0F, 0x00, 0xE0, 0xC1, 0x03, 0x00, 0x80, 0xF7, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x80, 0xF7, 0x00, 0x00, 0xE0, 0xC1, 0x03, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x04, 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, // Code for char X
+ 0x0C, 0x04, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x3C, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Y
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x1F, 0x00, 0x0C, 0xC0, 0x1F, 0x00, 0x0C, 0xF0, 0x19, 0x00, 0x0C, 0x3C, 0x18, 0x00, 0x0C, 0x0F, 0x18, 0x00, 0xCC, 0x03, 0x18, 0x00, 0xFC, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x1C, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Z
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 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, 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, 0x3F, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xF0, 0x03, 0x00, 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, 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
+ 0x05, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 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, 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, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ^
+ 0x0A, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char _
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 `
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x80, 0xC1, 0x0F, 0x00, 0x80, 0xE1, 0x1C, 0x00, 0x80, 0x61, 0x18, 0x00, 0x80, 0x61, 0x18, 0x00, 0x80, 0x61, 0x18, 0x00, 0x80, 0x63, 0x18, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 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, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char a
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x03, 0x1C, 0x00, 0x00, 0x07, 0x0E, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0xF8, 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, // Code for char b
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x07, 0x0E, 0x00, 0x80, 0x03, 0x1C, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x07, 0x0E, 0x00, 0x80, 0x03, 0x1C, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0xFF, 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, 0x00, // Code for char d
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x67, 0x0E, 0x00, 0x80, 0x61, 0x1C, 0x00, 0x80, 0x61, 0x18, 0x00, 0x80, 0x61, 0x18, 0x00, 0x80, 0x61, 0x18, 0x00, 0x80, 0x63, 0x18, 0x00, 0x00, 0x7F, 0x0C, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char e
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0xFE, 0xFF, 0x1F, 0x00, 0x87, 0x01, 0x00, 0x00, 0x83, 0x01, 0x00, 0x00, 0x83, 0x01, 0x00, 0x00, 0x83, 0x01, 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, 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
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xFE, 0x07, 0x01, 0x00, 0x07, 0x0E, 0x03, 0x80, 0x03, 0x1C, 0x03, 0x80, 0x01, 0x18, 0x03, 0x80, 0x01, 0x18, 0x03, 0x80, 0x01, 0x18, 0x03, 0x80, 0x01, 0x98, 0x01, 0x80, 0xFF, 0xFF, 0x01, 0x00, 0xFF, 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 g
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0xFC, 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, 0x00, // Code for char h
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0xFF, 0x1F, 0x00, 0x8E, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x8E, 0xFF, 0xFF, 0x01, 0x8E, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xDC, 0x01, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x80, 0x03, 0x0E, 0x00, 0x80, 0x01, 0x1C, 0x00, 0x80, 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, 0x00, 0x00, // Code for char k
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char m
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 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, 0x00, // Code for char n
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x07, 0x0E, 0x00, 0x80, 0x03, 0x1C, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x03, 0x1C, 0x00, 0x00, 0x07, 0x0E, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0xF8, 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 o
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x80, 0xFF, 0xFF, 0x03, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x03, 0x1C, 0x00, 0x00, 0x07, 0x0E, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0xF8, 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, // Code for char p
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x07, 0x0E, 0x00, 0x80, 0x03, 0x1C, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0xFF, 0xFF, 0x03, 0x00, 0xFF, 0xFF, 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 q
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char r
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x0C, 0x00, 0x00, 0x3F, 0x18, 0x00, 0x80, 0x71, 0x18, 0x00, 0x80, 0x61, 0x18, 0x00, 0x80, 0xE1, 0x1C, 0x00, 0x80, 0xC3, 0x0F, 0x00, 0x00, 0x80, 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, 0x00, 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
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x07, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0x80, 0x01, 0x1C, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 0x18, 0x00, 0x80, 0x01, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char t
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x80, 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, 0x00, // Code for char u
+ 0x0B, 0x80, 0x01, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x1F, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char v
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x80, 0xFF, 0x03, 0x00, 0x80, 0x07, 0x00, 0x00, 0x80, 0xFF, 0x03, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x80, 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, // Code for char w
+ 0x0A, 0x80, 0x00, 0x10, 0x00, 0x80, 0x03, 0x1C, 0x00, 0x00, 0x07, 0x0F, 0x00, 0x00, 0x9E, 0x03, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x9E, 0x03, 0x00, 0x00, 0x07, 0x0F, 0x00, 0x80, 0x03, 0x1C, 0x00, 0x80, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char x
+ 0x0A, 0x80, 0x01, 0x00, 0x03, 0x80, 0x3F, 0x00, 0x03, 0x00, 0xFE, 0x01, 0x03, 0x00, 0xE0, 0xCF, 0x03, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x80, 0x1F, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char y
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x1C, 0x00, 0x80, 0x01, 0x1F, 0x00, 0x80, 0xC1, 0x1F, 0x00, 0x80, 0xE1, 0x19, 0x00, 0x80, 0x79, 0x18, 0x00, 0x80, 0x1F, 0x18, 0x00, 0x80, 0x07, 0x18, 0x00, 0x80, 0x03, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char z
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0xFE, 0xCF, 0xFF, 0x01, 0x07, 0x00, 0x80, 0x03, 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, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 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, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x80, 0x03, 0xFE, 0xCF, 0xFF, 0x01, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x78, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ~
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+
+};
+
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/LS013B7DH03/ubuntucondensed22x28.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,113 @@
+
+//WARNING: This Font Require X-GLCD Lib.
+// You can not use it with MikroE GLCD Lib.
+
+//Font Generated by MikroElektronika GLCD Font Creator 1.2.0.0
+//MikroElektronika 2011
+//http://www.mikroe.com
+
+//GLCD FontName : Ubuntu_Condensed22x28
+//GLCD FontSize : 22 x 28
+
+const unsigned char UbuntuCondensed22x28[] = {
+ 89, 22,28,4,
+ 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x70, 0x00, 0xF8, 0xFF, 0x71, 0x00, 0xF8, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 !
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 "
+ 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x03, 0x00, 0xF8, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x03, 0x00, 0xF8, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 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, // Code for char #
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x18, 0x00, 0xF0, 0x0F, 0x30, 0x00, 0xF8, 0x1F, 0x30, 0x00, 0x3F, 0x3C, 0xF0, 0x03, 0x1F, 0x78, 0xF8, 0x03, 0x1F, 0xF0, 0xFF, 0x03, 0x38, 0xE0, 0x3F, 0x00, 0x00, 0xC0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char $
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x18, 0x30, 0x40, 0x00, 0x38, 0x38, 0x70, 0x00, 0xF0, 0x1F, 0x7E, 0x00, 0xE0, 0x8F, 0x0F, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xC0, 0xC7, 0x1F, 0x00, 0xF8, 0xE1, 0x3F, 0x00, 0x38, 0x70, 0x70, 0x00, 0x08, 0x30, 0x60, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char %
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xE0, 0xC3, 0x3F, 0x00, 0xF0, 0xEF, 0x3F, 0x00, 0xF8, 0x7F, 0x70, 0x00, 0x18, 0x7C, 0x60, 0x00, 0x18, 0xFC, 0x60, 0x00, 0xF8, 0xCF, 0x61, 0x00, 0xF0, 0x87, 0x33, 0x00, 0xE0, 0x03, 0x3F, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0xE0, 0x70, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x00, 0xE0, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0xFF, 0x01, 0xFE, 0x00, 0xF0, 0x07, 0x1F, 0x00, 0x80, 0x0F, 0x02, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x02, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x80, 0x0F, 0xFE, 0x00, 0xF0, 0x07, 0xF8, 0xFF, 0xFF, 0x01, 0xE0, 0xFF, 0x7F, 0x00, 0x00, 0xFE, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 )
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x30, 0x02, 0x00, 0x00, 0x60, 0x07, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xDC, 0x03, 0x00, 0x00, 0x60, 0x07, 0x00, 0x00, 0x30, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 *
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0xF0, 0x07, 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, 0x00, 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, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xC0, 0x0F, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0xFC, 0x3F, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x3F, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 /
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0xF0, 0xFF, 0x3F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0x60, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF0, 0xFF, 0x3F, 0x00, 0x80, 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, 0x00, 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
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 1
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x78, 0x00, 0x30, 0x00, 0x7F, 0x00, 0x18, 0xC0, 0x7F, 0x00, 0x18, 0xE0, 0x67, 0x00, 0x38, 0xFC, 0x60, 0x00, 0xF8, 0x7F, 0x60, 0x00, 0xF0, 0x1F, 0x60, 0x00, 0xE0, 0x07, 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, 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
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x18, 0x60, 0x00, 0x18, 0x18, 0x60, 0x00, 0x38, 0x1C, 0x60, 0x00, 0xF8, 0x7F, 0x70, 0x00, 0xF0, 0xF7, 0x3F, 0x00, 0xE0, 0xE3, 0x3F, 0x00, 0x00, 0x80, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 3
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x3E, 0x03, 0x00, 0xC0, 0x07, 0x03, 0x00, 0xF0, 0x00, 0x03, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x03, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 4
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xE0, 0x1F, 0x60, 0x00, 0xF8, 0x1F, 0x60, 0x00, 0xF8, 0x1F, 0x60, 0x00, 0x18, 0x38, 0x60, 0x00, 0x18, 0x78, 0x70, 0x00, 0x18, 0xF0, 0x3F, 0x00, 0x18, 0xE0, 0x1F, 0x00, 0x18, 0xC0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 5
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0xC0, 0xFF, 0x3F, 0x00, 0xE0, 0x1B, 0x70, 0x00, 0x70, 0x18, 0x60, 0x00, 0x38, 0x38, 0x70, 0x00, 0x18, 0xF8, 0x7F, 0x00, 0x18, 0xF0, 0x3F, 0x00, 0x00, 0xC0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 6
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x7C, 0x00, 0x18, 0xE0, 0x7F, 0x00, 0x18, 0xFE, 0x7F, 0x00, 0xD8, 0xFF, 0x03, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x0F, 0x00, 0xF0, 0xCF, 0x3F, 0x00, 0xF0, 0xEF, 0x3F, 0x00, 0x38, 0x7C, 0x70, 0x00, 0x18, 0x38, 0x60, 0x00, 0x18, 0x70, 0x60, 0x00, 0x38, 0xFC, 0x70, 0x00, 0xF0, 0xEF, 0x3F, 0x00, 0xF0, 0xC7, 0x3F, 0x00, 0xE0, 0x03, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 8
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0xF0, 0x3F, 0x60, 0x00, 0xF8, 0x7F, 0x70, 0x00, 0x18, 0x60, 0x38, 0x00, 0x18, 0x60, 0x3E, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0xF0, 0xFF, 0x07, 0x00, 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, 0x00, 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
+ 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x70, 0x00, 0x80, 0x03, 0x70, 0x00, 0x80, 0x03, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x03, 0xF0, 0x0F, 0x80, 0x03, 0xF0, 0x07, 0x80, 0x03, 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, 0x00, 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, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xB0, 0x01, 0x00, 0x00, 0xB8, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x1C, 0x07, 0x00, 0x00, 0x0C, 0x06, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x07, 0x1C, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char =
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x07, 0x1C, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x0C, 0x06, 0x00, 0x00, 0x1C, 0x07, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0xB8, 0x03, 0x00, 0x00, 0xB0, 0x01, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x18, 0xE0, 0x71, 0x00, 0x18, 0xF0, 0x71, 0x00, 0x18, 0xF8, 0x71, 0x00, 0x38, 0x3E, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0xE0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ?
+ 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x80, 0xFF, 0xFF, 0x00, 0xE0, 0x07, 0xF8, 0x01, 0xE0, 0x00, 0xC0, 0x03, 0x70, 0x00, 0x80, 0x03, 0x30, 0xF0, 0x07, 0x07, 0x38, 0xFC, 0x0F, 0x06, 0x18, 0xFE, 0x1F, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0xFE, 0x0F, 0x06, 0x18, 0xFE, 0x0F, 0x06, 0x18, 0xFE, 0x1F, 0x06, 0x38, 0x00, 0x18, 0x00, 0x30, 0x00, 0x18, 0x00, 0xF0, 0x00, 0x18, 0x00, 0xE0, 0x03, 0x1C, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0xFC, 0x01, 0x00, // Code for char @
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0xF8, 0xFF, 0x03, 0x00, 0xF8, 0x07, 0x03, 0x00, 0x38, 0x00, 0x03, 0x00, 0xF8, 0x07, 0x03, 0x00, 0xF8, 0xFF, 0x03, 0x00, 0xC0, 0xFF, 0x1F, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x18, 0x30, 0x60, 0x00, 0x18, 0x30, 0x60, 0x00, 0x18, 0x30, 0x60, 0x00, 0x18, 0x30, 0x60, 0x00, 0x38, 0x78, 0x60, 0x00, 0xF0, 0xFF, 0x30, 0x00, 0xE0, 0xCF, 0x3F, 0x00, 0xC0, 0xC7, 0x1F, 0x00, 0x00, 0x80, 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, // Code for char B
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x38, 0x00, 0x70, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0x60, 0x00, 0x38, 0x00, 0x70, 0x00, 0x10, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0x60, 0x00, 0x38, 0x00, 0x70, 0x00, 0x30, 0x00, 0x38, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0x00, 0xFE, 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, // Code for char D
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x18, 0x30, 0x60, 0x00, 0x18, 0x30, 0x60, 0x00, 0x18, 0x30, 0x60, 0x00, 0x18, 0x30, 0x60, 0x00, 0x18, 0x30, 0x60, 0x00, 0x18, 0x30, 0x60, 0x00, 0x18, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char E
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x18, 0x30, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, 0x18, 0x30, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char F
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x70, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0xE0, 0x7F, 0x00, 0x38, 0xE0, 0x7F, 0x00, 0x10, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 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, // Code for char H
+ 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x3F, 0x00, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char J
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0xC0, 0xC7, 0x03, 0x00, 0xF0, 0x81, 0x0F, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x38, 0x00, 0x7C, 0x00, 0x08, 0x00, 0x70, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char L
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x78, 0x00, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char M
+ 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF0, 0x01, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xF8, 0xFF, 0x3F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 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, // Code for char N
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x70, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0x60, 0x00, 0x38, 0x00, 0x70, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0x00, 0xFE, 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 O
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x18, 0x60, 0x00, 0x00, 0x18, 0x60, 0x00, 0x00, 0x18, 0x60, 0x00, 0x00, 0x18, 0x70, 0x00, 0x00, 0x70, 0x78, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0xC0, 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, 0x00, 0x00, // Code for char P
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x70, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0xE0, 0x01, 0x18, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xE0, 0x07, 0x38, 0x00, 0x70, 0x07, 0xF0, 0x00, 0x3C, 0x06, 0xE0, 0xFF, 0x1F, 0x0C, 0xC0, 0xFF, 0x0F, 0x0C, 0x00, 0xFE, 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 Q
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x18, 0x60, 0x00, 0x00, 0x18, 0x60, 0x00, 0x00, 0x18, 0x60, 0x00, 0x00, 0x18, 0xF0, 0x01, 0x00, 0x70, 0xF8, 0x07, 0x00, 0xF0, 0xBF, 0x3F, 0x00, 0xE0, 0x1F, 0x7E, 0x00, 0xC0, 0x0F, 0x78, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x20, 0x00, 0xE0, 0x0F, 0x70, 0x00, 0xF0, 0x1F, 0x60, 0x00, 0x38, 0x1C, 0x60, 0x00, 0x18, 0x38, 0x60, 0x00, 0x18, 0x70, 0x60, 0x00, 0x18, 0xF0, 0x70, 0x00, 0x18, 0xE0, 0x3F, 0x00, 0x18, 0xC0, 0x1F, 0x00, 0x10, 0x80, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char S
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char T
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0xF8, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0xF8, 0xFF, 0x3F, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0xF8, 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, // Code for char U
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0x03, 0x00, 0xC0, 0xFF, 0x7F, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0xC0, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x03, 0x00, 0xF8, 0x1F, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char V
+ 0x15, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0xFE, 0x01, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char W
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 0x38, 0x00, 0x78, 0x00, 0xF8, 0x01, 0x7E, 0x00, 0xF0, 0xC7, 0x3F, 0x00, 0xC0, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xC0, 0xFF, 0x07, 0x00, 0xF0, 0x87, 0x3F, 0x00, 0xF8, 0x01, 0x7E, 0x00, 0x38, 0x00, 0x70, 0x00, 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0D, 0x08, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x80, 0x3F, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x70, 0x00, 0x18, 0x00, 0x7C, 0x00, 0x18, 0x00, 0x7F, 0x00, 0x18, 0xC0, 0x7F, 0x00, 0x18, 0xF8, 0x63, 0x00, 0x18, 0xFE, 0x60, 0x00, 0x18, 0x3F, 0x60, 0x00, 0xD8, 0x0F, 0x60, 0x00, 0xF8, 0x03, 0x60, 0x00, 0xF8, 0x00, 0x60, 0x00, 0x38, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Z
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0x0F, 0x03, 0x00, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x0C, 0x03, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char [
+ 0x09, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0x00, 0xC0, 0x0F, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char BackSlash
+ 0x05, 0x03, 0x00, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 ]
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x3C, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ^
+ 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char _
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x38, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x82, 0x3F, 0x00, 0x00, 0xC3, 0x3F, 0x00, 0x00, 0xC3, 0x71, 0x00, 0x00, 0xC3, 0x60, 0x00, 0x00, 0xC3, 0x60, 0x00, 0x00, 0xC7, 0x60, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x70, 0x00, 0x00, 0x0F, 0x38, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0xF0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char b
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x0F, 0x78, 0x00, 0x00, 0x07, 0x70, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x03, 0x70, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0xCF, 0x78, 0x00, 0x00, 0xC3, 0x70, 0x00, 0x00, 0xC3, 0x60, 0x00, 0x00, 0xC3, 0x60, 0x00, 0x00, 0xC7, 0x60, 0x00, 0x00, 0xFE, 0x60, 0x00, 0x00, 0xFE, 0x30, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0xFE, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x07, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 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, 0x00, 0x00, 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
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0xFC, 0x0F, 0x06, 0x00, 0xFE, 0x1F, 0x0C, 0x00, 0x0E, 0x3C, 0x0C, 0x00, 0x07, 0x30, 0x0C, 0x00, 0x03, 0x30, 0x0C, 0x00, 0x03, 0x30, 0x0C, 0x00, 0x03, 0x30, 0x0E, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0x07, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char g
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, // Code for char h
+ 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xFF, 0x7F, 0x00, 0x1C, 0xFF, 0x7F, 0x00, 0x1C, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x05, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x1C, 0xFF, 0xFF, 0x0F, 0x1C, 0xFF, 0xFF, 0x07, 0x1C, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x00, 0x07, 0x7C, 0x00, 0x00, 0x01, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char k
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char m
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, // Code for char n
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x0F, 0x78, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x0F, 0x78, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0xF0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char o
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x07, 0x60, 0x00, 0x00, 0x0E, 0x78, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0xF0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char p
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x0E, 0x78, 0x00, 0x00, 0x07, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0xFE, 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, 0x00, 0x00, 0x00, 0x00, // Code for char q
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x30, 0x00, 0x00, 0x7E, 0x60, 0x00, 0x00, 0xFF, 0x60, 0x00, 0x00, 0xE3, 0x61, 0x00, 0x00, 0xC3, 0x71, 0x00, 0x00, 0x83, 0x7F, 0x00, 0x00, 0x07, 0x3F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0xF8, 0xFF, 0x3F, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x00, 0x03, 0x70, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x03, 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, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0xFF, 0x07, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char v
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0x00, 0xFF, 0x07, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 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, // Code for char w
+ 0x0A, 0x00, 0x01, 0x40, 0x00, 0x00, 0x07, 0x78, 0x00, 0x00, 0x1F, 0x7E, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x1F, 0x7E, 0x00, 0x00, 0x07, 0x70, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
+ 0x0A, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x7F, 0x00, 0x0C, 0x00, 0xFF, 0x07, 0x0E, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0xFE, 0x01, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0xFF, 0x07, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 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
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x70, 0x00, 0x00, 0x03, 0x7E, 0x00, 0x00, 0x83, 0x7F, 0x00, 0x00, 0xE3, 0x6F, 0x00, 0x00, 0xFB, 0x63, 0x00, 0x00, 0x7F, 0x60, 0x00, 0x00, 0x1F, 0x60, 0x00, 0x00, 0x07, 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, 0x00, 0x00, 0x00, 0x00, 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
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x03, 0xFE, 0x9F, 0xFF, 0x07, 0x07, 0x00, 0x00, 0x0E, 0x03, 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, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 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, 0x03, 0x00, 0x00, 0x0C, 0x07, 0x00, 0x00, 0x0E, 0xFF, 0x0F, 0xFF, 0x0F, 0xFE, 0x9F, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0x03, 0x00, 0xF0, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 }
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 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, 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, 0xFF, 0xFF, 0x7F, 0x00, 0x03, 0x00, 0x60, 0x00, 0x03, 0x00, 0x60, 0x00, 0x03, 0x00, 0x60, 0x00, 0x03, 0x00, 0x60, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Code for char
+ };
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/MAX30001/MAX30001.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,1317 @@
+
+/*******************************************************************************
+ * 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 "MAX30001.h"
+#include "Peripherals.h"
+
+MAX30001 *MAX30001::instance = NULL;
+
+
+//******************************************************************************
+MAX30001::MAX30001(PinName mosi, PinName miso, PinName sclk, PinName cs)
+{
+ m_spi = new SPI(mosi, miso, sclk);
+ m_cs = new DigitalOut(cs, 1);
+
+ m_spi->frequency(3000000);
+ spi_owner = true;
+ functionpointer = spiHandler;
+ onDataAvailableCallback = NULL;
+ instance = this;
+
+}
+
+
+//******************************************************************************
+MAX30001::MAX30001(SPI *spi, DigitalOut *cs)
+{
+ m_spi = spi;
+ m_cs = cs;
+ spi->frequency(3000000);
+ spi_owner = false;
+ functionpointer = spiHandler;
+ onDataAvailableCallback = NULL;
+ instance = this;
+
+
+}
+
+
+//******************************************************************************
+MAX30001::~MAX30001(void) {
+
+ if (spi_owner) {
+ delete m_spi;
+ delete m_cs;
+ }
+}
+
+//******************************************************************************
+int MAX30001::max30001_Rbias_FMSTR_Init(uint8_t En_rbias, uint8_t Rbiasv,
+ uint8_t Rbiasp, uint8_t Rbiasn,
+ uint8_t Fmstr) {
+ if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_gen.bit.en_rbias = En_rbias;
+ max30001_cnfg_gen.bit.rbiasv = Rbiasv;
+ max30001_cnfg_gen.bit.rbiasp = Rbiasp;
+ max30001_cnfg_gen.bit.rbiasn = Rbiasn;
+ max30001_cnfg_gen.bit.fmstr = Fmstr;
+
+ if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_CAL_InitStart(uint8_t En_Vcal, uint8_t Vmode,
+ uint8_t Vmag, uint8_t Fcal, uint16_t Thigh,
+ uint8_t Fifty) {
+ // CNFG_CAL
+ if (max30001_reg_read(CNFG_CAL, &max30001_cnfg_cal.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_cal.bit.vmode = Vmode;
+ max30001_cnfg_cal.bit.vmag = Vmag;
+ max30001_cnfg_cal.bit.fcal = Fcal;
+ max30001_cnfg_cal.bit.thigh = Thigh;
+ max30001_cnfg_cal.bit.fifty = Fifty;
+
+ if (max30001_reg_write(CNFG_CAL, max30001_cnfg_cal.all) == -1) {
+ return -1;
+ }
+
+ // RTOS uses a 32768HZ clock. 32768ticks represents 1secs. 1sec/10 =
+ // 100msecs.
+ wait(1.0 / 10.0);
+
+ if (max30001_reg_read(CNFG_CAL, &max30001_cnfg_cal.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_cal.bit.en_vcal = En_Vcal;
+
+ if (max30001_reg_write(CNFG_CAL, max30001_cnfg_cal.all) == -1) {
+ return -1;
+ }
+
+ // RTOS uses a 32768HZ clock. 32768ticks represents 1secs. 1sec/10 =
+ // 100msecs.
+ wait(1.0 / 10.0);
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_CAL_Stop(void) {
+
+ if (max30001_reg_read(CNFG_CAL, &max30001_cnfg_cal.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_cal.bit.en_vcal = 0; // Disable VCAL, all other settings are left unaffected
+
+ if (max30001_reg_write(CNFG_CAL, max30001_cnfg_cal.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+//******************************************************************************
+//******************************************************************************
+int MAX30001::max30001_INT_assignment(max30001_intrpt_Location_t en_enint_loc, max30001_intrpt_Location_t en_eovf_loc, max30001_intrpt_Location_t en_fstint_loc,
+ max30001_intrpt_Location_t en_dcloffint_loc, max30001_intrpt_Location_t en_bint_loc, max30001_intrpt_Location_t en_bovf_loc,
+ max30001_intrpt_Location_t en_bover_loc, max30001_intrpt_Location_t en_bundr_loc, max30001_intrpt_Location_t en_bcgmon_loc,
+ max30001_intrpt_Location_t en_pint_loc, max30001_intrpt_Location_t en_povf_loc, max30001_intrpt_Location_t en_pedge_loc,
+ max30001_intrpt_Location_t en_lonint_loc, max30001_intrpt_Location_t en_rrint_loc, max30001_intrpt_Location_t en_samp_loc,
+ max30001_intrpt_type_t intb_Type, max30001_intrpt_type_t int2b_Type)
+
+
+{
+ // INT1
+
+ pr_info("MAX30001::max30001_INT_assignment\r\n");
+ if (max30001_reg_read(EN_INT, &max30001_en_int.all) == -1) {
+ return -1;
+ }
+
+ // max30001_en_int2.bit.en_pint = 0b1; // Keep this off...
+
+ max30001_en_int.bit.en_eint = 0b1 & en_enint_loc;
+ max30001_en_int.bit.en_eovf = 0b1 & en_eovf_loc;
+ max30001_en_int.bit.en_fstint = 0b1 & en_fstint_loc;
+
+ max30001_en_int.bit.en_dcloffint = 0b1 & en_dcloffint_loc;
+ max30001_en_int.bit.en_bint = 0b1 & en_bint_loc;
+ max30001_en_int.bit.en_bovf = 0b1 & en_bovf_loc;
+
+ max30001_en_int.bit.en_bover = 0b1 & en_bover_loc;
+ max30001_en_int.bit.en_bundr = 0b1 & en_bundr_loc;
+ max30001_en_int.bit.en_bcgmon = 0b1 & en_bcgmon_loc;
+
+ max30001_en_int.bit.en_pint = 0b1 & en_pint_loc;
+ max30001_en_int.bit.en_povf = 0b1 & en_povf_loc;
+ max30001_en_int.bit.en_pedge = 0b1 & en_pedge_loc;
+
+ max30001_en_int.bit.en_lonint = 0b1 & en_lonint_loc;
+ max30001_en_int.bit.en_rrint = 0b1 & en_rrint_loc;
+ max30001_en_int.bit.en_samp = 0b1 & en_samp_loc;
+
+ max30001_en_int.bit.intb_type = intb_Type;
+
+ if (max30001_reg_write(EN_INT, max30001_en_int.all) == -1) {
+ return -1;
+ }
+
+ // INT2
+
+ if (max30001_reg_read(EN_INT2, &max30001_en_int2.all) == -1) {
+ return -1;
+ }
+
+ max30001_en_int2.bit.en_eint = 0b1 & (en_enint_loc >> 1);
+ max30001_en_int2.bit.en_eovf = 0b1 & (en_eovf_loc >> 1);
+ max30001_en_int2.bit.en_fstint = 0b1 & (en_fstint_loc >> 1);
+
+ max30001_en_int2.bit.en_dcloffint = 0b1 & (en_dcloffint_loc >> 1);
+ max30001_en_int2.bit.en_bint = 0b1 & (en_bint_loc >> 1);
+ max30001_en_int2.bit.en_bovf = 0b1 & (en_bovf_loc >> 1);
+
+ max30001_en_int2.bit.en_bover = 0b1 & (en_bover_loc >> 1);
+ max30001_en_int2.bit.en_bundr = 0b1 & (en_bundr_loc >> 1);
+ max30001_en_int2.bit.en_bcgmon = 0b1 & (en_bcgmon_loc >> 1);
+
+ max30001_en_int2.bit.en_pint = 0b1 & (en_pint_loc >> 1);
+ max30001_en_int2.bit.en_povf = 0b1 & (en_povf_loc >> 1);
+ max30001_en_int2.bit.en_pedge = 0b1 & (en_pedge_loc >> 1);
+
+ max30001_en_int2.bit.en_lonint = 0b1 & (en_lonint_loc >> 1);
+ max30001_en_int2.bit.en_rrint = 0b1 & (en_rrint_loc >> 1);
+ max30001_en_int2.bit.en_samp = 0b1 & (en_samp_loc >> 1);
+
+ max30001_en_int2.bit.intb_type = int2b_Type;
+
+ if (max30001_reg_write(EN_INT2, max30001_en_int2.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_ECG_InitStart(uint8_t En_ecg, uint8_t Openp,
+ uint8_t Openn, uint8_t Pol,
+ uint8_t Calp_sel, uint8_t Caln_sel,
+ uint8_t E_fit, uint8_t Rate, uint8_t Gain,
+ uint8_t Dhpf, uint8_t Dlpf) {
+
+ // CNFG_EMUX
+
+ pr_info("MAX30001::max30001_ECG_InitStart\r\n");
+ if (max30001_reg_read(CNFG_EMUX, &max30001_cnfg_emux.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_emux.bit.openp = Openp;
+ max30001_cnfg_emux.bit.openn = Openn;
+ max30001_cnfg_emux.bit.pol = Pol;
+ max30001_cnfg_emux.bit.calp_sel = Calp_sel;
+ max30001_cnfg_emux.bit.caln_sel = Caln_sel;
+
+ if (max30001_reg_write(CNFG_EMUX, max30001_cnfg_emux.all) == -1) {
+ return -1;
+ }
+
+ /**** ENABLE CHANNELS ****/
+ // CNFG_GEN
+
+ if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_gen.bit.en_ecg = En_ecg; // 0b1
+
+ // fmstr is default
+
+ if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ /**** Wait for PLL Lock & References to settle down ****/
+
+ max30001_timeout = 0;
+
+ do {
+ if (max30001_reg_read(STATUS, &max30001_status.all) == -1) // Wait and spin for PLL to lock...
+ {
+ return -1;
+ }
+ } while (max30001_status.bit.pllint == 1 && max30001_timeout++ <= 1000);
+
+ // MNGR_INT
+
+ if (max30001_reg_read(MNGR_INT, &max30001_mngr_int.all) == -1) {
+ return -1;
+ }
+
+ max30001_mngr_int.bit.e_fit = E_fit; // 31
+
+ if (max30001_reg_write(MNGR_INT, max30001_mngr_int.all) == -1) {
+ return -1;
+ }
+
+ // CNFG_ECG
+
+ if (max30001_reg_read(CNFG_ECG, &max30001_cnfg_ecg.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_ecg.bit.rate = Rate;
+ max30001_cnfg_ecg.bit.gain = Gain;
+ max30001_cnfg_ecg.bit.dhpf = Dhpf;
+ max30001_cnfg_ecg.bit.dlpf = Dlpf;
+
+ if (max30001_reg_write(CNFG_ECG, max30001_cnfg_ecg.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_ECGFast_Init(uint8_t Clr_Fast, uint8_t Fast, uint8_t Fast_Th) {
+ if (max30001_reg_read(MNGR_INT, &max30001_mngr_int.all) == -1) {
+ return -1;
+ }
+
+ pr_info("MAX30001::max30001_ECGFast_Init\r\n");
+ max30001_mngr_int.bit.clr_fast = Clr_Fast;
+
+ if (max30001_reg_write(MNGR_INT, max30001_mngr_int.all) == -1) {
+ return -1;
+ }
+
+ if (max30001_reg_read(MNGR_DYN, &max30001_mngr_dyn.all) == -1) {
+ return -1;
+ }
+
+ max30001_mngr_dyn.bit.fast = Fast;
+ max30001_mngr_dyn.bit.fast_th = Fast_Th;
+
+ if (max30001_reg_write(MNGR_INT, max30001_mngr_int.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_Stop_ECG(void) {
+
+ pr_info("MAX30001::max30001_Stop_ECG\r\n");
+
+ if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_gen.bit.en_ecg = 0; // Stop ECG
+
+ // fmstr is default
+
+ if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_PACE_InitStart(uint8_t En_pace, uint8_t Clr_pedge,
+ uint8_t Pol, uint8_t Gn_diff_off,
+ uint8_t Gain, uint8_t Aout_lbw,
+ uint8_t Aout, uint8_t Dacp,
+ uint8_t Dacn) {
+
+ /**** SET MASTER FREQUENCY, ENABLE CHANNELS ****/
+
+ // CNFG_GEN
+
+ if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_gen.bit.en_pace = En_pace; // 0b1;
+
+ if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ /**** Wait for PLL Lock & References to settle down ****/
+ max30001_timeout = 0;
+
+ do {
+ if (max30001_reg_read(STATUS, &max30001_status.all) ==
+ -1) // Wait and spin for PLL to lock...
+ {
+ return -1;
+ }
+
+ } while (max30001_status.bit.pllint == 1 && max30001_timeout++ <= 1000);
+
+ // MNGR_INT
+
+ if (max30001_reg_read(MNGR_INT, &max30001_mngr_int.all) == -1) {
+ return -1;
+ }
+
+ max30001_mngr_int.bit.clr_pedge = Clr_pedge; // 0b0;
+
+ if (max30001_reg_write(MNGR_INT, max30001_mngr_int.all) == -1) {
+ return -1;
+ }
+
+ /* Put: CNFG_PACE */
+
+ max30001_reg_read(CNFG_PACE, &max30001_cnfg_pace.all);
+
+ max30001_cnfg_pace.bit.pol = Pol;
+ max30001_cnfg_pace.bit.gn_diff_off = Gn_diff_off;
+ max30001_cnfg_pace.bit.gain = Gain;
+ max30001_cnfg_pace.bit.aout_lbw = Aout_lbw;
+ max30001_cnfg_pace.bit.aout = Aout;
+ max30001_cnfg_pace.bit.dacp = Dacp;
+ max30001_cnfg_pace.bit.dacn = Dacn;
+
+ max30001_reg_write(CNFG_PACE, max30001_cnfg_pace.all);
+
+ return 0;
+}
+//******************************************************************************
+int MAX30001::max30001_Stop_PACE(void) {
+
+ if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_gen.bit.en_pace = 0; // Stop PACE
+
+ if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_BIOZ_InitStart(
+ uint8_t En_bioz, uint8_t Openp, uint8_t Openn, uint8_t Calp_sel,
+ uint8_t Caln_sel, uint8_t CG_mode, uint8_t B_fit, uint8_t Rate,
+ uint8_t Ahpf, uint8_t Ext_rbias, uint8_t Gain, uint8_t Dhpf, uint8_t Dlpf,
+ uint8_t Fcgen, uint8_t Cgmon, uint8_t Cgmag, uint8_t Phoff, uint8_t Inapow_mode) {
+
+ // CNFG_BMUX
+
+ if (max30001_reg_read(CNFG_BMUX, &max30001_cnfg_bmux.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_bmux.bit.openp = Openp; // 0b1;
+ max30001_cnfg_bmux.bit.openn = Openn; // 0b1;
+ max30001_cnfg_bmux.bit.calp_sel = Calp_sel; // 0b10;
+ max30001_cnfg_bmux.bit.caln_sel = Caln_sel; // 0b11;
+ max30001_cnfg_bmux.bit.cg_mode = CG_mode; // 0b00;
+
+ if (max30001_reg_write(CNFG_BMUX, max30001_cnfg_bmux.all) == -1) {
+ return -1;
+ }
+
+ /**** SET MASTER FREQUENCY, ENABLE CHANNELS ****/
+
+ // CNFG_GEN
+
+ if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_gen.bit.en_bioz = En_bioz;
+
+ // fmstr is default
+
+ if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ /**** Wait for PLL Lock & References to settle down ****/
+
+ max30001_timeout = 0;
+
+ do {
+ if (max30001_reg_read(STATUS, &max30001_status.all) ==
+ -1) // Wait and spin for PLL to lock...
+ {
+ return -1;
+ }
+
+ } while (max30001_status.bit.pllint == 1 && max30001_timeout++ <= 1000);
+
+ /**** Start of CNFG_BIOZ ****/
+
+ // MNGR_INT
+
+ if (max30001_reg_read(MNGR_INT, &max30001_mngr_int.all) == -1) {
+ return -1;
+ }
+
+ max30001_mngr_int.bit.b_fit = B_fit; //;
+
+ if (max30001_reg_write(MNGR_INT, max30001_mngr_int.all) == -1) {
+ return -1;
+ }
+
+ // CNFG_BIOZ
+
+ if (max30001_reg_read(CNFG_BIOZ, &max30001_cnfg_bioz.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_bioz.bit.rate = Rate;
+ max30001_cnfg_bioz.bit.ahpf = Ahpf;
+ max30001_cnfg_bioz.bit.ext_rbias = Ext_rbias;
+ max30001_cnfg_bioz.bit.gain = Gain;
+ max30001_cnfg_bioz.bit.dhpf = Dhpf;
+ max30001_cnfg_bioz.bit.dlpf = Dlpf;
+ max30001_cnfg_bioz.bit.fcgen = Fcgen;
+ max30001_cnfg_bioz.bit.cgmon = Cgmon;
+ max30001_cnfg_bioz.bit.cgmag = Cgmag;
+ max30001_cnfg_bioz.bit.phoff = Phoff;
+ max30001_cnfg_bioz.bit.inapow_mode = Inapow_mode;
+
+ if (max30001_reg_write(CNFG_BIOZ, max30001_cnfg_bioz.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_Stop_BIOZ(void) {
+
+ if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_gen.bit.en_bioz = 0; // Stop BIOZ
+
+ if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_BIOZ_InitBist(uint8_t En_bist, uint8_t Rnom,
+ uint8_t Rmod, uint8_t Fbist) {
+
+ // CNFG_BMUX
+
+ if (max30001_reg_read(CNFG_BMUX, &max30001_cnfg_bmux.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_bmux.bit.en_bist = En_bist;
+ max30001_cnfg_bmux.bit.rnom = Rnom;
+ max30001_cnfg_bmux.bit.rmod = Rmod;
+ max30001_cnfg_bmux.bit.fbist = Fbist;
+
+ if (max30001_reg_write(CNFG_BMUX, max30001_cnfg_bmux.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+//******************************************************************************
+int MAX30001::max30001_RtoR_InitStart(uint8_t En_rtor, uint8_t Wndw,
+ uint8_t Gain, uint8_t Pavg, uint8_t Ptsf,
+ uint8_t Hoff, uint8_t Ravg, uint8_t Rhsf,
+ uint8_t Clr_rrint) {
+
+ // MNGR_INT
+
+ if (max30001_reg_read(MNGR_INT, &max30001_mngr_int.all) == -1) {
+ return -1;
+ }
+
+ max30001_mngr_int.bit.clr_rrint =
+ Clr_rrint; // 0b01 & 0b00 are for interrupt mode...
+ // 0b10 is for monitoring mode... it just overwrites the data...
+
+ if (max30001_reg_write(MNGR_INT, max30001_mngr_int.all) == -1) {
+ return -1;
+ }
+
+ // RTOR1
+ if (max30001_reg_read(CNFG_RTOR1, &max30001_cnfg_rtor1.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_rtor1.bit.wndw = Wndw;
+ max30001_cnfg_rtor1.bit.gain = Gain;
+ max30001_cnfg_rtor1.bit.en_rtor = En_rtor;
+ max30001_cnfg_rtor1.bit.pavg = Pavg;
+ max30001_cnfg_rtor1.bit.ptsf = Ptsf;
+
+ if (max30001_reg_write(CNFG_RTOR1, max30001_cnfg_rtor1.all) == -1) {
+ return -1;
+ }
+ // RTOR2
+
+ if (max30001_reg_read(CNFG_RTOR2, &max30001_cnfg_rtor2.all) == -1) {
+ return -1;
+ }
+ max30001_cnfg_rtor2.bit.hoff = Hoff;
+ max30001_cnfg_rtor2.bit.ravg = Ravg;
+ max30001_cnfg_rtor2.bit.rhsf = Rhsf;
+
+ if (max30001_reg_write(CNFG_RTOR2, max30001_cnfg_rtor2.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_Stop_RtoR(void) {
+
+ if (max30001_reg_read(CNFG_RTOR1, &max30001_cnfg_rtor1.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_rtor1.bit.en_rtor = 0; // Stop RtoR
+
+ if (max30001_reg_write(CNFG_RTOR1, max30001_cnfg_rtor1.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_PLL_lock(void) {
+ // Spin to see PLLint become zero to indicate a lock.
+
+ max30001_timeout = 0;
+
+ do {
+ if (max30001_reg_read(STATUS, &max30001_status.all) ==
+ -1) // Wait and spin for PLL to lock...
+ {
+ return -1;
+ }
+
+ } while (max30001_status.bit.pllint == 1 && max30001_timeout++ <= 1000);
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_sw_rst(void) {
+ // SW reset for the MAX30001 chip
+
+ if (max30001_reg_write(SW_RST, 0x000000) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_synch(void) { // For synchronization
+ if (max30001_reg_write(SYNCH, 0x000000) == -1) {
+ return -1;
+ }
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max300001_fifo_rst(void) { // Resets the FIFO
+ if (max30001_reg_write(FIFO_RST, 0x000000) == -1) {
+ return -1;
+ }
+ return 0;
+}
+
+//******************************************************************************
+// int MAX30001::max30001_reg_write(uint8_t addr, uint32_t data)
+int MAX30001::max30001_reg_write(MAX30001_REG_map_t addr, uint32_t data) {
+
+ uint8_t result[4];
+ uint8_t data_array[4];
+ int32_t success = 0;
+
+ data_array[0] = (addr << 1) & 0xff;
+
+ data_array[3] = data & 0xff;
+ data_array[2] = (data >> 8) & 0xff;
+ data_array[1] = (data >> 16) & 0xff;
+
+ success = SPI_Transmit(&data_array[0], 4, &result[0], 4);
+
+ //pr_info("MAX30001 write\treg[0x%.2X]=0x%X\r\n", addr, data);
+
+ if (success != 0) {
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
+//******************************************************************************
+// int MAX30001::max30001_reg_read(uint8_t addr, uint32_t *return_data)
+int MAX30001::max30001_reg_read(MAX30001_REG_map_t addr,
+ uint32_t *return_data) {
+ uint8_t result[4];
+ uint8_t data_array[1];
+ int32_t success = 0;
+
+ data_array[0] = ((addr << 1) & 0xff) | 1; // For Read, Or with 1
+ success = SPI_Transmit(&data_array[0], 1, &result[0], 4);
+ *return_data = /*result[0] + */ (uint32_t)(result[1] << 16) +
+ (result[2] << 8) + result[3];
+
+ //pr_info("MAX30001 read\treg[0x%.2X]=0x%X\r\n", addr, *return_data);
+
+ if (success != 0) {
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
+//******************************************************************************
+int MAX30001::max30001_Enable_DcLeadOFF_Init(int8_t En_dcloff, int8_t Ipol,
+ int8_t Imag, int8_t Vth) {
+ // the leads are not touching the body
+
+ // CNFG_EMUX, Set ECGP and ECGN for external hook up...
+
+ if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_gen.bit.en_dcloff = En_dcloff;
+ max30001_cnfg_gen.bit.ipol = Ipol;
+ max30001_cnfg_gen.bit.imag = Imag;
+ max30001_cnfg_gen.bit.vth = Vth;
+
+ if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_Disable_DcLeadOFF(void) {
+ if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_gen.bit.en_dcloff = 0; // Turned off the dc lead off.
+
+ if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_BIOZ_Enable_ACLeadOFF_Init(uint8_t En_bloff,
+ uint8_t Bloff_hi_it,
+ uint8_t Bloff_lo_it) {
+
+ // CNFG_GEN
+ if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_gen.bit.en_bloff = En_bloff;
+
+ if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ // MNGR_DYN
+ if (max30001_reg_read(MNGR_DYN, &max30001_mngr_dyn.all) == -1) {
+ return -1;
+ }
+
+ max30001_mngr_dyn.bit.bloff_hi_it = Bloff_hi_it;
+ max30001_mngr_dyn.bit.bloff_lo_it = Bloff_lo_it;
+
+ if (max30001_reg_write(MNGR_DYN, max30001_mngr_dyn.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_BIOZ_Disable_ACleadOFF(void) {
+ // CNFG_GEN
+ if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_gen.bit.en_bloff = 0b0; // Turns of the BIOZ AC Lead OFF feature
+
+ if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+//******************************************************************************
+int MAX30001::max30001_BIOZ_Enable_BCGMON(void) {
+ // CNFG_BIOZ
+ if (max30001_reg_read(CNFG_BIOZ, &max30001_cnfg_bioz.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_bioz.bit.cgmon = 1;
+
+ if (max30001_reg_write(CNFG_BIOZ, max30001_cnfg_bioz.all) == -1) {
+ return -1;
+ }
+
+ max30001_reg_read(CNFG_BIOZ, &max30001_cnfg_bioz.all);
+
+ return 0;
+}
+
+#if 1
+//******************************************************************************
+int MAX30001::max30001_Enable_LeadON(int8_t Channel) // Channel: ECG = 0b01, BIOZ = 0b10, Disable = 0b00
+{
+
+ if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_gen.bit.en_ecg = 0b0;
+ max30001_cnfg_gen.bit.en_bioz = 0b0;
+ max30001_cnfg_gen.bit.en_pace = 0b0;
+
+ max30001_cnfg_gen.bit.en_ulp_lon = Channel; // BIOZ ULP lead on detection...
+
+ if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all);
+
+ max30001_reg_read(STATUS, &max30001_status.all);
+
+ return 0;
+}
+//******************************************************************************
+int MAX30001::max30001_Disable_LeadON(void) {
+
+ if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ max30001_cnfg_gen.bit.en_ulp_lon = 0b0;
+
+ if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+#endif
+//******************************************************************************
+#define LEADOFF_SERVICE_TIME 0x2000 // 0x1000 = 1 second
+#define LEADOFF_NUMSTATES 2
+uint32_t leadoffState = 0;
+uint32_t max30001_LeadOffoldTime = 0;
+void MAX30001::max30001_ServiceLeadoff(uint32_t currentTime) {
+
+ uint32_t delta_Time;
+
+ delta_Time = currentTime - max30001_LeadOffoldTime;
+
+ if (delta_Time > LEADOFF_SERVICE_TIME) {
+ switch (leadoffState) {
+ case 0: /* switch to ECG DC Lead OFF */
+ max30001_Enable_DcLeadOFF_Init(0b01, 0b0, 0b001, 0b00);
+ break;
+
+ case 1: /* switch to BIOZ DC Lead OFF */
+ max30001_Enable_DcLeadOFF_Init(0b10, 0b0, 0b001, 0b00);
+ break;
+ }
+
+ leadoffState++;
+ leadoffState %= LEADOFF_NUMSTATES;
+
+ max30001_LeadOffoldTime = currentTime;
+ }
+}
+//******************************************************************************
+#define LEADON_SERVICE_TIME 0x2000 // 0x1000 = 1 second
+#define LEADON_NUMSTATES 2
+uint32_t leadOnState = 0;
+uint32_t max30001_LeadOnoldTime = 0;
+void MAX30001::max30001_ServiceLeadON(uint32_t currentTime) {
+
+ uint32_t delta_Time;
+
+ delta_Time = currentTime - max30001_LeadOnoldTime;
+
+ if (delta_Time > LEADON_SERVICE_TIME) {
+ switch (leadOnState) {
+ case 0: /* switch to ECG DC Lead ON */
+ max30001_Enable_LeadON(0b01);
+ break;
+
+ case 1: /* switch to BIOZ DC Lead ON */
+ max30001_Enable_LeadON(0b10);
+ break;
+ }
+
+ leadOnState++;
+ leadOnState %= LEADON_NUMSTATES;
+
+ max30001_LeadOnoldTime = currentTime;
+ }
+}
+
+//******************************************************************************
+int MAX30001::max30001_FIFO_LeadONOff_Read(void) {
+
+ uint8_t result[32 * 3]; // 32words - 3bytes each
+ uint8_t paceResult[6 * 3];
+ uint8_t data_array[4];
+ int32_t success = 0;
+ int i, j;
+
+ uint32_t total_databytes;
+ uint8_t i_index;
+ uint8_t data_chunk;
+ uint8_t loop_logic;
+
+ uint8_t etag = 0;
+ uint8_t ptag = 0;
+ uint8_t btag = 0;
+
+ uint8_t adr;
+
+ //int8_t ReadAllPaceOnce;
+ bool anyPaceDetected = false;
+ static uint8_t dcloffint_OneShot = 0;
+ static uint8_t acloffint_OneShot = 0;
+ static uint8_t bcgmon_OneShot = 0;
+ static uint8_t acleadon_OneShot = 0;
+
+ int8_t ret_val;
+
+ pr_info("MAX30001::max30001_FIFO_LeadONOff_Read\r\n");
+
+ if (max30001_status.bit.eint == 1) {
+ adr = ECG_FIFO_BURST;
+ data_array[0] = ((adr << 1) & 0xff) | 1;
+
+ // The SPI routine only sends out data of 32 bytes in size. Therefore the
+ // data is being read in
+ // smaller chunks in this routine...
+
+ total_databytes = (max30001_mngr_int.bit.e_fit + 1) * 3;
+
+ i_index = 0;
+ loop_logic = 1;
+
+ while (loop_logic) {
+ if (total_databytes > 30) {
+ data_chunk = 30;
+ total_databytes = total_databytes - 30;
+ } else {
+ data_chunk = total_databytes;
+ loop_logic = 0;
+ }
+
+ /* The extra 1 byte is for the extra byte that comes out of the SPI */
+ success = SPI_Transmit(&data_array[0], 1, &result[i_index], (data_chunk + 1)); // Make a copy of the FIFO over here...
+
+ if (success != 0) {
+ return -1;
+ }
+
+ /* This is important, because every transaction above creates an empty
+ * redundant data at result[0] */
+ for (j = i_index; j < (data_chunk + i_index); j++) /* get rid of the 1 extra byte by moving the whole array up one */
+ {
+ result[j] = result[j + 1];
+ }
+
+ i_index = i_index + 30; /* point to the next array location to put the data in */
+ }
+
+ //ReadAllPaceOnce = 0;
+
+ /* Put the content of the FIFO based on the EFIT value, We ignore the
+ * result[0] and start concatenating indexes: 1,2,3 - 4,5,6 - 7,8,9 - */
+ for (i = 0, j = 0; i < max30001_mngr_int.bit.e_fit + 1; i++, j = j + 3) // index1=23-16 bit, index2=15-8 bit, index3=7-0 bit
+ {
+ max30001_ECG_FIFO_buffer[i] = ((uint32_t)result[j] << 16) + (result[j + 1] << 8) + result[j + 2];
+
+ etag = (0b00111000 & result[j + 2]) >> 3;
+ ptag = 0b00000111 & result[j + 2];
+
+ if (ptag != 0b111 ){//&& ReadAllPaceOnce == 0) {
+
+ //ReadAllPaceOnce = 1; // This will prevent extra read of PACE, once group
+ // 0-5 is read ONCE.
+ readPace(ptag, paceResult); // BUG: result data from ECG is being overwritten by the PACE data
+ anyPaceDetected = true;
+ }
+ }
+
+ if (anyPaceDetected)
+ dataAvailable(MAX30001_DATA_PACE, max30001_PACE, 18); // Send out the Pace data once only
+
+ if (etag != 0b110) {
+
+ dataAvailable(MAX30001_DATA_ECG, max30001_ECG_FIFO_buffer, (max30001_mngr_int.bit.e_fit + 1));
+ }
+
+ } /* End of ECG init */
+
+ /* RtoR */
+
+ if (max30001_status.bit.rrint == 1) {
+ if (max30001_reg_read(RTOR, &max30001_RtoR_data) == -1) {
+ return -1;
+ }
+
+ max30001_RtoR_data = (0x00FFFFFF & max30001_RtoR_data) >> 10;
+
+ hspValMax30001.R2R = (uint16_t)max30001_RtoR_data;
+ hspValMax30001.fmstr = (uint16_t)max30001_cnfg_gen.bit.fmstr;
+
+ dataAvailable(MAX30001_DATA_RTOR, &max30001_RtoR_data, 1);
+ }
+
+ // Handling BIOZ data...
+
+ if (max30001_status.bit.bint == 1) {
+ adr = 0x22;
+ data_array[0] = ((adr << 1) & 0xff) | 1;
+
+ /* [(BFIT+1)*3byte]+1extra byte due to the addr */
+
+ if (SPI_Transmit(&data_array[0], 1, &result[0],((max30001_mngr_int.bit.b_fit + 1) * 3) + 1) == -1) // Make a copy of the FIFO over here...
+
+ {
+ return -1;
+ }
+
+ btag = 0b00000111 & result[3];
+
+ /* Put the content of the FIFO based on the BFIT value, We ignore the
+ * result[0] and start concatenating indexes: 1,2,3 - 4,5,6 - 7,8,9 - */
+ for (i = 0, j = 0; i < max30001_mngr_int.bit.b_fit + 1; i++, j = j + 3) // index1=23-16 bit, index2=15-8 bit, index3=7-0 bit
+ {
+ max30001_BIOZ_FIFO_buffer[i] = ((uint32_t)result[j + 1] << 16) + (result[j + 2] << 8) + result[j + 3];
+ }
+
+ if (btag != 0b110) {
+ dataAvailable(MAX30001_DATA_BIOZ, max30001_BIOZ_FIFO_buffer, 8);
+ }
+ }
+
+ ret_val = 0;
+
+ if (max30001_status.bit.dcloffint == 1) // ECG/BIOZ Lead Off
+ {
+ dcloffint_OneShot = 1;
+ max30001_DCLeadOff = 0;
+ max30001_DCLeadOff = max30001_DCLeadOff | (max30001_cnfg_gen.bit.en_dcloff << 8) | (max30001_status.all & 0x00000F);
+ dataAvailable(MAX30001_DATA_LEADOFF_DC, &max30001_DCLeadOff, 1);
+
+ ret_val = 0b100;
+
+ } else if (dcloffint_OneShot == 1 && max30001_status.bit.dcloffint == 0) // Just send once when it comes out of dc lead off
+ {
+ max30001_DCLeadOff = 0;
+ max30001_DCLeadOff = max30001_DCLeadOff | (max30001_cnfg_gen.bit.en_dcloff << 8) | (max30001_status.all & 0x00000F);
+ dataAvailable(MAX30001_DATA_LEADOFF_DC, &max30001_DCLeadOff, 1);
+ dcloffint_OneShot = 0;
+ }
+
+ if (max30001_status.bit.bover == 1 || max30001_status.bit.bundr == 1) // BIOZ AC Lead Off
+ {
+ acloffint_OneShot = 1;
+ max30001_ACLeadOff = 0;
+ max30001_ACLeadOff =
+ max30001_ACLeadOff | ((max30001_status.all & 0x030000) >> 16);
+ dataAvailable(MAX30001_DATA_LEADOFF_AC, &max30001_ACLeadOff, 1);
+
+ ret_val = 0b1000;
+ } else if (acloffint_OneShot == 1 && max30001_status.bit.bover == 0 && max30001_status.bit.bundr == 0) // Just send once when it comes out of ac lead off
+ {
+ max30001_ACLeadOff = 0;
+ max30001_ACLeadOff = max30001_ACLeadOff | ((max30001_status.all & 0x030000) >> 16);
+ dataAvailable(MAX30001_DATA_LEADOFF_AC, &max30001_ACLeadOff, 1);
+ acloffint_OneShot = 0;
+ }
+
+ if (max30001_status.bit.bcgmon == 1) // BIOZ BCGMON check
+ {
+ bcgmon_OneShot = 1;
+ max30001_bcgmon = 0;
+ max30001_bcgmon = max30001_bcgmon | ((max30001_status.all & 0x000030) >> 4);
+ dataAvailable(MAX30001_DATA_BCGMON, &max30001_bcgmon, 1);
+
+ ret_val = 0b10000;
+ } else if (bcgmon_OneShot == 1 && max30001_status.bit.bcgmon == 0) {
+ max30001_bcgmon = 0;
+ max30001_bcgmon = max30001_bcgmon | ((max30001_status.all & 0x000030) >> 4);
+ bcgmon_OneShot = 0;
+ dataAvailable(MAX30001_DATA_BCGMON, &max30001_bcgmon, 1);
+ }
+
+#if 0
+if(max30001_status.bit.lonint == 1) // AC LeadON Check
+{
+ max30001_LeadOn = 0;
+ max30001_reg_read(STATUS,&max30001_status.all); // Reading is important
+ max30001_LeadOn = max30001_LeadOn | (max30001_cnfg_gen.bit.en_ulp_lon << 8) | ((max30001_status.all & 0x000800) >> 11); // 0b01 will mean ECG Lead On, 0b10 will mean BIOZ Lead On
+ // LEAD ON has been detected... Now take actions
+}
+#endif
+
+ if (max30001_status.bit.lonint == 1 &&
+ acleadon_OneShot == 0) // AC LeadON Check, when lead is on
+ {
+ max30001_LeadOn = 0;
+ max30001_reg_read(STATUS, &max30001_status.all); // Reading is important
+ max30001_LeadOn =
+ max30001_LeadOn | (max30001_cnfg_gen.bit.en_ulp_lon << 8) |
+ ((max30001_status.all & 0x000800) >>
+ 11); // 0b01 will mean ECG Lead On, 0b10 will mean BIOZ Lead On
+
+ // LEAD ON has been detected... Now take actions
+ acleadon_OneShot = 1;
+ dataAvailable(MAX30001_DATA_ACLEADON, &max30001_LeadOn, 1); // One shot data will be sent...
+ } else if (max30001_status.bit.lonint == 0 && acleadon_OneShot == 1) {
+ max30001_LeadOn = 0;
+ max30001_reg_read(STATUS, &max30001_status.all);
+ max30001_LeadOn =
+ max30001_LeadOn | (max30001_cnfg_gen.bit.en_ulp_lon << 8) | ((max30001_status.all & 0x000800) >> 11); // 0b01 will mean ECG Lead On, 0b10 will mean BIOZ Lead On
+ dataAvailable(MAX30001_DATA_ACLEADON, &max30001_LeadOn, 1); // One shot data will be sent...
+ acleadon_OneShot = 0;
+ }
+
+ return ret_val;
+}
+
+//******************************************************************************
+uint32_t MAX30001::readPace(int group, uint8_t* result) {
+ uint8_t data_array[4];
+ uint32_t success;
+ int adr = PACE0_FIFO_BURST + group*4;
+
+ if (group >= 6)
+ return (uint32_t)-1;
+
+ data_array[0] = ((adr << 1) & 0xff) | 1; // For Read Or with 1
+ success = SPI_Transmit(&data_array[0], 1, &result[0], 10);
+
+ max30001_PACE[group * 3 + 0] = (uint32_t)(result[1] << 16) + (result[2] << 8) + result[3];
+ max30001_PACE[group * 3 + 1] = (uint32_t)(result[4] << 16) + (result[5] << 8) + result[6];
+ max30001_PACE[group * 3 + 2] = (uint32_t)(result[7] << 16) + (result[8] << 8) + result[9];
+
+ return success;
+}
+
+//******************************************************************************
+
+//******************************************************************************
+
+int MAX30001::max30001_int_handler(void) {
+
+ static uint32_t InitReset = 0;
+
+ int8_t return_value;
+ bool check_one_more = true;
+
+ status_check:
+ max30001_reg_read(STATUS, &max30001_status.all);
+
+ // Inital Reset and any FIFO over flow invokes a FIFO reset
+ if (InitReset == 0 || max30001_status.bit.eovf == 1 || max30001_status.bit.bovf == 1) {
+ // Do a FIFO Reset
+ max30001_reg_write(FIFO_RST, 0x000000);
+
+ InitReset++;
+ return 2;
+ }
+
+ return_value = 0;
+
+ // The four data handling goes on over here
+ if (max30001_status.bit.eint == 1 || max30001_status.bit.pint == 1 || max30001_status.bit.bint == 1 || max30001_status.bit.rrint == 1
+ || max30001_status.bit.dcloffint == 1 || max30001_status.bit.bover == 1 || max30001_status.bit.bundr == 1
+ || max30001_status.bit.bcgmon == 1 || max30001_status.bit.lonint == 1) {
+ return_value = return_value | max30001_FIFO_LeadONOff_Read();
+ }
+/*
+ // ECG/BIOZ DC Lead Off test
+ if (max30001_status.bit.dcloffint == 1) {
+ return_value = return_value | max30001_FIFO_LeadONOff_Read();
+ }
+
+ // BIOZ AC Lead Off test
+ if (max30001_status.bit.bover == 1 || max30001_status.bit.bundr == 1) {
+ return_value = return_value | max30001_FIFO_LeadONOff_Read();
+ }
+
+ // BIOZ DRVP/N test using BCGMON.
+ if (max30001_status.bit.bcgmon == 1) {
+ return_value = return_value | max30001_FIFO_LeadONOff_Read();
+ }
+
+ if (max30001_status.bit.lonint == 1) // ECG Lead ON test: i.e. the leads are touching the body...
+ {
+
+ max30001_FIFO_LeadONOff_Read();
+ }
+*/
+ if (check_one_more) {
+ check_one_more = false;
+ goto status_check;
+ }
+ return return_value;
+}
+
+/// function pointer to the async callback
+static event_callback_t functionpointer;
+/// flag used to indicate an async xfer has taken place
+static volatile int xferFlag = 0;
+
+/**
+* @brief Callback handler for SPI async events
+* @param events description of event that occurred
+*/
+
+
+static void spiHandler(int events) { xferFlag = 1; }
+
+/**
+* @brief Transmit and recieve QUAD SPI data
+* @param tx_buf pointer to transmit byte buffer
+* @param tx_size number of bytes to transmit
+* @param rx_buf pointer to the recieve buffer
+* @param rx_size number of bytes to recieve
+*/
+int MAX30001::SPI_Transmit(const uint8_t *tx_buf, uint32_t tx_size, uint8_t *rx_buf, uint32_t rx_size)
+{
+ m_cs->write(0);
+ for(uint32_t i = 0; i < tx_size; i++)
+ {
+ m_spi->write(tx_buf[i]);
+ }
+ for(uint32_t i = 0; i < (rx_size - tx_size); i++)
+ {
+ rx_buf[i + 1] = m_spi->write(0xFF);
+ }
+ m_cs->write(1);
+
+ return 0;
+}
+
+//******************************************************************************
+void MAX30001::max30001_ReadHeartrateData(max30001_t *_hspValMax30001) {
+ _hspValMax30001->R2R = hspValMax30001.R2R;
+ _hspValMax30001->fmstr = hspValMax30001.fmstr;
+}
+
+//******************************************************************************
+void MAX30001::onDataAvailable(PtrFunction _onDataAvailable) {
+ onDataAvailableCallback = _onDataAvailable;
+}
+
+/**
+* @brief Used to notify an external function that interrupt data is available
+* @param id type of data available
+* @param buffer 32-bit buffer that points to the data
+* @param length length of 32-bit elements available
+*/
+void MAX30001::dataAvailable(uint32_t id, uint32_t *buffer, uint32_t length) {
+ if (onDataAvailableCallback != NULL) {
+ (*onDataAvailableCallback)(id, buffer, length);
+ }
+}
+/**
+* @brief Callback handler for SPI async events
+* @param events description of event that occurred
+*/
+void MAX30001::spiHandler(int events) { xferFlag = 1; }
+
+//******************************************************************************
+static int allowInterrupts = 0;
+
+void MAX30001Mid_IntB_Handler(void) {
+ if (allowInterrupts == 0) return;
+ //MAX30001::instance->max30001_int_handler();
+ MAX30001::instance->m_max30001_int_happened_ = true;
+}
+
+void MAX30001Mid_Int2B_Handler(void) {
+ if (allowInterrupts == 0) return;
+ //MAX30001::instance->max30001_int_handler();
+ MAX30001::instance->m_max30001_int_happened_ = true;
+}
+
+void MAX30001_AllowInterrupts(int state) {
+ allowInterrupts = state;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/MAX30001/MAX30001.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,1089 @@
+/*******************************************************************************
+* Copyright (C) 2015 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.
+*******************************************************************************/
+/*
+ * max30001.h
+ *
+ * Created on: Oct 9, 2015
+ * Author: faisal.tariq
+ */
+
+#ifndef MAX30001_H_
+#define MAX30001_H_
+
+#include "mbed.h"
+#include "USBSerial.h"
+
+#define mbed_COMPLIANT // Uncomment to Use timer for MAX30001 FCLK (for mbed)
+ // Comment to use the RTC clock
+
+
+
+#define ASYNC_SPI_BUFFER_SIZE (32 * 3) // Maximimum buffer size for async byte transfers
+
+// Defines for data callbacks
+#define MAX30001_DATA_ECG 0x30
+#define MAX30001_DATA_PACE 0x31
+#define MAX30001_DATA_RTOR 0x32
+#define MAX30001_DATA_BIOZ 0x33
+#define MAX30001_DATA_LEADOFF_DC 0x34
+#define MAX30001_DATA_LEADOFF_AC 0x35
+#define MAX30001_DATA_BCGMON 0x36
+#define MAX30001_DATA_ACLEADON 0x37
+
+#define MAX30001_SPI_MASTER_PORT 0
+#define MAX30001_SPI_SS_INDEX 0
+
+#define MAX30001_INT_PORT_B 3
+#define MAX30001_INT_PIN_B 6
+
+#define MAX30001_INT_PORT_2B 4
+#define MAX30001_INT_PIN_2B 5
+
+#define MAX30001_INT_PORT_FCLK 1
+#define MAX30001_INT_PIN_FCLK 7
+
+#define MAX30001_FUNC_SEL_TMR 2 // 0=FW Control, 1= Pulse Train, 2=Timer
+
+#define MAX30001_INDEX 3
+#define MAX30001_POLARITY 0
+#define MAX30001_PERIOD 30518
+#define MAX30001_CYCLE 50
+
+#define MAX30001_IOMUX_IO_ENABLE 1
+
+#define MAX30001_SPI_PORT 0
+#define MAX30001_CS_PIN 0
+#define MAX30001_CS_POLARITY 0
+#define MAX30001_CS_ACTIVITY_DELAY 0
+#define MAX30001_CS_INACTIVITY_DELAY 0
+#define MAX30001_CLK_HI 1
+#define MAX30001_CLK_LOW 1
+#define MAX30001_ALT_CLK 0
+#define MAX30001_CLK_POLARITY 0
+#define MAX30001_CLK_PHASE 0
+#define MAX30001_WRITE 1
+#define MAX30001_READ 0
+
+#define MAX30001_INT_PORT_B 3
+#define MAX30001INT_PIN_B 6
+
+void MAX30001_AllowInterrupts(int state);
+
+/**
+* Maxim Integrated MAX30001 ECG/BIOZ chip
+*/
+class MAX30001 {
+
+public:
+ typedef enum { // MAX30001 Register addresses
+ STATUS = 0x01,
+ EN_INT = 0x02,
+ EN_INT2 = 0x03,
+ MNGR_INT = 0x04,
+ MNGR_DYN = 0x05,
+ SW_RST = 0x08,
+ SYNCH = 0x09,
+ FIFO_RST = 0x0A,
+ INFO = 0x0F,
+ CNFG_GEN = 0x10,
+ CNFG_CAL = 0x12,
+ CNFG_EMUX = 0x14,
+ CNFG_ECG = 0x15,
+ CNFG_BMUX = 0x17,
+ CNFG_BIOZ = 0x18,
+ CNFG_PACE = 0x1A,
+ CNFG_RTOR1 = 0x1D,
+ CNFG_RTOR2 = 0x1E,
+
+ // Data locations
+ ECG_FIFO_BURST = 0x20,
+ ECG_FIFO = 0x21,
+ FIFO_BURST = 0x22,
+ BIOZ_FIFO = 0x23,
+ RTOR = 0x25,
+
+ PACE0_FIFO_BURST = 0x30,
+ PACE0_A = 0x31,
+ PACE0_B = 0x32,
+ PACE0_C = 0x33,
+
+ PACE1_FIFO_BURST = 0x34,
+ PACE1_A = 0x35,
+ PACE1_B = 0x36,
+ PACE1_C = 0x37,
+
+ PACE2_FIFO_BURST = 0x38,
+ PACE2_A = 0x39,
+ PACE2_B = 0x3A,
+ PACE2_C = 0x3B,
+
+ PACE3_FIFO_BURST = 0x3C,
+ PACE3_A = 0x3D,
+ PACE3_B = 0x3E,
+ PACE3_C = 0x3F,
+
+ PACE4_FIFO_BURST = 0x40,
+ PACE4_A = 0x41,
+ PACE4_B = 0x42,
+ PACE4_C = 0x43,
+
+ PACE5_FIFO_BURST = 0x44,
+ PACE5_A = 0x45,
+ PACE5_B = 0x46,
+ PACE5_C = 0x47,
+
+ } MAX30001_REG_map_t;
+
+ /**
+ * @brief STATUS (0x01)
+ */
+ union max30001_status_reg {
+ uint32_t all;
+
+ struct {
+ uint32_t loff_nl : 1;
+ uint32_t loff_nh : 1;
+ uint32_t loff_pl : 1;
+ uint32_t loff_ph : 1;
+
+ uint32_t bcgmn : 1;
+ uint32_t bcgmp : 1;
+ uint32_t reserved1 : 1;
+ uint32_t reserved2 : 1;
+
+ uint32_t pllint : 1;
+ uint32_t samp : 1;
+ uint32_t rrint : 1;
+ uint32_t lonint : 1;
+
+ uint32_t pedge : 1;
+ uint32_t povf : 1;
+ uint32_t pint : 1;
+ uint32_t bcgmon : 1;
+
+ uint32_t bundr : 1;
+ uint32_t bover : 1;
+ uint32_t bovf : 1;
+ uint32_t bint : 1;
+
+ uint32_t dcloffint : 1;
+ uint32_t fstint : 1;
+ uint32_t eovf : 1;
+ uint32_t eint : 1;
+
+ uint32_t reserved : 8;
+
+ } bit;
+
+ } max30001_status;
+
+
+ /**
+ * @brief EN_INT (0x02)
+ */
+
+ union max30001_en_int_reg {
+ uint32_t all;
+
+ struct {
+ uint32_t intb_type : 2;
+ uint32_t reserved1 : 1;
+ uint32_t reserved2 : 1;
+
+ uint32_t reserved3 : 1;
+ uint32_t reserved4 : 1;
+ uint32_t reserved5 : 1;
+ uint32_t reserved6 : 1;
+
+ uint32_t en_pllint : 1;
+ uint32_t en_samp : 1;
+ uint32_t en_rrint : 1;
+ uint32_t en_lonint : 1;
+
+ uint32_t en_pedge : 1;
+ uint32_t en_povf : 1;
+ uint32_t en_pint : 1;
+ uint32_t en_bcgmon : 1;
+
+ uint32_t en_bundr : 1;
+ uint32_t en_bover : 1;
+ uint32_t en_bovf : 1;
+ uint32_t en_bint : 1;
+
+ uint32_t en_dcloffint : 1;
+ uint32_t en_fstint : 1;
+ uint32_t en_eovf : 1;
+ uint32_t en_eint : 1;
+
+ uint32_t reserved : 8;
+
+ } bit;
+
+ } max30001_en_int;
+
+
+ /**
+ * @brief EN_INT2 (0x03)
+ */
+ union max30001_en_int2_reg {
+ uint32_t all;
+
+ struct {
+ uint32_t intb_type : 2;
+ uint32_t reserved1 : 1;
+ uint32_t reserved2 : 1;
+
+ uint32_t reserved3 : 1;
+ uint32_t reserved4 : 1;
+ uint32_t reserved5 : 1;
+ uint32_t reserved6 : 1;
+
+ uint32_t en_pllint : 1;
+ uint32_t en_samp : 1;
+ uint32_t en_rrint : 1;
+ uint32_t en_lonint : 1;
+
+ uint32_t en_pedge : 1;
+ uint32_t en_povf : 1;
+ uint32_t en_pint : 1;
+ uint32_t en_bcgmon : 1;
+
+ uint32_t en_bundr : 1;
+ uint32_t en_bover : 1;
+ uint32_t en_bovf : 1;
+ uint32_t en_bint : 1;
+
+ uint32_t en_dcloffint : 1;
+ uint32_t en_fstint : 1;
+ uint32_t en_eovf : 1;
+ uint32_t en_eint : 1;
+
+ uint32_t reserved : 8;
+
+ } bit;
+
+ } max30001_en_int2;
+
+ /**
+ * @brief MNGR_INT (0x04)
+ */
+ union max30001_mngr_int_reg {
+ uint32_t all;
+
+ struct {
+ uint32_t samp_it : 2;
+ uint32_t clr_samp : 1;
+ uint32_t clr_pedge : 1;
+ uint32_t clr_rrint : 2;
+ uint32_t clr_fast : 1;
+ uint32_t reserved1 : 1;
+ uint32_t reserved2 : 4;
+ uint32_t reserved3 : 4;
+
+ uint32_t b_fit : 3;
+ uint32_t e_fit : 5;
+
+ uint32_t reserved : 8;
+
+ } bit;
+
+ } max30001_mngr_int;
+
+ /**
+ * @brief MNGR_DYN (0x05)
+ */
+ union max30001_mngr_dyn_reg {
+ uint32_t all;
+
+ struct {
+ uint32_t bloff_lo_it : 8;
+ uint32_t bloff_hi_it : 8;
+ uint32_t fast_th : 6;
+ uint32_t fast : 2;
+ uint32_t reserved : 8;
+ } bit;
+
+ } max30001_mngr_dyn;
+
+ // 0x08
+ // uint32_t max30001_sw_rst;
+
+ // 0x09
+ // uint32_t max30001_synch;
+
+ // 0x0A
+ // uint32_t max30001_fifo_rst;
+
+
+ /**
+ * @brief INFO (0x0F)
+ */
+ union max30001_info_reg {
+ uint32_t all;
+ struct {
+ uint32_t serial : 12;
+ uint32_t part_id : 2;
+ uint32_t sample : 1;
+ uint32_t reserved1 : 1;
+ uint32_t rev_id : 4;
+ uint32_t pattern : 4;
+ uint32_t reserved : 8;
+ } bit;
+
+ } max30001_info;
+
+ /**
+ * @brief CNFG_GEN (0x10)
+ */
+ union max30001_cnfg_gen_reg {
+ uint32_t all;
+ struct {
+ uint32_t rbiasn : 1;
+ uint32_t rbiasp : 1;
+ uint32_t rbiasv : 2;
+ uint32_t en_rbias : 2;
+ uint32_t vth : 2;
+ uint32_t imag : 3;
+ uint32_t ipol : 1;
+ uint32_t en_dcloff : 2;
+ uint32_t en_bloff : 2;
+ uint32_t reserved1 : 1;
+ uint32_t en_pace : 1;
+ uint32_t en_bioz : 1;
+ uint32_t en_ecg : 1;
+ uint32_t fmstr : 2;
+ uint32_t en_ulp_lon : 2;
+ uint32_t reserved : 8;
+ } bit;
+
+ } max30001_cnfg_gen;
+
+
+ /**
+ * @brief CNFG_CAL (0x12)
+ */
+ union max30001_cnfg_cal_reg {
+ uint32_t all;
+ struct {
+ uint32_t thigh : 11;
+ uint32_t fifty : 1;
+ uint32_t fcal : 3;
+ uint32_t reserved1 : 5;
+ uint32_t vmag : 1;
+ uint32_t vmode : 1;
+ uint32_t en_vcal : 1;
+ uint32_t reserved2 : 1;
+ uint32_t reserved : 8;
+ } bit;
+
+ } max30001_cnfg_cal;
+
+ /**
+ * @brief CNFG_EMUX (0x14)
+ */
+ union max30001_cnfg_emux_reg {
+ uint32_t all;
+ struct {
+ uint32_t reserved1 : 16;
+ uint32_t caln_sel : 2;
+ uint32_t calp_sel : 2;
+ uint32_t openn : 1;
+ uint32_t openp : 1;
+ uint32_t reserved2 : 1;
+ uint32_t pol : 1;
+ uint32_t reserved : 8;
+ } bit;
+
+ } max30001_cnfg_emux;
+
+
+ /**
+ * @brief CNFG_ECG (0x15)
+ */
+ union max30001_cnfg_ecg_reg {
+ uint32_t all;
+ struct {
+ uint32_t reserved1 : 12;
+ uint32_t dlpf : 2;
+ uint32_t dhpf : 1;
+ uint32_t reserved2 : 1;
+ uint32_t gain : 2;
+ uint32_t reserved3 : 4;
+ uint32_t rate : 2;
+
+ uint32_t reserved : 8;
+ } bit;
+
+ } max30001_cnfg_ecg;
+
+ /**
+ * @brief CNFG_BMUX (0x17)
+ */
+ union max30001_cnfg_bmux_reg {
+ uint32_t all;
+ struct {
+ uint32_t fbist : 2;
+ uint32_t reserved1 : 2;
+ uint32_t rmod : 3;
+ uint32_t reserved2 : 1;
+ uint32_t rnom : 3;
+ uint32_t en_bist : 1;
+ uint32_t cg_mode : 2;
+ uint32_t reserved3 : 2;
+ uint32_t caln_sel : 2;
+ uint32_t calp_sel : 2;
+ uint32_t openn : 1;
+ uint32_t openp : 1;
+ uint32_t reserved4 : 2;
+ uint32_t reserved : 8;
+ } bit;
+
+ } max30001_cnfg_bmux;
+
+ /**
+ * @brief CNFG_BIOZ (0x18)
+ */
+ union max30001_bioz_reg {
+ uint32_t all;
+ struct {
+ uint32_t phoff : 4;
+ uint32_t cgmag : 3;
+ uint32_t cgmon : 1;
+ uint32_t fcgen : 4;
+ uint32_t dlpf : 2;
+ uint32_t dhpf : 2;
+ uint32_t gain : 2;
+ uint32_t inapow_mode : 1;
+ uint32_t ext_rbias : 1;
+ uint32_t ahpf : 3;
+ uint32_t rate : 1;
+ uint32_t reserved : 8;
+ } bit;
+
+ } max30001_cnfg_bioz;
+
+
+ /**
+ * @brief CNFG_PACE (0x1A)
+ */
+ union max30001_cnfg_pace_reg {
+ uint32_t all;
+
+ struct {
+ uint32_t dacn : 4;
+ uint32_t dacp : 4;
+ uint32_t reserved1 : 4;
+ uint32_t aout : 2;
+ uint32_t aout_lbw : 1;
+ uint32_t reserved2 : 1;
+ uint32_t gain : 3;
+ uint32_t gn_diff_off : 1;
+ uint32_t reserved3 : 3;
+ uint32_t pol : 1;
+ uint32_t reserved : 8;
+ } bit;
+
+ } max30001_cnfg_pace;
+
+ /**
+ * @brief CNFG_RTOR1 (0x1D)
+ */
+ union max30001_cnfg_rtor1_reg {
+ uint32_t all;
+ struct {
+ uint32_t reserved1 : 8;
+ uint32_t ptsf : 4;
+ uint32_t pavg : 2;
+ uint32_t reserved2 : 1;
+ uint32_t en_rtor : 1;
+ uint32_t gain : 4;
+ uint32_t wndw : 4;
+ uint32_t reserved : 8;
+ } bit;
+
+ } max30001_cnfg_rtor1;
+
+ /**
+ * @brief CNFG_RTOR2 (0x1E)
+ */
+ union max30001_cnfg_rtor2_reg {
+ uint32_t all;
+ struct {
+ uint32_t reserved1 : 8;
+ uint32_t rhsf : 3;
+ uint32_t reserved2 : 1;
+ uint32_t ravg : 2;
+ uint32_t reserved3 : 2;
+ uint32_t hoff : 6;
+ uint32_t reserved4 : 2;
+ uint32_t reserved : 8;
+ } bit;
+
+ } max30001_cnfg_rtor2;
+
+ /*********************************************************************************/
+
+ typedef enum {
+ MAX30001_NO_INT = 0, // No interrupt
+ MAX30001_INT_B = 1, // INTB selected for interrupt
+ MAX30001_INT_2B = 2 // INT2B selected for interrupt
+ } max30001_intrpt_Location_t;
+
+ typedef enum {
+ MAX30001_INT_DISABLED = 0b00,
+ MAX30001_INT_CMOS = 0b01,
+ MAX30001_INT_ODN = 0b10,
+ MAX30001_INT_ODNR = 0b11
+ } max30001_intrpt_type_t;
+
+ typedef enum { // Input Polarity selection
+ MAX30001_NON_INV = 0, // Non-Inverted
+ MAX30001_INV = 1 // Inverted
+ } max30001_emux_pol;
+
+ typedef enum { // OPENP and OPENN setting
+ MAX30001_ECG_CON_AFE = 0, // ECGx is connected to AFE channel
+ MAX30001_ECG_ISO_AFE = 1 // ECGx is isolated from AFE channel
+ } max30001_emux_openx;
+
+ typedef enum { // EMUX_CALP_SEL & EMUX_CALN_SEL
+ MAX30001_NO_CAL_SIG = 0b00, // No calibration signal is applied
+ MAX30001_INPT_VMID = 0b01, // Input is connected to VMID
+ MAX30001_INPT_VCALP = 0b10, // Input is connected to VCALP
+ MAX30001_INPT_VCALN = 0b11 // Input is connected to VCALN
+ } max30001_emux_calx_sel;
+
+ typedef enum { // EN_ECG, EN_BIOZ, EN_PACE
+ MAX30001_CHANNEL_DISABLED = 0b0, //
+ MAX30001_CHANNEL_ENABLED = 0b1
+ } max30001_en_feature;
+
+ /*********************************************************************************/
+ // Data
+ uint32_t max30001_ECG_FIFO_buffer[32]; // (303 for internal test)
+ uint32_t max30001_BIOZ_FIFO_buffer[8]; // (303 for internal test)
+
+ uint32_t max30001_PACE[18]; // Pace Data 0-5
+
+ uint32_t max30001_RtoR_data; // This holds the RtoR data
+
+ uint32_t max30001_DCLeadOff; // This holds the LeadOff data, Last 4 bits give
+ // the status, BIT3=LOFF_PH, BIT2=LOFF_PL,
+ // BIT1=LOFF_NH, BIT0=LOFF_NL
+ // 8th and 9th bits tell Lead off is due to ECG or BIOZ.
+ // 0b01 = ECG Lead Off and 0b10 = BIOZ Lead off
+
+ uint32_t max30001_ACLeadOff; // This gives the state of the BIOZ AC Lead Off
+ // state. BIT 1 = BOVER, BIT 0 = BUNDR
+
+ uint32_t max30001_bcgmon; // This holds the BCGMON data, BIT 1 = BCGMP, BIT0 =
+ // BCGMN
+
+ uint32_t max30001_LeadOn; // This holds the LeadOn data, BIT1 = BIOZ Lead ON,
+ // BIT0 = ECG Lead ON, BIT8= Lead On Status Bit
+
+ uint32_t max30001_timeout; // If the PLL does not respond, timeout and get out.
+
+ typedef struct { // Creating a structure for BLE data
+ int16_t R2R;
+ int16_t fmstr;
+ } max30001_t;
+
+ max30001_t hspValMax30001; // R2R, FMSTR
+
+ //jjj 14MAR17
+ //added DigitalOut so we can use any pin for cs
+ //jjj
+ MAX30001(SPI *spi, DigitalOut *cs);
+
+
+ /**
+ * @brief Constructor that accepts pin names for the SPI interface
+ * @param mosi master out slave in pin name
+ * @param miso master in slave out pin name
+ * @param sclk serial clock pin name
+ * @param cs chip select pin name
+ */
+ MAX30001(PinName mosi, PinName miso, PinName sclk, PinName cs);
+
+ /**
+ * MAX30001 destructor
+ */
+ ~MAX30001(void);
+
+ /**
+ * @brief This function sets up the Resistive Bias mode and also selects the master clock frequency.
+ * @brief Uses Register: CNFG_GEN-0x10
+ * @param En_rbias: Enable and Select Resitive Lead Bias Mode
+ * @param Rbiasv: Resistive Bias Mode Value Selection
+ * @param Rbiasp: Enables Resistive Bias on Positive Input
+ * @param Rbiasn: Enables Resistive Bias on Negative Input
+ * @param Fmstr: Selects Master Clock Frequency
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_Rbias_FMSTR_Init(uint8_t En_rbias, uint8_t Rbiasv,
+ uint8_t Rbiasp, uint8_t Rbiasn, uint8_t Fmstr);
+
+ /**
+ * @brief This function uses sets up the calibration signal internally. If it is desired to use the internal signal, then
+ * @brief this function must be called and the registers set, prior to setting the CALP_SEL and CALN_SEL in the ECG_InitStart
+ * @brief and BIOZ_InitStart functions.
+ * @brief Uses Register: CNFG_CAL-0x12
+ * @param En_Vcal: Calibration Source (VCALP and VCALN) Enable
+ * @param Vmode: Calibration Source Mode Selection
+ * @param Vmag: Calibration Source Magnitude Selection (VMAG)
+ * @param Fcal: Calibration Source Frequency Selection (FCAL)
+ * @param Thigh: Calibration Source Time High Selection
+ * @param Fifty: Calibration Source Duty Cycle Mode Selection
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_CAL_InitStart(uint8_t En_Vcal, uint8_t Vmode, uint8_t Vmag,
+ uint8_t Fcal, uint16_t Thigh, uint8_t Fifty);
+
+ /**
+ * @brief This function disables the VCAL signal
+ * @returns 0-if no error. A non-zero value indicates an error.
+ */
+ int max30001_CAL_Stop(void);
+
+ /**
+ * @brief This function handles the assignment of the two interrupt pins (INTB & INT2B) with various
+ * @brief functions/behaviors of the MAX30001. Also, each pin can be configured for different drive capability.
+ * @brief Uses Registers: EN_INT-0x02 and EN_INT2-0x03.
+ * @param max30001_intrpt_Locatio_t <argument>: All the arguments with the aforementioned enumeration essentially
+ * can be configured to generate an interrupt on either INTB or INT2B or NONE.
+ * @param max30001_intrpt_type_t intb_Type: INTB Port Type (EN_INT Selections).
+ * @param max30001_intrpt_type _t int2b_Type: INT2B Port Type (EN_INT2 Selections)
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_INT_assignment(max30001_intrpt_Location_t en_enint_loc, max30001_intrpt_Location_t en_eovf_loc, max30001_intrpt_Location_t en_fstint_loc,
+ max30001_intrpt_Location_t en_dcloffint_loc, max30001_intrpt_Location_t en_bint_loc, max30001_intrpt_Location_t en_bovf_loc,
+ max30001_intrpt_Location_t en_bover_loc, max30001_intrpt_Location_t en_bundr_loc, max30001_intrpt_Location_t en_bcgmon_loc,
+ max30001_intrpt_Location_t en_pint_loc, max30001_intrpt_Location_t en_povf_loc, max30001_intrpt_Location_t en_pedge_loc,
+ max30001_intrpt_Location_t en_lonint_loc, max30001_intrpt_Location_t en_rrint_loc, max30001_intrpt_Location_t en_samp_loc,
+ max30001_intrpt_type_t intb_Type, max30001_intrpt_type_t int2b_Type);
+
+
+
+ /**
+ * @brief For MAX30001/3 ONLY
+ * @brief This function sets up the MAX30001 for the ECG measurements.
+ * @brief Registers used: CNFG_EMUX, CNFG_GEN, MNGR_INT, CNFG_ECG.
+ * @param En_ecg: ECG Channel Enable <CNFG_GEN register bits>
+ * @param Openp: Open the ECGN Input Switch (most often used for testing and calibration studies) <CNFG_EMUX register bits>
+ * @param Openn: Open the ECGN Input Switch (most often used for testing and calibration studies) <CNFG_EMUX register bits>
+ * @param Calp_sel: ECGP Calibration Selection <CNFG_EMUX register bits>
+ * @param Caln_sel: ECGN Calibration Selection <CNFG_EMUX register bits>
+ * @param E_fit: ECG FIFO Interrupt Threshold (issues EINT based on number of unread FIFO records) <CNFG_GEN register bits>
+ * @param Clr_rrint: RTOR R Detect Interrupt (RRINT) Clear Behavior <CNFG_GEN register bits>
+ * @param Rate: ECG Data Rate
+ * @param Gain: ECG Channel Gain Setting
+ * @param Dhpf: ECG Channel Digital High Pass Filter Cutoff Frequency
+ * @param Dlpf: ECG Channel Digital Low Pass Filter Cutoff Frequency
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_ECG_InitStart(uint8_t En_ecg, uint8_t Openp, uint8_t Openn,
+ uint8_t Pol, uint8_t Calp_sel, uint8_t Caln_sel,
+ uint8_t E_fit, uint8_t Rate, uint8_t Gain,
+ uint8_t Dhpf, uint8_t Dlpf);
+
+ /**
+ * @brief For MAX30001/3 ONLY
+ * @brief This function enables the Fast mode feature of the ECG.
+ * @brief Registers used: MNGR_INT-0x04, MNGR_DYN-0x05
+ * @param Clr_Fast: FAST MODE Interrupt Clear Behavior <MNGR_INT Register>
+ * @param Fast: ECG Channel Fast Recovery Mode Selection (ECG High Pass Filter Bypass) <MNGR_DYN Register>
+ * @param Fast_Th: Automatic Fast Recovery Threshold
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_ECGFast_Init(uint8_t Clr_Fast, uint8_t Fast, uint8_t Fast_Th);
+
+ /**
+ * @brief For MAX30001/3 ONLY
+ * @brief This function disables the ECG.
+ * @brief Uses Register CNFG_GEN-0x10.
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_Stop_ECG(void);
+
+ /**
+ * @brief For MAX30001 ONLY
+ * @brief This function sets up the MAX30001 for pace signal detection.
+ * @brief If both PACE and BIOZ are turned ON, then make sure Fcgen is set for 80K or 40K in the
+ * @brief max30001_BIOZ_InitStart() function. However, if Only PACE is on but BIOZ off, then Fcgen can be set
+ * @brief for 80K only, in the max30001_BIOZ_InitStart() function
+ * @brief Registers used: MNGR_INT-0x04, CNFG_GEN-0x37, CNFG_PACE-0x1A.
+ * @param En_pace : PACE Channel Enable <CNFG_GEN Register>
+ * @param Clr_pedge : PACE Edge Detect Interrupt (PEDGE) Clear Behavior <MNGR_INT Register>
+ * @param Pol: PACE Input Polarity Selection <CNFG_PACE Register>
+ * @param Gn_diff_off: PACE Differentiator Mode <CNFG_PACE Register>
+ * @param Gain: PACE Channel Gain Selection <CNFG_PACE Register>
+ * @param Aout_lbw: PACE Analog Output Buffer Bandwidth Mode <CNFG_PACE Register>
+ * @param Aout: PACE Single Ended Analog Output Buffer Signal Monitoring Selection <CNFG_PACE Register>
+ * @param Dacp (4bits): PACE Detector Positive Comparator Threshold <CNFG_PACE Register>
+ * @param Dacn(4bits): PACE Detector Negative Comparator Threshold <CNFG_PACE Register>
+ * @returns 0-if no error. A non-zero value indicates an error <CNFG_PACE Register>
+ *
+ */
+ int max30001_PACE_InitStart(uint8_t En_pace, uint8_t Clr_pedge, uint8_t Pol,
+ uint8_t Gn_diff_off, uint8_t Gain,
+ uint8_t Aout_lbw, uint8_t Aout, uint8_t Dacp,
+ uint8_t Dacn);
+
+ /**
+ *@brief For MAX30001 ONLY
+ *@param This function disables the PACE. Uses Register CNFG_GEN-0x10.
+ *@returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_Stop_PACE(void);
+
+ /**
+ * @brief For MAX30001/2 ONLY
+ * @brief This function sets up the MAX30001 for BIOZ measurement.
+ * @brief Registers used: MNGR_INT-0x04, CNFG_GEN-0X10, CNFG_BMUX-0x17,CNFG_BIOZ-0x18.
+ * @param En_bioz: BIOZ Channel Enable <CNFG_GEN Register>
+ * @param Openp: Open the BIP Input Switch <CNFG_BMUX Register>
+ * @param Openn: Open the BIN Input Switch <CNFG_BMUX Register>
+ * @param Calp_sel: BIP Calibration Selection <CNFG_BMUX Register>
+ * @param Caln_sel: BIN Calibration Selection <CNFG_BMUX Register>
+ * @param CG_mode: BIOZ Current Generator Mode Selection <CNFG_BMUX Register>
+ * @param B_fit: BIOZ FIFO Interrupt Threshold (issues BINT based on number of unread FIFO records) <MNGR_INT Register>
+ * @param Rate: BIOZ Data Rate <CNFG_BIOZ Register>
+ * @param Ahpf: BIOZ/PACE Channel Analog High Pass Filter Cutoff Frequency and Bypass <CNFG_BIOZ Register>
+ * @param Ext_rbias: External Resistor Bias Enable <CNFG_BIOZ Register>
+ * @param Gain: BIOZ Channel Gain Setting <CNFG_BIOZ Register>
+ * @param Dhpf: BIOZ Channel Digital High Pass Filter Cutoff Frequency <CNFG_BIOZ Register>
+ * @param Dlpf: BIOZ Channel Digital Low Pass Filter Cutoff Frequency <CNFG_BIOZ Register>
+ * @param Fcgen: BIOZ Current Generator Modulation Frequency <CNFG_BIOZ Register>
+ * @param Cgmon: BIOZ Current Generator Monitor <CNFG_BIOZ Register>
+ * @param Cgmag: BIOZ Current Generator Magnitude <CNFG_BIOZ Register>
+ * @param Phoff: BIOZ Current Generator Modulation Phase Offset <CNFG_BIOZ Register>
+ * @param Inapow_mode: BIOZ Channel Instrumentation Amplifier (INA) Power Mode <CNFG_BIOZ Register>
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_BIOZ_InitStart(uint8_t En_bioz, uint8_t Openp, uint8_t Openn,
+ uint8_t Calp_sel, uint8_t Caln_sel,
+ uint8_t CG_mode,
+ /* uint8_t En_bioz,*/ uint8_t B_fit, uint8_t Rate,
+ uint8_t Ahpf, uint8_t Ext_rbias, uint8_t Gain,
+ uint8_t Dhpf, uint8_t Dlpf, uint8_t Fcgen,
+ uint8_t Cgmon, uint8_t Cgmag, uint8_t Phoff, uint8_t Inapow_mode);
+
+ /**
+ * @brief For MAX30001/2 ONLY
+ * @brief This function disables the BIOZ. Uses Register CNFG_GEN-0x10.
+ * @returns 0-if no error. A non-zero value indicates an error.
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_Stop_BIOZ(void);
+
+ /**
+ * @brief For MAX30001/2 ONLY
+ * @brief BIOZ modulated Resistance Built-in-Self-Test, Registers used: CNFG_BMUX-0x17
+ * @param En_bist: Enable Modulated Resistance Built-in-Self-test <CNFG_BMUX Register>
+ * @param Rnom: BIOZ RMOD BIST Nominal Resistance Selection <CNFG_BMUX Register>
+ * @param Rmod: BIOZ RMOD BIST Modulated Resistance Selection <CNFG_BMUX Register>
+ * @param Fbist: BIOZ RMOD BIST Frequency Selection <CNFG_BMUX Register>
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_BIOZ_InitBist(uint8_t En_bist, uint8_t Rnom, uint8_t Rmod,
+ uint8_t Fbist);
+
+ /**
+ * @brief For MAX30001/3/4 ONLY
+ * @brief Sets up the device for RtoR measurement
+ * @param EN_rtor: ECG RTOR Detection Enable <RTOR1 Register>
+ * @param Wndw: R to R Window Averaging (Window Width = RTOR_WNDW[3:0]*8mS) <RTOR1 Register>
+ * @param Gain: R to R Gain (where Gain = 2^RTOR_GAIN[3:0], plus an auto-scale option) <RTOR1 Register>
+ * @param Pavg: R to R Peak Averaging Weight Factor <RTOR1 Register>
+ * @param Ptsf: R to R Peak Threshold Scaling Factor <RTOR1 Register>
+ * @param Hoff: R to R minimum Hold Off <RTOR2 Register>
+ * @param Ravg: R to R Interval Averaging Weight Factor <RTOR2 Register>
+ * @param Rhsf: R to R Interval Hold Off Scaling Factor <RTOR2 Register>
+ * @param Clr_rrint: RTOR Detect Interrupt Clear behaviour <MNGR_INT Register>
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_RtoR_InitStart(uint8_t En_rtor, uint8_t Wndw, uint8_t Gain,
+ uint8_t Pavg, uint8_t Ptsf, uint8_t Hoff,
+ uint8_t Ravg, uint8_t Rhsf, uint8_t Clr_rrint);
+
+ /**
+ * @brief For MAX30001/3/4 ONLY
+ * @brief This function disables the RtoR. Uses Register CNFG_RTOR1-0x1D
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_Stop_RtoR(void);
+
+ /**
+ * @brief This is a function that waits for the PLL to lock; once a lock is achieved it exits out. (For convenience only)
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_PLL_lock(void);
+
+ /**
+ * @brief This function causes the MAX30001 to reset. Uses Register SW_RST-0x08
+ * @return 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_sw_rst(void);
+
+ /**
+ * @brief This function provides a SYNCH operation. Uses Register SYCNH-0x09. Please refer to the data sheet for
+ * @brief the details on how to use this.
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_synch(void);
+
+ /**
+ * @brief This function performs a FIFO Reset. Uses Register FIFO_RST-0x0A. Please refer to the data sheet
+ * @brief for the details on how to use this.
+ * @returns 0-if no error. A non-zero value indicates an error.
+ */
+ int max300001_fifo_rst(void);
+
+ /**
+ *
+ * @brief This is a callback function which collects all the data from the ECG, BIOZ, PACE and RtoR. It also handles
+ * @brief Lead On/Off. This function is passed through the argument of max30001_COMMinit().
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_int_handler(void);
+
+ /**
+ * @brief This is function called from the max30001_int_handler() function and processes all the ECG, BIOZ, PACE
+ * @brief and the RtoR data and sticks them in appropriate arrays and variables each unsigned 32 bits.
+ * @param ECG data will be in the array (input): max30001_ECG_FIFO_buffer[]
+ * @param Pace data will be in the array (input): max30001_PACE[]
+ * @param RtoRdata will be in the variable (input): max30001_RtoR_data
+ * @param BIOZ data will be in the array (input): max30001_BIOZ_FIFO_buffer[]
+ * @param global max30001_ECG_FIFO_buffer[]
+ * @param global max30001_PACE[]
+ * @param global max30001_BIOZ_FIFO_buffer[]
+ * @param global max30001_RtoR_data
+ * @param global max30001_DCLeadOff
+ * @param global max30001_ACLeadOff
+ * @param global max30001_LeadON
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_FIFO_LeadONOff_Read(void);
+
+ /**
+ * @brief This function allows writing to a register.
+ * @param addr: Address of the register to write to
+ * @param data: 24-bit data read from the register.
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_reg_write(MAX30001_REG_map_t addr, uint32_t data);
+
+ /**
+ * @brief This function allows reading from a register
+ * @param addr: Address of the register to read from.
+ * @param *return_data: pointer to the value read from the register.
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_reg_read(MAX30001_REG_map_t addr, uint32_t *return_data);
+
+ /**
+ * @brief This function enables the DC Lead Off detection. Either ECG or BIOZ can be detected, one at a time.
+ * @brief Registers Used: CNFG_GEN-0x10
+ * @param En_dcloff: BIOZ Digital Lead Off Detection Enable
+ * @param Ipol: DC Lead Off Current Polarity (if current sources are enabled/connected)
+ * @param Imag: DC Lead off current Magnitude Selection
+ * @param Vth: DC Lead Off Voltage Threshold Selection
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_Enable_DcLeadOFF_Init(int8_t En_dcloff, int8_t Ipol, int8_t Imag,
+ int8_t Vth);
+
+ /**
+ * @brief This function disables the DC Lead OFF feature, whichever is active.
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_Disable_DcLeadOFF(void);
+
+ /**
+ * @brief This function sets up the BIOZ for AC Lead Off test.
+ * @brief Registers Used: CNFG_GEN-0x10, MNGR_DYN-0x05
+ * @param En_bloff: BIOZ Digital Lead Off Detection Enable <CNFG_GEN register>
+ * @param Bloff_hi_it: DC Lead Off Current Polarity (if current sources are enabled/connected) <MNGR_DYN register>
+ * @param Bloff_lo_it: DC Lead off current Magnitude Selection <MNGR_DYN register>
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_BIOZ_Enable_ACLeadOFF_Init(uint8_t En_bloff, uint8_t Bloff_hi_it,
+ uint8_t Bloff_lo_it);
+
+ /**
+ * @brief This function Turns of the BIOZ AC Lead OFF feature
+ * @brief Registers Used: CNFG_GEN-0x10
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_BIOZ_Disable_ACleadOFF(void);
+
+ /**
+ * @brief This function enables the Current Gnerator Monitor
+ * @brief Registers Used: CNFG_BIOZ-0x18
+ * @returns 0-if no error. A non-zero value indicates an error.
+ *
+ */
+ int max30001_BIOZ_Enable_BCGMON(void);
+
+ /**
+ *
+ * @brief This function enables the Lead ON detection. Either ECG or BIOZ can be detected, one at a time.
+ * @brief Also, the en_bioz, en_ecg, en_pace setting is saved so that when this feature is disabled through the
+ * @brief max30001_Disable_LeadON() function (or otherwise) the enable/disable state of those features can be retrieved.
+ * @param Channel: ECG or BIOZ detection
+ * @returns 0-if everything is good. A non-zero value indicates an error.
+ *
+ */
+ int max30001_Enable_LeadON(int8_t Channel);
+
+ /**
+ * @brief This function turns off the Lead ON feature, whichever one is active. Also, retrieves the en_bioz,
+ * @brief en_ecg, en_pace and sets it back to as it was.
+ * @param 0-if everything is good. A non-zero value indicates an error.
+ *
+ */
+ int max30001_Disable_LeadON(void);
+
+ /**
+ *
+ * @brief This function is toggled every 2 seconds to switch between ECG Lead ON and BIOZ Lead ON detect
+ * @brief Adjust LEADOFF_SERVICE_TIME to determine the duration between the toggles.
+ * @param CurrentTime - This gets fed the time by RTC_GetValue function
+ *
+ */
+ void max30001_ServiceLeadON(uint32_t currentTime);
+
+ /**
+ *
+ * @brief This function is toggled every 2 seconds to switch between ECG DC Lead Off and BIOZ DC Lead Off
+ * @brief Adjust LEADOFF_SERVICE_TIME to determine the duration between the toggles.
+ * @param CurrentTime - This gets fed the time by RTC_GetValue function
+ *
+ */
+ void max30001_ServiceLeadoff(uint32_t currentTime);
+
+ /**
+ *
+ * @brief This function sets current RtoR values and fmstr values in a pointer structure
+ * @param hspValMax30001 - Pointer to a structure where to store the values
+ *
+ */
+ void max30001_ReadHeartrateData(max30001_t *_hspValMax30001);
+
+ /**
+ * @brief type definition for data interrupt
+ */
+ typedef void (*PtrFunction)(uint32_t id, uint32_t *buffer, uint32_t length);
+
+ /**
+ * @brief Used to connect a callback for when interrupt data is available
+ */
+ void onDataAvailable(PtrFunction _onDataAvailable);
+
+ static MAX30001 *instance;
+
+ /// Interrupt status tracking variable
+ bool m_max30001_int_happened_;
+
+
+private:
+ void dataAvailable(uint32_t id, uint32_t *buffer, uint32_t length);
+ /// interrupt handler for async spi events
+ static void spiHandler(int events);
+ /// wrapper method to transmit and recieve SPI data
+ int SPI_Transmit(const uint8_t *tx_buf, uint32_t tx_size, uint8_t *rx_buf,
+ uint32_t rx_size);
+ uint32_t readPace(int group, uint8_t* result);
+
+ //jjj 14MAR17
+ //pointer to DigitalOut for cs
+ DigitalOut * m_cs;
+ //jjj
+ /// pointer to mbed SPI object
+ SPI *m_spi;
+ /// is this object the owner of the spi object
+ bool spi_owner;
+ /// buffer to use for async transfers
+ uint8_t buffer[ASYNC_SPI_BUFFER_SIZE];
+ /// function pointer to the async callback
+ event_callback_t functionpointer;
+ /// callback function when interrupt data is available
+ PtrFunction onDataAvailableCallback;
+
+}; // End of MAX30001 Class
+
+/**
+ * @brief Preventive measure used to dismiss interrupts that fire too early during
+ * @brief initialization on INTB line
+ *
+ */
+void MAX30001Mid_IntB_Handler(void);
+
+/**
+ * @brief Preventive measure used to dismiss interrupts that fire too early during
+ * @brief initialization on INT2B line
+ *
+ */
+void MAX30001Mid_Int2B_Handler(void);
+
+/**
+ * @brief Allows Interrupts to be accepted as valid.
+ * @param state: 1-Allow interrupts, Any-Don't allow interrupts.
+ *
+ */
+void MAX30001_AllowInterrupts(int state);
+
+#endif /* MAX30001_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/MAX30001/MAX30001_Helper.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,340 @@
+#include "MaximSensor.h"
+#include "MAX30001_Helper.h"
+#include "Peripherals.h"
+#include "EcgComm_Defines.h"
+
+
+
+
+/// define stream out fifo
+#define MAX_ECG_REPORT_COUNT 256
+/// allocate a large fifo buffer for streaming out
+static uint8_t streamOutBuffer[sizeof(ecg_sensor_report) * MAX_ECG_REPORT_COUNT];
+
+
+MAX30001_Helper::MAX30001_Helper(MAX30001 *m, InterruptIn *ir_B, InterruptIn *ir_2B)
+:m_max30001(m), m_max30001_InterruptB(ir_B), m_max30001_Interrupt2B(ir_2B){
+ queue_init(&mmax30001_queue, streamOutBuffer, sizeof(ecg_sensor_report), sizeof(streamOutBuffer));
+ printf("Constructor is called\n");
+ m_max30001->m_max30001_int_happened_ = false;
+}
+
+
+int MAX30001_Helper::readRegister(uint8_t reg, uint8_t *data, int len){
+ printf("Empty Function is Called %s", __func__);
+ return -1;
+}
+
+int MAX30001_Helper::writeRegister(uint8_t reg, const uint8_t data){
+ printf("Empty Function is Called %s", __func__);
+ return -1;
+}
+
+int MAX30001_Helper::MS_max30001readRegister(uint8_t addr, uint32_t *return_data){
+ return m_max30001->max30001_reg_read(static_cast<MAX30001::MAX30001_REG_map_t> (addr), return_data);
+}
+
+int MAX30001_Helper::MS_max30001writeRegister(uint8_t addr, uint32_t data){
+ return m_max30001->max30001_reg_write(static_cast<MAX30001::MAX30001_REG_map_t> (addr), data);
+}
+
+int MAX30001_Helper::get_part_info(uint8_t *part_id, uint8_t *rev_id){
+ return -1;
+}
+
+void MAX30001_Helper::Max30001_Helper_SetInterrupts(char en){
+ if(en){
+ m_max30001_InterruptB->disable_irq();
+ m_max30001_Interrupt2B->disable_irq();
+ m_max30001_InterruptB->mode(PullUp);
+ m_max30001_InterruptB->fall(&MAX30001Mid_IntB_Handler);
+ m_max30001_Interrupt2B->mode(PullUp);
+ m_max30001_Interrupt2B->fall(&MAX30001Mid_Int2B_Handler);
+ m_max30001_InterruptB->enable_irq();
+ m_max30001_Interrupt2B->enable_irq();
+ MAX30001_AllowInterrupts(1);
+ //ret |= m_max30001->max30001_sw_rst(); // Do a software reset of the MAX30001
+ m_max30001->onDataAvailable(&StreamPacketUint32);
+ m_max30001->m_max30001_int_happened_ = (false);
+ }else{
+ m_max30001_InterruptB->disable_irq();
+ m_max30001_Interrupt2B->disable_irq();
+ MAX30001_AllowInterrupts(0);
+ //ret |= m_max30001->max30001_sw_rst(); // Do a software reset of the MAX30001
+ m_max30001->m_max30001_int_happened_ = (false);
+ }
+}
+
+int MAX30001_Helper::Max30001Helper_InitializeECGandRtoR(){
+ int ret = 0;
+ /**** ENABLE CHANNELS for ECG ****/
+ // CNFG_GEN
+ if (m_max30001->max30001_reg_read(MAX30001::CNFG_GEN, &m_max30001->max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+ m_max30001->max30001_cnfg_gen.bit.en_ecg = 0x1; // 0b1
+ // fmstr is default
+ if (m_max30001->max30001_reg_write(MAX30001::CNFG_GEN, m_max30001->max30001_cnfg_gen.all) == -1) {
+ return -1;
+ }
+ ret = m_max30001->max30001_PLL_lock();
+ // MNGR_INT
+ if (m_max30001->max30001_reg_read(MAX30001::MNGR_INT, &m_max30001->max30001_mngr_int.all) == -1) {
+ return -1;
+ }
+ m_max30001->max30001_mngr_int.bit.e_fit = E_FIT; // 31
+// if (m_max30001->max30001_reg_write(MAX30001::MNGR_INT, m_max30001->max30001_mngr_int.all) == -1) {
+// return -1;
+// }
+ // end of MNGR_INT
+
+ // Configure RtoR Parameters
+ // MNGR_INT
+// if (m_max30001->max30001_reg_read(MAX30001::MNGR_INT, &m_max30001->max30001_mngr_int.all) == -1) {
+// return -1;
+// }
+ m_max30001->max30001_mngr_int.bit.clr_rrint = 0x01; // 0b01 & 0b00 are for interrupt mode...
+ // 0b10 is for monitoring mode... it just overwrites the data...
+ if (m_max30001->max30001_reg_write(MAX30001::MNGR_INT, m_max30001->max30001_mngr_int.all) == -1) {
+ return -1;
+ }
+ // RTOR1
+ if (m_max30001->max30001_reg_read(MAX30001::CNFG_RTOR1, &m_max30001->max30001_cnfg_rtor1.all) == -1) {
+ return -1;
+ }
+ m_max30001->max30001_cnfg_rtor1.bit.en_rtor = 0x1;
+ if (m_max30001->max30001_reg_write(MAX30001::CNFG_RTOR1, m_max30001->max30001_cnfg_rtor1.all) == -1) {
+ return -1;
+ }
+ return ret;
+}
+
+int MAX30001_Helper::Max30001Helper_SetECGSampleRate(Max30001_Helper_ECG_Sample_Rate ecg_rate){
+ // ECG Rate
+ if (m_max30001->max30001_reg_read(MAX30001::CNFG_ECG, &m_max30001->max30001_cnfg_ecg.all) == -1) {
+ return -1;
+ }
+ m_max30001->max30001_cnfg_ecg.bit.rate = ecg_rate;
+ if (m_max30001->max30001_reg_write(MAX30001::CNFG_ECG, m_max30001->max30001_cnfg_ecg.all) == -1) {
+ return -1;
+ }
+ pr_debug("Setting reg 0x%02X to value 0x%02X\r\n", MAX30001::CNFG_ECG, ecg_rate);
+ return 0;
+}
+
+
+int MAX30001_Helper::sensor_enable(int enable){
+ int ret = 0;
+ queue_reset(&mmax30001_queue);
+ memset(&m_ecg_packet_, 0, sizeof(m_ecg_packet_));
+ m_rtor_last_bpm_ = 0;
+ Max30001_Helper_SetInterrupts(enable);
+ if(enable){
+ ret = Max30001Helper_InitializeECGandRtoR();
+ ret |= MS_Max30001_RtoR_InitStart(EN_RTOR_OP,WNDW_OP,GAIN_RTOR_OP,PAVG_OP,PTSF_OP,HOFF_OP,RAVG_OP,RHSF_OP,CLR_RRINT_OP);
+ ret |= MS_max30001_INT_assignment(EN_ENINT_LOC, EN_EOVF_LOC, EN_FSTINT_LOC,
+ EN_DCLOFFINT_LOC, EN_BINT_LOC,EN_BOVF_LOC,
+ EN_BOVER_LOC,EN_BUNDR_LOC,EN_BCGMON_LOC,
+ EN_PINT_LOC,EN_POVF_LOC,EN_PEDGE_LOC,
+ EN_LONINT_LOC,EN_RRINT_LOC, EN_SAMP_LOC,
+ INTB_TYPE,INT2B_TYPE);
+ ret |= MS_max30001sync();
+ }else{
+ ret = m_max30001->max30001_Stop_ECG();
+ ret |= m_max30001->max30001_Stop_RtoR();
+ ret |= MS_max30001sync();
+ }
+ return ret;
+}
+
+int MAX30001_Helper::agc_enable(int agc_enable){
+ return -1;
+}
+
+const char *MAX30001_Helper::get_sensor_part_name(){
+ return "max30001";
+}
+
+const char *MAX30001_Helper::get_sensor_name(){
+ return "max30001";
+}
+
+int MAX30001_Helper::get_sensor_report(ecg_sensor_report &sensor_report)
+{
+ return dequeue(&mmax30001_queue, &sensor_report);
+}
+
+int MAX30001_Helper::dump_registers(addr_val_pair *reg_vals){
+ int i, j = 0;
+ int ret = 0;
+ //43 registers total
+ for (i = 0x00; i <= 0x05; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
+ }
+ for (i = 0x08; i <= 0x0A; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
+ }
+ for (i = 0x0F; i <= 0x10; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
+ }
+ for (i = 0x12; i <= 0x12; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
+ }
+ for (i = 0x14; i <= 0x15; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
+ }
+ for (i = 0x17; i <= 0x18; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
+ }
+ for (i = 0x1A; i <= 0x1A; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
+ }
+ for (i = 0x1D; i <= 0x1E; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
+ }
+ for (i = 0x20; i <= 0x25; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
+ }
+ for (i = 0x30; i <= 0x47; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
+ }
+
+ return ret;
+}
+
+
+// This function starts ECG processing
+int MAX30001_Helper::MS_Max30001_ECG_InitStart(uint8_t En_ecg, uint8_t Openp, uint8_t Openn,
+ uint8_t Pol, uint8_t Calp_sel, uint8_t Caln_sel,
+ uint8_t E_fit, uint8_t Rate, uint8_t Gain,
+ uint8_t Dhpf, uint8_t Dlpf){
+ int ret = 0;
+ ret = m_max30001->max30001_ECG_InitStart(En_ecg, Openp, Openn, Pol, Calp_sel, Caln_sel, E_fit, Rate, Gain, Dhpf, Dlpf);
+ ret |= m_max30001->max30001_synch();
+ return ret;
+}
+
+// This functions stops ECG processing
+int MAX30001_Helper::MS_Max30001_ECG_Stop(){
+ int ret = 0;
+ ret = m_max30001->max30001_Stop_ECG();
+ return ret;
+}
+
+// This functions starts R_to_R processing
+int MAX30001_Helper::MS_Max30001_RtoR_InitStart(uint8_t En_rtor, uint8_t Wndw, uint8_t Gain,
+ uint8_t Pavg, uint8_t Ptsf, uint8_t Hoff,
+ uint8_t Ravg, uint8_t Rhsf, uint8_t Clr_rrint){
+ int ret = 0;
+ ret = m_max30001->max30001_RtoR_InitStart(En_rtor, Wndw, Gain,
+ Pavg, Ptsf, Hoff,
+ Ravg, Rhsf, Clr_rrint);
+ ret |= m_max30001->max30001_synch();
+ return ret;
+}
+
+// This functions stops R_to_R processing
+int MAX30001_Helper::MS_Max30001_RtoR_Stop(){
+ int ret = 0;
+ ret = m_max30001->max30001_Stop_RtoR();
+ return ret;
+}
+
+//This function enables the interrupts for specific parameters
+int MAX30001_Helper::MS_max30001_INT_assignment(uint8_t en_enint_loc, uint8_t en_eovf_loc, uint8_t en_fstint_loc,
+ uint8_t en_dcloffint_loc, uint8_t en_bint_loc, uint8_t en_bovf_loc,
+ uint8_t en_bover_loc, uint8_t en_bundr_loc, uint8_t en_bcgmon_loc,
+ uint8_t en_pint_loc, uint8_t en_povf_loc, uint8_t en_pedge_loc,
+ uint8_t en_lonint_loc, uint8_t en_rrint_loc, uint8_t en_samp_loc,
+ uint8_t intb_Type, uint8_t int2b_Type){
+
+ return m_max30001->max30001_INT_assignment(static_cast<MAX30001::max30001_intrpt_Location_t> (en_enint_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_eovf_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_fstint_loc),
+ static_cast<MAX30001::max30001_intrpt_Location_t> (en_dcloffint_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_bint_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_bovf_loc),
+ static_cast<MAX30001::max30001_intrpt_Location_t> (en_bover_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_bundr_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_bcgmon_loc),
+ static_cast<MAX30001::max30001_intrpt_Location_t> (en_pint_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_povf_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_pedge_loc),
+ static_cast<MAX30001::max30001_intrpt_Location_t> (en_lonint_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_rrint_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_samp_loc),
+ static_cast<MAX30001::max30001_intrpt_type_t> (intb_Type), static_cast<MAX30001::max30001_intrpt_type_t> (int2b_Type));
+
+}
+
+// call sync function of the sensor
+int MAX30001_Helper::MS_max30001sync(){
+ return m_max30001->max30001_synch();
+}
+
+// That Function Should Only Be called from interrupt context
+void MAX30001_Helper::Max30001Helper_AddDataToQueue(uint32_t id, uint32_t *buffer, uint32_t number){
+ for(uint32_t i = 0; i != number; ++i){
+ if(id == MAX30001_DATA_ECG){
+ m_ecg_packet_.ecg = buffer[i];
+ enqueue(&mmax30001_queue, &m_ecg_packet_);
+ m_ecg_packet_.rtor = 0;
+ m_ecg_packet_.rtor_bpm = 0;
+ }else if(id == MAX30001_DATA_RTOR){
+ m_ecg_packet_.rtor = buffer[i];
+ Max30001_Helper_ConvertRtoRtoBPM(m_ecg_packet_.rtor);
+ m_ecg_packet_.rtor_bpm = m_rtor_last_bpm_;
+ }
+ else{
+ }
+ }
+}
+
+void MAX30001_Helper::Max30001Helper_setInterruptStatus(bool status) {
+ m_max30001->m_max30001_int_happened_ = status;
+}
+
+bool MAX30001_Helper::Max30001Helper_getInterruptStatus() {
+ return m_max30001->m_max30001_int_happened_;
+}
+
+void MAX30001_Helper::Max30001Helper_max30001_int_handler(void){
+ m_max30001->max30001_int_handler();
+}
+
+int MAX30001_Helper::MAX30001_Helper_Queue_Size(void){
+ return queue_len(&mmax30001_queue);
+}
+
+int MAX30001_Helper:: MAX30001_Helper_Invert_Waveform(void) {
+ int ret;
+ uint32_t return_data;
+ ret = m_max30001->max30001_reg_read(MAX30001::CNFG_EMUX, &return_data);
+ if(ret != 0)
+ return ret;
+
+ return_data ^= ((1 << 23));
+ ret = m_max30001->max30001_reg_write(MAX30001::CNFG_EMUX, return_data);
+ return ret;
+}
+
+void MAX30001_Helper::Max30001_Helper_ConvertRtoRtoBPM(uint16_t rtor_val) {
+ const float rtor_constant = 0.0078;
+ if(rtor_val != 0)
+ m_rtor_last_bpm_ = (uint8_t)(60 /(rtor_constant* rtor_val));
+}
+
+void StreamPacketUint32(uint32_t id, uint32_t *buffer, uint32_t number) {
+ Peripherals::max30001Helper()->Max30001Helper_AddDataToQueue(id, buffer, number);
+}
+
+/**
+* @brief Get sensor ID.
+*
+* @returns Sensor ID number.
+*/
+unsigned char MAX30001_Helper::get_sensor_id() {
+
+ return( SENSOR_ID_MAX30001 );
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/MAX30001/MAX30001_Helper.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,190 @@
+#ifndef _MAX30001_HELPER_H_
+#define _MAX30001_HELPER_H_
+
+
+#include "mbed.h"
+#include "MaximSensor.h"
+#include "MAX30001.h"
+#include "queue.h"
+#include "EcgComm.h"
+
+#define SENSOR_ID_MAX30001 0x02
+
+class MAX30001_Helper: public MaximSensor
+{
+public:
+ MAX30001_Helper(MAX30001 *m, InterruptIn *ir_B, InterruptIn *ir_2B);
+ // Inherited function implementations from MaximSensor
+ virtual int readRegister(uint8_t reg, uint8_t *data, int len);
+
+ virtual int writeRegister(uint8_t reg, const uint8_t data);
+
+ /**
+ * @brief Get Maxim Sensor part and revision info.
+ * @details Reads Maxim Sensor part and revision info from device.
+ *
+ * @param[in] reg Beginning address of a register to be read.
+ * @param[out] data Buffer space to save result value.
+ * @param[in] len Number of consecutive bytes to be read.
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+ virtual int get_part_info(uint8_t *part_id, uint8_t *rev_id);
+
+ /**
+ * @brief Enables Maxim Sensor.
+ * @details Enable IRQ, enable LEDs, enable AGC
+ *
+ * @param[in] enable Any value to enable, 0 to disable.
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+ virtual int sensor_enable(int enable);
+
+ /**
+ * @brief Enables AGC.
+ * @details Enable Maxim Sensor automatic gain controller.
+ * AGC automatically adjusts sampling rates and LED currents to save energy.
+ *
+ * @param[in] agc_enable Any value to enable, 0 to disable.
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+ virtual int agc_enable(int agc_enable);
+
+ /**
+ * @brief Get sensor part name.
+ *
+ * @returns Sensor part name string.
+ */
+ virtual const char *get_sensor_part_name();
+
+ /**
+ * @brief Get sensor name.
+ *
+ * @returns Sensor name string.
+ */
+ virtual const char *get_sensor_name();
+
+ /**
+ * @brief Get sensor data
+ *
+ * @param[in] data_report sensor_report struct to fill out
+ # @returns 0 on success, less than 0 otherwise
+ */
+ virtual int get_sensor_report(ecg_sensor_report &data_report);
+
+ /**
+ * @brief Dump Maxim Sensor registers.
+ * @details Fill out register values into list
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+ virtual int dump_registers(addr_val_pair *reg_values);
+
+
+ /**
+ * @brief Get sensor ID.
+ *
+ * @returns Sensor ID number.
+ */
+ unsigned char get_sensor_id();
+
+ // Implemented functions transferred mostly from HSP....
+
+ virtual int MS_max30001readRegister(uint8_t addr, uint32_t *return_data);
+
+ virtual int MS_max30001writeRegister(uint8_t addr, uint32_t data);
+
+ virtual int MS_Max30001_ECG_InitStart(uint8_t En_ecg, uint8_t Openp, uint8_t Openn,
+ uint8_t Pol, uint8_t Calp_sel, uint8_t Caln_sel,
+ uint8_t E_fit, uint8_t Rate, uint8_t Gain,
+ uint8_t Dhpf, uint8_t Dlpf);
+
+ virtual int MS_Max30001_ECG_Stop();
+
+ // ECG Max30001 RtoR Initialization Function
+ virtual int MS_Max30001_RtoR_InitStart(uint8_t En_rtor, uint8_t Wndw, uint8_t Gain,
+ uint8_t Pavg, uint8_t Ptsf, uint8_t Hoff,
+ uint8_t Ravg, uint8_t Rhsf, uint8_t Clr_rrint);
+
+ virtual int MS_Max30001_RtoR_Stop();
+
+ // This function enables the interrupts for specific parameters
+ virtual int MS_max30001_INT_assignment(uint8_t en_enint_loc, uint8_t en_eovf_loc, uint8_t en_fstint_loc,
+ uint8_t en_dcloffint_loc, uint8_t en_bint_loc, uint8_t en_bovf_loc,
+ uint8_t en_bover_loc, uint8_t en_bundr_loc, uint8_t en_bcgmon_loc,
+ uint8_t en_pint_loc, uint8_t en_povf_loc, uint8_t en_pedge_loc,
+ uint8_t en_lonint_loc, uint8_t en_rrint_loc, uint8_t en_samp_loc,
+ uint8_t intb_Type, uint8_t int2b_Type);
+
+ // call sync function of the sensor
+ int MS_max30001sync();
+
+ // That Function Should Only Be called from interrupt context
+ void Max30001Helper_AddDataToQueue(uint32_t id, uint32_t *buffer, uint32_t number);
+
+
+ /**
+ *
+ * @param[in] status the value to set the interrupt status
+ * variable
+ */
+ void Max30001Helper_setInterruptStatus(bool status);
+
+ /**
+ *
+ * @return status of the interrupt
+ */
+ bool Max30001Helper_getInterruptStatus();
+
+ /**
+ * @brief Call the interrupt handler of Max30001
+ */
+ void Max30001Helper_max30001_int_handler(void);
+
+ int MAX30001_Helper_Queue_Size(void);
+
+ int MAX30001_Helper_Invert_Waveform(void);
+
+ enum Max30001_Helper_ECG_Sample_Rate {
+ k512SPS = 0b00,
+ k256SPS = 0b01,
+ k128SPS = 0b10
+ };
+
+ /**
+ *
+ * @param ecg_rate
+ * @return
+ */
+ int Max30001Helper_SetECGSampleRate(Max30001_Helper_ECG_Sample_Rate ecg_rate);
+
+private:
+
+ /***
+ *
+ * @return
+ */
+ void Max30001_Helper_ConvertRtoRtoBPM(uint16_t rtor_val);
+
+ uint8_t m_rtor_last_bpm_;
+
+ void Max30001_Helper_SetInterrupts(char en);
+
+ /**
+ *
+ */
+ int Max30001Helper_InitializeECGandRtoR();
+
+ ecg_sensor_report m_ecg_packet_;
+ MAX30001 *m_max30001;
+ InterruptIn *m_max30001_InterruptB;
+ InterruptIn *m_max30001_Interrupt2B;
+ queue_t mmax30001_queue;
+};
+
+
+void StreamPacketUint32(uint32_t id, uint32_t *buffer, uint32_t number);
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/MAX30205/MAX30205.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,225 @@
+/*******************************************************************************
+ * Copyright (C) 2017 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 "MAX30205.h"
+
+
+//******************************************************************************
+MAX30205::MAX30205(I2C *i2c, uint8_t slaveAddress):
+m_i2c(i2c), m_writeAddress(slaveAddress << 1),
+m_readAddress((slaveAddress << 1) | 1)
+{
+
+}
+
+
+//******************************************************************************
+MAX30205::~MAX30205(void)
+{
+ //empty block
+}
+
+
+
+
+//******************************************************************************
+int32_t MAX30205::readTemperature(uint16_t &value)
+{
+ return readRegister(MAX30205::Temperature, value);
+}
+
+
+//******************************************************************************
+int32_t MAX30205::readConfiguration(Configuration_u &config)
+{
+ uint16_t data;
+
+ int32_t result = readRegister(MAX30205::Configuration, data);
+ if(result == 0)
+ {
+ config.all = (0x00FF & data);
+ }
+
+ return result;
+
+}
+
+
+//******************************************************************************
+int32_t MAX30205::writeConfiguration(const Configuration_u config)
+{
+ uint16_t local_config = (0x00FF & config.all);
+
+ return writeRegister(MAX30205::Configuration, local_config);
+}
+
+
+//******************************************************************************
+int32_t MAX30205::readTHYST(uint16_t &value)
+{
+ return readRegister(MAX30205::THYST, value);
+}
+
+
+//******************************************************************************
+int32_t MAX30205::writeTHYST(uint16_t value)
+{
+ return writeRegister(MAX30205::THYST, value);
+}
+
+
+//******************************************************************************
+int32_t MAX30205::readTOS(uint16_t &value)
+{
+ return readRegister(MAX30205::TOS, value);
+}
+
+
+//******************************************************************************
+int32_t MAX30205::writeTOS(const uint16_t value)
+{
+ return writeRegister(MAX30205::TOS, value);
+}
+
+
+//******************************************************************************
+float MAX30205::toCelsius(uint32_t rawTemp)
+{
+ uint8_t val1, val2;
+ float result;
+
+ val1 = (rawTemp >> 8);
+ val2 = (rawTemp & 0xFF);
+
+ result = static_cast<float>(val1 + (val2/ 256.0F));
+
+ return result;
+}
+
+
+//******************************************************************************
+float MAX30205::toFahrenheit(float temperatureC)
+{
+ return((temperatureC * 1.8F) + 32.0f);
+}
+
+
+//******************************************************************************
+int32_t MAX30205::writeRegister(Registers_e reg, uint16_t value)
+{
+ int32_t result;
+
+ uint8_t hi = ((value >> 8) & 0xFF);
+ uint8_t lo = (value & 0xFF);
+ char cmdData[3] = {reg, hi, lo};
+
+ result = m_i2c->write(m_writeAddress, cmdData, 3);
+
+ return result;
+}
+
+
+//******************************************************************************
+int32_t MAX30205::readRegister(Registers_e reg, uint16_t &value)
+{
+ int32_t result;
+
+ char data[2];
+ char cmdData[1] = {reg};
+
+ result = m_i2c->write(m_writeAddress, cmdData, 1);
+ if(result == 0)
+ {
+ result = m_i2c->read(m_readAddress, data, 2);
+ if (result == 0)
+ {
+ value = (data[0] << 8) + data[1];
+ }
+ }
+
+ return result;
+}
+
+int MAX30205::dump_registers(addr_val_pair *reg_vals){
+ int i;
+ int ret = 0;
+ uint16_t val;
+ for (i = 0x00; i <= 0x03; i++) {
+ reg_vals[i].addr = i;
+ ret |= readRegister(static_cast<Registers_e>(i), val);
+ reg_vals[i].val = val;
+ }
+
+ return ret;
+}
+
+const char *MAX30205::get_sensor_part_name()
+{
+ return "max30205";
+}
+
+const char *MAX30205::get_sensor_algo_ver()
+{
+ return "dummy_algo_ver";
+}
+
+
+int MAX30205::sensor_enable(int enable){
+ int32_t ret;
+ Configuration_u config;
+
+
+ ret = readConfiguration(config);
+ if(ret != 0)
+ return ret;
+
+ if(enable){
+ config.bits.shutdown = 0;
+ }else{
+ config.bits.shutdown = 1;
+ }
+
+ return writeConfiguration(config);
+}
+
+/**
+* @brief Get sensor ID.
+*
+* @returns Sensor ID number.
+*/
+unsigned char MAX30205::get_sensor_id() {
+
+ return( SENSOR_ID_MAX30205 );
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/MAX30205/MAX30205.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (C) 2017 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 __MAX30205_H_
+#define __MAX30205_H_
+
+#include "mbed.h"
+#include "MaximSensor.h"
+
+#define SENSOR_ID_MAX30205 0x03
+
+/**
+ * @brief Library for the MAX30205\n
+ * The MAX30205 temperature sensor accurately measures temperature and provide
+ * an overtemperature alarm/interrupt/shutdown output. This device converts the
+ * temperature measurements to digital form using a high-resolution,
+ * sigma-delta, analog-to-digital converter (ADC). Accuracy meets clinical
+ * thermometry specification of the ASTM E1112 when soldered on the final PCB.
+ * Communication is through an I2C-compatible 2-wire serial interface.
+ *
+ * @code
+ * #include "mbed.h"
+ * #include "max32630fthr.h"
+ * #include "MAX30205.h"
+ *
+ * MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
+ *
+ * //Get I2C instance
+ * I2C i2cBus(I2C1_SDA, I2C1_SCL);
+ *
+ * //Get temp sensor instance
+ * MAX30205 bodyTempSensor(i2cBus, 0x4D); //Constructor takes 7-bit slave adrs
+ *
+ * int main(void)
+ * {
+ * //use sensor
+ * }
+ * @endcode
+ */
+
+class MAX30205: public MaximSensor
+{
+
+public:
+ /// MAX30205 Register Addresses
+ enum Registers_e
+ {
+ Temperature = 0x00,
+ Configuration = 0x01,
+ THYST = 0x02,
+ TOS = 0x03
+ };
+
+ ///MAX30205 Configuration register bitfields
+ union Configuration_u
+ {
+ uint8_t all;
+ struct BitField_s
+ {
+ uint8_t shutdown : 1;
+ uint8_t comp_int : 1;
+ uint8_t os_polarity : 1;
+ uint8_t fault_queue : 2;
+ uint8_t data_format : 1;
+ uint8_t timeout : 1;
+ uint8_t one_shot : 1;
+ }bits;
+ };
+
+ /**
+ * @brief Constructor using reference to I2C object
+ * @param i2c - Reference to I2C object
+ * @param slaveAddress - 7-bit I2C address
+ */
+ MAX30205(I2C *i2c, uint8_t slaveAddress);
+
+ /** @brief Destructor */
+ ~MAX30205(void);
+
+ /**
+ * @brief Read the temperature from the device into a 16 bit value
+ * @param[out] value - Raw temperature data on success
+ * @return 0 on success, non-zero on failure
+ */
+ int32_t readTemperature(uint16_t &value);
+
+ /**
+ * @brief Read the configuration register
+ * @param config - Reference to Configuration type
+ * @return 0 on success, non-zero on failure
+ */
+ int32_t readConfiguration(Configuration_u &config);
+
+ /**
+ * @brief Write the configuration register with given configuration
+ * @param config - Configuration to write
+ * @return 0 on success, non-zero on failure
+ */
+ int32_t writeConfiguration(const Configuration_u config);
+
+ /**
+ * @brief Read the THYST value from a specified device instance
+ * @param[out] value - THYST register value on success
+ * @return 0 on success, non-zero on failure
+ */
+ int32_t readTHYST(uint16_t &value);
+
+ /**
+ * @brief Write the THYST to a device instance
+ * @param value - 16-bit value to write
+ * @return 0 on success, non-zero on failure
+ */
+ int32_t writeTHYST(const uint16_t value);
+
+ /**
+ * @brief Read the TOS value from device
+ * @param[out] value - TOS register value on success
+ * @return 0 on success, non-zero on failure
+ */
+ int32_t readTOS(uint16_t &value);
+
+ /**
+ * @brief Write the TOS register
+ * @param value - 16-bit value to write
+ * @return 0 on success, non-zero on failure
+ */
+ int32_t writeTOS(const uint16_t value);
+
+ /**
+ * @brief Convert a raw temperature value into a float
+ * @param rawTemp - raw temperature value to convert
+ * @return the convereted value in degrees C
+ */
+ float toCelsius(uint32_t rawTemp);
+
+ /**
+ * @brief Convert the passed in temperature in C to Fahrenheit
+ * @param temperatureC Temperature in C to convert
+ * @returns Returns the converted Fahrenheit value
+ */
+ float toFahrenheit(float temperatureC);
+
+//protected:
+
+ /**
+ * @brief Write register of device at slave address
+ * @param reg - Register address
+ * @param value - Value to write
+ * @return 0 on success, non-zero on failure
+ */
+ int32_t writeRegister(Registers_e reg, uint16_t value);
+
+ /**
+ * @brief Read register of device at slave address
+ * @param reg - Register address
+ * @param[out] value - Read data on success
+ * @return 0 on success, non-zero on failure
+ */
+ int32_t readRegister(Registers_e reg, uint16_t &value);
+
+ /**
+ * @brief Dump Maxim Sensor registers.
+ * @details Fill out register values into list
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+ virtual int dump_registers(addr_val_pair *reg_values);
+
+
+ /**
+ * @brief Get sensor ID.
+ *
+ * @returns Sensor ID number.
+ */
+ unsigned char get_sensor_id();
+
+ const char *get_sensor_part_name();
+ const char *get_sensor_algo_ver();
+
+ // sc... added functions
+ // *************************************************************************** //
+ /* @brief Enables Maxim Sensor.
+ * @details Enable IRQ, enable LEDs, enable AGC
+ *
+ * @param[in] enable Any value to enable, 0 to disable.
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+ virtual int sensor_enable(int enable);
+
+
+ // *************************************************************************** //
+
+private:
+ /// I2C object
+ I2C *m_i2c;
+ /// Device slave addresses
+ uint8_t m_writeAddress, m_readAddress;
+};
+
+#endif /* __MAX30205_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/MAX8614X/MAX8614X.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,631 @@
+/*******************************************************************************
+* Copyright (C) 2017 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 "MAX8614X.h"
+#include "PpgComm.h"
+#include "Peripherals.h"
+
+#define ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))
+
+#define MAX8614X_AGC_DEFAULT_LED_OUT_RANGE 50 //AGC Range parameter
+#define MAX8614X_AGC_INCREMENT_MID 15 //AGC Range parameter MID
+#define MAX8614X_AGC_INCREMENT_TOP 15 //AGC Range parameter TOP
+
+MAX8614X::MAX8614X(SPI &spiBus, DigitalOut &cs, PinName pin)
+:m_ir(pin), m_spiBus(spiBus), m_cs(cs)
+{
+ m_cs = 1;
+ kMax8614xDefaultLedOutRange = MAX8614X_AGC_DEFAULT_LED_OUT_RANGE;
+
+}
+
+int MAX8614X::readRegister(uint8_t reg, uint8_t *data, int len)
+{
+ int i = 0;
+
+ m_cs = 0;
+
+ m_spiBus.write(reg);
+ m_spiBus.write(0x80);
+ for(; i < len; i++) { /*TODO: make len unsigned*/
+ data[i] = m_spiBus.write(0x00);
+ }
+
+ m_cs = 1;
+
+ return 0; /*TODO: handle error cases*/
+}
+
+int MAX8614X::writeRegister(uint8_t reg, const uint8_t data)
+{
+ m_cs = 0;
+
+ m_spiBus.write(reg);
+ m_spiBus.write(0x00);
+ m_spiBus.write(data);
+
+ m_cs = 1;
+
+ return 0; /*TODO: handle error cases*/
+}
+
+int MAX8614X::writeBlock(const RegisterMap reg_block[], unsigned int size)
+{
+ unsigned int i;
+ int ret = 0;
+
+ for (i = 0; i < size; i++) {
+ ret = writeRegister((Registers) reg_block[i].addr,
+ reg_block[i].val);
+ if (ret < 0) {
+ pr_err("writeRegister failed. ret: %d", ret);
+ return ret;
+ }
+ }
+
+ return ret;
+}
+
+int MAX8614X::get_part_info(uint8_t *part_id, uint8_t *rev_id)
+{
+ uint32_t i;
+ int ret;
+ uint8_t buf[2];
+ const uint8_t max8614x_part_ids[] = {
+ MAX86140_PART_ID_VAL,
+ MAX86141_PART_ID_VAL,
+ MAX86142_PART_ID_VAL,
+ MAX86143_PART_ID_VAL,
+ };
+
+ ret = readRegister(MAX8614X_REV_ID_REG, buf, 2);
+ if (ret < 0) {
+ pr_err("readRegister failed. ret: %d", ret);
+ return ret;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(max8614x_part_ids); i++) {
+ if (buf[1] == max8614x_part_ids[i]) {
+ *rev_id = buf[0];
+ *part_id = buf[1];
+ return 0;
+ }
+ }
+
+ // Unsupported part
+ return -1;
+}
+
+int MAX8614X::get_num_samples_in_fifo()
+{
+ int fifo_ovf_cnt;
+ uint8_t fifo_data[4];
+ uint32_t num_samples;
+ int ret;
+
+ ret = readRegister(MAX8614X_OVF_CNT_REG, fifo_data, 2);
+ if (ret < 0) {
+ pr_err("readRegister failed. ret: %d", ret);
+ return ret;
+ }
+
+ fifo_ovf_cnt = fifo_data[0] & MAX8614X_OVF_CNT_MASK;
+ num_samples = fifo_data[1];
+
+ if (num_samples >= MAX8614X_MAX_FIFO_DEPTH) {
+ pr_err("# FIFO is Full. OVF: %d num_samples: %lu",
+ fifo_ovf_cnt, num_samples);
+ }
+
+ return num_samples;
+}
+
+int MAX8614X::read_fifo_data(uint8_t *fifo_data, int num_samples)
+{
+ uint16_t num_bytes = num_samples * MAX8614X_DATA_WORD_SIZE;
+ int ret = 0;
+
+// const struct RegisterMap test_clk_enable[] = {
+// {0xFF, 0x54},
+// {0xFF, 0x4D},
+// {0x81, 0x20},
+// {0xFF, 0x00}
+// };
+//
+// const struct RegisterMap test_clk_disable[] = {
+// {0xFF, 0x54},
+// {0xFF, 0x4D},
+// {0x81, 0x00},
+// {0xFF, 0x00}
+// };
+
+// ret = writeBlock(test_clk_enable, ARRAY_SIZE(test_clk_enable));
+// if (ret < 0) {
+// pr_err("writeBlock failed. ret: %d", ret);
+// return ret;
+// }
+
+ fifo_data[0] = MAX8614X_FIFO_DATA_REG;
+ ret = readRegister(MAX8614X_FIFO_DATA_REG, fifo_data, num_bytes);
+ if (ret < 0) {
+ pr_err("readRegister failed. ret: %d", ret);
+ return ret;
+ }
+
+// ret = writeBlock(test_clk_disable, ARRAY_SIZE(test_clk_disable));
+// if (ret < 0) {
+// pr_err("writeBlock failed. ret: %d", ret);
+// return ret;
+// }
+
+ return ret;
+}
+
+void MAX8614X::irq()
+{
+ irq_triggered = true;
+}
+
+int MAX8614X::irq_handler()
+{
+ int ret;
+ int_status_t status;
+ irq_triggered = false;
+
+ ret = readRegister(MAX8614X_INT_STATUS1_REG, status.val, 2);
+ if (ret < 0) {
+ pr_err("readRegister failed. ret: %d", ret);
+ return -1;
+ }
+ pr_debug("Status reg: %X %X", status.val[0], status.val[1]);
+
+ if (status.a_full || status.data_rdy) {
+ fifo_irq_handler();
+ }
+
+ if (status.die_temp_rdy) {
+ pr_debug("Pwr_rdy interrupt was triggered.");
+ }
+
+ if (status.pwr_rdy) {
+ pr_info("Pwr_rdy interrupt was triggered.");
+ }
+
+ if (status.die_temp_rdy) {
+ read_die_temp();
+ }
+
+ if (status.vdd_oor) {
+ vdd_oor_cnt++;
+ pr_info("VDD Out of range cnt: %d", vdd_oor_cnt);
+ }
+ return 0;
+}
+
+int MAX8614X::fifo_irq_handler()
+{
+ uint8_t fifo_buf[MAX8614X_MAX_FIFO_DEPTH * MAX8614X_DATA_WORD_SIZE] = {0};
+ int ret;
+ int num_samples = 0;
+ static int last_samples[DATA_TYPE_PPG2_LEDC4];
+ fifo_data_t fifo_data;
+ uint16_t idx;
+ int i;
+ static ppg_data_t ppg_data;
+ static uint32_t ppg_data_ack = 0;
+ const uint32_t ir_green_red_ppg_type = ((1 << DATA_TYPE_PPG1_LEDC1) |
+ (1 << DATA_TYPE_PPG1_LEDC2) |
+ (1 << DATA_TYPE_PPG1_LEDC3));
+
+ num_samples = get_num_samples_in_fifo();
+ if (num_samples <= 0) {
+ pr_err("get_num_samples_in_fifo failed. err: %d", num_samples);
+ return -1;
+ }
+
+ pr_debug("num_samples: %d", num_samples);
+
+ ret = read_fifo_data(fifo_buf, num_samples);
+ if (ret < 0) {
+ pr_err("read_fifo_data failed. ret: %d", ret);
+ return -1;
+ }
+
+ for (i = 0; i < num_samples; i++) {
+ idx = MAX8614X_DATA_WORD_SIZE * i;
+ fifo_data.raw = fifo_buf[idx + 0] << 16
+ | fifo_buf[idx + 1] << 8
+ | fifo_buf[idx + 2];
+ if (fifo_data.type == DATA_TYPE_INVALID_DATA || fifo_data.type == 0) {
+ pr_err("Received invalid data. data: %X, i: %d",
+ (unsigned int)fifo_data.raw, i);
+
+ continue;
+ }
+ pr_debug("\ttype: %lu, val: %lu (%lX)",
+ fifo_data.type, fifo_data.val, fifo_data.val);
+
+ if (fifo_data.type > DATA_TYPE_PPG2_LEDC3) {
+ pr_err("Wrong Data Type: -> Type: %lu, val:%lu, Raw:%lu",
+ fifo_data.type, fifo_data.val, fifo_data.raw);
+ continue;
+ }
+
+ if (fifo_data.type > 0 && fifo_data.type < DATA_TYPE_PPG2_LEDC3) {
+ last_samples[fifo_data.type] = fifo_data.val;
+ }
+
+ if (fifo_data.type == DATA_TYPE_PPG1_LEDC1) {
+ max8614x_agc_handler(&led_ctrl, last_samples);
+ }
+
+ if (fifo_data.type == DATA_TYPE_PPG1_LEDC1) {
+ ppg_data.ir = fifo_data.val;
+ } else if (fifo_data.type == DATA_TYPE_PPG1_LEDC2) {
+ ppg_data.red = fifo_data.val;
+ } else if (fifo_data.type == DATA_TYPE_PPG1_LEDC3) {
+ ppg_data.green = fifo_data.val;
+ }
+
+ ppg_data_ack |= 1 << fifo_data.type;
+
+ if ((ppg_data_ack & ir_green_red_ppg_type) != ir_green_red_ppg_type ){
+ continue;
+ }
+ ppg_data_ack = 0;
+
+ if (ppg_queue.size() >= MAX8614X_COMMON_QUEUE_SIZE) {
+ pr_err("ppg_queue is full.");
+ } else {
+ ppg_queue.push(ppg_data);
+ }
+ }
+ return 0;
+}
+
+int MAX8614X::get_sensor_report(ppg_sensor_report &sensor_report)
+{
+ int32_t ret;
+ uint32_t irleddata, redleddata, greenleddata;
+ //TODO: Implement
+ ret = dequeue_from_fifo_queue(&irleddata, &redleddata, &greenleddata);
+ if(ret == RTN_NO_ERROR){
+ sensor_report.grn = irleddata;
+ sensor_report.grn2 = redleddata;
+ }else{
+ return -1;
+ }
+ return 0;
+}
+
+int MAX8614X::enable_die_temp()
+{
+ int ret = 0;
+
+ ret = writeRegister(MAX8614X_DIE_TEMP_CFG_REG, MAX8614X_DIE_TEMP_EN);
+ if (ret < 0) {
+ pr_err("SPI Communication error");
+ }
+
+ return ret;
+}
+
+int MAX8614X::read_die_temp()
+{
+ int ret = 0;
+ uint8_t buf[2];
+
+ ret = readRegister(MAX8614X_DIE_TEMP_INT_REG, buf, 2);
+ if (ret < 0) {
+ pr_err("Unable to read die_temp. ret: %d", ret);
+ return ret;
+ }
+
+ die_temp.frac = (uint8_t)buf[1] & MAX8614X_DIE_TEMP_FRAC_MASK;
+ die_temp.tint = (uint8_t)buf[0];
+
+ pr_debug("Die temp: %d - %d, %d", die_temp.val, buf[0], buf[1]);
+ return enable_die_temp();
+}
+
+int MAX8614X::reset()
+{
+ int ret = 0;
+
+ ret = writeRegister(MAX8614X_SYSTEM_CTRL_REG,
+ MAX8614X_SYSTEM_RESET_MASK);
+ if (ret < 0) {
+ pr_err("writeRegister failed. ret: %d", ret);
+ return ret;
+ }
+
+ /* Reset ppg_queue */
+ std::queue<ppg_data_t> empty_queue;
+ std::swap(ppg_queue, empty_queue);
+
+ led_control_reset(&led_ctrl);
+
+ return ret;
+}
+
+int MAX8614X::poweroff()
+{
+ int ret = 0;
+
+ ret = writeRegister(MAX8614X_SYSTEM_CTRL_REG,
+ MAX8614X_SYSTEM_SHDN_MASK);
+ if (ret < 0) {
+ pr_err("writeRegister failed. ret: %d", ret);
+ return ret;
+ }
+
+ return ret;
+}
+
+int MAX8614X::init()
+{
+ int ret = RTN_NO_ERROR;
+ uint8_t part_id, rev_id;
+
+ ret = get_part_info(&part_id, &rev_id);
+ if (ret < 0) {
+ pr_err("MAX8614X is not detected. Part_id: 0x%X, Rev_Id: 0x%X",
+ part_id, rev_id);
+ ret = RTN_ERR_NOT_8614x;
+ goto fail;
+ }
+ pr_info("MAX8614X detected. Part_id: 0x%X, Rev_Id: 0x%X", part_id, rev_id);
+
+ ret = writeRegister(MAX8614X_SYSTEM_CTRL_REG,
+ MAX8614X_SYSTEM_RESET_MASK);
+ if (ret < 0) {
+ pr_err("writeRegister failed. ret: %d", ret);
+ goto fail;
+ }
+
+ die_temp.frac = 0;
+ die_temp.tint = 0;
+
+ led_control_init(&led_ctrl); /*TODO: after porting agc, test */
+
+ irq_triggered = false;
+ m_ir.fall(Callback<void()>(this, &MAX8614X::irq));
+
+ return ret;
+fail:
+ pr_err("Init failed. ret: %d", ret);
+ return ret;
+}
+
+int MAX8614X::sensor_enable(int enable)
+{
+ int ret = RTN_NO_ERROR;
+ uint8_t led_seq[3];
+
+ RegisterMap_t ppg_init_cfg[] = {
+ { MAX8614X_SYSTEM_CTRL_REG, MAX8614X_SYSTEM_RESET_MASK},
+ { MAX8614X_PPG_CFG1_REG, MAX8614X_PPG_LED_PW_115_2_US_MASK // PPG_LED_PW = 3 (115.2us)
+ | MAX8614X_PPG1_ADC_RGE_32768_MASK // PPG1_ADC_RGE = 3(32768nA)
+ | MAX8614X_PPG2_ADC_RGE_32768_MASK }, // PPG2_ADC_RGE = 3(32768nA)
+ { MAX8614X_PPG_CFG2_REG, MAX8614X_PPG_SR_25_SPS},
+ { MAX8614X_LED_SEQ1_REG, 0x24},
+ { MAX8614X_LED_SEQ2_REG, 0x03},
+ { MAX8614X_LED1_PA_REG, 0x80},
+ { MAX8614X_LED2_PA_REG, 0x80},
+ { MAX8614X_LED3_PA_REG, 0x00},
+ { MAX8614X_LED_RANGE1_REG, MAX8614X_LED1_RGE_25mA_MASK
+ | MAX8614X_LED2_RGE_25mA_MASK
+ | MAX8614X_LED3_RGE_25mA_MASK},
+ { MAX8614X_FIFO_CFG1_REG, MAX8614X_INT1_EN_DATA_RDY_MASK},
+ // 24 (ir+r+g) samples in fifo, size is 128/3=42
+ { MAX8614X_FIFO_CFG2_REG, MAX8614X_FLUSH_FIFO_MASK
+ | MAX8614X_FIFO_STAT_CLR_MASK
+ | MAX8614X_A_FULL_TYPE_MASK // Try 0
+ | MAX8614X_FIFO_RO_MASK
+ | MAX8614X_FIFO_EN_MASK},
+ { MAX8614X_INT_ENABLE1_REG, MAX8614X_INT1_EN_A_FULL_MASK
+ | MAX8614X_INT1_EN_DIE_TEMP_MASK
+ | MAX8614X_INT1_EN_VDD_OOR_MASK},
+ };
+
+ if (enable) {
+ /* Read current sequence settings, and check what modes are open */
+ led_seq[0] = MAX8614X_LED_SEQ1_REG;
+ ret |= readRegister(MAX8614X_LED_SEQ1_REG, led_seq, 3);
+ if (ret < 0) {
+ pr_err("readRegister failed. ret: %d", ret);
+ return ret;
+ }
+
+ pr_debug("0-Sequence registers: %X %X %X", led_seq[0], led_seq[1], led_seq[2]);
+ ret |= writeBlock(ppg_init_cfg, ARRAY_SIZE(ppg_init_cfg));
+ led_seq[0] = MAX8614X_INT_STATUS1_REG;
+ ret |= readRegister(MAX8614X_INT_STATUS1_REG, led_seq, 3); // Mert: the len was 3 ?!
+ pr_debug("1-Sequence registers: %X %X %X", led_seq[0], led_seq[1], led_seq[2]);
+ if (ret < 0) {
+ pr_err("readRegister failed. ret: %d", ret);
+ return ret;
+ }
+ agc_enable(1);
+ pr_debug("Wrote register settings. ret: %d", ret);
+ } else {
+ ret = reset();
+ if (ret < 0) {
+ pr_err("reset failed. ret: %d", ret);
+ return ret;
+ }
+
+ ret = poweroff();
+ if (ret < 0) {
+ pr_err("poweroff failed. ret: %d", ret);
+ return ret;
+ }
+ }
+
+ return RTN_NO_ERROR;
+}
+
+int MAX8614X::agc_enable(int agc_enable)
+{
+ int ret = RTN_NO_ERROR;
+ led_ctrl.agc_is_enabled = !!agc_enable;
+ led_ctrl.lpm_is_enabled = !!agc_enable;
+ ret = led_prox_init(&led_ctrl, led_ctrl.lpm_is_enabled);
+ return ret;
+}
+
+int MAX8614X::dequeue_from_fifo_queue(uint32_t *ir, uint32_t *red, uint32_t *green)
+{
+ ppg_data_t ppg_data;
+
+ if (irq_triggered) {
+ irq_handler();
+ }
+
+ if (ppg_queue.size() <= 0) {
+ return RTN_ERR_QUEUE_EMPTY;
+ }
+ ppg_data = ppg_queue.front();
+ ppg_queue.pop();
+
+ pr_debug("%lu %lu %lu", ppg_data.ir, ppg_data.red, ppg_data.green);
+
+ *ir = ppg_data.ir;
+ *red = ppg_data.red;
+ *green = ppg_data.green;
+
+ return RTN_NO_ERROR;
+}
+// total number of registers to print are 57
+int MAX8614X::dump_registers(addr_val_pair *reg_vals)
+{
+ int i, j = 0;
+ int ret = 0;
+ uint8_t val;
+ // read 23 registers
+ for (i = 0x00; i <= 0x16; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= readRegister(i, &val, 1);
+ reg_vals[j].val = val;
+ }
+ // read 24 registers
+ for (i = 0x20; i <= 0x37; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= readRegister(i, &val, 1);
+ reg_vals[j].val = val;
+ }
+ // read 3 registers
+ for (i = 0x40; i <= 0x42; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= readRegister(i, &val, 1);
+ reg_vals[j].val = val;
+ }
+ // read 5 registers
+ for (i = 0xF0; i <= 0xF4; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= readRegister(i, &val, 1);
+ reg_vals[j].val = val;
+ }
+ // read 2 registers
+ for (i = 0xFE; i <= 0xFF; i++, j++) {
+ reg_vals[j].addr = i;
+ ret |= readRegister(i, &val, 1);
+ reg_vals[j].val = val;
+ }
+ return ret;
+}
+
+const char * MAX8614X::get_sensor_part_name()
+{
+#if 1
+ /* For sensor studio */
+ return "max86141";
+#else
+ uint8_t part_id, rev_id;
+
+ get_part_info(&part_id, &rev_id);
+
+ switch (part_id) {
+ case MAX86140_PART_ID_VAL:
+ return "max86140";
+ case MAX86141_PART_ID_VAL:
+ return "max86141";
+ case MAX86142_PART_ID_VAL:
+ return "max86142";
+ case MAX86143_PART_ID_VAL:
+ return "max86143";
+ }
+ return "unknown";
+#endif
+}
+
+const char * MAX8614X::get_sensor_name()
+{
+ return "ppg";
+}
+
+const char * MAX8614X::get_sensor_algo_ver()
+{
+ return "dummy_algo_ver";
+}
+
+
+//@brief Get status of the sensor: if PROX mode return true
+unsigned char MAX8614X::is_sensor_in_daq_mode(){
+ return (led_ctrl.state == LED_DATA_ACQ);
+}
+
+//@brief set agc range
+void MAX8614X::set_agc_range(enum Max8614x_Agc_Range RangeLevel){
+
+ if(RangeLevel == kRangeHigh)
+ kMax8614xDefaultLedOutRange = MAX8614X_AGC_DEFAULT_LED_OUT_RANGE + MAX8614X_AGC_INCREMENT_TOP;
+ else if(RangeLevel == kRangeMid)
+ kMax8614xDefaultLedOutRange = MAX8614X_AGC_DEFAULT_LED_OUT_RANGE + MAX8614X_AGC_INCREMENT_MID;
+ else
+ kMax8614xDefaultLedOutRange= MAX8614X_AGC_DEFAULT_LED_OUT_RANGE;
+
+// printf("Set agc range as: %d\r\n", kMax8614xDefaultLedOutRange);
+}
+
+
+/**
+* @brief Get sensor ID.
+*
+* @returns Sensor ID number.
+*/
+unsigned char MAX8614X::get_sensor_id() {
+
+ return( SENSOR_ID_MAX30205 );
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/MAX8614X/MAX8614X.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,587 @@
+/*******************************************************************************
+* Copyright (C) 2017 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 _MAX8614X_H_
+#define _MAX8614X_H_
+
+#include "mbed.h"
+#include <queue>
+#include "MaximSensor.h"
+#include "PpgComm.h"
+
+#define SENSOR_ID_MAX8614X 0x02
+
+/**
+ * @brief MAX8614X - supports MAX8614X object with SPI interface
+ * @details The MAX8614X is a complete integrated optical data acquistion
+ * system, ideal for optical pulse oximetry and heart rate detection
+ * applications. High resolution optical readout signal processing channels
+ * with ambient light cancellation and high current LED driver DACS form a
+ * complete optical readout signal chain. Features are ultra-low power heart
+ * rate monitoring, SpO2 monitoring, SmO2 & StO2 detection.
+ * Typical applications are for wearable devices, fitness devices, clinical
+ * monitoring, partical detection.
+ */
+class MAX8614X: public MaximSensor
+{
+public:
+ /* PUBLIC CONST VARIABLES */
+
+ ///Return value on success.
+ static const int8_t RTN_NO_ERROR = 0;
+ ///Return value on unsupported MAX8614x.
+ static const int8_t RTN_ERR_UNSOPPORTED_PART = -1;
+ ///Return value on reading wrong-type data from sensor FIFO
+ static const int8_t RTN_ERR_WRONG_DATA_TYPE = -2;
+ ///Return value on no plugged 8614x.
+ static const int8_t RTN_ERR_NOT_8614x = -3;
+ ///Return value on memory allocation failure
+ static const int8_t RTN_ERR_MEM_ALLOC_FAIL = -4;
+ ///Return value on internal queue init
+ static const int8_t RTN_ERR_QUEUE_INIT = -5;
+ ///Return value on the case of no available data on queue
+ static const int8_t RTN_ERR_QUEUE_EMPTY = -6;
+
+ // AGC Range Enums:
+ enum Max8614x_Agc_Range{
+ kRangeLow,
+ kRangeMid,
+ kRangeHigh,
+ };
+
+ /// This is MAX8614X Registers
+ enum Registers
+ {
+ MAX8614X_INT_STATUS1_REG = 0x00,///< INT status REG is cleared when it is read
+ MAX8614X_INT_STATUS2_REG, ///< INT status set to 1 when the Authentication Algorithm completes
+ MAX8614X_INT_ENABLE1_REG, ///< Enables INT for FIFO Almost Full or DATA_RDY_EN or ALC_OVF ...
+ MAX8614X_INT_ENABLE2_REG, ///< Enables SHA_DONE interrupt
+ MAX8614X_FIFO_WR_PTR_REG, ///< Points to the location where the next sample will be written
+ MAX8614X_FIFO_RD_PTR_REG, ///< Points the location from where the processor gets the next sample from the FIFO
+ MAX8614X_OVF_CNT_REG, ///< FIFO Overflow Counter
+ MAX8614X_FIFO_DATA_CNT_REG, ///< Holds the number of items available in the FIFO for the host to read
+ MAX8614X_FIFO_DATA_REG, ///< FIFO_DATA
+ MAX8614X_FIFO_CFG1_REG, ///< Sets how many new samples can be written to the FIFO before the interrupt
+ MAX8614X_FIFO_CFG2_REG, ///< //0x0A
+ MAX8614X_SYSTEM_CTRL_REG = 0x0D, ///< System Control REG
+ MAX8614X_PPG_SYNC_CTRL_REG = 0x10, ///< Aborts current sample and starts a new sample
+ MAX8614X_PPG_CFG1_REG, ///< PPG config for adc range control, led_pw etc.
+ MAX8614X_PPG_CFG2_REG, ///< PPG config for sampling rate
+ MAX8614X_PPG_CFG3_REG, ///< PPG config for burst rate
+ MAX8614X_PROX_INT_THRES_REG, ///< Proximity Mode Interrupt Threshold
+ MAX8614X_PHOTO_DIODE_BIAS_REG, ///<
+ MAX8614X_FICKET_FENCE_REG, //0x16
+ MAX8614X_LED_SEQ1_REG = 0x20, ///< LED Sequence Register 1
+ MAX8614X_LED_SEQ2_REG,///< LED Sequence Register 2
+ MAX8614X_LED_SEQ3_REG, ///< LED Sequence Register 3
+ MAX8614X_LED1_PA_REG, ///< LED 1 Drive Current
+ MAX8614X_LED2_PA_REG, ///< LED 2 Drive Current
+ MAX8614X_LED3_PA_REG, ///< LED 3 Drive Current
+ MAX8614X_LED4_PA_REG, ///< LED 4 Drive Current
+ MAX8614X_LED5_PA_REG, ///< LED 5 Drive Current
+ MAX8614X_LED6_PA_REG, ///< LED 6 Drive Current
+ MAX8614X_LED_PILOT_PA_REG, ///< Proximity Mode LED Pulse Amplitude
+ MAX8614X_LED_RANGE1_REG, ///< LED range 1
+ MAX8614X_LED_RANGE2_REG, ///< LEd range 2 //0x2B
+ MAX8614X_DIE_TEMP_CFG_REG = 0x40,///< Enables one temperature measurement
+ MAX8614X_DIE_TEMP_INT_REG, ///< Stores the integer temperature data
+ MAX8614X_DIE_TEMP_FRAC_REG,///<
+ MAX8614X_SHA_CMD_REG = 0xF0, ///<
+ MAX8614X_SHA_CFG_REG, ///<
+ MAX8614X_MEMORY_CONTROL_REG, ///<
+ MAX8614X_MEMORY_INDEX_REG, ///<
+ MAX8614X_MEMORY_DATA_REG, ///<
+ MAX8614X_REV_ID_REG = 0xFE, ///< Chip Rev. ID Code
+ MAX8614X_PART_ID_REG, ///< Chip Part ID Code
+
+ };
+
+ ///System Control
+ static const uint8_t MAX8614X_SYSTEM_RESET_MASK = (0x01 << 0);
+ static const uint8_t MAX8614X_SYSTEM_SHDN_MASK = (0x01 << 1);
+ static const uint8_t MAX8614X_SYSTEM_LP_BOOST = (0x01 << 2);
+
+ /// Die Temperature
+ static const uint8_t MAX8614X_DIE_TEMP_EN = (0x1 << 0);
+ static const uint8_t MAX8614X_DIE_TEMP_FRAC_MASK = (0xF << 0);
+
+ ///Sample rates
+ static const uint8_t MAX8614X_PPG_SR_25_SPS = (0x00 << 3);
+ static const uint8_t MAX8614X_PPG_SR_50_SPS = (0x01 << 3);
+ static const uint8_t MAX8614X_PPG_SR_84_SPS = (0x02 << 3);
+ static const uint8_t MAX8614X_PPG_SR_100_SPS = (0x03 << 3);
+ static const uint8_t MAX8614X_PPG_SR_200_SPS = (0x04 << 3);
+ static const uint8_t MAX8614X_PPG_SR_400_SPS = (0x05 << 3);
+ static const uint8_t MAX8614X_PPG_SR_512_SPS = (0x10 << 3);
+ static const uint8_t MAX8614X_PPG_SR_1024_SPS = (0x11 << 3);
+ static const uint8_t MAX8614X_PPG_SR_2048_SPS = (0x12 << 3);
+ static const uint8_t MAX8614X_PPG_SR_4096_SPS = (0x13 << 3);
+
+ /// LED Pulse Amplitude
+ static const uint8_t MAX8614X_LED1_RGE_MASK = (0x3 << 0);
+ static const uint8_t MAX8614X_LED2_RGE_MASK = (0x3 << 2);
+ static const uint8_t MAX8614X_LED3_RGE_MASK = (0x3 << 4);
+
+ static const uint8_t MAX8614X_LED4_RGE_MASK = (0x3 << 0);
+ static const uint8_t MAX8614X_LED5_RGE_MASK = (0x3 << 2);
+ static const uint8_t MAX8614X_LED6_RGE_MASK = (0x3 << 4);
+
+ static const uint8_t MAX8614X_LED1_RGE_25mA_MASK = (0x0 << 0);
+ static const uint8_t MAX8614X_LED1_RGE_50mA_MASK = (0x1 << 0);
+ static const uint8_t MAX8614X_LED1_RGE_75mA_MASK = (0x2 << 0);
+ static const uint8_t MAX8614X_LED1_RGE_100mA_MASK = (0x3 << 0);
+
+ static const uint8_t MAX8614X_LED2_RGE_25mA_MASK = (0x0 << 2);
+ static const uint8_t MAX8614X_LED2_RGE_50mA_MASK = (0x1 << 2);
+ static const uint8_t MAX8614X_LED2_RGE_75mA_MASK = (0x2 << 2);
+ static const uint8_t MAX8614X_LED2_RGE_100mA_MASK = (0x3 << 2);
+
+ static const uint8_t MAX8614X_LED3_RGE_25mA_MASK = (0x0 << 4);
+ static const uint8_t MAX8614X_LED3_RGE_50mA_MASK = (0x1 << 4);
+ static const uint8_t MAX8614X_LED3_RGE_75mA_MASK = (0x2 << 4);
+ static const uint8_t MAX8614X_LED3_RGE_100mA_MASK = (0x3 << 4);
+
+ /// PPG PW
+ static const uint8_t MAX8614X_PPG_LED_PW_14_4_US_MASK = (0 << 0);
+ static const uint8_t MAX8614X_PPG_LED_PW_28_8_US_MASK = (1 << 0);
+ static const uint8_t MAX8614X_PPG_LED_PW_57_6_US_MASK = (2 << 0);
+ static const uint8_t MAX8614X_PPG_LED_PW_115_2_US_MASK = (3 << 0);
+
+ /// PPG Range
+ static const uint8_t MAX8614X_PPG1_ADC_RGE_4096_MASK = (0 << 2);
+ static const uint8_t MAX8614X_PPG1_ADC_RGE_8192_MASK = (1 << 2);
+ static const uint8_t MAX8614X_PPG1_ADC_RGE_16384_MASK = (2 << 2);
+ static const uint8_t MAX8614X_PPG1_ADC_RGE_32768_MASK = (3 << 2);
+
+ static const uint8_t MAX8614X_PPG2_ADC_RGE_4096_MASK = (0 << 4);
+ static const uint8_t MAX8614X_PPG2_ADC_RGE_8192_MASK = (1 << 4);
+ static const uint8_t MAX8614X_PPG2_ADC_RGE_16384_MASK = (2 << 4);
+ static const uint8_t MAX8614X_PPG2_ADC_RGE_32768_MASK = (3 << 4);
+
+ ///FIFO
+ static const uint8_t MAX8614X_FIFO_WR_PTR_MASK = (0x7F << 0);
+ static const uint8_t MAX8614X_FIFO_RD_PTR_MASK = (0x7F << 0);
+ static const uint8_t MAX8614X_OVF_CNT_MASK = (0x7F << 0);
+ static const uint8_t MAX8614X_FIFO_A_FULL_MASK = (0x7F << 0);
+ static const uint8_t MAX8614X_FIFO_EN_MASK = (0x01 << 0);
+ static const uint8_t MAX8614X_FIFO_RO_MASK = (0x01 << 1);
+ static const uint8_t MAX8614X_A_FULL_TYPE_MASK = (0x01 << 2);
+ static const uint8_t MAX8614X_A_FULL_RPT = (0x00 << 2);
+ static const uint8_t MAX8614X_A_FULL_ONCE = (0x01 << 2);
+ static const uint8_t MAX8614X_FIFO_STAT_CLR_MASK = (0x01 << 3);
+ static const uint8_t MAX8614X_FLUSH_FIFO_MASK = (0x01 << 4);
+
+ /// Status
+ static const uint8_t MAX8614X_INT1_EN_A_FULL_MASK = (0x1 << 7);
+ static const uint8_t MAX8614X_INT1_EN_DATA_RDY_MASK = (0x1 << 6);
+ static const uint8_t MAX8614X_INT1_EN_DIE_TEMP_MASK = (0x1 << 2);
+ static const uint8_t MAX8614X_INT1_EN_VDD_OOR_MASK = (0x1 << 1);
+
+ /* PUBLIC TYPE DEFINITIONS */
+
+ /// RegisterMap entry to keep a register addr and its value
+ typedef struct RegisterMap {
+ uint8_t addr; ///< Register addr
+ uint8_t val; ///< Value that will be written to this register
+ } RegisterMap_t;
+
+ /* PUBLIC FUNCTION DECLARATIONS */
+ ///@brief MAX8614X Constructor.\n
+ ///
+ ///On Entry:
+ ///@param[in] spiBus - reference to SPI bus for this device
+ ///@param[in] cs - reference to chip select of SPI bus for this device
+ ///@param[in] intPin - pin name to data ready INT for this device
+ ///On Exit:
+ ///
+ ///@returns none
+ MAX8614X(SPI &spiBus, DigitalOut &cs, PinName intPin);
+
+ ///@brief Reads from register.\n
+ ///
+ ///On Entry:
+ ///@param[in] data - pointer to memory for storing read data
+ ///@param[in] len - len to read data
+ ///
+ ///On Exit:
+ ///@param[out] data - holds contents of read register on success
+ ///
+ ///@returns 0 on success, non 0 on failure
+ virtual int readRegister(uint8_t reg, uint8_t *data, int len);
+
+ ///@brief Writes a single register.\n
+ ///
+ ///On Entry:
+ ///@param[in] data - data to write to register
+ ///
+ ///@returns 0 on success, non 0 on failure
+ virtual int writeRegister(uint8_t reg, const uint8_t data);
+
+ ///@brief Writes a block of registers\n
+ ///On Entry:
+ ///@param[in] reg_block - block of registers and values written to them
+ ///@param[in] data - pointer to data to write to registers
+ ///
+ ///On Exit:
+ ///@param[out] none
+ ///
+ ///@returns 0 on success, non 0 on failure
+ virtual int writeBlock(const RegisterMap reg_block[], unsigned int size);
+
+ ///@brief Dequeue ppg sample from the queue\n
+ ///
+ ///On Entry:
+ ///@param[in] ir - ref to int value
+ ///@param[in] red - ref to int value
+ ///@param[in] green - ref to int value
+ ///
+ ///On Exit:
+ ///@param[out] ir - ref to int value
+ ///@param[out] red - ref to int value
+ ///@param[out] green - ref to int value
+ ///
+ ///@returns 0 on success, non 0 on no available sample on queue
+ virtual int dequeue_from_fifo_queue(uint32_t *ir, uint32_t *red, uint32_t *green);
+
+ ///@brief Get Sensor Part ID and Rev ID\n
+ ///On Entry:
+ ///@param[in] part_id - ref to pre-allocated str
+ ///@param[in] rev_id - ref to pre-allocated str
+ ///
+ ///On Exit:
+ ///@param[out] part_id - ref to part ID
+ ///@param[out] rev_id - ref to rev. ID
+ ///
+ ///@returns 0 on success, non 0 on failure
+ virtual int get_part_info(uint8_t *part_id, uint8_t *rev_id);
+
+ ///@brief Initialize internal queue, counters etc.
+ ///@returns 0 on success, non 0 on failure
+ int init();
+
+ ///@brief Get hard-coded part name\n
+ ///@returns max86141
+ virtual const char *get_sensor_part_name();
+
+ ///@brief Get hard-coded sensor type\n
+ ///@returns ppg
+ virtual const char *get_sensor_name();
+
+
+ ///@brief Get hard-coded sensor algo_ver\n
+ ///@returns algo_version
+ virtual const char *get_sensor_algo_ver();
+
+ ///@brief Enable/disable sensor to generate PPG samples \n
+ ///@returns 0 on success, non 0 on failure
+ virtual int sensor_enable(int enable);
+
+ ///@brief Enable/disable Automatic Gain Control \n
+ ///
+ ///On Entry:
+ ///@param[in] enable - if it is 1, enable; otherwise disable
+ ///
+ ///On Exit:
+ ///@returns 0 on success, non 0 on failure
+ virtual int agc_enable(int agc_enable);
+
+ ///@brief Create list of register address/pair values
+ ///@returns 0 on success, non 0 on failure
+ virtual int dump_registers(addr_val_pair *reg_vals);
+
+ ///@brief Fill out ppg_sensor_report struct
+ ///@param[in] sensor_report report to fill out
+ ///@returns - on success, non 0 on failure
+ virtual int get_sensor_report(ppg_sensor_report &data_report);
+
+ //@brief Get status of the sensor: if PROX mode return true
+ unsigned char is_sensor_in_daq_mode();
+
+ //@brief set agc range
+ void set_agc_range(enum Max8614x_Agc_Range RangeLevel);
+
+ /**
+ * @brief Get sensor ID.
+ *
+ * @returns Sensor ID number.
+ */
+ unsigned char get_sensor_id();
+
+
+ /* PUBLIC VARIABLES */
+ /// Interrupt object to handle DATA_RDY raise-up\n
+ InterruptIn m_ir;
+
+ /*! Sensor output data to report */
+ typedef struct {
+ uint32_t sample_cnt;
+ uint32_t ir;
+ uint32_t red;
+ uint32_t green;
+ float x;
+ float y;
+ float z;
+ float hr;
+ float spo2;
+ float resp_rate;
+ float hrv;
+ } sensor_report;
+
+private:
+ /* PRIVATE CONST VARIABLES */
+ static const uint32_t MAX8614X_DATA_WORD_SIZE = 3;
+ static const uint32_t MAX8614X_MAX_FIFO_DEPTH = 128;
+ static const uint32_t MAX8614X_DATA_TYPE_MASK = (0x1F << 19);
+ static const uint32_t MAX8614X_COMMON_QUEUE_SIZE = 200;
+
+ /* PRIVATE TYPE DEFINITIONS */
+ enum LedSequence
+ {
+ DATA_SEQ_NONE,
+ DATA_SEQ_LED1,
+ DATA_SEQ_LED2,
+ DATA_SEQ_LED3,
+ DATA_SEQ_LED1_LED2,
+ DATA_SEQ_LED1_LED3,
+ DATA_SEQ_LED2_LED3,
+ DATA_SEQ_LED1_LED2_LED3,
+ DATA_SEQ_PILOT_LED1,
+ DATA_SEQ_AMBIENT,
+ DATA_SEQ_LED4_EXT_MUX,
+ DATA_SEQ_LED5_EXT_MUX,
+ DATA_SEQ_LED6_EXT_MUX,
+ };
+
+ enum DataTypes
+ {
+ DATA_TYPE_PPG1_LEDC1 = 0x01,
+ DATA_TYPE_PPG1_LEDC2,
+ DATA_TYPE_PPG1_LEDC3,
+ DATA_TYPE_PPG1_LEDC4,
+ DATA_TYPE_PPG1_LEDC5,
+ DATA_TYPE_PPG1_LEDC6,
+ DATA_TYPE_PPG2_LEDC1,
+ DATA_TYPE_PPG2_LEDC2,
+ DATA_TYPE_PPG2_LEDC3,
+ DATA_TYPE_PPG2_LEDC4,
+ DATA_TYPE_PPG2_LEDC5,
+ DATA_TYPE_PPG2_LEDC6,
+ DATA_TYPE_PPF1_LEDC1,
+ DATA_TYPE_PPF1_LEDC2,
+ DATA_TYPE_PPF1_LEDC3,
+ DATA_TYPE_PPF2_LEDC1 = 0x13,
+ DATA_TYPE_PPF3_LEDC2,
+ DATA_TYPE_PPF3_LEDC3,
+ DATA_TYPE_PROX1 = 0x19,
+ DATA_TYPE_PROX2,
+ DATA_TYPE_INVALID_DATA = 0x1E,
+ DATA_TYPE_TIME_STAMP,
+ };
+
+ enum PartIDs
+ {
+ MAX86140_PART_ID_VAL = 0x24,
+ MAX86141_PART_ID_VAL,
+ MAX86142_PART_ID_VAL,
+ MAX86143_PART_ID_VAL,
+ };
+
+ enum LedRanges
+ {
+ LED_RANGE_0_50,
+ LED_RANGE_50_100,
+ LED_RANGE_100_150,
+ LED_RANGE_150_200,
+ };
+
+ enum LedRangeSteps
+ {
+ LED_RANGE_STEP_25uA = 120,
+ LED_RANGE_STEP_50uA = 240,
+ LED_RANGE_STEP_75uA = 360,
+ LED_RANGE_STEP_100uA = 480,
+ };
+
+ typedef enum {
+ LED_1 = 0,
+ LED_2,
+ LED_3,
+ LED_4,
+ LED_5,
+ LED_6,
+ NUM_OF_LED,
+ } max8614x_led_t;
+
+ enum LED_CTRL_SM {
+ LED_PROX = 1,
+ LED_DATA_ACQ,
+ };
+
+ // AGC Range Parameter
+ uint8_t kMax8614xDefaultLedOutRange;
+
+ typedef union {
+ struct {
+ uint32_t val:19;
+ uint32_t type:5;
+ uint32_t:8;
+ };
+ uint32_t raw;
+ } fifo_data_t;
+
+ typedef union {
+ uint16_t val;
+ struct {
+ uint8_t tint;
+ uint8_t frac:4;
+ uint8_t:4;
+ };
+ } die_temp_t;
+
+ typedef union {
+ struct {
+ struct {
+ unsigned char pwr_rdy:1;
+ unsigned char vdd_oor:1;
+ unsigned char die_temp_rdy:1;
+ unsigned char led_compb:1;
+ unsigned char prox_int:1;
+ unsigned char alc_ovf:1;
+ unsigned char data_rdy:1;
+ unsigned char a_full:1;
+ };
+ struct {
+ unsigned char:7;
+ unsigned char sha_done:1;
+ };
+ };
+ uint8_t val[2];
+ } int_status_t;
+
+ union led_range {
+ struct {
+ uint8_t led1:2;
+ uint8_t led2:2;
+ uint8_t led3:2;
+ uint8_t:2;
+ uint8_t led4:2;
+ uint8_t led5:2;
+ uint8_t led6:2;
+ uint8_t:2;
+ };
+ uint8_t val[2];
+ };
+
+ typedef struct {
+ uint32_t green;
+ uint32_t ir;
+ uint32_t red;
+ } ppg_data_t;
+
+ struct led_control {
+ uint32_t diode_sum[NUM_OF_LED];
+ uint32_t state;
+ uint32_t prox_sum;
+ uint32_t prox_sample_cnt;
+ int32_t led_current[NUM_OF_LED];
+ uint32_t default_current[NUM_OF_LED];
+ int32_t agc_led_out_percent;
+ int32_t agc_corr_coeff;
+ int32_t agc_min_num_samples;
+ int32_t agc_sensitivity_percent;
+ int32_t change_by_percent_of_range[NUM_OF_LED];
+ int32_t change_by_percent_of_current_setting[NUM_OF_LED];
+ int32_t change_led_by_absolute_count[NUM_OF_LED];
+ uint32_t sample_cnt;
+ union led_range led_range_settings;
+ uint8_t led_ranges;
+ uint8_t agc_is_enabled;
+ uint8_t lpm_is_enabled;
+ };
+
+ /* PRIVATE VARIABLES */
+ SPI &m_spiBus;
+ DigitalOut m_cs;
+ std::queue<ppg_data_t> ppg_queue;
+ struct led_control led_ctrl;
+ int vdd_oor_cnt;
+ die_temp_t die_temp;
+ bool irq_triggered;
+
+ /* PRIVATE FUNCTION DECLARATIONS */
+ int reset();
+
+ int poweroff();
+
+ int enable_die_temp();
+
+ int read_die_temp();
+
+ int get_num_samples_in_fifo();
+
+ void irq();
+
+ int irq_handler();
+
+ int fifo_irq_handler();
+
+ int read_fifo_data(uint8_t *fifo_data, int num_samples);
+
+ /* AGC functions */
+ int max8614x_update_led_range(int new_range, uint8_t led_num,
+ union led_range *led_range_settings);
+
+ int max8614x_update_led_current(union led_range *led_range_settings,
+ int led_new_val, max8614x_led_t led_num);
+
+ void ppg_auto_gain_ctrl(struct led_control *led_ctrl,
+ uint32_t sample_cnt, int diode_data, max8614x_led_t led_num);
+
+ void max8614x_agc_handler(struct led_control *led_ctrl,
+ int *samples);
+
+ int led_control_sm(struct led_control *led_ctrl,
+ int diode_data, char lpm);
+
+ void led_control_reset(struct led_control *led_ctrl);
+
+ int led_prox_init(struct led_control *led_ctrl, char lpm);
+
+ int led_daq_init(struct led_control *led_ctrl, char lpm);
+
+ void led_control_init(struct led_control *led_ctrl);
+
+
+};
+
+#endif /* _MAX8614X_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/MAX8614X/MAX8614X_agc.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,505 @@
+/*******************************************************************************
+* Copyright (C) 2017 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 "MAX8614X.h"
+#include <errno.h>
+#include "Peripherals.h"
+
+#define ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))
+
+#define ILLEGAL_OUTPUT_POINTER 1
+#define ILLEGAL_DIODE_OUTPUT_MIN_MAX_PAIR 2
+#define ILLEGAL_LED_SETTING_MIN_MAX_PAIR 3
+#define CONSTRAINT_VIOLATION 4
+
+#define MAX8614X_LED_DRIVE_CURRENT_FULL_SCALE \
+ (MAX8614X_MAX_LED_DRIVE_CURRENT - MAX8614X_MIN_LED_DRIVE_CURRENT)
+
+// that parameter is moved to header file to enable modification
+//#define MAX8614X_AGC_DEFAULT_LED_OUT_RANGE 30
+#define MAX8614X_AGC_DEFAULT_CORRECTION_COEFF 50
+#define MAX8614X_AGC_DEFAULT_SENSITIVITY_PERCENT 10
+#define MAX8614X_AGC_DEFAULT_NUM_SAMPLES_TO_AVG 25
+
+#define MAX8614X_PROX_THRESHOLD_1 10000
+#define MAX8614X_PROX_THRESHOLD_2 40000
+#define MAX8614X_PROX_DEBOUNCE_SPS 2
+#define MAX8614X_DAQ_DEBOUNCE_SPS 20
+
+#define MAX8614X_DEFAULT_DAQ_LED_CURRENT_1 40000
+#define MAX8614X_DEFAULT_DAQ_LED_CURRENT_2 40000
+#define MAX8614X_DEFAULT_DAQ_LED_CURRENT_3 0
+#define MAX8614X_DEFAULT_PROX_LED_CURRENT_1 10000
+#define MAX8614X_DEFAULT_PROX_LED_CURRENT_2 0
+#define MAX8614X_DEFAULT_PROX_LED_CURRENT_3 0
+
+
+#define MAX8614X_MIN_LED_DRIVE_CURRENT 0
+#define MAX8614X_MAX_LED_DRIVE_CURRENT 60000
+
+#define MAX8614X_MAX_PPG_DIODE_VAL ((1 << 19) - 1)
+#define MAX8614X_MIN_PPG_DIODE_VAL 0
+
+#define MAX8614X_DEFAULT_CURRENT1 0x30
+#define MAX8614X_DEFAULT_CURRENT2 0
+#define MAX8614X_DEFAULT_CURRENT3 0
+
+
+int MAX8614X::max8614x_update_led_range(
+ int new_range, uint8_t led_num,
+ union led_range *led_range_settings)
+{
+ int old_range;
+ Registers reg_addr;
+
+ switch (led_num) {
+ case LED_1:
+ old_range = led_range_settings->led1;
+ led_range_settings->led1 = new_range;
+ reg_addr = MAX8614X_LED_RANGE1_REG;
+ break;
+ case LED_2:
+ old_range = led_range_settings->led2;
+ led_range_settings->led2 = new_range;
+ reg_addr = MAX8614X_LED_RANGE1_REG;
+ break;
+ case LED_3:
+ old_range = led_range_settings->led3;
+ led_range_settings->led3 = new_range;
+ reg_addr = MAX8614X_LED_RANGE1_REG;
+ break;
+ case LED_4:
+ old_range = led_range_settings->led4;
+ led_range_settings->led4 = new_range;
+ reg_addr = MAX8614X_LED_RANGE2_REG;
+ break;
+ case LED_5:
+ old_range = led_range_settings->led5;
+ led_range_settings->led5 = new_range;
+ reg_addr = MAX8614X_LED_RANGE2_REG;
+ break;
+ case LED_6:
+ old_range = led_range_settings->led6;
+ led_range_settings->led6 = new_range;
+ reg_addr = MAX8614X_LED_RANGE2_REG;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+
+ if (old_range == new_range)
+ return 0;
+
+ return writeRegister( reg_addr,
+ led_range_settings->val[led_num < LED_4 ? 0 : 1]);
+}
+
+int MAX8614X::max8614x_update_led_current(
+ union led_range *led_range_settings,
+ int led_new_val,
+ max8614x_led_t led_num)
+{
+ int ret = 0;
+ Registers led_current_reg_addr;
+ int led_range;
+ uint8_t led_current_reg_val;
+ int led_range_index = led_new_val / 25000;
+ const int led_range_steps[] = {
+ LED_RANGE_STEP_25uA,
+ LED_RANGE_STEP_50uA,
+ LED_RANGE_STEP_75uA,
+ LED_RANGE_STEP_100uA,
+ LED_RANGE_STEP_100uA, /* For led current greater than 100uA */
+ };
+
+ switch(led_num) {
+ case LED_1:
+ led_current_reg_addr = MAX8614X_LED1_PA_REG;
+ break;
+ case LED_2:
+ led_current_reg_addr = MAX8614X_LED2_PA_REG;
+ break;
+ case LED_3:
+ led_current_reg_addr = MAX8614X_LED3_PA_REG;
+ break;
+ case LED_4:
+ led_current_reg_addr = MAX8614X_LED4_PA_REG;
+ break;
+ case LED_5:
+ led_current_reg_addr = MAX8614X_LED5_PA_REG;
+ break;
+ case LED_6:
+ led_current_reg_addr = MAX8614X_LED6_PA_REG;
+ break;
+ default:
+ pr_err("Invalid led number: %d\n", led_num);
+ return -EINVAL;
+ }
+
+ if (led_new_val < MAX8614X_MIN_LED_DRIVE_CURRENT
+ || led_new_val > MAX8614X_MAX_LED_DRIVE_CURRENT) {
+ pr_err("Invalid led value: %d\n", led_new_val);
+ return -EINVAL;
+ }
+
+ led_current_reg_val = led_new_val / led_range_steps[led_range_index];
+
+ pr_debug("Updating LED%d current to %d. led_rge_idx: %d, reg_val: %.2X",
+ led_num, led_new_val, led_range_index, led_current_reg_val);
+
+ ret = writeRegister(led_current_reg_addr, led_current_reg_val);
+ if (ret < 0)
+ return ret;
+
+
+ led_range = led_range_index;
+ pr_debug("Updating LED%d range to %d.", led_num, led_range);
+ if (led_range > 3)
+ led_range = 3;
+ ret = max8614x_update_led_range( led_range, led_num, led_range_settings);
+ if (ret < 0)
+ return ret;
+ return ret;
+}
+
+int32_t agc_adj_calculator(
+ int32_t *change_by_percent_of_range,
+ int32_t *change_by_percent_of_current_setting,
+ int32_t *change_led_by_absolute_count,
+ int32_t *set_led_to_absolute_count,
+ int32_t target_percent_of_range,
+ int32_t correction_coefficient,
+ int32_t allowed_error_in_percentage,
+ int32_t current_average,
+ int32_t number_of_samples_averaged,
+ int32_t led_drive_current_value)
+{
+ int32_t current_percent_of_range = 0;
+ int32_t delta = 0;
+ int32_t desired_delta = 0;
+ int32_t current_power_percent = 0;
+
+ if (change_by_percent_of_range == 0
+ || change_by_percent_of_current_setting == 0
+ || change_led_by_absolute_count == 0
+ || set_led_to_absolute_count == 0)
+ return ILLEGAL_OUTPUT_POINTER;
+
+ if (target_percent_of_range > 90 || target_percent_of_range < 10)
+ return CONSTRAINT_VIOLATION;
+
+ if (correction_coefficient > 100 || correction_coefficient < 0)
+ return CONSTRAINT_VIOLATION;
+
+ if (allowed_error_in_percentage > 100
+ || allowed_error_in_percentage < 0)
+ return CONSTRAINT_VIOLATION;
+
+#if ((MAX8614X_MAX_PPG_DIODE_VAL - MAX8614X_MIN_PPG_DIODE_VAL) <= 0 \
+ || (MAX8614X_MAX_PPG_DIODE_VAL < 0) || (MAX8614X_MIN_PPG_DIODE_VAL < 0))
+ #error "Illegal diode Min/Max Pair"
+#endif
+
+#if ((MAX8614X_MAX_LED_DRIVE_CURRENT - MAX8614X_MIN_LED_DRIVE_CURRENT) <= 0 \
+ || (MAX8614X_MAX_LED_DRIVE_CURRENT < 0) || (MAX8614X_MIN_LED_DRIVE_CURRENT < 0))
+ #error "Illegal LED Min/Max current Pair"
+#endif
+
+ if (led_drive_current_value > MAX8614X_MAX_LED_DRIVE_CURRENT
+ || led_drive_current_value < MAX8614X_MIN_LED_DRIVE_CURRENT)
+ return CONSTRAINT_VIOLATION;
+
+ if (current_average < MAX8614X_MIN_PPG_DIODE_VAL
+ || current_average > MAX8614X_MAX_PPG_DIODE_VAL)
+ return CONSTRAINT_VIOLATION;
+
+ current_percent_of_range = 100 *
+ (current_average - MAX8614X_MIN_PPG_DIODE_VAL) /
+ (MAX8614X_MAX_PPG_DIODE_VAL - MAX8614X_MIN_PPG_DIODE_VAL) ;
+
+ delta = current_percent_of_range - target_percent_of_range;
+ delta = delta * correction_coefficient / 100;
+
+ if (delta > -allowed_error_in_percentage
+ && delta < allowed_error_in_percentage) {
+ *change_by_percent_of_range = 0;
+ *change_by_percent_of_current_setting = 0;
+ *change_led_by_absolute_count = 0;
+ *set_led_to_absolute_count = led_drive_current_value;
+ return 0;
+ }
+
+ current_power_percent = 100 *
+ (led_drive_current_value - MAX8614X_MIN_LED_DRIVE_CURRENT) /
+ (MAX8614X_MAX_LED_DRIVE_CURRENT - MAX8614X_MIN_LED_DRIVE_CURRENT);
+ if (delta < 0)
+ desired_delta = -delta * (100 - current_power_percent) /
+ (100 - current_percent_of_range);
+
+ if (delta > 0)
+ desired_delta = -delta * (current_power_percent)
+ / (current_percent_of_range);
+
+ *change_by_percent_of_range = desired_delta;
+
+ *change_led_by_absolute_count = (desired_delta
+ * MAX8614X_LED_DRIVE_CURRENT_FULL_SCALE / 100);
+ *change_by_percent_of_current_setting =
+ (*change_led_by_absolute_count * 100)
+ / (led_drive_current_value);
+ *set_led_to_absolute_count = led_drive_current_value
+ + *change_led_by_absolute_count;
+
+ //If we are saturated, cut power in half
+ if (current_percent_of_range >= 100)
+ {
+ *change_by_percent_of_range = -100; //Unknown, set fake value
+ *change_by_percent_of_current_setting = -50;
+ *change_led_by_absolute_count = 0 - (led_drive_current_value / 2);
+ *set_led_to_absolute_count = led_drive_current_value / 2;
+ }
+
+ return 0;
+}
+
+void MAX8614X::ppg_auto_gain_ctrl(
+ struct led_control *led_ctrl,
+ uint32_t sample_cnt, int diode_data, max8614x_led_t led_num)
+{
+ int ret;
+ int diode_avg;
+
+ if (led_num > LED_3) /* TODO: why3? */
+ return;
+
+ led_ctrl->diode_sum[led_num] += diode_data;
+ if (sample_cnt % led_ctrl->agc_min_num_samples == 0) {
+ diode_avg = led_ctrl->diode_sum[led_num]
+ / led_ctrl->agc_min_num_samples;
+ led_ctrl->diode_sum[led_num] = 0;
+ } else
+ return;
+
+ ret = agc_adj_calculator(
+ &led_ctrl->change_by_percent_of_range[led_num],
+ &led_ctrl->change_by_percent_of_current_setting[led_num],
+ &led_ctrl->change_led_by_absolute_count[led_num],
+ &led_ctrl->led_current[led_num],
+ led_ctrl->agc_led_out_percent,
+ led_ctrl->agc_corr_coeff,
+ led_ctrl->agc_sensitivity_percent,
+ diode_avg,
+ led_ctrl->agc_min_num_samples,
+ led_ctrl->led_current[led_num]);
+ if (ret)
+ return;
+
+ if (led_ctrl->change_led_by_absolute_count[led_num] == 0)
+ return;
+
+ ret = max8614x_update_led_current(&led_ctrl->led_range_settings,
+ led_ctrl->led_current[led_num], led_num);
+ if (ret < 0)
+ pr_err("%s failed", __func__);
+ return;
+}
+
+void MAX8614X::max8614x_agc_handler(struct led_control *led_ctrl,
+ int *samples)
+{
+ static int ret = -1;
+
+ if (!led_ctrl->agc_is_enabled)
+ return;
+
+ led_ctrl->sample_cnt++;
+ ret = led_control_sm(led_ctrl,
+ samples[DATA_TYPE_PPG1_LEDC1],
+ led_ctrl->lpm_is_enabled);
+
+ if (ret == LED_DATA_ACQ) {
+ ppg_auto_gain_ctrl(led_ctrl,
+ led_ctrl->sample_cnt,
+ samples[DATA_TYPE_PPG1_LEDC1],
+ LED_1);
+ ppg_auto_gain_ctrl(led_ctrl,
+ led_ctrl->sample_cnt,
+ samples[DATA_TYPE_PPG1_LEDC1],
+ LED_2);
+// ppg_auto_gain_ctrl(led_ctrl,
+// led_ctrl->sample_cnt,
+// samples[DATA_TYPE_PPG1_LEDC3],
+// LED_3);
+ }
+
+ return;
+}
+
+int MAX8614X::led_prox_init(struct led_control *led_ctrl, char lpm)
+{
+ int ret;
+ const RegisterMap low_pm_settings[] = {
+ { MAX8614X_PPG_CFG1_REG, MAX8614X_PPG_LED_PW_115_2_US_MASK // PPG_LED_PW = 3 (115.2us)
+ | MAX8614X_PPG1_ADC_RGE_32768_MASK // PPG1_ADC_RGE = 3(32768nA)
+ | MAX8614X_PPG2_ADC_RGE_32768_MASK }, // PPG2_ADC_RGE = 3(32768nA)
+// { MAX8614X_PPG_CFG2_REG, MAX8614X_PPG_SR_25_SPS},
+ { MAX8614X_INT_ENABLE1_REG, MAX8614X_INT1_EN_DATA_RDY_MASK },
+ };
+
+ led_ctrl->led_current[LED_1] = MAX8614X_DEFAULT_PROX_LED_CURRENT_1;
+ ret = max8614x_update_led_current(&led_ctrl->led_range_settings,
+ led_ctrl->led_current[LED_1], LED_1);
+
+ led_ctrl->led_current[LED_2] = MAX8614X_DEFAULT_PROX_LED_CURRENT_2;
+ ret |= max8614x_update_led_current(&led_ctrl->led_range_settings,
+ led_ctrl->led_current[LED_2], LED_2);
+
+ led_ctrl->led_current[LED_3] = MAX8614X_DEFAULT_PROX_LED_CURRENT_3;
+ ret |= max8614x_update_led_current(&led_ctrl->led_range_settings,
+ led_ctrl->led_current[LED_3], LED_3);
+
+ if (lpm)
+ ret |= writeBlock(low_pm_settings,
+ ARRAY_SIZE(low_pm_settings));
+ return ret;
+}
+
+int MAX8614X::led_daq_init(struct led_control *led_ctrl, char lpm)
+{
+ int ret;
+ const RegisterMap non_lpm_settings[] = {
+ { MAX8614X_PPG_CFG1_REG, MAX8614X_PPG_LED_PW_115_2_US_MASK // PPG_LED_PW = 3 (115.2us)
+ | MAX8614X_PPG1_ADC_RGE_32768_MASK // PPG1_ADC_RGE = 3(32768nA)
+ | MAX8614X_PPG2_ADC_RGE_32768_MASK }, // PPG2_ADC_RGE = 3(32768nA)
+// { MAX8614X_PPG_CFG2_REG, MAX8614X_PPG_SR_25_SPS},
+ { MAX8614X_INT_ENABLE1_REG, MAX8614X_INT1_EN_DATA_RDY_MASK },
+ };
+
+ led_ctrl->led_current[LED_1] = MAX8614X_DEFAULT_DAQ_LED_CURRENT_1;
+ ret = max8614x_update_led_current(&led_ctrl->led_range_settings,
+ led_ctrl->led_current[LED_1], LED_1);
+
+ led_ctrl->led_current[LED_2] = MAX8614X_DEFAULT_DAQ_LED_CURRENT_2;
+ ret |= max8614x_update_led_current(&led_ctrl->led_range_settings,
+ led_ctrl->led_current[LED_2], LED_2);
+
+ led_ctrl->led_current[LED_3] = MAX8614X_DEFAULT_DAQ_LED_CURRENT_3;
+ ret |= max8614x_update_led_current(&led_ctrl->led_range_settings,
+ led_ctrl->led_current[LED_3], LED_3);
+
+ if (lpm)
+ ret |= writeBlock(non_lpm_settings,
+ ARRAY_SIZE(non_lpm_settings));
+
+ return ret;
+}
+
+int MAX8614X::led_control_sm(struct led_control *led_ctrl, int diode_data, char lpm)
+{
+ int ret = led_ctrl->state;
+ int avg = 0;
+
+ led_ctrl->prox_sample_cnt++;
+ led_ctrl->prox_sum += diode_data;
+
+ switch (led_ctrl->state) {
+ case LED_PROX:
+ if (led_ctrl->prox_sample_cnt % MAX8614X_PROX_DEBOUNCE_SPS != 0)
+ break;
+
+ avg = led_ctrl->prox_sum / MAX8614X_PROX_DEBOUNCE_SPS;
+ if (avg >= MAX8614X_PROX_THRESHOLD_1) {
+ led_ctrl->state = LED_DATA_ACQ;
+ ret = led_daq_init(led_ctrl, lpm);
+ led_ctrl->prox_sample_cnt = 0;
+ }
+ led_ctrl->prox_sum = 0;
+ break;
+
+ case LED_DATA_ACQ:
+ if (led_ctrl->prox_sample_cnt % MAX8614X_DAQ_DEBOUNCE_SPS != 0)
+ break;
+
+ avg = led_ctrl->prox_sum / MAX8614X_DAQ_DEBOUNCE_SPS;
+ if (avg <= MAX8614X_PROX_THRESHOLD_2) {
+ led_ctrl->state = LED_PROX;
+ ret = led_prox_init(led_ctrl, lpm);
+ led_ctrl->prox_sample_cnt = 0;
+ }
+ led_ctrl->prox_sum = 0;
+ break;
+
+ default:
+ led_ctrl->state = LED_PROX;
+ led_ctrl->prox_sum = 0;
+ led_ctrl->prox_sample_cnt = 0;
+ return -EINVAL;
+ }
+
+ return ret;
+}
+
+void MAX8614X::led_control_reset(struct led_control *led_ctrl)
+{
+ led_ctrl->led_current[LED_1] = led_ctrl->default_current[LED_1];
+ led_ctrl->led_current[LED_2] = led_ctrl->default_current[LED_2];
+ led_ctrl->led_current[LED_3] = led_ctrl->default_current[LED_3];
+
+ memset(led_ctrl->change_by_percent_of_range, 0,
+ sizeof(led_ctrl->change_by_percent_of_range));
+ memset(led_ctrl->change_by_percent_of_current_setting, 0,
+ sizeof(led_ctrl->change_by_percent_of_range));
+ memset(led_ctrl->change_led_by_absolute_count, 0,
+ sizeof(led_ctrl->change_by_percent_of_range));
+ memset(led_ctrl->diode_sum, 0, sizeof(led_ctrl->diode_sum));
+
+ led_ctrl->agc_is_enabled = 1;
+ led_ctrl->prox_sum = 0;
+ led_ctrl->prox_sample_cnt = 0;
+ led_ctrl->sample_cnt = 0;
+ led_ctrl->state = LED_PROX;
+}
+
+void MAX8614X::led_control_init(struct led_control *led_ctrl)
+{
+ memset(led_ctrl, 0, sizeof(struct led_control));
+
+ led_ctrl->default_current[LED_1] = MAX8614X_DEFAULT_CURRENT1;
+ led_ctrl->default_current[LED_2] = MAX8614X_DEFAULT_CURRENT2;
+ led_ctrl->default_current[LED_3] = MAX8614X_DEFAULT_CURRENT3;
+ led_ctrl->agc_led_out_percent = kMax8614xDefaultLedOutRange;
+ led_ctrl->agc_corr_coeff = MAX8614X_AGC_DEFAULT_CORRECTION_COEFF;
+ led_ctrl->agc_min_num_samples = MAX8614X_AGC_DEFAULT_NUM_SAMPLES_TO_AVG;
+ led_ctrl->agc_sensitivity_percent = MAX8614X_AGC_DEFAULT_SENSITIVITY_PERCENT;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/MaximSensor/MaximSensor.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,174 @@
+#include "MaximSensor.h"
+#include "Peripherals.h"
+
+ /* PUBLIC FUNCTION DECLARATIONS */
+ /**
+ * @brief Reads from register.
+ * @details Reads specific Maxim Sensor register via SPI bus.
+ *
+ * @param[in] reg Beginning address of a register to be read.
+ * @param[out] data Buffer space to save result value.
+ * @param[in] len Number of consecutive bytes to be read.
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+int MaximSensor::readRegister(uint8_t reg, uint8_t *data, int len){
+ pr_err("Empty function is called");
+ return -1;
+}
+
+ /**
+ * @brief Writes data to Maxim Sensor register.
+ * @details Writes data to specific Maxim Sensor register via SPI bus.
+ *
+ * @param[in] reg Address of a register to be wrote.
+ * @param[in] data Data to write on register.
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+int MaximSensor::writeRegister(uint8_t reg, const uint8_t data){
+ pr_err("Empty function is called");
+ return -1;
+}
+
+ /**
+ * @brief Get Maxim Sensor part and revision info.
+ * @details Reads Maxim Sensor part and revision info from device.
+ *
+ * @param[in] reg Beginning address of a register to be read.
+ * @param[out] data Buffer space to save result value.
+ * @param[in] len Number of consecutive bytes to be read.
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+int MaximSensor::get_part_info(uint8_t *part_id, uint8_t *rev_id){
+ pr_err("Empty function is called");
+ return -1;
+}
+
+ /**
+ * @brief Enables Maxim Sensor.
+ * @details Enable IRQ, enable LEDs, enable AGC
+ *
+ * @param[in] enable Any value to enable, 0 to disable.
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+int MaximSensor::sensor_enable(int enable){
+ pr_err("Empty function is called");
+ return -1;
+}
+
+ /**
+ * @brief Enables AGC.
+ * @details Enable Maxim Sensor automatic gain controller.
+ * AGC automatically adjusts sampling rates and LED currents to save energy.
+ *
+ * @param[in] agc_enable Any value to enable, 0 to disable.
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+int MaximSensor::agc_enable(int agc_enable){
+ pr_err("Empty function is called");
+ return -1;
+}
+
+ /**
+ * @brief Get sensor part name.
+ *
+ * @returns Sensor part name string.
+ */
+const char *MaximSensor::get_sensor_part_name(){
+ pr_err("Empty function is called");
+ return "";
+}
+#if 0
+int dump_registers(addr_val_pair *reg_values) {
+ pr_err("Empty function is called");
+ return 0;
+}
+#endif
+ /**
+ * @brief Get sensor name.
+ *
+ * @returns Sensor name string.
+ */
+const char *MaximSensor::get_sensor_name(){
+ pr_err("Empty function is called");
+ return "";
+}
+
+
+/**
+* @brief Get sensor ID.
+*
+* @returns Sensor ID number.
+*/
+unsigned char MaximSensor::get_sensor_id() {
+
+ // Base class returns 255
+ return( 255 );
+
+}
+
+
+/**
+* @brief Get sensor name.
+*
+* @returns Sensor name string.
+*/
+const char *MaximSensor::get_sensor_algo_ver(){
+pr_err("Empty function is called");
+return "";
+}
+
+int MaximSensor::MS_Max30001_ECG_InitStart(uint8_t En_ecg, uint8_t Openp, uint8_t Openn,
+ uint8_t Pol, uint8_t Calp_sel, uint8_t Caln_sel,
+ uint8_t E_fit, uint8_t Rate, uint8_t Gain,
+ uint8_t Dhpf, uint8_t Dlpf){
+ pr_err("Empty function is called");
+ return -1;
+}
+
+int MaximSensor::MS_Max30001_ECG_Stop(){
+ pr_err("Empty function is called");
+ return -1;
+}
+
+int MaximSensor::MS_Max30001_RtoR_InitStart(uint8_t En_rtor, uint8_t Wndw, uint8_t Gain,
+ uint8_t Pavg, uint8_t Ptsf, uint8_t Hoff,
+ uint8_t Ravg, uint8_t Rhsf, uint8_t Clr_rrint){
+ pr_err("Empty function is called");
+ return -1;
+}
+
+int MaximSensor::MS_Max30001_RtoR_Stop(){
+ pr_err("Empty function is called");
+ return -1;
+}
+
+// Max30001 Interrupt Assignment Function
+int MaximSensor::MS_max30001_INT_assignment(uint8_t en_enint_loc, uint8_t en_eovf_loc, uint8_t en_fstint_loc,
+ uint8_t en_dcloffint_loc, uint8_t en_bint_loc, uint8_t en_bovf_loc,
+ uint8_t en_bover_loc, uint8_t en_bundr_loc, uint8_t en_bcgmon_loc,
+ uint8_t en_pint_loc, uint8_t en_povf_loc, uint8_t en_pedge_loc,
+ uint8_t en_lonint_loc, uint8_t en_rrint_loc, uint8_t en_samp_loc,
+ uint8_t intb_Type, uint8_t int2b_Type){
+ pr_err("Empty function is called");
+ return -1;
+}
+
+int MaximSensor::MS_max30001readRegister(uint8_t addr, uint32_t *return_data){
+ pr_err("Empty function is called");
+ return -1;
+}
+
+int MaximSensor::MS_max30001writeRegister(uint8_t addr, uint32_t data){
+ pr_err("Empty function is called");
+ return -1;
+}
+
+int MaximSensor::MS_max30001sync(){
+ pr_err("Empty MS_max30001sync is called");
+ return -1;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/MaximSensor/MaximSensor.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,189 @@
+/*******************************************************************************
+* Copyright (C) 2017 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 _MAXIMSENSOR_H_
+#define _MAXIMSENSOR_H_
+#include "mbed.h"
+#include <list>
+
+
+typedef struct {
+ uint8_t addr;
+ uint32_t val;
+} addr_val_pair;
+
+
+/**
+ * @brief MaximSensor is Maxim Sensor base class.
+ * @details MaximSensor includes base functions for to create new
+ * sensor classes. All sensor classes should implement this class.
+ */
+class MaximSensor
+{
+public:
+ /* PUBLIC FUNCTION DECLARATIONS */
+ /**
+ * @brief Reads from register.
+ * @details Reads specific Maxim Sensor register via SPI bus.
+ *
+ * @param[in] reg Beginning address of a register to be read.
+ * @param[out] data Buffer space to save result value.
+ * @param[in] len Number of consecutive bytes to be read.
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+ virtual int readRegister(uint8_t reg, uint8_t *data, int len);
+
+ /**
+ * @brief Writes data to Maxim Sensor register.
+ * @details Writes data to specific Maxim Sensor register via SPI bus.
+ *
+ * @param[in] reg Address of a register to be wrote.
+ * @param[in] data Data to write on register.
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+ virtual int writeRegister(uint8_t reg, const uint8_t data);
+
+ /**
+ * @brief Get Maxim Sensor part and revision info.
+ * @details Reads Maxim Sensor part and revision info from device.
+ *
+ * @param[in] reg Beginning address of a register to be read.
+ * @param[out] data Buffer space to save result value.
+ * @param[in] len Number of consecutive bytes to be read.
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+ virtual int get_part_info(uint8_t *part_id, uint8_t *rev_id);
+
+ /**
+ * @brief Enables Maxim Sensor.
+ * @details Enable IRQ, enable LEDs, enable AGC
+ *
+ * @param[in] enable Any value to enable, 0 to disable.
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+ virtual int sensor_enable(int enable);
+
+ /**
+ * @brief Enables AGC.
+ * @details Enable Maxim Sensor automatic gain controller.
+ * AGC automatically adjusts sampling rates and LED currents to save energy.
+ *
+ * @param[in] agc_enable Any value to enable, 0 to disable.
+ *
+ * @returns 0 on success, negative error code on failure.
+ */
+ virtual int agc_enable(int agc_enable);
+
+ /**
+ * @brief Get sensor part name.
+ *
+ * @returns Sensor part name string.
+ */
+ virtual const char *get_sensor_part_name();
+
+ /**
+ * @brief Get sensor algorithm version.
+ *
+ * @returns Sensor algorithm version string.
+ */
+ virtual const char *get_sensor_algo_ver();
+
+ /**
+ * @brief Get sensor name.
+ *
+ * @returns Sensor name string.
+ */
+ virtual const char *get_sensor_name();
+
+ /**
+ * @brief Get sensor ID.
+ *
+ * @returns Sensor ID number.
+ */
+ virtual unsigned char get_sensor_id();
+
+ /**
+ * @brief Dump Maxim Sensor registers.
+ * @details Print all Maxim Sensor register addresses and containing values.
+ *
+ * @param[in] reg_values Pointer to array of 256 addr_val_pairs
+ * @returns 0 on success, negative error code on failure.
+ */
+ virtual int dump_registers(addr_val_pair *reg_values)=0;
+
+ // *********************** Maxim Sensor ECG Max30001 related functions ***********************
+ virtual int MS_Max30001_ECG_InitStart(uint8_t En_ecg, uint8_t Openp, uint8_t Openn,
+ uint8_t Pol, uint8_t Calp_sel, uint8_t Caln_sel,
+ uint8_t E_fit, uint8_t Rate, uint8_t Gain,
+ uint8_t Dhpf, uint8_t Dlpf);
+
+ virtual int MS_Max30001_ECG_Stop();
+
+ // ECG Max30001 RtoR Initialization Function
+ virtual int MS_Max30001_RtoR_InitStart(uint8_t En_rtor, uint8_t Wndw, uint8_t Gain,
+ uint8_t Pavg, uint8_t Ptsf, uint8_t Hoff,
+ uint8_t Ravg, uint8_t Rhsf, uint8_t Clr_rrint);
+
+ virtual int MS_Max30001_RtoR_Stop();
+
+ // Max30001 Interrupt Assignment Function
+ virtual int MS_max30001_INT_assignment(uint8_t en_enint_loc, uint8_t en_eovf_loc, uint8_t en_fstint_loc,
+ uint8_t en_dcloffint_loc, uint8_t en_bint_loc, uint8_t en_bovf_loc,
+ uint8_t en_bover_loc, uint8_t en_bundr_loc, uint8_t en_bcgmon_loc,
+ uint8_t en_pint_loc, uint8_t en_povf_loc, uint8_t en_pedge_loc,
+ uint8_t en_lonint_loc, uint8_t en_rrint_loc, uint8_t en_samp_loc,
+ uint8_t intb_Type, uint8_t int2b_Type);
+
+ virtual int MS_max30001readRegister(uint8_t addr, uint32_t *return_data);
+
+ virtual int MS_max30001writeRegister(uint8_t addr, uint32_t data);
+
+ virtual int MS_max30001sync();
+
+ // *********************** end of Maxim Sensor ECG Max30001 related functions ****************
+
+
+
+ // *********************** Max30205 related functions ***********************
+
+
+ // *********************** end of Max30205 related functions ****************
+
+
+};
+
+#endif /* _MAXIMSENSOR_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/SPIBlockDevice/SPIFBlockDevice.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,338 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2016 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "SPIFBlockDevice.h"
+
+
+// Read/write/erase sizes
+#define SPIF_READ_SIZE 1
+#define SPIF_PROG_SIZE 1
+#define SPIF_SE_SIZE 4096
+#define SPIF_TIMEOUT 10000
+
+// Debug available
+#define SPIF_DEBUG 0
+
+// MX25R Series Register Command Table.
+enum ops {
+ SPIF_NOP = 0x00, // No operation
+ SPIF_READ = 0x03, // Read data
+ SPIF_PROG = 0x02, // Program data
+ SPIF_SE = 0x20, // 4KB Sector Erase
+ SPIF_CE = 0xc7, // Chip Erase
+ SPIF_SFDP = 0x5a, // Read SFDP
+ SPIF_WREN = 0x06, // Write Enable
+ SPIF_WRDI = 0x04, // Write Disable
+ SPIF_RDSR = 0x05, // Read Status Register
+ SPIF_RDID = 0x9f, // Read Manufacturer and JDEC Device ID
+};
+
+// Status register from RDSR
+// [- stuff -| wel | wip ]
+// [- 6 -| 1 | 1 ]
+#define SPIF_WEL 0x2
+#define SPIF_WIP 0x1
+
+
+SPIFBlockDevice::SPIFBlockDevice(
+ PinName mosi, PinName miso, PinName sclk, PinName cs, int freq)
+ : _spi(mosi, miso, sclk), _cs(cs), _size(0)
+{
+ _cs = 1;
+ _spi.frequency(freq);
+}
+
+int SPIFBlockDevice::init()
+{
+ // Check for vendor specific hacks, these should move into more general
+ // handling when possible. RDID is not used to verify a device is attached.
+ uint8_t id[3];
+ _cmdread(SPIF_RDID, 0, 3, 0x0, id);
+
+ switch (id[0]) {
+ case 0xbf:
+ // SST devices come preset with block protection
+ // enabled for some regions, issue gbpu instruction to clear
+ _wren();
+ _cmdwrite(0x98, 0, 0, 0x0, NULL);
+ break;
+ }
+
+ // Check that device is doing ok
+ int err = _sync();
+ if (err) {
+ return BD_ERROR_DEVICE_ERROR;
+ }
+
+ // Check JEDEC serial flash discoverable parameters for device
+ // specific info
+ uint8_t header[16];
+ _cmdread(SPIF_SFDP, 4, 16, 0x0, header);
+
+ // Verify SFDP signature for sanity
+ // Also check that major/minor version is acceptable
+ if (!(memcmp(&header[0], "SFDP", 4) == 0 && header[5] == 1)) {
+ return BD_ERROR_DEVICE_ERROR;
+ }
+
+ // The SFDP spec indicates the standard table is always at offset 0
+ // in the parameter headers, we check just to be safe
+ if (!(header[8] == 0 && header[10] == 1)) {
+ return BD_ERROR_DEVICE_ERROR;
+ }
+
+ // Parameter table pointer, spi commands are BE, SFDP is LE,
+ // also sfdp command expects extra read wait byte
+ uint32_t table_addr = (
+ (header[14] << 24) |
+ (header[13] << 16) |
+ (header[12] << 8 ));
+ uint8_t table[8];
+ _cmdread(SPIF_SFDP, 4, 8, table_addr, table);
+
+ // Check erase size, currently only supports 4kbytes
+ // TODO support erase size != 4kbytes?
+ // TODO support other erase opcodes from the sector descriptions
+ if ((table[0] & 0x3) != 0x1 || table[1] != SPIF_SE) {
+ return BD_ERROR_DEVICE_ERROR;
+ }
+
+ // Check address size, currently only supports 3byte addresses
+ // TODO support address > 3bytes?
+ // TODO check for devices larger than 2Gbits?
+ if ((table[2] & 0x4) != 0 || (table[7] & 0x80) != 0) {
+ return BD_ERROR_DEVICE_ERROR;
+ }
+
+ // Get device density, stored as size in bits - 1
+ uint32_t density = (
+ (table[7] << 24) |
+ (table[6] << 16) |
+ (table[5] << 8 ) |
+ (table[4] << 0 ));
+ _size = (density/8) + 1;
+
+ return 0;
+}
+
+int SPIFBlockDevice::deinit()
+{
+ // Latch write disable just to keep noise
+ // from changing the device
+ _cmdwrite(SPIF_WRDI, 0, 0, 0x0, NULL);
+
+ return 0;
+}
+
+void SPIFBlockDevice::_cmdread(
+ uint8_t op, uint32_t addrc, uint32_t retc,
+ uint32_t addr, uint8_t *rets)
+{
+
+ _cs = 0;
+ _spi.write(op);
+
+ for (uint32_t i = 0; i < addrc; i++) {
+ _spi.write(0xff & (addr >> 8*(addrc-1 - i)));
+ }
+
+ for (uint32_t i = 0; i < retc; i++) {
+ rets[i] = _spi.write(0);
+ }
+ _cs = 1;
+
+
+
+ if (SPIF_DEBUG) {
+ printf("spif <- %02x", op);
+ for (uint32_t i = 0; i < addrc; i++) {
+ if (i < addrc) {
+ printf("%02lx", 0xff & (addr >> 8*(addrc-1 - i)));
+ } else {
+ printf(" ");
+ }
+ }
+ printf(" ");
+ for (uint32_t i = 0; i < 16 && i < retc; i++) {
+ printf("%02x", rets[i]);
+ }
+ if (retc > 16) {
+ printf("...");
+ }
+ printf("\n");
+ }
+}
+
+void SPIFBlockDevice::_cmdwrite(
+ uint8_t op, uint32_t addrc, uint32_t argc,
+ uint32_t addr, const uint8_t *args)
+{
+ _cs = 0;
+ _spi.write(op);
+
+ for (uint32_t i = 0; i < addrc; i++) {
+ _spi.write(0xff & (addr >> 8*(addrc-1 - i)));
+ }
+
+ for (uint32_t i = 0; i < argc; i++) {
+ _spi.write(args[i]);
+ }
+ _cs = 1;
+
+ if (SPIF_DEBUG) {
+ printf("spif -> %02x", op);
+ for (uint32_t i = 0; i < addrc; i++) {
+ if (i < addrc) {
+ printf("%02lx", 0xff & (addr >> 8*(addrc-1 - i)));
+ } else {
+ printf(" ");
+ }
+ }
+ printf(" ");
+ for (uint32_t i = 0; i < 16 && i < argc; i++) {
+ printf("%02x", args[i]);
+ }
+ if (argc > 16) {
+ printf("...");
+ }
+ printf("\n");
+ }
+}
+
+int SPIFBlockDevice::_sync()
+{
+ for (int i = 0; i < SPIF_TIMEOUT; i++) {
+ // Read status register until write not-in-progress
+ uint8_t status;
+ _cmdread(SPIF_RDSR, 0, 1, 0x0, &status);
+
+ // Check WIP bit
+ if (!(status & SPIF_WIP)) {
+ return 0;
+ }
+
+ wait_ms(1);
+ }
+
+ return BD_ERROR_DEVICE_ERROR;
+}
+
+int SPIFBlockDevice::_wren()
+{
+ _cmdwrite(SPIF_WREN, 0, 0, 0x0, NULL);
+
+ for (int i = 0; i < SPIF_TIMEOUT; i++) {
+ // Read status register until write latch is enabled
+ uint8_t status;
+ _cmdread(SPIF_RDSR, 0, 1, 0x0, &status);
+
+ // Check WEL bit
+ if (status & SPIF_WEL) {
+ return 0;
+ }
+
+ wait_ms(1);
+ }
+
+ return BD_ERROR_DEVICE_ERROR;
+}
+
+int SPIFBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
+{
+ // Check the address and size fit onto the chip.
+ MBED_ASSERT(is_valid_read(addr, size));
+
+ _cmdread(SPIF_READ, 3, size, addr, static_cast<uint8_t *>(buffer));
+ return 0;
+}
+
+int SPIFBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t size)
+{
+ // Check the address and size fit onto the chip.
+ MBED_ASSERT(is_valid_program(addr, size));
+
+ while (size > 0) {
+ int err = _wren();
+ if (err) {
+ return err;
+ }
+
+ // Write up to 256 bytes a page
+ // TODO handle unaligned programs
+ uint32_t off = addr % 256;
+ uint32_t chunk = (off + size < 256) ? size : (256-off);
+ _cmdwrite(SPIF_PROG, 3, chunk, addr, static_cast<const uint8_t *>(buffer));
+ buffer = static_cast<const uint8_t*>(buffer) + chunk;
+ addr += chunk;
+ size -= chunk;
+
+ wait_ms(1);
+
+ err = _sync();
+ if (err) {
+ return err;
+ }
+ }
+
+ return 0;
+}
+
+int SPIFBlockDevice::erase(bd_addr_t addr, bd_size_t size)
+{
+ // Check the address and size fit onto the chip.
+ MBED_ASSERT(is_valid_erase(addr, size));
+
+ while (size > 0) {
+ int err = _wren();
+ if (err) {
+ return err;
+ }
+
+ // Erase 4kbyte sectors
+ // TODO support other erase sizes?
+ uint32_t chunk = 4096;
+ _cmdwrite(SPIF_SE, 3, 0, addr, NULL);
+ addr += chunk;
+ size -= chunk;
+
+ err = _sync();
+ if (err) {
+ return err;
+ }
+ }
+
+ return 0;
+}
+
+bd_size_t SPIFBlockDevice::get_read_size() const
+{
+ return SPIF_READ_SIZE;
+}
+
+bd_size_t SPIFBlockDevice::get_program_size() const
+{
+ return SPIF_PROG_SIZE;
+}
+
+bd_size_t SPIFBlockDevice::get_erase_size() const
+{
+ return SPIF_SE_SIZE;
+}
+
+bd_size_t SPIFBlockDevice::size() const
+{
+ return _size;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/SPIBlockDevice/SPIFBlockDevice.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,157 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2016 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef MBED_SPIF_BLOCK_DEVICE_H
+#define MBED_SPIF_BLOCK_DEVICE_H
+
+#include <mbed.h>
+#include "BlockDevice.h"
+
+
+/** BlockDevice for SPI based flash devices
+ * such as the MX25R or SST26F016B
+ *
+ * @code
+ * // Here's an example using the MX25R SPI flash device on the K82F
+ * #include "mbed.h"
+ * #include "SPIFBlockDevice.h"
+ *
+ * // Create flash device on SPI bus with PTE5 as chip select
+ * SPIFBlockDevice spif(PTE2, PTE4, PTE1, PTE5);
+ *
+ * int main() {
+ * printf("spif test\n");
+ *
+ * // Initialize the SPI flash device and print the memory layout
+ * spif.init();
+ * printf("spif size: %llu\n", spif.size());
+ * printf("spif read size: %llu\n", spif.get_read_size());
+ * printf("spif program size: %llu\n", spif.get_program_size());
+ * printf("spif erase size: %llu\n", spif.get_erase_size());
+ *
+ * // Write "Hello World!" to the first block
+ * char *buffer = (char*)malloc(spif.get_erase_size());
+ * sprintf(buffer, "Hello World!\n");
+ * spif.erase(0, spif.get_erase_size());
+ * spif.program(buffer, 0, spif.get_erase_size());
+ *
+ * // Read back what was stored
+ * spif.read(buffer, 0, spif.get_erase_size());
+ * printf("%s", buffer);
+ *
+ * // Deinitialize the device
+ * spif.deinit();
+ * }
+ * @endcode
+ */
+class SPIFBlockDevice : public BlockDevice {
+public:
+ /** Creates a SPIFBlockDevice on a SPI bus specified by pins
+ *
+ * @param mosi SPI master out, slave in pin
+ * @param miso SPI master in, slave out pin
+ * @param sclk SPI clock pin
+ * @param csel SPI chip select pin
+ * @param freq Clock speed of the SPI bus (defaults to 40MHz)
+ */
+ SPIFBlockDevice(PinName mosi, PinName miso, PinName sclk, PinName csel, int freq=40000000);
+
+ /** Initialize a block device
+ *
+ * @return 0 on success or a negative error code on failure
+ */
+ virtual int init();
+
+ /** Deinitialize a block device
+ *
+ * @return 0 on success or a negative error code on failure
+ */
+ virtual int deinit();
+
+ /** Read blocks from a block device
+ *
+ * @param buffer Buffer to write blocks to
+ * @param addr Address of block to begin reading from
+ * @param size Size to read in bytes, must be a multiple of read block size
+ * @return 0 on success, negative error code on failure
+ */
+ virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);
+
+ /** Program blocks to a block device
+ *
+ * The blocks must have been erased prior to being programmed
+ *
+ * @param buffer Buffer of data to write to blocks
+ * @param addr Address of block to begin writing to
+ * @param size Size to write in bytes, must be a multiple of program block size
+ * @return 0 on success, negative error code on failure
+ */
+ virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);
+
+ /** Erase blocks on a block device
+ *
+ * The state of an erased block is undefined until it has been programmed
+ *
+ * @param addr Address of block to begin erasing
+ * @param size Size to erase in bytes, must be a multiple of erase block size
+ * @return 0 on success, negative error code on failure
+ */
+ virtual int erase(bd_addr_t addr, bd_size_t size);
+
+ /** Get the size of a readable block
+ *
+ * @return Size of a readable block in bytes
+ */
+ virtual bd_size_t get_read_size() const;
+
+ /** Get the size of a programable block
+ *
+ * @return Size of a programable block in bytes
+ * @note Must be a multiple of the read size
+ */
+ virtual bd_size_t get_program_size() const;
+
+ /** Get the size of a eraseable block
+ *
+ * @return Size of a eraseable block in bytes
+ * @note Must be a multiple of the program size
+ */
+ virtual bd_size_t get_erase_size() const;
+
+ /** Get the total size of the underlying device
+ *
+ * @return Size of the underlying device in bytes
+ */
+ virtual bd_size_t size() const;
+
+private:
+ // Master side hardware
+ SPI _spi;
+ DigitalOut _cs;
+
+ // Device configuration discovered through sfdp
+ bd_size_t _size;
+
+ // Internal functions
+ int _wren();
+ int _sync();
+ void _cmdread(uint8_t op, uint32_t addrc, uint32_t retc,
+ uint32_t addr, uint8_t *rets);
+ void _cmdwrite(uint8_t op, uint32_t addrc, uint32_t argc,
+ uint32_t addr, const uint8_t *args);
+};
+
+
+#endif /* MBED_SPIF_BLOCK_DEVICE_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Drivers/USBDevice.lib Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,1 @@ +https://developer.mbed.org/teams/MaximIntegrated/code/USBDevice/#dad310740b28
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/USBMSD_BD/USBMSD_BD.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,165 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2012 ARM Limited
+ *
+ * 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 THE
+ * AUTHORS OR COPYRIGHT HOLDERS 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.
+ */
+/* Introduction
+ * ------------
+ * SD and MMC cards support a number of interfaces, but common to them all
+ * is one based on SPI. This is the one I'm implmenting because it means
+ * it is much more portable even though not so performant, and we already
+ * have the mbed SPI Interface!
+ *
+ * The main reference I'm using is Chapter 7, "SPI Mode" of:
+ * http://www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf
+ *
+ * SPI Startup
+ * -----------
+ * The SD card powers up in SD mode. The SPI interface mode is selected by
+ * asserting CS low and sending the reset command (CMD0). The card will
+ * respond with a (R1) response.
+ *
+ * CMD8 is optionally sent to determine the voltage range supported, and
+ * indirectly determine whether it is a version 1.x SD/non-SD card or
+ * version 2.x. I'll just ignore this for now.
+ *
+ * ACMD41 is repeatedly issued to initialise the card, until "in idle"
+ * (bit 0) of the R1 response goes to '0', indicating it is initialised.
+ *
+ * You should also indicate whether the host supports High Capicity cards,
+ * and check whether the card is high capacity - i'll also ignore this
+ *
+ * SPI Protocol
+ * ------------
+ * The SD SPI protocol is based on transactions made up of 8-bit words, with
+ * the host starting every bus transaction by asserting the CS signal low. The
+ * card always responds to commands, data blocks and errors.
+ *
+ * The protocol supports a CRC, but by default it is off (except for the
+ * first reset CMD0, where the CRC can just be pre-calculated, and CMD8)
+ * I'll leave the CRC off I think!
+ *
+ * Standard capacity cards have variable data block sizes, whereas High
+ * Capacity cards fix the size of data block to 512 bytes. I'll therefore
+ * just always use the Standard Capacity cards with a block size of 512 bytes.
+ * This is set with CMD16.
+ *
+ * You can read and write single blocks (CMD17, CMD25) or multiple blocks
+ * (CMD18, CMD25). For simplicity, I'll just use single block accesses. When
+ * the card gets a read command, it responds with a response token, and then
+ * a data token or an error.
+ *
+ * SPI Command Format
+ * ------------------
+ * Commands are 6-bytes long, containing the command, 32-bit argument, and CRC.
+ *
+ * +---------------+------------+------------+-----------+----------+--------------+
+ * | 01 | cmd[5:0] | arg[31:24] | arg[23:16] | arg[15:8] | arg[7:0] | crc[6:0] | 1 |
+ * +---------------+------------+------------+-----------+----------+--------------+
+ *
+ * As I'm not using CRC, I can fix that byte to what is needed for CMD0 (0x95)
+ *
+ * All Application Specific commands shall be preceded with APP_CMD (CMD55).
+ *
+ * SPI Response Format
+ * -------------------
+ * The main response format (R1) is a status byte (normally zero). Key flags:
+ * idle - 1 if the card is in an idle state/initialising
+ * cmd - 1 if an illegal command code was detected
+ *
+ * +-------------------------------------------------+
+ * R1 | 0 | arg | addr | seq | crc | cmd | erase | idle |
+ * +-------------------------------------------------+
+ *
+ * R1b is the same, except it is followed by a busy signal (zeros) until
+ * the first non-zero byte when it is ready again.
+ *
+ * Data Response Token
+ * -------------------
+ * Every data block written to the card is acknowledged by a byte
+ * response token
+ *
+ * +----------------------+
+ * | xxx | 0 | status | 1 |
+ * +----------------------+
+ * 010 - OK!
+ * 101 - CRC Error
+ * 110 - Write Error
+ *
+ * Single Block Read and Write
+ * ---------------------------
+ *
+ * Block transfers have a byte header, followed by the data, followed
+ * by a 16-bit CRC. In our case, the data will always be 512 bytes.
+ *
+ * +------+---------+---------+- - - -+---------+-----------+----------+
+ * | 0xFE | data[0] | data[1] | | data[n] | crc[15:8] | crc[7:0] |
+ * +------+---------+---------+- - - -+---------+-----------+----------+
+ */
+#include "USBMSD_BD.h"
+#include "mbed_debug.h"
+
+#define SD_COMMAND_TIMEOUT 5000
+
+#define SD_DBG 0
+
+USBMSD_BD::USBMSD_BD(BlockDevice* bd) {
+ _bd = bd;
+ //no init
+ _status = 0x01;
+
+// connect();
+}
+
+int USBMSD_BD::disk_initialize() {
+ _bd->init();
+ _ssize = _bd->get_erase_size();
+ _sectors = _bd->size() / _ssize;
+
+ // OK
+ _status = 0x00;
+
+ return 0;
+}
+
+int USBMSD_BD::disk_write(const uint8_t* buff, uint64_t sector, uint8_t count)
+{
+ bd_addr_t addr = (bd_addr_t)sector*_ssize;
+ bd_size_t size = (bd_size_t)count*_ssize;
+ int err = _bd->erase(addr, size);
+ err = _bd->program(buff, addr, size);
+ return err;
+}
+
+int USBMSD_BD::disk_read(uint8_t* buff, uint64_t sector, uint8_t count)
+{
+ bd_addr_t addr = (bd_addr_t)sector*_ssize;
+ bd_size_t size = (bd_size_t)count*_ssize;
+ int err = _bd->read(buff, addr, size);
+ return err;
+}
+
+int USBMSD_BD::disk_status() { return _status; }
+int USBMSD_BD::disk_sync() { return 0; }
+uint64_t USBMSD_BD::disk_sectors() { return _sectors; }
+uint64_t USBMSD_BD::disk_size() { return _bd->size(); }
+
+
+// PRIVATE FUNCTIONS
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/USBMSD_BD/USBMSD_BD.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,74 @@
+/* mbed USBMSD_BD Library, for providing file access to Block Devices
+ * Copyright (c) 2008-2010, sford
+ *
+ * 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 THE
+ * AUTHORS OR COPYRIGHT HOLDERS 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.
+ */
+
+#ifndef USBMSD_BD_H
+#define USBMSD_BD_H
+
+#include "mbed.h"
+#include "BlockDevice.h"
+#include "USBMSD.h"
+
+/** Use the SDcard as mass storage device using the USBMSD class
+ *
+ * @code
+ * #include "mbed.h"
+ * #include "USBMSD_BD.h"
+ *
+ * USBMSD_BD sd(p5, p6, p7, p8);
+ *
+ * int main() {
+ * while(1);
+ * }
+ *
+ * @endcode
+ */
+class USBMSD_BD : public USBMSD {
+public:
+
+ /** Create the File System for accessing an SD Card using SPI
+ *
+ * @param mosi SPI mosi pin connected to SD Card
+ * @param miso SPI miso pin conencted to SD Card
+ * @param sclk SPI sclk pin connected to SD Card
+ * @param cs DigitalOut pin used as SD Card chip select
+ * @param name The name used to access the virtual filesystem
+ */
+ USBMSD_BD(BlockDevice *bd);
+ virtual int disk_initialize();
+ virtual int disk_status();
+ virtual int disk_read(uint8_t * buffer, uint64_t block_number, uint8_t count);
+ virtual int disk_write(const uint8_t * buffer, uint64_t block_number, uint8_t count);
+ virtual int disk_sync();
+ virtual uint64_t disk_sectors();
+ virtual uint64_t disk_size();
+
+protected:
+
+ uint64_t _sectors;
+ bd_size_t _ssize;
+
+ uint8_t _status;
+
+ BlockDevice* _bd;
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/DeviceStudio/DSInterface.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,719 @@
+/***************************************************************************
+* Copyright (C) 2017 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 <ctype.h>
+#include <string.h>
+#include "DSInterface.h"
+
+#include "../../Utilities/mxm_assert.h"
+#include "../version.h"
+#include "Peripherals.h"
+#include "utils.h"
+#include "Thread.h"
+#include "BLE_ICARUS.h"
+
+
+
+#define HR_ENABLED 1 << 0
+#define SPO2_ENABLED 1 << 1
+#define BPT_ENABLED 1 << 2
+#define WHRM_ENABLED 1 << 3
+#define WSPO2_ENABLED 1 << 4
+#define AEC_ENABLED 1 << 5
+#define SCD_ENABLED 1 << 6
+#define AGC_ENABLED 1 << 7
+
+
+
+typedef struct {
+ uint8_t fwVersion[3];
+ uint16_t enAlgoDescBitField;
+ char me11ProductID;
+}fw_type_t;
+
+const static fw_type_t HUB_FW_TABLE[] = {
+
+ {{1,8,3}, HR_ENABLED | SPO2_ENABLED | AGC_ENABLED , 'A' },
+ {{20,1,1}, WHRM_ENABLED | SCD_ENABLED | AEC_ENABLED , 'B' },
+ {{30,1,1}, WHRM_ENABLED | WSPO2_ENABLED | AGC_ENABLED | SCD_ENABLED | AEC_ENABLED , 'C' },
+ {{40,0,4}, BPT_ENABLED | SPO2_ENABLED | AGC_ENABLED , 'D' }
+
+};
+
+static const char* ActivAlgoInfo[32] = {
+ [0] = "hr,",
+ [1] = "spo2,",
+ [2] = "bpt,",
+ [3] = "whrm,",
+ [4] = "wspo2,",
+ [5] = "aec,",
+ [6] = "scd,",
+ [7] = "agc,",
+};
+
+
+static const char *glbl_cmds[] = {
+ "stop",
+ "get_device_info",
+ "silent_mode 0",
+ "silent_mode 1",
+ "pause 0",
+ "pause 1",
+ "enable console",
+ "disable console",
+ "set_cfg lcd time",
+ "set_cfg flash log",
+ "set_cfg stream ascii", // set streaming mode to ascii
+ "set_cfg stream bin", // set streaming mode to binary
+ "set_cfg report 1", //set report mode to 1 (brief)
+ "set_cfg report 2" // set report mode to 2 (long)
+};
+
+typedef enum {
+ stop=0,
+ get_device_info,
+ silent0_mode,
+ silent1_mode,
+ pause0_mode,
+ pause1_mode,
+ enable_console,
+ disable_console,
+ set_lcd_time,
+ set_flash_log,
+ enable_ascii_mode,
+ enable_bin_mode,
+ set_cfg_report_1,
+ set_cfg_report_2,
+ NUM_CMDS,
+} glbl_cmd_state;
+
+
+DSInterface::DSInterface(USBSerial* USB)
+ :flash_thread_(osPriorityNormal, 2 * 1024)
+{
+ cmd_idx = 0;
+ silent_mode = false;
+ pause_mode = false;
+
+ memset(sensor_list, 0, DS_MAX_NUM_SENSORCOMMS * sizeof(SensorComm*));
+ num_sensors = 0;
+
+ m_USB = USB;
+
+ ds_console_interface_exists_ = false;
+ recordingStarted = false;
+
+ ds_queue_flash_ = &ds_queue_one_;
+ ds_queue_fill_ = &ds_queue_two_;
+ queue_init(ds_queue_flash_, buffer_one_, FLASH_MESSAGE_SIZE, sizeof(buffer_one_));
+ queue_init(ds_queue_fill_, buffer_two_, FLASH_MESSAGE_SIZE, sizeof(buffer_two_));
+ flash_thread_.start(callback(&event_queue_, &EventQueue::dispatch_forever));
+}
+
+DSInterface::~DSInterface()
+{
+}
+
+void DSInterface::add_sensor_comm(SensorComm *s)
+{
+ mxm_assert_msg(num_sensors < DS_MAX_NUM_SENSORCOMMS, "Too many sensors added to DSInterface. Increase DS_MAX_NUM_SENSORCOMMS.");
+ sensor_list[num_sensors++] = s;
+}
+
+void DSInterface::enable_console_interface()
+{
+ ds_console_interface_exists_ = true;
+}
+
+void DSInterface::ds_set_ble_status(bool en){
+ SensorComm *p_sensor;
+ ds_ble_interface_exists_ = en;
+
+ for(int sensor_num = 0; sensor_num < num_sensors; ++sensor_num) {
+ p_sensor = sensor_list[sensor_num];
+ p_sensor->SensorComm_Set_Ble_Status(ds_ble_interface_exists_);
+ }
+}
+
+void DSInterface::ds_set_flash_rec_status(bool en) {
+ SensorComm *p_sensor;
+ recordingStarted = en;
+ for(int sensor_num = 0; sensor_num < num_sensors; ++sensor_num) {
+ p_sensor = sensor_list[sensor_num];
+ p_sensor->SensorComm_Set_Flash_Status(en);
+ }
+}
+
+void DSInterface::build_command(char ch)
+{
+ if (!this->silent_mode) /* BUG: POTENTIAL BUG, what uart port to echo, not only console */
+ m_USB->printf("%c", ch);
+
+ if (ch == 0x00) {
+ pr_err("Ignored char 0x00");
+ return;
+ }
+
+ if ((ch == '\n') || (ch == '\r')) {
+ if (cmd_idx < (int)CONSOLE_STR_BUF_SZ)
+ cmd_str[cmd_idx++] = '\0';
+ m_USB->printf("\r\n");
+ parse_command();
+
+ //Clear cmd_str
+ while (cmd_idx > 0) /* BUG: POTENTIAL BUG for multiple port access */
+ cmd_str[--cmd_idx] = '\0';
+
+ } else if ((ch == 0x08 || ch == 0x7F) && cmd_idx > 0) {
+ //Backspace character
+ if (cmd_idx > 0)
+ cmd_str[--cmd_idx] = '\0';
+ } else {
+ /* BUG: POTENTIAL BUG for multiple port access */
+ if (cmd_idx < (int)CONSOLE_STR_BUF_SZ)
+ cmd_str[cmd_idx++] = ch;
+ }
+
+}
+
+void DSInterface::stopcommand() {
+ for (int i = 0; i < num_sensors; i++) {
+ sensor_list[i]->stop();
+ }
+ ds_set_flash_rec_status(false);
+
+}
+
+void DSInterface::parse_command_str(const char* cmd ) {
+ strncpy(cmd_str, cmd , strlen(cmd) + 1);
+ parse_command();
+}
+
+void DSInterface::write_to_flash_thread_funct() {
+ //static Timer mytimer;
+ //mytimer.reset();
+ //mytimer.start();
+ fwrite((uint8_t*)ds_queue_flash_->base, 1, ds_queue_flash_->item_size * ds_queue_flash_->num_item, flashFileHandle);
+ queue_reset(ds_queue_flash_);
+ //mytimer.stop();
+ //printf("%f seconds\n", mytimer.read());
+}
+
+void DSInterface::parse_command()
+{
+ int i;
+ glbl_cmd_state cmd;
+ char charbuf[512];
+ char tempbuf[32];
+ int data_len = 0;
+ int data_len_log=0;
+ int ret;
+ bool parsed_cmd = true;
+
+ printf("%s \n",cmd_str );
+
+ //If top level command, then handle it
+ for (i = 0; i < NUM_CMDS; i++) {
+ if (starts_with(&cmd_str[0], glbl_cmds[i])) {
+ cmd = (glbl_cmd_state)i;
+
+ switch (cmd) {
+ case (enable_ascii_mode): {
+ sensor_list[0]->AsciiEn = true;
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=0\r\n", cmd_str);
+ } break;
+ case (enable_bin_mode): {
+ sensor_list[0]->AsciiEn = false;
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=0\r\n", cmd_str);
+ } break;
+ case (stop): {
+ for (int i = 0; i < num_sensors; i++) {
+ sensor_list[i]->stop();
+ }
+
+ ds_set_flash_rec_status(false);
+
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=0\r\n", cmd_str);
+ } break;
+ case (get_device_info): {
+
+ data_len = snprintf(charbuf, sizeof(charbuf),
+ "\r\n%s platform=%s firmware_ver=%s sensors=", cmd_str, platform_name, FIRMWARE_VERSION);
+
+ //Add list of sensors
+ for (int i = 0; i < num_sensors; i++) {
+ if (sensor_list[i]->is_visible()) {
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len,
+ "%s", sensor_list[i]->get_type());
+ if (i < (num_sensors - 1))
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len, ",");
+ }
+ }
+
+
+ for (int i = 0; i < num_sensors; i++) {
+ SensorComm *s = sensor_list[i];
+ if (!s->is_visible())
+ continue;
+
+ //Add algo_ver
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len,
+ " algo_ver_%s=%s", s->get_type(), s->get_algo_ver());
+
+ //Add part name
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len,
+ " part_name_%s=%s", s->get_type(), s->get_part_name());
+
+ uint8_t part_id, part_rev;
+ ret = s->get_part_info(&part_id, &part_rev);
+
+ if (ret == 0) {
+ //Add part id
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len,
+ " part_id_%s=%d", s->get_type(), part_id);
+
+ //Add rev id
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len,
+ " part_rev_%s=%d", s->get_type(), part_rev);
+ }
+ }
+
+ if(firmware_version){
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len, " hub_firm_ver=%s", firmware_version);
+ if(algo_desc_strsz > 0)
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len, "%s", algo_desc_string);
+ }
+
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len, " err=0\r\n");
+
+ } break;
+ case (silent0_mode): {
+ silent_mode = false;
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=0\r\n", cmd_str);
+ } break;
+ case (silent1_mode): {
+ silent_mode = true;
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=0\r\n", cmd_str);
+ } break;
+ case (pause0_mode): {
+ pause_mode = false;
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=0\r\n", cmd_str);
+ } break;
+ case (pause1_mode): {
+ pause_mode = true;
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=0\r\n", cmd_str);
+ } break;
+ case (enable_console): {
+ ds_console_interface_exists_ = true;
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=0\r\n", cmd_str);
+ } break;
+ case (disable_console): {
+ ds_console_interface_exists_ = false;
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=0\r\n", cmd_str);
+ } break;
+ case (set_lcd_time): {
+
+ while(1)
+ {
+ if(cmd_str[17+lcd_time_count] == '\0')
+ {
+ lcd_time_str[lcd_time_count] = '\0';
+ break;
+ }
+ lcd_time_str[lcd_time_count] = cmd_str[17+lcd_time_count];
+ lcd_time_count++;
+ }
+
+ sscanf(lcd_time_str,"%d",&lcd_time_val);
+
+ set_time(lcd_time_val);
+
+ lcd_time_count=0;
+
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=0\r\n", cmd_str);
+
+ } break;
+ case (set_flash_log): {
+
+
+
+ if(cmd_str[18] == '1' )
+ {
+
+
+
+ time_t seconds;
+ seconds = time(NULL);
+ strftime(tempbuf, 32, "/fs/log-%I-%M-%S.maximlog", localtime(&seconds));
+
+ flashFileHandle = fopen(tempbuf, "w+");
+
+ if ( flashFileHandle != NULL ) {
+
+ fprintf(flashFileHandle,"mxim");
+
+ //1 byte to indicate the version of the log
+ unsigned char vers = 0;
+ //4 bytes to indicate the number of bytes used to write the format
+ unsigned int NumByteBLE = 764;
+ unsigned int NumByteNoBLE = 659;
+
+ fwrite(&vers,sizeof(unsigned char),1,flashFileHandle);
+
+ if(BLE::Instance().gap().getState().connected){
+ fwrite(&NumByteBLE,sizeof(unsigned int),1,flashFileHandle);
+ }
+ else
+ fwrite(&NumByteNoBLE,sizeof(unsigned int),1,flashFileHandle);
+
+ ds_set_flash_rec_status(true);
+
+ //Write the formats
+ data_len_log += snprintf(logbuf+data_len_log, sizeof(logbuf) - data_len_log- 1,"ppg 0 cs=1 format={smpleCnt,16},"
+ "{grnCnt,20},{grn2Cnt,20},{accelX,14,3},{accelY,14,3},"
+ "{accelZ,14,3},{hr,12},{hrconf,8},{r,11,1},{activity,8}\n"
+ "ppg 1 cs=1 format={smpleCnt,8},{irCnt,20},{redCnt,20},{accelX,14,3},"
+ "{accelY,14,3},{accelZ,14,3},{r,12,1},{wspo2conf,8},"
+ "{spo2,11,1},{wspo2percentcomplete,8},{wspo2lowSNR,1},{wspo2motion,1},{status,8}\n"
+ "bpt 0 cs=1 format={status,4},{irCnt,19},{hr,9},"
+ "{prog,9},{sys_bp,9},{dia_bp,9}\n"
+ "bpt 1 cs=1 format={status,4},{irCnt,19},{hr,9},"
+ "{prog,9},{sys_bp,9},{dia_bp,9}\n");
+ if(BLE::Instance().gap().getState().connected){
+ data_len_log += snprintf(logbuf+data_len_log, sizeof(logbuf) -data_len_log- 1,"ecg 1 cs=1 format={smpleCnt,8},{rtor,14},{rtorbpm,8},"
+ "{pTag.0,3},{eTag.0,3},{ecg.0,18},{pTag.1,3},{eTag.1,3},{ecg.1,18},"
+ "{pTag.2,3},{eTag.2,3},{ecg.2,18},{pTag.3,3},{eTag.3,3},{ecg.3,18}\n");
+ }else{
+ data_len_log += snprintf(logbuf+data_len_log, sizeof(logbuf) -data_len_log- 1,"ecg 1 cs=1 format={smpleCnt,8},{pTag,3},{eTag,3},"
+ "{ecg,18},{rtor,14},{rtorbpm,8}\n");
+ }
+ data_len_log += snprintf(logbuf+data_len_log, sizeof(logbuf)-data_len_log - 1,"ecg 2 cs=1 format={smplCnt,8},{rtor,15}\n");
+ data_len_log += snprintf(logbuf+data_len_log, sizeof(logbuf) -data_len_log-1,"temp 0 cs=1 format={smpleCnt,8},{temp,16,2}\n");
+
+
+ fprintf(flashFileHandle,logbuf,data_len_log);
+ }
+ else {
+ ds_set_flash_rec_status(false);
+ }
+
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=0\r\n", cmd_str);
+
+
+
+ }
+
+ else if (cmd_str[18] == '0'){
+ ds_set_flash_rec_status(false);
+ handle_file_close();
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,"\r\n%s err=0\r\n", cmd_str);
+ }
+ else{
+ //print cmd not recognized string
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,"\r\n%s err=-255\r\n", cmd_str);
+ }
+
+ } break;
+ case (set_cfg_report_1): {
+ //m_USB->printf("\r\n MODE 1\r\n");
+ algo_report_mode = 1;
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=0\r\n", cmd_str);
+
+ } break;
+ case (set_cfg_report_2): {
+ //m_USB->printf("\r\n MODE 2\r\n");
+ algo_report_mode = 2;
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=0\r\n", cmd_str);
+ } break;
+ default:
+ parsed_cmd = false;
+ break;
+ }
+
+ if (parsed_cmd) {
+ m_USB->printf(charbuf);
+
+ if (BLE::Instance().gap().getState().connected) {
+ BLE_Icarus_AddtoQueue((uint8_t *)charbuf, (int32_t)sizeof(charbuf), data_len);
+ }
+
+ }
+
+ return;
+ }
+ }
+
+ //Set the stream type to check the data streaming type later
+ if(starts_with(&cmd_str[0],"read ppg 0")){
+ stream_type=0x00;
+ }
+ else if(starts_with(&cmd_str[0],"read ppg 1")){
+ stream_type=0x01;
+ }
+ else if(starts_with(&cmd_str[0],"read bpt 0")){
+ stream_type=0x02;
+ }
+ else if(starts_with(&cmd_str[0],"read bpt 1")){
+ stream_type=0x03;
+ }
+ else if(starts_with(&cmd_str[0],"read ecg 1")){
+ stream_type=0x04;
+ }
+ else if(starts_with(&cmd_str[0],"read ecg 2")){
+ stream_type=0x05;
+ }
+ else if(starts_with(&cmd_str[0],"read temp 0")){
+ stream_type=0x06;
+ }
+
+ //Loop through each sensor in sensorList
+ //If sensor.get_type() is contained in cmd_str, pass cmd_str to that sensor's parser
+ for (int i = 0; i < num_sensors; i++) {
+ if (strstr(&cmd_str[0], sensor_list[i]->get_type())) {
+ if (sensor_list[i]->parse_command(cmd_str))
+ return;
+
+ break;
+ }
+ }
+
+ //If we still haven't found a way to parse the command,
+ //send it to every sensor until one handles it
+ for (int i = 0; i < num_sensors; i++) {
+ if (sensor_list[i]->parse_command(cmd_str))
+ return;
+ }
+
+
+ //No one could handle the command, print cmd not recognized string
+ data_len += snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=-255\r\n", cmd_str);
+ m_USB->printf(charbuf);
+
+ if (BLE::Instance().gap().getState().connected) {
+ BLE_Icarus_AddtoQueue((uint8_t *)charbuf, (int32_t)sizeof(charbuf), data_len);
+ }
+
+}
+
+void DSInterface::swap_queues() {
+ if(flash_thread_.get_state() != Thread::WaitingEventFlag){
+ printf("overflow happened state %d\r\n", flash_thread_.get_state());
+ return;
+ }
+ queue_t * temp_queue = ds_queue_flash_;
+ ds_queue_flash_ = ds_queue_fill_;
+ ds_queue_fill_ = temp_queue;
+ event_queue_.call(Callback<void()>(this, &DSInterface::write_to_flash_thread_funct));
+}
+
+void DSInterface::handle_file_close() {
+ //if recording is enabled do not close the file
+ if(recordingStarted) {
+ return;
+ }
+ if(flashFileHandle != NULL) {
+ if(flash_thread_.get_state() != Thread::WaitingEventFlag)
+ return;
+
+ if(ds_queue_fill_->num_item){
+ swap_queues();
+ return;
+ }
+ printf("closing file\r\n");
+ fclose(flashFileHandle);
+ flashFileHandle = NULL;
+ }
+}
+
+
+void DSInterface::force_file_close() {
+ if(flashFileHandle != NULL) {
+ while(flash_thread_.get_state() != Thread::WaitingEventFlag) {
+ wait_ms(1);
+ }
+
+ if(ds_queue_fill_->num_item){
+ swap_queues();
+ }
+
+ while(flash_thread_.get_state() != Thread::WaitingEventFlag) {
+ wait_ms(1);
+ }
+
+ //printf("closing file\r\n");
+ fclose(flashFileHandle);
+ flashFileHandle = NULL;
+ }
+}
+
+#define ECGSENSOR_ID 0x02 //TODO:FIX THESE
+#define ECGSENSOR_DATA_REPORT_MODE 0x04 //TODO:FIX THESE
+void DSInterface::data_report_execute() {
+ char buffer[256];
+ int data_len = 0;
+ buffer[0] = '\0';
+ int ret;
+ bool all_sensors_disabled = true;
+
+ for (int i = 0; i < num_sensors; i++) {
+ //if ((*it)->is_enabled()) {
+
+ if(!recordingStarted)
+ data_len = sensor_list[i]->data_report_execute(buffer, sizeof(buffer));
+ else
+ data_len = sensor_list[i]->data_report_execute(buffer + FLASH_MESSAGE_OFFSET
+ , sizeof(buffer) - FLASH_MESSAGE_OFFSET);
+
+ if (!this->pause_mode && (data_len > 0)) {
+ all_sensors_disabled = false;
+
+ if ((flashFileHandle != NULL) && (recordingStarted)) {
+ if(data_len + FLASH_MESSAGE_OFFSET != ds_queue_flash_->item_size) {
+ printf("Reinit item size: %d\r\n", data_len);
+ queue_update_items_size(ds_queue_flash_, (data_len+ FLASH_MESSAGE_OFFSET));
+ queue_update_items_size(ds_queue_fill_, (data_len+ FLASH_MESSAGE_OFFSET));
+ }
+ //set stream type
+ buffer[0] = stream_type;
+
+ // enqueue data
+ ret = enqueue(ds_queue_fill_, buffer);
+ if(ret != 0) {
+ printf("enqueue has failed %d\r\n", ds_queue_fill_->num_item);
+ }
+ if(queue_is_full(ds_queue_fill_)) {
+ swap_queues();
+ }
+ }
+
+
+ if (BLE::Instance().gap().getState().connected & !recordingStarted) {
+ ds_console_interface_exists_ = false;
+ BLE_Icarus_AddtoQueue((uint8_t *)buffer, (int32_t)sizeof(buffer), data_len);
+ }
+
+ if (ds_console_interface_exists_ & !recordingStarted){
+ if(sensor_list[0]->AsciiEn){
+ m_USB->printf(buffer);
+ }
+ else{
+ m_USB->writeBlock((uint8_t*)buffer, data_len);
+ }
+ }
+ data_len = 0;
+ }
+ }
+
+ if(all_sensors_disabled)
+ handle_file_close();
+}
+
+void DSInterface::set_fw_version(const char* version)
+{
+ if (version && *version){
+ firmware_version = version;
+ algo_desc_strsz = get_fw_algorithms();
+ }
+}
+
+int DSInterface::get_fw_algorithms( void )
+{
+
+ int i, fwToReport;
+ char *start, *end;
+ uint8_t fwIdx[3];
+
+ start = (char*) firmware_version;
+
+ /*MYG: no need to optimize ,lib function call, just called once at start of execution*/
+
+ fwIdx[0] = (uint8_t) strtol(start,&end, 10) ; start = end;
+ fwIdx[1] = (uint8_t) strtol(start+1,&end, 10); start = end;
+ fwIdx[2] = (uint8_t) strtol(start+1,&end, 10);
+
+ fwToReport = -1;
+ for( i = 0 ; i < sizeof(HUB_FW_TABLE)/ sizeof(fw_type_t); i++ ){
+
+ if( HUB_FW_TABLE[i].fwVersion[0] == fwIdx[0]/* &
+ HUB_FW_TABLE[i].fwVersion[1] == fwIdx[1] &
+ HUB_FW_TABLE[i].fwVersion[2] == fwIdx[2] */) {
+
+ fwToReport = i;
+ break;
+ }
+ }
+
+ if(fwToReport == -1){
+ return -1;
+ }
+
+ i = ((fwToReport == -1)? 0:1) * ( /*32 bit*/ 32 - __builtin_clz(HUB_FW_TABLE[fwToReport].enAlgoDescBitField));
+
+ strcpy(&algo_desc_string[0], " fw_algos=");
+ int tail = strlen(" fw_algos=");
+
+ int descStrSz = sizeof(algo_desc_string);
+ while(--i && tail < descStrSz) {
+
+ if( (HUB_FW_TABLE[fwToReport].enAlgoDescBitField >> i) & 0x0001) {
+ strcpy( &algo_desc_string[tail], ActivAlgoInfo[i]);
+ tail += strlen(ActivAlgoInfo[i]);
+ }
+
+ }
+ strcpy( &algo_desc_string[tail-1]," ");
+
+ return tail;
+ //m_USB->printf("%d %s \r\n", tail , algo_desc_string);
+
+}
+
+void DSInterface::set_fw_platform(const char* platform)
+{
+ if (platform && *platform)
+ platform_name = platform;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/DeviceStudio/DSInterface.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,214 @@
+/*******************************************************************************
+ * Copyright (C) 2017 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 _DSINTERFACE_H_
+#define _DSINTERFACE_H_
+
+#include "mbed.h"
+#include <stdint.h>
+#include "SensorComm.h"
+#include "MaximSensor.h"
+#include "USBSerial.h"
+#include "../../Utilities/queue.h"
+#include "FATFileSystem.h"
+
+
+#define COMM_SUCCESS 0
+#define COMM_GENERAL_ERROR -1
+#define COMM_INVALID_PARAM -254
+#define COMM_NOT_RECOGNIZED -255
+
+#define FLASH_ERR_GENERAL -1
+#define FLASH_ERR_CHECKSUM -2
+#define FLASH_ERR_AUTH -3
+
+#define DS_MAX_NUM_SENSORCOMMS 8
+
+#define DS_BINARY_PACKET_START_BYTE 0xAA
+
+#define FLASH_MESSAGE_SIZE 32
+#define CIRCULAR_QUEUE_COUNT 256
+#define FLASH_MESSAGE_OFFSET 1
+
+
+/**
+ * @brief DSInterface is Maxim's DeviceStudio Interface class
+ */
+class DSInterface
+{
+public:
+
+ /* PUBLIC FUNCTION DECLARATIONS */
+ /**
+ * @brief DSInterface constructor.
+ *
+ * @param[in] fw_version Firmware version number.
+ * @param[in] fw_platform Firmware platform name.
+ * @param[in] USB Pointer to USBSerial device
+ */
+ DSInterface(USBSerial* USB);
+
+ /**
+ * @brief DSInterface destructor.
+ *
+ */
+ virtual ~DSInterface();
+
+ /**
+ * @brief Add SensorComm for DSInterface to pass commands to
+ *
+ * @param[in] s SensorComm instance to handle sensor commands.
+ */
+ void add_sensor_comm(SensorComm *s);
+
+ /**
+ * @brief Command builder from i/o device.
+ * @details Reads character and builds command from DeviceStudio commands.
+ *
+ * @param[in] ch Input character from i/o device.
+ */
+ void build_command(char ch);
+
+ /**
+ * @brief Prints latest sensor data to USB stream
+ * @details Should be called on every pass thorugh the main loop in main.cpp
+ *
+ */
+ void data_report_execute();
+
+ void handle_file_close();
+
+ void force_file_close();
+
+ void swap_queues();
+
+ /**
+ * @brief Set the fw version which DSInterface will replay with for "get_device_info" command
+ *
+ * @param[in] fw_version Firmware version number.
+ */
+ void set_fw_version(const char *fw_version);
+
+ /**
+ * @brief get the algorithms define within sesnor hub fw version
+ *
+ * @param[out] algorihm description string
+ */
+ int get_fw_algorithms( void );
+ /**
+ * @brief Set the fw platform which DSInterface will replay with for "get_device_info" command
+ *
+ * @param[in] fw_platform Firmware platform name.
+ */
+ void set_fw_platform(const char *fw_platform);
+
+ /**
+ * @brief Enable data output on the console interface (USB)
+ */
+ void enable_console_interface();
+
+ void ds_set_ble_status(bool en);
+
+ void ds_set_flash_rec_status(bool en);
+
+ void stopcommand();
+ void parse_command_str(const char* cmd );
+ uint8_t algo_report_mode = 1; // sets the mode for report 1/2
+
+
+ // FATFileSystem *logfilesystem;
+ FILE *flashFileHandle;
+
+
+ bool recordingStarted;
+
+
+protected:
+
+ /* PROTECTED FUNCTION DECLARATIONS */
+ /**
+ * @brief Parses DeviceStudio commands.
+ * @details Parses and executes commands. Prints return code to i/o device.
+ */
+ void parse_command();
+
+ void write_to_flash_thread_funct();
+
+
+ /* PROTECTED VARIABLES */
+ USBSerial *m_USB;
+ Mutex comm_mutex;
+
+ int num_sensors;
+ SensorComm* sensor_list[DS_MAX_NUM_SENSORCOMMS];
+
+ volatile uint8_t ds_console_interface_exists_;
+ volatile uint8_t ds_ble_interface_exists_;
+
+ const char* platform_name;
+ const char* firmware_version;
+
+ char algo_desc_string[128];
+ int algo_desc_strsz;
+
+ static const uint32_t CONSOLE_STR_BUF_SZ = 1024;
+
+ char cmd_str[CONSOLE_STR_BUF_SZ];
+ int cmd_idx;
+ bool silent_mode;
+ bool pause_mode;
+ char lcd_time_str[30];
+ int lcd_time_count=0;
+ int lcd_time_val;
+
+ //buffer to hold string that will be written into the log file
+ char logbuf[1024];
+
+ //Flag to check which type of data streaming will occur
+ char stream_type;
+
+ // flash logging variables
+ queue_t ds_queue_one_;
+ queue_t ds_queue_two_;
+
+ queue_t *ds_queue_flash_;
+ queue_t *ds_queue_fill_;
+
+ unsigned char buffer_one_[CIRCULAR_QUEUE_COUNT * FLASH_MESSAGE_SIZE];
+ unsigned char buffer_two_[CIRCULAR_QUEUE_COUNT * FLASH_MESSAGE_SIZE];
+
+ EventQueue event_queue_;
+ Thread flash_thread_;
+};
+
+#endif /* _DSINTERFACE_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/SensorComm/EcgComm/EcgComm.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,461 @@
+ /***************************************************************************
+* Copyright (C) 2017 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 "EcgComm.h"
+#include "EcgComm_Defines.h"
+#include <ctype.h>
+#include "CRC8.h"
+#include "Peripherals.h"
+#include "utils.h"
+#include "MAX30001_Helper.h"
+#include "BLE_ICARUS.h"
+
+#define ECG_REG_COUNT 64
+
+const char *cmd_tbl_ecg[] = {
+ "int",
+ "get_format ecg 1",
+ "get_format ecg 2",
+ "read ecg 1", //ecg
+ "read ecg 2", //android app data streaming mode
+ "get_reg ecg",
+ "set_reg ecg",
+ "dump_reg ecg",
+ "set_cfg ecg invert"
+};
+
+typedef union {
+ struct {
+ uint32_t ptag :3;
+ uint32_t etag :3;
+ uint32_t ecg_data :16;
+ uint32_t reserved :8;
+ };
+ int32_t ecg_data_whole;
+} ecg_data_parser;
+
+EcgComm::EcgComm(USBSerial* USB):
+ SensorComm("ecg", true)
+{
+ m_USB = USB;
+}
+
+void EcgComm::stop()
+{
+ int ret;
+ comm_mutex.lock();
+ data_report_mode = 0;
+ comm_mutex.unlock();
+ sample_count = 0;
+ ret = sensor->sensor_enable(0);
+ if (ret < 0) {
+ pr_err("sensor_enable failed. ret: %d", ret);
+ }
+}
+
+bool EcgComm::parse_command(const char* cmd)
+{
+ int i;
+ int ret = EXIT_SUCCESS;
+ uint8_t reg_addr;
+ uint32_t reg_val = 0;
+ bool recognizedCmd = false;
+ uint8_t params[32];
+ char charbuf[768];
+ int data_len = 0;
+ addr_val_pair reg_vals[ECG_REG_COUNT];
+ int comma = 0;
+
+ if (sensor == NULL) {
+ pr_err("sensor object is invalid!");
+ return false;
+ }
+
+ for (i = 0; i < NUM_CMDS; i++) {
+ if (starts_with(cmd, cmd_tbl_ecg[i])) {
+ cmd_state_t user_cmd = (cmd_state_t)i;
+ recognizedCmd = true;
+ switch (user_cmd) {
+ case get_format_1:
+ if(AsciiEn)
+ {
+ m_USB->printf("\r\n%s format=smpleCnt,ecg err=0\r\n",
+ cmd);
+ }
+ else
+ {
+
+ if(BLE::Instance().gap().getState().connected) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s enc=bin cs=1 format={smpleCnt,8},{rtor,14},{rtorbpm,8},"
+ "{pTag.0,3},{eTag.0,3},{ecg.0,18},"
+ "{pTag.1,3},{eTag.1,3},{ecg.1,18},"
+ "{pTag.2,3},{eTag.2,3},{ecg.2,18},"
+ "{pTag.3,3},{eTag.3,3},{ecg.3,18} err=0\r\n", cmd);
+ } else {
+ m_USB->printf("\r\n%s enc=bin cs=1 format={smpleCnt,8},{pTag,3},{eTag,3},"
+ "{ecg,18},{rtor,14},{rtorbpm,8} err=0\r\n", cmd);
+ }
+ }
+ break;
+ case get_format_2:
+ if(AsciiEn)
+ {
+ m_USB->printf("\r\n%s format=smpleCnt,rtor err=0\r\n",
+ cmd);
+ }
+ else
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s enc=bin cs=1 format={smplCnt,8},{rtor,15} err=0\r\n",
+ cmd);
+ m_USB->printf(charbuf);
+ }
+ break;
+ case ecg_mode:
+
+ comm_mutex.lock();
+ data_report_mode = ecg_mode;
+ comm_mutex.unlock();
+ ret = sensor->sensor_enable(1);
+ if (ret < 0) {
+ pr_err("sensor_enable failed. ret: %d", ret);
+ }
+
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, ret);
+ m_USB->printf(charbuf);
+ break;
+ case ecg_mode_2:
+ comm_mutex.lock();
+ data_report_mode = ecg_mode_2;
+ comm_mutex.unlock();
+ ret = ((MAX30001_Helper*)sensor)->Max30001Helper_SetECGSampleRate(MAX30001_Helper::k128SPS);
+ ret |= sensor->sensor_enable(1);
+ if (ret < 0) {
+ pr_err("sensor_enable failed. ret: %d", ret);
+ }
+
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, ret);
+ m_USB->printf(charbuf);
+ break;
+
+ case get_reg:
+ reg_addr = 0;
+ reg_val = 0;
+ ret = parse_get_reg_cmd(cmd, sensor_type, ®_addr);
+ if (!ret) {
+ ret = sensor->MS_max30001readRegister(reg_addr, ®_val);
+ if(ret == 0) {
+ data_len = snprintf(charbuf, sizeof(charbuf),
+ "\r\n%s reg_val=%08X err=%d\r\n", cmd, reg_val, ret);
+ m_USB->printf(charbuf);
+ }else {
+ data_len = snprintf(charbuf, sizeof(charbuf),
+ "\r\n%s err=%d\r\n", cmd, ret);
+ m_USB->printf(charbuf);
+ }
+ }else{
+ data_len = snprintf(charbuf, sizeof(charbuf),
+ "\r\n%s err=%d\r\n", cmd, ret);
+ m_USB->printf(charbuf);
+ }
+ break;
+ case set_reg:
+ reg_addr = 0;
+ reg_val = 0;
+ ret = parse_set_reg_cmd(cmd, sensor_type, ®_addr, ®_val);
+ if (!ret) {
+ ret = sensor->MS_max30001writeRegister(reg_addr, reg_val);
+ if(ret == 0) {
+ data_len = snprintf(charbuf, sizeof(charbuf),
+ "\r\n%s err=%d\r\n", cmd, ret);
+ m_USB->printf(charbuf);
+ }else {
+ data_len = snprintf(charbuf, sizeof(charbuf),
+ "\r\n%s err=%d\r\n", cmd, ret);
+ m_USB->printf(charbuf);
+ }
+ }else{
+ data_len = snprintf(charbuf, sizeof(charbuf),
+ "\r\n%s err=%d\r\n", cmd, ret);
+ m_USB->printf(charbuf);
+ }
+ break;
+ case dump_regs:
+ for (int j = 0; j < ECG_REG_COUNT; j++) {
+ reg_vals[j].addr = 0xFF;
+ }
+ ret = sensor->dump_registers(reg_vals);
+
+ if (ret) {
+ m_USB->printf("\r\n%s err=%d\n", cmd, ret);
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\n", cmd, ret);
+ }
+ else {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s reg_val=", cmd);
+ comma = false;
+
+ for (int reg = 0; reg < ECG_REG_COUNT; reg++) {
+ if(reg_vals[reg].addr == 0xFF)
+ break;
+
+ if (comma) {
+ data_len += snprintf(charbuf + data_len,
+ sizeof(charbuf) - data_len - 1, ",");
+ }
+ data_len += snprintf(charbuf + data_len,
+ sizeof(charbuf) - data_len - 1,
+ "{%X,%X}", (unsigned int)reg_vals[reg].addr, (unsigned int)reg_vals[reg].val);
+ comma = 1;
+ }
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1, " err=0\r\n");
+ m_USB->printf(charbuf);
+ }
+ break;
+ case InterruptInit:
+ ret = ECG_Parse_Parameters_Single((cmd + strlen(cmd_tbl_ecg[i])), params, kInterruptParametersCount);
+ if(ret != 0){
+ printf("ECG_Parse_Parameters_Single has failed\n");
+ break;
+ }
+ ret = sensor->MS_max30001_INT_assignment(params[0], params[1], params[2],
+ params[3], params[4], params[5],
+ params[6], params[7], params[8],
+ params[9], params[10], params[11],
+ params[12], params[13], params[14],
+ params[15], params[16]);
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, ret == 0 ? 0 : -255);
+ break;
+
+ case set_cfg_ecg_invert: {
+ ret = ((MAX30001_Helper*)sensor)->MAX30001_Helper_Invert_Waveform();
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, ret);
+ } break;
+
+ default:
+ break;
+ }
+
+
+ if (BLE::Instance().gap().getState().connected) {
+ BLE_Icarus_AddtoQueue((uint8_t *)charbuf, (int32_t)sizeof(charbuf), data_len);
+ }
+
+
+ }
+ }
+
+ return recognizedCmd;
+}
+
+int EcgComm::data_report_execute(char* buf, int size)
+{
+ int ret = 0;
+ int16_t data_len = 0;
+ uint8_t tmp_report_mode;
+ ecg_sensor_report sensor_report = {0};
+ ecg_sensor_report sensor_report_2 = {0};
+ ecg_sensor_report sensor_report_3 = {0};
+ ecg_sensor_report sensor_report_4 = {0};
+ ecg1_comm_packet* data_packet;
+ ecg_comm_packet_ble* data_packet_ble;
+
+ if(!is_enabled())
+ return 0;
+
+ if (sensor == NULL)
+ return 0;
+
+ comm_mutex.lock();
+ tmp_report_mode = data_report_mode;
+ comm_mutex.unlock();
+
+ if(((MAX30001_Helper*)sensor)->Max30001Helper_getInterruptStatus()) {
+ ((MAX30001_Helper*)sensor)->Max30001Helper_max30001_int_handler();
+ ((MAX30001_Helper*)sensor)->Max30001Helper_setInterruptStatus(false);
+ }
+
+ switch(tmp_report_mode) {
+ case ecg_mode:
+ case ecg_mode_2:
+if(AsciiEn){
+
+ ret = ((MAX30001_Helper*)sensor)->get_sensor_report(sensor_report);
+
+ if (ret < 0)
+ return 0;
+ data_len = snprintf(buf, size - 1,
+ "%lu,%ld,%d,%d,%.3f,%.3f,%.3f\r\n",
+ sample_count++,
+ sensor_report.ecg,
+ sensor_report.rtor,
+ sensor_report.rtor_bpm,
+ sensor_report.x,
+ sensor_report.y,
+ sensor_report.z);
+}
+else{
+ if((m_sensorcomm_ble_interface_exists_ | m_sensorcomm_flash_rec_started_) && (((MAX30001_Helper*)sensor)->MAX30001_Helper_Queue_Size() >= m_ecg_ble_packet_count_)) {
+
+ ret = ((MAX30001_Helper*)sensor)->get_sensor_report(sensor_report);
+ ret |= ((MAX30001_Helper*)sensor)->get_sensor_report(sensor_report_2);
+ ret |= ((MAX30001_Helper*)sensor)->get_sensor_report(sensor_report_3);
+ ret |= ((MAX30001_Helper*)sensor)->get_sensor_report(sensor_report_4);
+
+ if (ret < 0)
+ return 0;
+ data_packet_ble = (ecg_comm_packet_ble*)buf;
+ data_packet_ble->start_byte = 0xAA;
+ data_packet_ble->sample_count = sample_count;
+ sample_count += m_ecg_ble_packet_count_;
+ data_packet_ble->ecg = sensor_report.ecg;
+ data_packet_ble->ecg_2 = sensor_report_2.ecg;
+ data_packet_ble->ecg_3 = sensor_report_3.ecg;
+ data_packet_ble->ecg_4 = sensor_report_4.ecg;
+ data_packet_ble->rtor = (sensor_report.rtor | sensor_report_2.rtor | sensor_report_3.rtor | sensor_report_4.rtor);
+ data_packet_ble->rtor_bpm = (sensor_report.rtor_bpm | sensor_report_2.rtor_bpm | sensor_report_3.rtor_bpm | sensor_report_4.rtor_bpm);
+ data_packet_ble->crc8 = crc8((uint8_t*)data_packet_ble, sizeof(*data_packet_ble) - sizeof(uint8_t));
+ data_len = sizeof(*data_packet_ble);
+ } else if((m_sensorcomm_ble_interface_exists_ == 0) & (m_sensorcomm_flash_rec_started_ == 0)) {
+
+ ret = ((MAX30001_Helper*)sensor)->get_sensor_report(sensor_report);
+
+ if (ret < 0)
+ return 0;
+ data_packet = (ecg1_comm_packet*)buf;
+ data_packet->start_byte = 0xAA;
+ data_packet->sample_count = sample_count++;
+ data_packet->ecg = sensor_report.ecg;
+ data_packet->rtor = sensor_report.rtor;
+ data_packet->rtor_bpm = sensor_report.rtor_bpm;
+ data_packet->crc8 = crc8((uint8_t*)data_packet, sizeof(*data_packet) - sizeof(uint8_t));
+ data_len = sizeof(*data_packet);
+ }
+}
+ break;
+ default:
+ break;
+ }
+
+ if (data_len < 0) {
+ pr_err("snprintf buf failed");
+ } else if (data_len > size) {
+ pr_err("buffer is insufficient to hold data");
+ }
+
+ return data_len;
+}
+
+// this function parses the parameters for max30001_ECG_InitStart function
+int EcgComm::ECG_Parse_Parameters(char *substring, uint8_t parameters[], uint8_t parameters_len){
+ char *pt_ch = substring;
+
+ if(strlen(pt_ch) < (parameters_len*2)){
+ pr_err("Wrong number of params");
+ return -1;
+ }else{
+ if(ConvertHexString2Decimal(pt_ch, parameters, parameters_len) != 0)
+ return -1;
+ for(int i = 0; i < parameters_len; ++i){
+ printf("%d\n", parameters[i]);
+ }
+ }
+ return 0;
+}
+
+// this function parses the parameters for max30001_ECG_InitStart function for single digits
+int EcgComm::ECG_Parse_Parameters_Single(const char *substring, uint8_t parameters[], uint8_t parameters_len){
+ const char *pt_ch = substring;
+ int i = 0;
+ unsigned char num_found = 0;
+
+ if(strlen(pt_ch) < (parameters_len)){
+ pr_err("Wrong number of params");
+ return -1;
+ }else{
+ for(i = 0; i < parameters_len; ++i){
+ if(getHexDigit(pt_ch[i], &num_found)){
+ parameters[i] = num_found;
+ }
+ else{
+ pr_err("parsing of parameters failed");
+ return -1;
+ }
+ }
+ for(i = 0; i < parameters_len; ++i){
+ printf("%d\n", parameters[i]);
+ }
+ }
+ return 0;
+
+}
+
+char getHexDigit(char ch_hex, uint8_t *bt_hex)
+{
+ if (ch_hex >= '0' && ch_hex <= '9')
+ *bt_hex = ch_hex - '0';
+ else if (ch_hex >= 'A' && ch_hex <= 'F')
+ *bt_hex = ch_hex - 'A' + 10;
+ else if (ch_hex >= 'a' && ch_hex <= 'f')
+ *bt_hex = ch_hex - 'a' + 10;
+ else
+ return false;
+ return true;
+}
+
+
+int ConvertHexString2Decimal(char *pt_ch, uint8_t *bt_hex, int len){
+
+ if(strlen(pt_ch) < ((uint32_t)len * 2))
+ return -1;
+
+ for(int i = 0; i < len; ++i){
+ uint8_t hex_digit;
+ // Get most significant hex digit
+ if (!getHexDigit(*(pt_ch++), &hex_digit))
+ return -1;
+ else
+ {
+ hex_digit <<= 4;
+ bt_hex[i] = hex_digit;
+ }
+ // Get least significant digit
+ if (!getHexDigit(*(pt_ch++), &hex_digit))
+ return -1;
+ else{
+ bt_hex[i] |= hex_digit;
+ }
+ }
+ return 0;
+}
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/SensorComm/EcgComm/EcgComm.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Copyright (C) 2017 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 _ECGCOMM_H_
+#define _ECGCOMM_H_
+
+#include "mbed.h"
+#include "SensorComm.h"
+#include "USBSerial.h"
+
+/**
+ * @brief EcgComm ECG sensor command handler class.
+ * @details
+ */
+class EcgComm: public SensorComm
+{
+public:
+
+ static const uint8_t kEcgInitParametersCount = 11;
+
+ static const uint8_t kRtoRInitParametersCount = 9;
+
+ static const uint8_t kInterruptParametersCount = 17;
+
+
+ /* PUBLIC FUNCTION DECLARATIONS */
+ /**
+ * @brief EcgComm constructor.
+ *
+ */
+ EcgComm(USBSerial* USB);
+
+ /* PROTECTED FUNCTION DECLARATIONS */
+ /**
+ * @brief Parses DeviceStudio commands.
+ * @details Parses and executes commands. Prints return code to i/o device.
+ * @returns true if sensor acted upon the command, false if command was unknown
+ */
+ bool parse_command(const char* cmd);
+
+ /**
+ * @brief Fill in buffer with sensor data
+ *
+ * @param[in] buf Buffer to fill data into
+ * @param[in] size Maximum size of buffer
+ * @param[out] Number of bytes written to buffer
+ */
+ int data_report_execute(char* buf, int size);
+
+
+ /**
+ * @brief Stop collecting data and disable sensor
+ */
+ void stop();
+
+ // this function parses the parameters for max30001_ECG_InitStart function
+ int ECG_Parse_Parameters(char *substring, uint8_t parameters[], uint8_t parameters_len);
+
+ // this function parses the parameters for max30001_ECG_InitStart function for single digits
+ virtual int ECG_Parse_Parameters_Single(const char *substring, uint8_t parameters[], uint8_t parameters_len);
+
+
+private:
+ /* PRIVATE TYPE DEFINITIONS */
+ typedef enum _cmd_state_t {
+ InterruptInit=0,
+ get_format_1,
+ get_format_2,
+ ecg_mode,
+ ecg_mode_2, //android app data stream mode
+ get_reg,
+ set_reg,
+ dump_regs,
+ set_cfg_ecg_invert,
+ NUM_CMDS,
+ } cmd_state_t;
+
+ typedef struct __attribute__((packed)) {
+ uint32_t start_byte :8;
+ uint32_t sample_count :8; //Represent 0-127
+ uint32_t ecg :24; //ECG ADC data
+ uint32_t rtor :14; //R to R data
+ uint32_t rtor_bpm :8;
+ uint8_t :0; //Needed to align crc to byte boundary
+ uint8_t crc8 :8;
+ } ecg1_comm_packet;
+
+ typedef struct __attribute__((packed)) {
+ uint32_t start_byte :8;
+ uint32_t sample_count :8;
+ uint32_t rtor :14; //R to R data
+ uint32_t rtor_bpm :8;
+ uint32_t ecg :24; //ECG ADC data
+ uint32_t ecg_2 :24; //ECG ADC data 2
+ uint32_t ecg_3 :24; //ECG ADC data 2
+ uint32_t ecg_4 :24; //ECG ADC data 2
+ uint8_t :0; //Needed to align crc to byte boundary
+ uint8_t crc8 :8;
+ } ecg_comm_packet_ble;
+ static const uint8_t m_ecg_ble_packet_count_ = 4; //how many ecg info in a ble struct
+
+
+
+ /* PRIVATE VARIABLES */
+ USBSerial *m_USB;
+};
+
+char getHexDigit(char ch_hex, uint8_t *bt_hex);
+
+int ConvertHexString2Decimal(char *ch_hex, uint8_t *bt_hex, int len);
+
+ /*! Sensor output data to report */
+typedef struct {
+ int32_t ecg;
+ uint16_t rtor;
+ uint8_t rtor_bpm;
+ uint8_t reserved;
+ float x;
+ float y;
+ float z;
+} ecg_sensor_report;
+
+#endif /* _PPGCOMM_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Interfaces/SensorComm/EcgComm/EcgComm_Defines.h Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,65 @@ +#ifndef _ECGCOMM_DEFINES_H +#define _ECGCOMM_DEFINES_H + + + + +/// Initialization values for ECG_InitStart() +#define EN_ECG 0b1 +#define OPENP 0b0 +#define OPENN 0b0 +#define POL 0b0 +#define CALP_SEL 0b00 +#define CALN_SEL 0b00 +#define E_FIT 15 +#define RATE 2 +#define GAIN 0b00 +#define DHPF 0b01 +#define DLPF 0b01 + +// Default Initialization Parameters for RtoR_InitStart +#define EN_RTOR 0x01 +#define WNDW 0x03 +#define GAIN_RTOR 0x0F +#define PAVG 0x02 +#define PTSF 0x03 +#define HOFF 0x20 +#define RAVG 0x02 +#define RHSF 0x04 +#define CLR_RRINT 0x01 + +// Optimal Initialization Parameters for RtoR_InitStart +#define EN_RTOR_OP 0x01 +#define WNDW_OP 0x02 +#define GAIN_RTOR_OP 0x06 +#define PAVG_OP 0x01 +#define PTSF_OP 0x06 +#define HOFF_OP 0x1E +#define RAVG_OP 0x02 +#define RHSF_OP 0x00 +#define CLR_RRINT_OP 0x01 + + +// Default Initialization Parameters for INT_assignment +#define EN_ENINT_LOC 0x01 +#define EN_EOVF_LOC 0x00 +#define EN_FSTINT_LOC 0x00 +#define EN_DCLOFFINT_LOC 0x02 +#define EN_BINT_LOC 0x01 +#define EN_BOVF_LOC 0x00 +#define EN_BOVER_LOC 0x02 +#define EN_BUNDR_LOC 0x02 +#define EN_BCGMON_LOC 0x00 +#define EN_PINT_LOC 0x00 +#define EN_POVF_LOC 0x00 +#define EN_PEDGE_LOC 0x00 +#define EN_LONINT_LOC 0x00 +#define EN_RRINT_LOC 0x02 +#define EN_SAMP_LOC 0x00 +#define INTB_TYPE 0x03 +#define INT2B_TYPE 0x03 + + + + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/SensorComm/SensorComm/SensorComm.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,201 @@
+ /***************************************************************************
+* Copyright (C) 2017 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 <ctype.h>
+#include "SensorComm.h"
+#include "Peripherals.h"
+#include "BLE_ICARUS.h"
+
+//define and initialize the static AsciiEn which is declared in the header
+bool SensorComm::AsciiEn=false;
+
+SensorComm::SensorComm(const char *type, bool visible)
+{
+ sensor = NULL;
+ sensor_type = type;
+ vis = visible;
+}
+
+SensorComm::~SensorComm()
+{
+}
+
+void SensorComm::comm_init(MaximSensor *s)
+{
+ sensor = s;
+}
+
+const char* SensorComm::get_type()
+{
+ return sensor_type;
+}
+
+unsigned char SensorComm::get_sensor_id() {
+
+ if (sensor!= NULL)
+ return( sensor->get_sensor_id());
+ else
+ return(255);
+}
+
+const char* SensorComm::get_part_name()
+{
+ if (sensor != NULL)
+ {
+ return sensor->get_sensor_part_name();
+ }
+ else
+ {
+ return "unknown";
+ }
+}
+
+const char* SensorComm::get_algo_ver()
+{
+ if (sensor != NULL)
+ {
+ return sensor->get_sensor_algo_ver();
+ }
+ else
+ {
+ return "unknown";
+ }
+}
+
+int SensorComm::get_part_info(uint8_t *part_id, uint8_t *rev_id)
+{
+ if (sensor != NULL) {
+ return sensor->get_part_info(part_id, rev_id);
+ } else {
+ *part_id = 0xFF;
+ *rev_id = 0xFF;
+ return -1;
+ }
+}
+
+bool SensorComm::is_enabled()
+{
+ return (data_report_mode != 0);
+}
+
+uint8_t SensorComm::get_data_report_mode()
+{
+ return (data_report_mode);
+}
+
+
+int SensorComm::sensor_get_reg(char *ptr_ch, uint8_t *reg_addr, uint8_t *value)
+{
+ int ret = EXIT_FAILURE;
+ uint8_t num_found;
+ int which_reg;
+ *value = 0;
+
+ while (*ptr_ch) {
+ if (isxdigit((int)*ptr_ch)) {
+ num_found = (uint8_t)sscanf(ptr_ch, "%x", &which_reg);
+ if (num_found == 1) {
+ *reg_addr = which_reg;
+ ret = sensor->readRegister(*reg_addr, value, 1);
+ }
+ break;
+ } else {
+ ptr_ch++;
+ }
+ }
+ return ret;
+}
+
+int SensorComm::sensor_set_reg(char *ptr_ch)
+{
+ int ret = EXIT_FAILURE;
+ uint8_t num_found;
+ unsigned int reg_addr, value;
+ char *ptr_char;
+
+ ptr_char = ptr_ch;
+ while (*ptr_char) {
+ if (isxdigit((int)*ptr_char)) {
+ num_found = (uint8_t)sscanf(ptr_char, "%x %x", ®_addr, &value);
+ if (num_found == 2) {
+ ret = sensor->writeRegister(reg_addr, (uint8_t)value);
+ }
+ break;
+ } else {
+ ptr_char++;
+ }
+ }
+ return ret;
+}
+
+
+int SensorComm::InsertRegValuesIntoBleQeueu(addr_val_pair *reg_values, uint8_t reg_count){
+ Reg_Val_BLE values = {0};
+ int ret = 0;
+
+ if (!BLE::Instance().gap().getState().connected)
+ return 0;
+
+ while(reg_count >= kMaxRegisterInOneStruct){
+ for(uint8_t i = 0; i < kMaxRegisterInOneStruct; ++i){
+ values.reg_adresses[i] = reg_values[i].addr;
+ values.reg_values[i] = reg_values[i].val;
+ }
+ ret |= BLE_Icarus_AddtoQueue((uint8_t *)(&values), sizeof(Reg_Val_BLE), sizeof(Reg_Val_BLE));
+ reg_count -= kMaxRegisterInOneStruct;
+ }
+
+ if(reg_count){
+ for(uint8_t i = 0; i < reg_count; ++i){
+ values.reg_adresses[i] = reg_values[i].addr;
+ values.reg_values[i] = reg_values[i].val;
+ }
+ ret |= BLE_Icarus_AddtoQueue((uint8_t *)(&values), sizeof(Reg_Val_BLE), sizeof(Reg_Val_BLE));
+ }
+
+ return ret;
+}
+
+void SensorComm::stop() { }
+
+bool SensorComm::parse_command(const char* cmd) { return false; }
+
+int SensorComm::data_report_execute(char* buf, int size) { return 0; }
+
+void SensorComm::SensorComm_Set_Ble_Status(bool status) {
+ m_sensorcomm_ble_interface_exists_ = status;
+}
+
+void SensorComm::SensorComm_Set_Flash_Status(bool status) {
+ m_sensorcomm_flash_rec_started_ = status;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/SensorComm/SensorComm/SensorComm.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (C) 2017 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 _SENSORCOMM_H_
+#define _SENSORCOMM_H_
+
+#include "mbed.h"
+#include <stdint.h>
+#include "MaximSensor.h"
+
+/**
+ * @brief SensorComm is Maxim Sensor Studio GUI command handler base class.
+ * @details SensorComm includes base functions and data structures for to
+ * create new command handler classes. All command handler classes should
+ * implement this class.
+ */
+class SensorComm
+{
+public:
+
+ //Flag to check if ascii is enabled
+ static bool AsciiEn;
+
+ const static uint8_t kMaxRegisterInOneStruct = 4;
+
+ // size of that struct is 20 bytes(checked)
+ typedef struct{
+ uint8_t reg_adresses[4];
+ uint32_t reg_values[4];
+ }Reg_Val_BLE;
+
+ /* PUBLIC FUNCTION DECLARATIONS */
+ /**
+ * @brief SensorComm constructor.
+ *
+ * @param[in] sensorType Name of sensor (ie "ppg")
+ * @param[in] visible Whether this sensor should be visible to users in DeviceStudio
+ */
+ SensorComm(const char *type, bool visible);
+
+ /**
+ * @brief SensorComm destructor.
+ *
+ */
+ virtual ~SensorComm();
+
+ /**
+ * @brief Initializer for SensorComm.
+ *
+ * @param[in] s MaximSensor instance to handle sensor commands.
+ */
+ void comm_init(MaximSensor *s);
+
+ /**
+ * @brief Get the type of the sensor
+ *
+ * @param[out] char* to name of type (ie "ppg")
+ */
+ const char* get_type();
+
+ /**
+ * @brief Get the maxim part name of the sensor
+ *
+ * @param[out] char* to name (ie "max86140")
+ */
+ virtual const char* get_part_name();
+
+ /**
+ * @brief Get the maxim algorithm version of the sensor
+ *
+ * @param[out] char* to name (ie "max86140")
+ */
+ virtual const char* get_algo_ver();
+
+ /**
+ * @brief Get the id and revision of the part
+ *
+ */
+ int get_part_info(uint8_t *part_id, uint8_t *part_rev);
+
+ /**
+ * @brief Returns whether the sensor should be visible to users in DeviceStudio
+ */
+ bool is_visible() { return vis; }
+
+ /**
+ * @brief Get whether or not the sensor is enabled
+ *
+ * @param[out] true if the sensor is enabled
+ */
+ bool is_enabled();
+
+ /**
+ * @brief Get data report mode of the sensor
+ *
+ * @param[out] data report mode
+ */
+ uint8_t get_data_report_mode();
+
+
+
+ /**
+ * @brief Stop collecting data and disable sensor
+ */
+ virtual void stop();
+
+ /**
+ * @brief Parses DeviceStudio commands.
+ * @details Parses and executes commands. Prints return code to i/o device.
+ *
+ * @param[in] cmd - Command to parse
+ *
+ * @returns true if sensor acted upon the command, false if command was unknown
+ */
+ virtual bool parse_command(const char* cmd);
+
+ /**
+ * @brief Fill in buffer with sensor data
+ *
+ * @param[in] buf Buffer to fill data into
+ * @param[in] size Maximum size of buffer
+ * @param[out] Number of bytes written to buffer
+ */
+ virtual int data_report_execute(char* buf, int size);
+
+ /**
+ *
+ * @param status
+ */
+ void SensorComm_Set_Ble_Status(bool status);
+
+ void SensorComm_Set_Flash_Status(bool status);
+
+ int InsertRegValuesIntoBleQeueu(addr_val_pair *reg_values, uint8_t reg_count);
+
+ virtual unsigned char get_sensor_id();
+
+protected:
+
+ /* PROTECTED VARIABLES */
+ Mutex comm_mutex;
+
+ MaximSensor *sensor;
+
+ int sensor_get_reg(char *ptr_ch, uint8_t *reg_addr, uint8_t *value);
+ int sensor_set_reg(char *ptr_ch);
+
+ volatile uint8_t data_report_mode;
+ volatile uint8_t console_interface_exists;
+ volatile bool m_sensorcomm_ble_interface_exists_;
+ volatile bool m_sensorcomm_flash_rec_started_;
+
+ const char* sensor_type;
+ bool vis;
+ int sample_count;
+};
+
+#endif /* _SENSORCOMM_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/SensorComm/SmartSensorComm/SSBootloader/SSBootloaderComm.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,615 @@
+/*******************************************************************************
+ * Copyright (C) 2017 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 "DSInterface.h"
+#include "SSBootloaderComm.h"
+
+#include "../../../../Utilities/mxm_assert.h"
+#include "SSInterface.h"
+#include "Peripherals.h"
+#include "utils.h"
+#include "BLE_ICARUS.h"
+
+
+static bool flag_image_on_ram = false;
+
+static const char* const cmd_tbl[] = {
+ "bootldr",
+ "exit",
+ "reset",
+ "page_size",
+ "num_pages",
+ "set_iv",
+ "set_auth",
+ "erase",
+ "page_erase",
+ "flash",
+ "set_cfg bl enter_mode",
+ "set_cfg bl enter_pin",
+ "set_cfg bl enter_pol",
+ "set_cfg bl exit_mode",
+ "set_cfg bl exit_to",
+ "set_cfg bl save",
+ "image_on_ram",
+ "set_cfg host ebl",
+ "set_cfg host cdf", /* bootloader comm_delay_factor */
+ "get_cfg host",
+};
+
+SSBootloaderComm::SSBootloaderComm(USBSerial *USB, SSInterface* ssInterface, DSInterface* dsInterface)
+ :SensorComm("bl", false), m_USB(USB), ss_int(ssInterface), ds_int(dsInterface)
+{
+ bl_comm_delay_factor = 1;
+}
+
+int SSBootloaderComm::parse_auth(const char* cmd, uint8_t *auth_bytes)
+{
+ char cmdStr[] = "set_auth ";
+ int length = strlen(cmd);
+ int expected_length = strlen(cmdStr) + 2*AES_AUTH_SIZE;
+ if (length != expected_length) {
+ pr_err("Couldn't parse Auth bytes, incorrect number of characters (len:%d, expected:%d)\n",
+ length, expected_length);
+ return COMM_INVALID_PARAM;
+ }
+
+ const char* macPtr = cmd + strlen(cmdStr);
+
+ int num_found;
+ int byteVal;
+ for (int aidx = 0; aidx < AES_AUTH_SIZE; aidx++) {
+ num_found = sscanf(macPtr, "%2X", &byteVal);
+
+ if (num_found != 1 || byteVal > 0xFF) {
+ pr_err("Couldn't parse byte %d of Auth\n", aidx);
+ return COMM_INVALID_PARAM;
+ }
+
+ auth_bytes[aidx] = (uint8_t)byteVal;
+ macPtr += 2;
+ }
+
+ return COMM_SUCCESS;
+}
+
+int SSBootloaderComm::parse_iv(const char* cmd, uint8_t* iv_bytes)
+{
+ char cmdStr[] = "set_iv ";
+ int length = strlen(cmd);
+ int expected_length = strlen(cmdStr) + 2*AES_NONCE_SIZE;
+ if (length != expected_length) {
+ pr_err("Couldn't parse IV, incorrect number of characters (len:%d, expected:%d)\n",
+ length, expected_length);
+ return COMM_INVALID_PARAM;
+ }
+
+ const char* ivPtr = cmd + strlen(cmdStr);
+
+ int num_found;
+ int byteVal;
+ for (int ividx = 0; ividx < AES_NONCE_SIZE; ividx++) {
+ num_found = sscanf(ivPtr, "%2X", &byteVal);
+
+ if (num_found != 1 || byteVal > 0xFF) {
+ pr_err("Couldn't parse byte %d of IV\n", ividx);
+ return COMM_INVALID_PARAM;
+ }
+ iv_bytes[ividx] = (uint8_t)byteVal;
+ ivPtr += 2;
+ }
+
+ return COMM_SUCCESS;
+}
+
+bool SSBootloaderComm::parse_command(const char* cmd)
+{
+ int ret = EXIT_SUCCESS;
+ bool recognizedCmd = false;
+ char charbuf[768];
+ int data_len = 0;
+ bool flash_flag=false;
+
+ if (!ss_int) {
+ pr_err("No SmartSensor Interface defined!");
+ return false;
+ }
+ if (!ds_int) {
+ pr_err("No DeviceStudio Interface defined!");
+ return false;
+ }
+
+ for (int i = 0; i < NUM_CMDS; i++) {
+ if (starts_with(cmd, cmd_tbl[i])) {
+ cmd_state_t user_cmd = (cmd_state_t)i;
+ recognizedCmd = true;
+
+ switch (user_cmd) {
+ case cmd_enter_bootldr:
+ {
+ SS_STATUS status;
+ status = ss_int->reset_to_bootloader();
+ if (status == SS_SUCCESS){
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ }
+ else{
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+
+ ds_int->set_fw_platform(ss_int->get_ss_platform_name());
+ ds_int->set_fw_version(ss_int->get_ss_fw_version());
+ got_page_size = false;
+ sent_num_pages = false;
+ } break;
+
+ case cmd_exit_bootldr:
+ {
+ SS_STATUS status = ss_int->reset_to_main_app();
+ if (status == SS_SUCCESS){
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ }
+ else{
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+
+ ds_int->set_fw_platform(ss_int->get_ss_platform_name());
+ ds_int->set_fw_version(ss_int->get_ss_fw_version());
+
+ } break;
+
+ case cmd_reset:
+ {
+ SS_STATUS status = ss_int->reset();
+ if (status == SS_SUCCESS)
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ else
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, ret);
+
+ ds_int->set_fw_platform(ss_int->get_ss_platform_name());
+ ds_int->set_fw_version(ss_int->get_ss_fw_version());
+
+ } break;
+
+ case cmd_page_size:
+ {
+ uint8_t cmd_bytes[] = { SS_FAM_R_BOOTLOADER, SS_CMDIDX_PAGESIZE };
+ uint8_t rxbuf[3];
+
+ SS_STATUS status = ss_int->read_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rxbuf[0], ARRAY_SIZE(rxbuf));
+
+ if (status == SS_SUCCESS) {
+ //rxbuf holds page size in big-endian format
+ page_size = (256*(int)rxbuf[1]) + rxbuf[2];
+ mxm_assert_msg(page_size <= MAX_PAGE_SIZE, "Page size exceeds maximum allowed");
+
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%d err=%d\r\n", cmd, page_size, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ got_page_size = true;
+
+ } else {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+ } break;
+
+ case cmd_num_pages:
+ {
+ int num_tok = sscanf(cmd, "num_pages %d", &num_pages);
+ if (num_tok != 1) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%d err=%d\r\n", cmd, 0, COMM_INVALID_PARAM);
+ m_USB->printf(charbuf);
+ break;
+ }
+
+ uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER, SS_CMDIDX_SETNUMPAGES };
+ //num pages = 256*MSB + LSB
+ uint8_t data[] = { (uint8_t)((num_pages >> 8) & 0xFF), (uint8_t)(num_pages & 0xFF) };
+
+ SS_STATUS status = ss_int->write_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ &data[0], ARRAY_SIZE(data));
+
+ if (status == SS_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ sent_num_pages = true;
+
+ } else {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+ } break;
+
+ case cmd_set_iv:
+ {
+ uint8_t iv_bytes[AES_NONCE_SIZE];
+ ret = parse_iv(cmd, &iv_bytes[0]);
+ if (ret != COMM_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, ret);
+ m_USB->printf(charbuf);
+ }
+ else
+ {
+ uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER, SS_CMDIDX_SETIV };
+
+ SS_STATUS status = ss_int->write_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ &iv_bytes[0], ARRAY_SIZE(iv_bytes));
+
+ if (status == SS_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+
+ } else {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+ }
+ } break;
+
+ case cmd_set_auth:
+ {
+ uint8_t auth_bytes[AES_AUTH_SIZE];
+ ret = parse_auth(cmd, &auth_bytes[0]);
+ if (ret != COMM_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, ret);
+ m_USB->printf(charbuf);
+ }
+ else
+ {
+ uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER, SS_CMDIDX_SETAUTH };
+
+ SS_STATUS status = ss_int->write_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ &auth_bytes[0], ARRAY_SIZE(auth_bytes));
+
+ if (status == SS_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+
+ } else {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+ }
+ } break;
+
+ case cmd_erase:
+ {
+ uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER, SS_CMDIDX_ERASE };
+
+ SS_STATUS status = ss_int->write_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ SS_BOOTLOADER_ERASE_DELAY);
+ if (status == SS_SUCCESS){
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ }
+ else{
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+ } break;
+
+ case cmd_page_erase:
+ {
+ int page_num_to_erase;
+ int num_tok = sscanf(cmd, "page_erase %d", &page_num_to_erase);
+ if (num_tok != 1) {
+ m_USB->printf("\r\n%s value=%d err=%d\r\n", cmd, 0, COMM_INVALID_PARAM);
+ break;
+ }
+
+ uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER, SS_CMDIDX_ERASE_PAGE };
+ //num pages = 256*MSB + LSB
+ uint8_t data[] = { (uint8_t)((page_num_to_erase >> 8) & 0xFF), (uint8_t)(page_num_to_erase & 0xFF) };
+
+ SS_STATUS status = ss_int->write_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ &data[0], ARRAY_SIZE(data), 50);
+
+ if (status == SS_SUCCESS) {
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ sent_num_pages = true;
+ } else {
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ }
+ } break;
+
+ case cmd_flash:
+ {
+ if (got_page_size && sent_num_pages) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+
+ if (BLE::Instance().gap().getState().connected) {
+ BLE_Icarus_AddtoQueue((uint8_t *)charbuf, (int32_t)sizeof(charbuf), data_len);
+ BLE_Icarus_TransferDataFromQueue();
+ }
+ BLE::Instance().waitForEvent();
+
+ flash_page_data();
+ flash_flag=true;
+ } else {
+ pr_err("Can't enter flash mode. Need number of pages, and size of page"
+ "(num_pages, page_size, commands)\r\n");
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+ } break;
+
+ case cmd_setcfg_bl_enter_mode:
+ {
+ uint8_t mode;
+ ret = parse_cmd_data(cmd, cmd_tbl[i], &mode, 1, false);
+ if (ret != 1) {
+ pr_err("parse_cmd_data=%d\r\n", ret);
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ break;
+ }
+
+ uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER_CFG, SS_CMDIDX_BL_ENTRY, SS_BL_CFG_ENTER_BL_MODE, mode };
+ SS_STATUS status = ss_int->write_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0);
+ if (status == SS_SUCCESS)
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ else
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+
+ } break;
+
+ case cmd_setcfg_bl_ebl_pin:
+ {
+ uint8_t pin[2];
+ ret = parse_cmd_data(cmd, cmd_tbl[i], &pin[0], 2, false);
+ if (ret != 2) {
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ break;
+ }
+
+ uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER_CFG, SS_CMDIDX_BL_ENTRY, SS_BL_CFG_EBL_PIN,
+ pin[0], pin[1]};
+ SS_STATUS status = ss_int->write_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0);
+ if (status == SS_SUCCESS)
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ else
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+
+ } break;
+
+ case cmd_setcfg_bl_ebl_pol:
+ {
+ uint8_t mode;
+ ret = parse_cmd_data(cmd, cmd_tbl[i], &mode, 1, false);
+ if (ret != 1) {
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ break;
+ }
+
+ uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER_CFG, SS_CMDIDX_BL_ENTRY, SS_BL_CFG_EBL_POL, mode };
+ SS_STATUS status = ss_int->write_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0);
+ if (status == SS_SUCCESS)
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ else
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+
+ } break;
+
+ case cmd_setcfg_bl_exit_mode:
+ {
+ uint8_t mode;
+ ret = parse_cmd_data(cmd, cmd_tbl[i], &mode, 1, false);
+ if (ret != 1) {
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ break;
+ }
+
+ uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER_CFG, SS_CMDIDX_BL_EXIT, SS_BL_CFG_EXIT_BL_MODE, mode };
+ SS_STATUS status = ss_int->write_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0);
+ if (status == SS_SUCCESS)
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ else
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+
+ } break;
+ case cmd_setcfg_bl_timeout:
+ {
+ uint8_t to;
+ ret = parse_cmd_data(cmd, cmd_tbl[i], &to, 1, false);
+ if (ret != 1) {
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ break;
+ }
+
+ uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER_CFG, SS_CMDIDX_BL_EXIT, SS_BL_CFG_TIMEOUT, to };
+ SS_STATUS status = ss_int->write_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0);
+ if (status == SS_SUCCESS)
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ else
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+
+ } break;
+ case cmd_setcfg_bl_save:
+ {
+ uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER_CFG, SS_CMDIDX_BL_SAVE };
+
+ SS_STATUS status = ss_int->write_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0, 50);
+ if (status == SS_SUCCESS)
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ else
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+
+ } break;
+ case cmd_image_on_ram:
+ {
+ uint8_t mode = 0;
+ ret = parse_cmd_data(cmd, cmd_tbl[i], &mode, 1, false);
+ if (ret != 1) {
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ break;
+ }
+
+ /* TODO: Implement effects of this */
+ flag_image_on_ram = !!mode;
+ pr_info("flag_image_on_ram: %d, mode: %d\n", flag_image_on_ram, mode);
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ break;
+ } break;
+ case cmd_setcfg_host_ebl:
+ {
+ uint8_t tmp; /* 0: Command bootloader, 1: No command, trigger GPIO */
+
+ int ret = parse_cmd_data(cmd, cmd_tbl[i], &tmp, 1, false);
+ if (ret != 1) {
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ break;
+ }
+
+ if (ss_int->set_ebl_mode(tmp) == SS_SUCCESS)
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ else
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ break;
+ } break;
+ case cmd_setcfg_host_cdf:
+ {
+ uint8_t tmp;
+
+ int ret = parse_cmd_data(cmd, cmd_tbl[i], &tmp, 1, false);
+ if (ret != 1) {
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ break;
+ }
+
+ /* TODO: Implement effects of this */
+ bl_comm_delay_factor = tmp;
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ break;
+ } break;
+ case cmd_getcfg_host:
+ {
+ m_USB->printf("\r\n%s ebl=%d cdf=%d err=%d\r\n", cmd, ss_int->get_ebl_mode(), bl_comm_delay_factor, COMM_SUCCESS);
+ } break;
+ default:
+ {
+ mxm_assert_msg(false, "Invalid switch case!");
+ }
+ }
+
+
+ if (BLE::Instance().gap().getState().connected) {
+ if(flash_flag==false)
+ {
+ BLE_Icarus_AddtoQueue((uint8_t *)charbuf, (int32_t)sizeof(charbuf), data_len);
+ }
+ }
+
+
+ }
+ }
+
+ return recognizedCmd;
+}
+
+void SSBootloaderComm::flash_page_data(void)
+{
+ int totalBytes = 0;
+ int currentPage = 1;
+ char charbuf_flash[256];
+ int data_len_flash = 0;
+
+ static uint8_t tx_buf[MAX_PAGE_SIZE + CHECKBYTES_SIZE + 2] = { SS_FAM_W_BOOTLOADER, SS_CMDIDX_SENDPAGE };
+ uint8_t *data_buffer = &tx_buf[2];
+
+ while (currentPage <= num_pages) {
+ pr_info("Waiting for page %d/%d data (%d bytes)...", currentPage, num_pages, page_size);
+
+ //Collect page data + checksum from PC/Android
+// totalBytes = 100;
+ while (totalBytes < (page_size + CHECKBYTES_SIZE)) {
+ data_buffer[totalBytes++] = m_USB->_getc();
+ //Here we should be able to take the data over BLE
+ }
+
+ pr_info("Done\r\n");
+
+ //Send data to SmartSensor
+ SS_STATUS status = ss_int->write_cmd(tx_buf, page_size + CHECKBYTES_SIZE + 2, 2000 /*bl_comm_delay_factor * PAGE_WRITE_DELAY_MS*/);
+ pr_err("status: %d\r\n", status);
+
+ //Inform PC/Andoid of status
+ if (status == SS_ERR_BTLDR_CHECKSUM) {
+ pr_err("Verify checksum failed!\r\n");
+ data_len_flash = snprintf(charbuf_flash, sizeof(charbuf_flash), "\r\npageFlashDone err=%d\r\n", FLASH_ERR_CHECKSUM);
+ m_USB->printf(charbuf_flash);
+ } else if (status != SS_SUCCESS) {
+ pr_err("Page flash failed!\r\n");
+ data_len_flash = snprintf(charbuf_flash, sizeof(charbuf_flash), "\r\npageFlashDone err=%d\r\n", FLASH_ERR_GENERAL);
+ m_USB->printf(charbuf_flash);
+ } else {
+ currentPage++;
+ pr_err("Page flash successful!\r\n");
+ data_len_flash = snprintf(charbuf_flash, sizeof(charbuf_flash), "\r\npageFlashDone err=%d\r\n", COMM_SUCCESS);
+ m_USB->printf(charbuf_flash);
+ }
+
+ totalBytes = 0;
+
+ if (BLE::Instance().gap().getState().connected) {
+ BLE_Icarus_AddtoQueue((uint8_t *)charbuf_flash, (int32_t)sizeof(charbuf_flash), data_len_flash);
+ BLE_Icarus_TransferDataFromQueue();
+ }
+ BLE::Instance().waitForEvent();
+
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/SensorComm/SmartSensorComm/SSBootloader/SSBootloaderComm.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (C) 2017 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 _SSBOOTLOADERCOMM_H_
+#define _SSBOOTLOADERCOMM_H_
+
+#include "mbed.h"
+#include "SensorComm.h"
+#include "USBSerial.h"
+#include "SSInterface.h"
+
+#define SS_BOOTLOADER_ERASE_DELAY 2000
+
+#define PAGE_WRITE_DELAY_MS 700
+#define MAX_PAGE_NUMBER 31
+
+/**
+ * @brief SSBootloaderComm Command handler class for bootloader routines on SmartSensor
+ * @details
+ */
+class SSBootloaderComm: public SensorComm
+{
+public:
+
+ /* PUBLIC FUNCTION DECLARATIONS */
+ /**
+ * @brief SSBootloaderComm constructor.
+ *
+ */
+ SSBootloaderComm(USBSerial* USB, SSInterface* ssInterface, DSInterface* dsInterface);
+
+ /**
+ * @brief Parses DeviceStudio-style commands.
+ * @details Parses and executes commands. Prints return code to i/o device.
+ * @returns true if sensor acted upon the command, false if command was unknown
+ */
+ bool parse_command(const char* cmd);
+
+private:
+
+ /* PRIVATE METHODS */
+ int parse_auth(const char* cmd, uint8_t *auth_bytes);
+ int parse_iv(const char* cmd, uint8_t* iv_bytes);
+ void flash_page_data(void);
+
+ /* PRIVATE TYPE DEFINITIONS */
+ typedef enum _cmd_state_t {
+ cmd_enter_bootldr=0,
+ cmd_exit_bootldr,
+ cmd_reset,
+ cmd_page_size,
+ cmd_num_pages,
+ cmd_set_iv,
+ cmd_set_auth,
+ cmd_erase,
+ cmd_page_erase,
+ cmd_flash,
+ cmd_setcfg_bl_enter_mode,
+ cmd_setcfg_bl_ebl_pin,
+ cmd_setcfg_bl_ebl_pol,
+ cmd_setcfg_bl_exit_mode,
+ cmd_setcfg_bl_timeout,
+ cmd_setcfg_bl_save,
+ cmd_image_on_ram,
+ cmd_setcfg_host_ebl,
+ cmd_setcfg_host_cdf,
+ cmd_getcfg_host,
+ NUM_CMDS,
+ } cmd_state_t;
+
+ /* PRIVATE VARIABLES */
+ USBSerial *m_USB;
+ SSInterface *ss_int;
+ DSInterface *ds_int;
+
+ char bootldr_version[128];
+
+ int num_pages;
+ int page_size;
+ int bl_comm_delay_factor;
+
+ bool got_page_size;
+ bool sent_num_pages;
+
+ /* PRIVATE CONST VARIABLES */
+ static const int AES_NONCE_SIZE = 11;
+ static const int AES_AUTH_SIZE = 16;
+ static const int MAX_PAGE_SIZE = 8192;
+ static const int CHECKBYTES_SIZE = 16;
+
+};
+
+#endif /* _SSBOOTLOADERCOMM_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/SensorComm/SmartSensorComm/SSGenericCmd/SSGenericCmd.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (C) 2017 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 "DSInterface.h"
+#include "SSGenericCmd.h"
+
+#include "../../../../Utilities/mxm_assert.h"
+#include "Peripherals.h"
+#include "utils.h"
+#include "CRC8.h"
+
+static const char* const cmd_tbl[] = {
+ "ss_write",
+ "ss_read",
+};
+
+SSGenericCmd::SSGenericCmd(USBSerial *USB, SSInterface* ssInterface, DSInterface* dsInterface)
+ :SensorComm("ss_test", false), m_USB(USB), ss_int(ssInterface), ds_int(dsInterface)
+{
+}
+
+bool SSGenericCmd::parse_command(const char* cmd)
+{
+ SS_STATUS status;
+ bool recognizedCmd = false;
+ char response[1024];
+ int ridx = 0;
+
+ if (!ss_int) {
+ pr_err("No SmartSensor Interface defined!");
+ return false;
+ }
+ if (!ds_int) {
+ pr_err("No DeviceStudio Interface defined!");
+ return false;
+ }
+
+ for (int i = 0; i < NUM_CMDS; i++) {
+ if (starts_with(cmd, cmd_tbl[i])) {
+ cmd_state_t user_cmd = (cmd_state_t)i;
+ recognizedCmd = true;
+
+ switch (user_cmd) {
+ case (ss_write):
+ {
+ uint8_t cmd_bytes[256];
+ int num_cmd_bytes = parse_cmd_data(cmd, cmd_tbl[i], &cmd_bytes[0], sizeof(cmd_bytes), true);
+ if (num_cmd_bytes <= 0) {
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "\r\n%s err=%d", cmd, num_cmd_bytes);
+ break;
+ }
+
+ status = ss_int->write_cmd(&cmd_bytes[0], num_cmd_bytes,
+ 0, 0, 500);
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "\r\n%s err=0\r\n", cmd);
+
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "\r\nWrote: { ");
+ for (int i = 0; i < num_cmd_bytes; i++) {
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "%02X ", cmd_bytes[i]);
+ }
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "}\r\n");
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "Status: { %02X }\r\n", (uint8_t)status);
+
+ } break;
+
+ case (ss_read):
+ {
+ uint8_t cmd_bytes[256];
+ uint8_t read_bytes[256];
+
+
+ int num_cmd_bytes = parse_cmd_data(cmd, cmd_tbl[i], &cmd_bytes[0], sizeof(cmd_bytes), true);
+ if (num_cmd_bytes <= 0) {
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "\r\n%s err=%d", cmd, num_cmd_bytes);
+ break;
+ }
+
+ //Last space separated value is the number of bytes to read
+ uint8_t num_rx_bytes = cmd_bytes[num_cmd_bytes - 1];
+ if (num_rx_bytes > sizeof(read_bytes)) {
+ pr_err("Can read up to %d bytes", num_rx_bytes);
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "\r\n%s err=-1", cmd);
+ break;
+ }
+
+ status = ss_int->read_cmd(&cmd_bytes[0], num_cmd_bytes - 1,
+ 0, 0,
+ &read_bytes[0], num_rx_bytes,
+ 500);
+
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "\r\n%s err=0\r\n", cmd);
+
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "\r\nWrote: { ");
+ for (int i = 0; i < num_cmd_bytes; i++) {
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "%02X ", cmd_bytes[i]);
+ }
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "}\r\n");
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "Read: { ");
+ for (int i = 0; i < num_rx_bytes; i++) {
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "%02X ", read_bytes[i]);
+ }
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "}\r\n");
+ ridx += snprintf(response + ridx, sizeof(response) - ridx - 1,
+ "Status: { %02X }\r\n", (uint8_t)status);
+
+ } break;
+
+ default:
+ {
+ recognizedCmd = false;
+ mxm_assert_msg(false, "Invalid switch case!");
+ } break;
+
+ }
+ break;
+ }
+ }
+
+ if (recognizedCmd) {
+ m_USB->printf(response);
+ }
+
+ return recognizedCmd;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/SensorComm/SmartSensorComm/SSGenericCmd/SSGenericCmd.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (C) 2017 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 _SSGENERICCMD_H_
+#define _SSGENERICCMD_H_
+
+#include "mbed.h"
+#include "SensorComm.h"
+#include "USBSerial.h"
+#include "SSInterface.h"
+#include "queue.h"
+
+/*
+ * Include this class to use "ss_read" and "ss_write" commands to read and write arbitrary
+ * SmartSensor data:
+ *
+ * ss_write [cmdByte0] [cmdByte1] ... [cmdByteN]
+ * ss_read [cmdByte0] [cmdByte1] ... [cmdByteN] <bytes_to_read_in_hex>
+ *
+ * Example: Read SS firmware version
+ * "ss_read FF 03 4"
+ *
+ * Example: Set MAX30101 register 8 to 1F
+ * "ss_write 40 03 8 1F"
+ *
+ * Example: Read MAX30101 register 1F
+ * "ss_read 40 03 8 2"
+ *
+ */
+
+
+/**
+ * @brief SSMAX30101Comm Command handler class for communication with MAX30101 on SmartSensor board
+ * @details
+ */
+class SSGenericCmd: public SensorComm
+{
+public:
+
+ /* PUBLIC FUNCTION DECLARATIONS */
+ /**
+ * @brief SSMAX30101Comm constructor.
+ *
+ */
+ SSGenericCmd(USBSerial* USB, SSInterface* ssInterface, DSInterface* dsInterface);
+
+ /**
+ * @brief Parses DeviceStudio-style commands.
+ * @details Parses and executes commands. Prints return code to i/o device.
+ * @returns true if sensor acted upon the command, false if command was unknown
+ */
+ bool parse_command(const char* cmd);
+
+private:
+ typedef enum _cmd_state_t {
+ ss_write,
+ ss_read,
+ NUM_CMDS,
+ } cmd_state_t;
+
+ /* PRIVATE VARIABLES */
+ USBSerial *m_USB;
+ SSInterface *ss_int;
+ DSInterface *ds_int;
+
+};
+
+#endif /* _SSMAX30101COMM_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/SensorComm/SmartSensorComm/SSMAX8614X/SSMAX8614XComm.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,1428 @@
+/*******************************************************************************
+ * Copyright (C) 2017 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 "DSInterface.h"
+#include "SSMAX8614XComm.h"
+
+#include "../../../../Utilities/mxm_assert.h"
+#include "flc.h"
+#include "flc_regs.h"
+#include "Peripherals.h"
+#include "utils.h"
+#include "CRC8.h"
+
+
+#include "BLE_ICARUS.h"
+
+
+
+
+// By default, host accel is enabled
+
+//#define FORCE_RESET_WHEN_FAILED
+
+#define MAX_NUM_WR_ACC_SAMPLES 5
+#define BMI160_SAMPLE_RATE 25
+
+static const char* const cmd_tbl[] = {
+ "get_format ppg 0",
+ "read ppg 0", // moved here to match parser index "3"
+ "get_reg ppg",
+ "set_reg ppg",
+ "dump_reg ppg",
+ "set_cfg ppg agc 0",
+ "set_cfg ppg agc 1",
+ "self_test ppg os58",
+ "self_test ppg acc",
+ "set_cfg whrmaecscd aecenable",
+ "get_cfg whrmaecscd aecenable",
+ "set_cfg whrmaecscd scdenable",
+ "get_cfg whrmaecscd scdenable",
+ "set_cfg whrmaecscd adjpdperiod",
+ "get_cfg whrmaecscd adjpdperiod",
+ "set_cfg whrmaecscd debouncewin",
+ "get_cfg whrmaecscd debouncewin",
+ "set_cfg whrmaecscd motionthreshold",
+ "get_cfg whrmaecscd motionthreshold",
+ "set_cfg whrmaecscd minpdcurrent",
+ "get_cfg whrmaecscd minpdcurrent",
+ "set_cfg whrmaecscd pdconfig",
+ "get_cfg whrmaecscd pdconfig",
+ "set_cfg whrmaecscd ledconfig",
+ "get_cfg whrmaecscd ledconfig",
+ "send_raw", // write raw data to I2C (Slave address will be perpended)
+ "set_cfg accel_sh 0", // disables sensorhub accel, host accel is used
+ "set_cfg accel_sh 1", // enables sensorhub accel, host accel is not used
+ "set_cfg whrm conf_level", //sets the conf level coming from the GUI inside the internal flash
+ "set_cfg whrm hr_expiration", ////sets the expiration dfuration coming from the GUI inside the internal flash
+
+};
+
+SSMAX8614XComm::SSMAX8614XComm(USBSerial *USB, SSInterface* ssInterface, DSInterface* dsInterface)
+ :SensorComm("ppg", true), m_USB(USB), ss_int(ssInterface), ds_int(dsInterface), agc_enabled(true)
+{
+ max8614x_mode1_data_req.data_size = SSMAX8614X_MODE1_DATASIZE;
+ max8614x_mode1_data_req.callback = callback(this, &SSMAX8614XComm::max8614x_data_rx);
+
+ whrm_mode1_data_req.data_size = SSWHRM_MODE1_DATASIZE;
+ whrm_mode1_data_req.callback = callback(this, &SSMAX8614XComm::whrm_data_rx_mode1);
+
+ whrm_mode2_data_req.data_size = SSWHRM_MODEX_DATASIZE;
+ whrm_mode2_data_req.callback = callback(this, &SSMAX8614XComm::whrm_data_rx_mode2);
+
+ accel_mode1_data_req.data_size = SSACCEL_MODE1_DATASIZE;
+ accel_mode1_data_req.callback = callback(this, &SSMAX8614XComm::accel_data_rx);
+
+ agc_mode1_data_req.data_size = SSAGC_MODE1_DATASIZE;
+ agc_mode1_data_req.callback = callback(this, &SSMAX8614XComm::agc_data_rx);
+
+ queue_init(&max8614x_queue, max8614x_queue_buf, sizeof(max8614x_mode1_data), sizeof(max8614x_queue_buf));
+ queue_init(&whrm_queue, whrm_queue_buf, sizeof(whrm_modeX_data), sizeof(whrm_queue_buf));
+
+ queue_init(&accel_output_queue, accel_output_queue_buf, sizeof(accel_mode1_data), sizeof(accel_output_queue_buf));
+ queue_init(&accel_input_queue, accel_input_queue_buf, sizeof(accel_mode1_data), sizeof(accel_input_queue_buf));
+
+
+ sensor_algo_en_dis_.sensorhub_accel = 1; // enable sensor hub accel by default
+
+ m_bmi160 = 0;
+
+ input_fifo_size = 0;
+ sensor_data_from_host = false;
+}
+
+void SSMAX8614XComm::stop()
+{
+ status_algo_sensors_st sensor_algo_en_dis_temp;
+ comm_mutex.lock();
+ ss_int->disable_irq();
+ data_report_mode = 0;
+ sample_count = 0;
+
+ if (sensor_algo_en_dis_.max8614x_enabled) {
+ ss_int->disable_sensor(SS_SENSORIDX_MAX86140);
+ queue_reset(&max8614x_queue);
+ }
+
+ if (sensor_algo_en_dis_.accel_enabled) {
+ ss_int->disable_sensor(SS_SENSORIDX_ACCEL);
+ queue_reset(&accel_output_queue);
+ }
+
+ if (sensor_algo_en_dis_.whrm_enabled) {
+ ss_int->disable_algo(SS_ALGOIDX_WHRM);
+ queue_reset(&whrm_queue);
+ }
+
+ // store a copy of settings
+ sensor_algo_en_dis_temp.status_vals = sensor_algo_en_dis_.status_vals;
+ // clear all settings
+ sensor_algo_en_dis_.status_vals = 0;
+ //recover settings that need to be maintained
+ sensor_algo_en_dis_.sensorhub_accel = sensor_algo_en_dis_temp.sensorhub_accel;
+ ss_int->ss_clear_interrupt_flag();
+ ss_int->enable_irq();
+
+ if(sensor_algo_en_dis_.sensorhub_accel==0){
+ m_bmi160->reset();
+ queue_reset(&accel_input_queue);
+ }
+
+
+ comm_mutex.unlock();
+ input_fifo_size = 0;
+ sensor_data_from_host = false;
+}
+
+int SSMAX8614XComm::parse_cal_str(const char *ptr_ch, const char *cmd, uint8_t *cal_data, int cal_data_sz)
+{
+ char ascii_byte[] = { 0, 0, 0 };
+ const char* sptr = ptr_ch + strlen(cmd);
+ int found = 0;
+ int ssfound;
+ unsigned int val32;
+
+ //Eat spaces after cmd
+ while (*sptr != ' ' && *sptr != '\0') { sptr++; }
+ if (*sptr == '\0')
+ return -1;
+ sptr++;
+
+ while (found < cal_data_sz) {
+ if (*sptr == '\0')
+ break;
+ ascii_byte[0] = *sptr++;
+ ascii_byte[1] = *sptr++;
+ ssfound = sscanf(ascii_byte, "%x", &val32);
+ if (ssfound != 1)
+ break;
+ *(cal_data + found) = (uint8_t)val32;
+ //pr_err("cal_data[%d]=%d\r\n", found, val32);
+ found++;
+ }
+
+ //pr_err("total found: %d\r\n", found);
+ if (found < cal_data_sz)
+ return -1;
+ return 0;
+}
+
+int SSMAX8614XComm::parse_str(const char *ptr_ch, const char *cmd, uint8_t *data, int data_sz)
+{
+ char ascii_byte[] = { 0, 0, 0 };
+ const char* sptr = ptr_ch + strlen(cmd);
+ int found = 0;
+ int ssfound;
+ unsigned int val32;
+
+ //Eat spaces after cmd
+ while (*sptr != ' ' && *sptr != '\0') { sptr++; }
+ if (*sptr == '\0')
+ return -1;
+ sptr++;
+
+ while (found < data_sz) {
+ if (*sptr == '\0')
+ break;
+ ascii_byte[0] = *sptr++;
+ ascii_byte[1] = *sptr++;
+ ssfound = sscanf(ascii_byte, "%x", &val32);
+ if (ssfound != 1)
+ return -1;
+ *(data + found) = (uint8_t)val32;
+ pr_err("cal_data[%d]=%d\r\n", found, val32);
+ found++;
+ }
+
+ pr_err("total found: %d\r\n", found);
+ return found;
+}
+
+
+void SSMAX8614XComm::setBMI160(BMI160_I2C *pbmi160)
+{
+ if (pbmi160) {
+ m_bmi160 = pbmi160;
+ m_bmi160->reset();
+ }
+}
+
+
+int SSMAX8614XComm::get_sensor_xyz(accel_data_t &accel_data) {
+ int ret = 0;
+if(sensor_algo_en_dis_.sensorhub_accel==0){
+ BMI160::SensorData stacc_data = {0};
+ if (m_bmi160) {
+ ret = m_bmi160->getSensorXYZ(stacc_data, BMI160::SENS_2G);
+ if (ret < 0)
+ return ret;
+ }
+
+ accel_data.x = stacc_data.xAxis.scaled;
+ accel_data.y = stacc_data.yAxis.scaled;
+ accel_data.z = stacc_data.zAxis.scaled;
+
+ accel_data.x_raw = stacc_data.xAxis.raw;
+ accel_data.y_raw = stacc_data.yAxis.raw;
+ accel_data.z_raw = stacc_data.zAxis.raw;
+
+}
+
+ return ret;
+}
+
+bool SSMAX8614XComm::parse_command(const char* cmd)
+{
+ int ret;
+ SS_STATUS status;
+ bool recognizedCmd = false;
+ int data_len = 0;
+ char charbuf[768];
+ addr_val_pair reg_vals[64];
+
+ if (!ss_int) {
+ pr_err("No SmartSensor Interface defined!");
+ return false;
+ }
+ if (!ds_int) {
+ pr_err("No DeviceStudio Interface defined!");
+ return false;
+ }
+
+ for (int i = 0; i < NUM_CMDS; i++) {
+ if (starts_with(cmd, cmd_tbl[i])) {
+ cmd_state_t user_cmd = (cmd_state_t)i;
+ recognizedCmd = true;
+
+ switch (user_cmd) {
+ case set_cfg_accel_sh_dis:
+ {
+ sensor_algo_en_dis_.sensorhub_accel = 0;
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+
+ } break;
+ case set_cfg_accel_sh_en:
+ {
+ sensor_algo_en_dis_.sensorhub_accel = 1;
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+
+ } break;
+ case set_cfg_ppg_conf_level:
+ {
+ int j=24;
+ char temp_buf[4];
+ uint32_t PpgConfLevel[2];
+ while(cmd[j]!='\0'){
+ temp_buf[j-24] = cmd[j];
+ j++;
+ }
+ temp_buf[j-24]='\0';
+ sscanf(temp_buf,"%u",&PpgConfLevel[0]);
+
+ PpgConfLevel[1] = (*(uint32_t *)PPG_EXPIRE_DURATION_FLASH_ADDRESS);
+
+ if(FLC_Init()!=0){
+ m_USB->printf("\r\n%s err=Initializing flash\r\n", cmd);
+ break;
+ }
+ if( FLC_PageErase(PPG_CONF_LEVEL_FLASH_ADDRESS, MXC_V_FLC_ERASE_CODE_PAGE_ERASE, MXC_V_FLC_FLSH_UNLOCK_KEY)!=0 ){
+ m_USB->printf("\r\n%s err=Erasing page\r\n", cmd);
+ break;
+ }
+ if(FLC_Write(PPG_CONF_LEVEL_FLASH_ADDRESS,PpgConfLevel,sizeof(PpgConfLevel),MXC_V_FLC_FLSH_UNLOCK_KEY)!=0){
+ m_USB->printf("\r\n%s err=Writing flash\r\n", cmd);
+ break;
+ }
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+
+ } break;
+ case set_cfg_ppg_expire_duration:
+ {
+ int j=27;
+ char temp_buf[4];
+ uint32_t PpgExpireDuration[2];
+ while(cmd[j]!='\0'){
+ temp_buf[j-27] = cmd[j];
+ j++;
+ }
+ temp_buf[j-27]='\0';
+ sscanf(temp_buf,"%u",&PpgExpireDuration[1]);
+
+ PpgExpireDuration[0] = (*(uint32_t *)PPG_CONF_LEVEL_FLASH_ADDRESS);
+
+ if(FLC_Init()!=0){
+ m_USB->printf("\r\n%s err=Initializing flash\r\n", cmd);
+ break;
+ }
+ if( FLC_PageErase(PPG_EXPIRE_DURATION_FLASH_ADDRESS, MXC_V_FLC_ERASE_CODE_PAGE_ERASE, MXC_V_FLC_FLSH_UNLOCK_KEY)!=0 ){
+ m_USB->printf("\r\n%s err=Erasing page\r\n", cmd);
+ break;
+ }
+ if(FLC_Write(PPG_CONF_LEVEL_FLASH_ADDRESS,PpgExpireDuration,sizeof(PpgExpireDuration),MXC_V_FLC_FLSH_UNLOCK_KEY)!=0){
+ m_USB->printf("\r\n%s err=Writing flash\r\n", cmd);
+ break;
+ }
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+
+ } break;
+ case get_format_ppg_0:
+ {
+ if(AsciiEn)
+ {
+ if (ds_int->algo_report_mode == 1){
+ m_USB->printf("\r\n%s format=smpleCnt,grnCnt,led2,led3,grn2Cnt,led5,led6,"
+ "accelX,accelY,accelZ,hr,hrconf,r,activity err=0\r\n", cmd);
+ }
+ else { // report mode 2
+ m_USB->printf("\r\n%s format=smpleCnt,grnCnt,led2,led3,grn2Cnt,led5,led6,"
+ "accelX,accelY,accelZ,hr,hrconf,r,rconf,activity,walkSteps,runSteps,"
+ "energyKcal,stepCadence,isLedCurrentAdj,adjLedCurrent,isTAdj,adjT,isFAdj,"
+ "adjF,aecSmpAve,aecState,isAECMotion,scdStatus err=0\r\n", cmd);
+ }
+ }
+ else{
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s enc=bin cs=1 format={smpleCnt,16},"
+ "{grnCnt,20},{grn2Cnt,20},{accelX,14,3},{accelY,14,3},"
+ "{accelZ,14,3},{hr,12},{hrconf,8},{r,11,1},{activity,8} err=0\r\n", cmd);
+ m_USB->printf(charbuf);
+ }
+ } break;
+
+ case read_ppg_0:
+ {
+ sample_count = 0;
+
+ status = ss_int->get_input_fifo_size(&input_fifo_size);
+ if (status != SS_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "FAILED at line %d\n", __LINE__);
+ m_USB->printf(charbuf);
+ break;
+ }
+
+ status = ss_int->set_data_type(SS_DATATYPE_BOTH, false);
+ if (status != SS_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "FAILED at line %d, set DATA_TYPE\n, ", __LINE__);
+#ifdef FORCE_RESET_WHEN_FAILED
+ ret = ss_int->reset();
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "\r\nReset!\r\n");
+#endif
+ m_USB->printf(charbuf);
+ break;
+ }
+
+ status = ss_int->set_fifo_thresh(5);
+ if (status != SS_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "FAILED at line %d, set thresh\n", __LINE__);
+#ifdef FORCE_RESET_WHEN_FAILED
+ ret = ss_int->reset();
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "\r\nReset!\r\n");
+#endif
+ m_USB->printf(charbuf);
+ break;
+ }
+
+
+ if (status != SS_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "FAILED at line %d - agc_enabled: %d\n", __LINE__, agc_enabled);
+ ss_int->enable_irq();
+
+#ifdef FORCE_RESET_WHEN_FAILED
+ ret = ss_int->reset();
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "\r\nReset!\r\n");
+#endif
+ m_USB->printf(charbuf);
+ break;
+ }
+
+ ss_int->disable_irq();
+
+ status = ss_int->enable_sensor(SS_SENSORIDX_MAX86140, 1, &max8614x_mode1_data_req);
+ if (status != SS_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "FAILED at line %d, enable max86140\n", __LINE__);
+ ss_int->enable_irq();
+ #ifdef FORCE_RESET_WHEN_FAILED
+ ret = ss_int->reset();
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "\r\nReset!\r\n");
+ #endif
+ m_USB->printf(charbuf);
+ break;
+ }
+ sensor_algo_en_dis_.max8614x_enabled = 1;
+
+
+
+ if (sensor_algo_en_dis_.sensorhub_accel) {
+ status = ss_int->enable_sensor(SS_SENSORIDX_ACCEL, 1, &accel_mode1_data_req, SH_INPUT_DATA_DIRECT_SENSOR);
+ if (status != SS_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "FAILED at line %d\n", __LINE__);
+ ss_int->enable_irq();
+ #ifdef FORCE_RESET_WHEN_FAILED
+ ret = ss_int->reset();
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "\r\nReset!\r\n");
+ #endif
+ m_USB->printf(charbuf);
+ break;
+ }
+ sensor_algo_en_dis_.accel_enabled = 1;
+ }
+ else {
+ m_bmi160->BMI160_DefaultInitalize();
+ if (m_bmi160->setSampleRate(BMI160_SAMPLE_RATE) != 0) {
+ pr_err("Unable to set BMI160's sample rate\n");
+ data_len = snprintf(charbuf , sizeof(charbuf) - 1,
+ "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "FAILED at line %d\n", __LINE__);
+ ss_int->enable_irq();
+ #ifdef FORCE_RESET_WHEN_FAILED
+ ret = ss_int->reset();
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "\r\nReset!\r\n");
+ #endif
+ m_USB->printf(charbuf);
+ break;
+ }
+
+ ret = m_bmi160->enable_data_ready_interrupt();
+ if(ret != E_SUCCESS){
+ pr_err("Unable to enable BMI160 Interrupt, ret: %d\n", ret);
+ break;
+ }
+
+
+
+ status = ss_int->enable_sensor(SS_SENSORIDX_ACCEL, 1, &accel_mode1_data_req, SH_INPUT_DATA_FROM_HOST);
+ if (status != SS_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "FAILED at line %d\n", __LINE__);
+ ss_int->enable_irq();
+ #ifdef FORCE_RESET_WHEN_FAILED
+ ret = ss_int->reset();
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "\r\nReset!\r\n");
+ #endif
+ m_USB->printf(charbuf);
+ break;
+ }
+ sensor_data_from_host = true;
+ sensor_algo_en_dis_.accel_enabled = 1;
+ }
+
+
+ if (ds_int->algo_report_mode == 2)
+ status = ss_int->enable_algo(SS_ALGOIDX_WHRM, 2, &whrm_mode2_data_req);
+ else // default is mode 1
+ status = ss_int->enable_algo(SS_ALGOIDX_WHRM, 1, &whrm_mode1_data_req);
+ if (status != SS_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "FAILED at line %d, enable whrm\n", __LINE__);
+ ss_int->enable_irq();
+ #ifdef FORCE_RESET_WHEN_FAILED
+ ret = ss_int->reset();
+ data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
+ "\r\nReset!\r\n");
+ #endif
+ m_USB->printf(charbuf);
+ break;
+ }
+ sensor_algo_en_dis_.whrm_enabled = 1;
+
+
+ comm_mutex.lock();
+ data_report_mode = read_ppg_0;
+ comm_mutex.unlock();
+ data_len = snprintf(charbuf, sizeof(charbuf) - 1,
+ "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ ss_int->enable_irq();
+ } break;
+
+ case get_reg_ppg:
+ {
+ uint8_t addr;
+ uint32_t val;
+
+ ret = parse_get_reg_cmd(cmd, sensor_type, &addr);
+ if (!ret) {
+ status = ss_int->get_reg(SS_SENSORIDX_MAX86140, addr, &val);
+ if (status == SS_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s reg_val=%02X err=%d\r\n", cmd, (uint8_t)val, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ } else {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+ } else {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ m_USB->printf(charbuf);
+ }
+
+ } break;
+
+ case set_reg_ppg:
+ {
+ uint8_t addr;
+ uint8_t val;
+
+ ret = parse_set_reg_cmd(cmd, sensor_type, &addr, &val);
+ if (!ret) {
+ status = ss_int->set_reg(SS_SENSORIDX_MAX86140, addr, val, SSMAX8614X_REG_SIZE);
+ if (status == SS_SUCCESS) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ } else {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+ } else {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ m_USB->printf(charbuf);
+ }
+
+ } break;
+
+ case dump_reg_ppg:
+ {
+ int num_regs;
+ status = ss_int->dump_reg(SS_SENSORIDX_MAX86140, ®_vals[0], ARRAY_SIZE(reg_vals), &num_regs);
+ if (status == SS_SUCCESS) {
+ bool comma = false;
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1, "\r\n%s reg_val=", cmd);
+ for (int reg = 0; reg < num_regs; reg++) {
+ if (comma) {
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1, ",");
+ }
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1,
+ "{%X,%lX}", reg_vals[reg].addr, reg_vals[reg].val);
+ comma = true;
+ }
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1, " err=%d\r\n", COMM_SUCCESS);
+ m_USB->printf(charbuf);
+
+ } else {
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1,
+ "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+
+ } break;
+
+ case set_agc_en:
+ {
+ agc_enabled = true;
+ status = ss_int->enable_algo(SS_ALGOIDX_AGC, 1, &agc_mode1_data_req);
+ sensor_algo_en_dis_.agc_enabled = 1;
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ } break;
+
+ case set_agc_dis:
+ {
+ agc_enabled = false;
+ status = ss_int->disable_algo(SS_ALGOIDX_AGC);
+ sensor_algo_en_dis_.agc_enabled = 0;
+ m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ } break;
+
+ case self_test_ppg_os58:
+ {
+ ret = selftest_max8614x();
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1,
+ "%s selftest_max8614x: err=<%d>\r\n", cmd, ret);
+ m_USB->printf(charbuf);
+ } break;
+
+ case self_test_ppg_acc:
+ {
+ ret = selftest_accelerometer();
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1,
+ "%s selftest_accelerometer: err=<%d>\r\n", cmd, ret);
+ m_USB->printf(charbuf);
+ } break;
+
+ //--------- WHRM_AEC_SCD AEC ENABLE
+ case set_cfg_whrmaecscd_aecenable:
+ {
+ uint8_t val[1];
+ ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
+ if (ret) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ m_USB->printf(charbuf);
+ break;
+ }
+
+ uint8_t Temp[1] = { (uint8_t)(val[0]) };
+
+ status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_AEC_ENABLE, &Temp[0], 1);
+ if (status == SS_SUCCESS)
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ }
+ else
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+
+ } break;
+
+ case get_cfg_whrmaecscd_aecenable:
+ {
+ uint8_t rxBuff[1+1]; // first byte is status
+ char outstr[2*sizeof(rxBuff)];
+ int str_idx = 0;
+ uint8_t *Temp = &rxBuff[1];
+ uint8_t val[1];
+
+ status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_AEC_ENABLE, &rxBuff[0], sizeof(rxBuff));
+ for (int i = 0; i < sizeof(rxBuff)-1; i++)
+ str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
+
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+
+ } break;
+
+ //--------- WHRM_AEC_SCD SCD ENABLE
+ case set_cfg_whrmaecscd_scdenable:
+ {
+ uint8_t val[1];
+ ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
+ if (ret) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ m_USB->printf(charbuf);
+ break;
+ }
+
+ uint8_t Temp[1] = { (uint8_t)(val[0]) };
+
+ status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_SCD_ENABLE, &Temp[0], 1);
+ if (status == SS_SUCCESS)
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ }
+ else
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+
+ } break;
+
+ case get_cfg_whrmaecscd_scdenable:
+ {
+ uint8_t rxBuff[1+1]; // first byte is status
+ char outstr[2*sizeof(rxBuff)];
+ int str_idx = 0;
+ uint8_t *Temp = &rxBuff[1];
+ uint8_t val[1];
+
+ status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_SCD_ENABLE, &rxBuff[0], sizeof(rxBuff));
+ for (int i = 0; i < sizeof(rxBuff)-1; i++)
+ str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
+
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+
+ } break;
+
+ //--------- WHRM_AEC_SCD ADJ TARGET PD PERIOD
+ case set_cfg_whrmaecscd_adjpdperiod:
+ {
+ uint16_t val[1];
+ ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
+ if (ret) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ m_USB->printf(charbuf);
+ break;
+ }
+
+ uint8_t Temp[2] = { (uint8_t)((val[0] >> (1*8)) & 0xFF), (uint8_t)((val[0] >> (0*8)) & 0xFF)};
+
+ status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_ADJ_TARGET_PD_CURRENT_PERIOD, &Temp[0], 2);
+ if (status == SS_SUCCESS)
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ }
+ else
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+
+ } break;
+
+ case get_cfg_whrmaecscd_adjpdperiod:
+ {
+ uint8_t rxBuff[2+1]; // first byte is status
+ char outstr[2*sizeof(rxBuff)];
+ int str_idx = 0;
+ uint8_t *Temp = &rxBuff[1];
+ uint8_t val[1];
+
+ status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_ADJ_TARGET_PD_CURRENT_PERIOD, &rxBuff[0], sizeof(rxBuff));
+ for (int i = 0; i < sizeof(rxBuff)-1; i++)
+ str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
+
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+
+ } break;
+
+ //--------- WHRM_AEC_SCD DEBOUNCE WINDOW
+ case set_cfg_whrmaecscd_debouncewin:
+ {
+ uint16_t val[1];
+ ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
+ if (ret) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ m_USB->printf(charbuf);
+ break;
+ }
+
+ uint8_t Temp[2] = { (uint8_t)((val[0] >> (1*8)) & 0xFF), (uint8_t)((val[0] >> (0*8)) & 0xFF)};
+
+ status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_SCD_DEBOUNCE_WINDOW, &Temp[0], 2);
+ if (status == SS_SUCCESS)
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ }
+ else
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+
+ } break;
+
+ case get_cfg_whrmaecscd_debouncewin:
+ {
+ uint8_t rxBuff[2+1]; // first byte is status
+ char outstr[2*sizeof(rxBuff)];
+ int str_idx = 0;
+ uint8_t *Temp = &rxBuff[1];
+ uint8_t val[1];
+
+ status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_SCD_DEBOUNCE_WINDOW, &rxBuff[0], sizeof(rxBuff));
+ for (int i = 0; i < sizeof(rxBuff)-1; i++)
+ str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
+
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+
+ } break;
+
+ //--------- WHRM_AEC_SCD MOTION MAG THRESHOLD
+ case set_cfg_whrmaecscd_motionthreshold:
+ {
+ uint16_t val[1];
+ ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
+ if (ret) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ m_USB->printf(charbuf);
+ break;
+ }
+
+ uint8_t Temp[2] = { (uint8_t)((val[0] >> (1*8)) & 0xFF), (uint8_t)((val[0] >> (0*8)) & 0xFF)};
+
+ status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_MOTION_MAG_THRESHOLD, &Temp[0], 2);
+ if (status == SS_SUCCESS)
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ }
+ else
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+
+ } break;
+
+ case get_cfg_whrmaecscd_motionthreshold:
+ {
+ uint8_t rxBuff[2+1]; // first byte is status
+ char outstr[2*sizeof(rxBuff)];
+ int str_idx = 0;
+ uint8_t *Temp = &rxBuff[1];
+ uint8_t val[1];
+
+ status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_MOTION_MAG_THRESHOLD, &rxBuff[0], sizeof(rxBuff));
+ for (int i = 0; i < sizeof(rxBuff)-1; i++)
+ str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
+
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+
+ } break;
+
+ //--------- WHRM_AEC_SCD MIN PD CURRENT
+ case set_cfg_whrmaecscd_minpdcurrent:
+ {
+ uint16_t val[1];
+ ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
+ if (ret) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ m_USB->printf(charbuf);
+ break;
+ }
+
+ uint8_t Temp[2] = { (uint8_t)((val[0] >> (1*8)) & 0xFF), (uint8_t)((val[0] >> (0*8)) & 0xFF)};
+
+ status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_MIN_PD_CURRENT, &Temp[0], 2);
+ if (status == SS_SUCCESS)
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ }
+ else
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+
+ } break;
+
+ case get_cfg_whrmaecscd_minpdcurrent:
+ {
+ uint8_t rxBuff[2+1]; // first byte is status
+ char outstr[2*sizeof(rxBuff)];
+ int str_idx = 0;
+ uint8_t *Temp = &rxBuff[1];
+ uint8_t val[1];
+
+ status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_MIN_PD_CURRENT, &rxBuff[0], sizeof(rxBuff));
+ for (int i = 0; i < sizeof(rxBuff)-1; i++)
+ str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
+
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+
+ } break;
+
+ //--------- WHRM_AEC_SCD PD CONFIG
+ case set_cfg_whrmaecscd_pdconfig:
+ {
+ uint8_t val[1];
+ ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
+ if (ret) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ m_USB->printf(charbuf);
+ break;
+ }
+
+ uint8_t Temp[1] = { (uint8_t)(val[0]) };
+
+ status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_PD_CONFIG, &Temp[0], 1);
+ if (status == SS_SUCCESS)
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ }
+ else
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+
+ } break;
+
+ case get_cfg_whrmaecscd_pdconfig:
+ {
+ uint8_t rxBuff[1+1]; // first byte is status
+ char outstr[2*sizeof(rxBuff)];
+ int str_idx = 0;
+ uint8_t *Temp = &rxBuff[1];
+ uint8_t val[1];
+
+ status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_PD_CONFIG, &rxBuff[0], sizeof(rxBuff));
+ for (int i = 0; i < sizeof(rxBuff)-1; i++)
+ str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
+
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+
+ } break;
+
+ //--------- WHRM_AEC_SCD LED CONFIG
+ case set_cfg_whrmaecscd_ledconfig:
+ {
+ uint8_t val[1];
+ ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
+ if (ret) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
+ m_USB->printf(charbuf);
+ break;
+ }
+
+ uint8_t Temp[1] = { (uint8_t)(val[0]) };
+
+ status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_LED_CONFIG, &Temp[0], 1);
+ if (status == SS_SUCCESS)
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ }
+ else
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+
+ } break;
+
+ case get_cfg_whrmaecscd_ledconfig:
+ {
+ uint8_t rxBuff[1+1]; // first byte is status
+ char outstr[2*sizeof(rxBuff)];
+ int str_idx = 0;
+ uint8_t *Temp = &rxBuff[1];
+ uint8_t val[1];
+
+ status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_LED_CONFIG, &rxBuff[0], sizeof(rxBuff));
+ for (int i = 0; i < sizeof(rxBuff)-1; i++)
+ str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
+
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+
+ } break;
+
+ //--------- SEND RAW
+ case send_raw:
+ {
+ int size=0;
+ uint8_t data[256]; // max size of command
+
+ size = parse_str(cmd, cmd_tbl[i], data, sizeof(data));
+ status = ss_int->send_raw(data, size);
+
+ if (status == SS_SUCCESS)
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
+ m_USB->printf(charbuf);
+ }
+ else
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
+ m_USB->printf(charbuf);
+ }
+
+ } break;
+ //--------------------------------------------------------
+
+ default:
+ {
+ mxm_assert_msg(false, "Invalid switch case!");
+ } break;
+
+ }
+
+
+ if (BLE::Instance().gap().getState().connected) {
+ BLE_Icarus_AddtoQueue((uint8_t *)charbuf, (int32_t)sizeof(charbuf), data_len);
+ }
+
+
+ break;
+
+ }
+ }
+
+ return recognizedCmd;
+}
+
+void SSMAX8614XComm::max8614x_data_rx(uint8_t* data_ptr)
+{
+ max8614x_mode1_data sample;
+ sample.led1 = (data_ptr[0] << 16) | (data_ptr[1] << 8) | data_ptr[2];
+ sample.led2 = (data_ptr[3] << 16) | (data_ptr[4] << 8) | data_ptr[5];
+ sample.led3 = (data_ptr[6] << 16) | (data_ptr[7] << 8) | data_ptr[8];
+ sample.led4 = (data_ptr[9] << 16) | (data_ptr[10] << 8) | data_ptr[11];
+ sample.led5 = (data_ptr[12] << 16) | (data_ptr[13] << 8) | data_ptr[14];
+ sample.led6 = (data_ptr[15] << 16) | (data_ptr[16] << 8) | data_ptr[17];
+
+ pr_info("led1=%.6X led2=%.6X led3=%.6X led4=%.6X led5=%.6X led6=%.6X\r\n",
+ sample.led1, sample.led2, sample.led3, sample.led4, sample.led5, sample.led6);
+
+ enqueue(&max8614x_queue, &sample);
+}
+
+void SSMAX8614XComm::whrm_data_rx_mode1(uint8_t* data_ptr)
+{
+ whrm_modeX_data sample;
+
+ sample.hr = (data_ptr[0] << 8) | data_ptr[1];
+ sample.hr_conf = data_ptr[2];
+ sample.rr = (data_ptr[3] << 8) | data_ptr[4];
+ sample.activity_class = data_ptr[5];
+ //m_USB->printf("\r\n Md1- hr:%d conf:%d rr:%d act:%d\r\n", sample.hr,sample.hr_conf,sample.rr,sample.activity_class );
+ enqueue(&whrm_queue, &sample);
+ pr_info("hr=%.1f conf=%d rr=%.1f rr_conf=%d status=%d\r\n", (float)sample.hr / 10.0, sample.hr_conf, (float)sample.rr/10, sample.rr_conf,sample.activity_class);
+}
+
+void SSMAX8614XComm::whrm_data_rx_mode2(uint8_t* data_ptr)
+{
+ whrm_modeX_data sample;
+
+ sample.hr = (data_ptr[0] << 8) | data_ptr[1];
+ sample.hr_conf = data_ptr[2];
+ sample.rr = (data_ptr[3] << 8) | data_ptr[4];
+ sample.activity_class = data_ptr[5];
+ sample.rr_conf = data_ptr[6];
+ sample.walk_steps = (data_ptr[7] << 24) | (data_ptr[8] << 16) |(data_ptr[9] << 8) | data_ptr[10];
+ sample.run_steps = (data_ptr[11] << 24) | (data_ptr[12] << 16) |(data_ptr[13] << 8) | data_ptr[14];
+ sample.kcal = (data_ptr[15] << 24) | (data_ptr[16] << 16) |(data_ptr[17] << 8) | data_ptr[18];
+ sample.cadence = (data_ptr[19] << 24) | (data_ptr[20] << 16) |(data_ptr[21] << 8) | data_ptr[22];
+ sample.is_led_cur_adj = data_ptr[23];
+ sample.adj_led_cur = (data_ptr[24] << 8) | data_ptr[25];
+ sample.is_t_int_cur_adj = data_ptr[26];
+ sample.adj_t_int_cur = (data_ptr[27] << 8) | data_ptr[28];
+ sample.is_f_smp_adj = data_ptr[29];
+ sample.adj_f_smp = data_ptr[30];
+ sample.smp_ave = data_ptr[31];
+ sample.state = data_ptr[32];
+ sample.is_high_motion = data_ptr[33];
+ sample.status = data_ptr[34];
+
+ //m_USB->printf("\r\nMd2- hr:%d conf:%d rr:%d act:%d\r\n", sample.hr,sample.hr_conf,sample.rr,sample.activity_class );
+ enqueue(&whrm_queue, &sample);
+ pr_info("hr=%.1f conf=%d rr=%.1f rr_conf=%d status=%d\r\n", (float)sample.hr / 10.0, sample.hr_conf, (float)sample.rr/10, sample.rr_conf,sample.activity_class);
+}
+
+
+void SSMAX8614XComm::accel_data_rx(uint8_t* data_ptr)
+{
+ //See API doc for data format
+ accel_mode1_data sample;
+ sample.x = (data_ptr[0] << 8) | data_ptr[1];
+ sample.y = (data_ptr[2] << 8) | data_ptr[3];
+ sample.z = (data_ptr[4] << 8) | data_ptr[5];
+
+ enqueue(&accel_input_queue, &sample);
+}
+
+void SSMAX8614XComm::agc_data_rx(uint8_t* data_ptr)
+{
+ //NOP: AGC does not collect data
+}
+
+int SSMAX8614XComm::data_report_execute(char* buf, int size)
+{
+ uint8_t tmp_report_mode;
+ max8614x_mode1_data max8614x_sample = { 0 };
+ whrm_modeX_data whrm_sample_modeX = { 0 };
+ //wspo2_modeX_data wspo2_sample_modeX = { 0 };
+ accel_mode1_data accel_sample = { 0 };
+
+
+ accel_data_t accel_data = {0};
+
+ int16_t data_len = 0;
+
+ static uint8_t isReportEnabled = 0;
+
+ if (size <= 0)
+ {
+ m_USB->printf("\r\nError: RepSize = %d\r\n", size);
+ return 0;
+ }
+
+ if (isReportEnabled != is_enabled())
+ {
+ isReportEnabled = is_enabled();
+ m_USB->printf("\r\nRep Enable = %d \r\n",isReportEnabled);
+ }
+
+ if (!is_enabled())
+ {
+ return 0;
+ }
+
+ ss_int->ss_execute_once();
+
+ comm_mutex.lock();
+ tmp_report_mode = data_report_mode;
+ comm_mutex.unlock();
+
+
+ while (sensor_data_from_host) {
+ accel_data_t accel_data = {0};
+
+ int ret;
+ ret = get_sensor_xyz(accel_data);
+ if (ret < 0)
+ break;
+
+ accel_mode1_data acc_sample;
+ acc_sample.x = (int16_t)(accel_data.x*1000);
+ acc_sample.y = (int16_t)(accel_data.y*1000);
+ acc_sample.z = (int16_t)(accel_data.z*1000);
+
+ if (enqueue(&accel_output_queue, &acc_sample) < 0)
+ pr_err("Thrown an accel sample\n");
+
+ if (queue_len(&accel_output_queue) < MAX_NUM_WR_ACC_SAMPLES)
+ break;
+
+ int num_bytes = 0;
+ SS_STATUS status = ss_int->get_num_bytes_in_input_fifo(&num_bytes);
+ if (status != SS_SUCCESS) {
+ pr_err("Unable to read num bytes in input fifo\r\n");
+ break;
+ }
+
+ int num_tx = input_fifo_size - num_bytes;
+ mxm_assert_msg((num_tx >= 0), "num_tx can't be negative");
+ if (num_tx <= 0)
+ break;
+
+ int num_samples = num_tx / sizeof(accel_mode1_data);
+ num_samples = min(num_samples, MAX_NUM_WR_ACC_SAMPLES);
+ num_tx = num_samples * sizeof(accel_mode1_data);
+
+ if (num_samples == 0) {
+ pr_err("Input FIFO is Full\n");
+ break;
+ }
+
+ accel_mode1_data peek_buf[num_samples];
+ ret = queue_front_n(&accel_output_queue, peek_buf, num_samples, num_samples * sizeof(accel_mode1_data));
+ if (ret < 0)
+ mxm_assert_msg((num_tx >= 0), "Unable to peek samples from accel queue. Something is wrong.");
+
+ uint8_t tx_buf[2 + num_tx]; /* 2 bytes were allocated for commands */
+ for (int i = 2, j = 0; j < num_samples; i+= sizeof(accel_mode1_data), j++) {
+ acc_sample = peek_buf[j];
+
+ tx_buf[i] = acc_sample.x;
+ tx_buf[i + 1] = acc_sample.x >> 8;
+
+ tx_buf[i + 2] = acc_sample.y;
+ tx_buf[i + 3] = acc_sample.y >> 8;
+
+ tx_buf[i + 4] = acc_sample.z;
+ tx_buf[i + 5] = acc_sample.z >> 8;
+
+ }
+
+ int num_wr_bytes = 0;
+ int nb_expected = num_tx;
+ status = ss_int->feed_to_input_fifo(tx_buf, num_tx + 2, &num_wr_bytes);
+ if (status != SS_SUCCESS) {
+ pr_err("Unable to write accel data. num_tx: %d. status: %d\r\n", num_tx, status);
+ break;
+ }
+
+ int num_written_samples = num_wr_bytes / sizeof(accel_mode1_data);
+ if (num_written_samples == 0)
+ break;
+
+ ret = queue_pop_n(&accel_output_queue, num_written_samples);
+ if (ret < 0)
+ mxm_assert_msg((num_tx >= 0), "Unable to popped samples out from accel queue. Something is wrong.");
+
+ break;
+ }
+
+
+ switch (tmp_report_mode) {
+ case read_ppg_0:
+ {
+ if (1
+
+
+ && (queue_len(&max8614x_queue) > 0 && sensor_algo_en_dis_.max8614x_enabled)
+
+
+
+ && (queue_len(&accel_input_queue) > 0 && sensor_algo_en_dis_.accel_enabled)
+
+
+
+ && (queue_len(&whrm_queue) > 0 && sensor_algo_en_dis_.whrm_enabled)
+
+ )
+ {
+
+ if(sensor_algo_en_dis_.max8614x_enabled)
+ dequeue(&max8614x_queue, &max8614x_sample);
+
+
+
+ if(sensor_algo_en_dis_.accel_enabled)
+ dequeue(&accel_input_queue, &accel_sample);
+
+
+
+ if(sensor_algo_en_dis_.whrm_enabled){
+ dequeue(&whrm_queue, &whrm_sample_modeX);
+ instant_hr = whrm_sample_modeX.hr * 0.1;
+ instant_hr_conf = whrm_sample_modeX.hr_conf;
+ instant_hr_activityClass = whrm_sample_modeX.activity_class;
+ }
+
+
+ if (AsciiEn) {
+ // mode 2 only for ASCII
+ if (ds_int->algo_report_mode == 2){
+ data_len = snprintf(buf, size - 1,
+ "%u,%lu,%lu,%lu,%lu,%lu,%lu,%.3f,%.3f,%.3f,%.1f,%d,%.1f,%d,%d,%lu,%lu,%lu,%lu,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\r\n",
+ sample_count++,
+ max8614x_sample.led1,max8614x_sample.led2,max8614x_sample.led3,max8614x_sample.led4,max8614x_sample.led5,max8614x_sample.led6,
+ accel_sample.x * 0.001,accel_sample.y * 0.001,accel_sample.z * 0.001,
+ whrm_sample_modeX.hr * 0.1, whrm_sample_modeX.hr_conf, whrm_sample_modeX.rr * 0.1,whrm_sample_modeX.rr_conf,whrm_sample_modeX.activity_class,
+ whrm_sample_modeX.walk_steps, whrm_sample_modeX.run_steps, whrm_sample_modeX.kcal, whrm_sample_modeX.cadence,
+ whrm_sample_modeX.is_led_cur_adj, whrm_sample_modeX.adj_led_cur, whrm_sample_modeX.is_t_int_cur_adj, whrm_sample_modeX.adj_t_int_cur,
+ whrm_sample_modeX.is_f_smp_adj, whrm_sample_modeX.adj_f_smp,
+ whrm_sample_modeX.smp_ave, whrm_sample_modeX.state, whrm_sample_modeX.is_high_motion, whrm_sample_modeX.status);
+ }
+ else {
+ data_len = snprintf(buf, size - 1, "%u,%lu,%lu,%lu,%lu,%lu,%lu,%.3f,%.3f,%.3f,%.1f,%d,%.1f,%d\r\n",
+ sample_count++,
+ max8614x_sample.led1,
+ max8614x_sample.led2,
+ max8614x_sample.led3,
+ max8614x_sample.led4,
+ max8614x_sample.led5,
+ max8614x_sample.led6,
+ accel_sample.x * 0.001,
+ accel_sample.y * 0.001,
+ accel_sample.z * 0.001,
+ whrm_sample_modeX.hr * 0.1,
+ whrm_sample_modeX.hr_conf,
+ whrm_sample_modeX.rr * 0.1,
+ whrm_sample_modeX.activity_class);
+ }
+ }
+ else { // bin report
+
+
+ mxm_assert_msg(((uint32_t)size > sizeof(ds_pkt_data_mode2_compact)), "data_report_execute buffer too small");
+ ds_pkt_data_mode2_compact* data_packet = (ds_pkt_data_mode2_compact*)buf;
+ data_packet->start_byte = DS_BINARY_PACKET_START_BYTE;
+ data_packet->sample_cnt = sample_count++;
+ data_packet->grnCnt = max8614x_sample.led1;
+ data_packet->grn2Cnt = max8614x_sample.led4;
+ data_packet->hr = (whrm_sample_modeX.hr * 0.1);
+ data_packet->x = (int16_t)(accel_sample.x);
+ data_packet->y = (int16_t)(accel_sample.y);
+ data_packet->z = (int16_t)(accel_sample.z);
+ data_packet->hr_confidence = whrm_sample_modeX.hr_conf;
+ data_packet->rr = whrm_sample_modeX.rr;
+ data_packet->status = whrm_sample_modeX.activity_class;
+ data_packet->crc8 = crc8((uint8_t*)data_packet, sizeof(*data_packet) - sizeof(uint8_t));
+ data_len = sizeof(*data_packet);
+ }
+ }
+ else
+ {
+ //m_USB->printf("\r\nError Printing: max8614x_q:%d, max8614x_enabled:%d, \r\n",queue_len(&max8614x_queue), sensor_algo_en_dis_.max8614x_enabled );
+ //m_USB->printf("\r\n accel_q:%d, accel_enabled:%d, \r\n",queue_len(&accel_input_queue), sensor_algo_en_dis_.accel_enabled);
+ //m_USB->printf("\r\n whrm_queue:%d,whrm_enabled:%d, \r\n",queue_len(&whrm_queue) , sensor_algo_en_dis_.whrm_enabled);
+
+ }
+ } break;
+
+ default:
+ {
+ m_USB->printf("\r\nError tmp_report_mode=%d\r\n", tmp_report_mode);
+ return 0;
+ }
+ }
+
+ if (data_len < 0) {
+ pr_err("snprintf console_tx_buf failed");
+ } else if (data_len > size) {
+ pr_err("buffer is insufficient to hold data");
+ }
+
+ return data_len;
+}
+
+// TODO: convert this to PPG sensor test
+int SSMAX8614XComm::selftest_max8614x(){
+ int ret;
+ uint8_t test_result;
+ bool test_failed = false;
+ m_USB->printf("starting selftest_max8614x\r\n");
+ // configure mfio pin for self test
+ ss_int->mfio_selftest();
+ ret = ss_int->self_test(SS_SENSORIDX_MAX86140, &test_result, 1000);
+ if(ret != SS_SUCCESS){
+ m_USB->printf("ss_int->self_test(SS_SENSORIDX_MAX86140, &test_result) has failed err<-1>\r\n");
+ test_failed = true;
+ }
+ // reset mfio pin to old state
+ if(!ss_int->reset_mfio_irq()){
+ m_USB->printf("smart sensor reset_mfio_irq has failed err<-1>\r\n");
+ test_failed = true;
+ }
+ // reset the sensor to turn off the LED
+ ret = ss_int->reset();
+ if(test_failed | !self_test_result_evaluate("selftest_max8614x", test_result)){
+ return -1;
+ }else{
+ return SS_SUCCESS;
+ }
+}
+
+int SSMAX8614XComm::selftest_accelerometer(){
+ int ret;
+ uint8_t test_result;
+ bool test_failed = false;
+ m_USB->printf("starting selftest_accelerometer\r\n");
+ ret = ss_int->self_test(SS_SENSORIDX_ACCEL, &test_result, 1000);
+ if(ret != SS_SUCCESS){
+ m_USB->printf("ss_int->self_test(SS_SENSORIDX_ACCEL, &test_result) has failed err<-1>\r\n");
+ test_failed = true;
+ }
+ // reset the sensor to turn off the LED
+ ret = ss_int->reset();
+ if(ret != SS_SUCCESS){
+ m_USB->printf("smart sensor reset has failed err<-1>\r\n");
+ test_failed = true;
+ }
+ if(test_failed | !self_test_result_evaluate("selftest_accelerometer", test_result)){
+ return -1;
+ }else{
+ return SS_SUCCESS;
+ }
+}
+
+bool SSMAX8614XComm::self_test_result_evaluate(const char *message, uint8_t result){
+ // check i2c response status
+ if(result != 0x00){
+ m_USB->printf("%s has failed % 02X err<-1>\r\n", message, result);
+ if((result & FAILURE_COMM))
+ m_USB->printf("%s communication has failed err<-1>\r\n", message);
+ if(result & FAILURE_INTERRUPT)
+ m_USB->printf("%s interrupt pin check has failed err<-1>\r\n", message);
+ return false;
+ }
+ return true;
+}
+
+unsigned char SSMAX8614XComm::get_sensor_id() {
+ return SENSOR_ID_SSMAX8614X; //TODO: assign the correct number
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/SensorComm/SmartSensorComm/SSMAX8614X/SSMAX8614XComm.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,306 @@
+/*******************************************************************************
+ * Copyright (C) 2017 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 _SSMAX8614XCOMM_H_
+#define _SSMAX8614XCOMM_H_
+
+#include "mbed.h"
+#include "SensorComm.h"
+#include "USBSerial.h"
+#include "SSInterface.h"
+#include "queue.h"
+#include "bmi160.h"
+
+#define SENSOR_ID_SSMAX8614X 0x04
+
+#define PPG_CONF_LEVEL_FLASH_ADDRESS 0x0010F100
+#define PPG_EXPIRE_DURATION_FLASH_ADDRESS 0x0010F104
+
+
+/**
+ * @brief SSMAX8614XComm Command handler class for communication with MAX30101 on SmartSensor board
+ * @details
+ */
+class SSMAX8614XComm: public SensorComm
+{
+public:
+
+ /* PUBLIC FUNCTION DECLARATIONS */
+ /**
+ * @brief SSMAX8614XComm constructor.
+ *
+ */
+ SSMAX8614XComm(USBSerial* USB, SSInterface* ssInterface, DSInterface* dsInterface);
+
+ /**
+ * @brief Parses DeviceStudio-style commands.
+ * @details Parses and executes commands. Prints return code to i/o device.
+ * @returns true if sensor acted upon the command, false if command was unknown
+ */
+ bool parse_command(const char* cmd);
+
+ /**
+ * @brief Fill in buffer with sensor data
+ *
+ * @param[in] buf Buffer to fill data into
+ * @param[in] size Maximum size of buffer
+ * @param[out] Number of bytes written to buffer
+ */
+ int data_report_execute(char* buf, int size);
+
+ /**
+ * @brief Stop collecting data and disable sensor
+ */
+ void stop();
+
+ /**
+ * @brief Get the maxim part number of the device
+ */
+ const char* get_part_name() { return "max8614x"; }
+
+ /**
+ * @brief Execute the smart sensor self test routine
+ *
+ * @return SS_SUCCESS or error code
+ */
+ int selftest_max8614x();
+
+ /**
+ * @brief Execute the accelerometer self test routine
+ * @return SS_SUCCESS or error code
+ */
+ int selftest_accelerometer();
+
+ /**
+ * @brief Evaluate the accelerometer self test routine
+ *
+ * @param message - message to be printed in the failure cases
+ * @param value - result of the self test passed as parameter
+ * @return true if result is SUCCESSFULL false otherwise
+ */
+ bool self_test_result_evaluate(const char *message, uint8_t value);
+
+ unsigned char get_sensor_id();
+
+ void setBMI160(BMI160_I2C *pbmi160);
+
+ uint16_t instant_hr;
+ uint16_t instant_hr_conf;
+ uint8_t instant_hr_activityClass;
+
+ uint16_t instant_spo2;
+ uint16_t instant_spo2_conf;
+ uint8_t instant_spo2_percentage;
+ uint8_t instant_lowSignalQualityFlag;
+
+private:
+ /* PRIVATE TYPE DEFINITIONS */
+ typedef enum _cmd_state_t {
+ get_format_ppg_0,
+ read_ppg_0, // moved here to match parser index "3"
+ get_reg_ppg,
+ set_reg_ppg,
+ dump_reg_ppg,
+ set_agc_dis,
+ set_agc_en,
+ self_test_ppg_os58,
+ self_test_ppg_acc,
+ //---------------------------WHRM_AEC_SCD -------
+ set_cfg_whrmaecscd_aecenable,
+ get_cfg_whrmaecscd_aecenable,
+ set_cfg_whrmaecscd_scdenable,
+ get_cfg_whrmaecscd_scdenable,
+ set_cfg_whrmaecscd_adjpdperiod,
+ get_cfg_whrmaecscd_adjpdperiod,
+ set_cfg_whrmaecscd_debouncewin,
+ get_cfg_whrmaecscd_debouncewin,
+ set_cfg_whrmaecscd_motionthreshold,
+ get_cfg_whrmaecscd_motionthreshold,
+ set_cfg_whrmaecscd_minpdcurrent,
+ get_cfg_whrmaecscd_minpdcurrent,
+ set_cfg_whrmaecscd_pdconfig,
+ get_cfg_whrmaecscd_pdconfig,
+ set_cfg_whrmaecscd_ledconfig,
+ get_cfg_whrmaecscd_ledconfig,
+ //------------------------------------------------
+ send_raw,
+ set_cfg_accel_sh_dis,
+ set_cfg_accel_sh_en,
+ set_cfg_ppg_conf_level,
+ set_cfg_ppg_expire_duration,
+ NUM_CMDS,
+ } cmd_state_t;
+
+
+ typedef struct {
+ uint32_t led1;
+ uint32_t led2;
+ uint32_t led3;
+ uint32_t led4;
+ uint32_t led5;
+ uint32_t led6;
+ } max8614x_mode1_data;
+
+ typedef struct __attribute__((packed)){
+ uint16_t hr; // mode 1 & 2
+ uint8_t hr_conf; // mode 1 & 2
+ uint16_t rr; // mode 1 & 2
+ uint8_t activity_class; // mode 1 & 2
+ uint8_t rr_conf; // mode 2
+ uint32_t walk_steps; // mode 2
+ uint32_t run_steps; // mode 2
+ uint32_t kcal; // mode 2
+ uint32_t cadence; // mode 2
+ uint8_t is_led_cur_adj; // mode 2
+ uint16_t adj_led_cur; // mode 2
+ uint8_t is_t_int_cur_adj;// mode 2
+ uint16_t adj_t_int_cur; // mode 2
+ uint8_t is_f_smp_adj; // mode 2
+ uint8_t adj_f_smp; // mode 2
+ uint8_t smp_ave; // mode 2
+ uint8_t state; // mode 2
+ uint8_t is_high_motion; // mode 2
+ uint8_t status; // mode 2
+ } whrm_modeX_data;
+
+ typedef struct {
+ int16_t x;
+ int16_t y;
+ int16_t z;
+ } accel_mode1_data;
+
+
+ typedef struct __attribute__((packed)) {
+ uint32_t start_byte :8;
+
+ uint32_t sample_cnt :32;
+ uint32_t led1 :20;
+ uint32_t led2 :20;
+ uint32_t led3 :20;
+ uint32_t led4 :20;
+ uint32_t led5 :20;
+ uint32_t led6 :20;
+ uint32_t x :14; //Represent values of 0.000 through 8.191
+ uint32_t y :14; //Represent values of 0.000 through 8.191
+ uint32_t z :14; //Represent values of 0.000 through 8.191
+ uint32_t hr :12; //Represent values of 0.0 through 204.7
+ uint32_t spo2 :11; //Represent values of 0.0 through 102.3 (only need up to 100.0)
+ uint32_t status :8;
+
+ uint8_t :0; //Align CRC byte on byte boundary
+ uint8_t crc8:8;
+ } ds_pkt_data_mode1;
+
+
+ typedef struct __attribute__((packed)) {
+ uint32_t start_byte :8;
+ uint32_t sample_cnt :16;
+ uint32_t grnCnt :20;
+ uint32_t grn2Cnt :20;
+ uint32_t x :14; //Represent values of 0.000 through 8.191
+ uint32_t y :14; //Represent values of 0.000 through 8.191
+ uint32_t z :14; //Represent values of 0.000 through 8.191
+ uint32_t hr :12; //Represent values of 0.0 through 204.7
+ uint32_t hr_confidence :8; //Represent values of 0.0 through 100
+ uint32_t rr :11; //Represent values of 0.0 through 102.3 (only need up to 100.0)
+ uint32_t status :8;
+ uint8_t :0; //Align CRC byte on byte boundary
+ uint8_t crc8:8;
+ } ds_pkt_data_mode2_compact;
+
+ typedef struct _accel_data_t {
+ float x;
+ float y;
+ float z;
+ int16_t x_raw;
+ int16_t y_raw;
+ int16_t z_raw;
+ } accel_data_t;
+
+ /* PRIVATE VARIABLES */
+ int input_fifo_size;
+ bool sensor_data_from_host;
+
+ BMI160_I2C *m_bmi160;
+
+ USBSerial *m_USB;
+ SSInterface *ss_int;
+ DSInterface *ds_int;
+
+ queue_t max8614x_queue;
+ uint8_t max8614x_queue_buf[64 * sizeof(max8614x_mode1_data)];
+
+ queue_t whrm_queue;
+ uint8_t whrm_queue_buf[64 * sizeof(whrm_modeX_data)]; // use the bigger of model and 2
+
+ queue_t accel_output_queue;
+ uint8_t accel_output_queue_buf[64 * sizeof(accel_mode1_data)];
+
+ queue_t accel_input_queue;
+ uint8_t accel_input_queue_buf[64 * sizeof(accel_mode1_data)];
+
+
+ ss_data_req max8614x_mode1_data_req;
+ ss_data_req whrm_mode1_data_req;
+ ss_data_req whrm_mode2_data_req;
+
+ ss_data_req accel_mode1_data_req;
+ ss_data_req agc_mode1_data_req;
+
+
+ bool agc_enabled;
+
+ // sensor and algo status
+ status_algo_sensors_st sensor_algo_en_dis_;
+
+ /* PRIVATE CONST VARIABLES */
+ static const int SSMAX8614X_REG_SIZE = 1;
+ static const int SSMAX8614X_MODE1_DATASIZE = 18; //Taken from API doc
+ static const int SSWHRM_MODE1_DATASIZE = 6; //Taken from API doc
+ static const int SSWHRM_MODEX_DATASIZE = 35; // For WHRM_AEC_SCD
+ static const int SSACCEL_MODE1_DATASIZE = 6; //Taken from API doc
+ static const int SSAGC_MODE1_DATASIZE = 0; //Taken from API doc
+
+
+ /* PRIVATE METHODS */
+ void max8614x_data_rx(uint8_t *data_ptr);
+ void whrm_data_rx_mode1(uint8_t *data_ptr);
+ void whrm_data_rx_mode2(uint8_t *data_ptr);
+ void accel_data_rx(uint8_t *data_ptr);
+ void agc_data_rx(uint8_t *data_ptr);
+ int get_sensor_xyz(accel_data_t&);
+ int parse_cal_str(const char *ptr_ch, const char *cmd, uint8_t *cal_data, int cal_data_sz);
+ int parse_str(const char *ptr_ch, const char *cmd, uint8_t *data, int data_sz);
+};
+
+#endif /* _SSMAX8614XCOMM_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/SensorComm/TempComm/TempComm.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,298 @@
+ /***************************************************************************
+* Copyright (C) 2017 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 <ctype.h>
+#include "TempComm.h"
+#include "mxc_errors.h"
+#include "MAX30205.h"
+#include "CRC8.h"
+#include "Peripherals.h"
+#include "utils.h"
+#include "BLE_ICARUS.h"
+
+#define TP_REG_COUNT 64
+
+
+
+
+
+#define MINIMUM_PERIOD_SECOND 0.5
+
+const char *cmd_tbl_tp[] = {
+ "get_format temp 0",
+ "read temp 0", /* raw */
+ "set_cfg temp sr", //set sample rate
+ "get_reg temp",
+ "set_reg temp",
+ "dump_reg temp",
+};
+
+TempComm::TempComm(USBSerial* USB):
+ SensorComm("temp", true)
+{
+ m_USB = USB;
+ TempComm_Set_ReadTempStatus(false);
+ ticker_period_second_ = MINIMUM_PERIOD_SECOND;
+ sampling_period_ms_ = MINIMUM_PERIOD_SECOND * 1000;
+
+}
+
+void TempComm::stop()
+{
+ int ret;
+ comm_mutex.lock();
+ data_report_mode = 0;
+ comm_mutex.unlock();
+ ret = sensor->sensor_enable(0);
+ m_tempcomm_ticker_.detach();
+ TempComm_Set_ReadTempStatus(false);
+ if (ret < 0) {
+ pr_err("sensor_enable failed. ret: %d", ret);
+ }
+}
+
+bool TempComm::parse_command(const char* cmd)
+{
+ int i;
+ int ret = EXIT_SUCCESS;
+ uint8_t reg_addr;
+ uint16_t val;
+ bool recognizedCmd = false;
+ int data_len = 0;
+ char charbuf[512];
+ addr_val_pair reg_vals[TP_REG_COUNT];
+ bool comma;
+
+ if (sensor == NULL) {
+ pr_err("sensor object is invalid!");
+ return false;
+ }
+
+ for (i = 0; i < NUM_CMDS; i++) {
+ if (starts_with(cmd, cmd_tbl_tp[i])) {
+ cmd_state_t user_cmd = (cmd_state_t)i;
+ recognizedCmd = true;
+ switch (user_cmd) {
+ case get_tp_format_mode0:
+ if(AsciiEn)
+ {
+ m_USB->printf("\r\n%s format=smpleCnt,temp err=0\r\n",
+ cmd);
+ }
+ else
+ {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s enc=bin cs=1 format={smpleCnt,8},{temp,16,2} err=0\r\n",
+ cmd);
+ m_USB->printf(charbuf);
+ }
+ break;
+ case read_tp_mode0:
+ comm_mutex.lock();
+ data_report_mode = read_tp_mode0;
+ comm_mutex.unlock();
+ sample_count = 0;
+ ret = sensor->sensor_enable(1);
+ if (ret < 0) {
+ pr_err("sensor_enable failed. ret: %d\r\n", ret);
+ }
+
+ m_tempcomm_ticker_.detach();
+ m_tempcomm_ticker_.attach(callback(this,&TempComm::TempComm_Set_ReadTempStatus_Ticker), ticker_period_second_);
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, ret);
+ m_USB->printf(charbuf);
+ break;
+ case set_cfg_sr:
+ ret = (parse_cmd_data(cmd, cmd_tbl_tp[i], &sampling_period_ms_, 1, false) != 1);
+ if (ret) {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, -1);
+ m_USB->printf(charbuf);
+ break;
+ }
+ ticker_period_second_ = sampling_period_ms_/ 1000.0;
+ if(ticker_period_second_ < MINIMUM_PERIOD_SECOND){
+ pr_err("minimum value is less than 0.5\r\n");
+ sampling_period_ms_ = MINIMUM_PERIOD_SECOND * 1000;
+ ticker_period_second_ = MINIMUM_PERIOD_SECOND;
+ ret = -1;
+ }
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, ret);
+ m_USB->printf(charbuf);
+ break;
+ case get_reg:
+ reg_addr = 0;
+ val = 0;
+ ret = parse_get_reg_cmd(cmd, sensor_type, ®_addr);
+ if (!ret) {
+ ret = ((MAX30205*)sensor)->readRegister(static_cast<MAX30205::Registers_e> (reg_addr), val);
+ }
+
+ reg_vals[0].addr = reg_addr;
+ reg_vals[0].val = val;
+ InsertRegValuesIntoBleQeueu(reg_vals, 1);
+
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s reg_val=%02X err=%d\r\n", cmd, val, ret);
+ m_USB->printf(charbuf);
+ break;
+ case set_reg:
+ ret = parse_set_reg_cmd(cmd, sensor_type, ®_addr, &val);
+ if (!ret) {
+ ret = ((MAX30205*)sensor)->writeRegister(static_cast<MAX30205::Registers_e> (reg_addr), val);
+ }
+
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, ret);
+ m_USB->printf(charbuf);
+ break;
+ case dump_regs:
+ for (int i = 0; i < TP_REG_COUNT; i++) {
+ reg_vals[i].addr = 0xFF;
+ }
+
+ ret = sensor->dump_registers(reg_vals);
+
+ if (ret) {
+ m_USB->printf("\r\n%s err=%d\n", cmd, ret);
+
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\n", cmd, ret);
+ }
+ else {
+ data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s reg_val=", cmd);
+ comma = false;
+ for (int i = 0; i < TP_REG_COUNT; i++) {
+ if(reg_vals[i].addr == 0xFF)
+ break;
+ if (comma) {
+ data_len += snprintf(charbuf + data_len,
+ sizeof(charbuf) - data_len - 1, ",");
+ }
+ data_len += snprintf(charbuf + data_len,
+ sizeof(charbuf) - data_len - 1,
+ "{%X,%X}", (unsigned int)reg_vals[i].addr, (unsigned int)reg_vals[i].val);
+ comma = true;
+ }
+ data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1, " err=0\r\n");
+
+ m_USB->printf(charbuf);
+
+ }
+
+ break;
+
+ default:
+ break;
+ }
+
+
+ if (BLE::Instance().gap().getState().connected) {
+ BLE_Icarus_AddtoQueue((uint8_t *)charbuf, (int32_t)sizeof(charbuf), data_len);
+ }
+
+
+ }
+ }
+
+ return recognizedCmd;
+}
+
+int TempComm::data_report_execute(char* buf, int size)
+{
+ int16_t data_len = 0;
+ uint8_t tmp_report_mode;
+ uint16_t tp_val;
+ uint32_t ret;
+ uint32_t tp_val_ext;
+ float Celsius;
+
+ tp0_comm_packet *data_packet;
+
+ if (sensor == NULL)
+ return 0;
+
+ if(!is_enabled())
+ return 0;
+
+ comm_mutex.lock();
+ tmp_report_mode = data_report_mode;
+ comm_mutex.unlock();
+
+ switch(tmp_report_mode) {
+ case read_tp_mode0:
+ if ( (m_can_read_temp_) ) {
+ TempComm_Set_ReadTempStatus(false);
+ ret = ((MAX30205*)sensor)->readTemperature(tp_val);
+
+
+ if (ret != 0)
+ return 0;
+ tp_val_ext = (uint32_t)tp_val;
+ Celsius = ((MAX30205*)sensor)->toCelsius(tp_val_ext);
+ tp_val = Celsius*100;
+ TempComm_instant_temp_celsius = Celsius;
+
+if(AsciiEn)
+{
+ data_len = snprintf(buf, size - 1,
+ "%lu,%2.3f\r\n",
+ sample_count++,
+ Celsius);
+}
+else{
+ data_packet = (tp0_comm_packet *)buf;
+ data_packet->start_byte = 0xAA;
+ data_packet->smpleCnt = sample_count++;
+ data_packet->tp = tp_val;
+ data_packet->crc8 = crc8((uint8_t*)data_packet, sizeof(*data_packet) - sizeof(uint8_t));
+ data_len = sizeof(*data_packet);
+}
+ }
+ break;
+
+ default:
+ return 0;
+ }
+
+ if (data_len < 0) {
+ pr_err("snprintf buf failed");
+ } else if (data_len > size) {
+ pr_err("buffer is insufficient to hold data");
+ }
+
+ return data_len;
+}
+
+void TempComm::TempComm_Set_ReadTempStatus(bool en){
+ m_can_read_temp_ = en;
+}
+
+void TempComm::TempComm_Set_ReadTempStatus_Ticker(){
+ m_can_read_temp_ = true;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/SensorComm/TempComm/TempComm.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (C) 2017 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 _TEMPCOMM_H_
+#define _TEMPCOMM_H_
+
+#include "mbed.h"
+#include "SensorComm.h"
+#include "USBSerial.h"
+#include "MAX30205.h"
+
+/**
+ * @brief TempComm Temperature sensor command handler class.
+ * @details
+ */
+class TempComm: public SensorComm
+{
+public:
+
+ /* PUBLIC FUNCTION DECLARATIONS */
+ /**
+ * @brief TempComm constructor.
+ *
+ */
+ TempComm(USBSerial* USB);
+
+ /* PROTECTED FUNCTION DECLARATIONS */
+ /**
+ * @brief Parses Sensor Studio commands.
+ * @details Parses and executes commands. Prints command result to i/o device.
+ * @returns true if sensor acted upon the command, false if command was unknown
+ */
+ bool parse_command(const char* cmd);
+
+ /**
+ * @brief Fill in buffer with sensor data
+ *
+ * @param[in] buf Buffer to fill data into
+ * @param[in] size Maximum size of buffer
+ * @param[out] Number of bytes written to buffer
+ */
+ int data_report_execute(char* buf, int size);
+
+ /**
+ * @brief Stop collecting data and disable sensor
+ */
+ void stop();
+
+ //sc... track whether the temperature can be read
+ void TempComm_Set_ReadTempStatus(bool en);
+
+ //sc... track whether the temperature can be read
+ void TempComm_Set_ReadTempStatus_Ticker();
+
+ volatile float TempComm_instant_temp_celsius;
+
+private:
+ /* PRIVATE TYPE DEFINITIONS */
+ typedef enum _cmd_state_t {
+ get_tp_format_mode0=0,
+ read_tp_mode0,
+ set_cfg_sr,
+ get_reg,
+ set_reg,
+ dump_regs,
+ NUM_CMDS,
+ } cmd_state_t;
+
+ typedef struct __attribute__((packed)) {
+ uint32_t start_byte :8;
+ uint32_t smpleCnt :8; //Represent 0-127
+ uint32_t tp :16; //TP ADC data
+ uint8_t :0; //Needed to align crc to byte boundary
+ uint8_t crc8 :8;
+ } tp0_comm_packet;
+
+ /* PRIVATE VARIABLES */
+ USBSerial *m_USB;
+ volatile char m_can_read_temp_;
+ Ticker m_tempcomm_ticker_;
+ // read temp ticker settings
+ float ticker_period_second_;
+ uint32_t sampling_period_ms_;
+
+
+};
+
+#endif /* _PPGCOMM_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/SmartSensor/SSInterface.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,1148 @@
+/***************************************************************************
+* Copyright (C) 2017 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 "SSInterface.h"
+
+#include "../../Utilities/mxm_assert.h"
+#include "Peripherals.h"
+#include "utils.h"
+#include "i2cm.h"
+
+#include "pwrman_regs.h"
+#include "ioman.h"
+
+
+
+SSInterface::SSInterface(I2C &i2cBus, PinName ss_mfio, PinName ss_reset)
+ :m_i2cBus(&i2cBus), m_spiBus(NULL),
+ mfio_pin(ss_mfio), reset_pin(ss_reset), irq_pin(ss_mfio)/*,
+ irq_evt(1000000, "irq")*/
+{
+ reset_pin.input();
+ irq_pin.fall(callback(this, &SSInterface::irq_handler));
+
+ //reset_to_main_app();
+ //get_data_type(&data_type, &sc_en);
+ ebl_mode = EBL_GPIO_TRIGGER_MODE;
+}
+
+SSInterface::SSInterface(SPI &spiBus, PinName ss_mfio, PinName ss_reset)
+ :m_i2cBus(NULL), m_spiBus(&spiBus),
+ mfio_pin(ss_mfio), reset_pin(ss_reset), irq_pin(ss_mfio)/*,
+ irq_evt(1000000, "irq")*/
+{
+ reset_pin.input();
+ irq_pin.fall(callback(this, &SSInterface::irq_handler));
+
+ //reset_to_main_app();
+ //get_data_type(&data_type, &sc_en);
+ ebl_mode = EBL_GPIO_TRIGGER_MODE;
+}
+
+SSInterface::~SSInterface()
+{
+}
+
+SS_STATUS SSInterface::reset_to_main_app()
+{
+ SS_STATUS status;
+ disable_irq();
+
+ int bootldr = in_bootldr_mode();
+ if (bootldr > 0) {
+ status = exit_from_bootloader();
+ } else if (bootldr == 0) {
+ reset_pin.output();
+
+ if (ebl_mode == EBL_GPIO_TRIGGER_MODE)
+ cfg_mfio(PIN_OUTPUT);
+
+ reset_pin.write(0);
+ wait_ms(SS_RESET_TIME);
+
+ if (ebl_mode == EBL_GPIO_TRIGGER_MODE)
+ mfio_pin.write(1);
+
+ reset_pin.write(1);
+ wait_ms(SS_STARTUP_TO_MAIN_APP_TIME);
+
+ if (ebl_mode == EBL_GPIO_TRIGGER_MODE)
+ cfg_mfio(PIN_INPUT);
+
+ reset_pin.input();
+ status = SS_SUCCESS;
+ } else
+ status = SS_ERR_UNKNOWN;
+ enable_irq();
+ return status;
+}
+
+SS_STATUS SSInterface::reset_to_bootloader()
+{
+ disable_irq();
+ int bootldr = in_bootldr_mode();
+ if (bootldr > 0) {
+ enable_irq();
+ return SS_SUCCESS;
+ }
+ reset_pin.output();
+ if (ebl_mode == EBL_GPIO_TRIGGER_MODE)
+ cfg_mfio(PIN_OUTPUT);
+
+ reset_pin.write(0);
+ wait_ms(SS_RESET_TIME);
+ if (ebl_mode == EBL_GPIO_TRIGGER_MODE)
+ mfio_pin.write(0);
+
+ reset_pin.write(1);
+ wait_ms(SS_STARTUP_TO_BTLDR_TIME);
+ reset_pin.input();
+
+ if (ebl_mode == EBL_CMD_TRIGGER_MODE)
+ stay_in_bootloader();
+
+ if (ebl_mode == EBL_GPIO_TRIGGER_MODE) {
+ cfg_mfio(PIN_INPUT);
+ stay_in_bootloader();
+ }
+
+ // Verify we entered bootloader mode
+ if (in_bootldr_mode() < 0) {
+ enable_irq();
+ return SS_ERR_UNKNOWN;
+ }
+ enable_irq();
+ return SS_SUCCESS;
+}
+
+SS_STATUS SSInterface::exit_from_bootloader()
+{
+ uint8_t cmd_bytes[] = { SS_FAM_W_MODE, SS_CMDIDX_MODE };
+ uint8_t data[] = { 0x00 };
+
+ SS_STATUS status = write_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ &data[0], ARRAY_SIZE(data));
+
+ in_bootldr = (status == SS_SUCCESS) ? true : false;
+ return status;
+}
+
+SS_STATUS SSInterface::stay_in_bootloader()
+{
+ uint8_t cmd_bytes[] = { SS_FAM_W_MODE, SS_CMDIDX_MODE };
+ uint8_t data[] = { SS_MASK_MODE_BOOTLDR };
+
+ SS_STATUS status = write_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ &data[0], ARRAY_SIZE(data));
+
+ in_bootldr = (status == SS_SUCCESS) ? true : false;
+ return status;
+}
+
+int SSInterface::get_ebl_mode()
+{
+ return ebl_mode;
+}
+
+SS_STATUS SSInterface::set_ebl_mode(uint8_t mode)
+{
+ if (mode == EBL_CMD_TRIGGER_MODE || mode == EBL_GPIO_TRIGGER_MODE) {
+ ebl_mode = mode;
+ return SS_SUCCESS;
+ } else {
+ return SS_ERR_INPUT_VALUE;
+ }
+}
+
+SS_STATUS SSInterface::reset()
+{
+ int bootldr = in_bootldr_mode();
+ if (bootldr > 0)
+ return reset_to_bootloader();
+ else if (bootldr == 0)
+ return reset_to_main_app();
+ else
+ return SS_ERR_UNKNOWN;
+}
+
+SS_STATUS SSInterface::self_test(int idx, uint8_t *result, int sleep_ms){
+ uint8_t cmd_bytes[] = { SS_FAM_R_SELFTEST, (uint8_t)idx };
+ uint8_t rxbuf[2];
+ SS_STATUS ret;
+
+ result[0] = 0xFF;
+ ret = read_cmd(cmd_bytes, 2, (uint8_t *)0, 0, rxbuf, ARRAY_SIZE(rxbuf), sleep_ms);
+ result[0] = rxbuf[1];
+ return ret;
+}
+
+void SSInterface::cfg_mfio(PinDirection dir)
+{
+ if (dir == PIN_INPUT) {
+ mfio_pin.input();
+ mfio_pin.mode(PullUp);
+ } else {
+ disable_irq();
+ mfio_pin.output();
+ }
+}
+
+void SSInterface::enable_irq()
+{
+ irq_pin.enable_irq();
+}
+void SSInterface::disable_irq()
+{
+ irq_pin.disable_irq();
+}
+
+void SSInterface::mfio_selftest(){
+ disable_irq();
+ irq_pin.fall(callback(this, &SSInterface::irq_handler_selftest));
+ enable_irq();
+}
+
+int SSInterface::in_bootldr_mode()
+{
+ uint8_t cmd_bytes[] = { SS_FAM_R_MODE, SS_CMDIDX_MODE };
+ uint8_t rxbuf[2] = { 0 };
+
+ SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rxbuf[0], ARRAY_SIZE(rxbuf));
+ if (status != SS_SUCCESS)
+ return -1;
+
+ return (rxbuf[1] & SS_MASK_MODE_BOOTLDR);
+}
+
+const char* SSInterface::get_ss_fw_version()
+{
+ uint8_t cmd_bytes[2];
+ uint8_t rxbuf[4];
+
+ int bootldr = in_bootldr_mode();
+
+ if (bootldr > 0) {
+ cmd_bytes[0] = SS_FAM_R_BOOTLOADER;
+ cmd_bytes[1] = SS_CMDIDX_BOOTFWVERSION;
+ } else if (bootldr == 0) {
+ cmd_bytes[0] = SS_FAM_R_IDENTITY;
+ cmd_bytes[1] = SS_CMDIDX_FWVERSION;
+ } else {
+ return plat_name;
+ }
+
+ SS_STATUS status = read_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rxbuf[0], ARRAY_SIZE(rxbuf));
+
+ if (status == SS_SUCCESS) {
+ snprintf(fw_version, sizeof(fw_version),
+ "%d.%d.%d", rxbuf[1], rxbuf[2], rxbuf[3]);
+ pr_info("fw_version:%s\r\n", fw_version);
+ }
+
+ return &fw_version[0];
+}
+
+const char* SSInterface::get_ss_algo_version()
+{
+ uint8_t cmd_bytes[3];
+ uint8_t rxbuf[4];
+
+ int bootldr = in_bootldr_mode();
+
+ if (bootldr > 0) {
+ cmd_bytes[0] = SS_FAM_R_BOOTLOADER;
+ cmd_bytes[1] = SS_CMDIDX_BOOTFWVERSION;
+ cmd_bytes[2] = 0;
+ } else if (bootldr == 0) {
+ cmd_bytes[0] = SS_FAM_R_IDENTITY;
+ cmd_bytes[1] = SS_CMDIDX_ALGOVER;
+ cmd_bytes[2] = SS_CMDIDX_AVAILSENSORS;
+ } else {
+ return plat_name;
+ }
+
+ SS_STATUS status = read_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rxbuf[0], ARRAY_SIZE(rxbuf));
+
+ if (status == SS_SUCCESS) {
+ snprintf(algo_version, sizeof(algo_version),
+ "%d.%d.%d", rxbuf[1], rxbuf[2], rxbuf[3]);
+ pr_info("algo_version:%s\r\n", fw_version);
+ }
+
+ return &algo_version[0];
+}
+const char* SSInterface::get_ss_platform_name()
+{
+ uint8_t cmd_bytes[] = { SS_FAM_R_IDENTITY, SS_CMDIDX_PLATTYPE };
+ uint8_t rxbuf[2];
+
+ SS_STATUS status = read_cmd(
+ &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rxbuf[0], ARRAY_SIZE(rxbuf));
+
+ if (status == SS_SUCCESS) {
+ if (rxbuf[1] == SS_PLAT_MAX3263X) {
+ if (in_bootldr_mode() > 0) {
+ plat_name = SS_BOOTLOADER_PLATFORM_MAX3263X;
+ } else {
+ plat_name = SS_PLATFORM_MAX3263X;
+ }
+ } else if (rxbuf[1] == SS_PLAT_MAX32660) {
+ if (in_bootldr_mode() > 0) {
+ plat_name = SS_BOOTLOADER_PLATFORM_MAX32660;
+ } else {
+ plat_name = SS_PLATFORM_MAX32660;
+ }
+ }
+ }
+
+ return plat_name;
+}
+
+SS_STATUS SSInterface::write_cmd(uint8_t *cmd_bytes, int cmd_bytes_len,
+ uint8_t *data, int data_len,
+ int sleep_ms)
+{
+ int total_len = data_len + cmd_bytes_len;
+
+ if (total_len <= SS_SMALL_BUF_SIZE) {
+ return write_cmd_small(cmd_bytes, cmd_bytes_len, data, data_len, sleep_ms);
+ } else if (total_len <= SS_MED_BUF_SIZE) {
+ return write_cmd_medium(cmd_bytes, cmd_bytes_len, data, data_len, sleep_ms);
+ } else if (total_len <= SS_LARGE_BUF_SIZE) {
+ return write_cmd_large(cmd_bytes, cmd_bytes_len, data, data_len, sleep_ms);
+ } else {
+ mxm_assert_msg(true, "Tried to send I2C tx larger than maximum allowed size\n");
+ return SS_ERR_DATA_FORMAT;
+ }
+}
+
+#include "i2cm.h"
+void dump_i2c_regs(int idx)
+{
+ mxc_i2cm_regs_t *i2cm = MXC_I2CM_GET_I2CM(idx);
+ pr_err("****************************\r\n"
+ "I2CM(%d) registers Dump\r\n"
+ "i2cm: %p\r\n"
+ "fs_clk_div : 0x%X\r\n"
+ "timeout : 0x%X\r\n"
+ "ctrl : 0x%X\r\n"
+ "trans : 0x%X\r\n"
+ "intfl : 0x%X\r\n"
+ "inten : 0x%X\r\n"
+ "bb : 0x%X\r\n"
+ "****************************\r\n",
+ idx,
+ i2cm,
+ i2cm->fs_clk_div,
+ i2cm->timeout,
+ i2cm->ctrl,
+ i2cm->trans,
+ i2cm->intfl,
+ i2cm->inten,
+ i2cm->bb);
+
+ /* Clean flags */
+ i2cm->intfl = i2cm->intfl;
+}
+
+SS_STATUS SSInterface::write_cmd(uint8_t *tx_buf, int tx_len, int sleep_ms)
+{
+ pr_info("write_cmd: ");
+ for (int i = 0; i < tx_len; i++) {
+ pr_info("0x%02X ", tx_buf[i]);
+ }
+ pr_info("\r\n");
+
+ int ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)tx_buf, tx_len);
+
+ int retries = 4;
+ while (ret != 0 && retries-- > 0) {
+ pr_err("i2c wr retry\r\n");
+ wait_ms(1);
+ ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)tx_buf, tx_len);
+ }
+
+ if (ret != 0) {
+ pr_err("m_i2cBus->write returned %d\r\n", ret);
+
+ return SS_ERR_UNAVAILABLE;
+ }
+
+ wait_ms(sleep_ms);
+
+ char status_byte;
+ ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, &status_byte, 1);
+ bool try_again = (status_byte == SS_ERR_TRY_AGAIN);
+ while ((ret != 0 || try_again)
+ && retries-- > 0) {
+ pr_info("i2c rd retry\r\n");
+ wait_ms(sleep_ms);
+ ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, &status_byte, 1);
+ try_again = (status_byte == SS_ERR_TRY_AGAIN);
+ }
+
+ if (ret != 0 || try_again) {
+
+ pr_err("m_i2cBus->read returned %d, ss status_byte %d\r\n", ret, status_byte);
+ return SS_ERR_UNAVAILABLE;
+ }
+
+ pr_info("status_byte: %d\r\n", status_byte);
+
+ return (SS_STATUS)status_byte;
+}
+
+SS_STATUS SSInterface::write_cmd_small(uint8_t *cmd_bytes, int cmd_bytes_len,
+ uint8_t *data, int data_len,
+ int sleep_ms)
+{
+ uint8_t write_buf[SS_SMALL_BUF_SIZE];
+ memcpy(write_buf, cmd_bytes, cmd_bytes_len);
+ memcpy(write_buf + cmd_bytes_len, data, data_len);
+
+ SS_STATUS status = write_cmd(write_buf, cmd_bytes_len + data_len, sleep_ms);
+ return status;
+}
+
+SS_STATUS SSInterface::write_cmd_medium(uint8_t *cmd_bytes, int cmd_bytes_len,
+ uint8_t *data, int data_len,
+ int sleep_ms)
+{
+ uint8_t write_buf[SS_MED_BUF_SIZE];
+ memcpy(write_buf, cmd_bytes, cmd_bytes_len);
+ memcpy(write_buf + cmd_bytes_len, data, data_len);
+
+ SS_STATUS status = write_cmd(write_buf, cmd_bytes_len + data_len, sleep_ms);
+ return status;
+}
+
+SS_STATUS SSInterface::write_cmd_large(uint8_t *cmd_bytes, int cmd_bytes_len,
+ uint8_t *data, int data_len,
+ int sleep_ms)
+{
+ uint8_t write_buf[SS_LARGE_BUF_SIZE];
+ memcpy(write_buf, cmd_bytes, cmd_bytes_len);
+ memcpy(write_buf + cmd_bytes_len, data, data_len);
+
+ SS_STATUS status = write_cmd(write_buf, cmd_bytes_len + data_len, sleep_ms);
+ return status;
+}
+
+SS_STATUS SSInterface::read_cmd(uint8_t *cmd_bytes, int cmd_bytes_len,
+ uint8_t *data, int data_len,
+ uint8_t *rxbuf, int rxbuf_sz,
+ int sleep_ms)
+{
+#if 0
+ pr_info("read_cmd: ");
+ for (int i = 0; i < cmd_bytes_len; i++) {
+ pr_info("0x%02X ", cmd_bytes[i]);
+ }
+ pr_info("\r\n");
+
+#endif
+
+ int retries = 4;
+
+ int ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)cmd_bytes, cmd_bytes_len, (data_len != 0));
+#ifdef SHOW_I2C_DEBUG_MESSAGES
+ printf("ret1 : %d\rt\n",ret);
+#endif
+ if (data_len != 0) {
+ ret |= m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)data, data_len, false);
+#ifdef SHOW_I2C_DEBUG_MESSAGES
+ printf("ret2 : %d\rt\n",ret);
+#endif
+ }
+
+ while (ret != 0 && retries-- > 0) {
+
+ pr_err("i2c wr retry\r\n");
+ wait_ms(1);
+ ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)cmd_bytes, cmd_bytes_len, (data_len != 0));
+#ifdef SHOW_I2C_DEBUG_MESSAGES
+ printf("ret3 : %d\rt\n",ret);
+#endif
+ if (data_len != 0) {
+ ret |= m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)data, data_len, false);
+#ifdef SHOW_I2C_DEBUG_MESSAGES
+ printf("ret4 : %d\rt\n",ret);
+#endif
+ }
+ }
+
+ if (ret != 0) {
+ pr_err("m_i2cBus->write returned %d\r\n", ret);
+
+ return SS_ERR_UNAVAILABLE;
+ }
+
+ wait_ms(sleep_ms);
+
+ ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, (char*)rxbuf, rxbuf_sz);
+ bool try_again = (rxbuf[0] == SS_ERR_TRY_AGAIN);
+ while ((ret != 0 || try_again) && retries-- > 0) {
+ pr_info("i2c rd retry\r\n");
+ wait_ms(sleep_ms);
+ ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, (char*)rxbuf, rxbuf_sz);
+ try_again = (rxbuf[0] == SS_ERR_TRY_AGAIN);
+ }
+ if (ret != 0 || try_again) {
+ pr_err("m_i2cBus->read returned %d, ss status_byte %d\r\n", ret, rxbuf[0]);
+
+ return SS_ERR_UNAVAILABLE;
+ }
+
+ pr_info("status_byte: %d\r\n", rxbuf[0]);
+ pr_info("data: ");
+ for (int i = 1; i < rxbuf_sz; i++) {
+ pr_info("0x%02X ", rxbuf[i]);
+ }
+ pr_info("\r\n");
+
+ return (SS_STATUS)rxbuf[0];
+}
+
+SS_STATUS SSInterface::get_reg(int idx, uint8_t addr, uint32_t *val)
+{
+ mxm_assert_msg((idx <= SS_MAX_SUPPORTED_SENSOR_NUM), "idx must be < SS_MAX_SUPPORTED_SENSOR_NUM, or update code to handle variable length idx values");
+
+ uint8_t cmd_bytes[] = { SS_FAM_R_REGATTRIBS, (uint8_t)idx };
+ uint8_t rx_reg_attribs[3] = {0};
+
+ SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rx_reg_attribs[0], ARRAY_SIZE(rx_reg_attribs));
+
+ if (status != SS_SUCCESS)
+ return status;
+
+ int reg_width = rx_reg_attribs[1];
+
+ uint8_t cmd_bytes2[] = { SS_FAM_R_READREG, (uint8_t)idx, addr };
+ uint8_t rxbuf[5] = {0};
+
+ status = read_cmd(&cmd_bytes2[0], ARRAY_SIZE(cmd_bytes2),
+ 0, 0,
+ &rxbuf[0], reg_width + 1);
+
+ if (status == SS_SUCCESS) {
+ *val = 0;
+ for (int i = 0; i < reg_width; i++) {
+ *val = (*val << 8) | rxbuf[i + 1];
+ }
+ }
+
+ return status;
+}
+
+SS_STATUS SSInterface::set_reg(int idx, uint8_t addr, uint32_t val, int byte_size)
+{
+ mxm_assert_msg((idx <= SS_MAX_SUPPORTED_SENSOR_NUM), "idx must be < SS_MAX_SUPPORTED_SENSOR_NUM, or update code to handle variable length idx values");
+
+ uint8_t cmd_bytes[] = { SS_FAM_W_WRITEREG, (uint8_t)idx, addr };
+ uint8_t data_bytes[4];
+ for (int i = 0; i < byte_size; i++) {
+ data_bytes[i] = (val >> (8 * (byte_size - 1)) & 0xFF);
+ }
+
+ SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ &data_bytes[0], byte_size, SS_ENABLE_SENSOR_SLEEP_MS);
+
+ return status;
+}
+
+SS_STATUS SSInterface::dump_reg(int idx, addr_val_pair* reg_vals, int reg_vals_sz, int* num_regs)
+{
+ mxm_assert_msg((idx <= SS_MAX_SUPPORTED_SENSOR_NUM), "idx must be < SS_MAX_SUPPORTED_SENSOR_NUM, or update code to handle variable length idx values");
+
+ uint8_t cmd_bytes[] = { SS_FAM_R_REGATTRIBS, (uint8_t)idx };
+ uint8_t rx_reg_attribs[3] = {0};
+
+ SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rx_reg_attribs[0], ARRAY_SIZE(rx_reg_attribs));
+
+ if (status != SS_SUCCESS)
+ return status;
+
+ int reg_width = rx_reg_attribs[1];
+ *num_regs = rx_reg_attribs[2];
+ mxm_assert_msg((*num_regs <= reg_vals_sz), "Need to increase reg_vals array to hold all dump_reg data");
+ mxm_assert_msg(((size_t)reg_width <= sizeof(uint32_t)), "IC returned register values greater than 4 bytes in width");
+
+ int dump_reg_sz = (*num_regs) * (reg_width + 1) + 1; //+1 to reg_width for address, +1 for status byte
+
+ uint8_t rxbuf[512];
+ mxm_assert_msg(((size_t)dump_reg_sz <= sizeof(rxbuf)), "Need to increase buffer size to receive dump_reg data");
+
+ cmd_bytes[0] = SS_FAM_R_DUMPREG;
+ status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rxbuf[0], dump_reg_sz, SS_DUMP_REG_SLEEP_MS);
+
+ if (status != SS_SUCCESS)
+ return status;
+
+ //rxbuf format is [status][addr0](reg_width x [val0])[addr1](reg_width x [val1])...
+ for (int reg = 0; reg < *num_regs; reg++) {
+ reg_vals[reg].addr = rxbuf[(reg * (reg_width + 1)) + 1];
+ uint32_t *val = &(reg_vals[reg].val);
+ *val = 0;
+ for (int byte = 0; byte < reg_width; byte++) {
+ *val = (*val << 8) | rxbuf[(reg * (reg_width + 1)) + byte + 2];
+ }
+ }
+
+ return SS_SUCCESS;
+}
+
+SS_STATUS SSInterface::enable_sensor(int idx, int mode, ss_data_req *data_req, uint8_t ext_mode)
+{
+ mxm_assert_msg((idx <= SS_MAX_SUPPORTED_SENSOR_NUM), "idx must be < SS_MAX_SUPPORTED_SENSOR_NUM, or update code to handle variable length idx values");
+ mxm_assert_msg((mode <= SS_MAX_SUPPORTED_MODE_NUM), "mode must be < SS_MAX_SUPPORTED_MODE_NUM, or update code to handle variable length mode values");
+ mxm_assert_msg((mode != 0), "Tried to enable sensor to mode 0, but mode 0 is disable");
+
+
+ uint8_t cmd_bytes[] = { SS_FAM_W_SENSORMODE, (uint8_t)idx, (uint8_t)mode, ext_mode };
+
+ SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), 0, 0, 5 * SS_ENABLE_SENSOR_SLEEP_MS);
+
+ if (status == SS_SUCCESS) {
+ sensor_enabled_mode[idx] = mode;
+ sensor_data_reqs[idx] = data_req;
+ }
+ return status;
+}
+
+SS_STATUS SSInterface::disable_sensor(int idx)
+{
+ mxm_assert_msg((idx <= SS_MAX_SUPPORTED_SENSOR_NUM), "idx must be < SS_MAX_SUPPORTED_SENSOR_NUM, or update code to handle variable length idx values");
+ uint8_t cmd_bytes[] = { SS_FAM_W_SENSORMODE, (uint8_t)idx, 0 };
+
+ SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), 0, 0, SS_ENABLE_SENSOR_SLEEP_MS);
+
+ if (status == SS_SUCCESS) {
+ sensor_enabled_mode[idx] = 0;
+ sensor_data_reqs[idx] = 0;
+ }
+
+ return status;
+}
+
+SS_STATUS SSInterface::enable_algo(int idx, int mode, ss_data_req *data_req)
+{
+ mxm_assert_msg((idx <= SS_MAX_SUPPORTED_ALGO_NUM), "idx must be < SS_MAX_SUPPORTED_ALGO_NUM, or update code to handle variable length idx values");
+ mxm_assert_msg((mode <= SS_MAX_SUPPORTED_MODE_NUM), "mode must be < SS_MAX_SUPPORTED_MODE_NUM, or update code to handle variable length mode values");
+ mxm_assert_msg((mode != 0), "Tried to enable algo to mode 0, but mode 0 is disable");
+
+ uint8_t cmd_bytes[] = { SS_FAM_W_ALGOMODE, (uint8_t)idx, (uint8_t)mode };
+
+ SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), 0, 0, 25 * SS_ENABLE_SENSOR_SLEEP_MS);
+
+ if (status == SS_SUCCESS) {
+ algo_enabled_mode[idx] = mode;
+ algo_data_reqs[idx] = data_req;
+ }
+
+ return status;
+}
+
+SS_STATUS SSInterface::disable_algo(int idx)
+{
+ mxm_assert_msg((idx <= SS_MAX_SUPPORTED_ALGO_NUM), "idx must be < SS_MAX_SUPPORTED_ALGO_NUM, or update code to handle variable length idx values");
+ uint8_t cmd_bytes[] = { SS_FAM_W_ALGOMODE, (uint8_t)idx, 0 };
+
+ SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), 0, 0, SS_ENABLE_SENSOR_SLEEP_MS);
+
+ if (status == SS_SUCCESS) {
+ algo_enabled_mode[idx] = 0;
+ algo_data_reqs[idx] = 0;
+ }
+
+ return status;
+}
+
+SS_STATUS SSInterface::set_algo_cfg(int algo_idx, int cfg_idx, uint8_t *cfg, int cfg_sz)
+{
+ mxm_assert_msg((algo_idx <= SS_MAX_SUPPORTED_ALGO_NUM), "idx must be < SS_MAX_SUPPORTED_ALGO_NUM, or update code to handle variable length idx values");
+ mxm_assert_msg((cfg_idx <= SS_MAX_SUPPORTED_ALGO_CFG_NUM), "idx must be < SS_MAX_SUPPORTED_ALGO_CFG_NUM, or update code to handle variable length idx values");
+
+ uint8_t cmd_bytes[] = { SS_FAM_W_ALGOCONFIG, (uint8_t)algo_idx, (uint8_t)cfg_idx };
+ SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ cfg, cfg_sz);
+
+ return status;
+}
+
+SS_STATUS SSInterface::get_algo_cfg(int algo_idx, int cfg_idx, uint8_t *cfg, int cfg_sz)
+{
+ mxm_assert_msg((algo_idx <= SS_MAX_SUPPORTED_ALGO_NUM), "idx must be < SS_MAX_SUPPORTED_ALGO_NUM, or update code to handle variable length idx values");
+ mxm_assert_msg((cfg_idx <= SS_MAX_SUPPORTED_ALGO_CFG_NUM), "idx must be < SS_MAX_SUPPORTED_ALGO_CFG_NUM, or update code to handle variable length idx values");
+
+ uint8_t cmd_bytes[] = { SS_FAM_R_ALGOCONFIG, (uint8_t)algo_idx, (uint8_t)cfg_idx };
+ SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ cfg, cfg_sz);
+
+ return status;
+}
+
+//--------------------------------------------------------------
+SS_STATUS SSInterface::send_raw(uint8_t *rawdata, int rawdata_sz)
+{
+ SS_STATUS status = write_cmd(&rawdata[0], rawdata_sz, 5 * SS_ENABLE_SENSOR_SLEEP_MS);
+ return status;
+}
+//---------------------------------------------------------------
+SS_STATUS SSInterface::set_data_type(int data_type, bool sc_en)
+{
+ mxm_assert_msg((data_type >= 0) && (data_type <= 3), "Invalid value for data_type");
+ uint8_t cmd_bytes[] = { SS_FAM_W_COMMCHAN, SS_CMDIDX_OUTPUTMODE };
+ uint8_t data_bytes[] = { (uint8_t)((sc_en ? SS_MASK_OUTPUTMODE_SC_EN : 0) |
+ ((data_type << SS_SHIFT_OUTPUTMODE_DATATYPE) & SS_MASK_OUTPUTMODE_DATATYPE)) };
+
+ SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ &data_bytes[0], ARRAY_SIZE(data_bytes));
+
+ this->data_type = data_type;
+ this->sc_en = sc_en;
+
+ return status;
+}
+
+
+SS_STATUS SSInterface::get_data_type(int *data_type, bool *sc_en)
+{
+ uint8_t cmd_bytes[] = { SS_FAM_R_COMMCHAN, SS_CMDIDX_OUTPUTMODE };
+ uint8_t rxbuf[2] = {0};
+
+ SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rxbuf[0], ARRAY_SIZE(rxbuf));
+ if (status == SS_SUCCESS) {
+ *data_type =
+ (rxbuf[1] & SS_MASK_OUTPUTMODE_DATATYPE) >> SS_SHIFT_OUTPUTMODE_DATATYPE;
+ *sc_en =
+ (bool)((rxbuf[1] & SS_MASK_OUTPUTMODE_SC_EN) >> SS_SHIFT_OUTPUTMODE_SC_EN);
+ }
+
+ return status;
+}
+
+SS_STATUS SSInterface::set_fifo_thresh(int thresh)
+{
+ mxm_assert_msg((thresh > 0 && thresh <= 255), "Invalid value for fifo a full threshold");
+ uint8_t cmd_bytes[] = { SS_FAM_W_COMMCHAN, SS_CMDIDX_FIFOAFULL };
+ uint8_t data_bytes[] = { (uint8_t)thresh };
+
+ SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ &data_bytes[0], ARRAY_SIZE(data_bytes));
+ return status;
+}
+
+SS_STATUS SSInterface::get_fifo_thresh(int *thresh)
+{
+ uint8_t cmd_bytes[] = { SS_FAM_R_COMMCHAN, SS_CMDIDX_FIFOAFULL };
+ uint8_t rxbuf[2] = {0};
+
+ SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rxbuf[0], ARRAY_SIZE(rxbuf));
+
+ if (status == SS_SUCCESS) {
+ *thresh = rxbuf[1];
+ }
+
+ return status;
+}
+
+SS_STATUS SSInterface::ss_comm_check()
+{
+ uint8_t cmd_bytes[] = { SS_FAM_R_IDENTITY, SS_CMDIDX_PLATTYPE };
+ uint8_t rxbuf[2];
+
+ SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rxbuf[0], ARRAY_SIZE(rxbuf));
+
+ int tries = 4;
+ while (status == SS_ERR_TRY_AGAIN && tries--) {
+ wait_ms(1000);
+ status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rxbuf[0], ARRAY_SIZE(rxbuf));
+ }
+
+ return status;
+}
+
+void SSInterface::fifo_sample_size(int data_type, int *sample_size)
+{
+ *sample_size = 0;
+
+ if (data_type == SS_DATATYPE_RAW || data_type == SS_DATATYPE_BOTH) {
+ for (int i = 0; i < SS_MAX_SUPPORTED_SENSOR_NUM; i++) {
+ if (sensor_enabled_mode[i]) {
+ mxm_assert_msg(sensor_data_reqs[i], "no ss_data_req found for enabled sensor");
+ *sample_size += sensor_data_reqs[i]->data_size;
+ }
+ }
+ }
+
+ if (data_type == SS_DATATYPE_ALGO || data_type == SS_DATATYPE_BOTH) {
+ for (int i = 0; i < SS_MAX_SUPPORTED_ALGO_NUM; i++) {
+ if (algo_enabled_mode[i]) {
+ mxm_assert_msg(algo_data_reqs[i], "no ss_data_req found for enabled algo");
+ *sample_size += algo_data_reqs[i]->data_size;
+ }
+ }
+ }
+}
+
+
+SS_STATUS SSInterface::num_avail_samples(int *num_samples)
+{
+ uint8_t cmd_bytes[] = { SS_FAM_R_OUTPUTFIFO, SS_CMDIDX_OUT_NUMSAMPLES };
+ uint8_t rxbuf[2] = {0};
+
+ SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rxbuf[0], ARRAY_SIZE(rxbuf), SS_DEFAULT2_CMD_SLEEP_MS);
+
+ if (status == SS_SUCCESS) {
+ *num_samples = rxbuf[1];
+ }
+
+ return status;
+}
+
+SS_STATUS SSInterface::get_log_len(int *log_len)
+{
+ uint8_t cmd_bytes[] = { SS_FAM_R_LOG, SS_CMDIDX_R_LOG_LEN };
+ uint8_t rxbuf[2] = {0};
+
+ SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rxbuf[0], ARRAY_SIZE(rxbuf), 1);
+
+ if (status == SS_SUCCESS) {
+ *log_len = (rxbuf[1] << 8) | rxbuf[0];
+ }
+
+ return status;
+}
+
+
+SS_STATUS SSInterface::get_sensor_sample_size(uint8_t sensor_id, uint8_t *sample_size)
+{
+ uint8_t cmd_bytes[] = { SS_FAM_R_INPUTFIFO, SS_CMDIDX_SAMPLE_SIZE, sensor_id };
+ uint8_t rxbuf[2]; /* status + sample size */
+
+ pr_info("[Reading external sample size for id: %d\n", sensor_id);
+ SS_STATUS status = read_cmd(cmd_bytes, ARRAY_SIZE(cmd_bytes),
+ NULL, 0,
+ rxbuf, sizeof(rxbuf));
+ *sample_size = rxbuf[1];
+ return status;
+}
+
+SS_STATUS SSInterface::get_input_fifo_size(int *fifo_size)
+{
+ uint8_t cmd_bytes[] = { SS_FAM_R_INPUTFIFO, SS_CMDIDX_INPUT_FIFO_SIZE};
+ uint8_t rxbuf[3]; /* status + fifo size */
+
+ pr_info("[Reading external Input FIFO size.\n");
+ SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ NULL, 0,
+ rxbuf, sizeof(rxbuf), SS_DEFAULT2_CMD_SLEEP_MS);
+ *fifo_size = rxbuf[1] << 8 | rxbuf[2];
+ return status;
+}
+
+SS_STATUS SSInterface::get_sensor_fifo_size(uint8_t sensor_id, int *fifo_size)
+{
+ uint8_t cmd_bytes[] = { SS_FAM_R_INPUTFIFO, SS_CMDIDX_SENSOR_FIFO_SIZE, sensor_id};
+ uint8_t rxbuf[3]; /* status + fifo size */
+
+ pr_info("[Reading sensor's FIFO size for id: %d\n", sensor_id);
+ SS_STATUS status = read_cmd(cmd_bytes, ARRAY_SIZE(cmd_bytes),
+ NULL, 0,
+ rxbuf, sizeof(rxbuf));
+ *fifo_size = rxbuf[1] << 8 | rxbuf[2];
+ return status;
+}
+
+SS_STATUS SSInterface::get_num_samples_in_sensor_fifo(uint8_t sensor_id, int *fifo_size)
+{
+ uint8_t cmd_bytes[] = { SS_FAM_R_INPUTFIFO, SS_CMDIDX_NUM_SAMPLES_SENSOR_FIFO, sensor_id};
+ uint8_t rxbuf[3]; /* status + fifo size */
+
+ pr_info("[Reading sensor's FIFO size for id: %d\n", sensor_id);
+ SS_STATUS status = read_cmd(cmd_bytes, ARRAY_SIZE(cmd_bytes),
+ NULL, 0,
+ rxbuf, sizeof(rxbuf));
+ *fifo_size = rxbuf[1] << 8 | rxbuf[2];
+ return status;
+}
+
+SS_STATUS SSInterface::get_num_bytes_in_input_fifo(int *fifo_size)
+{
+ uint8_t cmd_bytes[] = { SS_FAM_R_INPUTFIFO, SS_CMDIDX_NUM_SAMPLES_INPUT_FIFO};
+ uint8_t rxbuf[3]; /* status + fifo size */
+
+ pr_info("[Reading input FIFO size for id\n");
+ SS_STATUS status = read_cmd(cmd_bytes, ARRAY_SIZE(cmd_bytes),
+ NULL, 0,
+ rxbuf, sizeof(rxbuf),
+ SS_DEFAULT2_CMD_SLEEP_MS);
+ *fifo_size = rxbuf[1] << 8 | rxbuf[2];
+ return status;
+}
+
+SS_STATUS SSInterface::feed_to_input_fifo(uint8_t *tx_buf, int tx_buf_sz, int *nb_written)
+{
+ int ret;
+ uint8_t rxbuf[3];
+
+ tx_buf[0] = SS_FAM_W_INPUTFIFO;
+ tx_buf[1] = SS_CMDIDX_WRITE_FIFO;
+
+ ret = read_cmd(&tx_buf[0], tx_buf_sz,
+ NULL, 0,
+ rxbuf, sizeof(rxbuf), SS_DEFAULT3_CMD_SLEEP_MS);
+
+ *nb_written = rxbuf[1] * 256 + rxbuf[2];
+ return (SS_STATUS)ret;
+}
+
+SS_STATUS SSInterface::read_fifo_data(int num_samples, int sample_size,
+ uint8_t* databuf, int databuf_sz)
+{
+ int bytes_to_read = num_samples * sample_size + 1; //+1 for status byte
+ mxm_assert_msg((bytes_to_read <= databuf_sz), "databuf too small");
+
+ uint8_t cmd_bytes[] = { SS_FAM_R_OUTPUTFIFO, SS_CMDIDX_READFIFO };
+
+ pr_info("[reading %d bytes (%d samples)\r\n", bytes_to_read, num_samples);
+
+ SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ databuf, bytes_to_read, 10);
+
+ return status;
+}
+
+SS_STATUS SSInterface::read_ss_log(int num_bytes, uint8_t *log_buf, int log_buf_sz)
+{
+ int bytes_to_read = num_bytes + 1; //+1 for status byte
+ mxm_assert_msg((bytes_to_read <= log_buf_sz), "log_buf too small");
+
+ uint8_t cmd_bytes[] = { SS_FAM_R_LOG, SS_CMDIDX_R_LOG_DATA };
+
+ pr_info("[reading %d bytes (%d samples)\r\n", bytes_to_read, bytes_to_read);
+
+ SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ log_buf, bytes_to_read, 5);
+
+ return status;
+}
+
+static uint8_t databuf[512];
+void SSInterface::ss_execute_once(){
+
+ if(m_irq_received_ == false)
+ return;
+
+ uint8_t sample_count;
+ m_irq_received_ = false;
+ uint8_t cmd_bytes[] = { SS_FAM_R_STATUS, SS_CMDIDX_STATUS };
+ uint8_t rxbuf[2] = {0};
+
+ //irq_evt.start();
+
+ disable_irq();
+
+ SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
+ 0, 0,
+ &rxbuf[0], ARRAY_SIZE(rxbuf), SS_DEFAULT2_CMD_SLEEP_MS);
+ pr_info("ss_int: %2X", rxbuf[1]);
+
+ if (status != SS_SUCCESS) {
+ pr_err("Couldn't read status byte of SmartSensor!");
+ enable_irq();
+ //irq_evt.stop();
+ return;
+ }
+
+ if (rxbuf[1] & SS_MASK_STATUS_ERR) {
+ pr_err("SmartSensor status error: %d", rxbuf[1] & SS_MASK_STATUS_ERR);
+ }
+ if (rxbuf[1] & SS_MASK_STATUS_FIFO_OUT_OVR) {
+ pr_err("SmartSensor Output FIFO overflow!");
+ }
+ if (rxbuf[1] & SS_MASK_STATUS_FIFO_IN_OVR) {
+ pr_err("SmartSensor Input FIFO overflow!");
+ }
+
+ if (rxbuf[1] & SS_MASK_STATUS_LOG_OVR) {
+ pr_err("SmartSensor log overflow!");
+ }
+
+ if (rxbuf[1] & SS_MASK_STATUS_LOG_RDY) {
+ pr_err("SmartSensor Log ready");
+ int log_len;
+ status = get_log_len(&log_len);
+ if (status != SS_SUCCESS)
+ {
+ pr_err("Couldn't read log lenght");
+ enable_irq();
+ //irq_evt.stop();
+ return;
+ }
+
+ mxm_assert_msg((log_len <= sizeof(databuf)), "log size in SS longer than buffer");
+ status = read_ss_log(log_len, &databuf[0], sizeof(databuf));
+ if (status != SS_SUCCESS)
+ {
+ pr_err("Couldn't read from SmartSensor Log");
+ enable_irq();
+ //irq_evt.stop();
+ return;
+ }
+
+ databuf[log_len] = 0;
+ Peripherals::usbSerial()->printf("\r\n%s", (char *)databuf);
+ }
+
+ if (rxbuf[1] & SS_MASK_STATUS_DATA_RDY) {
+ int num_samples = 1;
+ status = num_avail_samples(&num_samples);
+ if (status != SS_SUCCESS)
+ {
+ pr_err("Couldn't read number of available samples in SmartSensor Output FIFO");
+ enable_irq();
+ //irq_evt.stop();
+ return;
+ }
+
+ int sample_size;
+ fifo_sample_size(data_type, &sample_size);
+
+ int bytes_to_read = num_samples * sample_size + 1; //+1 for status byte
+ if ((uint32_t)bytes_to_read > sizeof(databuf)) {
+ //Reduce number of samples to read to fit in buffer
+ num_samples = (sizeof(databuf) - 1) / sample_size;
+ }
+
+ wait_ms(5);
+ status = read_fifo_data(num_samples, sample_size, &databuf[0], sizeof(databuf));
+ if (status != SS_SUCCESS)
+ {
+ pr_err("Couldn't read from SmartSensor Output FIFO");
+ enable_irq();
+ //irq_evt.stop();
+ return;
+ }
+
+ //Skip status byte
+ uint8_t *data_ptr = &databuf[1];
+
+ int i = 0;
+ for (i = 0; i < num_samples; i++) {
+ if (sc_en) {
+ sample_count = *data_ptr++;
+ pr_info("Received sample #%d", sample_count);
+ }
+
+ //Chop up data and send to modules with enabled sensors
+ if (data_type == SS_DATATYPE_RAW || data_type == SS_DATATYPE_BOTH) {
+ for (int i = 0; i < SS_MAX_SUPPORTED_SENSOR_NUM; i++) {
+ if (sensor_enabled_mode[i]) {
+ mxm_assert_msg(sensor_data_reqs[i],
+ "no ss_data_req found for enabled sensor");
+ sensor_data_reqs[i]->callback(data_ptr);
+ data_ptr += sensor_data_reqs[i]->data_size;
+ }
+ }
+ }
+ if (data_type == SS_DATATYPE_ALGO || data_type == SS_DATATYPE_BOTH) {
+ for (int i = 0; i < SS_MAX_SUPPORTED_ALGO_NUM; i++) {
+ if (algo_enabled_mode[i]) {
+ mxm_assert_msg(algo_data_reqs[i],
+ "no ss_data_req found for enabled algo");
+ algo_data_reqs[i]->callback(data_ptr);
+ data_ptr += algo_data_reqs[i]->data_size;
+ }
+ }
+ }
+ }
+ }
+ enable_irq();
+ //irq_evt.stop();
+}
+
+void SSInterface::ss_clear_interrupt_flag(){
+ m_irq_received_ = false;
+}
+
+void SSInterface::irq_handler()
+{
+ m_irq_received_ = true;
+}
+
+void SSInterface::irq_handler_selftest(){
+ mfio_int_happened = true;
+}
+
+bool SSInterface::reset_mfio_irq(){
+ bool ret = mfio_int_happened;
+ mfio_int_happened = false;
+ disable_irq();
+ irq_pin.fall(callback(this, &SSInterface::irq_handler));
+ enable_irq();
+ return ret;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Interfaces/SmartSensor/SSInterface.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,757 @@
+/***************************************************************************
+* Copyright (C) 2017 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 _SSINTERFACE_H_
+#define _SSINTERFACE_H_
+
+#include "mbed.h"
+#include "MaximSensor.h"
+#include "EventStats.h"
+
+#define SS_PLATFORM_MAX3263X "SmartSensor_MAX3263X"
+#define SS_PLATFORM_MAX32660 "SmartSensor_MAX32660"
+#define SS_BOOTLOADER_PLATFORM_MAX3263X "Bootloader_MAX3263X"
+#define SS_BOOTLOADER_PLATFORM_MAX32660 "Bootloader_MAX32660"
+
+
+#define SS_I2C_8BIT_SLAVE_ADDR 0xAA
+#define SS_DEFAULT_CMD_SLEEP_MS 2
+#define SS_DEFAULT2_CMD_SLEEP_MS 4
+#define SS_DEFAULT3_CMD_SLEEP_MS 30
+#define SS_DUMP_REG_SLEEP_MS 100
+#define SS_ENABLE_SENSOR_SLEEP_MS 20
+
+#define SH_INPUT_DATA_DIRECT_SENSOR 0x00 // Default
+#define SH_INPUT_DATA_FROM_HOST 0x01
+
+#define SS_SENSORIDX_MAX86140 0x00
+#define SS_SENSORIDX_MAX30205 0x01
+#define SS_SENSORIDX_MAX30001 0x02
+#define SS_SENSORIDX_MAX30101 0x03
+#define SS_SENSORIDX_ACCEL 0x04
+
+#define SS_ALGOIDX_AGC 0x00
+#define SS_ALGOIDX_AEC 0x01
+#define SS_ALGOIDX_WHRM 0x02
+#define SS_ALGOIDX_ECG 0x03
+#define SS_ALGOIDX_BPT 0x04
+#define SS_ALGOIDX_WSPO2 0x05 /// additional index
+
+
+#define SS_FAM_R_STATUS 0x00
+ #define SS_CMDIDX_STATUS 0x00
+ #define SS_SHIFT_STATUS_ERR 0
+ #define SS_MASK_STATUS_ERR (0x07 << SS_SHIFT_STATUS_ERR)
+ #define SS_SHIFT_STATUS_DATA_RDY 3
+ #define SS_MASK_STATUS_DATA_RDY (1 << SS_SHIFT_STATUS_DATA_RDY)
+ #define SS_SHIFT_STATUS_FIFO_OUT_OVR 4
+ #define SS_MASK_STATUS_FIFO_OUT_OVR (1 << SS_SHIFT_STATUS_FIFO_OUT_OVR)
+ #define SS_SHIFT_STATUS_FIFO_IN_OVR 5
+ #define SS_MASK_STATUS_FIFO_IN_OVR (1 << SS_SHIFT_STATUS_FIFO_IN_OVR)
+
+ #define SS_SHIFT_STATUS_LOG_OVR 6
+ #define SS_MASK_STATUS_LOG_OVR (1 << SS_SHIFT_STATUS_LOG_OVR)
+
+ #define SS_SHIFT_STATUS_LOG_RDY 7
+ #define SS_MASK_STATUS_LOG_RDY (1 << SS_SHIFT_STATUS_LOG_RDY)
+
+
+#define SS_FAM_W_MODE 0x01
+#define SS_FAM_R_MODE 0x02
+ #define SS_CMDIDX_MODE 0x00
+ #define SS_SHIFT_MODE_SHDN 0
+ #define SS_MASK_MODE_SHDN (1 << SS_SHIFT_MODE_SHDN)
+ #define SS_SHIFT_MODE_RESET 1
+ #define SS_MASK_MODE_RESET (1 << SS_SHIFT_MODE_RESET)
+ #define SS_SHIFT_MODE_FIFORESET 2
+ #define SS_MASK_MODE_FIFORESET (1 << SS_SHIFT_MODE_FIFORESET)
+ #define SS_SHIFT_MODE_BOOTLDR 3
+ #define SS_MASK_MODE_BOOTLDR (1 << SS_SHIFT_MODE_BOOTLDR)
+
+#define SS_I2C_READ 0x03
+
+#define SS_FAM_W_COMMCHAN 0x10
+#define SS_FAM_R_COMMCHAN 0x11
+ #define SS_CMDIDX_OUTPUTMODE 0x00
+ #define SS_SHIFT_OUTPUTMODE_DATATYPE 0
+ #define SS_MASK_OUTPUTMODE_DATATYPE (0x03 << SS_SHIFT_OUTPUTMODE_DATATYPE)
+ #define SS_DATATYPE_PAUSE 0
+ #define SS_DATATYPE_RAW 1
+ #define SS_DATATYPE_ALGO 2
+ #define SS_DATATYPE_BOTH 3
+ #define SS_SHIFT_OUTPUTMODE_SC_EN 2
+ #define SS_MASK_OUTPUTMODE_SC_EN (1 << SS_SHIFT_OUTPUTMODE_SC_EN)
+ #define SS_CMDIDX_FIFOAFULL 0x01
+
+#define SS_FAM_R_OUTPUTFIFO 0x12
+ #define SS_CMDIDX_OUT_NUMSAMPLES 0x00
+ #define SS_CMDIDX_READFIFO 0x01
+
+#define SS_FAM_R_INPUTFIFO 0x13
+ #define SS_CMDIDX_SAMPLE_SIZE 0x00
+ #define SS_CMDIDX_INPUT_FIFO_SIZE 0x01
+ #define SS_CMDIDX_SENSOR_FIFO_SIZE 0x02
+ #define SS_CMDIDX_NUM_SAMPLES_SENSOR_FIFO 0x03
+ #define SS_CMDIDX_NUM_SAMPLES_INPUT_FIFO 0x04
+
+#define SS_FAM_W_INPUTFIFO 0x14
+ #define SS_CMDIDX_WRITE_FIFO 0x00
+
+#define SS_FAM_W_WRITEREG 0x40
+#define SS_FAM_R_READREG 0x41
+#define SS_FAM_R_REGATTRIBS 0x42
+#define SS_FAM_R_DUMPREG 0x43
+
+#define SS_FAM_W_SENSORMODE 0x44
+#define SS_FAM_R_SENSORMODE 0x45
+
+#define SS_FAM_W_ALGOCONFIG 0x50
+#define SS_FAM_R_ALGOCONFIG 0x51
+ #define SS_CFGIDX_AGC_TARGET 0x00
+ #define SS_CFGIDX_AGC_CORR_COEFF 0x01
+ #define SS_CFGIDX_AGC_SENSITIVITY 0x02
+ #define SS_CFGIDX_AGC_SMP_AVG 0x03
+
+ #define SS_CFGIDX_WHRM_SR 0x00
+ #define SS_CFGIDX_WHRM_MAX_HEIGHT 0x01
+ #define SS_CFGIDX_WHRM_MAX_WEIGHT 0x02
+ #define SS_CFGIDX_WHRM_MAX_AGE 0x03
+ #define SS_CFGIDX_WHRM_MIN_HEIGHT 0x04
+ #define SS_CFGIDX_WHRM_MIN_WEIGHT 0x05
+ #define SS_CFGIDX_WHRM_MIN_AGE 0x06
+ #define SS_CFGIDX_WHRM_DEF_HEIGHT 0x07
+ #define SS_CFGIDX_WHRM_DEF_WEIGHT 0x08
+ #define SS_CFGIDX_WHRM_DEF_AGE 0x09
+ #define SS_CFGIDX_WHRM_INIT_HR 0x0A
+
+ // additional for WHRM_AEC_SCD
+ #define SS_CFGIDX_WHRM_AEC_ENABLE 0x0B
+ #define SS_CFGIDX_WHRM_SCD_ENABLE 0x0C
+ #define SS_CFGIDX_WHRM_ADJ_TARGET_PD_CURRENT_PERIOD 0x0D
+ #define SS_CFGIDX_WHRM_SCD_DEBOUNCE_WINDOW 0x0E
+ #define SS_CFGIDX_WHRM_MOTION_MAG_THRESHOLD 0x0F
+ #define SS_CFGIDX_WHRM_MIN_PD_CURRENT 0x10
+ #define SS_CFGIDX_WHRM_PD_CONFIG 0x11
+ #define SS_CFGIDX_WHRM_LED_CONFIG 0x12
+
+ // config for WSPO2
+ #define SS_CFGIDX_WSPO2_CAL 0x00
+ #define SS_CFGIDX_WSPO2_SR 0x01
+ #define SS_CFGIDX_WSPO2_ALGO_MODE 0x02
+ #define SS_CFGIDX_WSPO2_AGC_MODE 0x03
+ #define SS_CFGIDX_WSPO2_MOTION_DET 0x04
+ #define SS_CFGIDX_WSPO2_MOTION_PERIOD 0x05
+ #define SS_CFGIDX_WSPO2_MOTION_THRESHOLD 0x06
+ #define SS_CFGIDX_WSPO2_AGC_TIMEOUT 0x07
+ #define SS_CFGIDX_WSPO2_TIMEOUT 0x08
+ #define SS_CFGIDX_WSPO2_PD_CONFIG 0x09
+
+
+ #define SS_CFGIDX_BP_USE_MED 0x00
+ #define SS_CFGIDX_BP_SYS_BP_CAL 0x01
+ #define SS_CFGIDX_BP_DIA_BP_CAL 0x02
+ #define SS_CFGIDX_BP_CAL_DATA 0x03
+ #define SS_CFGIDX_BP_EST_DATE 0x04
+ #define SS_CFGIDX_BP_EST_NONREST 0x05
+ #define SS_CFGIDX_BP_SPO2_COEFS 0x06
+
+#define SS_FAM_W_ALGOMODE 0x52
+#define SS_FAM_R_ALGOMODE 0x53
+
+#define SS_FAM_W_EXTERNSENSORMODE 0x60
+ #define SS_W_EXT_SENSOR_MODE 0x00
+#define SS_FAM_R_EXTERNSENSORMODE 0x61
+ #define SS_R_EXT_SENSOR_MODE 0x00
+
+#define SS_FAM_R_SELFTEST 0x70
+
+#define SS_FAM_W_BOOTLOADER 0x80
+ #define SS_CMDIDX_SETIV 0x00
+ #define SS_CMDIDX_SETAUTH 0x01
+ #define SS_CMDIDX_SETNUMPAGES 0x02
+ #define SS_CMDIDX_ERASE 0x03
+ #define SS_CMDIDX_SENDPAGE 0x04
+ #define SS_CMDIDX_ERASE_PAGE 0x05
+#define SS_FAM_R_BOOTLOADER 0x81
+ #define SS_CMDIDX_BOOTFWVERSION 0x00
+ #define SS_CMDIDX_PAGESIZE 0x01
+
+#define SS_FAM_W_BOOTLOADER_CFG 0x82
+#define SS_FAM_R_BOOTLOADER_CFG 0x83
+ #define SS_CMDIDX_BL_SAVE 0x00
+ #define SS_CMDIDX_BL_ENTRY 0x01
+ #define SS_BL_CFG_ENTER_BL_MODE 0x00
+ #define SS_BL_CFG_EBL_PIN 0x01
+ #define SS_BL_CFG_EBL_POL 0x02
+ #define SS_CMDIDX_BL_EXIT 0x02
+ #define SS_BL_CFG_EXIT_BL_MODE 0x00
+ #define SS_BL_CFG_TIMEOUT 0x01
+
+/* Enable logging/debugging */
+#define SS_FAM_R_LOG 0x90
+ #define SS_CMDIDX_R_LOG_DATA 0x00
+ #define SS_CMDIDX_R_LOG_LEN 0x01
+
+ #define SS_CMDIDX_R_LOG_LEVEL 0x02
+ #define SS_LOG_DISABLE 0x00
+ #define SS_LOG_CRITICAL 0x01
+ #define SS_LOG_ERROR 0x02
+ #define SS_LOG_INFO 0x04
+ #define SS_LOG_DEBUG 0x08
+
+#define SS_FAM_W_LOG_CFG 0x91
+ #define SS_CMDIDX_LOG_GET_LEVEL 0x00
+ #define SS_CMDIDX_LOG_SET_LEVEL 0x01
+
+#define SS_FAM_R_IDENTITY 0xFF
+ #define SS_CMDIDX_PLATTYPE 0x00
+ #define SS_CMDIDX_PARTID 0x01
+ #define SS_CMDIDX_REVID 0x02
+ #define SS_CMDIDX_FWVERSION 0x03
+ #define SS_CMDIDX_AVAILSENSORS 0x04
+ #define SS_CMDIDX_DRIVERVER 0x05
+ #define SS_CMDIDX_AVAILALGOS 0x06
+ #define SS_CMDIDX_ALGOVER 0x07
+
+
+typedef enum {
+ SS_SUCCESS=0x00,
+
+ SS_ERR_COMMAND=0x01,
+ SS_ERR_UNAVAILABLE=0x02,
+ SS_ERR_DATA_FORMAT=0x03,
+ SS_ERR_INPUT_VALUE=0x04,
+
+ SS_ERR_BTLDR_GENERAL=0x80,
+ SS_ERR_BTLDR_CHECKSUM=0x81,
+
+ SS_ERR_TRY_AGAIN=0xFE,
+ SS_ERR_UNKNOWN=0xFF,
+} SS_STATUS;
+
+typedef enum {
+ SS_PLAT_MAX3263X=0,
+ SS_PLAT_MAX32660=1,
+} SS_PLAT_TYPE;
+
+//self test result masks
+#define FAILURE_COMM 0x01
+#define FAILURE_INTERRUPT 0x02
+
+#define SS_SMALL_BUF_SIZE 32
+#define SS_MED_BUF_SIZE 512
+#define SS_LARGE_BUF_SIZE 8224
+
+#define SS_RESET_TIME 10
+#define SS_STARTUP_TO_BTLDR_TIME 50
+#define SS_STARTUP_TO_MAIN_APP_TIME 1000
+
+#define SS_MAX_SUPPORTED_SENSOR_NUM 0xFE
+#define SS_MAX_SUPPORTED_ALGO_NUM 0xFE
+#define SS_MAX_SUPPORTED_ALGO_CFG_NUM 0xFE
+#define SS_MAX_SUPPORTED_MODE_NUM 0xFF
+
+/* BOOTLOADER HOST */
+#define EBL_CMD_TRIGGER_MODE 0
+#define EBL_GPIO_TRIGGER_MODE 1
+
+
+typedef struct {
+ int data_size;
+ Callback<void(uint8_t*)> callback;
+} ss_data_req;
+
+typedef union {
+ struct {
+ uint16_t whrm_enabled :1;
+ uint16_t wspo2_enabled :1; /// added
+ uint16_t bpt_enabled :1;
+ uint16_t agc_enabled :1;
+ uint16_t max8614x_enabled:1;
+ uint16_t max3010x_enabled:1;
+ uint16_t accel_enabled :1;
+
+ uint16_t sensorhub_accel :1; // added to specify if sensor hub accel is used or host (default)
+ uint16_t placeholder :8; //
+ };
+ uint16_t status_vals;
+} status_algo_sensors_st;
+
+
+/**
+ * @brief SSInterface is Maxim's SmartSensor Interface class
+ */
+class SSInterface
+{
+public:
+
+ /* PUBLIC FUNCTION DECLARATIONS */
+ /**
+ * @brief SSInterface constructor.
+ *
+ * @param[in] i2cBus - reference to the I2C bus for the SmartSensor
+ * @param[in] ss_mfio - name of SmartSensor multi-function IO pin
+ * @param[in] ss_reset - name of SmartSensor Reset pin
+ *
+ */
+ SSInterface(I2C &i2cBus, PinName ss_mfio, PinName ss_reset);
+
+ /**
+ * @brief SSInterface constructor.
+ *
+ * @param[in] spiBus - reference to the SPI bus for the SmartSensor
+ * @param[in] ss_mfio - name of SmartSensor multi-function IO pin
+ * @param[in] ss_reset - name of SmartSensor Reset pin
+ *
+ */
+ SSInterface(SPI &spiBus, PinName ss_mfio, PinName ss_reset);
+
+ /**
+ * @brief DSInterface destructor.
+ *
+ */
+ ~SSInterface();
+
+ /**
+ * @brief Write a command to the SmartSensor and get status response
+ *
+ * @param[in] cmd_bytes - Pointer to the command's family and index bytes
+ * @param[in] cmd_idx_len - The number of bytes in the command
+ * @param[in] data - Pointer to the command's data bytes
+ * @param[in] data_len - The number data bytes
+ *
+ * @return SS_STATUS byte
+ */
+ SS_STATUS write_cmd(uint8_t *cmd_bytes, int cmd_bytes_len,
+ uint8_t *data, int data_len,
+ int sleep_ms = SS_DEFAULT_CMD_SLEEP_MS);
+
+
+ /**
+ * @brief Write a command to the SmartSensor and get status response
+ *
+ * @param[in] tx_buf - Pointer to the command's family, index bytes and data bytes
+ * @param[in] tx_len - Total transaction lenght to send
+ *
+ * @return SS_STATUS byte
+ */
+ SS_STATUS write_cmd(uint8_t *tx_buf, int tx_len,
+ int sleep_ms = SS_DEFAULT_CMD_SLEEP_MS);
+
+ /**
+ * @brief Write a command to the SmartSensor and get status response
+ *
+ * @param[in] cmd_bytes - Pointer to the command's family and index bytes
+ * @param[in] cmd_idx_len - The number of bytes in the command
+ * @param[in] data - Pointer to the command's data bytes
+ * @param[in] data_len - The number data bytes
+ * @param[in] rxbuf - Buffer to fill in with read data (including status byte)
+ * @param[in] rxbuf_sz - Size of the rx buffer (to prevent overflow)
+ *
+ * @return SS_STATUS byte
+ */
+ SS_STATUS read_cmd( uint8_t *cmd_bytes, int cmd_bytes_len,
+ uint8_t *data, int data_len,
+ uint8_t *rxbuf, int rxbuf_sz,
+ int sleep_ms = SS_DEFAULT_CMD_SLEEP_MS);
+
+ /**
+ * @brief Get a string representing the SmartSensor firmware version
+ * @details If in bootloader mode, returns bootloader version
+ *
+ * @return Pointer to firmware version string
+ */
+ const char* get_ss_fw_version();
+
+ /**
+ * @brief Get a string representing the SmartSensor algo version
+ * @details If in bootloader mode, returns bootloader version
+ *
+ * @return Pointer to algo version string
+ */
+ const char* get_ss_algo_version();
+
+ /**
+ * @brief Get a string representing the SmartSensor platform type
+ *
+ * @return Pointer to platform type string
+ */
+ const char* get_ss_platform_name();
+
+ /**
+ * @brief Reset the SmartSensor and jump to main application
+ *
+ * @return SS_STATUS code indicating success
+ */
+ SS_STATUS reset_to_main_app();
+
+ /**
+ * @brief Reset the SmartSensor and jump to bootloader
+ *
+ * @return SS_STATUS code indicating success
+ */
+ SS_STATUS reset_to_bootloader();
+
+ /**
+ * @brief Reset the SmartSensor
+ * @details If the SmartSensor was in bootloader, it will jump back into bootloader
+ * If the SmartSensor was in main app, it will jump back into main app
+ *
+ * @return SS_STATUS code indicating success
+ */
+ SS_STATUS reset();
+
+ /**
+ * @brief run the self test commands
+ * param[in] idx - the id of the sensor for the self test
+ * param[in] result - self-test response
+ * param[in] sleep_ms - duration of wait for read command
+ * @return SS_STATUS code indicating success
+ */
+ SS_STATUS self_test(int idx, uint8_t *result, int sleep_ms = SS_DEFAULT_CMD_SLEEP_MS);
+
+ /**
+ * @brief Check if SmartSensor is in bootloader mode
+ *
+ * @return 1 if in bootloader mode, 0 if in main app, -1 if comm error
+ */
+ int in_bootldr_mode();
+
+
+ /**
+ * @brief Read register from a device onboard SmartSensor
+ *
+ * @param[in] idx - Index of device to read
+ * @param[in] addr - Register address
+ * @param[out] val - Register value
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS get_reg(int idx, uint8_t addr, uint32_t *val);
+
+ /**
+ * @brief Set register of a device onboard SmartSensor
+ *
+ * @param[in] idx - Index of device to read
+ * @param[in] addr - Register address
+ * @param[in] val - Register value
+ * @param[in] byte_size - Size of IC register in bytes
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS set_reg(int idx, uint8_t addr, uint32_t val, int byte_size);
+
+ /**
+ * @brief Dump registers of a device onboard SmartSensor
+ *
+ * @param[in] idx - Index of device
+ * @param[in] reg_vals - Array of addr_val_pairs
+ * @param[in] reg_vals_sz - Number of items reg_vals can hold
+ * @param[out] num_regs - Number of registers returned by command
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS dump_reg(int idx, addr_val_pair* reg_vals, int reg_vals_sz, int* num_regs);
+
+
+ /**
+ * @brief Enable a device on the SmartSensor
+ *
+ * @param[in] idx - Index of device
+ * @param[in] mode - Mode to set the device to
+ * @param[in] data_req - Data request
+ * @param[in] ext_ - Data request
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS enable_sensor(int idx, int mode, ss_data_req* data_req, uint8_t ext_mode = SH_INPUT_DATA_DIRECT_SENSOR);
+
+ /**
+ * @brief Disable a device on the SmartSensor
+ *
+ * @param[in] idx - Index of device
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS disable_sensor(int idx);
+
+ /**
+ * @brief Enable an algorithm on the SmartSensor
+ *
+ * @param[in] idx - Index of device
+ * @param[in] mode - Mode to set the device to
+ * @param[in] data_req - Data request
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS enable_algo(int idx, int mode, ss_data_req* data_req);
+
+ /**
+ * @brief Disable an algorithm on the SmartSensor
+ *
+ * @param[in] idx - Index of device
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS disable_algo(int idx);
+
+ /**
+ * @brief Set the value of an algorithm configuration parameter
+ *
+ * @param[in] algo_idx Index of algorithm
+ * @param[in] cfg_idx Index of configuration parameter
+ * @param[in] cfg Array of configuration bytes
+ * @param[in] cfg_sz Size of cfg array
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS set_algo_cfg(int algo_idx, int cfg_idx, uint8_t *cfg, int cfg_sz);
+
+ /**
+ * @brief Get the value of an algorithm configuration parameter
+ *
+ * @param[in] algo_idx Index of algorithm
+ * @param[in] cfg_idx Index of configuration parameter
+ * @param[in] cfg Array of configuration bytes to be filled in
+ * @param[in] cfg_sz Number of bytes to be read
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS get_algo_cfg(int algo_idx, int cfg_idx, uint8_t *cfg, int cfg_sz);
+
+ /**
+ * @brief Set the CommChannel Output Mode options
+ *
+ * @param[in] data_type - Set to 0 for only algorithm data
+ * Set to 1 for only raw sensor data
+ * Set to 2 for algo + raw sensor data
+ * Set to 3 for no data
+ * @param[in] sc_en - Set to true to receive 1 byte sample count from SmartSensor
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS set_data_type(int data_type, bool sc_en);
+
+ /**
+ * @brief Get the CommChannel Output Mode options
+ *
+ * @param[out] data_type - 0 for only algorithm data
+ * 1 for only raw sensor data
+ * 2 for algo + raw sensor data
+ * 3 for no data
+ * @param[in] sc_en - If true, SmartSensor prepends data with 1 byte sample count
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS get_data_type(int* data_type, bool *sc_en);
+
+ /**
+ * @brief Set the number of samples for the SmartSensor to collect
+ * before issuing an interrupt
+ *
+ * @param[in] thresh - Number of samples (1-255) to collect before interrupt
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS set_fifo_thresh(int thresh);
+
+ /**
+ * @brief Get the number of samples the SmartSensor will collect
+ * before issuing an interrupt
+ *
+ * @param[out] thresh - Number of samples (1-255) collected before interrupt
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS get_fifo_thresh(int *thresh);
+
+ /**
+ * @brief Pass external sensor data to sensor hub
+ *
+ * @param[in] num_samples in tx_buf
+ * @param[in] tx_buf - Host sample data to send sensor hub
+ * @param[in] tx_buf_sz - Number of bytes of tx_buf
+ * @param[out] nb_written - Number of samples to sensor hub's input FIFO
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS feed_to_input_fifo(uint8_t *tx_buf, int tx_buf_sz, int *nb_written);
+
+ /**
+ * @brief Get the number of sambes in Sensor FIFO
+ *
+ * @param[in] sensor_id - Sensor id to read FIFO size
+ * @param[out] fifo_size - Sensor's FIFO size
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS get_num_samples_in_sensor_fifo(uint8_t sensor_id, int *fifo_size);
+
+ /**
+ * @brief Get the total number of bytes in the Input FIFO
+ *
+ * @param[out] fifo_size - Input FIFO size
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS get_num_bytes_in_input_fifo(int *fifo_size);
+
+ /**
+ * @brief Get the total number of samples the Sensor's FIFO can hold
+ *
+ * @param[in] sensor_id - Sensor id to read FIFO size
+ * @param[out] fifo_size - Sensor's FIFO size
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS get_sensor_fifo_size(uint8_t sensor_id, int *fifo_size);
+
+ /**
+ * @brief Get the total number of samples the input FIFO can hold
+ *
+ * @param[out] fifo_size - Input FIFO size
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS get_input_fifo_size(int *fifo_size);
+
+ /**
+ * @brief Get the number of bytes per sample of a sensor
+ *
+ * @param[in] sensor_id - Sensor id to read sample size
+ * @param[out] sample_size - Sensor's sample size
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS get_sensor_sample_size(uint8_t sensor_id, uint8_t *sample_size);
+
+ /**
+ * @brief send raw string to I2C
+ *
+ * @param[in] *rawdata - Raw data string, after slave address
+ * @param[out] rawdata_sz - Raw data size
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS send_raw(uint8_t *rawdata, int rawdata_sz);
+
+ /**
+ * @brief Check that the SmartSensor is connected
+ */
+ SS_STATUS ss_comm_check();
+
+ /**
+ * @brief Set if GPIO or CMD is used to enter bootloader and App
+ * before issuing an interrupt
+ *
+ * param[in] mode
+ * - 0: use command to enter bootloader mode
+ * - 1: use EBL GPIO to enter bootloader mode
+ *
+ * @return SS_SUCCESS on success
+ */
+ SS_STATUS set_ebl_mode(uint8_t mode);
+
+ /**
+ * @brief Get ebl_mode value
+ *
+ * @return ebl_mode value
+ */
+ int get_ebl_mode();
+
+ SS_STATUS stay_in_bootloader();
+ SS_STATUS exit_from_bootloader();
+
+ void enable_irq();
+ void disable_irq();
+
+ void mfio_selftest();
+ bool reset_mfio_irq();
+
+ void ss_execute_once();
+ void ss_clear_interrupt_flag();
+
+private:
+
+ /* PRIVATE VARIABLES */
+ I2C *m_i2cBus;
+ SPI *m_spiBus;
+ DigitalInOut mfio_pin;
+ DigitalInOut reset_pin;
+ InterruptIn irq_pin;
+
+ char fw_version[128];
+ char algo_version[128];
+ const char* plat_name;
+
+ bool in_bootldr;
+ bool sc_en;
+ int data_type;
+
+ uint8_t ebl_mode; /* 0: Command bootloader, 1: No command, trigger GPIO */
+
+ int sensor_enabled_mode[SS_MAX_SUPPORTED_SENSOR_NUM];
+ int algo_enabled_mode[SS_MAX_SUPPORTED_ALGO_NUM];
+ ss_data_req* sensor_data_reqs[SS_MAX_SUPPORTED_SENSOR_NUM];
+ ss_data_req* algo_data_reqs[SS_MAX_SUPPORTED_ALGO_NUM];
+
+ /* PRIVATE METHODS */
+ SS_STATUS write_cmd_small(uint8_t *cmd_bytes, int cmd_bytes_len,
+ uint8_t *data, int data_len,
+ int sleep_ms = SS_DEFAULT_CMD_SLEEP_MS);
+ SS_STATUS write_cmd_medium(uint8_t *cmd_bytes, int cmd_bytes_len,
+ uint8_t *data, int data_len,
+ int sleep_ms = SS_DEFAULT_CMD_SLEEP_MS);
+ SS_STATUS write_cmd_large(uint8_t *cmd_bytes, int cmd_bytes_len,
+ uint8_t *data, int data_len,
+ int sleep_ms = SS_DEFAULT_CMD_SLEEP_MS);
+ void cfg_mfio(PinDirection);
+
+ void irq_handler();
+ volatile bool m_irq_received_;
+
+
+ void irq_handler_selftest();
+ volatile bool mfio_int_happened;
+
+ SS_STATUS read_fifo_data(int num_samples, int sample_size, uint8_t* databuf, int databuf_sz);
+ SS_STATUS num_avail_samples(int* num_samples);
+ SS_STATUS get_log_len(int *log_len);
+ SS_STATUS read_ss_log(int num_bytes, uint8_t *log_buf, int log_buf_sz);
+ void fifo_sample_size(int data_type, int* sample_size);
+
+// EventStats irq_evt;
+};
+
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Kconfig Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,165 @@ +mainmenu "MAXIM MAX326XXX mBED EVKit platform configuration" + +config CONFIG_NAME + string "Config name" + +menu "Platform setup" +choice + prompt "Select mBED platform" + +config PLATFORM_MAX32600MBED + bool "MAX32600MBED" + help + MAX32600MBED mBED platform. + +config PLATFORM_MAX32625MBED + bool "MAX32625MBED" + help + MAX32625MBED mBED platform. + +config PLATFORM_MAX32630FTHR + bool "MAX32630FTHR" + help + MAX32630FTHR feather wing mBED platform. + +config PLATFORM_MAX32625PICO + bool "MAX32625PICO" + help + MAX32625PICO mBED platform. + +endchoice + +config MAXIM_PLATFORM_NAME + string "Enter MAXIM platform name" + default "unknown" + +endmenu + +menu "PPG Sensor setup" +config ENABLE_PPG + bool "Enable PPG sensor" +choice + prompt "Select PPG sensor" + depends on ENABLE_PPG + +config PPG_MAX3011X + bool "MAX30110/MAX30111 PPG sensor" + +config PPG_MAX8614X + bool "MAX86140/MAX86141 PPG sensor" + +endchoice +endmenu + +menu "ECG Sensor setup" +config ENABLE_ECG + bool "Enable ECG sensor" +choice + prompt "Select ECG sensor" + depends on ENABLE_ECG + +config CONFIG_ECG_MAX30001 + bool "MAX30001 ECG sensor" +endchoice +endmenu + +menu "Temperature Sensor setup" +config ENABLE_TP + bool "Enable TP sensor" +choice + prompt "Select TP sensor" + depends on ENABLE_TP + +config CONFIG_TP_MAX30205 + bool "MAX30205 Temp sensor" +endchoice +endmenu + +menu "Pressure Sensor setup" +config ENABLE_BMP280 + bool "Enable BMP 280" +endmenu + +menu "Flash Device Setup" +config ENABLE_MX25U + bool "Enable MX25U NOR FLASH" +endmenu + + +menu "Accelerometer setup" +config ENABLE_ACCEL + bool "Enable Accelerometer" +choice + prompt "Select Accelerometer" + depends on ENABLE_ACCEL + +config ACCEL_BMI160 + bool "BMI160 accelerometer" + +config ACCEL_BMA280 + bool "BMA280 accelerometer" + +config ACCEL_LIS2DH + bool "LIS2DH accelerometer" + +endchoice +endmenu + +menu "Display setup" +config ENABLE_DISPLAY + bool "Enable Display" +choice + prompt "Select Display" + depends on ENABLE_DISPLAY + +config OLED_ADAFRUIT_SSD1306 + bool "Adafruit_SSD1306 OLED" + +config LCD_LS013B7DH03 + bool "Sharp LS013B7DH03 LCD" + +endchoice +endmenu + +menu "TestComm Setup" +config ENABLE_TESTCOMM + bool "Enable TestComm" + depends on ENABLE_ECG + depends on ENABLE_TP + depends on ENABLE_BMP280 + depends on ENABLE_MX25U + depends on ACCEL_BMI160 + default n +endmenu + +menu "WHRM setup" +config ENABLE_WHRM + bool "Enable WHRM" +endmenu + +menu "Memory debug setup" +config ENABLE_MEMORY_DEBUG + bool "Enable memory debug" +if ENABLE_MEMORY_DEBUG + +config MBED_MEM_TRACING_ENABLED + bool "mbed memory tracing" + help + mbed Runtime memory tracing + https://docs.mbed.com/docs/mbed-os-handbook/en/latest/advanced/runtime_mem_trace/ + +config MBED_HEAP_STATS_ENABLED + bool "mbed heap stats" + help + Runtime heap statistics + https://docs.mbed.com/docs/mbed-os-handbook/en/latest/advanced/runtime_stats/#heap-statistics + +config MBED_STACK_STATS_ENABLED + bool "mbed stack stats" + help + Runtime stack statistics + https://docs.mbed.com/docs/mbed-os-handbook/en/latest/advanced/runtime_stats/#stack-statistics + + +endif +endmenu
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Makefile Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,439 @@
+PROJECT_PATH=$(realpath ./)
+PROJECT_NAME=$(shell basename $(realpath ./))
+PROJECT_BUILD_PATH=$(realpath BUILD/)
+PROJECT_TOOLS_PATH=$(realpath tools/)
+PROJECT_CONFIGS_PATH=$(realpath configs/)
+PROJECT_TOOLCHAIN=GCC_ARM
+PROJECT_SCM_BRANCH=$(shell git rev-parse --abbrev-ref HEAD)
+PROJECT_SCM_HASH=$(shell git rev-parse HEAD)
+-include .config
+
+STACK_SIZE ?= 0x30000
+HEAP_SIZE ?= 0x30000
+
+$(info STACK_SIZE: ${STACK_SIZE}, HEAP_SIZE: ${HEAP_SIZE})
+
+ALGO_DIR = Algorithms/
+DRIVERS_DIR = Drivers/
+INTERFACES_DIR = Interfaces/
+SCOMMS_DIR = $(INTERFACES_DIR)/SensorComm/
+DSINT_DIR = $(INTERFACES_DIR)/DeviceStudio/
+SSCOMMS_DIR = $(SCOMMS_DIR)/SmartSensorComm/
+SSINT_DIR = $(INTERFACES_DIR)/SmartSensor/
+PLATFORMS_DIR = Platforms/
+
+EXTERNAL_SOURCES += mbed-os
+EXTERNAL_SOURCES += $(DRIVERS_DIR)USBDevice
+PROJECT_SOURCES += $(wildcard *.cpp)
+PROJECT_SOURCES += $(wildcard *.h)
+PROJECT_SOURCES += $(SCOMMS_DIR)/SensorComm
+PROJECT_SOURCES += $(DSINT_DIR)
+PROJECT_SOURCES += $(DRIVERS_DIR)MaximSensor
+PROJECT_SOURCES += Utilities
+
+## BEGIN PLATFORM ##
+ifeq ($(CONFIG_PLATFORM_MAX32600MBED), y)
+CONFIG_FLAGS += PLATFORM_MAX32600MBED
+CONFIG_PLATFORM_NAME=MAX32600MBED
+
+else ifeq ($(CONFIG_PLATFORM_MAX32625MBED), y)
+CONFIG_FLAGS += PLATFORM_MAX32625MBED
+CONFIG_PLATFORM_NAME=MAX32625MBED
+PROJECT_SOURCES += $(PLATFORMS_DIR)max32625mbed
+
+else ifeq ($(CONFIG_PLATFORM_MAX32630FTHR), y)
+CONFIG_FLAGS += PLATFORM_MAX32630FTHR
+CONFIG_PLATFORM_NAME=MAX32630FTHR
+EXTERNAL_SOURCES += $(PLATFORMS_DIR)max32630fthr
+
+else ifeq ($(CONFIG_PLATFORM_MAX32630HSP), y)
+CONFIG_FLAGS += PLATFORM_MAX32630HSP
+CONFIG_PLATFORM_NAME=MAX32630FTHR
+EXTERNAL_SOURCES += $(PLATFORMS_DIR)max32630hsp
+PROJECT_SOURCES += $(PLATFORMS_DIR)max32630hsp
+
+else ifeq ($(CONFIG_PLATFORM_MAX32625PICO), y)
+CONFIG_FLAGS += PLATFORM_MAX32625PICO
+CONFIG_PLATFORM_NAME=MAX32625PICO
+
+else
+$(warning NO MAXIM PLATFORM SELECTED)
+endif
+CONFIG_FLAGS += MAXIM_PLATFORM_NAME=\"$(CONFIG_MAXIM_PLATFORM_NAME)\"
+
+
+ifeq ($(CONFIG_ENABLE_LED_STATUS), y)
+CONFIG_FLAGS += ENABLE_LED_STATUS
+endif
+
+ifeq ($(CONFIG_ENABLE_EVENTSTATS), y)
+CONFIG_FLAGS += ENABLE_EVENTSTATS
+endif
+## END PLATFORM ##
+
+## BEGIN PPG SENSOR ##
+ifeq ($(CONFIG_ENABLE_PPG), y)
+CONFIG_FLAGS += ENABLE_PPG
+PROJECT_SOURCES += $(SCOMMS_DIR)PpgComm/
+endif
+
+ifeq ($(CONFIG_PPG_MAX3011X), y)
+CONFIG_FLAGS += PPG_MAX3011X
+PROJECT_SOURCES += $(DRIVERS_DIR)MAX3011X
+endif
+
+ifeq ($(CONFIG_PPG_MAX8614X), y)
+CONFIG_FLAGS += PPG_MAX8614X
+PROJECT_SOURCES += $(DRIVERS_DIR)MAX8614X
+endif
+## END PPG SENSOR ##
+
+## BEGIN ECG SENSOR ##
+ifeq ($(CONFIG_ENABLE_ECG), y)
+CONFIG_FLAGS += ENABLE_ECG
+PROJECT_SOURCES += $(SCOMMS_DIR)EcgComm/
+endif
+
+ifeq ($(CONFIG_ECG_MAX30001), y)
+CONFIG_FLAGS += ECG_MAX30001
+PROJECT_SOURCES += $(DRIVERS_DIR)MAX30001
+endif
+## END PPG SENSOR ##
+
+## BEGIN TEMP SENSOR
+ifeq ($(CONFIG_ENABLE_TP), y)
+CONFIG_FLAGS += ENABLE_TP
+PROJECT_SOURCES += $(SCOMMS_DIR)TempComm/
+endif
+
+ifeq ($(CONFIG_TP_MAX30205), y)
+CONFIG_FLAGS += TP_MAX30205
+PROJECT_SOURCES += $(DRIVERS_DIR)MAX30205
+endif
+## END TEMP SENSOR
+
+## BEGIN PRESSURE SENSOR
+ifeq ($(CONFIG_ENABLE_BMP280), y)
+CONFIG_FLAGS +=ENABLE_BMP280
+PROJECT_SOURCES += $(DRIVERS_DIR)BMP280
+endif
+## END PRESSURE SENSOR
+
+## BEGIN FLASH CONFIGURATION
+ifeq ($(CONFIG_ENABLE_MX25U), y)
+CONFIG_FLAGS +=ENABLE_MX25U
+PROJECT_SOURCES += $(DRIVERS_DIR)SPIBlockDevice
+$(info flash driver is included)
+endif
+## END FLASH CONFIGURATION
+
+## BEGIN USBMSD CONFIGURATION
+ifeq ($(CONFIG_ENABLE_USBMSD), y)
+CONFIG_FLAGS +=ENABLE_USBMSD
+PROJECT_SOURCES += $(DRIVERS_DIR)USBMSD_BD
+$(info USBMSD feature enabled)
+endif
+## END USBMSD CONFIGURATION
+
+## BEGIN ACCEL ##
+ifeq ($(CONFIG_ENABLE_ACCEL), y)
+CONFIG_FLAGS += ENABLE_ACCEL
+PROJECT_SOURCES += $(DRIVERS_DIR)BMI160
+endif
+
+ifeq ($(CONFIG_ACCEL_BMA160), y)
+CONFIG_FLAGS += ACCEL_BMA160
+PROJECT_SOURCES += $(DRIVERS_DIR)BMA160
+endif
+
+ifeq ($(CONFIG_ACCEL_BMA280), y)
+CONFIG_FLAGS += ACCEL_BMA280
+PROJECT_SOURCES += $(DRIVERS_DIR)BMA280
+endif
+
+ifeq ($(CONFIG_ACCEL_LIS2DH), y)
+CONFIG_FLAGS += ACCEL_LIS2DH
+PROJECT_SOURCES += $(DRIVERS_DIR)LIS2DH
+endif
+## END ACCEL ##
+
+## BEGIN SMARTSENSOR ##
+ifeq ($(CONFIG_ENABLE_SMARTSENSOR), y)
+CONFIG_FLAGS += ENABLE_SMARTSENSOR
+PROJECT_SOURCES += $(SSINT_DIR)
+endif
+
+ifeq ($(CONFIG_ENABLE_SS_BOOTLOADER), y)
+CONFIG_FLAGS += ENABLE_SS_BOOTLOADER
+PROJECT_SOURCES += $(SSCOMMS_DIR)SSBootloader
+endif
+
+ifeq ($(CONFIG_ENABLE_SS_MAX30101), y)
+CONFIG_FLAGS += ENABLE_SS_MAX30101
+PROJECT_SOURCES += $(SSCOMMS_DIR)SSMAX30101
+endif
+
+ifeq ($(CONFIG_ENABLE_SS_MAX8614X), y)
+CONFIG_FLAGS += ENABLE_SS_MAX8614X
+PROJECT_SOURCES += $(SSCOMMS_DIR)SSMAX8614X
+endif
+## END SMARTSENSOR ##
+
+## BEGIN SMARTSENSOR ##
+ifeq ($(CONFIG_BOOTLOADER_USES_MFIO), y)
+CONFIG_FLAGS += BOOTLOADER_USES_MFIO
+endif
+
+## BEGIN DISPLAY ##
+ifeq ($(CONFIG_ENABLE_DISPLAY), y)
+CONFIG_FLASG += ENABLE_DISPLAY
+endif
+
+ifeq ($(CONFIG_OLED_ADAFRUIT_SSD1306), y)
+CONFIG_FLAGS += OLED_ADAFRUIT_SSD1306
+EXTERNAL_SOURCES += $(DRIVERS_DIR)Adafruit_FeatherOLED
+endif
+ifeq ($(CONFIG_LCD_WATCHINTERFACE), y)
+CONFIG_FLAGS += LCD_WATCHINTERFACE
+endif
+ifeq ($(CONFIG_LCD_LS013B7DH03), y)
+CONFIG_FLAGS += LCD_LS013B7DH03
+PROJECT_SOURCES += $(DRIVERS_DIR)LS013B7DH03
+endif
+## END DISPLAY ##
+
+## BEGIN ALGORITHMS ##
+#ifeq ($(CONFIG_ENABLE_WHRM), y)
+#CONFIG_FLAGS += ENABLE_WHRM
+#PROJECT_SOURCES += $(ALGO_DIR)WHRM
+#endif
+
+ifeq ($(CONFIG_ENABLE_WHRM_AND_SPO2), y)
+CONFIG_FLAGS += ENABLE_WHRM_AND_SPO2
+#PROJECT_SOURCES += $(ALGO_DIR)WHRM
+endif
+
+#ifeq ($(CONFIG_ENABLE_BPT), y)
+#CONFIG_FLAGS += ENABLE_BPT
+#PROJECT_SOURCES += $(ALGO_DIR)WHRM
+#endif
+## END ALGORITHMS ##
+
+## SPO2 ##
+ifeq ($(CONFIG_ENABLE_SPO2), y)
+CONFIG_FLAGS += ENABLE_SPO2
+endif
+## END ##
+
+
+## BEGIN BLE ##
+ifeq ($(CONFIG_ENABLE_BLE), y)
+CONFIG_FLAGS += ENABLE_BLE
+PROJECT_SOURCES += $(DRIVERS_DIR)BLE_ICARUS
+
+#ifeq ("$(CONFIG_BLE_ADV_NAME)", "")
+#$(error BLE Avertisement name must be specified with CONFIG_BLE_ADV_NAME)
+#else
+#CONFIG_FLAGS += BLE_ADV_NAME=\"$(CONFIG_BLE_ADV_NAME)\"
+#endif
+
+ifeq ($(CONFIG_USE_BLE_TICKER_TO_CHECK_TRANSFER), y)
+CONFIG_FLAGS += USE_BLE_TICKER_TO_CHECK_TRANSFER
+endif
+
+endif
+## END BLE ##
+
+## BEGIN DATA STREAMING DEBUG ##
+ifeq ($(CONFIG_ASCII_COMM), y)
+CONFIG_FLAGS += ASCII_COMM
+endif
+
+ifeq ($(CONFIG_ENABLE_BLETEST_COMM), y)
+CONFIG_FLAGS += ENABLE_BLETEST_COMM
+PROJECT_SOURCES += $(SCOMMS_DIR)BleTestComm
+endif
+
+ifeq ($(CONFIG_ENABLE_SS_GENERICCMDCOMM), y)
+CONFIG_FLAGS += ENABLE_SS_GENERICMDCOMM
+PROJECT_SOURCES += $(SSCOMMS_DIR)SSGenericCmd
+endif
+## END DATA STREAMING DEBUG ##
+
+## BEGIN TEST FIRMWARE
+ifeq ($(CONFIG_ENABLE_TESTCOMM), y)
+CONFIG_FLAGS += ENABLE_TESTCOMM
+PROJECT_SOURCES += $(SCOMMS_DIR)TestComm
+endif
+# END TEST FIRMWARE
+
+## BEGIN MEMORY DEBUG ##
+ifeq ($(CONFIG_ENABLE_MEMORY_DEBUG), y)
+CONFIG_FLAGS += ENABLE_MEMORY_DEBUG
+endif
+
+ifeq ($(CONFIG_MBED_HEAP_STATS_ENABLED), y)
+CONFIG_FLAGS += MBED_HEAP_STATS_ENABLED
+endif
+
+ifeq ($(CONFIG_MBED_MEM_TRACING_ENABLED), y)
+CONFIG_FLAGS += MBED_MEM_TRACING_ENABLED
+endif
+
+ifeq ($(CONFIG_MBED_STACK_STATS_ENABLED), y)
+CONFIG_FLAGS += MBED_STACK_STATS_ENABLED
+endif
+## END MEMORY DEBUG ##
+
+
+## BEGIN DEBUG MSGS TOGGLE
+ifeq ($(CONFIG_SHOW_DEBUG_MSGS), y)
+CONFIG_FLAGS += SHOW_DEBUG_MSGS
+endif
+ifeq ($(CONFIG_SHOW_INFO_MSGS), y)
+CONFIG_FLAGS += SHOW_INFO_MSGS
+endif
+ifeq ($(CONFIG_SHOW_I2C_DEBUG_MESSAGES), y)
+CONFIG_FLAGS += SHOW_I2C_DEBUG_MESSAGES
+endif
+
+ifeq ($(V), 1)
+BUILD_VERBOSE = -v
+endif
+
+SRC_ARGS += $(addprefix --source $(PROJECT_PATH)/, $(EXTERNAL_SOURCES))
+SRC_ARGS += $(addprefix --source $(PROJECT_PATH)/, $(PROJECT_SOURCES))
+CFG_ARGS = $(addprefix -D, $(CONFIG_FLAGS))
+
+###$(info SELECTED_CONFIG=$(CONFIG_CONFIG_NAME))
+$(info CONFIG_PLATFORM_NAME=$(CONFIG_PLATFORM_NAME) CONFIG_MAXIM_PLATFORM_NAME=$(CONFIG_MAXIM_PLATFORM_NAME) CONFIG_FLAGS=$(CONFIG_FLAGS))
+$(info PROJECT_SOURCES=$(PROJECT_SOURCES))
+$(info EXTERNAL_SOURCES=$(EXTERNAL_SOURCES))
+$(info PROJECT_SCM=$(PROJECT_SCM_BRANCH) ($(PROJECT_SCM_HASH)))
+
+## BEGIN MAKEFILE RULES ##
+all: pre_build
+### @if [ -f $(CONFIG_CONFIG_NAME) ]; then \
+### printf "NO CONFIG SELECTED!\n"; \
+### exit 1; \
+### fi;
+ @if [ ! -f .checkout ]; then \
+ $(MAKE) checkout ; \
+ fi;
+ mbed compile -t $(PROJECT_TOOLCHAIN) -m $(CONFIG_PLATFORM_NAME) -D__STACK_SIZE=$(STACK_SIZE) -D__HEAP_SIZE=$(HEAP_SIZE) $(BUILD_VERBOSE) $(CFG_ARGS) $(SRC_ARGS)
+debug_build:
+ mbed compile -t $(PROJECT_TOOLCHAIN) -m $(CONFIG_PLATFORM_NAME) -D__STACK_SIZE=$(STACK_SIZE) -D__HEAP_SIZE=$(HEAP_SIZE) $(BUILD_VERBOSE) $(CFG_ARGS) $(SRC_ARGS) --profile $(PROJECT_PATH)/mbed-os/tools/profiles/debug.json
+
+clean_build:
+ mbed compile -t $(PROJECT_TOOLCHAIN) -m $(CONFIG_PLATFORM_NAME) -D__STACK_SIZE=$(STACK_SIZE) -D__HEAP_SIZE=$(HEAP_SIZE) -c $(BUILD_VERBOSE) $(CFG_ARGS) $(SRC_ARGS)
+
+werror_build:
+ mbed compile -t $(PROJECT_TOOLCHAIN) -m $(CONFIG_PLATFORM_NAME) -D__STACK_SIZE=$(STACK_SIZE) -D__HEAP_SIZE=$(HEAP_SIZE) -c $(BUILD_VERBOSE) $(CFG_ARGS) $(SRC_ARGS) --profile $(PROJECT_PATH)/werror_build_profile.json
+
+clean:
+ rm -rf $(PROJECT_BUILD_PATH)
+
+menuconfig:
+ ${PROJECT_TOOLS_PATH}/windows_kconfig/kconfig-mconf.exe Kconfig
+
+run:
+ python ${PROJECT_TOOLS_PATH}/mbed_run.py ${PROJECT_BUILD_PATH}/${CONFIG_PLATFORM_NAME}/$(PROJECT_TOOLCHAIN)/mbed-os.bin
+
+co: checkout
+
+checkout:
+ @echo "Downloading libraries"
+ mbed deploy
+ $(MAKE) apply_mbedos_patches
+ @touch .$@
+
+applypatches:
+ @echo "Applying patches"
+# cd mbed-os; \
+# git am ../patches/0001-porting-MAX32625PICO-to-mbed-os-5.patch
+# cd USBDevice; \
+# hg import --no-commit --force ../patches/USBDevice.patch
+
+apply_mbedos_patches:
+ @echo "Applying mbed-os patches"
+ @cd ./mbed_os_patches; \
+ for i in *.patch ; do \
+ [ -f "$$i" ] || break ; \
+ echo "$$i"; \
+ cp "$$i" ../mbed-os; \
+ cd ../mbed-os; \
+ git apply "$$i"; \
+ rm -f "$$i"; \
+ cd ..; \
+ cd ./mbed_os_patches; \
+ done; \
+
+selectconfig.%:
+ @if [ -f $(PROJECT_CONFIGS_PATH)/$(word 2,$(subst ., ,$@)).config ]; then \
+ cp $(PROJECT_CONFIGS_PATH)/$(word 2,$(subst ., ,$@)).config $(PROJECT_PATH)/.config; \
+ printf "\n$(word 2,$(subst ., ,$@)).config selected\n"; \
+ else \
+ printf "\nConfig [$(word 2,$(subst ., ,$@))] is not found!\n"; \
+ printf "Available configs are:\n\n"; \
+ ls $(PROJECT_CONFIGS_PATH) | cut -d "." -f 1; \
+ printf "\n"; \
+ fi;
+
+saveconfig:
+### cp $(PROJECT_PATH)/.config $(PROJECT_CONFIGS_PATH)/$(CONFIG_CONFIG_NAME).config
+
+staticcheck:
+ @printf "\n\nRATS-2.4 Staic Analyzer\n"
+ @printf "=========== BEGIN =============\n"
+ ${PROJECT_TOOLS_PATH}/Rats-2.4/rats.exe --quiet -w 3 --db ${PROJECT_TOOLS_PATH}/Rats-2.4/rats-c.xml $(PROJECT_SOURCES)
+ @printf "============ END ==============\n"
+ @printf "\n\nCppcheck-1.78 Static Analyzer\n"
+ @printf "=========== BEGIN =============\n"
+ ${PROJECT_TOOLS_PATH}/Cppcheck-1.78/cppcheck.exe -q --enable=all --force $(PROJECT_SOURCES)
+ @printf "============ END ==============\n"
+ @printf "\n\nVisualCodeGrepper-2.1.0 Static Analyzer\n"
+ @printf "=========== BEGIN =============\n"
+ @cd ${PROJECT_TOOLS_PATH}/VisualCodeGrepper-2.1.0; \
+ for src in $(PROJECT_SOURCES) ; do \
+ ${PROJECT_TOOLS_PATH}/VisualCodeGrepper-2.1.0/VisualCodeGrepper.exe -c -t $(PROJECT_PATH)/$$src -r $(PROJECT_PATH)/.tmp_VCG_step.txt ; \
+ echo "" >> $(PROJECT_PATH)/.tmp_VCG_result.txt ; \
+ echo "$$src:" >> $(PROJECT_PATH)/.tmp_VCG_result.txt ; \
+ cat $(PROJECT_PATH)/.tmp_VCG_step.txt >> $(PROJECT_PATH)/.tmp_VCG_result.txt ; \
+ rm -rf $(PROJECT_PATH)/.tmp_VCG_step.txt ;\
+ done ; \
+ cat $(PROJECT_PATH)/.tmp_VCG_result.txt ; \
+ rm -rf $(PROJECT_PATH)/.tmp_VCG_result.txt
+ @printf "============ END ==============\n"
+
+doxygen:
+ mkdir -p $(PROJECT_BUILD_PATH)
+ export PROJECT_SOURCES="$(PROJECT_SOURCES)"; \
+ export PROJECT_SCM_HASH="$(PROJECT_SCM_HASH)"; \
+ doxygen doxygen.conf
+ start $(PROJECT_BUILD_PATH)/doc/html/index.html
+
+astyle:
+ @printf "=========== BEGIN ASTYLE =============\n"
+ ${PROJECT_TOOLS_PATH}/AStyle_2.06_windows/bin/AStyle.exe --options=${PROJECT_TOOLS_PATH}/AStyle_2.06_windows/file/custom.ini "*.cpp";
+ ${PROJECT_TOOLS_PATH}/AStyle_2.06_windows/bin/AStyle.exe --options=${PROJECT_TOOLS_PATH}/AStyle_2.06_windows/file/custom.ini "*.h";
+ @for src in $(PROJECT_SOURCES); do \
+ if [[ -d $$src ]]; then \
+ ${PROJECT_TOOLS_PATH}/AStyle_2.06_windows/bin/AStyle.exe --options=${PROJECT_TOOLS_PATH}/AStyle_2.06_windows/file/custom.ini --recursive "$$src/*.cpp" ; \
+ ${PROJECT_TOOLS_PATH}/AStyle_2.06_windows/bin/AStyle.exe --options=${PROJECT_TOOLS_PATH}/AStyle_2.06_windows/file/custom.ini --recursive "$$src/*.h" ; \
+ fi; \
+ done;
+ @printf "============ END ASTYLE ==============\n"
+
+help:
+ start https://confluence.maxim-ic.com/x/VSAkB
+
+create_flags:
+ python ./scripts/py/mbed_convertconfigtoflags.py
+
+pre_build:
+ @echo "#ifndef __BUILD_VERSION_H__" > build_version.h
+ @echo "#define __BUILD_VERSION_H__" >> build_version.h
+ @echo "#define BUILD_SOURCE_BRANCH \"$(PROJECT_SCM_BRANCH)\"" >> build_version.h
+ @echo "#define BUILD_SOURCE_HASH \"$(PROJECT_SCM_HASH)\"" >> build_version.h
+ @echo "#endif" >> build_version.h
+## END MAKEFILE RULES ##
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Platforms/max32630fthr.lib Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,1 @@ +http://developer.mbed.org/teams/MaximIntegrated/code/max32630fthr/#9eb360063579
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Platforms/max32630hsp/MAX20303/MAX20303.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,409 @@
+/*******************************************************************************
+ * 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)
+{
+ int 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)
+{
+ int ret;
+
+ char data = reg;
+
+ ret = m_i2c->write(m_writeAddress, &data, sizeof(data));
+ if (ret != 0) {
+ printf("%s - failed - ret: %d\n", __func__, ret);
+ return MAX20303_ERROR;
+ }
+
+ ret = m_i2c->read(m_readAddress, &data, sizeof(data));
+ if (ret != 0) {
+ printf("%s - failed - ret: %d\n", __func__, ret);
+ return MAX20303_ERROR;
+ }
+
+ value = data;
+ printf("MAX20303 read reg[0x%X]=0x%X, ret=%d\r\n", (unsigned int)reg, (unsigned int)value, ret);
+ return MAX20303_NO_ERROR;
+}
+
+//******************************************************************************
+int MAX20303::readRegMulti(registers_t reg, uint8_t *value, uint8_t len){
+ int ret;
+ char data = reg;
+
+ ret = m_i2c->write(m_writeAddress, &data, sizeof(data));
+ if (ret != 0) {
+ printf("%s - failed - ret: %d\n", __func__, ret);
+ return MAX20303_ERROR;
+ }
+
+ ret = m_i2c->read(m_readAddress, (char *)value, len);
+ if (ret != 0) {
+ printf("%s - failed - ret: %d\n", __func__, ret);
+ return MAX20303_ERROR;
+ }
+
+ printf("MAX20303 read reg[0x%X]=0x%X, ret=%d\r\n", (unsigned int)reg, (unsigned int)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];
+ //uint8_t value;
+ //printf("m_battery_is_connected is:%d\r\n", m_battery_is_connected);
+ if(!m_battery_is_connected) {
+ *batterylevel = 0;
+ return 0;
+ }
+
+ 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");
+ }
+ //printf("battery level is:%d\r\n", data[0]);
+ *batterylevel = data[0];
+
+ return 0;
+}
+
+//******************************************************************************
+char MAX20303::Max20303_IsBattery_Connected(){
+ AnalogIn ain(AIN_5);
+ float adc_value;
+ int ret;
+ char result;
+ // config the mux for the monitor pin
+ appcmdoutvalue_ = 0x50;
+ appdatainoutbuffer_[0] = 0x80;
+ AppWrite(1);
+ // disable the charger
+ appcmdoutvalue_ = 0x1A;
+ appdatainoutbuffer_[0] = 0x02;
+ AppWrite(1);
+ wait_ms(250);
+ // adc measure launch
+ appcmdoutvalue_ = 0x53;
+ appdatainoutbuffer_[0] = 0x09;
+ AppWrite(1);
+ wait_ms(10);
+ ret = readRegMulti(MAX20303::REG_AP_RESPONSE, i2cbuffer_, 5);
+ adc_value = ain.read();
+ if(ret != 0){
+ result = false;
+ } else {
+ if((i2cbuffer_[4] < 0x40) | (adc_value < 0.3)) {
+ result = false;
+ } else {
+ result = true;
+ }
+ }
+ // enable the charger
+ appcmdoutvalue_ = 0x1A;
+ appdatainoutbuffer_[0] = 0x03;
+ AppWrite(1);
+// for(int i = 1; i < 5; ++i){
+// printf("reg value at:%d is:%02X\r\n", i, i2cbuffer_[i]);
+// }
+ m_battery_is_connected = result;
+ return result;
+}
+
+
+//******************************************************************************
+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;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Platforms/max32630hsp/MAX20303/MAX20303.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,226 @@
+/*******************************************************************************
+ * 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_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);
+
+ // check if the battery is connected.
+ // Warning: that function has 1000ms delay
+ char Max20303_IsBattery_Connected();
+
+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_;
+
+ // check if the battery is connected
+ char m_battery_is_connected;
+
+ /** @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_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Platforms/max32630hsp/max32630hsp.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,233 @@
+/*******************************************************************************
+ * 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);
+
+ status_powerButton = BUTTONSTATUS_INACTIVE;
+ 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_time(1544787300); // Set RTC time to Wed, 28 Oct 2009 11:35:37
+
+ /*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);
+
+
+
+ return 0;
+}
+
+//******************************************************************************
+void MAX32630HSP::event_powerButtonPressed(void) {
+ status_powerButton = BUTTONSTATUS_PRESSED;
+}
+
+//******************************************************************************
+void MAX32630HSP::event_powerButtonReleased(void) {
+ if(status_powerButton == BUTTONSTATUS_LONG_PRESS_WAITING_RED) {
+ status_powerButton = BUTTONSTATUS_LONG_PRESS;
+ } else {
+ status_powerButton = BUTTONSTATUS_RELEASED;
+ }
+}
+
+//******************************************************************************
+void MAX32630HSP::event_longpresscheck(void) {
+ status_powerButton = BUTTONSTATUS_LONG_PRESS_WAITING;
+}
+
+//******************************************************************************
+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
+}
+
+//******************************************************************************
+void MAX32630HSP::Max32630HSP_CheckInterrupt_Status(void) {
+
+ switch (status_powerButton) {
+ case BUTTONSTATUS_PRESSED: {
+ 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 */
+ status_powerButton = BUTTONSTATUS_PRESSED_WAITING;
+
+ } break;
+ case BUTTONSTATUS_RELEASED: {
+ /* 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();
+ status_powerButton = BUTTONSTATUS_INACTIVE;
+ } break;
+ case BUTTONSTATUS_LONG_PRESS_WAITING: {
+ max20303.led0on(0);
+ max20303.led1on(1);
+ max20303.led2on(0);
+ status_powerButton = BUTTONSTATUS_LONG_PRESS_WAITING_RED;
+ } break;
+ case BUTTONSTATUS_LONG_PRESS: {
+ max20303.PowerOffDelaythePMIC();
+ wait_ms(250);
+ status_powerButton = BUTTONSTATUS_INACTIVE;
+ } break;
+ default:
+ break;
+ }
+}
+
+//******************************************************************************
+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;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Platforms/max32630hsp/max32630hsp.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * 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_INACTIVE = 0,
+ BUTTONSTATUS_RELEASED,
+ BUTTONSTATUS_PRESSED,
+ BUTTONSTATUS_PRESSED_WAITING,
+ BUTTONSTATUS_LONG_PRESS,
+ BUTTONSTATUS_LONG_PRESS_WAITING,
+ BUTTONSTATUS_LONG_PRESS_WAITING_RED,
+ } ;
+
+ /**
+ * 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);
+
+ void Max32630HSP_CheckInterrupt_Status(void);
+
+ /// Local I2C bus for configuring PMIC and accessing BMI160 IMU.
+ I2C i2c;
+
+ /// MAX20303 PMIC Instance
+ MAX20303 max20303;
+
+
+ InterruptIn *m_max32630hsp3_powerButtonInterrupt;
+ Timeout button_timeout;
+
+ volatile ButtonStatus status_powerButton;
+ ButtonStatus status_upButton;
+ ButtonStatus status_downButton;
+ void event_powerButtonPressed(void);
+ void event_powerButtonReleased(void);
+ void event_longpresscheck(void);
+};
+
+#endif /* _MAX32630HSP_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/CRC8.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,93 @@
+ /***************************************************************************
+* Copyright (C) 2017 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 <stdint.h>
+
+/*
+ * CRC-8:
+ *
+ * Width: 8
+ * Poly: 0x07
+ * Init: 0x00
+ * RefIn: False
+ * RefOut: False
+ * XOROur: 0x00
+ * Check: 0xF4
+ */
+
+static const uint8_t CRC8_POLY = 0x07;
+static bool crc8_initialized = false;
+
+static uint8_t crc8_table[256];
+
+
+static void init_crc8()
+{
+ uint8_t msb = 1 << 7;
+ uint8_t bit;
+ uint8_t rem;
+ uint32_t byte = 0;
+
+ if (crc8_initialized)
+ return;
+
+ while (byte < 256) {
+ rem = byte;
+ for (bit = 0; bit < 8; bit++) {
+ if (rem & msb)
+ rem = (rem << 1) ^ CRC8_POLY;
+ else
+ rem <<= 1;
+ }
+
+ crc8_table[byte++] = rem;
+ }
+
+ crc8_initialized = true;
+}
+
+uint8_t crc8(uint8_t *data, uint32_t length)
+{
+ uint8_t crc = 0x00;
+ uint32_t msg_idx = 0;
+
+ if (length == 0xFFFFFFFF)
+ return 0;
+
+ init_crc8();
+
+ while (msg_idx < length) {
+ crc = crc8_table[crc ^ data[msg_idx++]];
+ }
+
+ return crc;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Utilities/CRC8.h Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,39 @@ + /*************************************************************************** +* Copyright (C) 2017 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 _CRC8_ +#define _CRC8_ + +uint8_t crc8(uint8_t *data, uint32_t length); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/EventStats.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,119 @@
+/***************************************************************************
+* Copyright (C) 2017 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.
+****************************************************************************
+*/
+#ifdef ENABLE_EVENTSTATS
+#include "EventStats.h"
+#include "Peripherals.h"
+
+EventStats::EventStats() :
+ single_evt(), all_evts()
+{
+ name = "";
+ report_period = 1000000;
+ num_evts = 0;
+ total_evt_time = 0;
+
+ evt_in_prog = false;
+}
+
+EventStats::EventStats(int report_period, const char* name) :
+ single_evt(), all_evts()
+{
+ if (name)
+ this->name = name;
+ else
+ this->name = "";
+
+ this->report_period = report_period;
+ num_evts = 0;
+ total_evt_time = 0;
+ evt_in_prog = false;
+
+}
+
+void EventStats::start()
+{
+ if (evt_in_prog) {
+ pr_debug("EventStats::start() called twice without calling EventStats::stop()!");
+ }
+
+
+ if (!num_evts)
+ all_evts.start();
+
+ single_evt.start();
+ evt_in_prog = true;
+
+}
+
+void EventStats::stop()
+{
+ if (!evt_in_prog) {
+ pr_debug("EventStats::stop() called before EventStats::start()!");
+ }
+
+ single_evt.stop();
+ num_evts++;
+ evt_in_prog = false;
+ total_evt_time += single_evt.read_us();
+ single_evt.reset();
+
+ int time_since_start = all_evts.read_us();
+ if (time_since_start > report_period) {
+ print_events(true);
+ }
+}
+
+void EventStats::print_events(bool reset)
+{
+ if (num_evts > 0) {
+ int time_since_start = all_evts.read_us();
+ int avg = total_evt_time / num_evts;
+
+ pr_debug("[Event (%s) hit %d times in %dus. Avg: %dus, Total: %dus\r\n",
+ name,
+ num_evts,
+ time_since_start,
+ avg,
+ total_evt_time);
+ } else {
+ pr_debug("Event (%s) has not yet occurred\r\n", name);
+ }
+
+ if (reset) {
+ num_evts = 0;
+ all_evts.reset();
+ total_evt_time = 0;
+ }
+}
+
+#endif //ENABLE_EVENTSTATS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/EventStats.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Author: Shaun Kelsey, shaun.kelsey@maximintegrated.com
+
+ * Copyright (C) 2017 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.
+ *
+ ******************************************************************************/
+#ifdef ENABLE_EVENTSTATS
+#ifndef _PLATFORM_EVENT_H
+#define _PLATFORM_EVENT_H
+
+
+#include "mbed.h"
+
+class EventStats
+{
+ public:
+ EventStats();
+ EventStats(int report_period, const char* name);
+
+ //Start an event
+ void start();
+
+ //Stop an event. If report_period time has passed, prints stats
+ void stop();
+
+ //Print out stats. Set report_period to < 0 if you want to call this manually
+ void print_events(bool reset);
+
+ private:
+
+ const char* name;
+ int report_period;
+ int num_evts;
+ int total_evt_time;
+
+ bool evt_in_prog;
+ Timer single_evt;
+ Timer all_evts;
+};
+
+
+#endif
+#endif //ENABLE_EVENTSTATS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/LEDStatus.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,128 @@
+/*******************************************************************************
+* Author: Shaun Kelsey, shaun.kelsey@maximintegrated.com
+* 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 "LEDStatus.h"
+#include "Peripherals.h"
+
+LEDStatus::LEDStatus(PinName red, int rstate, PinName green, int gstate, PinName blue, int bstate):
+ rLED(red, rstate), gLED(green, gstate), bLED(blue, bstate), blinking(false), timer()
+{
+}
+
+void LEDStatus::set_state(int rstate, int gstate, int bstate)
+{
+ r_act = rstate;
+ g_act = gstate;
+ b_act = bstate;
+
+ if (!blinking) {
+ rLED = r_act;
+ gLED = g_act;
+ bLED = b_act;
+ }
+}
+
+void LEDStatus::solid()
+{
+ blinking = false;
+ rLED = r_act;
+ gLED = g_act;
+ bLED = b_act;
+
+ timer.stop();
+}
+
+void LEDStatus::blink(int ontime, int offtime, int nb)
+{
+ ont_us = 1000 * ontime;
+ offt_us = 1000 * offtime;
+ count = 1;
+ total = nb;
+ blinking = true;
+
+ rLED = r_act;
+ gLED = g_act;
+ bLED = b_act;
+ bs = true;
+
+ timer.reset();
+ timer.start();
+}
+
+void LEDStatus::blink(int period, float duty, int nb)
+{
+ ont_us = 1000 * period * duty;
+ offt_us = (1000 * period) - ont_us;
+ count = 1;
+ total = nb;
+ blinking = true;
+
+ rLED = r_act;
+ gLED = g_act;
+ bLED = b_act;
+ bs = true;
+
+ timer.reset();
+}
+
+bool LEDStatus::is_blinking()
+{
+ return blinking;
+}
+
+void LEDStatus::update()
+{
+ uint64_t time = timer.read_high_resolution_us();
+ uint64_t frame_time = time % (ont_us + offt_us);
+
+ if (bs && (frame_time > ont_us)) {
+ bs = false;
+ rLED = LED_OFF;
+ gLED = LED_OFF;
+ bLED = LED_OFF;
+ count++;
+
+ } else if (!bs && (frame_time <= ont_us)) {
+ bs = true;
+ rLED = r_act;
+ gLED = g_act;
+ bLED = b_act;
+
+ if (total > 0 && count >= total) {
+ blinking = false;
+ timer.stop();
+ }
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/LEDStatus.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,119 @@
+/*******************************************************************************
+* Author: Shaun Kelsey, shaun.kelsey@maximintegrated.com
+* 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 _LEDSTATUS_H_
+#define _LEDSTATUS_H_
+#include "mbed.h"
+
+class LEDStatus
+{
+public:
+
+ /** Create an LED_Status controller
+ *
+ * @param red PinName of red LED
+ * @param rstate Initial state of red LED
+ * @param green PinName of green LED
+ * @param gstate Initial state of green LED
+ * @param blue PinName of blue LED
+ * @param bstate Initial state of blue LED
+ */
+ LEDStatus(PinName red, int rstate, PinName green, int gstate, PinName blue, int bstate);
+
+ /** Set the active state of each LED
+ *
+ * @param rstate active state of red LED
+ * @param gstate active state of green LED
+ * @param bstate active state of blue LED
+ */
+ void set_state(int rstate, int gstate, int bstate);
+
+ /** Set and keep the LEDs in their active state */
+ void solid();
+
+ /** Set the LEDs to toggle between their active state and their off state
+ *
+ * @param ontime The amount of time (in milliseconds) to remain in the active state
+ * @param offtime The amount of time (in milliseconds) to remain off
+ * @param nb The number of times to blink before remaining in the off state
+ * Set to -1 to blink indefinitely
+ *
+ */
+ void blink(int ontime, int offtime, int nb = -1);
+
+ /** Set the LEDs to toggle between their active state and their off state
+ *
+ * @param period The period of each blink (in milliseconds)
+ * @param offtime The percentage of the period during which the LEDs will be in their active state
+ * @param nb The number of times to blink before remaining in the off state
+ * Set to -1 to blink indefinitely
+ */
+ void blink(int period, float duty, int nb = -1);
+
+ /** Get whether LEDState is in the blinking state
+ */
+ bool is_blinking();
+
+ /** Called in main loop of program to advance the state of the class
+ * @detail Instead of using a Ticker and generating additional interrupts and overhead,
+ * LEDStatus relies on update being called at a decent interval in order
+ * to advance its interval time keeping and blink LEDs and the correct rate.
+ * If only using solid() mode, update() does not need to be called.
+ */
+ void update();
+
+private:
+
+ DigitalOut rLED;
+ DigitalOut gLED;
+ DigitalOut bLED;
+
+ int r_act;
+ int g_act;
+ int b_act;
+
+ bool blinking;
+ bool bs;
+ int count;
+ int total;
+
+ uint64_t ont_us;
+ uint64_t offt_us;
+
+ Timer timer;
+
+};
+
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Utilities/Peripherals.cpp Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,40 @@ +/******************************************************************************* + * 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 "Peripherals.h" + +USBSerial *Peripherals::mUSBSerial = NULL; +Serial *Peripherals::mDaplinkSerial = NULL; + +MAX30001 *Peripherals::mMAX30001 = NULL; +MAX30001_Helper *Peripherals::mMAX30001_Helper = NULL; +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/Peripherals.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * 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 _PERIPHERALS_H_
+#define _PERIPHERALS_H_
+
+#include "mbed.h"
+#include "Serial.h"
+#include "USBSerial.h"
+
+
+#include "MAX30001.h"
+#include "MAX30001_Helper.h"
+
+
+#define pr_USB(fmt, args...) if(Peripherals::usbSerial() != NULL) \
+ Peripherals::usbSerial()->printf("\r\n[" fmt "[(%s:%d)\r\n", ##args, __func__, __LINE__)
+
+#define pr_SERIAL(fmt, args...) printf("\r\n[" fmt "[(%s:%d)\r\n", ##args, __func__, __LINE__)
+
+#define pr_err(fmt, args...) if(Peripherals::usbSerial() != NULL) \
+ Peripherals::usbSerial()->printf("\r\n[" fmt "[(%s:%d)\r\n", ##args, __func__, __LINE__); \
+ if (Peripherals::daplinkSerial() != NULL) \
+ Peripherals::daplinkSerial()->printf("\r\n[" fmt, ##args);
+
+#ifdef SHOW_DEBUG_MSGS
+#define pr_debug(fmt, args...) if(Peripherals::usbSerial() != NULL) \
+ Peripherals::usbSerial()->printf("\r\n[" fmt "[(%s:%d)\r\n", ##args, __func__, __LINE__); \
+ if (Peripherals::daplinkSerial() != NULL) \
+ Peripherals::daplinkSerial()->printf("\r\n[" fmt, ##args);
+#else
+ #define pr_debug(fmt, args...)
+#endif
+
+#ifdef SHOW_INFO_MSGS
+#define pr_info(fmt, args...) if(Peripherals::usbSerial() != NULL)\
+ Peripherals::usbSerial()->printf("[" fmt, ##args); \
+ if (Peripherals::daplinkSerial() != NULL)\
+ Peripherals::daplinkSerial()->printf("\r\n[" fmt, ##args);
+#else
+ #define pr_info(fmt, args...)
+#endif
+
+/**
+* This static class is used as a central locatoin for all devices on the HSP platform
+* it gives (in-effect) a singleton interface for each device so that anywhere in code
+* one can reference on of these devices
+*/
+class Peripherals {
+public:
+ static USBSerial *setUSBSerial(USBSerial * device) { mUSBSerial = device; return device; }
+ static USBSerial *usbSerial(void) { return mUSBSerial; }
+
+ static Serial *setDaplinkSerial(Serial * device) { mDaplinkSerial = device; return device; }
+ static Serial *daplinkSerial(void) { return mDaplinkSerial; }
+
+
+ static MAX30001 *max30001(void) { return mMAX30001; }
+ static MAX30001 *setMAX30001(MAX30001 *device) { mMAX30001 = device; return device; }
+
+ static MAX30001_Helper *max30001Helper(void) { return mMAX30001_Helper; }
+ static MAX30001_Helper *setMAX30001Helper(MAX30001_Helper *device) { mMAX30001_Helper = device; return device; }
+
+
+private:
+ static USBSerial *mUSBSerial;
+ static Serial *mDaplinkSerial;
+
+ static MAX30001 *mMAX30001;
+ static MAX30001_Helper *mMAX30001_Helper;
+
+};
+
+#endif // _PERIPHERALS_H_
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/WatchInterface.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,1133 @@
+/*
+ * WatchInterface.cpp
+ *
+ * Created on: Aug 28, 2018
+ * Author: Gokhan.Bektas
+ */
+
+
+
+#include "WatchInterface.h"
+#include "Peripherals.h"
+#include "LS013B7DH03.h"
+#include "mbed_logo.h"
+
+#include "UbuntuCondensed38x47.h"
+#include "ubuntucondensed20x26.h"
+#include "ubuntucondensed16x21.h"
+#include "Arial10x10.h"
+#include "Neu44x36.h"
+#include "mxm_assert.h"
+#include "utils.h"
+#include "../version.h"
+
+//Non-const static members must be both declared in the class definition and defined with global scope to properly give the linker something to reference.
+bool WatchInterface::refreshed = true;
+
+
+WatchInterface::WatchInterface(PinName buttonUp, PinName buttonDown, PinName buttonPower, PinName displayCS, PinName displayEXTCOM, PinName displayDISP, SPI* displaySPI):
+ btnUp(buttonUp), btnDown(buttonDown), btnPower(buttonPower), dispCS(displayCS), dispEXTCOM(displayEXTCOM), dispDISP(displayDISP), display(displaySPI, &dispCS), DisplayPWM(displayEXTCOM)
+{
+ dispDISP = 0;
+
+
+ buttonEvent_up = BUTTONEVENT_NONE;
+ buttonEvent_down = BUTTONEVENT_NONE;
+
+
+ btnUp.fall(callback(this, &WatchInterface::isr_buttonup));
+ btnUp.mode(PullUp);
+ btnUp.enable_irq();
+
+ btnDown.fall(callback(this, &WatchInterface::isr_buttondown));
+ btnDown.mode(PullUp);
+ btnDown.enable_irq();
+
+ displaySPI->frequency(1000000);
+
+ DisplayPWM.period_ms(16);
+ DisplayPWM.pulsewidth_ms(8);
+
+ //updateDisplay(4);
+
+ recording_old = false;
+ recording = false;
+ recordingStopFlag = false;
+ isDisplayOff = false;
+
+ interfaceTimer.start();
+
+ displayMode_old = DISPLAYMODE_AFTERBOOT;
+ displayMode = DISPLAYMODE_TIME;
+
+
+
+}
+
+void WatchInterface::isr_buttonup()
+{
+ if (buttonEvent_up == BUTTONEVENT_NONE) {
+ buttonEvent_up = BUTTONEVENT_UP_PRE;
+ }
+}
+
+void WatchInterface::isr_buttondown()
+{
+ if (buttonEvent_down == BUTTONEVENT_NONE) {
+ buttonEvent_down = BUTTONEVENT_DOWN_PRE;
+ }
+}
+
+WatchInterface::ButtonStatus WatchInterface::getButtonStatus(WatchInterface::hspButton button)
+{
+
+ switch (button) {
+
+ // TODO: fill button power status
+ case WatchInterface::BUTTON_POWER :
+ return (BUTTON_RELEASED);
+ break;
+ case WatchInterface::BUTTON_UP:
+ if (btnUp.read()) {
+ return (WatchInterface::BUTTON_PRESSED);
+ } else {
+ return (WatchInterface::BUTTON_RELEASED);
+ }
+ break;
+
+ case WatchInterface::BUTTON_DOWN:
+ if (btnDown.read()) {
+ return (WatchInterface::BUTTON_PRESSED);
+ } else {
+ return (WatchInterface::BUTTON_RELEASED);
+ }
+ break;
+
+ }
+
+}
+
+
+void WatchInterface::refreshCallback(void)
+{
+ refreshed = true;
+}
+
+
+
+void WatchInterface::execute(void)
+{
+ unsigned int current_timer;
+ static int tickCount;
+ static char tickCount_battery;
+ static int firstDetect_up;
+ static int firstDetect_down;
+
+
+ // Display is OFF in ECG Mode
+ if (ecg_enabled) {
+ if (recording & (buttonEvent_down == BUTTONEVENT_DOWN_PRE)) {
+ dispDISP = 1;
+ if (isDisplayOff) {
+ displayOff(false);
+ }
+ displayMode = DISPLAYMODE_RECORDING_STOP;
+ } else {
+ displayOff(true);
+ }
+ } else {
+ dispDISP = 1;
+ if (isDisplayOff) {
+ displayOff(false);
+ displayMode = DISPLAYMODE_RECORDING_STOP;
+ }
+ }
+
+
+ if (isDisplayOff != true) {
+ display.executeOnceLCD();
+
+ if (USB_Interface_MSD) {
+ return;
+ }
+
+ current_timer = interfaceTimer.read_ms();
+
+ // Button Debouncing
+ if (current_timer > 50) {
+
+ interfaceTimer.reset();
+ interfaceTimer.start();
+
+ // Increase tick counter in every 50ms
+ tickCount++;
+
+ // tick counter reset will occur in every 15x50 = 750ms. This is used for display updates
+ if (tickCount == 15) {
+ tickCount = 0;
+ }
+
+ if (buttonEvent_up == BUTTONEVENT_UP_PRE) {
+
+ if (firstDetect_up < 2) {
+ firstDetect_up++;
+ } else {
+ firstDetect_up = 0;
+ if (btnUp.read() == 0) {
+ buttonEvent_up = BUTTONEVENT_UP;
+ } else {
+ buttonEvent_up = BUTTONEVENT_NONE;
+ }
+ }
+
+ } else {
+ firstDetect_up = 0;
+ }
+
+ if (buttonEvent_down == BUTTONEVENT_DOWN_PRE) {
+
+ if (firstDetect_down < 2) {
+ firstDetect_down++;
+ } else {
+
+ firstDetect_down = 0;
+
+ if (btnDown.read() == 0) {
+ buttonEvent_down = BUTTONEVENT_DOWN;
+
+ } else {
+ buttonEvent_down = BUTTONEVENT_NONE;
+ }
+ }
+
+ } else {
+ firstDetect_down = 0;
+ }
+
+ }
+
+
+ switch (displayMode) {
+
+
+ case DISPLAYMODE_TIME:
+
+ // Detect BLE Connected Event
+ if (BLE_Interface_Exists) {
+
+ BLE_Interface_Exists_old = true;
+ display_BLEMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED;
+
+ tickCount = 8;
+
+ } else
+ // Detect USB Connected Event
+ if (USB_Interface_Exists) {
+
+ USB_Interface_Exists_old = true;
+ display_USBMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED_USB;
+
+ tickCount = 8;
+
+ } else
+ // Next menu item
+ if (buttonEvent_up == BUTTONEVENT_UP) {
+
+ buttonEvent_up = BUTTONEVENT_NONE;
+ displayMode = DISPLAYMODE_PPG;
+ modeUpdated = true;
+ tickCount = 8;
+
+ } else
+ // Next menu item
+ if (buttonEvent_down == BUTTONEVENT_DOWN) {
+
+ buttonEvent_down = BUTTONEVENT_NONE;
+ displayMode = DISPLAYMODE_INFO;
+ modeUpdated = true;
+ tickCount = 8;
+
+ } else {
+
+
+ }
+ break;
+
+#ifdef ENABLE_SPO2
+ case DISPLAYMODE_PPG: // Handle both PPG and ECG
+ case DISPLAYMODE_ECG:
+
+ // Detect BLE Connected Event
+ if (BLE_Interface_Exists) {
+
+ BLE_Interface_Exists_old = true;
+ display_BLEMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED;
+
+ tickCount = 8;
+
+ } else
+ // Detect USB Connected Event
+ if (USB_Interface_Exists) {
+
+ USB_Interface_Exists_old = true;
+ display_USBMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED_USB;
+
+ tickCount = 8;
+
+ } else
+ // Next menu item
+ if (buttonEvent_up == BUTTONEVENT_UP) {
+
+ buttonEvent_up = BUTTONEVENT_NONE;
+ displayMode = DISPLAYMODE_SPO2_ONESHOT;
+ modeUpdated = true;
+ tickCount = 8;
+
+ } else
+ // Next menu item
+ if (buttonEvent_down == BUTTONEVENT_DOWN) {
+
+ buttonEvent_down = BUTTONEVENT_NONE;
+ displayMode = DISPLAYMODE_TIME;
+ modeUpdated = true;
+ tickCount = 8;
+
+ }
+ break;
+
+ case DISPLAYMODE_SPO2_ONESHOT:
+
+ // Detect BLE Connected Event
+ if (BLE_Interface_Exists) {
+
+ BLE_Interface_Exists_old = true;
+ display_BLEMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED;
+
+ tickCount = 8;
+
+ } else
+ // Detect USB Connected Event
+ if (USB_Interface_Exists) {
+
+ USB_Interface_Exists_old = true;
+ display_USBMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED_USB;
+
+ tickCount = 8;
+
+ } else
+ // Next menu item
+ if (buttonEvent_up == BUTTONEVENT_UP) {
+
+ buttonEvent_up = BUTTONEVENT_NONE;
+ displayMode = DISPLAYMODE_SPO2_CONTINUOUS;
+ modeUpdated = true;
+ tickCount = 8;
+
+ } else
+ // Next menu item
+ if (buttonEvent_down == BUTTONEVENT_DOWN) {
+
+ buttonEvent_down = BUTTONEVENT_NONE;
+ displayMode = DISPLAYMODE_PPG;
+ modeUpdated = true;
+ tickCount = 8;
+
+ }
+
+ break;
+
+ case DISPLAYMODE_SPO2_CONTINUOUS:
+
+ // Detect BLE Connected Event
+ if (BLE_Interface_Exists) {
+
+ BLE_Interface_Exists_old = true;
+ display_BLEMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED;
+
+ tickCount = 8;
+
+ } else
+ // Detect USB Connected Event
+ if (USB_Interface_Exists) {
+
+ USB_Interface_Exists_old = true;
+ display_USBMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED_USB;
+
+ tickCount = 8;
+
+ } else
+ // Next menu item
+ if (buttonEvent_up == BUTTONEVENT_UP) {
+
+ buttonEvent_up = BUTTONEVENT_NONE;
+ displayMode = DISPLAYMODE_INFO;
+ modeUpdated = true;
+ tickCount = 8;
+
+ } else
+ // Next menu item
+ if (buttonEvent_down == BUTTONEVENT_DOWN) {
+
+ buttonEvent_down = BUTTONEVENT_NONE;
+ displayMode = DISPLAYMODE_SPO2_ONESHOT;
+ modeUpdated = true;
+ tickCount = 8;
+
+ }
+
+ break;
+#else
+ case DISPLAYMODE_PPG: // Handle both PPG and ECG
+ case DISPLAYMODE_ECG:
+
+ // Detect BLE Connected Event
+ if (BLE_Interface_Exists) {
+
+ BLE_Interface_Exists_old = true;
+ display_BLEMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED;
+
+ tickCount = 8;
+
+ } else
+ // Detect USB Connected Event
+ if (USB_Interface_Exists) {
+
+ USB_Interface_Exists_old = true;
+ display_USBMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED_USB;
+
+ tickCount = 8;
+
+ } else
+ // Next menu item
+ if (buttonEvent_up == BUTTONEVENT_UP) {
+
+ buttonEvent_up = BUTTONEVENT_NONE;
+ displayMode = DISPLAYMODE_TEMP;
+ modeUpdated = true;
+ tickCount = 8;
+
+ } else
+ // Next menu item
+ if (buttonEvent_down == BUTTONEVENT_DOWN) {
+
+ buttonEvent_down = BUTTONEVENT_NONE;
+ displayMode = DISPLAYMODE_TIME;
+ modeUpdated = true;
+ tickCount = 8;
+
+ }
+ break;
+
+ case DISPLAYMODE_TEMP:
+
+ // Detect BLE Connected Event
+ if (BLE_Interface_Exists) {
+
+ BLE_Interface_Exists_old = true;
+ display_BLEMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED;
+
+ tickCount = 8;
+
+ } else
+ // Detect USB Connected Event
+ if (USB_Interface_Exists) {
+
+ USB_Interface_Exists_old = true;
+ display_USBMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED_USB;
+
+ tickCount = 8;
+
+ } else
+ // Next menu item
+ if (buttonEvent_up == BUTTONEVENT_UP) {
+
+ buttonEvent_up = BUTTONEVENT_NONE;
+ displayMode = DISPLAYMODE_INFO;
+ modeUpdated = true;
+ tickCount = 8;
+
+ } else
+ // Next menu item
+ if (buttonEvent_down == BUTTONEVENT_DOWN) {
+
+ buttonEvent_down = BUTTONEVENT_NONE;
+ displayMode = DISPLAYMODE_PPG;
+ modeUpdated = true;
+ tickCount = 8;
+
+ }
+ break;
+#endif
+ case DISPLAYMODE_INFO:
+
+ // Detect BLE Connected Event
+ if (BLE_Interface_Exists) {
+
+ BLE_Interface_Exists_old = true;
+ display_BLEMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED;
+
+ tickCount = 8;
+
+ } else
+ // Detect USB Connected Event
+ if (USB_Interface_Exists) {
+
+ USB_Interface_Exists_old = true;
+ display_USBMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED_USB;
+
+ tickCount = 8;
+
+ } else
+ // Next menu item
+ if (buttonEvent_up == BUTTONEVENT_UP) {
+
+ buttonEvent_up = BUTTONEVENT_NONE;
+ displayMode = DISPLAYMODE_TIME;
+ modeUpdated = true;
+ tickCount = 8;
+
+ } else
+ // Next menu item
+ if (buttonEvent_down == BUTTONEVENT_DOWN) {
+
+ buttonEvent_down = BUTTONEVENT_NONE;
+#ifdef ENABLE_SPO2
+ displayMode = DISPLAYMODE_SPO2_CONTINUOUS;
+#else
+ displayMode = DISPLAYMODE_TEMP;
+#endif
+ modeUpdated = true;
+ tickCount = 8;
+
+ }
+ break;
+ case DISPLAYMODE_TETHERED:
+
+ // Detect Recording start event
+ if ((recording) && (!recording_old)) {
+
+ recording_old = true;
+ displayMode = DISPLAYMODE_RECORDING;
+
+ tickCount = 8;
+
+ } else
+ // Detect BLE Disconnected Event
+ if (!BLE_Interface_Exists) {
+
+ BLE_Interface_Exists_old = false;
+ display_BLEMode_Active = false;
+ displayMode = DISPLAYMODE_TIME;
+
+ tickCount = 8;
+
+ }
+
+ break;
+
+ case DISPLAYMODE_TETHERED_USB:
+
+ // Detect Recording start event
+ if ((recording) && (!recording_old)) {
+
+ printf("START EVENT");
+ recording_old = recording;
+ displayMode = DISPLAYMODE_RECORDING;
+
+ tickCount = 8;
+
+ } else
+ // Detect USB Disconnected Event
+ if (!USB_Interface_Exists) {
+
+ USB_Interface_Exists_old = false;
+ display_USBMode_Active = false;
+ displayMode = DISPLAYMODE_TIME;
+
+ tickCount = 8;
+
+ }
+
+
+ break;
+
+ case DISPLAYMODE_RECORDING: {
+ // Detect stop recording
+ if ((!recording) && (recording_old)) {
+ printf("STOP EVENT");
+ recording_old = recording;
+ displayMode = DISPLAYMODE_TIME;
+ tickCount = 8;
+ } else {
+ if (buttonEvent_down == BUTTONEVENT_DOWN) {
+ buttonEvent_down = BUTTONEVENT_NONE;
+ displayMode = DISPLAYMODE_RECORDING_STOP;
+ tickCount = 8;
+ }
+ }
+ }
+ break;
+
+ case DISPLAYMODE_RECORDING_STOP: {
+ recordingStopFlag = true;
+ recording = false;
+ recording_old = false;
+ displayMode = DISPLAYMODE_TIME;
+ }
+ break;
+ }
+
+
+
+ /*
+ if ( recording ) {
+
+ if ( ( buttonEvent_down == BUTTONEVENT_DOWN ) && ( !BLE_Interface_Exists ) && ( !USB_Interface_Exists ) ) {
+
+
+ buttonEvent_down = BUTTONEVENT_NONE;
+
+ if ( displayMode == DISPLAYMODE_RECORDING )
+ displayMode = DISPLAYMODE_RECORDING_STOP;
+
+ tickCount = 8;
+ }
+ }
+ else {
+
+ // Handle Up/Down Button press Events
+
+ // Process DOWN Button Press Event
+ if ( ( buttonEvent_down == BUTTONEVENT_DOWN ) && ( !BLE_Interface_Exists ) && ( !USB_Interface_Exists ) ) {
+
+
+ buttonEvent_down = BUTTONEVENT_NONE;
+
+ if ( displayMode > 0)
+ displayMode--;
+ else
+ displayMode = 3;
+
+ tickCount = 8;
+ }
+ else
+ // Process UP Button Press Event
+ if ( ( buttonEvent_up == BUTTONEVENT_UP ) && ( !BLE_Interface_Exists ) && ( !USB_Interface_Exists ) ) {
+
+ if ( displayMode < 3)
+ displayMode++;
+ else
+ displayMode = 0;
+
+ buttonEvent_up = BUTTONEVENT_NONE;
+
+ tickCount = 8;
+ }
+
+
+
+
+
+ // Detect BLE Connected Event
+ if ( ( BLEWasActive == false ) && ( BLE_Interface_Exists ) ) {
+
+ BLEWasActive = true;
+ display_BLEMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED;
+ modeUpdated = true;
+
+ tickCount = 8;
+
+ }
+ else
+ // Detect BLE Disconnected Event
+ if ( ( BLEWasActive == true ) && ( !BLE_Interface_Exists ) ) {
+
+ BLEWasActive = false;
+ display_BLEMode_Active = false;
+ displayMode = DISPLAYMODE_TIME;
+ //should_stop = true;
+ modeUpdated = true;
+
+ tickCount = 8;
+
+ }
+ else
+ // Detect USB Connected Event
+ if ( ( USBWasActive == false ) && ( USB_Interface_Exists ) ) {
+
+ USBWasActive = true;
+ display_USBMode_Active = false;
+ displayMode = DISPLAYMODE_TETHERED_USB;
+ modeUpdated = true;
+
+ tickCount = 8;
+
+ }
+ else
+ // Detect USB Disconnected Event
+ if ( ( USBWasActive == true ) && ( !USB_Interface_Exists ) ) {
+
+ USBWasActive = false;
+ display_USBMode_Active = false;
+ displayMode = DISPLAYMODE_TIME;
+ //should_stop = true;
+ modeUpdated = true;
+
+ tickCount = 8;
+
+ }
+
+ }
+ */
+
+ // Update the display in every 500ms (if necessary)
+ if (tickCount == 0) {
+
+ tickCount = 1;
+
+ if (displayMode_old != displayMode) {
+
+ modeUpdated = true;
+#ifdef ENABLE_SPO2
+ if((displayMode == DISPLAYMODE_SPO2_ONESHOT) || (displayMode == DISPLAYMODE_SPO2_CONTINUOUS))
+ {
+ instant_spo2_percentage=0;
+ }
+#endif
+ }
+
+ //if ( (!display_BLEMode_Active) && (!display_USBMode_Active) ) {
+ btnDown.disable_irq();
+ btnUp.disable_irq(); // Disable Interrupts
+
+
+ if (tickCount_battery <= 0) {
+ m_max20303_->Max20303_BatteryGauge(&batteryLevel);
+ tickCount_battery = BATTERY_GAUGE_COUNT;
+ }
+ tickCount_battery--;
+
+ updateDisplay(batteryLevel);
+
+ btnDown.enable_irq();
+ btnUp.enable_irq(); // Enable Interrupts
+ //}
+
+ displayMode_old = displayMode;
+ }
+
+ }
+}
+
+void WatchInterface::displayOff(bool off)
+{
+ if (off) {
+ // Display Turned Off
+ DisplayPWM.pulsewidth_ms(0);
+ dispDISP = 0;
+ isDisplayOff = true;
+ } else {
+ // Display Turned on
+ DisplayPWM.pulsewidth_ms(8);
+ dispDISP = 1;
+ isDisplayOff = false;
+ }
+}
+
+void WatchInterface::DisplayModeUpdated(){
+ ppg_lcd_count = 0;
+}
+
+void WatchInterface::updateDisplay(int batteryLevelToBeScaled) {
+ char buffer[32];
+ time_t seconds;
+ int hrDisplay_confidenceThreshold;
+ static int hr_timeout;
+
+ // Clear Entire Screen
+ display.cls();
+ display.fill(0, 0, 128, 128, Black);
+
+ // Draw Maxim Integrated Logo
+ display.showBMP((uint8_t*)maxim128Bitmaps, 120, 36, 8, 90);
+
+ if (!bootComplete) {
+ return;
+ }
+
+ // Show BLE logo if it is connected
+
+
+ if (displayMode != DISPLAYMODE_TETHERED_USB) {
+ // Draw battery outline
+ display.fillrect(94, 6, 27, 12, White);
+ display.fillrect(97, 9, 21, 6, Black);
+ display.fillrect(122, 9, 2, 6, White);
+
+ if (batteryLevelToBeScaled < 10) {
+ batteryLevelToBeScaled = 0;
+ } else if (batteryLevelToBeScaled <= 25) {
+ batteryLevelToBeScaled = 1;
+ } else if (batteryLevelToBeScaled <= 50) {
+ batteryLevelToBeScaled = 2;
+ } else if (batteryLevelToBeScaled <= 75) {
+ batteryLevelToBeScaled = 3;
+ } else {
+ batteryLevelToBeScaled = 4;
+ }
+
+ // Draw battery level ticks
+ for (int i = 0 ; i < batteryLevelToBeScaled ; i++) {
+ display.fillrect(99 + (i * 5), 10, 3, 4, White);
+ }
+ }
+
+ // Show BLE logo if it is connected
+ if (BLE_Interface_Exists) {
+ display.showBMP((uint8_t*)BLELogoBitmap, 16, 15, 72, 13);
+ //displayMode = DISPLAYMODE_TETHERED;
+ //BLEWasActive = true;
+ } else {
+ // Show USB logo if it is connected
+ if (USB_Interface_Exists) {
+ display.showBMP((uint8_t*)USBLogoBitmap, 16, 15, 72, 13);
+ //displayMode = DISPLAYMODE_TETHERED_USB;
+ //USBWasActive = true;
+ }
+ }
+
+ display.set_font(UbuntuCondensed20x26);
+ display.locate(3, 10);
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+
+ switch (displayMode) {
+
+ case DISPLAYMODE_RECORDING:
+
+ display.fillrect(8, 46, 27, 23, White);
+ display.fillrect(9, 45, 25, 25, White);
+ display.fillrect(10, 44, 23, 27, White);
+
+ if (ppg_lcd_count == 0) {
+ display.fillellipse(21, 57, 8, 8, (uint16_t) Black);
+ }
+
+ snprintf(buffer, 32, "REC");
+ display.set_font(UbuntuCondensed38x47);
+ display.locate(40, 36);
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+ display.printf(buffer);
+
+
+ ppg_lcd_count++;
+ if (ppg_lcd_count > 1) {
+ ppg_lcd_count = 0;
+ }
+
+ break;
+
+
+ case DISPLAYMODE_RECORDING_STOP:
+ display.printf("CONFIRM");
+ snprintf(buffer, 32, "STOP");
+ display.set_font(UbuntuCondensed38x47);
+ display.locate(5, 36);
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+ display.printf(buffer);
+
+ break;
+
+ case DISPLAYMODE_INFO:
+ display.printf("INFO");
+
+
+ display.set_font(Arial10x10);
+
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+ snprintf(buffer, 32, "BLE MAC:");
+ display.locate(4, 40);
+ display.printf(buffer);
+ snprintf(buffer, 32, "%02X:%02X:%02X:%02X:%02X:%02X", m_mac_addr_[0], m_mac_addr_[1], m_mac_addr_[2], m_mac_addr_[3], m_mac_addr_[4], m_mac_addr_[5]);
+ display.locate(4, 50);
+ display.printf(buffer);
+
+ snprintf(buffer, 32, "FW Version:");
+ display.locate(4, 66);
+ display.printf(buffer);
+
+ snprintf(buffer, 32, "%s", FIRMWARE_VERSION);
+ display.locate(4, 76);
+ display.printf(buffer);
+
+ break;
+
+ case DISPLAYMODE_TIME:
+ display.printf("TIME");
+ seconds = time(NULL);
+ strftime(buffer, 32, "%I:%M", localtime(&seconds));
+ display.set_font(UbuntuCondensed38x47);
+ display.locate(6, 40);
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+ display.printf(buffer);
+ snprintf(buffer, 32, "MAC:%02X:%02X", m_mac_addr_[4], m_mac_addr_[5]);
+ display.set_font(Arial10x10);
+ display.locate(60, 20);
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+ display.printf(buffer);
+
+ while (1) {
+ if (seconds >= 86400) {
+ seconds = seconds % 86400;
+ } else {
+ break;
+ }
+ }
+
+ if (seconds < 43200) {
+ display.showBMP((uint8_t*)AM_Bitmap, 16, 9, 104, 45);
+ } else {
+ display.showBMP((uint8_t*)PM_Bitmap, 16, 9, 104, 45);
+ }
+
+
+ break;
+
+ case DISPLAYMODE_PPG:
+ display.printf("PPG");
+
+ //Blink "MEASURING" for the first 13 seconds (settling time of ppg)
+
+ display.set_font(UbuntuCondensed16x21);
+ display.locate(12, 52);
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+
+ if(ppg_lcd_count<25)
+ {
+ if(ppg_lcd_count & 0x01)
+ {
+ display.printf(" ");
+ }
+ else
+ {
+ display.printf("MEASURING");
+ }
+ }
+
+ //print the heart rate (it is settled now)
+ else {
+ if (ppg_lcd_count > 80) {
+ ppg_lcd_count = 70;
+ }
+
+ display.set_font(UbuntuCondensed38x47);
+ display.locate(8, 40);
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+
+ if (instant_hr_activityClass == ACTD_REST_ACTIVITY) {
+ hrDisplay_confidenceThreshold = ConfThresLevelRest;
+ } else {
+ hrDisplay_confidenceThreshold = ConfThresLevelOther;
+ }
+ if ((instant_hr_conf > hrDisplay_confidenceThreshold) && (instant_hr > kHeartRateLowerLimit) && (instant_hr < kHeartRateUpperLimit)) {
+ display.printf("%d", instant_hr);
+ last_good_hr = instant_hr;
+ hr_timeout = 0;
+ } else {
+ if (hr_timeout < 200) {
+ hr_timeout++;
+ }
+ if (hr_timeout < 12) {
+ display.printf("%d", last_good_hr);
+ } else {
+ display.printf("--");
+ }
+
+ }
+
+ display.set_font(UbuntuCondensed20x26);
+ display.locate(72, 57);
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+ display.printf("BPM");
+ }
+
+ ppg_lcd_count++;
+
+ break;
+#ifdef ENABLE_SPO2
+ case DISPLAYMODE_SPO2_ONESHOT:
+
+ display.printf("SPO2");
+ display.set_font(Arial10x10);
+ display.locate(60,23);
+ display.printf("ONE-SHOT");
+ display.set_font(UbuntuCondensed16x21);
+ display.locate(12,52);
+ display.foreground(Black);
+ display.background(White);
+ if (instant_spo2_percentage != 100 ) {
+ if(ppg_lcd_count & 0x01) {
+ display.printf(" ");
+ } else {
+ if(instant_lowSignalQualityFlag)
+ display.printf("LOWSIGNAL");
+ else
+ display.printf("MEASURING");
+ }
+ } else {
+ if(instant_lowSignalQualityFlag){
+ display.printf("LOWSIGNAL");
+ } else {
+ display.set_font(UbuntuCondensed38x47);
+ display.locate(8,40);
+ display.foreground(Black);
+ display.background(White);
+ display.printf("%d", instant_spo2);
+ display.set_font(UbuntuCondensed20x26);
+ display.locate(72,57);
+ display.foreground(Black);
+ display.background(White);
+ display.printf("%%");
+ }
+ }
+ ppg_lcd_count++;
+
+ break;
+ case DISPLAYMODE_SPO2_CONTINUOUS:
+
+ display.printf("SPO2");
+ display.set_font(Arial10x10);
+ display.locate(60,23);
+ display.printf("NON-STOP");
+ display.set_font(UbuntuCondensed16x21);
+ display.locate(12,52);
+ display.foreground(Black);
+ display.background(White);
+ if (instant_spo2 == 0 ) {
+ if(ppg_lcd_count & 0x01) {
+ display.printf(" ");
+ } else {
+ if(instant_lowSignalQualityFlag)
+ display.printf("LOWSIGNAL");
+ else
+ display.printf("MEASURING");
+ }
+ } else {
+ if(instant_lowSignalQualityFlag){
+ display.printf("LOWSIGNAL");
+ } else {
+ display.set_font(UbuntuCondensed38x47);
+ display.locate(8,40);
+ display.foreground(Black);
+ display.background(White);
+ display.printf("%d", instant_spo2);
+ display.set_font(UbuntuCondensed20x26);
+ display.locate(72,57);
+ display.foreground(Black);
+ display.background(White);
+ display.printf("%%");
+ }
+ }
+ ppg_lcd_count++;
+
+ break;
+#endif
+ case DISPLAYMODE_ECG:
+ display.printf("ECG");
+ display.set_font(UbuntuCondensed38x47);
+ display.locate(8, 40);
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+ display.printf("%d", 70);
+
+ display.set_font(UbuntuCondensed20x26);
+ display.locate(72, 57);
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+ display.printf("BPM");
+
+ break;
+#ifndef ENABLE_SPO2
+ case DISPLAYMODE_TEMP:
+ display.printf("TEMP");
+ display.set_font(UbuntuCondensed38x47);
+ display.locate(8, 40);
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+ display.printf("%2.1f", instant_temp_celsius);
+
+ display.set_font(UbuntuCondensed20x26);
+ display.locate(92, 55);
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+ display.printf("%cC", 127);
+
+
+ break;
+#endif
+ case DISPLAYMODE_TETHERED:
+ display.printf("CONN");
+ display.set_font(UbuntuCondensed38x47);
+ display.locate(30, 40);
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+ display.printf("BLE", 24);
+
+ display_BLEMode_Active = true;
+
+ break;
+
+ case DISPLAYMODE_TETHERED_USB:
+ if (USB_Interface_MSD) {
+ display.printf("MSD");
+ } else {
+ display.printf("CONN");
+ }
+ display.set_font(UbuntuCondensed38x47);
+ display.locate(30, 40);
+ display.foreground((uint16_t)Black);
+ display.background((uint16_t)White);
+ display.printf("USB", 24);
+
+ display_USBMode_Active = true;
+
+ break;
+
+ }
+
+
+ display.showBMP((uint8_t*)maxim128Bitmaps, 120, 36, 8, 90);
+
+
+ if (refreshed) {
+ refreshed = false;
+ display.update(this->refreshCallback);
+ }
+
+
+}
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/WatchInterface.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,190 @@
+/*
+ * WatchInterface.h
+ *
+ * Created on: Aug 28, 2018
+ * Author: Gokhan.Bektas
+ */
+
+#define BATTERY_GAUGE_COUNT 50
+#define BATTERY_CRITICAL_LEVEL 5
+
+
+
+
+#ifndef UTILITIES_WATCHINTERFACE_H_
+#define UTILITIES_WATCHINTERFACE_H_
+#include "mbed.h"
+#include "LS013B7DH03.h"
+#include "version.h"
+#include "BLE_ICARUS.h"
+
+#include "MAX20303.h"
+
+
+ #define DISPLAYMODE_TIME 0
+ #define DISPLAYMODE_PPG 1
+#ifdef ENABLE_SPO2
+ #define DISPLAYMODE_SPO2_ONESHOT 2
+ #define DISPLAYMODE_SPO2_CONTINUOUS 3
+#else
+ #define DISPLAYMODE_TEMP 4
+#endif
+ #define DISPLAYMODE_INFO 5
+ #define DISPLAYMODE_ECG 6
+ #define DISPLAYMODE_TETHERED 7
+ #define DISPLAYMODE_TETHERED_USB 8
+ #define DISPLAYMODE_LOGO 9
+ #define DISPLAYMODE_RECORDING 10
+ #define DISPLAYMODE_RECORDING_STOP 11
+ #define DISPLAYMODE_AFTERBOOT 12
+
+
+typedef enum {
+
+ BUTTONEVENT_NONE,
+ BUTTONEVENT_UP_PRE,
+ BUTTONEVENT_DOWN_PRE,
+ BUTTONEVENT_UP,
+ BUTTONEVENT_DOWN
+
+} Button_Event;
+
+class WatchInterface
+{
+public:
+
+
+ typedef enum {
+ /** No activity, or very light activity. */
+ ACTD_REST_ACTIVITY = 0,
+ /** Non-rhythmic activities that cannot be classified in the other categories. */
+ ACTD_OTHER_ACTIVITY = 1,
+ /** Walking activity. */
+ ACTD_WALK_ACTIVITY = 2,
+ /** Running activity. */
+ ACTD_RUN_ACTIVITY = 3,
+ /** Biking activity. */
+ ACTD_BIKE_ACTIVITY = 4,
+ /** Rhythmic activities that cannot be classified in the other categories. */
+ ACTD_OTHER_RYTHMIC_ACTIVITY = 5,
+ } actd_ActivityClass_te;
+
+
+ typedef enum {
+ BUTTON_PRESSED = 1,
+ BUTTON_RELEASED = 0
+
+ } ButtonStatus;
+
+
+ typedef enum {
+ BUTTON_POWER = 0,
+ BUTTON_UP = 1,
+ BUTTON_DOWN = 2
+
+ } hspButton;
+
+
+ /** Create an Watch Interface controller
+ *
+ * @param buttonUp PinName UP button
+ * @param buttonDown PinName DOWN button
+ * @param buttonPower PinName POWER button
+ */
+ WatchInterface(PinName buttonUp, PinName buttonDown, PinName buttonPower, PinName displayCS, PinName displayEXTCOM, PinName displayDISP, SPI* displaySPI);
+
+ void updateDisplay(int batteryLevelToBeScaled);
+ void execute(void);
+ void displayOff(bool off);
+ void DisplayStatus();
+ void DisplayModeUpdated();
+
+ static void refreshCallback(void);
+
+ unsigned char connection_indicator;
+
+ ButtonStatus getButtonStatus(hspButton button);
+
+ uint16_t heartRate;
+ uint16_t heartRateConfidence;
+ volatile bool BLE_Interface_Exists, BLE_Interface_Exists_old;
+ volatile bool USB_Interface_Exists, USB_Interface_Exists_old;
+ volatile bool USB_Interface_MSD;
+ volatile bool recording, recording_old;
+
+ bool recordingStopFlag;
+
+ volatile bool modeUpdated;
+
+ unsigned char batteryLevel;
+
+ volatile Button_Event buttonEvent_down;
+ volatile Button_Event buttonEvent_up;
+
+ unsigned char displayMode;
+ unsigned char displayMode_old;
+ bool isDisplayOff;
+
+ volatile bool BLEWasActive;
+ volatile bool USBWasActive;
+
+ bool ecg_enabled;
+ bool ppg_enabled;
+
+ bool bootComplete;
+
+ uint16_t last_good_hr;
+ uint16_t instant_hr;
+ uint16_t instant_hr_conf;
+ uint8_t instant_hr_activityClass;
+ float instant_temp_celsius;
+
+ char m_mac_addr_[6];
+
+ MAX20303* m_max20303_;
+
+
+
+protected:
+
+private:
+
+
+
+ //Ticker m_watchInterface_ticker_;
+
+ InterruptIn btnUp;
+ InterruptIn btnDown;
+ DigitalIn btnPower;
+ DigitalOut dispCS;
+ PinName dispEXTCOM;
+ DigitalOut dispDISP;
+
+ PwmOut DisplayPWM;
+
+ Timer interfaceTimer;
+
+ volatile int buttonTimer;
+
+ void isr_buttonup();
+ void isr_buttondown();
+
+ bool display_BLEMode_Active;
+ bool display_USBMode_Active;
+
+ silabs::LS013B7DH03 display;
+
+ unsigned char ppg_lcd_count; //a variable used to print "MEASURING" while the ppg settling
+
+ static bool refreshed;
+
+ static const uint16_t kHeartRateUpperLimit = 240;
+ static const uint16_t kHeartRateLowerLimit = 40;
+ static const uint16_t ConfThresLevelRest = 50;
+ static const uint16_t ConfThresLevelOther = 10;
+
+
+};
+
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/mem_debug.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (C) 2017 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"
+
+#if defined(MBED_MEM_TRACING_ENABLED )
+#include "mbed_mem_trace.h"
+#endif /* MBED_MEM_TRACING_ENABLED */
+
+#if defined(MBED_HEAP_STATS_ENABLED)
+#include "mbed_stats.h"
+#endif /* MBED_HEAP_STATS_ENABLED */
+
+#if defined(MBED_STACK_STATS_ENABLED)
+#include "cmsis_os.h"
+#endif /* MBED_STACK_STATS_ENABLED */
+
+
+void mbed_mem_debug_init()
+{
+#if defined(MBED_MEM_TRACING_ENABLED )
+ mbed_mem_trace_set_callback(mbed_mem_trace_default_callback);
+#endif /* MBED_MEM_TRACING_ENABLED */
+}
+
+#if defined(MBED_HEAP_STATS_ENABLED)
+void mbed_heap_stats(const char* func, int line)
+{
+ mbed_stats_heap_t heap_stats;
+ mbed_stats_heap_get(&heap_stats);
+ printf(" HEAP current: %lu, max: %lu, cumulative: %lu bytes (%s:%d)\n",
+ heap_stats.current_size,
+ heap_stats.max_size,
+ heap_stats.total_size,
+ func, line);
+}
+#endif /* MBED_HEAP_STATS_ENABLED */
+
+#if defined(MBED_STACK_STATS_ENABLED)
+void mbed_stack_stats(const char* func, int line)
+{
+ osThreadId main_id = osThreadGetId();
+
+ osEvent info;
+ info = _osThreadGetInfo(main_id, osThreadInfoStackSize);
+ if (info.status != osOK) {
+ printf("Could not get stack size (%s:%d)\n", func, line);
+ }
+ uint32_t stack_size = (uint32_t)info.value.v;
+ info = _osThreadGetInfo(main_id, osThreadInfoStackMax);
+ if (info.status != osOK) {
+ printf("Could not get max stack (%s:%d)\n", func, line);
+ }
+ uint32_t max_stack = (uint32_t)info.value.v;
+
+ printf(" STACK used: %li, max: %li bytes (%s:%d)\n",
+ max_stack,
+ stack_size,
+ func, line);
+}
+#endif /* MBED_STACK_STATS_ENABLED */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Utilities/mem_debug.h Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright (C) 2017 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 _MEM_DEBUG_H_ +#define _MEM_DEBUG_H_ + +void mbed_mem_debug_init(); +void mbed_heap_stats(const char* func, int line); +void mbed_stack_stats(const char* func, int line); + +#if defined(MBED_HEAP_STATS_ENABLED) +#define SHOW_MBED_HEAP_STATS mbed_heap_stats(__func__, __LINE__) +#else +#define SHOW_MBED_HEAP_STATS +#endif /* MBED_HEAP_STATS_ENABLED */ + +#if defined(MBED_STACK_STATS_ENABLED) +#define SHOW_MBED_STACK_STATS mbed_stack_stats(__func__, __LINE__) +#else +#define SHOW_MBED_STACK_STATS +#endif /* MBED_STACK_STATS_ENABLED */ + +#endif /* MEM_DEBUG */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/mxm_assert.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,56 @@
+/***************************************************************************
+* Copyright (C) 2017 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 __MXM_ASSERT_H__
+#define __MXM_ASSERT_H__
+
+#include "Peripherals.h"
+
+#define mxm_assert(test) \
+{ \
+ if (!(test)) { \
+ pr_err("Assertion (%s:%d)\r\n", __FILE__, __LINE__); \
+ printf("Assertion (%s:%d)\r\n", __FILE__, __LINE__); \
+ while (true) {}; \
+ } \
+}
+
+#define mxm_assert_msg(test, msg) \
+{ \
+ if (!(test)) { \
+ pr_err("Assertion (%s:%d): %s\r\n", __FILE__, __LINE__, #msg); \
+ printf("Assertion (%s:%d): %s\r\n", __FILE__, __LINE__, #msg); \
+ while (true) {}; \
+ } \
+}
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/queue.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,691 @@
+/*******************************************************************************
+* Author: Ismail Kose, Ismail.Kose@maximintegrated.com
+* 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.
+*******************************************************************************
+*/
+
+/*
+ * TODO:
+ * Add a function to enqueue data block instead of one by one.
+ * Write function definitions in the header file as doxygen format
+ * Init function will also allocate memory for queue buffer, providing the buffer will not necessary
+ *
+ * */
+
+#include "queue.h"
+#include "mbed.h"
+#include "Peripherals.h"
+
+int queue_reset(struct queue_t *q)
+{
+ if (!q)
+ return -EINVAL;
+
+ q->wr = q->base;
+ q->rd = q->base;
+ q->num_item = 0;
+ q->ovf_item = 0;
+#ifdef QUEUE_USAGE_STATS
+ q->pop_cnt = 0;
+ q->push_cnt = 0;
+ q->stats_period_cnt = 100; // Default
+#endif
+ return 0;
+}
+
+int queue_update_items_size(struct queue_t *q, int item_size)
+{
+ if (!q)
+ return -EINVAL;
+
+ queue_reset(q);
+ q->item_size = item_size;
+ q->buffer_size = q->max_buffer_size - (q->max_buffer_size % item_size);
+ return 0;
+}
+
+int queue_len(struct queue_t *q)
+{
+ int num_elements;
+
+ if (!q)
+ return -EINVAL;
+
+ num_elements = q->num_item;
+ return num_elements;
+}
+
+
+int queue_init(struct queue_t *q, void *buf, int item_size, int buffer_size)
+{
+ if (!q || !buf)
+ return -EINVAL;
+
+ if (buffer_size % item_size != 0)
+ return -EINVAL; // Padding problem
+
+ q->num_item = 0;
+ q->ovf_item = 0;
+ q->base = (char *)buf;
+ q->wr = (char *)buf;
+ q->rd = (char *)buf;
+ q->item_size = item_size;
+ q->buffer_size = buffer_size;
+ q->max_buffer_size = buffer_size;
+ q->name = NULL;
+
+#ifdef QUEUE_USAGE_STATS
+ q->pop_cnt = 0;
+ q->push_cnt = 0;
+ q->stats_period_cnt = 100; // Default
+#endif
+
+ return 0;
+}
+
+int queue_init_by_name(struct queue_t *q, void *buf, int item_size, int buffer_size, const char *name)
+{
+ int ret = queue_init(q, buf, item_size, buffer_size);
+
+ if (ret < 0)
+ return ret;
+
+ q->name = (char *)name;
+ return 0;
+}
+
+
+void queue_destroy(struct queue_t *q)
+{
+/* TODO: This is placeholder function, double check the implementation */
+ free((void *)q->base);
+ free((void *)q);
+}
+
+int enqueue(struct queue_t *q, void *data)
+{
+ int ret = 0;
+
+ if (!q || !data)
+ return -EINVAL; // Invalid pointer
+
+ if (q->wr == q->rd)
+ ret = (q->num_item != 0) ? -2 : 0; // Is FIFO Full or Empty?
+
+ if (q->wr >= (q->base + q->buffer_size))
+ q->wr = q->base;
+
+ memcpy((void *)q->wr, data, q->item_size);
+ q->wr = q->wr + q->item_size;
+ q->num_item++;
+ int fifo_size = q->buffer_size / q->item_size;
+ if (q->num_item > fifo_size)
+ q->ovf_item = q->num_item - fifo_size;
+ else
+ q->ovf_item = 0;
+ return ret;
+}
+
+int enqueue_test(struct queue_t *q, void *data)
+{
+ if (!q || !data)
+ return -EINVAL; // Invalid pointer
+
+ q->num_item++;
+ return 0;
+}
+
+
+int dequeue_test(struct queue_t *q, void *data)
+{
+ if (!q || !data)
+ return -EINVAL;
+
+ if (q->num_item > 0)
+ q->num_item--;
+ else
+ return -2;
+ return 0;
+}
+
+int dequeue(struct queue_t *q, void *data)
+{
+ int fifo_size = q->buffer_size / q->item_size;
+
+ if (!q || !data)
+ return -EINVAL;
+
+ if (q->num_item <= 0) {
+ return -2;
+ }
+
+ if (q->num_item > fifo_size) {
+ uint32_t curr_rd_off = ((uint32_t)(q->rd - q->base) + q->num_item * q->item_size);
+ q->rd = (q->base + (curr_rd_off % q->buffer_size));
+ q->num_item = fifo_size; // OVF number samples are already gone.
+
+#ifdef QUEUE_USAGE_STATS
+ q->pop_cnt++;
+
+ if ((q->pop_cnt % q->stats_period_cnt) == 0) {
+ if (q->name) {
+ pr_info("%s:%d (%s) - %d samples lost, avail:%d \n",__func__, __LINE__, q->name, q->ovf_item, q->num_item);
+ } else {
+ pr_info("%s:%d - %d samples lost, avail:%d \n", __func__, __LINE__, q->ovf_item, q->num_item);
+ }
+ }
+#endif
+ }
+
+ if (q->rd >= (q->base + q->buffer_size))
+ q->rd = q->base;
+
+ memcpy(data, (void *)q->rd, q->item_size);
+ q->rd = q->rd + q->item_size;
+ q->num_item--;
+ if (q->num_item <= fifo_size)
+ q->ovf_item = 0;
+
+#if defined(QUEUE_DEBUG)
+ do {
+ static int cnt;
+
+ if (cnt++ % 100 == 0) {
+ if (q->name) {
+ pr_debug("%s - $ Fifo size: %d, usage: %d\n", q->name, fifo_size, q->num_item);
+ } else {
+ pr_debug("$ Fifo size: %d, usage: %d\n", fifo_size, q->num_item);
+ }
+ }
+ } while(0);
+#endif
+
+ return 0;
+}
+
+bool queue_is_full(struct queue_t *q)
+{
+ if (!q)
+ return -EINVAL;
+
+ int num_items = q->buffer_size / q->item_size;
+
+
+ if (num_items > q->num_item)
+ return false;
+ return true;
+}
+
+int queue_usage(struct queue_t *q, int *total, int *nm_item)
+{
+ if (!q)
+ return -EINVAL;
+
+ *total = q->buffer_size / q->item_size;
+ *nm_item = q->num_item;
+
+ return 0;
+}
+
+int queue_pop(struct queue_t *q)
+{
+ int fifo_size = q->buffer_size / q->item_size;
+
+ if (!q)
+ return -EINVAL;
+
+ if (q->num_item <= 0) {
+ return -2;
+ }
+
+ if (q->num_item > fifo_size) {
+ uint32_t curr_rd_off = ((uint32_t)(q->rd - q->base) + q->num_item * q->item_size);
+ q->ovf_item = q->num_item - fifo_size;
+ q->rd = q->base + (curr_rd_off % q->buffer_size);
+ q->num_item = fifo_size; // OVF number samples are already gone.
+
+#ifdef QUEUE_USAGE_STATS
+ q->push_cnt++;
+
+ if ((q->push_cnt % q->stats_period_cnt) == 0) {
+ if (q->name) {
+ pr_info("%s:%d (%s) - %d samples lost, avail:%d \n",__func__, __LINE__, q->name, q->ovf_item, q->num_item);
+ } else {
+ pr_info("%s:%d - %d samples lost, avail:%d \n", __func__, __LINE__, q->ovf_item, q->num_item);
+ }
+ }
+#endif
+ } else
+ q->ovf_item = 0;
+
+ if (q->rd >= (q->base + q->buffer_size))
+ q->rd = q->base;
+
+ q->rd = q->rd + q->item_size;
+ q->num_item--;
+
+#if defined(QUEUE_DEBUG)
+ do {
+ static int cnt;
+
+ if (cnt++ % 100 == 0) {
+ if (q->name)
+ pr_debug("%s - $ Fifo size: %d, usage: %d\n", q->name, fifo_size, q->num_item);
+ else
+ pr_debug("$ Fifo size: %d, usage: %d\n", fifo_size, q->num_item);
+ }
+ } while(0);
+#endif
+
+ return 0;
+}
+
+int queue_pop_n(struct queue_t *q, int n)
+{
+ int fifo_size = q->buffer_size / q->item_size;
+
+ if (!q || n < 1)
+ return -EINVAL;
+
+ if (q->num_item < n) {
+ return -2;
+ }
+
+ if (q->num_item > fifo_size) {
+ if (q->name) {
+ pr_info("%s:%d ( %s ) - %d samples lost, avail:%d \n",
+ __func__, __LINE__, q->name, q->num_item - fifo_size, fifo_size);
+ } else {
+ pr_info("%s:%d - %d samples lost, avail:%d \n",
+ __func__, __LINE__, q->num_item - fifo_size, fifo_size);
+ }
+ q->num_item = fifo_size; // OVF number samples are already gone.
+ n = fifo_size;
+ uint32_t curr_rd_off = (uint32_t)(q->rd - q->base) + q->num_item * q->item_size;
+ q->ovf_item = q->num_item - fifo_size;
+ q->rd = q->base + curr_rd_off % q->buffer_size;
+ } else {
+ q->ovf_item = 0;
+ }
+
+ if (q->rd >= (q->base + q->buffer_size))
+ q->rd = q->base;
+
+
+ uint32_t rd_sz = q->item_size * n;
+ uint32_t to_end = (uint32_t)(q->base + q->buffer_size - q->rd);
+ if (to_end < rd_sz) {
+ rd_sz -= to_end;
+ q->rd = q->base;
+ }
+
+ q->rd = q->rd + rd_sz;
+ q->num_item -= n;
+
+ return 0;
+}
+
+int queue_front(struct queue_t *q, void *data)
+{
+#if 0
+ return queue_front_n(q, data, 1);
+#endif
+
+ int fifo_size = q->buffer_size / q->item_size;
+ void *rd = 0;
+
+ if (!q || !data)
+ return -EINVAL;
+
+ if (q->num_item <= 0) {
+ return -2;
+ }
+
+ if (q->num_item > fifo_size) {
+ uint32_t curr_rd_off = (uint32_t)(q->rd - q->base) + q->num_item * q->item_size;
+ rd = q->base + (curr_rd_off % q->buffer_size);
+ if (q->name) {
+ pr_info("%s:%d ( %s )- %d samples lost, avail:%d cap:%d \n",
+ __func__, __LINE__, q->name, q->ovf_item, q->num_item, fifo_size);
+ } else {
+ pr_info("%s:%d - %d samples lost, avail:%d cap:%d \n",
+ __func__, __LINE__, q->ovf_item, q->num_item, fifo_size);
+ }
+ } else {
+ q->ovf_item = 0;
+ rd = q->rd;
+ }
+
+ if (q->rd >= (q->base + q->buffer_size))
+ rd = q->base;
+
+ memcpy(data, (void *)rd, q->item_size);
+ return 0;
+}
+
+int queue_front_n(struct queue_t *q, void *data, int n, int buf_sz)
+{
+ int fifo_size = q->buffer_size / q->item_size;
+ char *rd = 0;
+ char *wr = (char *)data;
+
+ if (!q || !data || n < 1)
+ return -EINVAL;
+
+ if (q->num_item < n) {
+ return -2;
+ }
+
+ if (q->num_item > fifo_size) {
+ if (q->name) {
+ pr_info("\n%s:%d ( %s ) - %d samples lost, avail:%d \n",
+ __func__, __LINE__, q->name, q->num_item - fifo_size, fifo_size);
+ } else {
+ pr_info("\n%s:%d - %d samples lost, avail:%d \n",
+ __func__, __LINE__, q->num_item - fifo_size, fifo_size);
+ }
+ q->num_item = fifo_size;
+ n = fifo_size;
+ uint32_t curr_rd_off = (uint32_t)(q->rd - q->base) + q->num_item * q->item_size;
+ rd = q->base + (curr_rd_off % q->buffer_size);
+ } else {
+ q->ovf_item = 0;
+ rd = q->rd;
+ }
+
+ if (q->rd >= (q->base + q->buffer_size))
+ rd = q->base;
+
+ uint32_t rd_sz = q->item_size * n;
+
+ if (buf_sz < rd_sz) {
+ if (q->name) {
+ pr_info("\n%s:%d ( %s ) - Insufficient buffer size: %d\n",
+ __func__, __LINE__, q->name, buf_sz);
+ } else {
+ pr_info("\n%s:%d - Insufficient buffer size: %d\n",
+ __func__, __LINE__, buf_sz);
+ }
+ return -EINVAL;
+ }
+
+ uint32_t to_end = (uint32_t)(q->base + q->buffer_size - q->rd);
+ if (to_end < rd_sz) {
+ memcpy(wr, rd, to_end);
+ rd_sz -= to_end;
+ rd = q->base;
+ wr += to_end;
+ memcpy(wr, rd, rd_sz);
+
+ } else {
+ memcpy(wr, rd, rd_sz);
+ }
+
+ return 0;
+}
+
+int enqueue_string(struct queue_t *q, char *data, int sz)
+{
+ int ret = 0;
+ int buf_index;
+ char *wr_ptr;
+
+ if (!q || !data || sz <= 0)
+ return -EFAULT; // Invalid parameters
+
+ if (q->wr == q->rd)
+ ret = (q->num_item != 0) ? -2 : 0; // Is FIFO Full or Empty?
+
+ if (q->wr >= (q->base + q->buffer_size))
+ q->wr = q->base;
+
+ if ((q->num_item + sz) > q->buffer_size) {
+#if defined(QUEUE_DEBUG)
+ {
+ char buf[128];
+ int len;
+
+ if (q->name)
+ len = sprintf(buf, "\r\n**** %s - ( %s ) - Fifo is full. num_item: %d, sz: %d, buffer size: %d\r\n",
+ __func__, q->name, q->num_item, sz, q->buffer_size);
+ else
+ len = sprintf(buf, "\r\n**** %s - Fifo is full. num_item: %d, sz: %d, buffer size: %d\r\n",
+ __func__, q->num_item, sz, q->buffer_size);
+
+ UART_Write(UART_PORT, (uint8_t*)buf, len);
+ }
+#endif
+ return -ENOMEM;
+ }
+
+ buf_index = (uint32_t)(q->wr - q->base);
+ wr_ptr = q->base;
+ q->num_item += sz;
+ while(sz--)
+ wr_ptr[buf_index++ % q->buffer_size] = *data++;
+
+ q->wr = q->base + buf_index % q->buffer_size;
+ return ret;
+}
+
+int dequeue_string(struct queue_t *q, char *buf, int buffer_size)
+{
+ char *rd_ptr;
+ int buf_index;
+ int len;
+
+ if (!q || !buf || buffer_size <= 0)
+ return -EFAULT;
+
+ if (q->num_item <= 0) {
+ return -EPERM;
+ }
+
+ rd_ptr = (char *)q->base;
+ buf_index = (uint32_t)(q->rd - q->base);
+ len = q->num_item;
+
+ while (buffer_size-- && q->num_item--) {
+ char tmp = rd_ptr[buf_index % q->buffer_size];
+ rd_ptr[buf_index % q->buffer_size] = 0; // Remove this later on
+ buf_index++;
+ *buf++ = tmp;
+ if (tmp == '\0')
+ break;
+ }
+
+ if (q->num_item < 0) {
+ /* Data corruption in FIFO */
+ q->num_item = 0;
+ } else
+ len -= q->num_item;
+
+ q->rd = q->base + buf_index % q->buffer_size;
+
+ return len;
+}
+
+int queue_str_len(struct queue_t *q)
+{
+ char *rd_ptr;
+ int buf_index;
+ int len, i;
+
+ if (!q)
+ return -EFAULT;
+
+ if (q->num_item <= 0) {
+ return 0;
+ }
+
+ rd_ptr = q->base;
+ buf_index = (uint32_t)(q->rd - q->base);
+ i = q->num_item;
+ len = 0;
+
+ while (i--) {
+ char tmp = rd_ptr[buf_index % q->buffer_size];
+ buf_index++;
+ if (tmp == '\0')
+ break;
+ len++;
+ }
+
+ return len;
+}
+
+#if 0
+void queue_test(void)
+{
+ int ret;
+ ppg_data_t ppg_test = { 0, };
+ ppg_data_t ppg_test_out = { 0, };
+ int i, j, ii, jj;
+ static ppg_data_t ppg_data[10];
+ static queue_t queue;
+
+ srand((unsigned)time(NULL));
+ ret = queue_init(&queue, &ppg_data, sizeof(ppg_data_t), sizeof(ppg_data));
+ while (1) {
+ ii = rand() % 20;
+ for (i = 0; i < ii; i++) {
+ /* Test data */
+ ppg_test.timestamp++;
+ ppg_test.ir++;
+ ppg_test.red++;
+ ppg_test.green++;
+ /* Test functions */
+ ret = enqueue(&queue, &ppg_test);
+ }
+ jj = rand() % 20;
+ for (j = 0; j < jj; j++) {
+ ret = dequeue(&queue, &ppg_test_out);
+ }
+ }
+}
+#endif
+void queue_n_test(void)
+{
+ struct queue_t q;
+ uint8_t buf[5];
+ uint8_t peek_buf[5];
+ int error;
+ int i;
+ error = queue_init(&q, &buf[0], 1, sizeof(buf));
+ if (error)
+ printf("queue_init error :(\r\n");
+
+ uint8_t val = 0;
+ enqueue(&q, &val);
+ val = 1;
+ enqueue(&q, &val);
+ val = 2;
+ enqueue(&q, &val);
+ val = 3;
+ enqueue(&q, &val);
+ val = 4;
+ enqueue(&q, &val);
+
+ printf("enqueued 0,1,2,3,4\r\n");
+
+ error = queue_front_n(&q, &peek_buf, 5, sizeof(peek_buf));
+ if (error) {
+ printf("queue_front_n n=5 error :(\r\n");
+ } else {
+ printf("queue_front_n n=5: ");
+ for (i = 0; i < 5; i++) {
+ printf("%d ", peek_buf[i]);
+ }
+ printf("\r\n");
+ }
+
+ error = queue_front_n(&q, &peek_buf, 6, sizeof(peek_buf));
+ if (error)
+ printf("queue_front_n n=6 error :)\r\n");
+ else
+ printf("queue_front_n n=6 succeeded :(\r\n");
+
+ error = queue_pop_n(&q, 2);
+ if (error)
+ printf("queue_pop_n n=2 error :(\r\n");
+ else
+ printf("queue_pop_n n=2 succeeded :)\r\n");
+
+ error = queue_front_n(&q, &peek_buf, 5, sizeof(peek_buf));
+ if (error)
+ printf("queue_front_n n=5 error :)\r\n");
+
+ error = queue_front_n(&q, &peek_buf, 3, sizeof(peek_buf));
+ if (error) {
+ printf("queue_front_n n=3 error :(\r\n");
+ } else {
+ printf("queue_front_n n=3: ");
+ for (i = 0; i < 3; i++) {
+ printf("%d ", peek_buf[i]);
+ }
+ printf("\r\n");
+ }
+
+ val = 0;
+ enqueue(&q, &val);
+ val = 1;
+ enqueue(&q, &val);
+
+ printf("enqueued 0,1\r\n");
+
+ error = queue_front_n(&q, &peek_buf, 5, sizeof(peek_buf));
+ if (error) {
+ printf("queue_front_n n=5 error :(\r\n");
+ } else {
+ printf("queue_front_n n=5: ");
+ for (i = 0; i < 5; i++) {
+ printf("%d ", peek_buf[i]);
+ }
+ printf("\r\n");
+ }
+
+ error = queue_pop_n(&q, 4);
+ if (error)
+ printf("queue_pop_n n=4 error :(\r\n");
+ else
+ printf("queue_pop_n n=4 succeeded :)\r\n");
+
+ error = queue_front_n(&q, &peek_buf, 1, sizeof(peek_buf));
+ if (error) {
+ printf("queue_front_n n=1 error :(\r\n");
+ } else {
+ printf("queue_front_n n=1: ");
+ for (i = 0; i < 1; i++) {
+ printf("%d ", peek_buf[i]);
+ }
+ printf("\r\n");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/queue.h Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,288 @@
+/*******************************************************************************
+* Author: Ismail Kose, Ismail.Kose@maximintegrated.com
+* 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 _QUEUE_H_
+#define _QUEUE_H_
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <errno.h>
+
+#ifndef UNIT_TEST
+#include "platform.h"
+#else
+#ifndef enter_critical_section
+#define enter_critical_section()
+#endif
+
+#ifndef exit_critical_section
+#define exit_critical_section()
+#endif
+
+#ifndef pr_info
+#define pr_info(...) printf(__VA_ARGS__)
+#endif
+#endif
+
+#define QUEUE_USAGE_STATS
+
+struct queue_t {
+ char *wr; // write pointer
+ char *rd; // read pointer
+ char *base; // buffer base pointer
+ int num_item; // number of data item
+ int ovf_item; // Number of overflowed data
+ int buffer_size; // buffer size in bytes
+ int max_buffer_size; // buffer size in bytes
+ int item_size; // data size
+ char *name;
+#ifdef QUEUE_USAGE_STATS
+ int pop_cnt;
+ int push_cnt;
+ int stats_period_cnt;
+#endif
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief Queue initialization.
+ * @param[in] *q Points to the queue handle
+ * @param[in] *buf Points to external queue buffer
+ * @param[in] item_size Data size
+ * @param[in] buffer_size Total buffer size in bytes
+ * @param[out] *pDst points to output matrix structure
+ * @return The function returns 0: success
+ * -EINVAL (-22): Invalid Pointer, data or parameters
+ * -2: Queue buffer is full, no more space
+ **/
+int queue_init(struct queue_t *q, void *buf, int item_size, int buffer_size);
+
+
+
+/**
+ * @brief Queue initialization by name.
+ * @param[in] *q Points to the queue handle
+ * @param[in] *buf Points to external queue buffer
+ * @param[in] item_size Data size
+ * @param[in] buffer_size Total buffer size in bytes
+ * @param[out] *pDst points to output matrix structure
+ * @param[in] Set queue name for debugging
+ * @return The function returns 0: success
+ * -EINVAL (-22): Invalid Pointer, data or parameters
+ * -2: Queue buffer is full, no more space
+ **/
+int queue_init_by_name(struct queue_t *q, void *buf, int item_size, int buffer_size, const char *name);
+
+
+
+/**
+ * @brief Reset queue
+ * @param[in] *q Points to the queue handle
+ * @param[in] *data Points to any type of data to put FIFO
+ * @param[out] *pDst Points to output matrix structure
+ * @return The function returns 0: success
+ * -EINVAL (-22): Invalid Pointer
+ *
+ **/
+int queue_reset(struct queue_t *q);
+
+
+
+/**
+ * @brief Update item size and reset queue. Usign of this command requires exta cauion.
+ * @param[in] *q Points to the queue handle
+ * @return The function returns 0: success
+ * -EINVAL (-22): Invalid Pointer
+ *
+ **/
+int queue_update_items_size(struct queue_t *q, int item_size);
+
+
+
+/**
+ * @brief Data enqueue.
+ * @param[in] *q points to the queue handle
+ * @param[in] *data points to any type of data to put FIFO
+ * @return The function returns 0: success
+ * -EINVAL (-22): Invalid Pointer
+ * -2: Queue buffer is full, no more space
+ **/
+int enqueue(struct queue_t *q, void *data);
+
+
+
+/**
+ * @brief Data dequeue.
+ * @param[in] *q points to the queue handle
+ * @param[in] *data points to any type of data to put FIFO
+ * @param[out] *data pop data from Queue
+ * @return The function returns 0: success
+ * -EINVAL (-22): Invalid Pointer or data
+ * -2: Queue buffer is empty
+ **/
+int dequeue(struct queue_t *q, void *data);
+
+
+
+/**
+ * @brief Queue Destroy
+ * @param[in] *q points to the queue handle
+ **/
+void queue_destroy(struct queue_t *q);
+
+
+
+/**
+ * @brief Number of elements in Queue
+ * @param[in] *q points to the queue handle
+ * @return number of elements
+ **/
+int queue_len(struct queue_t *q);
+
+
+
+/**
+ * @brief Copies an item from the front of queue to data, but does not remove it from queue
+ * @param[in] *q points to the queue handle
+ * @param[out] Copy of item from front of the queue
+ * @return if value is greater than 0, return value is number of elements.
+ If value is less than 0, returns -EINVAL (-22)
+ **/
+int queue_front(struct queue_t *q, void *data);
+
+
+
+/**
+ * @brief Copies n items from the front of the queue, but does not remove them
+ * @param[in] *q - points to the queue handle
+ * @param[out] *data - The buffer to hold copied data
+ * @param[in] n - the number of items to remove
+ * @param[in] buf_sz - input *data buffer size
+ * @return 0: success
+ * -EINVAL (-22): Invalid pointer
+ * -2: Queue contains less than n items
+ */
+int queue_front_n(struct queue_t *q, void *data, int n, int buf_sz);
+
+
+
+/**
+ * @brief Removes an item from front of queue
+ * @param[in] *q points to the queue handle
+ * @return status, success or fail
+ **/
+int queue_pop(struct queue_t *q);
+
+/**
+ * @brief Removes n items from the front of the queue
+ * @param[in] *q - points to the queue handle
+ * @param[in] n - the number of items to remove
+ * @return 0: success
+ * -EINVAL (-22): Invalid pointer
+ * -2: Queue contains less than n items
+ */
+int queue_pop_n(struct queue_t *q, int n);
+
+
+
+/**
+ * @brief Checks if queue is fill
+ * @param[in] *q points to the queue handle
+ * @return true (full), false (not full)
+ *
+ **/
+bool queue_is_full(struct queue_t *q);
+
+
+
+/**
+ * @brief returns fifo usage info
+ * @param[in] *q points to the queue handle
+ * @param[out] *total returns total FIFO size in number of elements
+ * @param[out] *nm_item returns number of elements in FIFO
+ * @return status, success or fail
+ * -EINVAL (-22): Invalid Pointer, data or parameters
+ **/
+int queue_usage(struct queue_t *q, int *total, int *nm_item);
+
+
+
+/**
+ * @brief Pops out delimiter terminated string
+ * @param[in] *q points to the queue handle
+ * @param[out] *buf output char array to write
+ * @param[in] buffer_size Maximum buffer size to write the output char array
+ * @return status, string length if positive or fail if negative
+ * -EINVAL (-22): Invalid Pointer, data or parameters
+ **/
+int dequeue_string(struct queue_t *q, char *buf, int buffer_size);
+
+
+
+/**
+ * @brief Pushes null terminated string (char array)
+ * @param[in] *q points to the queue handle
+ * @param[in] *data string(char array) to add it to the circullar buffer
+ * @param[in] sz 'data' length
+ * @return status, success or fail
+ * -EINVAL (-22): Invalid Pointer, data or parameters
+ **/
+int enqueue_string(struct queue_t *q, char *data, int sz);
+
+
+/**
+ * @brief Counts length of string in queue
+ * @param[in] *q points to the queue handle
+ * @return status, success or fail
+ * -EINVAL (-22): Invalid Pointer, data or parameters
+ * if ret >= 0, string length
+ **/
+int queue_str_len(struct queue_t *q);
+
+
+
+void queue_n_test(void);
+
+int enqueue_test(struct queue_t *q, void *data);
+int dequeue_test(struct queue_t *q, void *data);
+
+#ifdef __cplusplus
+}
+#endif
+#endif //_QUEUE_H_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/utils.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,224 @@
+/***************************************************************************
+* Copyright (C) 2017 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 "utils.h"
+#include <ctype.h>
+#include "Peripherals.h"
+
+/*
+ * @brief Parse DeviceStudio get_reg command
+ * @details format is "get_reg <type> <addr>"
+ *
+ * @return 0 on success, -1 on failure
+ */
+int parse_get_reg_cmd(const char* str, const char* dev_type, uint8_t* addr)
+{
+ const char* num_start = str + strlen("get_reg") + strlen(dev_type) + 2;
+ unsigned int addr32;
+
+ int num_found = sscanf(num_start, "%x", &addr32);
+ if (num_found == 1) {
+ *addr = (uint8_t)addr32;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+/*
+ * @brief Parse DeviceStudio set_reg command
+ * @details format is "set_reg <type> <addr> <val>"
+ *
+ * @return 0 on success, -1 on failure
+ */
+int parse_set_reg_cmd(const char* str, const char* dev_type, uint8_t* addr, uint8_t* val)
+{
+ const char* num_start = str + strlen("set_reg") + strlen(dev_type) + 2;
+ unsigned int addr32, val32;
+
+ int num_found = sscanf(num_start, "%x %x", &addr32, &val32);
+ if (num_found == 2) {
+ *addr = (uint8_t)addr32;
+ *val = (uint8_t)val32;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+int parse_set_reg_cmd(const char* str, const char* dev_type, uint8_t* addr, uint16_t* val)
+{
+ const char* num_start = str + strlen("set_reg") + strlen(dev_type) + 2;
+ unsigned int addr32, val32;
+
+ int num_found = sscanf(num_start, "%x %x", &addr32, &val32);
+ if (num_found == 2) {
+ *addr = (uint8_t)addr32;
+ *val = (uint16_t)val32;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+int parse_set_reg_cmd(const char* str, const char* dev_type, uint8_t* addr, uint32_t* val)
+{
+ const char* num_start = str + strlen("set_reg") + strlen(dev_type) + 2;
+ unsigned int addr32, val32;
+
+ int num_found = sscanf(num_start, "%x %x", &addr32, &val32);
+ if (num_found == 2) {
+ *addr = (uint8_t)addr32;
+ *val = val32;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+/// TODO: additional for float
+/*
+int parse_cmd_data(const char* str, const char* cmd, float *vals, int vals_sz, bool hex)
+{
+ const char* sptr = str + strlen(cmd);
+ int found = 0;
+ int ssfound;
+ unsigned int val32;
+
+ while (found < vals_sz) {
+ while (*sptr != ' ' && *sptr != '\0') { sptr++; }
+ if (*sptr == '\0')
+ break;
+ sptr++;
+
+ if (hex)
+ ssfound = sscanf(sptr, "%x", &val32);
+ else
+ ssfound = sscanf(sptr, "%d", &val32);
+ if (ssfound != 1)
+ break;
+ *(vals + found) = (uint8_t)val32;
+ found++;
+ }
+
+ return found;
+}
+*/
+int parse_cmd_data(const char* str, const char* cmd, uint8_t *vals, int vals_sz, bool hex)
+{
+ const char* sptr = str + strlen(cmd);
+ int found = 0;
+ int ssfound;
+ unsigned int val32;
+
+ while (found < vals_sz) {
+ while (*sptr != ' ' && *sptr != '\0') { sptr++; }
+ if (*sptr == '\0')
+ break;
+ sptr++;
+
+ if (hex)
+ ssfound = sscanf(sptr, "%x", &val32);
+ else
+ ssfound = sscanf(sptr, "%d", &val32);
+ if (ssfound != 1)
+ break;
+ *(vals + found) = (uint8_t)val32;
+ found++;
+ }
+
+ return found;
+}
+
+int parse_cmd_data(const char* str, const char* cmd, uint16_t *vals, int vals_sz, bool hex)
+{
+ const char* sptr = str + strlen(cmd);
+ int found = 0;
+ int ssfound;
+ unsigned int val32;
+
+ while (found < vals_sz) {
+ while (*sptr != ' ' && *sptr != '\0') { sptr++; }
+ if (*sptr == '\0')
+ break;
+ sptr++;
+
+ if (hex)
+ ssfound = sscanf(sptr, "%x", &val32);
+ else
+ ssfound = sscanf(sptr, "%d", &val32);
+ if (ssfound != 1)
+ break;
+ *(vals + found) = (uint16_t)val32;
+ found++;
+ }
+
+ return found;
+}
+
+int parse_cmd_data(const char* str, const char* cmd, uint32_t *vals, int vals_sz, bool hex)
+{
+ const char* sptr = str + strlen(cmd);
+ int found = 0;
+ int ssfound;
+
+ while (found < vals_sz) {
+ while (*sptr != ' ' && *sptr != '\0') { sptr++; }
+ if (*sptr == '\0')
+ break;
+ sptr++;
+
+ if (hex)
+ ssfound = sscanf(sptr, "%x", vals + found);
+ else
+ ssfound = sscanf(sptr, "%d", vals + found);
+ if (ssfound != 1)
+ break;
+ found++;
+ }
+
+ return found;
+}
+
+bool starts_with(const char* str1, const char* str2)
+{
+ while (*str1 && *str2) {
+ if (*str1 != *str2)
+ return false;
+ str1++;
+ str2++;
+ }
+
+ if (*str2)
+ return false;
+
+ return true;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Utilities/utils.h Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,101 @@ + /*************************************************************************** + * Copyright (C) 2017 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 __UTILS__H_ +#include <mbed.h> + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0])) +#endif + +/* + * @brief Parse DeviceStudio get_reg command + * @details format is "get_reg <type> <addr>" + * + * @param[in] str - Pointer to start of command + * @param[in] dev_type - device type, ie "ppg" + * @param[in] addr - Parsed address + * + * @return 0 on success, -1 on failure + */ +int parse_get_reg_cmd(const char* str, const char* dev_type, uint8_t* addr); + +/* + * @brief Parse DeviceStudio set_reg command + * @details format is "set_reg <type> <addr> <val>" + * + * @param[in] str - Pointer to start of command + * @param[in] dev_type - device type, ie "ppg" + * @param[in] addr - Parsed address + * @param[in] val - Parsed value + * + * @return 0 on success, -1 on failure + */ +int parse_set_reg_cmd(const char* str, const char* dev_type, uint8_t* addr, uint8_t* val); +int parse_set_reg_cmd(const char* str, const char* dev_type, uint8_t* addr, uint16_t* val); +int parse_set_reg_cmd(const char* str, const char* dev_type, uint8_t* addr, uint32_t* val); + +/* + * @brief Parse data values sent by DeviceStudio command + * @details For a command format of "<cmd> <val1> <val2> ... <valN>", + * This command will parse val1 - valN into vals array + * + * @param[in] str - The full string received + * @param[in] cmd - The command only + * @param[out] vals - The output array of values + * @param[in] vals_sz - The maximum number of values the output array vals can hold + * @param[in] hex - Set to true for hexidecimal values, false for decimal + * + * @return -1 on error, otherwise the number of values parsed + */ +int parse_cmd_data(const char* str, const char* cmd, uint8_t *vals, int vals_sz, bool hex); +int parse_cmd_data(const char* str, const char* cmd, uint16_t *vals, int vals_sz, bool hex); +int parse_cmd_data(const char* str, const char* cmd, uint32_t *vals, int vals_sz, bool hex); + +/* + * @brief Determine if str2 is a substring of str1 beginning at idx 0 + * + * @param[in] str1 - The parent string + * @param[in] str2 - The substring which should exist starting at index 0 of str1 + * + * @return true if str1 starts with str2 + * + * Examples: + * str1 = "An apple", str2 = "An a", returns true + * str1 = "A dog", str2 = "A a", returns false + * str1 = "An apple", str2 = "An apple tree", returns false + */ +bool starts_with(const char* str1, const char* str2); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/build_version.h Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,5 @@ +#ifndef __BUILD_VERSION_H__ +#define __BUILD_VERSION_H__ +#define BUILD_SOURCE_BRANCH "HEAD" +#define BUILD_SOURCE_HASH "c0a9ad8d3fa420b7d4e62190fe7832376c9afd3b" +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/debug_oldmbedos.json Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,44 @@
+{
+ "GCC_ARM": {
+ "common": ["-c", "-Wall", "-Wextra",
+ "-Wno-unused-parameter", "-Wno-missing-field-initializers",
+ "-fmessage-length=0", "-fno-exceptions", "-fno-builtin",
+ "-ffunction-sections", "-fdata-sections", "-funsigned-char",
+ "-MMD", "-fno-delete-null-pointer-checks",
+ "-fomit-frame-pointer", "-O0", "-g3"],
+ "asm": ["-x", "assembler-with-cpp"],
+ "c": ["-std=gnu99"],
+ "cxx": ["-std=gnu++98", "-fno-rtti", "-Wvla"],
+ "ld": ["-Wl,--gc-sections", "-Wl,--wrap,main", "-Wl,--wrap,_malloc_r",
+ "-Wl,--wrap,_free_r", "-Wl,--wrap,_realloc_r",
+ "-Wl,--wrap,_calloc_r", "-Wl,--wrap,exit", "-Wl,--wrap,atexit"]
+ },
+ "ARM": {
+ "common": ["-c", "--gnu", "-Otime", "--split_sections",
+ "--apcs=interwork", "--brief_diagnostics", "--restrict",
+ "--multibyte_chars", "-O0", "-g"],
+ "asm": [],
+ "c": ["--md", "--no_depend_system_headers", "--c99", "-D__ASSERT_MSG"],
+ "cxx": ["--cpp", "--no_rtti", "--no_vla"],
+ "ld": []
+ },
+ "uARM": {
+ "common": ["-c", "--gnu", "-Otime", "--split_sections",
+ "--apcs=interwork", "--brief_diagnostics", "--restrict",
+ "--multibyte_chars", "-O0", "-D__MICROLIB", "-g",
+ "--library_type=microlib", "-DMBED_RTOS_SINGLE_THREAD"],
+ "asm": [],
+ "c": ["--md", "--no_depend_system_headers", "--c99", "-D__ASSERT_MSG"],
+ "cxx": ["--cpp", "--no_rtti", "--no_vla"],
+ "ld": ["--library_type=microlib"]
+ },
+ "IAR": {
+ "common": [
+ "--no_wrap_diagnostics", "-e",
+ "--diag_suppress=Pa050,Pa084,Pa093,Pa082", "-On", "-r"],
+ "asm": [],
+ "c": ["--vla"],
+ "cxx": ["--guard_calls", "--no_static_destruction"],
+ "ld": ["--skip_dynamic_initialization", "--threaded_lib"]
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doxygen.conf Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,332 @@ +# Doxyfile 1.8.13 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = "wearables_MBED" +PROJECT_NUMBER = $(PROJECT_SCM_HASH) +PROJECT_BRIEF = +PROJECT_LOGO = +OUTPUT_DIRECTORY = BUILD/doc +CREATE_SUBDIRS = NO +ALLOW_UNICODE_NAMES = NO +OUTPUT_LANGUAGE = English +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +QT_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 4 +ALIASES = +TCL_SUBST = +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +EXTENSION_MAPPING = +MARKDOWN_SUPPORT = YES +TOC_INCLUDE_HEADINGS = 0 +AUTOLINK_SUPPORT = YES +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +GROUP_NESTED_COMPOUNDS = NO +SUBGROUPING = YES +INLINE_GROUPED_CLASSES = NO +INLINE_SIMPLE_STRUCTS = NO +TYPEDEF_HIDES_STRUCT = NO +LOOKUP_CACHE_SIZE = 0 +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_PACKAGE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = NO +HIDE_SCOPE_NAMES = YES +HIDE_COMPOUND_REFERENCE= NO +SHOW_INCLUDE_FILES = YES +SHOW_GROUPED_MEMB_INC = NO +FORCE_LOCAL_INCLUDES = NO +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_MEMBERS_CTORS_1ST = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +STRICT_PROTO_MATCHING = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +CITE_BIB_FILES = +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_AS_ERROR = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = $(PROJECT_SOURCES) +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = *.h \ + *.cpp +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +FILTER_SOURCE_PATTERNS = +USE_MDFILE_AS_MAINPAGE = +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = YES +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = YES +SOURCE_TOOLTIPS = YES +USE_HTAGS = NO +VERBATIM_HEADERS = YES +CLANG_ASSISTED_PARSING = NO +CLANG_OPTIONS = +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_EXTRA_STYLESHEET = +HTML_EXTRA_FILES = +HTML_COLORSTYLE_HUE = 220 +HTML_COLORSTYLE_SAT = 100 +HTML_COLORSTYLE_GAMMA = 80 +HTML_TIMESTAMP = NO +HTML_DYNAMIC_SECTIONS = NO +HTML_INDEX_NUM_ENTRIES = 100 +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_NAME = Publisher +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +CHM_INDEX_ENCODING = +BINARY_TOC = NO +TOC_EXPAND = NO +GENERATE_QHP = NO +QCH_FILE = +QHP_NAMESPACE = org.doxygen.Project +QHP_VIRTUAL_FOLDER = doc +QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = +QHG_LOCATION = +GENERATE_ECLIPSEHELP = NO +ECLIPSE_DOC_ID = org.doxygen.Project +DISABLE_INDEX = NO +GENERATE_TREEVIEW = YES +ENUM_VALUES_PER_LINE = 4 +TREEVIEW_WIDTH = 250 +EXT_LINKS_IN_WINDOW = NO +FORMULA_FONTSIZE = 10 +FORMULA_TRANSPARENT = YES +USE_MATHJAX = NO +MATHJAX_FORMAT = HTML-CSS +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest +MATHJAX_EXTENSIONS = +MATHJAX_CODEFILE = +SEARCHENGINE = NO +SERVER_BASED_SEARCH = NO +EXTERNAL_SEARCH = NO +SEARCHENGINE_URL = +SEARCHDATA_FILE = searchdata.xml +EXTERNAL_SEARCH_ID = +EXTRA_SEARCH_MAPPINGS = +#--------------------------------------------------------------------------- +# Configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4 +EXTRA_PACKAGES = +LATEX_HEADER = +LATEX_FOOTER = +LATEX_EXTRA_STYLESHEET = +LATEX_EXTRA_FILES = +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +LATEX_SOURCE_CODE = NO +LATEX_BIB_STYLE = plain +LATEX_TIMESTAMP = NO +#--------------------------------------------------------------------------- +# Configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +RTF_SOURCE_CODE = NO +#--------------------------------------------------------------------------- +# Configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_SUBDIR = +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# Configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# Configuration options related to the DOCBOOK output +#--------------------------------------------------------------------------- +GENERATE_DOCBOOK = NO +DOCBOOK_OUTPUT = docbook +DOCBOOK_PROGRAMLISTING = NO +#--------------------------------------------------------------------------- +# Configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# Configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration options related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +EXTERNAL_PAGES = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +MSCGEN_PATH = +DIA_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +DOT_NUM_THREADS = 0 +DOT_FONTNAME = Helvetica +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +UML_LIMIT_NUM_FIELDS = 10 +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +INTERACTIVE_SVG = NO +DOT_PATH = +DOTFILE_DIRS = +MSCFILE_DIRS = +DIAFILE_DIRS = +PLANTUML_JAR_PATH = +PLANTUML_CFG_FILE = +PLANTUML_INCLUDE_PATH = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES \ No newline at end of file
--- a/main.cpp Wed Apr 10 11:51:07 2019 +0000
+++ b/main.cpp Wed Apr 10 14:56:25 2019 +0300
@@ -1,2 +1,546 @@
+#include "mbed.h"
+#include "USBSerial.h"
+#include "version.h"
+#include "DSInterface.h"
+#include "Peripherals.h"
+#include "usb_regs.h"
-#include "mbed.h"
\ No newline at end of file
+#define GPIO_PRIOINVERSION_MASK NVIC_SetPriority(GPIO_P0_IRQn, 5); \
+ NVIC_SetPriority(GPIO_P1_IRQn, 5); \
+ NVIC_SetPriority(GPIO_P2_IRQn, 5); \
+ NVIC_SetPriority(GPIO_P3_IRQn, 5); \
+ NVIC_SetPriority(GPIO_P4_IRQn, 5); \
+ NVIC_SetPriority(GPIO_P5_IRQn, 5); \
+ NVIC_SetPriority(GPIO_P6_IRQn, 5);
+
+
+#if defined(MBED_MEM_TRACING_ENABLED)
+#include "mbed_mem_trace.h"
+#endif /* MBED_MEM_TRACING_ENABLED */
+
+#if defined(MBED_HEAP_STATS_ENABLED)
+#include "mbed_stats.h"
+#endif /* MBED_HEAP_STATS_ENABLED */
+
+#if defined(MBED_STACK_STATS_ENABLED)
+#include "cmsis_os.h"
+#endif /* MBED_STACK_STATS_ENABLED */
+
+
+
+
+
+//
+// BOARD
+//
+#include "max32630hsp.h"
+DigitalIn button(P6_5);
+InterruptIn interruptIn_PowerButton(P7_6);
+MAX32630HSP icarus(MAX32630HSP::VIO_1V8, &interruptIn_PowerButton);
+
+//
+// LED
+//
+#include "LEDStatus.h"
+LEDStatus ledStatus(LED1, LED_ON, LED2, LED_ON, LED3, LED_OFF);
+
+// Virtual serial port over USB
+USBSerial microUSB(0x1f00, 0x2012, 0x0001, false);
+#define IS_USB_HOST_CONNECTED() ((uint8_t)((MXC_USB->dev_intfl & MXC_F_USB_DEV_INTFL_VBUS_ST) >> MXC_F_USB_DEV_INTFL_VBUS_ST_POS))
+
+//
+// DS INTERFACE. COMMAND IN DATA OUT POINT FOR HOST. ROOF INTERFACE TO ALL SUB MODULES
+//
+DSInterface dsInterface(µUSB);
+
+//
+// BLE
+//
+#include "BLE.h"
+#include "BLE_ICARUS.h"
+#ifdef ENABLE_BLETEST_COMM
+#include "BleTestComm.h"
+BleTestComm bleTestComm(µUSB);
+#endif
+
+
+
+
+//
+// DISPLAY INTERFACE.
+//
+#include "LS013B7DH03.h"
+#include "mbed_logo.h"
+SPI displaySPI(P0_5, P0_6, P0_4, NC);
+
+#include "WatchInterface.h"
+#define PIN_BUTTON_UP P2_3
+#define PIN_BUTTON_DOWN P6_5
+#define PIN_BUTTON_PWR P7_6
+#define PIN_displayCS P0_7
+#define PIN_displayEXTCOM P6_4
+#define PIN_displayDISP P6_6
+WatchInterface watchInterface(PIN_BUTTON_UP, PIN_BUTTON_DOWN, PIN_BUTTON_PWR, PIN_displayCS, PIN_displayEXTCOM, PIN_displayDISP, &displaySPI);
+
+
+//
+// HOST ACCELEROMETER.
+//
+#include "bmi160.h"
+//#include "C:\Users\mehmet.gok\Desktop\DEV\BPTDEMO\wearables_MBED\Drivers\BMI160\bmi160.h"
+InterruptIn bmi160_int_pin(P3_6);
+I2C I2CM2(P5_7, P6_0); /* SDA, SCL */
+BMI160_I2C bmi160_dev(&I2CM2, BMI160_I2C::I2C_ADRS_SDO_LO, &bmi160_int_pin);
+
+
+//
+// ECG SENSOR
+//
+#include "EcgComm.h"
+EcgComm ecgCommHandler(µUSB);
+
+#include "MAX30001.h"
+#include "MAX30001_Helper.h"
+SPI max30001_spi(P5_1, P5_2, P5_0);
+DigitalOut max30001_cs(P5_3);
+MAX30001 max30001(&max30001_spi, &max30001_cs);
+InterruptIn max30001_InterruptB(P5_5);
+InterruptIn max30001_Interrupt2B(P6_2);
+
+
+//
+// TEMP SENSOR
+//
+#include "TempComm.h"
+TempComm tpCommHandler(µUSB);
+#include "MAX30205.h"
+I2C i2c(P3_4, P3_5);
+MAX30205 max30205(&i2c, (0x90 >> 1));
+//enable the LDO for temp sensor
+DigitalOut max30205_LDO_EN(P7_1, 1);
+
+
+//
+// ME11 SMART SENSOR INTERFACE
+//
+#include "SSInterface.h"
+I2C ssI2C(P3_4, P3_5);
+PinName ss_mfio(P5_4);
+PinName ss_reset(P5_6);
+SSInterface ssInterface(ssI2C, ss_mfio, ss_reset);
+
+#include "SSBootloaderComm.h"
+SSBootloaderComm ssBoot(µUSB, &ssInterface, &dsInterface);
+
+#include "SSMAX8614XComm.h"
+SSMAX8614XComm ssMAX8614X(µUSB, &ssInterface, &dsInterface);
+
+#include "SSGenericCmd.h"
+SSGenericCmd ssGenericCmd(µUSB, &ssInterface, &dsInterface);
+
+
+//
+// MX25U Flash Driver Definition
+//
+#define MHZ_VALUE 1000000
+#define SPI_MHZ 16
+#define SPI_FREQUENCY (SPI_MHZ * MHZ_VALUE)
+#include "SPIFBlockDevice.h"
+#include "FATFileSystem.h"
+
+DigitalOut flash_nHOLD(P1_5);
+SPIFBlockDevice spif(P1_1, P1_2, P1_0, P1_3, SPI_FREQUENCY);
+FATFileSystem filesystem("fs");
+// USB MSD
+#include "USBMSD_BD.h"
+
+
+
+//
+// Hardware serial port over DAPLink
+//
+Serial daplink(USBTX, USBRX, 115200);
+
+
+
+static void setup_ble(void);
+static void process_ble(void);
+static void print_build_version(void);
+static void HSP_run_in_usbmcd_mode(void);
+static void HSP_mount_filesystem(void);
+
+#ifdef ENABLE_MEMORY_DEBUG
+void print_memory_info();
+#endif
+
+
+int main()
+{
+ wait_ms(100);
+
+ HSP_mount_filesystem();
+
+ if (watchInterface.getButtonStatus(WatchInterface::BUTTON_UP) == WatchInterface::BUTTON_RELEASED) {
+ HSP_run_in_usbmcd_mode();
+ }
+ wait_ms(500);
+
+
+ GPIO_PRIOINVERSION_MASK;
+
+ // used by the MAX30001
+ NVIC_SetPriority(SPIM2_IRQn, 0);
+
+
+ watchInterface.bootComplete = true;
+ print_build_version();
+ daplink.printf("daplink serial port\r\n");
+ microUSB.printf("micro USB serial port\r\n");
+
+ //dsInterface.set_fw_version(FIRMWARE_VERSION);
+ dsInterface.set_fw_platform(MAXIM_PLATFORM_NAME);
+ Peripherals::setUSBSerial(µUSB);
+
+ icarus.max20303.Max20303_IsBattery_Connected();
+ watchInterface.m_max20303_ = &icarus.max20303;
+
+
+ setup_ble();
+#ifdef ENABLE_BLETEST_COMM
+ dsInterface.add_sensor_comm(&bleTestComm);
+#endif
+
+ //
+ // MAX30001
+ //
+ printf("Init MAX30001 callbacks, interrupts...\r\n");
+ MAX30001_Helper m_max30001helper(&max30001, &max30001_InterruptB, &max30001_Interrupt2B);
+ Peripherals::setMAX30001(&max30001);
+ Peripherals::setMAX30001Helper(&m_max30001helper);
+ ecgCommHandler.comm_init(&m_max30001helper);
+ dsInterface.add_sensor_comm(&ecgCommHandler);
+
+ //
+ //MAX30205
+ //
+ tpCommHandler.comm_init(&max30205);
+ dsInterface.add_sensor_comm(&tpCommHandler);
+
+ //Configure mfio as a level based interrupt (no mbed API for this, must use Maxim-specific code)
+ //gpio_cfg_t mfio_gpio_cfg = {PORT_5, PIN_4, GPIO_FUNC_GPIO, GPIO_PAD_INPUT_PULLUP};
+ //GPIO_IntConfig(&mfio_gpio_cfg, GPIO_INT_LOW_LEVEL);
+ ssI2C.frequency(400000);
+ dsInterface.set_fw_platform(ssInterface.get_ss_platform_name());
+ dsInterface.set_fw_version(ssInterface.get_ss_fw_version());
+
+ //
+ //REGISTER BOOTLOADER API TO SS INTERFACE
+ //
+ dsInterface.add_sensor_comm(&ssBoot);
+
+ //
+ //REGISTER 8614X PPG SENSOR API TO SS INTERFACE
+ //
+ dsInterface.add_sensor_comm(&ssMAX8614X);
+ ssMAX8614X.setBMI160(&bmi160_dev);
+
+ //
+ //REGISTER GENERIC COMMAND API TO SS INTERFACE
+ //
+ dsInterface.add_sensor_comm(&ssGenericCmd);
+
+
+ //Blink green if SmartSensor is present, yellow otherwise
+ SS_STATUS status = ssInterface.ss_comm_check();
+ if (status == SS_SUCCESS)
+ ledStatus.set_state(LED_OFF, LED_ON, LED_OFF);
+ else
+ ledStatus.set_state(LED_ON, LED_ON, LED_OFF);
+ ledStatus.blink(100, 1900);
+ ledStatus.blink(100, 1900);
+
+ //
+ //MAIN CONTEXT LOOP
+ //
+ while (1) {
+
+ USBSerial* serial = µUSB;
+ uint8_t ch;
+ while (serial->readable()) {
+ ch = serial->_getc();
+ dsInterface.enable_console_interface();
+ dsInterface.build_command(ch);
+ }
+
+
+ if(dsInterface.recordingStarted) {
+ if((icarus.status_powerButton == MAX32630HSP::BUTTONSTATUS_LONG_PRESS_WAITING) ||
+ (watchInterface.batteryLevel <= BATTERY_CRITICAL_LEVEL)) {
+ dsInterface.stopcommand();
+ dsInterface.force_file_close();
+ }
+ }
+
+ icarus.Max32630HSP_CheckInterrupt_Status();
+ //
+ // DSINTERFACE CONTEXT as all other interfaces is run by call to its data_report_execute function!!
+ //
+ dsInterface.data_report_execute();
+
+ if (ecgCommHandler.is_enabled() != watchInterface.ecg_enabled) {
+
+ if (ecgCommHandler.is_enabled()) {
+
+ if (!dsInterface.recordingStarted) {
+ watchInterface.displayMode = DISPLAYMODE_ECG;
+ }
+
+ // Turn off LEDs
+ ledStatus.set_state(1, 1, 1);
+ ledStatus.solid();
+ ledStatus.set_state(1, 1, 1);
+ } else {
+
+ if (!dsInterface.recordingStarted) {
+ watchInterface.displayMode = DISPLAYMODE_TIME;
+ }
+
+ }
+ watchInterface.ecg_enabled = ecgCommHandler.is_enabled();
+
+ }
+
+ // Sensor Interface Updates on Watch display mode changes
+ if (watchInterface.modeUpdated) {
+
+ watchInterface.modeUpdated = false;
+ watchInterface.DisplayModeUpdated();
+
+ // Tethered mode
+ if ((watchInterface.BLE_Interface_Exists) || (watchInterface.USB_Interface_Exists)) {
+
+
+ // Stop all sensors
+ if(!dsInterface.recordingStarted)
+ dsInterface.stopcommand();
+
+
+ } else
+ // Not in tethered mode
+ {
+
+ switch (watchInterface.displayMode) {
+
+ case DISPLAYMODE_INFO :
+
+ // Before switching to INFO screen, stop all sensors
+ if (!dsInterface.recordingStarted) {
+ dsInterface.stopcommand();
+ }
+
+ break;
+ case DISPLAYMODE_TIME :
+
+ // Before switching to TIME screen, stop all sensors
+ if (!dsInterface.recordingStarted) {
+ dsInterface.stopcommand();
+ }
+
+ break;
+ case DISPLAYMODE_PPG :
+
+ // Before switching to PPG screen, stop all sensors
+ if (!dsInterface.recordingStarted) {
+ dsInterface.stopcommand();
+ dsInterface.parse_command_str("set_reg ppg 2a 10");
+ dsInterface.parse_command_str("set_reg ppg 23 ff");
+ dsInterface.parse_command_str("read ppg 0");
+ }
+
+ break;
+
+ case DISPLAYMODE_TEMP :
+
+ // Before switching to TEMP screen, stop all sensors
+ if (!dsInterface.recordingStarted) {
+ dsInterface.stopcommand();
+ dsInterface.parse_command_str("set_cfg temp sr 500");
+ dsInterface.parse_command_str("read temp 0");
+ }
+
+ break;
+
+ }
+ }
+ }
+
+ // Update the watch interface with the latest data
+ watchInterface.instant_temp_celsius = tpCommHandler.TempComm_instant_temp_celsius;
+ watchInterface.instant_hr = ssMAX8614X.instant_hr;
+ watchInterface.instant_hr_conf = ssMAX8614X.instant_hr_conf;
+
+ watchInterface.BLE_Interface_Exists = BLE::Instance().gap().getState().connected;
+ watchInterface.USB_Interface_Exists = IS_USB_HOST_CONNECTED();
+
+ if (watchInterface.recordingStopFlag) {
+
+ watchInterface.recordingStopFlag = false;
+ watchInterface.recording = false;
+ watchInterface.recording_old = false;
+ dsInterface.stopcommand();
+ ledStatus.set_state(LED_OFF, LED_ON, LED_OFF);
+ ledStatus.blink(100, 1900);
+ } else {
+ watchInterface.recording = dsInterface.recordingStarted;
+ }
+
+
+ if (watchInterface.BLE_Interface_Exists || watchInterface.USB_Interface_Exists) {
+ watchInterface.connection_indicator++;
+ if (watchInterface.connection_indicator == 1) {
+
+ if (!dsInterface.recordingStarted) {
+ dsInterface.stopcommand();
+ }
+
+ } else if (watchInterface.connection_indicator > 50) {
+ watchInterface.connection_indicator = 2;
+ }
+
+ }
+
+ watchInterface.execute();
+ process_ble();
+ ledStatus.update();
+
+#ifdef ENABLE_MEMORY_DEBUG
+ print_memory_info();
+#endif
+ }
+}
+
+
+
+
+static void setup_ble(void)
+{
+
+ //Set up BLE communication
+ BLE& ble = BLE::Instance();
+ ble.init(bleInitComplete);
+ while (BLE::Instance().hasInitialized() == false) { /* spin loop */ }
+ BLE_Icarus_SetDSInterface(&dsInterface);
+
+ char addr[6];
+ BLE_ICARUS_Get_Mac_Address(addr);
+ printf("BLE MAC: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\r\n", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
+
+
+ memcpy(watchInterface.m_mac_addr_, addr, 6);
+
+
+
+}
+
+static void process_ble(void)
+{
+
+ if (BLE::Instance().gap().getState().connected) {
+ BLE_Icarus_TransferDataFromQueue();
+ }
+ BLE::Instance().waitForEvent();
+
+}
+
+static void print_build_version(void)
+{
+ printf("\n\nICARUS mBED EVKit\r\n");
+ printf("Fw version: %s, mbed version: %d\r\n", FIRMWARE_VERSION, MBED_VERSION);
+ printf("Build source: (%s) %s\r\n", BUILD_SOURCE_BRANCH, BUILD_SOURCE_HASH);
+ printf("Build time: %s %s\r\n\n", __TIME__, __DATE__);
+}
+
+static void HSP_run_in_usbmcd_mode(void){
+
+ int err;
+
+ const int writecyclecount = 256;
+ watchInterface.USB_Interface_Exists = false;
+ watchInterface.USB_Interface_MSD = true;
+ watchInterface.bootComplete = true;
+ watchInterface.displayMode = DISPLAYMODE_TETHERED_USB;
+ watchInterface.updateDisplay(4);
+
+ for(int i = 0; i < writecyclecount; ++i) {
+ watchInterface.execute();
+ wait_ms(1);
+ }
+
+ USBMSD_BD msd(&spif);
+ printf("Starting MSD... ");
+ msd.disk_initialize();
+ err = msd.connect();
+ ledStatus.set_state(1, 1, 0);
+ printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
+
+ msd.disk_initialize();
+ err = msd.connect();
+
+ GPIO_PRIOINVERSION_MASK;
+
+ while (1) {
+
+ icarus.Max32630HSP_CheckInterrupt_Status();
+
+ wait_ms(1);
+ }
+}
+
+static void HSP_mount_filesystem(void){
+
+ // For ISSI part, in 3-wire SPI mode, HOLD pin should be tied to high to un-pause communication
+ flash_nHOLD = 1;
+ // Try to mount the filesystem
+ printf("Mounting the filesystem... ");
+ fflush(stdout);
+ int err = filesystem.mount(&spif);
+ printf("%s\n", (err ? "Fail :(" : "OK"));
+ if (err) {
+ // Reformat if we can't mount the filesystem
+ // this should only happen on the first boot
+ printf("No filesystem found, formatting... ");
+ fflush(stdout);
+ err = filesystem.reformat(&spif);
+ printf("%s\n", (err ? "Fail :(" : "OK"));
+ }
+
+}
+
+
+
+#ifdef ENABLE_MEMORY_DEBUG
+void print_memory_info() {
+ static int threadStackSize[8] = {0};
+ static int heapSize = 0;
+ // allocate enough room for every thread's stack statistics
+ int cnt = osThreadGetCount();
+ mbed_stats_stack_t *stats = (mbed_stats_stack_t*) malloc(cnt * sizeof(mbed_stats_stack_t));
+
+ cnt = mbed_stats_stack_get_each(stats, cnt);
+ for (int i = 0; i < cnt; i++) {
+ if(threadStackSize[i] < stats[i].max_size){
+ printf("Thread: 0x%lX, Stack size: %lu / %lu\r\n", stats[i].thread_id, stats[i].max_size, stats[i].reserved_size);
+ threadStackSize[i] = stats[i].max_size;
+ }
+ }
+ free(stats);
+
+ // Grab the heap statistics
+ mbed_stats_heap_t heap_stats;
+ mbed_stats_heap_get(&heap_stats);
+ if(heapSize < heap_stats.current_size){
+ printf("Heap size: %lu / %lu bytes\r\n", heap_stats.current_size, heap_stats.reserved_size);
+ heapSize = heap_stats.current_size;
+ }
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-os.lib Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mbed-os/#949cb49ab0a144da0e3b04b6af46db0cd2a20d75
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_os_patches/.gitattributes Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,2 @@ +* text=auto +*.patch text eol=lf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_os_patches/buttoninterrupt.patch Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,18 @@
+diff --git a/targets/TARGET_Maxim/TARGET_MAX32630/gpio_irq_api.c b/targets/TARGET_Maxim/TARGET_MAX32630/gpio_irq_api.c
+index 8a9e7bb42..e5fcb4b6f 100644
+--- a/targets/TARGET_Maxim/TARGET_MAX32630/gpio_irq_api.c
++++ b/targets/TARGET_Maxim/TARGET_MAX32630/gpio_irq_api.c
+@@ -118,7 +118,12 @@ int gpio_irq_init(gpio_irq_t *obj, PinName name, gpio_irq_handler handler, uint3
+
+ /* enable the requested interrupt */
+ MXC_GPIO->inten[port] |= (1 << pin);
+- NVIC_EnableIRQ((IRQn_Type)((uint32_t)GPIO_P0_IRQn + port));
++ if (port >= 7) {
++ NVIC_EnableIRQ((IRQn_Type)((uint32_t)GPIO_P7_IRQn + (port - 7)));
++ } else {
++ NVIC_EnableIRQ((IRQn_Type)((uint32_t)GPIO_P0_IRQn + port));
++ }
++
+
+ return 0;
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_os_patches/fffix.patch Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,88 @@
+diff --git a/features/filesystem/fat/ChaN/ff.cpp b/features/filesystem/fat/ChaN/ff.cpp
+index 7e4561d809..3bda25e4a9 100644
+--- a/features/filesystem/fat/ChaN/ff.cpp
++++ b/features/filesystem/fat/ChaN/ff.cpp
+@@ -3800,7 +3800,9 @@ FRESULT f_read (
+ cc = fs->csize - csect;
+ }
+ if (disk_read(fs->pdrv, rbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR);
+-#if !FF_FS_READONLY && FF_FS_MINIMIZE <= 2 /* Replace one of the read sectors with cached data if it contains a dirty sector */
++
++/*
++#if !FF_FS_READONLY && FF_FS_MINIMIZE <= 2
+ #if FF_FS_TINY
+ if (fs->wflag && fs->winsect - sect < cc) {
+ mem_cpy(rbuff + ((fs->winsect - sect) * SS(fs)), fs->win, SS(fs));
+@@ -3811,6 +3813,8 @@ FRESULT f_read (
+ }
+ #endif
+ #endif
++*/
++
+ rcnt = SS(fs) * cc; /* Number of bytes transferred */
+ continue;
+ }
+@@ -3921,19 +3925,20 @@ FRESULT f_write (
+ cc = fs->csize - csect;
+ }
+ if (disk_write(fs->pdrv, wbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR);
++/*
+ #if FF_FS_MINIMIZE <= 2
+ #if FF_FS_TINY
+- if (fs->winsect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */
++ if (fs->winsect - sect < cc) {
+ mem_cpy(fs->win, wbuff + ((fs->winsect - sect) * SS(fs)), SS(fs));
+ fs->wflag = 0;
+ }
+ #else
+- if (fp->sect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */
++ if (fp->sect - sect < cc) {
+ mem_cpy(fp->buf, wbuff + ((fp->sect - sect) * SS(fs)), SS(fs));
+ fp->flag &= (BYTE)~FA_DIRTY;
+ }
+ #endif
+-#endif
++#endif*/
+ wcnt = SS(fs) * cc; /* Number of bytes transferred */
+ #if FLUSH_ON_NEW_SECTOR
+ need_sync = true;
+diff --git a/features/filesystem/fat/ChaN/ffconf.h b/features/filesystem/fat/ChaN/ffconf.h
+index 22e1294277..f446778695 100644
+--- a/features/filesystem/fat/ChaN/ffconf.h
++++ b/features/filesystem/fat/ChaN/ffconf.h
+@@ -151,7 +151,7 @@
+ */
+
+
+-#define FF_FS_RPATH 1
++#define FF_FS_RPATH 0
+ /* This option configures support for relative path.
+ /
+ / 0: Disable relative path and remove related functions.
+@@ -164,7 +164,7 @@
+ / Drive/Volume Configurations
+ /---------------------------------------------------------------------------*/
+
+-#define FF_VOLUMES 4
++#define FF_VOLUMES 1
+ /* Number of volumes (logical drives) to be used. (1-10) */
+
+
+@@ -219,7 +219,7 @@
+ / System Configurations
+ /---------------------------------------------------------------------------*/
+
+-#define FF_FS_TINY 1
++#define FF_FS_TINY 0
+ /* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
+ / At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes.
+ / Instead of private sector buffer eliminated from the file object, common sector
+@@ -289,7 +289,7 @@
+ /* #include <windows.h> // O/S definitions */
+
+ #define FLUSH_ON_NEW_CLUSTER 0 /* Sync the file on every new cluster */
+-#define FLUSH_ON_NEW_SECTOR 1 /* Sync the file on every new sector */
++#define FLUSH_ON_NEW_SECTOR 0 /* Sync the file on every new sector */
+ /* Only one of these two defines needs to be set to 1. If both are set to 0
+ the file is only sync when closed.
+ Clusters are group of sectors (eg: 8 sectors). Flushing on new cluster means
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_os_patches/rtc.patch Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,13 @@ +diff --git a/targets/targets.json b/targets/targets.json +index 6af8758dd..daf3f25c8 100755 +--- a/targets/targets.json ++++ b/targets/targets.json +@@ -3110,7 +3110,7 @@ + "macros": ["__SYSTEM_HFX=96000000", "TARGET=MAX32630", "TARGET_REV=0x4132", "BLE_HCI_UART", "OPEN_DRAIN_LEDS"], + "extra_labels": ["Maxim", "MAX32630"], + "supported_toolchains": ["GCC_ARM", "IAR", "ARM"], +- "device_has": ["ANALOGIN", "I2C", "INTERRUPTIN", "LPTICKER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "SERIAL", "SERIAL_FC", "SPI", "STDIO_MESSAGES", "USTICKER"], ++ "device_has": ["ANALOGIN", "I2C", "INTERRUPTIN", "LPTICKER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_FC", "SPI", "STDIO_MESSAGES", "USTICKER"], + "features": ["BLE"], + "release_versions": ["2", "5"] + },
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_settings.py Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,45 @@ +""" +mbed SDK +Copyright (c) 2016 ARM Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +from os.path import join, abspath, dirname + +#ROOT = abspath(join(dirname(__file__), ".")) + +############################################################################## +# Build System Settings +############################################################################## +#BUILD_DIR = abspath(join(ROOT, "build")) + +# ARM +#ARM_PATH = "C:/Program Files/ARM" + +# GCC ARM +#GCC_ARM_PATH = "" + +# GCC CodeRed +#GCC_CR_PATH = "C:/code_red/RedSuite_4.2.0_349/redsuite/Tools/bin" + +# IAR +#IAR_PATH = "C:/Program Files (x86)/IAR Systems/Embedded Workbench 7.0/arm" + +# Goanna static analyser. Please overload it in private_settings.py +#GOANNA_PATH = "c:/Program Files (x86)/RedLizards/Goanna Central 3.2.3/bin" + +#BUILD_OPTIONS = [] + +# mbed.org username +#MBED_ORG_USER = ""
Binary file mbed_settings.pyc has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/.gitattributes Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,2 @@ +* text=auto +*.patch text eol=lf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/0001-porting-MAX32625PICO-to-mbed-os-5.patch Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,611 @@
+From 0420b36056436f6f7b387b614de8ab9e0aa0f373 Mon Sep 17 00:00:00 2001
+From: Mahir Ozturk <Mahir.Ozturk@maximintegrated.com>
+Date: Wed, 29 Mar 2017 14:16:50 +0300
+Subject: [PATCH] porting MAX32625PICO to mbed-os 5
+
+---
+ .../TARGET_MAX32625PICO/PeripheralNames.h | 88 +++++++++++
+ .../TARGET_MAX32625/TARGET_MAX32625PICO/PinNames.h | 140 ++++++++++++++++
+ .../TARGET_MAX32625PICO/low_level_init.c | 56 +++++++
+ .../TARGET_MAX32625PICO/MAX32625.sct | 16 ++
+ .../TARGET_MAX32625PICO/max32625.ld | 176 +++++++++++++++++++++
+ .../TOOLCHAIN_IAR/TARGET_MAX32625PICO/MAX32625.icf | 29 ++++
+ .../TARGET_MAX32625/device/system_max32625.c | 7 +
+ targets/targets.json | 9 ++
+ 8 files changed, 521 insertions(+)
+ create mode 100644 targets/TARGET_Maxim/TARGET_MAX32625/TARGET_MAX32625PICO/PeripheralNames.h
+ create mode 100644 targets/TARGET_Maxim/TARGET_MAX32625/TARGET_MAX32625PICO/PinNames.h
+ create mode 100644 targets/TARGET_Maxim/TARGET_MAX32625/TARGET_MAX32625PICO/low_level_init.c
+ create mode 100644 targets/TARGET_Maxim/TARGET_MAX32625/device/TOOLCHAIN_ARM_STD/TARGET_MAX32625PICO/MAX32625.sct
+ create mode 100644 targets/TARGET_Maxim/TARGET_MAX32625/device/TOOLCHAIN_GCC_ARM/TARGET_MAX32625PICO/max32625.ld
+ create mode 100644 targets/TARGET_Maxim/TARGET_MAX32625/device/TOOLCHAIN_IAR/TARGET_MAX32625PICO/MAX32625.icf
+
+diff --git a/targets/TARGET_Maxim/TARGET_MAX32625/TARGET_MAX32625PICO/PeripheralNames.h b/targets/TARGET_Maxim/TARGET_MAX32625/TARGET_MAX32625PICO/PeripheralNames.h
+new file mode 100644
+index 000000000..4686ef9c9
+--- /dev/null
++++ b/targets/TARGET_Maxim/TARGET_MAX32625/TARGET_MAX32625PICO/PeripheralNames.h
+@@ -0,0 +1,88 @@
++/*******************************************************************************
++ * 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 MBED_PERIPHERALNAMES_H
++#define MBED_PERIPHERALNAMES_H
++
++#include "cmsis.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++typedef enum {
++ UART_0 = MXC_BASE_UART0,
++ UART_1 = MXC_BASE_UART1,
++ UART_2 = MXC_BASE_UART2,
++ STDIO_UART = UART_1
++} UARTName;
++
++typedef enum {
++ I2C_0 = MXC_BASE_I2CM0,
++ I2C_1 = MXC_BASE_I2CM1
++} I2CName;
++
++typedef enum {
++ SPI_0 = MXC_BASE_SPIM0,
++ SPI_1 = MXC_BASE_SPIM1,
++ SPI_2 = MXC_BASE_SPIM2
++} SPIName;
++
++typedef enum {
++ PWM_0 = MXC_BASE_PT0,
++ PWM_1 = MXC_BASE_PT1,
++ PWM_2 = MXC_BASE_PT2,
++ PWM_3 = MXC_BASE_PT3,
++ PWM_4 = MXC_BASE_PT4,
++ PWM_5 = MXC_BASE_PT5,
++ PWM_6 = MXC_BASE_PT6,
++ PWM_7 = MXC_BASE_PT7,
++ PWM_8 = MXC_BASE_PT8,
++ PWM_9 = MXC_BASE_PT9,
++ PWM_10 = MXC_BASE_PT10,
++ PWM_11 = MXC_BASE_PT11,
++ PWM_12 = MXC_BASE_PT12,
++ PWM_13 = MXC_BASE_PT13,
++ PWM_14 = MXC_BASE_PT14,
++ PWM_15 = MXC_BASE_PT15
++} PWMName;
++
++typedef enum {
++ ADC = MXC_BASE_ADC
++} ADCName;
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff --git a/targets/TARGET_Maxim/TARGET_MAX32625/TARGET_MAX32625PICO/PinNames.h b/targets/TARGET_Maxim/TARGET_MAX32625/TARGET_MAX32625PICO/PinNames.h
+new file mode 100644
+index 000000000..1cbd97e37
+--- /dev/null
++++ b/targets/TARGET_Maxim/TARGET_MAX32625/TARGET_MAX32625PICO/PinNames.h
+@@ -0,0 +1,140 @@
++/*******************************************************************************
++ * 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 MBED_PINNAMES_H
++#define MBED_PINNAMES_H
++
++#include "cmsis.h"
++#include "gpio_regs.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++typedef enum {
++ PIN_INPUT = 0, /* MXC_V_GPIO_OUT_MODE_HIGH_Z,*/
++ PIN_OUTPUT = 1 /* MXC_V_GPIO_OUT_MODE_NORMAL_DRIVE */
++} PinDirection;
++
++#define PORT_SHIFT 12
++#define PINNAME_TO_PORT(name) ((unsigned int)(name) >> PORT_SHIFT)
++#define PINNAME_TO_PIN(name) ((unsigned int)(name) & ~(0xFFFFFFFF << PORT_SHIFT))
++
++#define NOT_CONNECTED (int)0xFFFFFFFF
++
++typedef enum {
++ P0_0 = (0 << PORT_SHIFT), P0_1, P0_2, P0_3, P0_4, P0_5, P0_6, P0_7,
++ P1_0 = (1 << PORT_SHIFT), P1_1, P1_2, P1_3, P1_4, P1_5, P1_6, P1_7,
++ P2_0 = (2 << PORT_SHIFT), P2_1, P2_2, P2_3, P2_4, P2_5, P2_6, P2_7,
++ P3_0 = (3 << PORT_SHIFT), P3_1, P3_2, P3_3, P3_4, P3_5, P3_6, P3_7,
++ P4_0 = (4 << PORT_SHIFT), P4_1, P4_2, P4_3, P4_4, P4_5, P4_6, P4_7,
++
++ // Analog input pins
++ AIN_0 = (0xA << PORT_SHIFT), AIN_1, AIN_2, AIN_3, AIN_4, AIN_5, AIN_6, AIN_7, AIN_8, AIN_9,
++
++ // LEDs
++ LED1 = P2_4,
++ LED2 = P2_5,
++ LED3 = P2_6,
++ LED_RED = LED1,
++ LED_GREEN = LED2,
++ LED_BLUE = LED3,
++
++ // Push button
++ SW1 = P2_7,
++
++ // USB bridge connected UART pins
++ USBTX = P2_1,
++ USBRX = P2_0,
++ STDIO_UART_TX = USBTX,
++ STDIO_UART_RX = USBRX,
++
++ // I2C pins
++ I2C0_SCL = P1_7,
++ I2C0_SDA = P1_6,
++
++ I2C1_SCL = P3_5,
++ I2C1_SDA = P3_4,
++
++ // UART pins
++ UART0_RX = P0_0,
++ UART0_TX = P0_1,
++ UART0_CTS = P0_2,
++ UART0_RTS = P0_3,
++
++ UART1_RX = P2_0,
++ UART1_TX = P2_1,
++
++ UART2_RX = P3_0,
++ UART2_TX = P3_1,
++ UART2_CTS = P3_2,
++ UART2_RTS = P3_3,
++
++ // SPI pins
++ SPI0_SCK = P0_4,
++ SPI0_MOSI = P0_5,
++ SPI0_MISO = P0_6,
++ SPI0_SS = P0_7,
++
++ SPI1_SCK = P1_0,
++ SPI1_MOSI = P1_1,
++ SPI1_MISO = P1_2,
++ SPI1_SS = P1_3,
++
++ SPI2_SCK = P2_4,
++ SPI2_MOSI = P2_5,
++ SPI2_MISO = P2_6,
++ SPI2_SS = P2_7,
++
++ // Not connected
++ NC = NOT_CONNECTED
++} PinName;
++
++typedef enum {
++ PullUp,
++ PullDown,
++ OpenDrain,
++ PullNone,
++ PullDefault = PullUp
++} PinMode;
++
++typedef enum {
++ LED_ON = 0,
++ LED_OFF = 1
++} LedStates;
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff --git a/targets/TARGET_Maxim/TARGET_MAX32625/TARGET_MAX32625PICO/low_level_init.c b/targets/TARGET_Maxim/TARGET_MAX32625/TARGET_MAX32625PICO/low_level_init.c
+new file mode 100644
+index 000000000..1c56f9891
+--- /dev/null
++++ b/targets/TARGET_Maxim/TARGET_MAX32625/TARGET_MAX32625PICO/low_level_init.c
+@@ -0,0 +1,56 @@
++/*******************************************************************************
++ * Copyright (C) 2017 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 "cmsis.h"
++#include "ioman_regs.h"
++#include "gpio_regs.h"
++
++//******************************************************************************
++// This function will get called early in system initialization
++void low_level_init(void)
++{
++ /* The MAX32625PICO board utilizes a bootloader that can leave some
++ * peripherals in a partially configured state. This function resets
++ * those to allow proper initialization.
++ */
++ MXC_IOMAN->uart0_req = 0x0; // Clear any requests
++ MXC_IOMAN->uart1_req = 0x0; // Clear any requests
++
++ MXC_GPIO->inten[2] = 0x0; // Clear interrupt enable
++ MXC_GPIO->int_mode[2] = 0x0; // Clear interrupt mode
++ MXC_GPIO->in_mode[2] = 0x22222222; // Clear input mode
++ MXC_GPIO->out_val[2] = 0x0; // Clear output value
++ MXC_GPIO->out_mode[2] = 0xFFFFFFFF; // Clear output mode
++
++
++}
+diff --git a/targets/TARGET_Maxim/TARGET_MAX32625/device/TOOLCHAIN_ARM_STD/TARGET_MAX32625PICO/MAX32625.sct b/targets/TARGET_Maxim/TARGET_MAX32625/device/TOOLCHAIN_ARM_STD/TARGET_MAX32625PICO/MAX32625.sct
+new file mode 100644
+index 000000000..6ea0cb73b
+--- /dev/null
++++ b/targets/TARGET_Maxim/TARGET_MAX32625/device/TOOLCHAIN_ARM_STD/TARGET_MAX32625PICO/MAX32625.sct
+@@ -0,0 +1,16 @@
++; MAX32625
++; 512KB FLASH (0x70000) @ 0x000010000
++; 160KB RAM (0x24F00) @ 0x20003100
++
++LR_IROM1 0x000010000 0x70000 { ; load region size_region
++ ER_IROM1 0x000010000 0x70000 { ; load address = execution address
++ *.o (RESET, +First)
++ *(InRoot$$Sections)
++ .ANY (+RO)
++ }
++
++ ; [RAM] Vector table dynamic copy: 68 vectors * 4 bytes = 272 (0x110)
++ RW_IRAM1 (0x20003100+0x110) (0x24F00-0x110) { ; RW data
++ .ANY (+RW +ZI)
++ }
++}
+diff --git a/targets/TARGET_Maxim/TARGET_MAX32625/device/TOOLCHAIN_GCC_ARM/TARGET_MAX32625PICO/max32625.ld b/targets/TARGET_Maxim/TARGET_MAX32625/device/TOOLCHAIN_GCC_ARM/TARGET_MAX32625PICO/max32625.ld
+new file mode 100644
+index 000000000..f51f007f1
+--- /dev/null
++++ b/targets/TARGET_Maxim/TARGET_MAX32625/device/TOOLCHAIN_GCC_ARM/TARGET_MAX32625PICO/max32625.ld
+@@ -0,0 +1,176 @@
++/*******************************************************************************
++ * 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.
++ *******************************************************************************
++ */
++
++MEMORY
++{
++ FLASH (rx) : ORIGIN = 0x00010000, LENGTH = 0x00070000
++ RAM (rwx) : ORIGIN = 0x20003100, LENGTH = 0x00024F00
++}
++
++/* Linker script to place sections and symbol values. Should be used together
++ * with other linker script that defines memory regions FLASH and RAM.
++ * It references following symbols, which must be defined in code:
++ * Reset_Handler : Entry of reset handler
++ *
++ * It defines following symbols, which code can use without definition:
++ * __exidx_start
++ * __exidx_end
++ * __etext
++ * __data_start__
++ * __preinit_array_start
++ * __preinit_array_end
++ * __init_array_start
++ * __init_array_end
++ * __fini_array_start
++ * __fini_array_end
++ * __data_end__
++ * __bss_start__
++ * __bss_end__
++ * __end__
++ * end
++ * __HeapLimit
++ * __StackLimit
++ * __StackTop
++ * __stack
++ */
++ENTRY(Reset_Handler)
++
++SECTIONS
++{
++ .text :
++ {
++ KEEP(*(.isr_vector))
++ *(.text*)
++
++ KEEP(*(.init))
++ KEEP(*(.fini))
++
++ /* .ctors */
++ *crtbegin.o(.ctors)
++ *crtbegin?.o(.ctors)
++ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
++ *(SORT(.ctors.*))
++ *(.ctors)
++
++ /* .dtors */
++ *crtbegin.o(.dtors)
++ *crtbegin?.o(.dtors)
++ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
++ *(SORT(.dtors.*))
++ *(.dtors)
++
++ *(.rodata*)
++
++ KEEP(*(.eh_frame*))
++ } > FLASH
++
++ .ARM.extab :
++ {
++ *(.ARM.extab* .gnu.linkonce.armextab.*)
++ } > FLASH
++
++ __exidx_start = .;
++ .ARM.exidx :
++ {
++ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
++ } > FLASH
++ __exidx_end = .;
++
++ __etext = .;
++
++ .data : AT (__etext)
++ {
++ __data_start__ = .;
++ *(vtable)
++ *(.data*)
++
++ . = ALIGN(4);
++ /* preinit data */
++ PROVIDE_HIDDEN (__preinit_array_start = .);
++ KEEP(*(.preinit_array))
++ PROVIDE_HIDDEN (__preinit_array_end = .);
++
++ . = ALIGN(4);
++ /* init data */
++ PROVIDE_HIDDEN (__init_array_start = .);
++ KEEP(*(SORT(.init_array.*)))
++ KEEP(*(.init_array))
++ PROVIDE_HIDDEN (__init_array_end = .);
++
++
++ . = ALIGN(4);
++ /* finit data */
++ PROVIDE_HIDDEN (__fini_array_start = .);
++ KEEP(*(SORT(.fini_array.*)))
++ KEEP(*(.fini_array))
++ PROVIDE_HIDDEN (__fini_array_end = .);
++
++ . = ALIGN(4);
++ /* All data end */
++ __data_end__ = .;
++
++ } > RAM
++
++ .bss :
++ {
++ __bss_start__ = .;
++ *(.bss*)
++ *(COMMON)
++ __bss_end__ = .;
++ } > RAM
++
++ .heap :
++ {
++ __end__ = .;
++ end = __end__;
++ *(.heap*)
++ __HeapLimit = .;
++ } > RAM
++
++ /* .stack_dummy section doesn't contains any symbols. It is only
++ * used for linker to calculate size of stack sections, and assign
++ * values to stack symbols later */
++ .stack_dummy :
++ {
++ *(.stack)
++ } > RAM
++
++ /* Set stack top to end of RAM, and stack limit move down by
++ * size of stack_dummy section */
++ __StackTop = ORIGIN(RAM) + LENGTH(RAM);
++ __StackLimit = __StackTop - SIZEOF(.stack_dummy);
++ PROVIDE(__stack = __StackTop);
++
++ /* Check if data + heap + stack exceeds RAM limit */
++ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
++}
+diff --git a/targets/TARGET_Maxim/TARGET_MAX32625/device/TOOLCHAIN_IAR/TARGET_MAX32625PICO/MAX32625.icf b/targets/TARGET_Maxim/TARGET_MAX32625/device/TOOLCHAIN_IAR/TARGET_MAX32625PICO/MAX32625.icf
+new file mode 100644
+index 000000000..bba1c8067
+--- /dev/null
++++ b/targets/TARGET_Maxim/TARGET_MAX32625/device/TOOLCHAIN_IAR/TARGET_MAX32625PICO/MAX32625.icf
+@@ -0,0 +1,29 @@
++/* [ROM] */
++define symbol __intvec_start__ = 0x00010000;
++define symbol __region_ROM_start__ = 0x00010000;
++define symbol __region_ROM_end__ = 0x0007FFFF;
++
++/* [RAM] Vector table dynamic copy: 68 vectors * 4 bytes = 272 (0x110) bytes */
++define symbol __NVIC_start__ = 0x00010000;
++define symbol __NVIC_end__ = 0x00010110; /* to be aligned on 8 bytes */
++define symbol __region_RAM_start__ = 0x20003100;
++define symbol __region_RAM_end__ = 0x20027FFF;
++
++/* Memory regions */
++define memory mem with size = 4G;
++define region ROM_region = mem:[from __region_ROM_start__ to __region_ROM_end__];
++define region RAM_region = mem:[from __region_RAM_start__ to __region_RAM_end__];
++
++/* Stack and Heap */
++define symbol __size_cstack__ = 0x5000;
++define symbol __size_heap__ = 0xA000;
++define block CSTACK with alignment = 8, size = __size_cstack__ { };
++define block HEAP with alignment = 8, size = __size_heap__ { };
++
++initialize by copy { readwrite };
++do not initialize { section .noinit };
++
++place at address mem:__intvec_start__ { readonly section .intvec };
++place in ROM_region { readonly };
++place in RAM_region { readwrite,
++ block CSTACK, block HEAP };
+diff --git a/targets/TARGET_Maxim/TARGET_MAX32625/device/system_max32625.c b/targets/TARGET_Maxim/TARGET_MAX32625/device/system_max32625.c
+index 4f77b2116..bba36bb5c 100644
+--- a/targets/TARGET_Maxim/TARGET_MAX32625/device/system_max32625.c
++++ b/targets/TARGET_Maxim/TARGET_MAX32625/device/system_max32625.c
+@@ -171,6 +171,10 @@ __weak int PreInit(void)
+ return 0;
+ }
+
++/* Override this function for early platform initialization
++*/
++__weak void low_level_init(void) {}
++
+ /* This function is called just before control is transferred to main().
+ */
+ void SystemInit(void)
+@@ -258,6 +262,9 @@ void SystemInit(void)
+ __ISB();
+ #endif
+
++ /* Early platform initialization */
++ low_level_init();
++
+ /* Perform an initial trim of the internal ring oscillator */
+ CLKMAN_TrimRO();
+ }
+diff --git a/targets/targets.json b/targets/targets.json
+index ee38b950b..12d5cf61b 100644
+--- a/targets/targets.json
++++ b/targets/targets.json
+@@ -1904,6 +1904,15 @@
+ "device_has": ["ANALOGIN", "ERROR_RED", "I2C", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_FC", "SLEEP", "SPI", "STDIO_MESSAGES"],
+ "release_versions": ["2", "5"]
+ },
++ "MAX32625PICO": {
++ "inherits": ["Target"],
++ "core": "Cortex-M4F",
++ "macros": ["__SYSTEM_HFX=96000000","TARGET=MAX32625","TARGET_REV=0x4132"],
++ "extra_labels": ["Maxim", "MAX32625"],
++ "supported_toolchains": ["GCC_ARM", "IAR", "ARM"],
++ "device_has": ["ANALOGIN", "ERROR_RED", "I2C", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_FC", "SLEEP", "SPI", "STDIO_MESSAGES"],
++ "release_versions": ["2", "5"]
++ },
+ "MAX32630FTHR": {
+ "inherits": ["Target"],
+ "core": "Cortex-M4F",
+--
+2.11.1.windows.1
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/USBDevice.patch Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,17 @@ +diff -r c5e178adb138 USBDevice/USBHAL_Maxim.cpp +--- a/USBDevice/USBHAL_Maxim.cpp Fri Nov 11 17:59:00 2016 +0000 ++++ b/USBDevice/USBHAL_Maxim.cpp Thu Mar 30 11:14:58 2017 +0300 +@@ -141,8 +141,13 @@ + + // attach IRQ handler and enable interrupts + instance = this; ++#if defined(TARGET_MAX32630) + NVIC_SetVector(USB_IRQn, &_usbisr); ++#else ++ NVIC_SetVector(USB_IRQn, (uint32_t)&_usbisr); ++#endif + NVIC_EnableIRQ(USB_IRQn); ++ + } + + USBHAL::~USBHAL(void)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/filesystem.patch Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,15 @@ +diff --git a/features/filesystem/fat/ChaN/ffconf.h b/features/filesystem/fat/ChaN/ffconf.h +index 22e1294277..8eba16f9f3 100644 +--- a/features/filesystem/fat/ChaN/ffconf.h ++++ b/features/filesystem/fat/ChaN/ffconf.h +@@ -288,8 +288,8 @@ + + /* #include <windows.h> // O/S definitions */ + +-#define FLUSH_ON_NEW_CLUSTER 0 /* Sync the file on every new cluster */ +-#define FLUSH_ON_NEW_SECTOR 1 /* Sync the file on every new sector */ ++#define FLUSH_ON_NEW_CLUSTER 1 /* Sync the file on every new cluster */ ++#define FLUSH_ON_NEW_SECTOR 0 /* Sync the file on every new sector */ + /* Only one of these two defines needs to be set to 1. If both are set to 0 + the file is only sync when closed. + Clusters are group of sectors (eg: 8 sectors). Flushing on new cluster means
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/version.h Wed Apr 10 14:56:25 2019 +0300 @@ -0,0 +1,11 @@ +#ifndef __VERSION_H__ +#define __VERSION_H__ + +#include "build_version.h" +//FIRMWARE_VERSION is also the BLE advertisement name of the device +#ifdef ENABLE_SPO2 +#define FIRMWARE_VERSION "HSP2SPO2_2.7.0.1" +#else +#define FIRMWARE_VERSION "HSP2_2.7.0.1" +#endif +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/waerables_MBED.launch Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.ui.externaltools.launchGroup"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${project}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc:/${project_name}/tools/windows_run.bat}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="${workspace_loc:/${project_name}}"/>
+</launchConfiguration>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/werror_build_profile.json Wed Apr 10 14:56:25 2019 +0300
@@ -0,0 +1,44 @@
+{
+ "GCC_ARM": {
+ "common": ["-c", "-Wall", "-Wextra", "-Werror",
+ "-Wno-unused-parameter", "-Wno-missing-field-initializers",
+ "-fmessage-length=0", "-fno-exceptions", "-fno-builtin",
+ "-ffunction-sections", "-fdata-sections", "-funsigned-char",
+ "-MMD", "-fno-delete-null-pointer-checks",
+ "-fomit-frame-pointer", "-Os", "-DNDEBUG"],
+ "asm": ["-x", "assembler-with-cpp"],
+ "c": ["-std=gnu99"],
+ "cxx": ["-std=gnu++98", "-fno-rtti", "-Wvla"],
+ "ld": ["-Wl,--gc-sections", "-Wl,--wrap,main", "-Wl,--wrap,_malloc_r",
+ "-Wl,--wrap,_free_r", "-Wl,--wrap,_realloc_r",
+ "-Wl,--wrap,_calloc_r", "-Wl,--wrap,exit", "-Wl,--wrap,atexit"]
+ },
+ "ARM": {
+ "common": ["-c", "--gnu", "-Ospace", "--split_sections",
+ "--apcs=interwork", "--brief_diagnostics", "--restrict",
+ "--multibyte_chars", "-O3", "-DNDEBUG"],
+ "asm": [],
+ "c": ["--md", "--no_depend_system_headers", "--c99", "-D__ASSERT_MSG"],
+ "cxx": ["--cpp", "--no_rtti", "--no_vla"],
+ "ld": []
+ },
+ "uARM": {
+ "common": ["-c", "--gnu", "-Ospace", "--split_sections",
+ "--apcs=interwork", "--brief_diagnostics", "--restrict",
+ "--multibyte_chars", "-O3", "-D__MICROLIB",
+ "--library_type=microlib", "-DMBED_RTOS_SINGLE_THREAD", "-DNDEBUG"],
+ "asm": [],
+ "c": ["--md", "--no_depend_system_headers", "--c99", "-D__ASSERT_MSG"],
+ "cxx": ["--cpp", "--no_rtti", "--no_vla"],
+ "ld": ["--library_type=microlib"]
+ },
+ "IAR": {
+ "common": [
+ "--no_wrap_diagnostics", "-e",
+ "--diag_suppress=Pa050,Pa084,Pa093,Pa082", "-Ohz", "-DNDEBUG"],
+ "asm": [],
+ "c": ["--vla"],
+ "cxx": ["--guard_calls", "--no_static_destruction"],
+ "ld": ["--skip_dynamic_initialization", "--threaded_lib"]
+ }
+}