From c328452651ed9735b56b021b4e26dd82de37cba9 Mon Sep 17 00:00:00 2001 From: Makuna Date: Wed, 6 May 2015 08:42:38 -0700 Subject: [PATCH 01/27] true interrupt enable and disable plus expose cycle count for bit bang timing --- cores/esp8266/Arduino.h | 7 +++++-- cores/esp8266/Esp.h | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 6d039683b..430cf6f02 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -124,8 +124,11 @@ void timer1_write(uint32_t ticks); //maximum ticks 8388607 void ets_intr_lock(); void ets_intr_unlock(); -#define interrupts() ets_intr_unlock(); -#define noInterrupts() ets_intr_lock(); +void xt_enable_interrupts(); +void xt_disable_interrupts(); + +#define interrupts() xt_enable_interrupts(); +#define noInterrupts() xt_disable_interrupts(); #define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) #define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() ) diff --git a/cores/esp8266/Esp.h b/cores/esp8266/Esp.h index b3d836c79..9750dd312 100644 --- a/cores/esp8266/Esp.h +++ b/cores/esp8266/Esp.h @@ -95,8 +95,16 @@ class EspClass { FlashMode_t getFlashChipMode(void); uint32_t getFlashChipSizeByChipId(void); + inline uint32_t getCycleCount(void); }; +uint32_t EspClass::getCycleCount(void) +{ + uint32_t ccount; + __asm__ __volatile__("rsr %0,ccount":"=a" (ccount)); + return ccount; +} + extern EspClass ESP; #endif //ESP_H From b094b50e1836040bf297416345233bfed5932ab7 Mon Sep 17 00:00:00 2001 From: Makuna Date: Wed, 6 May 2015 09:02:14 -0700 Subject: [PATCH 02/27] xt disable and enable functions --- cores/esp8266/core_esp8266_wiring_digital.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/cores/esp8266/core_esp8266_wiring_digital.c b/cores/esp8266/core_esp8266_wiring_digital.c index 0e673549b..7cdfa3fbc 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.c +++ b/cores/esp8266/core_esp8266_wiring_digital.c @@ -139,6 +139,21 @@ extern void __detachInterrupt(uint8_t pin) { } } +static uint32_t interruptState = 0; + +void xt_disable_interrupts() +{ + __asm__ __volatile__("rsil %0,15":"=a" (interruptState)); + __asm__("esync"); + __asm__("isync"); + __asm__("dsync"); +} +void xt_enable_interrupts() +{ + __asm__ __volatile__("wsr %0,ps"::"a" (interruptState) : "memory"); + __asm__("esync"); +} + void initPins() { //Disable UART interrupts system_set_os_print(0); From 1cb920f713c88eecaad600ca81b1e029cce1d7c5 Mon Sep 17 00:00:00 2001 From: ficeto Date: Thu, 7 May 2015 16:42:10 +0300 Subject: [PATCH 03/27] fixes for sd server example --- .../examples/SDWebServer/SDWebServer.ino | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/libraries/ESP8266WebServer/examples/SDWebServer/SDWebServer.ino b/libraries/ESP8266WebServer/examples/SDWebServer/SDWebServer.ino index 02198fae3..d7e2863af 100644 --- a/libraries/ESP8266WebServer/examples/SDWebServer/SDWebServer.ino +++ b/libraries/ESP8266WebServer/examples/SDWebServer/SDWebServer.ino @@ -87,12 +87,20 @@ bool loadFromSdCard(String path){ uint8_t obuf[WWW_BUF_SIZE]; while (dataFile.available() > WWW_BUF_SIZE){ dataFile.read(obuf, WWW_BUF_SIZE); - client.write(obuf, WWW_BUF_SIZE); + if(client.write(obuf, WWW_BUF_SIZE) != WWW_BUF_SIZE){ + Serial.println("Sent less data than expected!"); + dataFile.close(); + return true; + } } //stream the last data left (size is at most WWW_BUF_SIZE bytes) uint16_t leftLen = dataFile.available(); dataFile.read(obuf, leftLen); - client.write(obuf, leftLen); + if(client.write(obuf, leftLen) != leftLen){ + Serial.println("Sent less data than expected!"); + dataFile.close(); + return true; + } dataFile.close(); return true; @@ -124,7 +132,7 @@ void setup(void){ while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500); //check if we have connected? - if(i == 20){ + if(i == 21){ Serial.print("Could not connect to"); Serial.println(ssid); //stop execution and wait forever From 163858dc448f04564e39c9bb5b71d2695eadfc0d Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 7 May 2015 19:25:25 +0200 Subject: [PATCH 04/27] fix use SPI.beginTransaction crash --- cores/esp8266/Esp.cpp | 7 +++ libraries/SPI/SPI.cpp | 130 +++++++++++++++++++++++++++--------------- libraries/SPI/SPI.h | 34 ++--------- 3 files changed, 95 insertions(+), 76 deletions(-) diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp index 1ed9a09cb..af6d99468 100644 --- a/cores/esp8266/Esp.cpp +++ b/cores/esp8266/Esp.cpp @@ -227,6 +227,13 @@ FlashMode_t EspClass::getFlashChipMode(void) */ uint32_t EspClass::getFlashChipSizeByChipId(void) { uint32_t chipId = getFlashChipId(); + /** + * Chip ID + * 00 - always 00 (Chip ID use only 3 byte) + * 17 - ? looks like 2^xx is size in Byte ? //todo: find docu to this + * 40 - ? may be Speed ? //todo: find docu to this + * C8 - manufacturer ID + */ switch(chipId) { // GigaDevice diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp index 347259f4d..9292c8895 100644 --- a/libraries/SPI/SPI.cpp +++ b/libraries/SPI/SPI.cpp @@ -1,79 +1,117 @@ /* - SPI.cpp - SPI library for esp8266 + SPI.cpp - SPI library for esp8266 - Copyright (c) 2015 Hristo Gochkov. All rights reserved. - This file is part of the esp8266 core for Arduino environment. + Copyright (c) 2015 Hristo Gochkov. All rights reserved. + This file is part of the esp8266 core for Arduino environment. - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ #include "SPI.h" +#include "HardwareSerial.h" +typedef struct { + uint32_t divider; + uint32_t regValue; +} spiClockDiv_t; + +static const spiClockDiv_t spiClockDiv[] = { + { 0, (0x80000000) }, ///< @80Mhz = 80 MHz @160Mhz = 160 MHz + { 2, (0x00001001) }, ///< @80Mhz = 40 MHz @160Mhz = 80 MHz + { 4, (0x00041001) }, ///< @80Mhz = 20 MHz @160Mhz = 40 MHz + { 6, (0x000fffc0) }, ///< @80Mhz = 16 MHz @160Mhz = 32 MHz + { 8, (0x000c1001) }, ///< @80Mhz = 10 MHz @160Mhz = 20 MHz + { 10, (0x00101001) }, ///< @80Mhz = 8 MHz @160Mhz = 16 MHz + { 16, (0x001c1001) }, ///< @80Mhz = 5 MHz @160Mhz = 10 MHz + { 20, (0x00241001) }, ///< @80Mhz = 4 MHz @160Mhz = 8 MHz + { 40, (0x004c1001) }, ///< @80Mhz = 2 MHz @160Mhz = 4 MHz + { 80, (0x009c1001) }, ///< @80Mhz = 1 MHz @160Mhz = 2 MHz + { 160, (0x013c1001) }, ///< @80Mhz = 500 KHz @160Mhz = 1 MHz + { 320, (0x027c1001) }, ///< @80Mhz = 250 KHz @160Mhz = 500 KHz + { 640, (0x04fc1001) } ///< @80Mhz = 125 KHz @160Mhz = 250 KHz +}; + +static const uint8_t spiClockDiv_count = (sizeof(spiClockDiv) / sizeof(spiClockDiv_t)); SPIClass SPI; -SPIClass::SPIClass(){} +SPIClass::SPIClass() { +} -void SPIClass::begin(){ - pinMode(SCK, SPECIAL); - pinMode(MISO, SPECIAL); - pinMode(MOSI, SPECIAL); - - GPMUX = 0x105; - SPI1C = 0; - SPI1CLK = SPI_CLOCK_DIV16;//1MHz - SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE; - SPI1U1 = (7 << SPILMOSI) | (7 << SPILMISO); - SPI1C1 = 0; +void SPIClass::begin() { + pinMode(SCK, SPECIAL); ///< GPIO14 + pinMode(MISO, SPECIAL); ///< GPIO12 + pinMode(MOSI, SPECIAL); ///< GPIO13 + + GPMUX = 0x105; // note crash if spi flash Frequency < 40MHz + SPI1C = 0; + setFrequency(1000000); ///< 1Mhz + SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE; + SPI1U1 = (7 << SPILMOSI) | (7 << SPILMISO); + SPI1C1 = 0; } void SPIClass::end() { - pinMode(SCK, INPUT); - pinMode(MISO, INPUT); - pinMode(MOSI, INPUT); + pinMode(SCK, INPUT); + pinMode(MISO, INPUT); + pinMode(MOSI, INPUT); } void SPIClass::beginTransaction(SPISettings settings) { - setClockDivider(settings._clock); - setBitOrder(settings._bitOrder); - setDataMode(settings._dataMode); + setFrequency(settings._clock); + setBitOrder(settings._bitOrder); + setDataMode(settings._dataMode); } -void SPIClass::endTransaction() {} +void SPIClass::endTransaction() { +} void SPIClass::setDataMode(uint8_t dataMode) { - + // todo find way to set } void SPIClass::setBitOrder(uint8_t bitOrder) { - if (bitOrder == MSBFIRST) { - SPI1C &= ~(SPICWBO | SPICRBO); - } else { - SPI1C |= (SPICWBO | SPICRBO); - } + if(bitOrder == MSBFIRST) { + SPI1C &= ~(SPICWBO | SPICRBO); + } else { + SPI1C |= (SPICWBO | SPICRBO); + } +} + +void SPIClass::setFrequency(uint32_t freq) { + uint8_t i = 0; + // find the best match + if(freq < F_CPU) { + for(i = 1; i < (spiClockDiv_count-1); i++) { + if(freq >= (F_CPU/spiClockDiv[i].divider)) { + break; + } + } + } + setClockDivider(spiClockDiv[i].regValue); } void SPIClass::setClockDivider(uint32_t clockDiv) { - SPI1CLK = clockDiv; + SPI1CLK = clockDiv; } uint8_t SPIClass::transfer(uint8_t data) { - while(SPI1CMD & SPIBUSY); - SPI1W0 = data; - SPI1CMD |= SPIBUSY; - while(SPI1CMD & SPIBUSY); - return (uint8_t)(SPI1W0 & 0xff); + while(SPI1CMD & SPIBUSY); + SPI1W0 = data; + SPI1CMD |= SPIBUSY; + while(SPI1CMD & SPIBUSY); + return (uint8_t) (SPI1W0 & 0xff); } uint16_t SPIClass::transfer16(uint16_t data) { diff --git a/libraries/SPI/SPI.h b/libraries/SPI/SPI.h index 5ff10d3a3..3daf57c62 100644 --- a/libraries/SPI/SPI.h +++ b/libraries/SPI/SPI.h @@ -26,35 +26,8 @@ #define FCPU80 80000000L -#if F_CPU == FCPU80 -#define SPI_CLOCK_DIV80M 0x80000000 //80 MHz -#define SPI_CLOCK_DIV40M 0x00001001 //40 MHz -#define SPI_CLOCK_DIV20M 0x00041001 //20 MHz -#define SPI_CLOCK_DIV16M 0x000fffc0 //16 MHz -#define SPI_CLOCK_DIV10M 0x000c1001 //10 MHz -#define SPI_CLOCK_DIV2 0x00101001 //8 MHz -#define SPI_CLOCK_DIV5M 0x001c1001 //5 MHz -#define SPI_CLOCK_DIV4 0x00241001 //4 MHz -#define SPI_CLOCK_DIV8 0x004c1001 //2 MHz -#define SPI_CLOCK_DIV16 0x009c1001 //1 MHz -#define SPI_CLOCK_DIV32 0x013c1001 //500 KHz -#define SPI_CLOCK_DIV64 0x027c1001 //250 KHz -#define SPI_CLOCK_DIV128 0x04fc1001 //125 KHz -#else -#define SPI_CLOCK_DIV160M 0x80000000 //160 MHz -#define SPI_CLOCK_DIV80M 0x00001001 //80 MHz -#define SPI_CLOCK_DIV40M 0x00041001 //40 MHz -#define SPI_CLOCK_DIV32M 0x000fffc0 //32 MHz -#define SPI_CLOCK_DIV20M 0x000c1001 //20 MHz -#define SPI_CLOCK_DIV16M 0x00101001 //16 MHz -#define SPI_CLOCK_DIV10M 0x001c1001 //10 MHz -#define SPI_CLOCK_DIV2 0x00241001 //8 MHz -#define SPI_CLOCK_DIV4 0x004c1001 //4 MHz -#define SPI_CLOCK_DIV8 0x009c1001 //2 MHz -#define SPI_CLOCK_DIV16 0x013c1001 //1 MHz -#define SPI_CLOCK_DIV32 0x027c1001 //500 KHz -#define SPI_CLOCK_DIV64 0x04fc1001 //250 KHz -#endif + + const uint8_t SPI_MODE0 = 0x00; const uint8_t SPI_MODE1 = 0x04; @@ -63,7 +36,7 @@ const uint8_t SPI_MODE3 = 0x0C; class SPISettings { public: - SPISettings() :_clock(SPI_CLOCK_DIV16), _bitOrder(LSBFIRST), _dataMode(SPI_MODE0){} + SPISettings() :_clock(1000000), _bitOrder(LSBFIRST), _dataMode(SPI_MODE0){} SPISettings(uint32_t clock, uint8_t bitOrder, uint8_t dataMode) :_clock(clock), _bitOrder(bitOrder), _dataMode(dataMode){} uint32_t _clock; uint8_t _bitOrder; @@ -77,6 +50,7 @@ public: void end(); void setBitOrder(uint8_t bitOrder); void setDataMode(uint8_t dataMode); + void setFrequency(uint32_t freq); void setClockDivider(uint32_t clockDiv); void beginTransaction(SPISettings settings); uint8_t transfer(uint8_t data); From ee5def9c8c6ca3375a5b4f38b1df3adbdc882281 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 7 May 2015 19:48:55 +0200 Subject: [PATCH 05/27] add CPHA support for SPI - tested with logic analyzer --- libraries/SPI/SPI.cpp | 24 ++++++++++++++++++++++-- libraries/SPI/SPI.h | 13 ++++--------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp index 9292c8895..6e5cfb7cd 100644 --- a/libraries/SPI/SPI.cpp +++ b/libraries/SPI/SPI.cpp @@ -54,7 +54,7 @@ void SPIClass::begin() { pinMode(MISO, SPECIAL); ///< GPIO12 pinMode(MOSI, SPECIAL); ///< GPIO13 - GPMUX = 0x105; // note crash if spi flash Frequency < 40MHz + GPMUX = 0x105; // note crash if SPI flash Frequency < 40MHz SPI1C = 0; setFrequency(1000000); ///< 1Mhz SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE; @@ -78,7 +78,27 @@ void SPIClass::endTransaction() { } void SPIClass::setDataMode(uint8_t dataMode) { - // todo find way to set + +/** + SPI_MODE0 0x00 - CPOL: 0 CPHA: 0 + SPI_MODE1 0x01 - CPOL: 0 CPHA: 1 + SPI_MODE2 0x10 - CPOL: 1 CPHA: 0 + SPI_MODE3 0x11 - CPOL: 1 CPHA: 1 +*/ + + bool CPOL = (dataMode&0x10); ///< CPOL (Clock Polarity) + bool CPHA = (dataMode&0x01); ///< CPHA (Clock Phase) + + if(CPHA) { + SPI1U |= (SPIUSME); + } else { + SPI1U &= ~(SPIUSME); + } + + if(CPOL) { + //todo How set CPOL??? + } + } void SPIClass::setBitOrder(uint8_t bitOrder) { diff --git a/libraries/SPI/SPI.h b/libraries/SPI/SPI.h index 3daf57c62..e8e9b2c92 100644 --- a/libraries/SPI/SPI.h +++ b/libraries/SPI/SPI.h @@ -24,15 +24,10 @@ #include #include -#define FCPU80 80000000L - - - - -const uint8_t SPI_MODE0 = 0x00; -const uint8_t SPI_MODE1 = 0x04; -const uint8_t SPI_MODE2 = 0x08; -const uint8_t SPI_MODE3 = 0x0C; +const uint8_t SPI_MODE0 = 0x00; ///< CPOL: 0 CPHA: 0 +const uint8_t SPI_MODE1 = 0x01; ///< CPOL: 0 CPHA: 1 +const uint8_t SPI_MODE2 = 0x10; ///< CPOL: 1 CPHA: 0 +const uint8_t SPI_MODE3 = 0x11; ///< CPOL: 1 CPHA: 1 class SPISettings { public: From 7f4a10062b74db309434348220d8e415622ab1db Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 7 May 2015 20:48:59 +0200 Subject: [PATCH 06/27] update README add some docu and todo --- README.md | 3 ++- libraries/SPI/SPI.cpp | 45 +++++++++++++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 0f01ba86d..bf6cba3b3 100644 --- a/README.md +++ b/README.md @@ -132,7 +132,8 @@ else they default to pins 4(SDA) and 5(SCL). #### SPI #### -SPI library supports the entire Arduino SPI API including transactions, including setting phase and polarity. +SPI library supports the entire Arduino SPI API including transactions, including setting phase (CPHA). +Setting the Clock polarity (CPOL) is not supported, yet (SPI_MODE2 and SPI_MODE3 not working). #### ESP-specific APIs #### diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp index 6e5cfb7cd..8cd8f8514 100644 --- a/libraries/SPI/SPI.cpp +++ b/libraries/SPI/SPI.cpp @@ -21,27 +21,39 @@ #include "SPI.h" #include "HardwareSerial.h" + typedef struct { uint32_t divider; - uint32_t regValue; + union { + uint32_t regValue; + struct { + unsigned regL :6; + unsigned regH :6; + unsigned regN :6; + unsigned regPre :13; + unsigned regEQU :1; + }; + }; } spiClockDiv_t; +// todo find way of calculation for the divider static const spiClockDiv_t spiClockDiv[] = { - { 0, (0x80000000) }, ///< @80Mhz = 80 MHz @160Mhz = 160 MHz - { 2, (0x00001001) }, ///< @80Mhz = 40 MHz @160Mhz = 80 MHz - { 4, (0x00041001) }, ///< @80Mhz = 20 MHz @160Mhz = 40 MHz - { 6, (0x000fffc0) }, ///< @80Mhz = 16 MHz @160Mhz = 32 MHz - { 8, (0x000c1001) }, ///< @80Mhz = 10 MHz @160Mhz = 20 MHz - { 10, (0x00101001) }, ///< @80Mhz = 8 MHz @160Mhz = 16 MHz - { 16, (0x001c1001) }, ///< @80Mhz = 5 MHz @160Mhz = 10 MHz - { 20, (0x00241001) }, ///< @80Mhz = 4 MHz @160Mhz = 8 MHz - { 40, (0x004c1001) }, ///< @80Mhz = 2 MHz @160Mhz = 4 MHz - { 80, (0x009c1001) }, ///< @80Mhz = 1 MHz @160Mhz = 2 MHz - { 160, (0x013c1001) }, ///< @80Mhz = 500 KHz @160Mhz = 1 MHz - { 320, (0x027c1001) }, ///< @80Mhz = 250 KHz @160Mhz = 500 KHz - { 640, (0x04fc1001) } ///< @80Mhz = 125 KHz @160Mhz = 250 KHz + { 0, (0x80000000) }, ///< [0] EQU: 1 Pre: 0 N: 0 H: 0 L: 0 Div: 0 @80Mhz = 80 MHz @160Mhz = 160 MHz + { 2, (0x00001001) }, ///< [1] EQU: 0 Pre: 0 N: 1 H: 0 L: 1 Div: 2 @80Mhz = 40 MHz @160Mhz = 80 MHz + { 4, (0x00041001) }, ///< [2] EQU: 0 Pre: 1 N: 1 H: 0 L: 1 Div: 4 @80Mhz = 20 MHz @160Mhz = 40 MHz + { 6, (0x000fffc0) }, ///< [3] EQU: 0 Pre: 3 N: 63 H: 63 L: 0 Div: 6 @80Mhz = 16 MHz @160Mhz = 32 MHz + { 8, (0x000c1001) }, ///< [4] EQU: 0 Pre: 3 N: 1 H: 0 L: 1 Div: 8 @80Mhz = 10 MHz @160Mhz = 20 MHz + { 10, (0x00101001) }, ///< [5] EQU: 0 Pre: 4 N: 1 H: 0 L: 1 Div: 10 @80Mhz = 8 MHz @160Mhz = 16 MHz + { 16, (0x001c1001) }, ///< [6] EQU: 0 Pre: 7 N: 1 H: 0 L: 1 Div: 16 @80Mhz = 5 MHz @160Mhz = 10 MHz + { 20, (0x00241001) }, ///< [7] EQU: 0 Pre: 9 N: 1 H: 0 L: 1 Div: 20 @80Mhz = 4 MHz @160Mhz = 8 MHz + { 40, (0x004c1001) }, ///< [8] EQU: 0 Pre: 19 N: 1 H: 0 L: 1 Div: 40 @80Mhz = 2 MHz @160Mhz = 4 MHz + { 80, (0x009c1001) }, ///< [9] EQU: 0 Pre: 39 N: 1 H: 0 L: 1 Div: 80 @80Mhz = 1 MHz @160Mhz = 2 MHz + { 160, (0x013c1001) }, ///< [10] EQU: 0 Pre: 79 N: 1 H: 0 L: 1 Div: 160 @80Mhz = 500 KHz @160Mhz = 1 MHz + { 320, (0x027c1001) }, ///< [11] EQU: 0 Pre: 159 N: 1 H: 0 L: 1 Div: 320 @80Mhz = 250 KHz @160Mhz = 500 KHz + { 640, (0x04fc1001) } ///< [12] EQU: 0 Pre: 319 N: 1 H: 0 L: 1 Div: 640 @80Mhz = 125 KHz @160Mhz = 250 KHz }; + static const uint8_t spiClockDiv_count = (sizeof(spiClockDiv) / sizeof(spiClockDiv_t)); SPIClass SPI; @@ -53,6 +65,11 @@ void SPIClass::begin() { pinMode(SCK, SPECIAL); ///< GPIO14 pinMode(MISO, SPECIAL); ///< GPIO12 pinMode(MOSI, SPECIAL); ///< GPIO13 +/* + for(uint8_t i = 0; i < (spiClockDiv_count); i++) { + os_printf("[%d]\t EQU: %d\t Pre: %d\t N: %d\t H: %d\t L: %d\t Div: %d - %d\n", i, spiClockDiv[i].regEQU, spiClockDiv[i].regPre, spiClockDiv[i].regN, spiClockDiv[i].regH, spiClockDiv[i].regL, spiClockDiv[i].divider ); + } +*/ GPMUX = 0x105; // note crash if SPI flash Frequency < 40MHz SPI1C = 0; From 367962d89e1f5e33c9d93880c613351d6a2d96a5 Mon Sep 17 00:00:00 2001 From: Makuna Date: Thu, 7 May 2015 12:29:37 -0700 Subject: [PATCH 07/27] refactored xt_disable_intterupts to accept level due to the rsil requirement that the level be a constant, the method was moved into a macro --- cores/esp8266/Arduino.h | 14 ++++++++++---- cores/esp8266/core_esp8266_wiring_digital.c | 16 ++-------------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 430cf6f02..51aa65602 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -124,11 +124,17 @@ void timer1_write(uint32_t ticks); //maximum ticks 8388607 void ets_intr_lock(); void ets_intr_unlock(); -void xt_enable_interrupts(); -void xt_disable_interrupts(); +// level (0-15), +// level 15 will disable ALL interrupts, +// level 0 will disable most software interrupts +// +#define xt_disable_interrupts(state, level) __asm__ __volatile__("rsil %0," __STRINGIFY(level) "; esync; isync; dsync" : "=a" (state)) +#define xt_enable_interrupts(state) __asm__ __volatile__("wsr %0,ps; esync" :: "a" (state) : "memory") -#define interrupts() xt_enable_interrupts(); -#define noInterrupts() xt_disable_interrupts(); +extern uint32_t interruptsState; + +#define interrupts() xt_enable_interrupts(interruptsState) +#define noInterrupts() xt_disable_interrupts(interruptsState, 15) #define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) #define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() ) diff --git a/cores/esp8266/core_esp8266_wiring_digital.c b/cores/esp8266/core_esp8266_wiring_digital.c index 7cdfa3fbc..54c2b557b 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.c +++ b/cores/esp8266/core_esp8266_wiring_digital.c @@ -139,20 +139,8 @@ extern void __detachInterrupt(uint8_t pin) { } } -static uint32_t interruptState = 0; - -void xt_disable_interrupts() -{ - __asm__ __volatile__("rsil %0,15":"=a" (interruptState)); - __asm__("esync"); - __asm__("isync"); - __asm__("dsync"); -} -void xt_enable_interrupts() -{ - __asm__ __volatile__("wsr %0,ps"::"a" (interruptState) : "memory"); - __asm__("esync"); -} +// stored state for the noInterrupts/interrupts methods +uint32_t interruptsState = 0; void initPins() { //Disable UART interrupts From 49fc1980fe636b399c3baee4f37bedd4e9399c26 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 7 May 2015 22:16:51 +0200 Subject: [PATCH 08/27] add back SPI_CLOCK_DIVx defines may needed by some library Note: better use SPI.setFrequency() --- libraries/SPI/SPI.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/libraries/SPI/SPI.h b/libraries/SPI/SPI.h index e8e9b2c92..a39f3d042 100644 --- a/libraries/SPI/SPI.h +++ b/libraries/SPI/SPI.h @@ -24,6 +24,25 @@ #include #include +// This defines are not representing the real Divider of the ESP8266 +// the Defines match to an AVR Arduino on 16MHz for better compatibility +#if F_CPU == 80000000L +#define SPI_CLOCK_DIV2 0x00101001 //8 MHz +#define SPI_CLOCK_DIV4 0x00241001 //4 MHz +#define SPI_CLOCK_DIV8 0x004c1001 //2 MHz +#define SPI_CLOCK_DIV16 0x009c1001 //1 MHz +#define SPI_CLOCK_DIV32 0x013c1001 //500 KHz +#define SPI_CLOCK_DIV64 0x027c1001 //250 KHz +#define SPI_CLOCK_DIV128 0x04fc1001 //125 KHz +#else +#define SPI_CLOCK_DIV2 0x00241001 //8 MHz +#define SPI_CLOCK_DIV4 0x004c1001 //4 MHz +#define SPI_CLOCK_DIV8 0x009c1001 //2 MHz +#define SPI_CLOCK_DIV16 0x013c1001 //1 MHz +#define SPI_CLOCK_DIV32 0x027c1001 //500 KHz +#define SPI_CLOCK_DIV64 0x04fc1001 //250 KHz +#endif + const uint8_t SPI_MODE0 = 0x00; ///< CPOL: 0 CPHA: 0 const uint8_t SPI_MODE1 = 0x01; ///< CPOL: 0 CPHA: 1 const uint8_t SPI_MODE2 = 0x10; ///< CPOL: 1 CPHA: 0 From d7a88c3ea388eb802109ea8c629f2c183d1c6ed9 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Fri, 8 May 2015 00:48:08 +0200 Subject: [PATCH 09/27] use a function to calculate best match clock register for SPI TEST: Frequency: 1000000 -> [0x009C1001] EQU: 0 Pre: 39 N: 1 H: 0 L: 1 - Back Calculated Frequency: 1000000 Frequency: 4000000 -> [0x00001001] EQU: 0 Pre: 0 N: 1 H: 0 L: 1 - Back Calculated Frequency: 40000000 Frequency: 2000000 -> [0x00041001] EQU: 0 Pre: 1 N: 1 H: 0 L: 1 - Back Calculated Frequency: 20000000 Frequency: 1600000 -> [0x00004002] EQU: 0 Pre: 0 N: 4 H: 0 L: 2 - Back Calculated Frequency: 16000000 Frequency: 1610000 -> [0x00004002] EQU: 0 Pre: 0 N: 4 H: 0 L: 2 - Back Calculated Frequency: 16000000 Frequency: 1000000 -> [0x000C1001] EQU: 0 Pre: 3 N: 1 H: 0 L: 1 - Back Calculated Frequency: 10000000 Frequency: 8000000 -> [0x00101001] EQU: 0 Pre: 4 N: 1 H: 0 L: 1 - Back Calculated Frequency: 8000000 Frequency: 5000000 -> [0x001C1001] EQU: 0 Pre: 7 N: 1 H: 0 L: 1 - Back Calculated Frequency: 5000000 Frequency: 4000000 -> [0x00241001] EQU: 0 Pre: 9 N: 1 H: 0 L: 1 - Back Calculated Frequency: 4000000 Frequency: 2000000 -> [0x004C1001] EQU: 0 Pre: 19 N: 1 H: 0 L: 1 - Back Calculated Frequency: 2000000 Frequency: 1000000 -> [0x009C1001] EQU: 0 Pre: 39 N: 1 H: 0 L: 1 - Back Calculated Frequency: 1000000 Frequency: 500000 -> [0x013C1001] EQU: 0 Pre: 79 N: 1 H: 0 L: 1 - Back Calculated Frequency: 500000 Frequency: 250000 -> [0x027C1001] EQU: 0 Pre: 159 N: 1 H: 0 L: 1 - Back Calculated Frequency: 250000 Frequency: 125000 -> [0x04FC1001] EQU: 0 Pre: 319 N: 1 H: 0 L: 1 - Back Calculated Frequency: 125000 Frequency: 6666666 -> [0x00141001] EQU: 0 Pre: 5 N: 1 H: 0 L: 1 - Back Calculated Frequency: 6666666 Frequency: 6000000 -> [0x00181001] EQU: 0 Pre: 6 N: 1 H: 0 L: 1 - Back Calculated Frequency: 5714285 Frequency: 3000000 -> [0x00202001] EQU: 0 Pre: 8 N: 2 H: 0 L: 1 - Back Calculated Frequency: 2962962 Frequency: 100 -> [0x7FFFF020] EQU: 0 Pre: 8191 N: 63 H: 0 L: 32 - Back Calculated Frequency: 152 Frequency: 125000 -> [0x04FC1001] EQU: 0 Pre: 319 N: 1 H: 0 L: 1 - Back Calculated Frequency: 125000 Frequency: 16457 -> [0x25F81001] EQU: 0 Pre: 2430 N: 1 H: 0 L: 1 - Back Calculated Frequency: 16454 --- libraries/SPI/SPI.cpp | 155 +++++++++++++++++++++++++++--------------- 1 file changed, 102 insertions(+), 53 deletions(-) diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp index 8cd8f8514..2523e689f 100644 --- a/libraries/SPI/SPI.cpp +++ b/libraries/SPI/SPI.cpp @@ -22,39 +22,16 @@ #include "SPI.h" #include "HardwareSerial.h" -typedef struct { - uint32_t divider; - union { - uint32_t regValue; - struct { - unsigned regL :6; - unsigned regH :6; - unsigned regN :6; - unsigned regPre :13; - unsigned regEQU :1; - }; +typedef union { + uint32_t regValue; + struct { + unsigned regL :6; + unsigned regH :6; + unsigned regN :6; + unsigned regPre :13; + unsigned regEQU :1; }; -} spiClockDiv_t; - -// todo find way of calculation for the divider -static const spiClockDiv_t spiClockDiv[] = { - { 0, (0x80000000) }, ///< [0] EQU: 1 Pre: 0 N: 0 H: 0 L: 0 Div: 0 @80Mhz = 80 MHz @160Mhz = 160 MHz - { 2, (0x00001001) }, ///< [1] EQU: 0 Pre: 0 N: 1 H: 0 L: 1 Div: 2 @80Mhz = 40 MHz @160Mhz = 80 MHz - { 4, (0x00041001) }, ///< [2] EQU: 0 Pre: 1 N: 1 H: 0 L: 1 Div: 4 @80Mhz = 20 MHz @160Mhz = 40 MHz - { 6, (0x000fffc0) }, ///< [3] EQU: 0 Pre: 3 N: 63 H: 63 L: 0 Div: 6 @80Mhz = 16 MHz @160Mhz = 32 MHz - { 8, (0x000c1001) }, ///< [4] EQU: 0 Pre: 3 N: 1 H: 0 L: 1 Div: 8 @80Mhz = 10 MHz @160Mhz = 20 MHz - { 10, (0x00101001) }, ///< [5] EQU: 0 Pre: 4 N: 1 H: 0 L: 1 Div: 10 @80Mhz = 8 MHz @160Mhz = 16 MHz - { 16, (0x001c1001) }, ///< [6] EQU: 0 Pre: 7 N: 1 H: 0 L: 1 Div: 16 @80Mhz = 5 MHz @160Mhz = 10 MHz - { 20, (0x00241001) }, ///< [7] EQU: 0 Pre: 9 N: 1 H: 0 L: 1 Div: 20 @80Mhz = 4 MHz @160Mhz = 8 MHz - { 40, (0x004c1001) }, ///< [8] EQU: 0 Pre: 19 N: 1 H: 0 L: 1 Div: 40 @80Mhz = 2 MHz @160Mhz = 4 MHz - { 80, (0x009c1001) }, ///< [9] EQU: 0 Pre: 39 N: 1 H: 0 L: 1 Div: 80 @80Mhz = 1 MHz @160Mhz = 2 MHz - { 160, (0x013c1001) }, ///< [10] EQU: 0 Pre: 79 N: 1 H: 0 L: 1 Div: 160 @80Mhz = 500 KHz @160Mhz = 1 MHz - { 320, (0x027c1001) }, ///< [11] EQU: 0 Pre: 159 N: 1 H: 0 L: 1 Div: 320 @80Mhz = 250 KHz @160Mhz = 500 KHz - { 640, (0x04fc1001) } ///< [12] EQU: 0 Pre: 319 N: 1 H: 0 L: 1 Div: 640 @80Mhz = 125 KHz @160Mhz = 250 KHz -}; - - -static const uint8_t spiClockDiv_count = (sizeof(spiClockDiv) / sizeof(spiClockDiv_t)); +} spiClk_t; SPIClass SPI; @@ -65,15 +42,10 @@ void SPIClass::begin() { pinMode(SCK, SPECIAL); ///< GPIO14 pinMode(MISO, SPECIAL); ///< GPIO12 pinMode(MOSI, SPECIAL); ///< GPIO13 -/* - for(uint8_t i = 0; i < (spiClockDiv_count); i++) { - os_printf("[%d]\t EQU: %d\t Pre: %d\t N: %d\t H: %d\t L: %d\t Div: %d - %d\n", i, spiClockDiv[i].regEQU, spiClockDiv[i].regPre, spiClockDiv[i].regN, spiClockDiv[i].regH, spiClockDiv[i].regL, spiClockDiv[i].divider ); - } -*/ GPMUX = 0x105; // note crash if SPI flash Frequency < 40MHz SPI1C = 0; - setFrequency(1000000); ///< 1Mhz + setFrequency(1000000); ///< 1MHz SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE; SPI1U1 = (7 << SPILMOSI) | (7 << SPILMISO); SPI1C1 = 0; @@ -96,15 +68,15 @@ void SPIClass::endTransaction() { void SPIClass::setDataMode(uint8_t dataMode) { -/** - SPI_MODE0 0x00 - CPOL: 0 CPHA: 0 - SPI_MODE1 0x01 - CPOL: 0 CPHA: 1 - SPI_MODE2 0x10 - CPOL: 1 CPHA: 0 - SPI_MODE3 0x11 - CPOL: 1 CPHA: 1 -*/ + /** + SPI_MODE0 0x00 - CPOL: 0 CPHA: 0 + SPI_MODE1 0x01 - CPOL: 0 CPHA: 1 + SPI_MODE2 0x10 - CPOL: 1 CPHA: 0 + SPI_MODE3 0x11 - CPOL: 1 CPHA: 1 + */ - bool CPOL = (dataMode&0x10); ///< CPOL (Clock Polarity) - bool CPHA = (dataMode&0x01); ///< CPHA (Clock Phase) + bool CPOL = (dataMode & 0x10); ///< CPOL (Clock Polarity) + bool CPHA = (dataMode & 0x01); ///< CPHA (Clock Phase) if(CPHA) { SPI1U |= (SPIUSME); @@ -126,17 +98,92 @@ void SPIClass::setBitOrder(uint8_t bitOrder) { } } +/** + * calculate the Frequency based on the register value + * @param reg + * @return + */ +static uint32_t ClkRegToFreq(spiClk_t * reg) { + return (F_CPU / ((reg->regPre + 1) * (reg->regN + 1))); +} + void SPIClass::setFrequency(uint32_t freq) { - uint8_t i = 0; + static uint32_t lastSetFrequency = 0; + static uint32_t lastSetRegister = 0; + + if(freq >= F_CPU) { + setClockDivider(0x80000000); + return; + } + + if(lastSetFrequency == freq && lastSetRegister == SPI1CLK) { + // do nothing (speed optimization) + return; + } + + const spiClk_t minFreqReg = { 0x7FFFF000 }; + uint32_t minFreq = ClkRegToFreq((spiClk_t*) &minFreqReg); + if(freq < minFreq) { + freq = minFreq; + } + + uint8_t calN = 1; + + spiClk_t bestReg = { 0 }; + int32_t bestFreq = 0; + // find the best match - if(freq < F_CPU) { - for(i = 1; i < (spiClockDiv_count-1); i++) { - if(freq >= (F_CPU/spiClockDiv[i].divider)) { + while(calN <= 0x3F) { // 0x3F max for N + + spiClk_t reg = { 0 }; + int32_t calFreq; + int32_t calPre; + int8_t calPreVari = -2; + + reg.regN = calN; + + while(calPreVari++ <= 1) { // test different variants for Pre (we calculate in int so we miss the decimals, testing is the easyest and fastest way) + calPre = (((F_CPU / (reg.regN + 1)) / freq) - 1) + calPreVari; + if(calPre > 0x1FFF) { + reg.regPre = 0x1FFF; // 8191 + } else if(calPre <= 0) { + reg.regPre = 0; + } else { + reg.regPre = calPre; + } + + reg.regL = ((reg.regN + 1) / 2); + // reg.regH = (reg.regN - reg.regL); + + // test calculation + calFreq = ClkRegToFreq(®); + //os_printf("-----[0x%08X][%d]\t EQU: %d\t Pre: %d\t N: %d\t H: %d\t L: %d = %d\n", reg.regValue, freq, reg.regEQU, reg.regPre, reg.regN, reg.regH, reg.regL, calFreq); + + if(calFreq == (int32_t) freq) { + // accurate match use it! + memcpy(&bestReg, ®, sizeof(bestReg)); break; + } else if(calFreq < (int32_t) freq) { + // never go over the requested frequency + if(abs(freq - calFreq) < abs(freq - bestFreq)) { + bestFreq = calFreq; + memcpy(&bestReg, ®, sizeof(bestReg)); + } } } + if(calFreq == (int32_t) freq) { + // accurate match use it! + break; + } + calN++; } - setClockDivider(spiClockDiv[i].regValue); + + // os_printf("[0x%08X][%d]\t EQU: %d\t Pre: %d\t N: %d\t H: %d\t L: %d\t - Real Frequency: %d\n", bestReg.regValue, freq, bestReg.regEQU, bestReg.regPre, bestReg.regN, bestReg.regH, bestReg.regL, ClkRegToFreq(&bestReg)); + + setClockDivider(bestReg.regValue); + lastSetRegister = SPI1CLK; + lastSetFrequency = freq; + } void SPIClass::setClockDivider(uint32_t clockDiv) { @@ -144,10 +191,12 @@ void SPIClass::setClockDivider(uint32_t clockDiv) { } uint8_t SPIClass::transfer(uint8_t data) { - while(SPI1CMD & SPIBUSY); + while(SPI1CMD & SPIBUSY) + ; SPI1W0 = data; SPI1CMD |= SPIBUSY; - while(SPI1CMD & SPIBUSY); + while(SPI1CMD & SPIBUSY) + ; return (uint8_t) (SPI1W0 & 0xff); } From a924ba1336910c2b8419d9c54e3240cd3aa4945b Mon Sep 17 00:00:00 2001 From: ficeto Date: Fri, 8 May 2015 02:44:59 +0300 Subject: [PATCH 10/27] add proper POST support and more methods GET params are always added plain POST is added to the GET arguments Uploads are handled by separate handler --- .../examples/SDWebServer/SDWebServer.ino | 33 ++ .../ESP8266WebServer/src/ESP8266WebServer.cpp | 378 ++++++++++++++---- .../ESP8266WebServer/src/ESP8266WebServer.h | 18 +- 3 files changed, 350 insertions(+), 79 deletions(-) diff --git a/libraries/ESP8266WebServer/examples/SDWebServer/SDWebServer.ino b/libraries/ESP8266WebServer/examples/SDWebServer/SDWebServer.ino index d7e2863af..bdc945d33 100644 --- a/libraries/ESP8266WebServer/examples/SDWebServer/SDWebServer.ino +++ b/libraries/ESP8266WebServer/examples/SDWebServer/SDWebServer.ino @@ -43,6 +43,26 @@ MDNSResponder mdns; ESP8266WebServer server(80); static bool hasSD = false; +File uploadFile; + +void handleFileUpload(){ + if(server.uri() != "/upload") return; + HTTPUpload upload = server.upload(); + if(upload.status == UPLOAD_FILE_START){ + Serial.print("Upload: START, filename:"); + Serial.println(upload.filename); + if(SD.exists((char *)upload.filename.c_str())) SD.remove((char *)upload.filename.c_str()); + uploadFile = SD.open(upload.filename.c_str(), FILE_WRITE); + } else if(upload.status == UPLOAD_FILE_WRITE){ + Serial.print("Upload: WRITE, Bytes:"); + Serial.println(upload.buflen); + if(uploadFile) uploadFile.write(upload.buf, upload.buflen); + } else if(upload.status == UPLOAD_FILE_END){ + Serial.print("Upload: END, Size:"); + Serial.println(upload.size); + if(uploadFile) uploadFile.close(); + } +} bool loadFromSdCard(String path){ String dataType = "text/plain"; @@ -152,6 +172,19 @@ void setup(void){ //Attach handler server.onNotFound(tryLoadFromSdCard); + //Attach Upload handler + server.onFileUpload(handleFileUpload); + + //Attach handler for the Upload location + server.on("/upload", HTTP_POST, [](){ + WiFiClient client = server.client(); + String message = "HTTP/1.1 200 OK\r\n"; + message += "Content-Type: text/plain\r\n"; + message += "Access-Control-Allow-Origin: *\r\n"; + message += "\r\n"; + client.print(message); + }); + //start server server.begin(); Serial.println("HTTP server started"); diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp index 6097e20e1..360876991 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp @@ -17,6 +17,7 @@ You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Modified 8 May 2015 by Hristo Gochkov (proper post and file upload handling) */ @@ -25,7 +26,8 @@ #include "WiFiClient.h" #include "ESP8266WebServer.h" -// #define DEBUG +//#define DEBUG +#define DEBUG_OUTPUT Serial1 struct ESP8266WebServer::RequestHandler { RequestHandler(ESP8266WebServer::THandlerFunction fn, const char* uri, HTTPMethod method) @@ -95,7 +97,7 @@ void ESP8266WebServer::handleClient() } #ifdef DEBUG - Serial.println("New client"); + DEBUG_OUTPUT.println("New client"); #endif // Wait for data from client to become available while(client.connected() && !client.available()){ @@ -106,86 +108,101 @@ void ESP8266WebServer::handleClient() String req = client.readStringUntil('\r'); client.readStringUntil('\n'); - HTTPMethod method = HTTP_GET; - if (req.startsWith("POST")) { - method = HTTP_POST; - } - // First line of HTTP request looks like "GET /path HTTP/1.1" // Retrieve the "/path" part by finding the spaces int addr_start = req.indexOf(' '); int addr_end = req.indexOf(' ', addr_start + 1); if (addr_start == -1 || addr_end == -1) { #ifdef DEBUG - Serial.print("Invalid request: "); - Serial.println(req); + DEBUG_OUTPUT.print("Invalid request: "); + DEBUG_OUTPUT.println(req); #endif return; } - - req = req.substring(addr_start + 1, addr_end); + + String methodStr = req.substring(0, addr_start); + String url = req.substring(addr_start + 1, addr_end); + String searchStr = ""; + int hasSearch = url.indexOf('?'); + if(hasSearch != -1){ + searchStr = url.substring(hasSearch + 1); + url = url.substring(0, hasSearch); + } + _currentUri = url; + + HTTPMethod method = HTTP_GET; + if (methodStr == "POST") { + method = HTTP_POST; + } else if (methodStr == "DELETE") { + method = HTTP_DELETE; + } else if (methodStr == "PUT") { + method = HTTP_PUT; + } else if (methodStr == "PATCH") { + method = HTTP_PATCH; + } + +#ifdef DEBUG + DEBUG_OUTPUT.print("method: "); + DEBUG_OUTPUT.print(methodStr); + DEBUG_OUTPUT.print(" url: "); + DEBUG_OUTPUT.print(url); + DEBUG_OUTPUT.print(" search: "); + DEBUG_OUTPUT.println(searchStr); +#endif String formData; - if (method == HTTP_POST) { - int contentLength = -1; - int headerCount = 0; - while(headerCount < 1024) { // there shouldn't be that much really - String line = client.readStringUntil('\r'); + //bellow is needed only when POST type request + if(method == HTTP_POST || method == HTTP_PUT || method == HTTP_PATCH){ + String boundaryStr; + String headerName; + String headerValue; + bool isForm = false; + uint32_t contentLength = 0; + //parse headers + while(1){ + req = client.readStringUntil('\r'); client.readStringUntil('\n'); - - if (line.length() > 0) { // this is a header - ++headerCount; - if (contentLength < 0 && line.startsWith("Content-Length")) { - // get content length from the header - int valuePos = line.indexOf(' ', 14); - if (valuePos > 0) { - String valueStr = line.substring(valuePos+1); - contentLength = valueStr.toInt(); -#ifdef DEBUG - Serial.print("Content-Length: "); - Serial.println(contentLength); -#endif - } - } - } - else { + if(req == "") break;//no moar headers + int headerDiv = req.indexOf(':'); + if(headerDiv == -1){ break; } + headerName = req.substring(0, headerDiv); + headerValue = req.substring(headerDiv + 2); + if(headerName == "Content-Type"){ + if(headerValue.startsWith("text/plain")){ + isForm = false; + } else if(headerValue.startsWith("multipart/form-data")){ + boundaryStr = headerValue.substring(headerValue.indexOf('=')+1); + isForm = true; + } + } else if(headerName == "Content-Length"){ + contentLength = headerValue.toInt(); + } } -#ifdef DEBUG - Serial.print("headerCount="); - Serial.println(headerCount); -#endif - if (contentLength >= 0) { - formData = ""; - int n = 0; // timeout counter - while (formData.length() < contentLength && ++n < 3) - formData += client.readString(); + + if(!isForm){ + if(searchStr != "") searchStr += '&'; + searchStr += client.readStringUntil('\r'); + client.readStringUntil('\n'); } - else { - formData = client.readStringUntil('\r'); // will return after timing out once + _parseArguments(searchStr); + if(isForm){ + _parseForm(client, boundaryStr, contentLength); } + } else { + _parseArguments(searchStr); } - else if (method == HTTP_GET) { - int args_start = req.indexOf('?'); - if (args_start != -1) { - formData = req.substring(args_start + 1); - req = req.substring(0, args_start); - } - } - client.flush(); #ifdef DEBUG - Serial.print("Request: "); - Serial.println(req); - Serial.print("Args: "); - Serial.println(formData); + DEBUG_OUTPUT.print("Request: "); + DEBUG_OUTPUT.println(url); + DEBUG_OUTPUT.print(" Arguments: "); + DEBUG_OUTPUT.println(searchStr); #endif - _parseArguments(formData); - _handleRequest(client, req, method); - + _handleRequest(client, url, method); } void ESP8266WebServer::send(int code, const char* content_type, String content) { @@ -237,6 +254,10 @@ bool ESP8266WebServer::hasArg(const char* name) { } void ESP8266WebServer::_parseArguments(String data) { +#ifdef DEBUG + DEBUG_OUTPUT.print("args: "); + DEBUG_OUTPUT.println(data); +#endif if (_currentArgs) delete[] _currentArgs; _currentArgs = 0; @@ -254,8 +275,8 @@ void ESP8266WebServer::_parseArguments(String data) { ++_currentArgCount; } #ifdef DEBUG - Serial.print("args count: "); - Serial.println(_currentArgCount); + DEBUG_OUTPUT.print("args count: "); + DEBUG_OUTPUT.println(_currentArgCount); #endif _currentArgs = new RequestArgument[_currentArgCount]; @@ -265,17 +286,17 @@ void ESP8266WebServer::_parseArguments(String data) { int equal_sign_index = data.indexOf('=', pos); int next_arg_index = data.indexOf('&', pos); #ifdef DEBUG - Serial.print("pos "); - Serial.print(pos); - Serial.print("=@ "); - Serial.print(equal_sign_index); - Serial.print(" &@ "); - Serial.println(next_arg_index); + DEBUG_OUTPUT.print("pos "); + DEBUG_OUTPUT.print(pos); + DEBUG_OUTPUT.print("=@ "); + DEBUG_OUTPUT.print(equal_sign_index); + DEBUG_OUTPUT.print(" &@ "); + DEBUG_OUTPUT.println(next_arg_index); #endif if ((equal_sign_index == -1) || ((equal_sign_index > next_arg_index) && (next_arg_index != -1))) { #ifdef DEBUG - Serial.print("arg missing value: "); - Serial.println(iarg); + DEBUG_OUTPUT.print("arg missing value: "); + DEBUG_OUTPUT.println(iarg); #endif if (next_arg_index == -1) break; @@ -286,12 +307,12 @@ void ESP8266WebServer::_parseArguments(String data) { arg.key = data.substring(pos, equal_sign_index); arg.value = data.substring(equal_sign_index + 1, next_arg_index); #ifdef DEBUG - Serial.print("arg "); - Serial.print(iarg); - Serial.print(" key: "); - Serial.print(arg.key); - Serial.print(" value: "); - Serial.println(arg.value); + DEBUG_OUTPUT.print("arg "); + DEBUG_OUTPUT.print(iarg); + DEBUG_OUTPUT.print(" key: "); + DEBUG_OUTPUT.print(arg.key); + DEBUG_OUTPUT.print(" value: "); + DEBUG_OUTPUT.println(arg.value); #endif ++iarg; if (next_arg_index == -1) @@ -300,12 +321,213 @@ void ESP8266WebServer::_parseArguments(String data) { } _currentArgCount = iarg; #ifdef DEBUG - Serial.print("args count: "); - Serial.println(_currentArgCount); + DEBUG_OUTPUT.print("args count: "); + DEBUG_OUTPUT.println(_currentArgCount); #endif } +void ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t len){ + +#ifdef DEBUG + DEBUG_OUTPUT.print("Parse Form: Boundary: "); + DEBUG_OUTPUT.print(boundary); + DEBUG_OUTPUT.print("Length: "); + DEBUG_OUTPUT.println(len); +#endif + String line; + line = client.readStringUntil('\r'); + client.readStringUntil('\n'); + //start reading the form + if(line == ("--"+boundary)){ + RequestArgument* postArgs = new RequestArgument[32]; + int postArgsLen = 0; + while(1){ + String argName; + String argValue; + String argType; + String argFilename; + bool argIsFile = false; + + line = client.readStringUntil('\r'); + client.readStringUntil('\n'); + if(line.startsWith("Content-Disposition")){ + int nameStart = line.indexOf('='); + if(nameStart != -1){ + argName = line.substring(nameStart+2); + nameStart = argName.indexOf('='); + if(nameStart == -1){ + argName = argName.substring(0, argName.length() - 1); + } else { + argFilename = argName.substring(nameStart+2, argName.length() - 1); + argName = argName.substring(0, argName.indexOf('"')); + argIsFile = true; + #ifdef DEBUG + DEBUG_OUTPUT.print("PostArg FileName: "); + DEBUG_OUTPUT.println(argFilename); + #endif + //use GET to set the filename if uploading using blob + if(argFilename == "blob" && hasArg("filename")) argFilename = arg("filename"); + } + #ifdef DEBUG + DEBUG_OUTPUT.print("PostArg Name: "); + DEBUG_OUTPUT.println(argName); + #endif + argType = "text/plain"; + line = client.readStringUntil('\r'); + client.readStringUntil('\n'); + if(line.startsWith("Content-Type")){ + argType = line.substring(line.indexOf(':')+2); + //skip next line + client.readStringUntil('\r'); + client.readStringUntil('\n'); + } + #ifdef DEBUG + DEBUG_OUTPUT.print("PostArg Type: "); + DEBUG_OUTPUT.println(argType); + #endif + if(!argIsFile){ + while(1){ + line = client.readStringUntil('\r'); + client.readStringUntil('\n'); + if(line.startsWith("--"+boundary)) break; + argValue += line+"\n"; + } + #ifdef DEBUG + DEBUG_OUTPUT.print("PostArg Value: "); + DEBUG_OUTPUT.println(argValue); + DEBUG_OUTPUT.println(); + #endif + + RequestArgument& arg = postArgs[postArgsLen++]; + arg.key = argName; + arg.value = argValue; + + if(line == ("--"+boundary+"--")){ + #ifdef DEBUG + DEBUG_OUTPUT.println("Done Parsing POST"); + #endif + break; + } + } else { + _currentUpload.status = UPLOAD_FILE_START; + _currentUpload.name = argName; + _currentUpload.filename = argFilename; + _currentUpload.type = argType; + _currentUpload.size = 0; + _currentUpload.buflen = 0; +#ifdef DEBUG + DEBUG_OUTPUT.print("Start File: "); + DEBUG_OUTPUT.print(_currentUpload.filename); + DEBUG_OUTPUT.print(" Type: "); + DEBUG_OUTPUT.println(_currentUpload.type); +#endif + if(_fileUploadHandler) _fileUploadHandler(); + _currentUpload.status = UPLOAD_FILE_WRITE; + uint8_t argByte = client.read(); +readfile: + while(argByte != 0x0D){ + _currentUpload.buf[_currentUpload.buflen++] = argByte; + if(_currentUpload.buflen == 1460){ + #ifdef DEBUG + DEBUG_OUTPUT.println("Write File: 1460"); + #endif + if(_fileUploadHandler) _fileUploadHandler(); + _currentUpload.size += _currentUpload.buflen; + _currentUpload.buflen = 0; + } + argByte = client.read(); + } + + argByte = client.read(); + if(argByte == 0x0A){ + line = client.readStringUntil(0x0D); + client.readStringUntil(0x0A); +#ifdef DEBUG + DEBUG_OUTPUT.print("Write File: "); + DEBUG_OUTPUT.println(_currentUpload.buflen); +#endif + if(_fileUploadHandler) _fileUploadHandler(); + _currentUpload.size += _currentUpload.buflen; + _currentUpload.buflen = 0; + if(line.startsWith("--"+boundary)){ + _currentUpload.status = UPLOAD_FILE_END; +#ifdef DEBUG + DEBUG_OUTPUT.print("End File: "); + DEBUG_OUTPUT.print(_currentUpload.filename); + DEBUG_OUTPUT.print(" Type: "); + DEBUG_OUTPUT.print(_currentUpload.type); + DEBUG_OUTPUT.print(" Size: "); + DEBUG_OUTPUT.println(_currentUpload.size); +#endif + if(_fileUploadHandler) _fileUploadHandler(); + if(line == ("--"+boundary+"--")){ +#ifdef DEBUG + DEBUG_OUTPUT.println("Done Parsing POST"); +#endif + break; + } + continue; + } else { + _currentUpload.buf[_currentUpload.buflen++] = 0x0D; + _currentUpload.buf[_currentUpload.buflen++] = 0x0A; + const char * lineChars = line.c_str(); + uint32_t i = 0; + while(i < os_strlen(lineChars)){ + _currentUpload.buf[_currentUpload.buflen++] = lineChars[i++]; + if(_currentUpload.buflen == 1460){ +#ifdef DEBUG + DEBUG_OUTPUT.println("Write File: 1460"); +#endif + if(_fileUploadHandler) _fileUploadHandler(); + _currentUpload.size += _currentUpload.buflen; + _currentUpload.buflen = 0; + } + } + argByte = client.read(); + goto readfile; + } + } else { + _currentUpload.buf[_currentUpload.buflen++] = 0x0D; + if(_currentUpload.buflen == 1460){ + #ifdef DEBUG + DEBUG_OUTPUT.println("Write File: 1460"); + #endif + if(_fileUploadHandler) _fileUploadHandler(); + _currentUpload.size += _currentUpload.buflen; + _currentUpload.buflen = 0; + } + goto readfile; + } + break; + } + } + } + } + + int iarg; + int totalArgs = ((32 - postArgsLen) < _currentArgCount)?(32 - postArgsLen):_currentArgCount; + for (iarg = 0; iarg < totalArgs; iarg++){ + RequestArgument& arg = postArgs[postArgsLen++]; + arg.key = _currentArgs[iarg].key; + arg.value = _currentArgs[iarg].value; + } + if (_currentArgs) delete[] _currentArgs; + _currentArgs = new RequestArgument[postArgsLen]; + for (iarg = 0; iarg < postArgsLen; iarg++){ + RequestArgument& arg = _currentArgs[iarg]; + arg.key = postArgs[iarg].key; + arg.value = postArgs[iarg].value; + } + _currentArgCount = iarg; + + } +} + +void ESP8266WebServer::onFileUpload(THandlerFunction fn) { + _fileUploadHandler = fn; +} + void ESP8266WebServer::onNotFound(THandlerFunction fn) { _notFoundHandler = fn; } @@ -330,7 +552,7 @@ void ESP8266WebServer::_handleRequest(WiFiClient& client, String uri, HTTPMethod if (!handler){ #ifdef DEBUG - Serial.println("request handler not found"); + DEBUG_OUTPUT.println("request handler not found"); #endif if(_notFoundHandler) { diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index 3b31eab5a..423fc6173 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -17,6 +17,7 @@ You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Modified 8 May 2015 by Hristo Gochkov (proper post and file upload handling) */ @@ -25,8 +26,18 @@ #include -enum HTTPMethod { HTTP_ANY, HTTP_GET, HTTP_POST }; +enum HTTPMethod { HTTP_ANY, HTTP_GET, HTTP_POST, HTTP_PUT, HTTP_PATCH, HTTP_DELETE }; +enum HTTPUploadStatus { UPLOAD_FILE_START, UPLOAD_FILE_WRITE, UPLOAD_FILE_END }; +typedef struct { + HTTPUploadStatus status; + String filename; + String name; + String type; + size_t size; + size_t buflen; + uint8_t buf[1460]; +} HTTPUpload; class ESP8266WebServer { @@ -42,10 +53,12 @@ public: void on(const char* uri, THandlerFunction handler); void on(const char* uri, HTTPMethod method, THandlerFunction fn); void onNotFound(THandlerFunction fn); //called when handler is not assigned + void onFileUpload(THandlerFunction fn); //handle file uploads String uri() { return _currentUri; } HTTPMethod method() { return _currentMethod; } WiFiClient client() { return _currentClient; } + HTTPUpload upload() { return _currentUpload; } String arg(const char* name); // get request argument value by name String arg(int i); // get request argument value by number @@ -64,6 +77,7 @@ protected: void _parseArguments(String data); static const char* _responseCodeToString(int code); static void _appendHeader(String& response, const char* name, const char* value); + void _parseForm(WiFiClient& client, String boundary, uint32_t len); struct RequestHandler; struct RequestArgument { @@ -79,10 +93,12 @@ protected: size_t _currentArgCount; RequestArgument* _currentArgs; + HTTPUpload _currentUpload; RequestHandler* _firstHandler; RequestHandler* _lastHandler; THandlerFunction _notFoundHandler; + THandlerFunction _fileUploadHandler; }; From 7e0a104cb5b4cc7ce0044280633de8e1be7562e2 Mon Sep 17 00:00:00 2001 From: ficeto Date: Fri, 8 May 2015 03:30:41 +0300 Subject: [PATCH 11/27] fix huge leak --- libraries/ESP8266WebServer/src/ESP8266WebServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp index 360876991..0057a2d1b 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp @@ -520,7 +520,7 @@ readfile: arg.value = postArgs[iarg].value; } _currentArgCount = iarg; - + if (postArgs) delete[] postArgs; } } From 85aac8af89f00056ebe6af5a5d5d5e87fcf787f6 Mon Sep 17 00:00:00 2001 From: ficeto Date: Fri, 8 May 2015 11:44:45 +0300 Subject: [PATCH 12/27] fix SPI clock for SD library --- libraries/SD/src/utility/Sd2Card.cpp | 4 ---- libraries/SD/src/utility/Sd2Card.h | 6 +++--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/libraries/SD/src/utility/Sd2Card.cpp b/libraries/SD/src/utility/Sd2Card.cpp index 0535d0053..98a02ba42 100644 --- a/libraries/SD/src/utility/Sd2Card.cpp +++ b/libraries/SD/src/utility/Sd2Card.cpp @@ -270,11 +270,7 @@ uint8_t Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) { SPSR &= ~(1 << SPI2X); #else // USE_SPI_LIB SPI.begin(); - #ifdef ESP8266 - settings = SPISettings(SPI_CLOCK_DIV64, MSBFIRST, SPI_MODE0); - #else settings = SPISettings(250000, MSBFIRST, SPI_MODE0); - #endif #endif // USE_SPI_LIB #endif // SOFTWARE_SPI diff --git a/libraries/SD/src/utility/Sd2Card.h b/libraries/SD/src/utility/Sd2Card.h index a7935e4eb..5121ef21e 100644 --- a/libraries/SD/src/utility/Sd2Card.h +++ b/libraries/SD/src/utility/Sd2Card.h @@ -28,9 +28,9 @@ #ifdef ESP8266 #include "SPI.h" -uint32_t const SPI_FULL_SPEED = SPI_CLOCK_DIV2; -uint32_t const SPI_HALF_SPEED = SPI_CLOCK_DIV4; -uint32_t const SPI_QUARTER_SPEED = SPI_CLOCK_DIV8; +uint32_t const SPI_FULL_SPEED = 4000000; +uint32_t const SPI_HALF_SPEED = 2000000; +uint32_t const SPI_QUARTER_SPEED = 1000000; #else /** Set SCK to max rate of F_CPU/2. See Sd2Card::setSckRate(). */ uint8_t const SPI_FULL_SPEED = 0; From 8ce762db166c2a39c2bd8aa72d5765283382a446 Mon Sep 17 00:00:00 2001 From: ficeto Date: Fri, 8 May 2015 13:22:49 +0300 Subject: [PATCH 13/27] increase SD Card SPI Speed --- libraries/SD/src/utility/Sd2Card.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/SD/src/utility/Sd2Card.h b/libraries/SD/src/utility/Sd2Card.h index 5121ef21e..c7e54f66b 100644 --- a/libraries/SD/src/utility/Sd2Card.h +++ b/libraries/SD/src/utility/Sd2Card.h @@ -28,9 +28,9 @@ #ifdef ESP8266 #include "SPI.h" -uint32_t const SPI_FULL_SPEED = 4000000; -uint32_t const SPI_HALF_SPEED = 2000000; -uint32_t const SPI_QUARTER_SPEED = 1000000; +uint32_t const SPI_FULL_SPEED = 8000000; +uint32_t const SPI_HALF_SPEED = 4000000; +uint32_t const SPI_QUARTER_SPEED = 2000000; #else /** Set SCK to max rate of F_CPU/2. See Sd2Card::setSckRate(). */ uint8_t const SPI_FULL_SPEED = 0; From 5cbcd1da3c37b8f09d7b8d1d361b90b8d65aa430 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Fri, 8 May 2015 14:45:47 +0200 Subject: [PATCH 14/27] rework Adafruit_ILI9341 complete now uses the new SPI implementation tested with example graphicstest_esp8266 add missing define to SPI.h --- .../Adafruit_ILI9341/Adafruit_ILI9341.cpp | 232 ---- libraries/Adafruit_ILI9341/Adafruit_ILI9341.h | 126 -- libraries/Adafruit_ILI9341/Font16.c | 525 --------- libraries/Adafruit_ILI9341/Font16.h | 7 - libraries/Adafruit_ILI9341/Font32.c | 1038 ----------------- libraries/Adafruit_ILI9341/Font32.h | 7 - libraries/Adafruit_ILI9341/Font64.c | 338 ------ libraries/Adafruit_ILI9341/Font64.h | 7 - libraries/Adafruit_ILI9341/Font7s.c | 264 ----- libraries/Adafruit_ILI9341/Font7s.h | 7 - libraries/Adafruit_ILI9341/Load_fonts.h | 8 - libraries/Adafruit_ILI9341/driver/hspi.h | 79 -- .../Adafruit_ILI9341/driver/spi_register.h | 239 ---- .../examples/graphicstest/graphicstest.ino | 332 ------ libraries/Adafruit_ILI9341/hspi.c | 109 -- libraries/Adafruit_ILI9341/mini-printf.c | 199 ---- libraries/Adafruit_ILI9341/mini-printf.h | 41 - libraries/Adafruit_ILI9341/readme.txt | 12 - libraries/SPI/SPI.h | 2 + 19 files changed, 2 insertions(+), 3570 deletions(-) delete mode 100644 libraries/Adafruit_ILI9341/Adafruit_ILI9341.cpp delete mode 100644 libraries/Adafruit_ILI9341/Adafruit_ILI9341.h delete mode 100644 libraries/Adafruit_ILI9341/Font16.c delete mode 100644 libraries/Adafruit_ILI9341/Font16.h delete mode 100644 libraries/Adafruit_ILI9341/Font32.c delete mode 100644 libraries/Adafruit_ILI9341/Font32.h delete mode 100644 libraries/Adafruit_ILI9341/Font64.c delete mode 100644 libraries/Adafruit_ILI9341/Font64.h delete mode 100644 libraries/Adafruit_ILI9341/Font7s.c delete mode 100644 libraries/Adafruit_ILI9341/Font7s.h delete mode 100644 libraries/Adafruit_ILI9341/Load_fonts.h delete mode 100644 libraries/Adafruit_ILI9341/driver/hspi.h delete mode 100644 libraries/Adafruit_ILI9341/driver/spi_register.h delete mode 100644 libraries/Adafruit_ILI9341/examples/graphicstest/graphicstest.ino delete mode 100644 libraries/Adafruit_ILI9341/hspi.c delete mode 100644 libraries/Adafruit_ILI9341/mini-printf.c delete mode 100644 libraries/Adafruit_ILI9341/mini-printf.h delete mode 100644 libraries/Adafruit_ILI9341/readme.txt diff --git a/libraries/Adafruit_ILI9341/Adafruit_ILI9341.cpp b/libraries/Adafruit_ILI9341/Adafruit_ILI9341.cpp deleted file mode 100644 index eb8699718..000000000 --- a/libraries/Adafruit_ILI9341/Adafruit_ILI9341.cpp +++ /dev/null @@ -1,232 +0,0 @@ -#include "Adafruit_ILI9341.h" -#include "Adafruit_GFX.h" - -extern "C"{ -#include -#include -#include -#include "driver/hspi.h" -} - -#define SWAPBYTES(i) ((i>>8) | (i<<8)) - -void Adafruit_ILI9341::transmitCmdData(uint8_t cmd, const uint8_t *data, uint8_t numDataByte) -{ - spi_wait_ready(); - TFT_DC_COMMAND; - spi_send_uint8(cmd); - spi_wait_ready(); - TFT_DC_DATA; - spi_send_data(data, numDataByte); -} - -void Adafruit_ILI9341::begin() { - //Set communication using HW SPI Port - config = spi_init(HSPI, 1, spi_mode_tx); - TFT_DC_INIT; - delay(1); - - uint8_t data[15] = {0}; - - data[0] = 0x39; - data[1] = 0x2C; - data[2] = 0x00; - data[3] = 0x34; - data[4] = 0x02; - transmitCmdData(0xCB, data, 5); - - data[0] = 0x00; - data[1] = 0XC1; - data[2] = 0X30; - transmitCmdData(0xCF, data, 3); - - data[0] = 0x85; - data[1] = 0x00; - data[2] = 0x78; - transmitCmdData(0xE8, data, 3); - - data[0] = 0x00; - data[1] = 0x00; - transmitCmdData(0xEA, data, 2); - - data[0] = 0x64; - data[1] = 0x03; - data[2] = 0X12; - data[3] = 0X81; - transmitCmdData(0xED, data, 4); - - data[0] = 0x20; - transmitCmdData(0xF7, data, 1); - - data[0] = 0x23; //VRH[5:0] - transmitCmdData(0xC0, data, 1); //Power control - - data[0] = 0x10; //SAP[2:0];BT[3:0] - transmitCmdData(0xC1, data, 1); //Power control - - data[0] = 0x3e; //Contrast - data[1] = 0x28; - transmitCmdData(0xC5, data, 2); //VCM control - - data[0] = 0x86; //-- - transmitCmdData(0xC7, data, 1); //VCM control2 - - data[0] = 0x48; //C8 - transmitCmdData(0x36, data, 1); // Memory Access Control - - data[0] = 0x55; - transmitCmdData(0x3A, data, 1); - - data[0] = 0x00; - data[1] = 0x18; - transmitCmdData(0xB1, data, 2); - - data[0] = 0x08; - data[1] = 0x82; - data[2] = 0x27; - transmitCmdData(0xB6, data, 3); // Display Function Control - - data[0] = 0x00; - transmitCmdData(0xF2, data, 1); // 3Gamma Function Disable - - data[0] = 0x01; - transmitCmdData(0x26, data, 1); //Gamma curve selected - - data[0] = 0x0F; - data[1] = 0x31; - data[2] = 0x2B; - data[3] = 0x0C; - data[4] = 0x0E; - data[5] = 0x08; - data[6] = 0x4E; - data[7] = 0xF1; - data[8] = 0x37; - data[9] = 0x07; - data[10] = 0x10; - data[11] = 0x03; - data[12] = 0x0E; - data[13] = 0x09; - data[14] = 0x00; - transmitCmdData(0xE0, data, 15); //Set Gamma - - data[0] = 0x00; - data[1] = 0x0E; - data[2] = 0x14; - data[3] = 0x03; - data[4] = 0x11; - data[5] = 0x07; - data[6] = 0x31; - data[7] = 0xC1; - data[8] = 0x48; - data[9] = 0x08; - data[10] = 0x0F; - data[11] = 0x0C; - data[12] = 0x31; - data[13] = 0x36; - data[14] = 0x0F; - transmitCmdData(0xE1, data, 15); //Set Gamma - - transmitCmd(0x11); //Exit Sleep - delay(120); - - transmitCmd(0x29); //Display on - transmitCmd(0x2c); - spi_wait_ready(); -} - -void Adafruit_ILI9341::drawPixel(int16_t x, int16_t y, uint16_t color) { - - if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return; - setAddrWindow(x,y,x+1,y+1); - transmitData(SWAPBYTES(color)); -} - - -void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, int16_t h, - uint16_t color) { - - // Rudimentary clipping - if((x >= _width) || (y >= _height)) return; - - if((y+h-1) >= _height) - h = _height-y; - - setAddrWindow(x, y, x, y+h-1); - transmitData(SWAPBYTES(color), h); -} - -void Adafruit_ILI9341::drawFastHLine(int16_t x, int16_t y, int16_t w, - uint16_t color) { - - // Rudimentary clipping - if((x >= _width) || (y >= _height)) return; - if((x+w-1) >= _width) w = _width-x; - setAddrWindow(x, y, x+w-1, y); - transmitData(SWAPBYTES(color), w); -} - -void Adafruit_ILI9341::fillScreen(uint16_t color) { - fillRect(0, 0, _width, _height, color); -} - -// fill a rectangle -void Adafruit_ILI9341::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, - uint16_t color) { - - // rudimentary clipping (drawChar w/big text requires this) - if((x >= _width) || (y >= _height)) return; - if((x + w - 1) >= _width) w = _width - x; - if((y + h - 1) >= _height) h = _height - y; - - setAddrWindow(x, y, x+w-1, y+h-1); - transmitData(SWAPBYTES(color), h*w); -} - - -// Pass 8-bit (each) R,G,B, get back 16-bit packed color -uint16_t Adafruit_ILI9341::color565(uint8_t r, uint8_t g, uint8_t b) { - return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); -} - - -#define MADCTL_MY 0x80 -#define MADCTL_MX 0x40 -#define MADCTL_MV 0x20 -#define MADCTL_ML 0x10 -#define MADCTL_RGB 0x00 -#define MADCTL_BGR 0x08 -#define MADCTL_MH 0x04 - -void Adafruit_ILI9341::setRotation(uint8_t m) { - - uint8_t data; - rotation = m % 4; // can't be higher than 3 - switch (rotation) { - case 0: - data = MADCTL_MX | MADCTL_BGR; - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; - break; - case 1: - data = MADCTL_MV | MADCTL_BGR; - _width = ILI9341_TFTHEIGHT; - _height = ILI9341_TFTWIDTH; - break; - case 2: - data = MADCTL_MY | MADCTL_BGR; - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; - break; - case 3: - data = MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR; - _width = ILI9341_TFTHEIGHT; - _height = ILI9341_TFTWIDTH; - break; - } - transmitCmdData(ILI9341_MADCTL, &data, 1); -} - - -void Adafruit_ILI9341::invertDisplay(boolean i) { - transmitCmd(i ? ILI9341_INVON : ILI9341_INVOFF); -} diff --git a/libraries/Adafruit_ILI9341/Adafruit_ILI9341.h b/libraries/Adafruit_ILI9341/Adafruit_ILI9341.h deleted file mode 100644 index fdf5a50ec..000000000 --- a/libraries/Adafruit_ILI9341/Adafruit_ILI9341.h +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef _ADAFRUIT_ILI9341H_ -#define _ADAFRUIT_ILI9341H_ - -#include "Adafruit_GFX.h" - -extern "C" -{ -#include -#include -#include -#include "driver/hspi.h" -} - -#define ILI9341_TFTWIDTH 240 -#define ILI9341_TFTHEIGHT 320 - -#define ILI9341_NOP 0x00 -#define ILI9341_SWRESET 0x01 -#define ILI9341_RDDID 0x04 -#define ILI9341_RDDST 0x09 - -#define ILI9341_SLPIN 0x10 -#define ILI9341_SLPOUT 0x11 -#define ILI9341_PTLON 0x12 -#define ILI9341_NORON 0x13 - -#define ILI9341_RDMODE 0x0A -#define ILI9341_RDMADCTL 0x0B -#define ILI9341_RDPIXFMT 0x0C -#define ILI9341_RDIMGFMT 0x0A -#define ILI9341_RDSELFDIAG 0x0F - -#define ILI9341_INVOFF 0x20 -#define ILI9341_INVON 0x21 -#define ILI9341_GAMMASET 0x26 -#define ILI9341_DISPOFF 0x28 -#define ILI9341_DISPON 0x29 - -#define ILI9341_CASET 0x2A -#define ILI9341_PASET 0x2B -#define ILI9341_RAMWR 0x2C -#define ILI9341_RAMRD 0x2E - -#define ILI9341_PTLAR 0x30 -#define ILI9341_MADCTL 0x36 -#define ILI9341_PIXFMT 0x3A - -#define ILI9341_FRMCTR1 0xB1 -#define ILI9341_FRMCTR2 0xB2 -#define ILI9341_FRMCTR3 0xB3 -#define ILI9341_INVCTR 0xB4 -#define ILI9341_DFUNCTR 0xB6 - -#define ILI9341_PWCTR1 0xC0 -#define ILI9341_PWCTR2 0xC1 -#define ILI9341_PWCTR3 0xC2 -#define ILI9341_PWCTR4 0xC3 -#define ILI9341_PWCTR5 0xC4 -#define ILI9341_VMCTR1 0xC5 -#define ILI9341_VMCTR2 0xC7 - -#define ILI9341_RDID1 0xDA -#define ILI9341_RDID2 0xDB -#define ILI9341_RDID3 0xDC -#define ILI9341_RDID4 0xDD - -#define ILI9341_GMCTRP1 0xE0 -#define ILI9341_GMCTRN1 0xE1 -/* -#define ILI9341_PWCTR6 0xFC - -*/ - -// Color definitions -#define ILI9341_BLACK 0x0000 -#define ILI9341_BLUE 0x001F -#define ILI9341_RED 0xF800 -#define ILI9341_GREEN 0x07E0 -#define ILI9341_CYAN 0x07FF -#define ILI9341_MAGENTA 0xF81F -#define ILI9341_YELLOW 0xFFE0 -#define ILI9341_WHITE 0xFFFF - -#define TFT_DC_DATA GPIO_OUTPUT_SET(2, 1) -#define TFT_DC_COMMAND GPIO_OUTPUT_SET(2, 0) -#define TFT_DC_INIT PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2); TFT_DC_DATA - -#define MAKEWORD(b1, b2, b3, b4) (uint32_t(b1) | ((b2) << 8) | ((b3) << 16) | ((b4) << 24)) -#define SWAPBYTES(i) ((i>>8) | (i<<8)) - -class Adafruit_ILI9341 : public Adafruit_GFX { - -private: - uint8_t tabcolor; - spi_config config; - void transmitCmdData(uint8_t cmd, const uint8_t *data, uint8_t numDataByte); - inline void transmitData(uint16_t data) {spi_wait_ready(); spi_send_uint16(data);} - inline void transmitCmdData(uint8_t cmd, uint32_t data) {spi_wait_ready(); TFT_DC_COMMAND; spi_send_uint8(cmd); spi_wait_ready(); TFT_DC_DATA; spi_send_uint32(data);} - inline void transmitData(uint16_t data, int32_t repeats){spi_wait_ready(); spi_send_uint16_r(data, repeats);} - inline void transmitCmd(uint8_t cmd){spi_wait_ready(); TFT_DC_COMMAND; spi_send_uint8(cmd);spi_wait_ready(); TFT_DC_DATA;} - inline void drawPixelInternal(int16_t x, int16_t y, uint16_t color) { if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return; - setAddrWindow(x,y,x+1,y+1); - transmitData(SWAPBYTES(color)); - } - -public: - Adafruit_ILI9341() : Adafruit_GFX(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT), tabcolor(0){} - - void begin(), - fillScreen(uint16_t color), - drawPixel(int16_t x, int16_t y, uint16_t color), - drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color), - drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color), - fillRect(int16_t x, int16_t y, int16_t w, int16_t h, - uint16_t color), - setRotation(uint8_t r), - invertDisplay(boolean i); - inline void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) - { transmitCmdData(ILI9341_CASET, MAKEWORD(x0 >> 8, x0 & 0xFF, x1 >> 8, x1 & 0xFF)); - transmitCmdData(ILI9341_PASET, MAKEWORD(y0 >> 8, y0 & 0xFF, y1 >> 8, y1 & 0xFF)); - transmitCmd(ILI9341_RAMWR); // write to RAM - } - uint16_t color565(uint8_t r, uint8_t g, uint8_t b); -}; - -#endif diff --git a/libraries/Adafruit_ILI9341/Font16.c b/libraries/Adafruit_ILI9341/Font16.c deleted file mode 100644 index f80d20def..000000000 --- a/libraries/Adafruit_ILI9341/Font16.c +++ /dev/null @@ -1,525 +0,0 @@ -// Font size 2 - -#include "Font16.h" - -const unsigned char widtbl_f16[96] = // character width table -{ - 5, 2, 3, 8, 7, 8, 8, 2, // char 32 - 39 - 6, 6, 7, 5, 2, 5, 4, 6, // char 40 - 47 - 7, 7, 7, 7, 7, 7, 7, 7, // char 48 - 55 - 7, 7, 2, 2, 5, 5, 5, 7, // char 56 - 63 - 8, 7, 7, 7, 7, 7, 7, 7, // char 64 - 71 - 6, 3, 7, 7, 6, 9, 7, 7, // char 72 - 79 - 7, 7, 7, 7, 7, 7, 7, 9, // char 80 - 87 - 7, 7, 7, 3, 6, 3, 16, 16, // char 88 - 95 - 3, 6, 6, 6, 6, 6, 5, 6, // char 96 - 103 - 6, 4, 4, 5, 4, 7, 6, 7, // char 104 - 111 - 6, 7, 5, 5, 4, 6, 7, 7, // char 112 - 119 - 5, 6, 6, 11, 16, 8, 2, 13 // char 120 - 127 -}; - -// Row format, MSB left - -const unsigned char chr_f16_20[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 - 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_21[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11 - 0x00, 0x40, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_22[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0xA0, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 - 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_23[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x24, 0x24, 0x24, 0xFF, 0x24, 0x24, 0xFF, 0x24, // row 1 - 11 - 0x24, 0x24, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_24[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x70, 0x40, 0x40, // row 1 - 11 - 0x40, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_25[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x61, 0x91, 0x92, 0x64, 0x08, 0x10, 0x26, 0x49, // row 1 - 11 - 0x89, 0x86, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_26[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x20, 0x50, 0x88, 0x88, 0x50, 0x20, 0x52, 0x8C, // row 1 - 11 - 0x8C, 0x73, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_27[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 - 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_28[16] = // 1 unsigned char per row -{ - 0x00, 0x0C, 0x10, 0x20, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11 - 0x40, 0x40, 0x20, 0x10, 0x0C // row 12 - 16 -}; -const unsigned char chr_f16_29[16] = // 1 unsigned char per row -{ - 0x00, 0xC0, 0x20, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, // row 1 - 11 - 0x08, 0x08, 0x10, 0x20, 0xC0 // row 12 - 16 -}; -const unsigned char chr_f16_2A[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x10, 0x92, 0x54, 0x38, 0x54, 0x92, 0x10, // row 1 - 11 - 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_2B[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0xF8, 0x20, 0x20, // row 1 - 11 - 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_2C[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 - 0xC0, 0xC0, 0x40, 0x80, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_2D[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, // row 1 - 11 - 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_2E[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 - 0xC0, 0xC0, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_2F[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, // row 1 - 11 - 0x40, 0x80, 0x80, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_30[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x82, 0x82, 0x82, 0x82, 0x44, // row 1 - 11 - 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_31[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x10, 0x30, 0x50, 0x10, 0x10, 0x10, 0x10, 0x10, // row 1 - 11 - 0x10, 0x7C, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_32[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x02, 0x04, 0x18, 0x20, 0x40, // row 1 - 11 - 0x80, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_33[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x78, 0x84, 0x02, 0x04, 0x38, 0x04, 0x02, 0x02, // row 1 - 11 - 0x84, 0x78, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_34[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x04, 0x0C, 0x14, 0x24, 0x44, 0x84, 0xFE, 0x04, // row 1 - 11 - 0x04, 0x04, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_35[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0xFC, 0x80, 0x80, 0x80, 0xF8, 0x04, 0x02, 0x02, // row 1 - 11 - 0x84, 0x78, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_36[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x3C, 0x40, 0x80, 0x80, 0xB8, 0xC4, 0x82, 0x82, // row 1 - 11 - 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_37[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x7E, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, // row 1 - 11 - 0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_38[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x44, 0x38, 0x44, 0x82, 0x82, // row 1 - 11 - 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_39[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x46, 0x3A, 0x02, 0x02, // row 1 - 11 - 0x04, 0x78, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_3A[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, // row 1 - 11 - 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_3B[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, // row 1 - 11 - 0x40, 0x80, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_3C[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x40, 0x20, // row 1 - 11 - 0x10, 0x08, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_3D[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xF8, 0x00, // row 1 - 11 - 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_3E[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x10, 0x20, // row 1 - 11 - 0x40, 0x80, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_3F[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x02, 0x04, 0x08, 0x10, 0x10, // row 1 - 11 - 0x00, 0x10, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_40[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x99, 0xA5, 0xA5, 0xA5, 0xA5, 0x9E, // row 1 - 11 - 0x40, 0x3E, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_41[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x10, 0x10, 0x28, 0x28, 0x44, 0x44, 0x7C, 0x82, // row 1 - 11 - 0x82, 0x82, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_42[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x84, 0xF8, 0x84, 0x82, 0x82, // row 1 - 11 - 0x84, 0xF8, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_43[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11 - 0x42, 0x3C, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_44[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11 - 0x84, 0xF8, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_45[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0xFE, 0x80, 0x80, 0x80, 0xFC, 0x80, 0x80, 0x80, // row 1 - 11 - 0x80, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_46[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0xFE, 0x80, 0x80, 0x80, 0xF8, 0x80, 0x80, 0x80, // row 1 - 11 - 0x80, 0x80, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_47[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x80, 0x80, 0x80, 0x9C, 0x82, 0x82, // row 1 - 11 - 0x42, 0x3C, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_48[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0xFC, 0x84, 0x84, 0x84, // row 1 - 11 - 0x84, 0x84, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_49[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11 - 0x40, 0xE0, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_4A[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x82, // row 1 - 11 - 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_4B[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x84, 0x88, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x88, // row 1 - 11 - 0x84, 0x82, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_4C[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11 - 0x80, 0xFC, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_4D[32] = // 2 unsigned chars per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x80, 0xC1, 0x80, 0xA2, 0x80, // row 1 - 6 - 0xA2, 0x80, 0x94, 0x80, 0x94, 0x80, 0x88, 0x80, 0x88, 0x80, 0x80, 0x80, // row 7 - 12 - 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 13 - 16 -}; -const unsigned char chr_f16_4E[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0xC2, 0xC2, 0xA2, 0xA2, 0x92, 0x92, 0x8A, 0x8A, // row 1 - 11 - 0x86, 0x86, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_4F[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11 - 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_50[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x82, 0x82, 0x84, 0xF8, 0x80, // row 1 - 11 - 0x80, 0x80, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_51[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11 - 0x44, 0x38, 0x08, 0x06, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_52[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x82, 0x84, 0xF8, 0x90, 0x88, // row 1 - 11 - 0x84, 0x82, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_53[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x80, 0x60, 0x1C, 0x02, 0x82, // row 1 - 11 - 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_54[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // row 1 - 11 - 0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_55[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11 - 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_56[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x44, 0x44, 0x28, 0x28, // row 1 - 11 - 0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_57[32] = // 2 unsigned chars per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 6 - 0x88, 0x80, 0x88, 0x80, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x22, 0x00, // row 7 - 12 - 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 13 - 16 -}; -const unsigned char chr_f16_58[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x82, 0x82, 0x44, 0x28, 0x10, 0x10, 0x28, 0x44, // row 1 - 11 - 0x82, 0x82, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_59[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x44, 0x28, 0x10, 0x10, 0x10, // row 1 - 11 - 0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_5A[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0xFE, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x40, // row 1 - 11 - 0x80, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_5B[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0xE0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11 - 0x80, 0x80, 0xE0, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_5C[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, // row 1 - 11 - 0x40, 0x80, 0x80, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_5D[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // row 1 - 11 - 0x20, 0x20, 0xE0, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_5E[32] = // 2 unsigned chars per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xDE, 0x84, 0x21, 0x84, 0x21, // row 1 - 6 - 0x84, 0x21, 0x84, 0x21, 0x84, 0x21, 0x84, 0x21, 0x84, 0x21, 0x84, 0x21, // row 7 - 12 - 0x84, 0x21, 0x84, 0x21, 0x00, 0x00, 0x00, 0x00 // row 13 - 16 -}; -const unsigned char chr_f16_5F[32] = // 2 unsigned chars per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0x52, 0x94, 0x4A, 0x52, // row 1 - 6 - 0x84, 0x21, 0x84, 0x21, 0x08, 0x42, 0x08, 0x42, 0x10, 0x84, 0x10, 0x84, // row 7 - 12 - 0x21, 0x08, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00 // row 13 - 16 -}; -const unsigned char chr_f16_60[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 - 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_61[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x08, 0x04, 0x74, 0x8C, // row 1 - 11 - 0x8C, 0x74, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_62[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11 - 0xC8, 0xB0, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_63[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x80, 0x80, 0x80, // row 1 - 11 - 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_64[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x34, 0x4C, 0x84, 0x84, 0x84, // row 1 - 11 - 0x4C, 0x34, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_65[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x84, 0xF8, 0x80, // row 1 - 11 - 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_66[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x30, 0x48, 0x40, 0x40, 0x40, 0xE0, 0x40, 0x40, // row 1 - 11 - 0x40, 0x40, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_67[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x4C, 0x84, 0x84, 0x84, // row 1 - 11 - 0x4C, 0x34, 0x04, 0x08, 0x70 // row 12 - 16 -}; -const unsigned char chr_f16_68[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11 - 0x84, 0x84, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_69[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11 - 0x40, 0x40, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_6A[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, // row 1 - 11 - 0x10, 0x10, 0x10, 0x90, 0x60 // row 12 - 16 -}; -const unsigned char chr_f16_6B[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x88, 0x90, 0xA0, 0xC0, 0xA0, // row 1 - 11 - 0x90, 0x88, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_6C[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11 - 0x40, 0x40, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_6D[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xD2, 0x92, 0x92, 0x92, // row 1 - 11 - 0x92, 0x92, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_6E[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11 - 0x84, 0x84, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_6F[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, // row 1 - 11 - 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_70[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11 - 0xC8, 0xB0, 0x80, 0x80, 0x80 // row 12 - 16 -}; -const unsigned char chr_f16_71[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x4C, 0x84, 0x84, 0x84, // row 1 - 11 - 0x4C, 0x34, 0x04, 0x04, 0x06 // row 12 - 16 -}; -const unsigned char chr_f16_72[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xC8, 0x80, 0x80, 0x80, // row 1 - 11 - 0x80, 0x80, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_73[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x88, 0x80, 0x70, 0x08, // row 1 - 11 - 0x88, 0x70, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_74[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0xE0, 0x40, 0x40, 0x40, 0x40, // row 1 - 11 - 0x40, 0x30, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_75[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, // row 1 - 11 - 0x4C, 0x34, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_76[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x44, // row 1 - 11 - 0x28, 0x10, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_77[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x92, 0x92, // row 1 - 11 - 0xAA, 0x44, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_78[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x50, 0x20, 0x50, // row 1 - 11 - 0x88, 0x88, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_79[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, // row 1 - 11 - 0x4C, 0x34, 0x04, 0x08, 0x70 // row 12 - 16 -}; -const unsigned char chr_f16_7A[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x04, 0x08, 0x30, 0x40, // row 1 - 11 - 0x80, 0xFC, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_7B[32] = // 2 unsigned chars per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, // row 1 - 6 - 0xA0, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, // row 7 - 12 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 13 - 16 -}; -const unsigned char chr_f16_7C[32] = // 2 unsigned chars per row -{ - 0x00, 0x00, 0xF0, 0x00, 0x88, 0x00, 0x88, 0x00, 0xF0, 0x00, 0xA3, 0xC0, // row 1 - 6 - 0x92, 0x20, 0x8A, 0x20, 0x03, 0xC4, 0x02, 0x0A, 0x02, 0x11, 0x02, 0x11, // row 7 - 12 - 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00 // row 13 - 16 -}; -const unsigned char chr_f16_7D[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, // row 1 - 11 - 0x32, 0x2C, 0x20, 0x40, 0x80 // row 12 - 16 -}; -const unsigned char chr_f16_7E[16] = // 1 unsigned char per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 - 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 -}; -const unsigned char chr_f16_7F[32] = // 2 unsigned chars per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 6 - 0x00, 0x00, 0x34, 0xD0, 0x2A, 0xA8, 0x2A, 0xA8, 0x2A, 0xA8, 0x2A, 0xA8, // row 7 - 12 - 0x2A, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 13 - 16 -}; - -const unsigned char* chrtbl_f16[96] = // character pointer table -{ - chr_f16_20, chr_f16_21, chr_f16_22, chr_f16_23, chr_f16_24, chr_f16_25, chr_f16_26, chr_f16_27, - chr_f16_28, chr_f16_29, chr_f16_2A, chr_f16_2B, chr_f16_2C, chr_f16_2D, chr_f16_2E, chr_f16_2F, - chr_f16_30, chr_f16_31, chr_f16_32, chr_f16_33, chr_f16_34, chr_f16_35, chr_f16_36, chr_f16_37, - chr_f16_38, chr_f16_39, chr_f16_3A, chr_f16_3B, chr_f16_3C, chr_f16_3D, chr_f16_3E, chr_f16_3F, - chr_f16_40, chr_f16_41, chr_f16_42, chr_f16_43, chr_f16_44, chr_f16_45, chr_f16_46, chr_f16_47, - chr_f16_48, chr_f16_49, chr_f16_4A, chr_f16_4B, chr_f16_4C, chr_f16_4D, chr_f16_4E, chr_f16_4F, - chr_f16_50, chr_f16_51, chr_f16_52, chr_f16_53, chr_f16_54, chr_f16_55, chr_f16_56, chr_f16_57, - chr_f16_58, chr_f16_59, chr_f16_5A, chr_f16_5B, chr_f16_5C, chr_f16_5D, chr_f16_5E, chr_f16_5F, - chr_f16_60, chr_f16_61, chr_f16_62, chr_f16_63, chr_f16_64, chr_f16_65, chr_f16_66, chr_f16_67, - chr_f16_68, chr_f16_69, chr_f16_6A, chr_f16_6B, chr_f16_6C, chr_f16_6D, chr_f16_6E, chr_f16_6F, - chr_f16_70, chr_f16_71, chr_f16_72, chr_f16_73, chr_f16_74, chr_f16_75, chr_f16_76, chr_f16_77, - chr_f16_78, chr_f16_79, chr_f16_7A, chr_f16_7B, chr_f16_7C, chr_f16_7D, chr_f16_7E, chr_f16_7F -}; diff --git a/libraries/Adafruit_ILI9341/Font16.h b/libraries/Adafruit_ILI9341/Font16.h deleted file mode 100644 index 65c055782..000000000 --- a/libraries/Adafruit_ILI9341/Font16.h +++ /dev/null @@ -1,7 +0,0 @@ -#define nr_chrs_f16 96 -#define chr_hgt_f16 16 -#define data_size_f16 8 -#define firstchr_f16 32 - -extern const unsigned char widtbl_f16[96]; -extern const unsigned char* chrtbl_f16[96]; diff --git a/libraries/Adafruit_ILI9341/Font32.c b/libraries/Adafruit_ILI9341/Font32.c deleted file mode 100644 index 3d9756820..000000000 --- a/libraries/Adafruit_ILI9341/Font32.c +++ /dev/null @@ -1,1038 +0,0 @@ -// Font size 4 - -#include "Font32.h" - - -const unsigned char widtbl_f32[96] = // character width table -{ - 8, 11, 11, 22, 17, 24, 20, 9, // char 32 - 39 - 11, 11, 15, 28, 10, 11, 10, 11, // char 40 - 47 - 17, 17, 17, 17, 17, 17, 17, 17, // char 48 - 55 - 17, 17, 10, 10, 28, 28, 28, 16, // char 56 - 63 - 28, 19, 20, 21, 21, 19, 18, 22, // char 64 - 71 - 21, 9, 16, 20, 16, 24, 21, 22, // char 72 - 79 - 19, 22, 20, 19, 17, 21, 18, 26, // char 80 - 87 - 18, 19, 19, 12, 16, 12, 28, 16, // char 88 - 95 - 9, 17, 18, 16, 18, 17, 11, 18, // char 96 - 103 - 18, 9, 9, 15, 9, 25, 18, 18, // char 104 - 111 - 18, 18, 11, 15, 10, 17, 15, 21, // char 112 - 119 - 16, 16, 15, 16, 16, 16, 28, 4 // char 120 - 127 -}; - -// Row format, MSB left - -const unsigned char chr_f32_20[] = // 1 byte per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 12 - 22 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 23 - 32 -}; -const unsigned char chr_f32_21[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, // row 7 - 12 - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, // row 13 - 18 - 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, // row 19 - 24 - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_22[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, // row 7 - 12 - 0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_23[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x00, 0x66, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0xCC, 0x00, // row 9 - 12 - 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFF, 0x80, 0x01, 0x10, 0x00, // row 13 - 16 - 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x20, 0x00, // row 17 - 20 - 0x02, 0x20, 0x00, 0x06, 0x60, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, // row 21 - 24 - 0x0C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_24[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x0F, 0xC0, 0x00, 0x3F, 0xF0, 0x00, 0x38, 0x70, 0x00, 0x60, 0x18, 0x00, // row 9 - 12 - 0x60, 0x18, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, // row 13 - 16 - 0x7F, 0x80, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, // row 17 - 20 - 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x3F, 0x88, 0x00, 0x7F, 0xF8, 0x00, // row 21 - 24 - 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_25[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x0E, 0x01, 0x80, 0x3F, 0x81, 0x00, 0x31, 0x83, 0x00, 0x60, 0xC6, 0x00, // row 9 - 12 - 0x60, 0xC4, 0x00, 0x60, 0xCC, 0x00, 0x31, 0x88, 0x00, 0x3F, 0x90, 0x00, // row 13 - 16 - 0x0E, 0x31, 0xC0, 0x00, 0x27, 0xF0, 0x00, 0x46, 0x30, 0x00, 0xCC, 0x18, // row 17 - 20 - 0x00, 0x8C, 0x18, 0x01, 0x8C, 0x18, 0x03, 0x06, 0x30, 0x02, 0x07, 0xF0, // row 21 - 24 - 0x06, 0x01, 0xC0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_26[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, // row 5 - 8 - 0x0F, 0xE0, 0x00, 0x1C, 0x70, 0x00, 0x18, 0x30, 0x00, 0x18, 0x30, 0x00, // row 9 - 12 - 0x18, 0x70, 0x00, 0x0C, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x00, 0x00, // row 13 - 16 - 0x1F, 0x86, 0x00, 0x39, 0xC6, 0x00, 0x70, 0xE6, 0x00, 0x60, 0x7C, 0x00, // row 17 - 20 - 0x60, 0x3C, 0x00, 0x60, 0x18, 0x00, 0x70, 0x7E, 0x00, 0x3F, 0xE7, 0x00, // row 21 - 24 - 0x1F, 0x83, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_27[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x10, 0x00, 0x30, 0x00, // row 7 - 12 - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_28[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x0C, 0x00, // row 7 - 12 - 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, // row 13 - 18 - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, // row 19 - 24 - 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x06, 0x00, 0x02, 0x00, // row 25 - 30 - 0x03, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_29[] = // 2 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 6 - 0x00, 0x00, 0xC0, 0x00, 0x40, 0x00, 0x60, 0x00, 0x20, 0x00, 0x30, 0x00, // row 7 - 12 - 0x30, 0x00, 0x30, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, // row 13 - 18 - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, // row 19 - 24 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x20, 0x00, 0x60, 0x00, 0x40, 0x00, // row 25 - 30 - 0xC0, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_2A[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x26, 0x40, 0x7F, 0xE0, // row 7 - 12 - 0x1F, 0x80, 0x0F, 0x00, 0x19, 0x80, 0x39, 0xC0, 0x10, 0x80, 0x00, 0x00, // row 13 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_2B[] = // 4 bytes per row -{ - // row 1 - 3 - // row 4 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 9 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, // row 10 - 12 - 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, // row 13 - 15 - 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFF, 0xF0, 0x00, // row 16 - 18 - 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, // row 19 - 21 - 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, // row 22 - 24 - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 27 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 28 - 30 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_2C[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, // row 19 - 24 - 0x38, 0x00, 0x08, 0x00, 0x18, 0x00, 0x10, 0x00, 0x30, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_2D[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, // row 13 - 18 - 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_2E[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, // row 19 - 24 - 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_2F[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, // row 7 - 12 - 0x04, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x18, 0x00, 0x18, 0x00, // row 13 - 18 - 0x10, 0x00, 0x30, 0x00, 0x30, 0x00, 0x20, 0x00, 0x60, 0x00, 0x60, 0x00, // row 19 - 24 - 0x40, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_30[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x07, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x30, 0x30, 0x00, // row 9 - 12 - 0x70, 0x38, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, // row 13 - 16 - 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, // row 17 - 20 - 0x70, 0x38, 0x00, 0x30, 0x30, 0x00, 0x3C, 0xF0, 0x00, 0x1F, 0xE0, 0x00, // row 21 - 24 - 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_31[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x80, 0x00, 0x1F, 0x80, 0x00, // row 9 - 12 - 0x1F, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, // row 13 - 16 - 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, // row 17 - 20 - 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, // row 21 - 24 - 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_32[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x0F, 0xC0, 0x00, 0x3F, 0xF0, 0x00, 0x38, 0x70, 0x00, 0x70, 0x18, 0x00, // row 9 - 12 - 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x38, 0x00, // row 13 - 16 - 0x00, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x1E, 0x00, 0x00, // row 17 - 20 - 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0x60, 0x00, 0x00, 0x7F, 0xF8, 0x00, // row 21 - 24 - 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_33[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x0F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x38, 0x70, 0x00, 0x30, 0x30, 0x00, // row 9 - 12 - 0x70, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x70, 0x00, 0x03, 0xE0, 0x00, // row 13 - 16 - 0x03, 0xF0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x18, 0x00, 0x60, 0x18, 0x00, // row 17 - 20 - 0x60, 0x18, 0x00, 0x70, 0x38, 0x00, 0x38, 0x70, 0x00, 0x3F, 0xF0, 0x00, // row 21 - 24 - 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_34[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x00, 0x60, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, // row 9 - 12 - 0x03, 0x60, 0x00, 0x06, 0x60, 0x00, 0x0C, 0x60, 0x00, 0x0C, 0x60, 0x00, // row 13 - 16 - 0x18, 0x60, 0x00, 0x30, 0x60, 0x00, 0x60, 0x60, 0x00, 0x7F, 0xF8, 0x00, // row 17 - 20 - 0x7F, 0xF8, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, // row 21 - 24 - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_35[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x3F, 0xF0, 0x00, 0x3F, 0xF0, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, // row 9 - 12 - 0x30, 0x00, 0x00, 0x37, 0xC0, 0x00, 0x3F, 0xF0, 0x00, 0x78, 0x70, 0x00, // row 13 - 16 - 0x60, 0x38, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, // row 17 - 20 - 0x60, 0x18, 0x00, 0x70, 0x38, 0x00, 0x38, 0x70, 0x00, 0x3F, 0xF0, 0x00, // row 21 - 24 - 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_36[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x07, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x38, 0x30, 0x00, 0x30, 0x18, 0x00, // row 9 - 12 - 0x30, 0x18, 0x00, 0x60, 0x00, 0x00, 0x67, 0xC0, 0x00, 0x7F, 0xF0, 0x00, // row 13 - 16 - 0x78, 0x70, 0x00, 0x70, 0x38, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, // row 17 - 20 - 0x60, 0x18, 0x00, 0x30, 0x38, 0x00, 0x38, 0x70, 0x00, 0x1F, 0xF0, 0x00, // row 21 - 24 - 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_37[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x7F, 0xF8, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x30, 0x00, 0x00, 0x70, 0x00, // row 9 - 12 - 0x00, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x80, 0x00, // row 13 - 16 - 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, // row 17 - 20 - 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, // row 21 - 24 - 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_38[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x07, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x18, 0x60, 0x00, 0x30, 0x30, 0x00, // row 9 - 12 - 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x18, 0x60, 0x00, 0x0F, 0xC0, 0x00, // row 13 - 16 - 0x1F, 0xE0, 0x00, 0x38, 0x70, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, // row 17 - 20 - 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x38, 0x70, 0x00, 0x3F, 0xF0, 0x00, // row 21 - 24 - 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_39[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x0F, 0xC0, 0x00, 0x3F, 0xE0, 0x00, 0x38, 0x70, 0x00, 0x70, 0x30, 0x00, // row 9 - 12 - 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x70, 0x38, 0x00, // row 13 - 16 - 0x38, 0x78, 0x00, 0x3F, 0xF8, 0x00, 0x0F, 0x98, 0x00, 0x00, 0x18, 0x00, // row 17 - 20 - 0x60, 0x30, 0x00, 0x60, 0x30, 0x00, 0x30, 0x70, 0x00, 0x3F, 0xE0, 0x00, // row 21 - 24 - 0x1F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_3A[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, // row 19 - 24 - 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_3B[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, // row 19 - 24 - 0x38, 0x00, 0x08, 0x00, 0x18, 0x00, 0x10, 0x00, 0x30, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_3C[] = // 4 bytes per row -{ - // row 1 - 3 - // row 4 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 9 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, // row 10 - 12 - 0x00, 0x00, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1C, 0x00, 0x00, // row 13 - 15 - 0x00, 0xF0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, // row 16 - 18 - 0x03, 0x80, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, // row 19 - 21 - 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x00, // row 22 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 27 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 28 - 30 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_3D[] = // 4 bytes per row -{ - // row 1 - 3 - // row 4 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 9 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 10 - 12 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 15 - 0x07, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 16 - 18 - 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 21 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 22 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 27 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 28 - 30 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_3E[] = // 4 bytes per row -{ - // row 1 - 3 - // row 4 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 9 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // row 10 - 12 - 0x03, 0x80, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, // row 13 - 15 - 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x30, 0x00, // row 16 - 18 - 0x00, 0x00, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1C, 0x00, 0x00, // row 19 - 21 - 0x00, 0xF0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // row 22 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 27 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 28 - 30 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_3F[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x0F, 0xC0, 0x3F, 0xE0, 0x38, 0x70, 0x70, 0x30, 0x60, 0x30, // row 7 - 12 - 0x60, 0x30, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x03, 0x00, // row 13 - 18 - 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, // row 19 - 24 - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_40[] = // 4 bytes per row -{ - // row 1 - 3 - // row 4 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x01, 0xC0, 0x70, 0x00, // row 7 - 9 - 0x07, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x06, 0x00, // row 10 - 12 - 0x10, 0x1E, 0x43, 0x00, 0x30, 0x63, 0xC3, 0x00, 0x30, 0xC1, 0x83, 0x00, // row 13 - 15 - 0x60, 0xC1, 0x83, 0x00, 0x61, 0x81, 0x83, 0x00, 0x61, 0x81, 0x83, 0x00, // row 16 - 18 - 0x61, 0x83, 0x06, 0x00, 0x61, 0x83, 0x06, 0x00, 0x61, 0x83, 0x0C, 0x00, // row 19 - 21 - 0x30, 0xC7, 0x18, 0x00, 0x30, 0x79, 0xF0, 0x00, 0x18, 0x00, 0x00, 0x00, // row 22 - 24 - 0x0C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x18, 0x00, 0x03, 0x81, 0xE0, 0x00, // row 25 - 27 - 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 28 - 30 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_41[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 5 - 8 - 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x06, 0x60, 0x00, 0x06, 0x60, 0x00, // row 9 - 12 - 0x06, 0x60, 0x00, 0x0C, 0x30, 0x00, 0x0C, 0x30, 0x00, 0x0C, 0x30, 0x00, // row 13 - 16 - 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xFC, 0x00, // row 17 - 20 - 0x30, 0x0C, 0x00, 0x30, 0x0C, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, // row 21 - 24 - 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_42[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x00, // row 5 - 8 - 0x3F, 0xFE, 0x00, 0x30, 0x0E, 0x00, 0x30, 0x06, 0x00, 0x30, 0x06, 0x00, // row 9 - 12 - 0x30, 0x06, 0x00, 0x30, 0x06, 0x00, 0x30, 0x0E, 0x00, 0x3F, 0xF8, 0x00, // row 13 - 16 - 0x3F, 0xFE, 0x00, 0x30, 0x0E, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, // row 17 - 20 - 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x0E, 0x00, 0x3F, 0xFE, 0x00, // row 21 - 24 - 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_43[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, // row 5 - 8 - 0x0F, 0xFE, 0x00, 0x1E, 0x0F, 0x00, 0x38, 0x03, 0x00, 0x30, 0x01, 0x80, // row 9 - 12 - 0x70, 0x01, 0x80, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, // row 13 - 16 - 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x01, 0x80, 0x70, 0x01, 0x80, // row 17 - 20 - 0x30, 0x03, 0x80, 0x38, 0x03, 0x00, 0x1E, 0x0F, 0x00, 0x0F, 0xFE, 0x00, // row 21 - 24 - 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_44[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x00, // row 5 - 8 - 0x3F, 0xFC, 0x00, 0x30, 0x1E, 0x00, 0x30, 0x07, 0x00, 0x30, 0x03, 0x00, // row 9 - 12 - 0x30, 0x03, 0x80, 0x30, 0x01, 0x80, 0x30, 0x01, 0x80, 0x30, 0x01, 0x80, // row 13 - 16 - 0x30, 0x01, 0x80, 0x30, 0x01, 0x80, 0x30, 0x01, 0x80, 0x30, 0x03, 0x80, // row 17 - 20 - 0x30, 0x03, 0x00, 0x30, 0x07, 0x00, 0x30, 0x1E, 0x00, 0x3F, 0xFC, 0x00, // row 21 - 24 - 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_45[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, // row 5 - 8 - 0x3F, 0xFE, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, // row 9 - 12 - 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x3F, 0xFC, 0x00, // row 13 - 16 - 0x3F, 0xFC, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, // row 17 - 20 - 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x3F, 0xFE, 0x00, // row 21 - 24 - 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_46[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, // row 5 - 8 - 0x3F, 0xFC, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, // row 9 - 12 - 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x3F, 0xF8, 0x00, // row 13 - 16 - 0x3F, 0xF8, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, // row 17 - 20 - 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, // row 21 - 24 - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_47[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, // row 5 - 8 - 0x0F, 0xFE, 0x00, 0x1C, 0x0F, 0x00, 0x38, 0x03, 0x00, 0x30, 0x03, 0x80, // row 9 - 12 - 0x70, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x7F, 0x80, // row 13 - 16 - 0x60, 0x7F, 0x80, 0x60, 0x01, 0x80, 0x60, 0x01, 0x80, 0x70, 0x01, 0x80, // row 17 - 20 - 0x30, 0x03, 0x80, 0x38, 0x07, 0x80, 0x1E, 0x0F, 0x80, 0x0F, 0xFD, 0x80, // row 21 - 24 - 0x03, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_48[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, // row 5 - 8 - 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, // row 9 - 12 - 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0xFF, 0x00, // row 13 - 16 - 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, // row 17 - 20 - 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, // row 21 - 24 - 0x30, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_49[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 7 - 12 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 13 - 18 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 19 - 24 - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_4A[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, // row 7 - 12 - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, // row 13 - 18 - 0x00, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xE0, 0xE0, 0x7F, 0xC0, // row 19 - 24 - 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_4B[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, // row 5 - 8 - 0x30, 0x0E, 0x00, 0x30, 0x1C, 0x00, 0x30, 0x38, 0x00, 0x30, 0x70, 0x00, // row 9 - 12 - 0x30, 0xE0, 0x00, 0x31, 0xC0, 0x00, 0x33, 0x80, 0x00, 0x37, 0x80, 0x00, // row 13 - 16 - 0x3F, 0xC0, 0x00, 0x3C, 0xE0, 0x00, 0x38, 0x70, 0x00, 0x30, 0x30, 0x00, // row 17 - 20 - 0x30, 0x38, 0x00, 0x30, 0x1C, 0x00, 0x30, 0x0E, 0x00, 0x30, 0x07, 0x00, // row 21 - 24 - 0x30, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_4C[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 7 - 12 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 13 - 18 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3F, 0xF8, // row 19 - 24 - 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_4D[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x38, 0x00, 0xE0, // row 5 - 8 - 0x3C, 0x01, 0xE0, 0x3C, 0x01, 0xE0, 0x3C, 0x01, 0xE0, 0x36, 0x03, 0x60, // row 9 - 12 - 0x36, 0x03, 0x60, 0x36, 0x03, 0x60, 0x33, 0x06, 0x60, 0x33, 0x06, 0x60, // row 13 - 16 - 0x33, 0x06, 0x60, 0x31, 0x8C, 0x60, 0x31, 0x8C, 0x60, 0x31, 0x8C, 0x60, // row 17 - 20 - 0x30, 0xD8, 0x60, 0x30, 0xD8, 0x60, 0x30, 0xF8, 0x60, 0x30, 0x70, 0x60, // row 21 - 24 - 0x30, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_4E[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x38, 0x03, 0x00, // row 5 - 8 - 0x38, 0x03, 0x00, 0x3C, 0x03, 0x00, 0x3E, 0x03, 0x00, 0x36, 0x03, 0x00, // row 9 - 12 - 0x37, 0x03, 0x00, 0x33, 0x83, 0x00, 0x31, 0x83, 0x00, 0x31, 0xC3, 0x00, // row 13 - 16 - 0x30, 0xE3, 0x00, 0x30, 0x63, 0x00, 0x30, 0x73, 0x00, 0x30, 0x3B, 0x00, // row 17 - 20 - 0x30, 0x1B, 0x00, 0x30, 0x1F, 0x00, 0x30, 0x0F, 0x00, 0x30, 0x07, 0x00, // row 21 - 24 - 0x30, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_4F[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, // row 5 - 8 - 0x0F, 0xFE, 0x00, 0x1E, 0x0F, 0x00, 0x38, 0x03, 0x80, 0x30, 0x01, 0x80, // row 9 - 12 - 0x70, 0x01, 0xC0, 0x60, 0x00, 0xC0, 0x60, 0x00, 0xC0, 0x60, 0x00, 0xC0, // row 13 - 16 - 0x60, 0x00, 0xC0, 0x60, 0x00, 0xC0, 0x60, 0x00, 0xC0, 0x70, 0x01, 0xC0, // row 17 - 20 - 0x30, 0x01, 0x80, 0x38, 0x03, 0x80, 0x1E, 0x0F, 0x00, 0x0F, 0xFE, 0x00, // row 21 - 24 - 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_50[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x00, // row 5 - 8 - 0x3F, 0xFC, 0x00, 0x30, 0x0E, 0x00, 0x30, 0x06, 0x00, 0x30, 0x06, 0x00, // row 9 - 12 - 0x30, 0x06, 0x00, 0x30, 0x06, 0x00, 0x30, 0x0E, 0x00, 0x3F, 0xFC, 0x00, // row 13 - 16 - 0x3F, 0xF8, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, // row 17 - 20 - 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, // row 21 - 24 - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_51[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, // row 5 - 8 - 0x0F, 0xFE, 0x00, 0x1E, 0x0F, 0x00, 0x38, 0x03, 0x80, 0x30, 0x01, 0x80, // row 9 - 12 - 0x70, 0x01, 0xC0, 0x60, 0x00, 0xC0, 0x60, 0x00, 0xC0, 0x60, 0x00, 0xC0, // row 13 - 16 - 0x60, 0x00, 0xC0, 0x60, 0x00, 0xC0, 0x60, 0x00, 0xC0, 0x70, 0x11, 0xC0, // row 17 - 20 - 0x30, 0x39, 0x80, 0x38, 0x1F, 0x80, 0x1E, 0x0F, 0x00, 0x0F, 0xFF, 0x80, // row 21 - 24 - 0x03, 0xF9, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_52[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, // row 5 - 8 - 0x3F, 0xFE, 0x00, 0x30, 0x07, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, // row 9 - 12 - 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x06, 0x00, 0x3F, 0xFE, 0x00, // row 13 - 16 - 0x3F, 0xFC, 0x00, 0x30, 0x0E, 0x00, 0x30, 0x06, 0x00, 0x30, 0x07, 0x00, // row 17 - 20 - 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, // row 21 - 24 - 0x30, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_53[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, // row 5 - 8 - 0x1F, 0xF8, 0x00, 0x38, 0x1C, 0x00, 0x30, 0x0C, 0x00, 0x30, 0x0C, 0x00, // row 9 - 12 - 0x30, 0x0E, 0x00, 0x38, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0xE0, 0x00, // row 13 - 16 - 0x01, 0xF8, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0E, 0x00, 0x70, 0x06, 0x00, // row 17 - 20 - 0x30, 0x06, 0x00, 0x30, 0x06, 0x00, 0x3C, 0x0E, 0x00, 0x1F, 0xFC, 0x00, // row 21 - 24 - 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_54[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x00, // row 5 - 8 - 0xFF, 0xFC, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, // row 9 - 12 - 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, // row 13 - 16 - 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, // row 17 - 20 - 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, // row 21 - 24 - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_55[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, // row 5 - 8 - 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, // row 9 - 12 - 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, // row 13 - 16 - 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, // row 17 - 20 - 0x30, 0x03, 0x00, 0x38, 0x07, 0x00, 0x1C, 0x0E, 0x00, 0x0F, 0xFC, 0x00, // row 21 - 24 - 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_56[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0xE0, 0x0E, 0x00, // row 5 - 8 - 0x60, 0x0C, 0x00, 0x60, 0x0C, 0x00, 0x60, 0x0C, 0x00, 0x30, 0x18, 0x00, // row 9 - 12 - 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x18, 0x30, 0x00, 0x18, 0x30, 0x00, // row 13 - 16 - 0x18, 0x30, 0x00, 0x0C, 0x60, 0x00, 0x0C, 0x60, 0x00, 0x0C, 0x60, 0x00, // row 17 - 20 - 0x06, 0xC0, 0x00, 0x06, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x03, 0x80, 0x00, // row 21 - 24 - 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_57[] = // 4 bytes per row -{ - // row 1 - 3 - // row 4 - 6 - 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x0E, 0x00, 0x60, 0x38, 0x0C, 0x00, // row 7 - 9 - 0x60, 0x38, 0x0C, 0x00, 0x70, 0x6C, 0x1C, 0x00, 0x30, 0x6C, 0x18, 0x00, // row 10 - 12 - 0x30, 0x6C, 0x18, 0x00, 0x30, 0x6C, 0x18, 0x00, 0x38, 0xC6, 0x38, 0x00, // row 13 - 15 - 0x18, 0xC6, 0x30, 0x00, 0x18, 0xC6, 0x30, 0x00, 0x18, 0xC6, 0x30, 0x00, // row 16 - 18 - 0x1D, 0x83, 0x70, 0x00, 0x0D, 0x83, 0x60, 0x00, 0x0D, 0x83, 0x60, 0x00, // row 19 - 21 - 0x0D, 0x83, 0x60, 0x00, 0x0F, 0x01, 0xE0, 0x00, 0x07, 0x01, 0xC0, 0x00, // row 22 - 24 - 0x07, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 27 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 28 - 30 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_58[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x60, 0x0C, 0x00, // row 5 - 8 - 0x70, 0x1C, 0x00, 0x30, 0x18, 0x00, 0x18, 0x30, 0x00, 0x1C, 0x70, 0x00, // row 9 - 12 - 0x0C, 0x60, 0x00, 0x06, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x03, 0x80, 0x00, // row 13 - 16 - 0x03, 0x80, 0x00, 0x06, 0xC0, 0x00, 0x0E, 0xE0, 0x00, 0x0C, 0x60, 0x00, // row 17 - 20 - 0x18, 0x30, 0x00, 0x38, 0x38, 0x00, 0x30, 0x18, 0x00, 0x70, 0x1C, 0x00, // row 21 - 24 - 0xE0, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_59[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, // row 5 - 8 - 0x70, 0x0E, 0x00, 0x30, 0x0C, 0x00, 0x38, 0x1C, 0x00, 0x18, 0x18, 0x00, // row 9 - 12 - 0x0C, 0x30, 0x00, 0x0E, 0x70, 0x00, 0x06, 0x60, 0x00, 0x03, 0xC0, 0x00, // row 13 - 16 - 0x03, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, // row 17 - 20 - 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, // row 21 - 24 - 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_5A[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, // row 5 - 8 - 0x3F, 0xFE, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, // row 9 - 12 - 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, // row 13 - 16 - 0x03, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0E, 0x00, 0x00, // row 17 - 20 - 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0x7F, 0xFE, 0x00, // row 21 - 24 - 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_5B[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, // row 7 - 12 - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, // row 13 - 18 - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, // row 19 - 24 - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1F, 0x00, 0x1F, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_5C[] = // 2 bytes per row -{ - // row 1 - 6 - 0x20, 0x00, 0x20, 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, 0x18, 0x00, // row 7 - 12 - 0x08, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, // row 13 - 18 - 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, // row 19 - 24 - 0x00, 0x80, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, // row 25 - 30 - 0x00, 0x20, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_5D[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, // row 7 - 12 - 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, // row 13 - 18 - 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, // row 19 - 24 - 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x7C, 0x00, 0x7C, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_5E[] = // 4 bytes per row -{ - // row 1 - 3 - // row 4 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, // row 7 - 9 - 0x00, 0x63, 0x00, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x01, 0x80, 0xC0, 0x00, // row 10 - 12 - 0x03, 0x00, 0x60, 0x00, 0x06, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 15 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 16 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 21 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 22 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 27 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 28 - 30 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_5F[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0xFF, 0xF8, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_60[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x30, 0x00, 0x60, 0x00, 0x40, 0x00, 0x70, 0x00, 0x70, 0x00, // row 7 - 12 - 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_61[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 9 - 12 - 0x0F, 0xC0, 0x00, 0x3F, 0xE0, 0x00, 0x30, 0x70, 0x00, 0x30, 0x30, 0x00, // row 13 - 16 - 0x00, 0x30, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xF0, 0x00, 0x70, 0x30, 0x00, // row 17 - 20 - 0x60, 0x30, 0x00, 0x60, 0x30, 0x00, 0x70, 0xF0, 0x00, 0x3F, 0xBC, 0x00, // row 21 - 24 - 0x1F, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_62[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, // row 5 - 8 - 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, // row 9 - 12 - 0x33, 0xC0, 0x00, 0x37, 0xF0, 0x00, 0x3E, 0x78, 0x00, 0x38, 0x18, 0x00, // row 13 - 16 - 0x30, 0x1C, 0x00, 0x30, 0x0C, 0x00, 0x30, 0x0C, 0x00, 0x30, 0x0C, 0x00, // row 17 - 20 - 0x30, 0x1C, 0x00, 0x38, 0x18, 0x00, 0x3E, 0x78, 0x00, 0x37, 0xF0, 0x00, // row 21 - 24 - 0x33, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_63[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x07, 0x80, 0x1F, 0xE0, 0x3C, 0xE0, 0x30, 0x30, 0x70, 0x00, 0x60, 0x00, // row 13 - 18 - 0x60, 0x00, 0x60, 0x00, 0x70, 0x30, 0x30, 0x30, 0x3C, 0xE0, 0x1F, 0xE0, // row 19 - 24 - 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_64[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, // row 5 - 8 - 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, // row 9 - 12 - 0x07, 0x98, 0x00, 0x1F, 0xD8, 0x00, 0x3C, 0xF8, 0x00, 0x30, 0x38, 0x00, // row 13 - 16 - 0x70, 0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, // row 17 - 20 - 0x70, 0x18, 0x00, 0x30, 0x38, 0x00, 0x3C, 0xF8, 0x00, 0x1F, 0xD8, 0x00, // row 21 - 24 - 0x07, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_65[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 9 - 12 - 0x07, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x30, 0x30, 0x00, // row 13 - 16 - 0x70, 0x18, 0x00, 0x7F, 0xF8, 0x00, 0x7F, 0xF8, 0x00, 0x60, 0x00, 0x00, // row 17 - 20 - 0x70, 0x00, 0x00, 0x30, 0x38, 0x00, 0x3C, 0xF0, 0x00, 0x1F, 0xE0, 0x00, // row 21 - 24 - 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_66[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x1E, 0x00, 0x3E, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 7 - 12 - 0xFE, 0x00, 0xFE, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 13 - 18 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 19 - 24 - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_67[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 9 - 12 - 0x07, 0x98, 0x00, 0x1F, 0xD8, 0x00, 0x3C, 0xF8, 0x00, 0x30, 0x38, 0x00, // row 13 - 16 - 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, // row 17 - 20 - 0x70, 0x18, 0x00, 0x30, 0x38, 0x00, 0x3C, 0xF8, 0x00, 0x1F, 0xD8, 0x00, // row 21 - 24 - 0x07, 0x98, 0x00, 0x00, 0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x38, 0x00, // row 25 - 28 - 0x38, 0x70, 0x00, 0x3F, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_68[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, // row 5 - 8 - 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, // row 9 - 12 - 0x33, 0xE0, 0x00, 0x37, 0xF0, 0x00, 0x3C, 0x38, 0x00, 0x38, 0x18, 0x00, // row 13 - 16 - 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, // row 17 - 20 - 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, // row 21 - 24 - 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_69[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 13 - 18 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 19 - 24 - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_6A[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 13 - 18 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 19 - 24 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0xF0, 0x00, // row 25 - 30 - 0xE0, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_6B[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 7 - 12 - 0x30, 0x70, 0x30, 0xE0, 0x31, 0xC0, 0x33, 0x80, 0x37, 0x00, 0x3F, 0x00, // row 13 - 18 - 0x3F, 0x80, 0x39, 0x80, 0x31, 0xC0, 0x30, 0xC0, 0x30, 0xE0, 0x30, 0x60, // row 19 - 24 - 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_6C[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 7 - 12 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 13 - 18 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 19 - 24 - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_6D[] = // 4 bytes per row -{ - // row 1 - 3 - // row 4 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 9 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 10 - 12 - 0x33, 0xC3, 0xC0, 0x00, 0x37, 0xEF, 0xE0, 0x00, 0x3C, 0x7C, 0x70, 0x00, // row 13 - 15 - 0x38, 0x38, 0x30, 0x00, 0x30, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30, 0x00, // row 16 - 18 - 0x30, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30, 0x00, // row 19 - 21 - 0x30, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30, 0x00, // row 22 - 24 - 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 27 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 28 - 30 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_6E[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 9 - 12 - 0x33, 0xE0, 0x00, 0x37, 0xF0, 0x00, 0x3C, 0x38, 0x00, 0x38, 0x18, 0x00, // row 13 - 16 - 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, // row 17 - 20 - 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, // row 21 - 24 - 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_6F[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 9 - 12 - 0x07, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x3C, 0x78, 0x00, 0x30, 0x18, 0x00, // row 13 - 16 - 0x70, 0x1C, 0x00, 0x60, 0x0C, 0x00, 0x60, 0x0C, 0x00, 0x60, 0x0C, 0x00, // row 17 - 20 - 0x70, 0x1C, 0x00, 0x30, 0x18, 0x00, 0x3C, 0x78, 0x00, 0x1F, 0xF0, 0x00, // row 21 - 24 - 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_70[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 9 - 12 - 0x33, 0xC0, 0x00, 0x37, 0xF0, 0x00, 0x3E, 0x78, 0x00, 0x38, 0x18, 0x00, // row 13 - 16 - 0x30, 0x1C, 0x00, 0x30, 0x0C, 0x00, 0x30, 0x0C, 0x00, 0x30, 0x0C, 0x00, // row 17 - 20 - 0x30, 0x1C, 0x00, 0x38, 0x18, 0x00, 0x3E, 0x78, 0x00, 0x37, 0xF0, 0x00, // row 21 - 24 - 0x33, 0xC0, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, // row 25 - 28 - 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_71[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 9 - 12 - 0x07, 0x98, 0x00, 0x1F, 0xD8, 0x00, 0x3C, 0xF8, 0x00, 0x30, 0x38, 0x00, // row 13 - 16 - 0x70, 0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, // row 17 - 20 - 0x70, 0x18, 0x00, 0x30, 0x38, 0x00, 0x3C, 0xF8, 0x00, 0x1F, 0xD8, 0x00, // row 21 - 24 - 0x07, 0x98, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, // row 25 - 28 - 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_72[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x37, 0x00, 0x3F, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 13 - 18 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 19 - 24 - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_73[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x1F, 0x00, 0x3F, 0xC0, 0x70, 0xC0, 0x60, 0x60, 0x60, 0x00, 0x3E, 0x00, // row 13 - 18 - 0x1F, 0xC0, 0x03, 0xE0, 0x00, 0x60, 0x60, 0x60, 0x70, 0xE0, 0x3F, 0xC0, // row 19 - 24 - 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_74[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 7 - 12 - 0xFC, 0x00, 0xFC, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, // row 13 - 18 - 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3C, 0x00, // row 19 - 24 - 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_75[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 9 - 12 - 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, // row 13 - 16 - 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, // row 17 - 20 - 0x30, 0x18, 0x00, 0x30, 0x38, 0x00, 0x38, 0x78, 0x00, 0x1F, 0xD8, 0x00, // row 21 - 24 - 0x0F, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_76[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0xC0, 0x60, 0xC0, 0x60, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x31, 0x80, // row 13 - 18 - 0x31, 0x80, 0x31, 0x80, 0x1B, 0x00, 0x1B, 0x00, 0x1F, 0x00, 0x0E, 0x00, // row 19 - 24 - 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_77[] = // 3 bytes per row -{ - // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 9 - 12 - 0xC1, 0xC1, 0x80, 0xC1, 0xC1, 0x80, 0xC1, 0x41, 0x80, 0x63, 0x63, 0x00, // row 13 - 16 - 0x63, 0x63, 0x00, 0x63, 0x63, 0x00, 0x62, 0x23, 0x00, 0x36, 0x36, 0x00, // row 17 - 20 - 0x36, 0x36, 0x00, 0x36, 0x36, 0x00, 0x1C, 0x1C, 0x00, 0x1C, 0x1C, 0x00, // row 21 - 24 - 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 29 - 32 -}; -const unsigned char chr_f32_78[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x60, 0x30, 0x70, 0x70, 0x30, 0x60, 0x18, 0xC0, 0x1D, 0xC0, 0x0F, 0x80, // row 13 - 18 - 0x07, 0x00, 0x0F, 0x80, 0x1D, 0xC0, 0x18, 0xC0, 0x30, 0x60, 0x70, 0x70, // row 19 - 24 - 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_79[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0xE0, 0x38, 0x60, 0x30, 0x60, 0x30, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, // row 13 - 18 - 0x18, 0xC0, 0x18, 0xC0, 0x18, 0xC0, 0x0D, 0x80, 0x0D, 0x80, 0x0D, 0x80, // row 19 - 24 - 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x7C, 0x00, // row 25 - 30 - 0x78, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_7A[] = // 2 bytes per row -{ - // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x7F, 0xE0, 0x7F, 0xE0, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, // row 13 - 18 - 0x06, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0x7F, 0xE0, // row 19 - 24 - 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_7B[] = // 2 bytes per row -{ - // row 1 - 6 - 0x01, 0xE0, 0x03, 0x80, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, // row 7 - 12 - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, // row 13 - 18 - 0x1C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, // row 19 - 24 - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x80, // row 25 - 30 - 0x01, 0xE0, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_7C[] = // 2 bytes per row -{ - // row 1 - 6 - 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, // row 7 - 12 - 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, // row 13 - 18 - 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, // row 19 - 24 - 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, // row 25 - 30 - 0x06, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_7D[] = // 2 bytes per row -{ - // row 1 - 6 - 0x3C, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, // row 7 - 12 - 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, // row 13 - 18 - 0x01, 0xC0, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, // row 19 - 24 - 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0E, 0x00, // row 25 - 30 - 0x3C, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_7E[] = // 4 bytes per row -{ - // row 1 - 3 - // row 4 - 6 - 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x10, 0x00, 0x03, 0x30, 0x10, 0x00, // row 7 - 9 - 0x06, 0x1C, 0x30, 0x00, 0x04, 0x06, 0x60, 0x00, 0x04, 0x03, 0xC0, 0x00, // row 10 - 12 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 15 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 16 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 21 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 22 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 27 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 28 - 30 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 31 - 32 -}; -const unsigned char chr_f32_7F[] = // 1 byte per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 12 - 22 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 23 - 32 -}; - -const unsigned char* chrtbl_f32[96] = // character pointer table -{ - chr_f32_20, chr_f32_21, chr_f32_22, chr_f32_23, chr_f32_24, chr_f32_25, chr_f32_26, chr_f32_27, - chr_f32_28, chr_f32_29, chr_f32_2A, chr_f32_2B, chr_f32_2C, chr_f32_2D, chr_f32_2E, chr_f32_2F, - chr_f32_30, chr_f32_31, chr_f32_32, chr_f32_33, chr_f32_34, chr_f32_35, chr_f32_36, chr_f32_37, - chr_f32_38, chr_f32_39, chr_f32_3A, chr_f32_3B, chr_f32_3C, chr_f32_3D, chr_f32_3E, chr_f32_3F, - chr_f32_40, chr_f32_41, chr_f32_42, chr_f32_43, chr_f32_44, chr_f32_45, chr_f32_46, chr_f32_47, - chr_f32_48, chr_f32_49, chr_f32_4A, chr_f32_4B, chr_f32_4C, chr_f32_4D, chr_f32_4E, chr_f32_4F, - chr_f32_50, chr_f32_51, chr_f32_52, chr_f32_53, chr_f32_54, chr_f32_55, chr_f32_56, chr_f32_57, - chr_f32_58, chr_f32_59, chr_f32_5A, chr_f32_5B, chr_f32_5C, chr_f32_5D, chr_f32_5E, chr_f32_5F, - chr_f32_60, chr_f32_61, chr_f32_62, chr_f32_63, chr_f32_64, chr_f32_65, chr_f32_66, chr_f32_67, - chr_f32_68, chr_f32_69, chr_f32_6A, chr_f32_6B, chr_f32_6C, chr_f32_6D, chr_f32_6E, chr_f32_6F, - chr_f32_70, chr_f32_71, chr_f32_72, chr_f32_73, chr_f32_74, chr_f32_75, chr_f32_76, chr_f32_77, - chr_f32_78, chr_f32_79, chr_f32_7A, chr_f32_7B, chr_f32_7C, chr_f32_7D, chr_f32_7E, chr_f32_7F -}; diff --git a/libraries/Adafruit_ILI9341/Font32.h b/libraries/Adafruit_ILI9341/Font32.h deleted file mode 100644 index aba49febb..000000000 --- a/libraries/Adafruit_ILI9341/Font32.h +++ /dev/null @@ -1,7 +0,0 @@ -#define nr_chrs_f32 96 -#define chr_hgt_f32 26 -#define data_size_f32 8 -#define firstchr_f32 32 - -extern const unsigned char widtbl_f32[96]; -extern const unsigned char* chrtbl_f32[96]; diff --git a/libraries/Adafruit_ILI9341/Font64.c b/libraries/Adafruit_ILI9341/Font64.c deleted file mode 100644 index d17f4a900..000000000 --- a/libraries/Adafruit_ILI9341/Font64.c +++ /dev/null @@ -1,338 +0,0 @@ -// Font size 6 is intended to display numbers and time -// This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 . : a p m -// The Pipe character | is a narrow space to aid formatting -// All other characters print as a space - - -#include "Font64.h" - -const unsigned char widtbl_f64[96] = // character width table -{ - 15, 15, 15, 15, 15, 15, 15, 15, // char 32 - 39 - 15, 15, 15, 15, 15, 15, 18, 15, // char 40 - 47 - 30, 30, 30, 30, 30, 30, 30, 30, // char 48 - 55 - 30, 30, 18, 15, 15, 15, 15, 15, // char 56 - 63 - 15, 15, 15, 15, 15, 15, 15, 15, // char 64 - 71 - 15, 15, 15, 15, 15, 15, 15, 15, // char 72 - 79 - 15, 15, 15, 15, 15, 15, 15, 15, // char 80 - 87 - 15, 15, 15, 15, 15, 15, 15, 15, // char 88 - 95 - 15, 30, 15, 15, 15, 15, 15, 15, // char 96 - 103 - 15, 15, 15, 15, 15, 45, 15, 15, // char 104 - 111 - 32, 15, 15, 15, 15, 15, 15, 15, // char 112 - 119 - 15, 15, 15, 15, 10, 15, 15, 15 // char 120 - 127 -}; - -// Row format, MSB left - -const unsigned char chr_f64_20[96] = // 2 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 31 - 36 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 43 - 48 -}; -const unsigned char chr_f64_2E[144] = // 3 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 9 - 12 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 16 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 17 - 20 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 21 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, // row 29 - 32 - 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, // row 33 - 36 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 40 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 41 - 44 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 45 - 48 -}; -const unsigned char chr_f64_30[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x03, 0xFF, 0xF0, 0x00, // row 1 - 3 - 0x07, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 4 - 6 - 0x1F, 0x00, 0x3E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x3E, 0x00, 0x1F, 0x00, // row 7 - 9 - 0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, // row 10 - 12 - 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 13 - 15 - 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 16 - 18 - 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 19 - 21 - 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 22 - 24 - 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x3C, 0x00, 0x0F, 0x00, // row 25 - 27 - 0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x3E, 0x00, 0x1F, 0x00, // row 28 - 30 - 0x1E, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 31 - 33 - 0x0F, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xF0, 0x00, // row 34 - 36 - 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f64_31[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0xC0, 0x00, // row 1 - 3 - 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, // row 4 - 6 - 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xFF, 0xC0, 0x00, // row 7 - 9 - 0x07, 0xFF, 0xC0, 0x00, 0x07, 0xFB, 0xC0, 0x00, 0x07, 0xC3, 0xC0, 0x00, // row 10 - 12 - 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 13 - 15 - 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 16 - 18 - 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 19 - 21 - 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 22 - 24 - 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 25 - 27 - 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 28 - 30 - 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 31 - 33 - 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 34 - 36 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f64_32[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0xF8, 0x00, // row 1 - 3 - 0x03, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x07, 0xE0, 0x7F, 0x00, // row 4 - 6 - 0x0F, 0x80, 0x1F, 0x00, 0x0F, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x80, // row 7 - 9 - 0x1F, 0x00, 0x07, 0x80, 0x1E, 0x00, 0x07, 0x80, 0x1E, 0x00, 0x07, 0x80, // row 10 - 12 - 0x1E, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x0F, 0x80, // row 13 - 15 - 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3F, 0x00, // row 16 - 18 - 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x07, 0xF8, 0x00, // row 19 - 21 - 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0xFF, 0x80, 0x00, // row 22 - 24 - 0x01, 0xFE, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, // row 25 - 27 - 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, // row 28 - 30 - 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0x80, // row 31 - 33 - 0x3F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0x80, // row 34 - 36 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f64_33[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x03, 0xFF, 0xF0, 0x00, // row 1 - 3 - 0x07, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 4 - 6 - 0x1F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x1F, 0x00, // row 7 - 9 - 0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, // row 10 - 12 - 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3E, 0x00, // row 13 - 15 - 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, // row 16 - 18 - 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0x00, // row 19 - 21 - 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, // row 22 - 24 - 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 25 - 27 - 0x7C, 0x00, 0x0F, 0x80, 0x7C, 0x00, 0x1F, 0x80, 0x3E, 0x00, 0x1F, 0x00, // row 28 - 30 - 0x3F, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0xFE, 0x00, 0x0F, 0xFF, 0xFC, 0x00, // row 31 - 33 - 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x00, 0x7F, 0x80, 0x00, // row 34 - 36 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f64_34[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, // row 1 - 3 - 0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x07, 0xF0, 0x00, // row 4 - 6 - 0x00, 0x07, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1E, 0xF0, 0x00, // row 7 - 9 - 0x00, 0x1E, 0xF0, 0x00, 0x00, 0x3C, 0xF0, 0x00, 0x00, 0x78, 0xF0, 0x00, // row 10 - 12 - 0x00, 0xF8, 0xF0, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x01, 0xE0, 0xF0, 0x00, // row 13 - 15 - 0x03, 0xC0, 0xF0, 0x00, 0x07, 0xC0, 0xF0, 0x00, 0x07, 0x80, 0xF0, 0x00, // row 16 - 18 - 0x0F, 0x00, 0xF0, 0x00, 0x1F, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0xF0, 0x00, // row 19 - 21 - 0x3C, 0x00, 0xF0, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x7F, 0xFF, 0xFF, 0x80, // row 22 - 24 - 0x7F, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xFF, 0x80, // row 25 - 27 - 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, // row 28 - 30 - 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, // row 31 - 33 - 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, // row 34 - 36 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f64_35[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFE, 0x00, // row 1 - 3 - 0x07, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFE, 0x00, // row 4 - 6 - 0x07, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, // row 7 - 9 - 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, // row 10 - 12 - 0x0E, 0x00, 0x00, 0x00, 0x1E, 0x3F, 0xC0, 0x00, 0x1E, 0xFF, 0xF0, 0x00, // row 13 - 15 - 0x1F, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0xFC, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 16 - 18 - 0x1F, 0x00, 0x3F, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x00, // row 19 - 21 - 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, // row 22 - 24 - 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, // row 25 - 27 - 0x3C, 0x00, 0x07, 0x80, 0x3C, 0x00, 0x0F, 0x80, 0x3C, 0x00, 0x0F, 0x00, // row 28 - 30 - 0x3E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 31 - 33 - 0x0F, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xF0, 0x00, // row 34 - 36 - 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f64_36[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFF, 0xF0, 0x00, // row 1 - 3 - 0x03, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x0F, 0xE0, 0x7E, 0x00, // row 4 - 6 - 0x1F, 0x80, 0x1F, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x0F, 0x80, // row 7 - 9 - 0x3E, 0x00, 0x07, 0x80, 0x3C, 0x00, 0x07, 0x80, 0x3C, 0x00, 0x00, 0x00, // row 10 - 12 - 0x3C, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x3F, 0x80, 0x00, // row 13 - 15 - 0x78, 0xFF, 0xF0, 0x00, 0x7B, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xFC, 0x00, // row 16 - 18 - 0x7F, 0xC0, 0xFE, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0x1F, 0x00, // row 19 - 21 - 0x7C, 0x00, 0x0F, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x78, 0x00, 0x07, 0x80, // row 22 - 24 - 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 25 - 27 - 0x78, 0x00, 0x07, 0x80, 0x3C, 0x00, 0x0F, 0x80, 0x3C, 0x00, 0x0F, 0x00, // row 28 - 30 - 0x3E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 31 - 33 - 0x0F, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xF0, 0x00, // row 34 - 36 - 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f64_37[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0x80, // row 1 - 3 - 0x3F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0x80, // row 4 - 6 - 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1E, 0x00, // row 7 - 9 - 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xF8, 0x00, // row 10 - 12 - 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, // row 13 - 15 - 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, // row 16 - 18 - 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, // row 19 - 21 - 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, // row 22 - 24 - 0x00, 0x7C, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, // row 25 - 27 - 0x00, 0xF8, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, // row 28 - 30 - 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, // row 31 - 33 - 0x01, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, // row 34 - 36 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f64_38[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x01, 0xFF, 0xE0, 0x00, // row 1 - 3 - 0x07, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 4 - 6 - 0x1F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x1F, 0x00, // row 7 - 9 - 0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, // row 10 - 12 - 0x3E, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x3E, 0x00, // row 13 - 15 - 0x0F, 0xC0, 0xFC, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xF0, 0x00, // row 16 - 18 - 0x07, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0x80, 0x7E, 0x00, // row 19 - 21 - 0x3E, 0x00, 0x1F, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x7C, 0x00, 0x0F, 0x80, // row 22 - 24 - 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 25 - 27 - 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x7C, 0x00, 0x0F, 0x80, // row 28 - 30 - 0x7C, 0x00, 0x0F, 0x80, 0x3E, 0x00, 0x1F, 0x00, 0x3F, 0x80, 0x7F, 0x00, // row 31 - 33 - 0x1F, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xF8, 0x00, // row 34 - 36 - 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f64_39[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x03, 0xFF, 0xE0, 0x00, // row 1 - 3 - 0x07, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 4 - 6 - 0x3F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x3C, 0x00, 0x0F, 0x00, // row 7 - 9 - 0x7C, 0x00, 0x0F, 0x00, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 10 - 12 - 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 13 - 15 - 0x7C, 0x00, 0x0F, 0x80, 0x3C, 0x00, 0x0F, 0x80, 0x3E, 0x00, 0x1F, 0x80, // row 16 - 18 - 0x1F, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0xFF, 0x80, 0x0F, 0xFF, 0xFF, 0x80, // row 19 - 21 - 0x07, 0xFF, 0xF7, 0x80, 0x03, 0xFF, 0xC7, 0x80, 0x00, 0x7F, 0x07, 0x80, // row 22 - 24 - 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, // row 25 - 27 - 0x78, 0x00, 0x0F, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x7C, 0x00, 0x1E, 0x00, // row 28 - 30 - 0x3C, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0x1F, 0x81, 0xFC, 0x00, // row 31 - 33 - 0x0F, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x03, 0xFF, 0xC0, 0x00, // row 34 - 36 - 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f64_3A[144] = // 3 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, // row 9 - 12 - 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, // row 13 - 16 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 17 - 20 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 21 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, // row 25 - 28 - 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, // row 29 - 32 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 33 - 36 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 40 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 41 - 44 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 45 - 48 -}; -const unsigned char chr_f64_61[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 3 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 4 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 9 - 0x00, 0x7F, 0xC0, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFC, 0x00, // row 10 - 12 - 0x07, 0xFF, 0xFE, 0x00, 0x0F, 0xC0, 0x7E, 0x00, 0x1F, 0x00, 0x1F, 0x00, // row 13 - 15 - 0x1E, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x0F, 0x00, // row 16 - 18 - 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0xFF, 0x00, // row 19 - 21 - 0x01, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xCF, 0x00, // row 22 - 24 - 0x1F, 0xF0, 0x0F, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x3E, 0x00, 0x0F, 0x00, // row 25 - 27 - 0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x1F, 0x00, // row 28 - 30 - 0x3C, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x1F, 0x01, 0xFF, 0xC0, // row 31 - 33 - 0x1F, 0xFF, 0xE7, 0xC0, 0x0F, 0xFF, 0xC7, 0xC0, 0x07, 0xFF, 0x03, 0xC0, // row 34 - 36 - 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f64_6D[288] = // 6 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 2 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 3 - 4 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 8 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x1F, 0xC0, 0x00, // row 9 - 10 - 0x1E, 0x3F, 0xF0, 0x7F, 0xF0, 0x00, 0x1E, 0xFF, 0xF8, 0xFF, 0xF8, 0x00, // row 11 - 12 - 0x1E, 0xFF, 0xFD, 0xFF, 0xFC, 0x00, 0x1F, 0xE0, 0x7F, 0xE0, 0x7C, 0x00, // row 13 - 14 - 0x1F, 0x80, 0x3F, 0x80, 0x3E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1E, 0x00, // row 15 - 16 - 0x1F, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 17 - 18 - 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 19 - 20 - 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 21 - 22 - 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 23 - 24 - 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 25 - 26 - 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 27 - 28 - 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 29 - 30 - 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 31 - 32 - 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 33 - 34 - 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 35 - 36 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 38 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 39 - 40 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 41 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 44 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 45 - 46 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 47 - 48 -}; -const unsigned char chr_f64_70[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 3 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 4 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 9 - 0x00, 0x0F, 0xE0, 0x00, 0x1E, 0x3F, 0xFC, 0x00, 0x1E, 0x7F, 0xFE, 0x00, // row 10 - 12 - 0x1E, 0xFF, 0xFF, 0x00, 0x1F, 0xF0, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0x80, // row 13 - 15 - 0x1F, 0x80, 0x07, 0xC0, 0x1F, 0x00, 0x03, 0xC0, 0x1F, 0x00, 0x03, 0xC0, // row 16 - 18 - 0x1F, 0x00, 0x03, 0xE0, 0x1E, 0x00, 0x01, 0xE0, 0x1E, 0x00, 0x01, 0xE0, // row 19 - 21 - 0x1E, 0x00, 0x01, 0xE0, 0x1E, 0x00, 0x01, 0xE0, 0x1E, 0x00, 0x01, 0xE0, // row 22 - 24 - 0x1E, 0x00, 0x01, 0xE0, 0x1E, 0x00, 0x01, 0xE0, 0x1E, 0x00, 0x01, 0xE0, // row 25 - 27 - 0x1E, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xC0, 0x1F, 0x00, 0x07, 0xC0, // row 28 - 30 - 0x1F, 0x80, 0x07, 0xC0, 0x1F, 0xC0, 0x0F, 0x80, 0x1F, 0xF0, 0x3F, 0x80, // row 31 - 33 - 0x1E, 0xFF, 0xFF, 0x00, 0x1E, 0x7F, 0xFE, 0x00, 0x1E, 0x3F, 0xFC, 0x00, // row 34 - 36 - 0x1E, 0x0F, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, // row 37 - 39 - 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, // row 40 - 42 - 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, // row 43 - 45 - 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; - -const unsigned char * chrtbl_f64[96] = // character pointer table -{ - chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, - chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_2E, chr_f64_20, - chr_f64_30, chr_f64_31, chr_f64_32, chr_f64_33, chr_f64_34, chr_f64_35, chr_f64_36, chr_f64_37, - chr_f64_38, chr_f64_39, chr_f64_3A, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, - chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, - chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, - chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, - chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, - chr_f64_20, chr_f64_61, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, - chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_6D, chr_f64_20, chr_f64_20, - chr_f64_70, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, - chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20 -}; diff --git a/libraries/Adafruit_ILI9341/Font64.h b/libraries/Adafruit_ILI9341/Font64.h deleted file mode 100644 index b18fbd646..000000000 --- a/libraries/Adafruit_ILI9341/Font64.h +++ /dev/null @@ -1,7 +0,0 @@ -#define nr_chrs_f64 96 -#define chr_hgt_f64 48 -#define data_size_f64 8 -#define firstchr_f64 32 - -extern const unsigned char widtbl_f64[96]; -extern const unsigned char* chrtbl_f64[96]; diff --git a/libraries/Adafruit_ILI9341/Font7s.c b/libraries/Adafruit_ILI9341/Font7s.c deleted file mode 100644 index 1dbacdd42..000000000 --- a/libraries/Adafruit_ILI9341/Font7s.c +++ /dev/null @@ -1,264 +0,0 @@ -// Font size 7 is a 7 segment font intended to display numbers and time -// This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 : . -// All other characters print as a space - -#include "Font7s.h" - - -const unsigned char widtbl_f7s[96] = // character width table -{ - 12, 12, 12, 12, 12, 12, 12, 12, // char 32 - 39 - 12, 12, 12, 12, 12, 12, 12, 12, // char 40 - 47 - 32, 32, 32, 32, 32, 32, 32, 32, // char 48 - 55 - 32, 32, 12, 12, 12, 12, 12, 12, // char 56 - 63 - 12, 12, 12, 12, 12, 12, 12, 12, // char 64 - 71 - 12, 12, 12, 12, 12, 12, 12, 12, // char 72 - 79 - 12, 12, 12, 12, 12, 12, 12, 12, // char 80 - 87 - 12, 12, 12, 12, 12, 12, 12, 12, // char 88 - 95 - 12, 12, 12, 12, 12, 12, 12, 12, // char 96 - 103 - 12, 12, 12, 12, 12, 12, 12, 12, // char 104 - 111 - 12, 12, 12, 12, 12, 12, 12, 12, // char 112 - 119 - 12, 12, 12, 12, 12, 12, 12, 12 // char 120 - 127 -}; - -// Row format, MSB left - -const unsigned char chr_f7s_20[96] = // 2 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 31 - 36 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 43 - 48 -}; -const unsigned char chr_f7s_2E[96] = // 2 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 31 - 36 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 42 - 0x0E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x0E, 0x00, 0x00, 0x00 // row 43 - 48 -}; -const unsigned char chr_f7s_30[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3 - 0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x20, 0x0C, 0xFF, 0xFE, 0x70, // row 4 - 6 - 0x1E, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 7 - 9 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 10 - 12 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 13 - 15 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 16 - 18 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3E, 0x00, 0x00, 0xF8, // row 19 - 21 - 0x38, 0x00, 0x00, 0x38, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, // row 22 - 24 - 0x20, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x18, 0x3E, 0x00, 0x00, 0x78, // row 25 - 27 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 28 - 30 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 31 - 33 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 34 - 36 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 37 - 39 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x1E, 0x00, 0x00, 0xF0, // row 40 - 42 - 0x0C, 0xFF, 0xFE, 0x60, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, // row 43 - 45 - 0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f7s_31[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 3 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x70, // row 4 - 6 - 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 7 - 9 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 10 - 12 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 13 - 15 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 16 - 18 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x78, // row 19 - 21 - 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, // row 22 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x78, // row 25 - 27 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 28 - 30 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 31 - 33 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 34 - 36 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 37 - 39 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF0, // row 40 - 42 - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f7s_32[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3 - 0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x20, 0x00, 0xFF, 0xFE, 0x70, // row 4 - 6 - 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 7 - 9 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 10 - 12 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 13 - 15 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 16 - 18 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF8, // row 19 - 21 - 0x00, 0xFF, 0xFE, 0x38, 0x03, 0xFF, 0xFF, 0x88, 0x0F, 0xFF, 0xFF, 0xE0, // row 22 - 24 - 0x27, 0xFF, 0xFF, 0xC0, 0x39, 0xFF, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x00, // row 25 - 27 - 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 28 - 30 - 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 31 - 33 - 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 34 - 36 - 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 37 - 39 - 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, // row 40 - 42 - 0x0C, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, // row 43 - 45 - 0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f7s_33[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3 - 0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x20, 0x00, 0xFF, 0xFE, 0x70, // row 4 - 6 - 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 7 - 9 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 10 - 12 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 13 - 15 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 16 - 18 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF8, // row 19 - 21 - 0x00, 0xFF, 0xFE, 0x38, 0x03, 0xFF, 0xFF, 0x88, 0x0F, 0xFF, 0xFF, 0xE0, // row 22 - 24 - 0x07, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x18, 0x00, 0x00, 0x00, 0x78, // row 25 - 27 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 28 - 30 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 31 - 33 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 34 - 36 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 37 - 39 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF0, // row 40 - 42 - 0x00, 0xFF, 0xFE, 0x60, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, // row 43 - 45 - 0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f7s_34[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 3 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0C, 0x00, 0x00, 0x70, // row 4 - 6 - 0x1E, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 7 - 9 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 10 - 12 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 13 - 15 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 16 - 18 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3E, 0x00, 0x00, 0xF8, // row 19 - 21 - 0x38, 0xFF, 0xFE, 0x38, 0x23, 0xFF, 0xFF, 0x88, 0x0F, 0xFF, 0xFF, 0xE0, // row 22 - 24 - 0x07, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x18, 0x00, 0x00, 0x00, 0x78, // row 25 - 27 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 28 - 30 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 31 - 33 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 34 - 36 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 37 - 39 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF0, // row 40 - 42 - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f7s_35[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3 - 0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x00, 0x0C, 0xFF, 0xFE, 0x00, // row 4 - 6 - 0x1E, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 7 - 9 - 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 10 - 12 - 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 13 - 15 - 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 16 - 18 - 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, // row 19 - 21 - 0x38, 0xFF, 0xFE, 0x00, 0x23, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xFF, 0xE0, // row 22 - 24 - 0x07, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x18, 0x00, 0x00, 0x00, 0x78, // row 25 - 27 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 28 - 30 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 31 - 33 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 34 - 36 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 37 - 39 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF0, // row 40 - 42 - 0x00, 0xFF, 0xFE, 0x60, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, // row 43 - 45 - 0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f7s_36[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3 - 0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x00, 0x0C, 0xFF, 0xFE, 0x00, // row 4 - 6 - 0x1E, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 7 - 9 - 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 10 - 12 - 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 13 - 15 - 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 16 - 18 - 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, // row 19 - 21 - 0x38, 0xFF, 0xFE, 0x00, 0x23, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xFF, 0xE0, // row 22 - 24 - 0x27, 0xFF, 0xFF, 0xC0, 0x39, 0xFF, 0xFF, 0x18, 0x3E, 0x00, 0x00, 0x78, // row 25 - 27 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 28 - 30 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 31 - 33 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 34 - 36 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 37 - 39 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x1E, 0x00, 0x00, 0xF0, // row 40 - 42 - 0x0C, 0xFF, 0xFE, 0x60, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, // row 43 - 45 - 0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f7s_37[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3 - 0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x20, 0x00, 0xFF, 0xFE, 0x70, // row 4 - 6 - 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 7 - 9 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 10 - 12 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 13 - 15 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 16 - 18 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF8, // row 19 - 21 - 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, // row 22 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x78, // row 25 - 27 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 28 - 30 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 31 - 33 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 34 - 36 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 37 - 39 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF0, // row 40 - 42 - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f7s_38[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3 - 0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x20, 0x0C, 0xFF, 0xFE, 0x70, // row 4 - 6 - 0x1E, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 7 - 9 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 10 - 12 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 13 - 15 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 16 - 18 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3E, 0x00, 0x00, 0xF8, // row 19 - 21 - 0x38, 0xFF, 0xFE, 0x38, 0x23, 0xFF, 0xFF, 0x88, 0x0F, 0xFF, 0xFF, 0xE0, // row 22 - 24 - 0x27, 0xFF, 0xFF, 0xC0, 0x39, 0xFF, 0xFF, 0x18, 0x3E, 0x00, 0x00, 0x78, // row 25 - 27 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 28 - 30 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 31 - 33 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 34 - 36 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 37 - 39 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x1E, 0x00, 0x00, 0xF0, // row 40 - 42 - 0x0C, 0xFF, 0xFE, 0x60, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, // row 43 - 45 - 0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f7s_39[192] = // 4 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3 - 0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x20, 0x0C, 0xFF, 0xFE, 0x70, // row 4 - 6 - 0x1E, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 7 - 9 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 10 - 12 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 13 - 15 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 16 - 18 - 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3E, 0x00, 0x00, 0xF8, // row 19 - 21 - 0x38, 0xFF, 0xFE, 0x38, 0x23, 0xFF, 0xFF, 0x88, 0x0F, 0xFF, 0xFF, 0xE0, // row 22 - 24 - 0x07, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x18, 0x00, 0x00, 0x00, 0x78, // row 25 - 27 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 28 - 30 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 31 - 33 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 34 - 36 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 37 - 39 - 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF0, // row 40 - 42 - 0x00, 0xFF, 0xFE, 0x60, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, // row 43 - 45 - 0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48 -}; -const unsigned char chr_f7s_3A[96] = // 2 bytes per row -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 6 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12 - 0x00, 0x00, 0x0E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x0E, 0x00, // row 13 - 18 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 24 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30 - 0x0E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x0E, 0x00, 0x00, 0x00, // row 31 - 36 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 43 - 48 -}; - -const unsigned char * chrtbl_f7s[96] = // character pointer table -{ - chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, - chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_2E, chr_f7s_20, - chr_f7s_30, chr_f7s_31, chr_f7s_32, chr_f7s_33, chr_f7s_34, chr_f7s_35, chr_f7s_36, chr_f7s_37, - chr_f7s_38, chr_f7s_39, chr_f7s_3A, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, - chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, - chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, - chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, - chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, - chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, - chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, - chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, - chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20 -}; diff --git a/libraries/Adafruit_ILI9341/Font7s.h b/libraries/Adafruit_ILI9341/Font7s.h deleted file mode 100644 index 3274a9d53..000000000 --- a/libraries/Adafruit_ILI9341/Font7s.h +++ /dev/null @@ -1,7 +0,0 @@ -#define nr_chrs_f7s 96 -#define chr_hgt_f7s 48 -#define data_size_f7s 8 -#define firstchr_f7s 32 - -extern const unsigned char widtbl_f7s[96]; -extern const unsigned char * chrtbl_f7s[96]; diff --git a/libraries/Adafruit_ILI9341/Load_fonts.h b/libraries/Adafruit_ILI9341/Load_fonts.h deleted file mode 100644 index 2799f4e45..000000000 --- a/libraries/Adafruit_ILI9341/Load_fonts.h +++ /dev/null @@ -1,8 +0,0 @@ -// Comment out the #defines below with // to stop that font being loaded -// If all fonts are loaded the total space required is ablout 17890 bytes - -//#define LOAD_GLCD // Standard Adafruit font needs ~1792 bytes in FLASH -//#define LOAD_FONT2 // Small font, needs ~3092 bytes in FLASH -//#define LOAD_FONT4 // Medium font, needs ~8126 bytes in FLASH -//#define LOAD_FONT6 // Large font, needs ~4404 bytes in FLASH -//#define LOAD_FONT7 // 7 segment font, needs ~3652 bytes in FLASH diff --git a/libraries/Adafruit_ILI9341/driver/hspi.h b/libraries/Adafruit_ILI9341/driver/hspi.h deleted file mode 100644 index e68691ece..000000000 --- a/libraries/Adafruit_ILI9341/driver/hspi.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef INCLUDE_HSPI_H_ -#define INCLUDE_HSPI_H_ - -#include "spi_register.h" -#include -#include -#include -#include - -#define SPI 0 -#define HSPI 1 - -#define SPIFIFOSIZE 16 //16 words length - -extern uint32_t *spi_fifo; -extern uint32_t current_spi_port; - -typedef enum -{ - spi_mode_tx, - spi_mode_txrx -} spi_mode; - -typedef struct -{ - uint32_t spi_port; - uint32_t clock_reg_val; - spi_mode mode; -} spi_config; - -spi_config spi_init(uint32_t spi_port, uint32_t prescaler, spi_mode mode); -void spi_reinit(spi_config *config); -void spi_send_data(const uint8_t * data, uint8_t datasize); -void spi_send_uint16_r(const uint16_t data, int32_t repeats); -static inline void spi_wait_ready(void){while (READ_PERI_REG(SPI_FLASH_CMD(current_spi_port))&SPI_FLASH_USR);} - -static inline void spi_prepare_tx(uint32_t bytecount) -{ - uint32_t bitcount = bytecount * 8 - 1; - - WRITE_PERI_REG(SPI_FLASH_USER1(current_spi_port), (bitcount & SPI_USR_OUT_BITLEN) << SPI_USR_OUT_BITLEN_S); -} - -static inline void spi_prepare_txrx_bits(uint32_t txbitcount, uint32_t rxbitcount) -{ - WRITE_PERI_REG(SPI_FLASH_USER1(current_spi_port), ((txbitcount & SPI_USR_OUT_BITLEN) << SPI_USR_OUT_BITLEN_S) | - ((rxbitcount & SPI_USR_DIN_BITLEN) << SPI_USR_DIN_BITLEN_S)); -} - -static inline void spi_start_tx() -{ - SET_PERI_REG_MASK(SPI_FLASH_CMD(current_spi_port), SPI_FLASH_USR); // send -} - -static inline void spi_send_uint8(uint8_t data) -{ - spi_prepare_tx(1); - *spi_fifo = data; - spi_start_tx(); -} - -static inline void spi_send_uint16(uint16_t data) -{ - spi_prepare_tx(2); - *spi_fifo = data; - spi_start_tx(); -} - -static inline void spi_send_uint32(uint32_t data) -{ - spi_prepare_tx(4); - *spi_fifo = data; - spi_start_tx(); -} - -/* This is needed to implement XPT2046 driver since it transmits 13 bits back*/ -extern uint16_t spi_send_uint8_receive_13bits(uint8_t to_send); - -#endif /* INCLUDE_HSPI_H_ */ diff --git a/libraries/Adafruit_ILI9341/driver/spi_register.h b/libraries/Adafruit_ILI9341/driver/spi_register.h deleted file mode 100644 index 8ed4cfae8..000000000 --- a/libraries/Adafruit_ILI9341/driver/spi_register.h +++ /dev/null @@ -1,239 +0,0 @@ -//Generated at 2014-07-29 11:03:29 -/* - * Copyright (c) 2010 - 2011 Espressif System - * - */ - -#ifndef SPI_REGISTER_H_INCLUDED -#define SPI_REGISTER_H_INCLUDED - -#define REG_SPI_BASE(i) (0x60000200-i*0x100) - -#define SPI_FLASH_CMD(i) (REG_SPI_BASE(i) + 0x0) -#define SPI_FLASH_READ (BIT(31)) -#define SPI_FLASH_WREN (BIT(30)) -#define SPI_FLASH_WRDI (BIT(29)) -#define SPI_FLASH_RDID (BIT(28)) -#define SPI_FLASH_RDSR (BIT(27)) -#define SPI_FLASH_WRSR (BIT(26)) -#define SPI_FLASH_PP (BIT(25)) -#define SPI_FLASH_SE (BIT(24)) -#define SPI_FLASH_BE (BIT(23)) -#define SPI_FLASH_CE (BIT(22)) -#define SPI_FLASH_DP (BIT(21)) -#define SPI_FLASH_RES (BIT(20)) -#define SPI_FLASH_HPM (BIT(19)) -#define SPI_FLASH_USR (BIT(18)) - -#define SPI_FLASH_ADDR(i) (REG_SPI_BASE(i) + 0x4) - -#define SPI_FLASH_CTRL(i) (REG_SPI_BASE(i) + 0x8) -#define SPI_WR_BIT_ODER (BIT(26)) -#define SPI_RD_BIT_ODER (BIT(25)) -#define SPI_QIO_MODE (BIT(24)) -#define SPI_DIO_MODE (BIT(23)) -#define SPI_TWO_BYTE_STATUS_EN (BIT(22)) -#define SPI_WP_REG (BIT(21)) -#define SPI_QOUT_MODE (BIT(20)) -#define SPI_SHARE_BUS (BIT(19)) -#define SPI_HOLD_MODE (BIT(18)) -#define SPI_ENABLE_AHB (BIT(17)) -#define SPI_SST_AAI (BIT(16)) -#define SPI_RESANDRES (BIT(15)) -#define SPI_DOUT_MODE (BIT(14)) -#define SPI_FASTRD_MODE (BIT(13)) - -#define SPI_FLASH_CTRL1(i) (REG_SPI_BASE (i) + 0xC) -#define SPI_T_CSH 0x0000000F -#define SPI_T_CSH_S 28 -#define SPI_T_RES 0x00000FFF -#define SPI_T_RES_S 16 -#define SPI_BUS_TIMER_LIMIT 0x0000FFFF -#define SPI_BUS_TIMER_LIMIT_S 0 - -#define SPI_FLASH_STATUS(i) (REG_SPI_BASE(i) + 0x10) -#define SPI_STATUS_EXT 0x000000FF -#define SPI_STATUS_EXT_S 24 -#define SPI_WB_MODE 0x000000FF -#define SPI_WB_MODE_S 16 -#define SPI_FLASH_STATUS_PRO_FLAG (BIT(7)) -#define SPI_FLASH_TOP_BOT_PRO_FLAG (BIT(5)) -#define SPI_FLASH_BP2 (BIT(4)) -#define SPI_FLASH_BP1 (BIT(3)) -#define SPI_FLASH_BP0 (BIT(2)) -#define SPI_FLASH_WRENABLE_FLAG (BIT(1)) -#define SPI_FLASH_BUSY_FLAG (BIT(0)) - -#define SPI_FLASH_CTRL2(i) (REG_SPI_BASE(i) + 0x14) -#define SPI_CS_DELAY_NUM 0x0000000F -#define SPI_CS_DELAY_NUM_S 28 -#define SPI_CS_DELAY_MODE 0x00000003 -#define SPI_CS_DELAY_MODE_S 26 -#define SPI_MOSI_DELAY_NUM 0x00000007 -#define SPI_MOSI_DELAY_NUM_S 23 -#define SPI_MOSI_DELAY_MODE 0x00000003 -#define SPI_MOSI_DELAY_MODE_S 21 -#define SPI_MISO_DELAY_NUM 0x00000007 -#define SPI_MISO_DELAY_NUM_S 18 -#define SPI_MISO_DELAY_MODE 0x00000003 -#define SPI_MISO_DELAY_MODE_S 16 -#define SPI_CK_OUT_HIGH_MODE 0x0000000F -#define SPI_CK_OUT_HIGH_MODE_S 12 -#define SPI_CK_OUT_LOW_MODE 0x0000000F -#define SPI_CK_OUT_LOW_MODE_S 8 -#define SPI_HOLD_TIME 0x0000000F -#define SPI_HOLD_TIME_S 4 -#define SPI_SETUP_TIME 0x0000000F -#define SPI_SETUP_TIME_S 0 - -#define SPI_FLASH_CLOCK(i) (REG_SPI_BASE(i) + 0x18) -#define SPI_CLK_EQU_SYSCLK (BIT(31)) -#define SPI_CLKDIV_PRE 0x00001FFF -#define SPI_CLKDIV_PRE_S 18 -#define SPI_CLKCNT_N 0x0000003F -#define SPI_CLKCNT_N_S 12 -#define SPI_CLKCNT_H 0x0000003F -#define SPI_CLKCNT_H_S 6 -#define SPI_CLKCNT_L 0x0000003F -#define SPI_CLKCNT_L_S 0 - -#define SPI_FLASH_USER(i) (REG_SPI_BASE(i) + 0x1C) -#define SPI_USR_COMMAND (BIT(31)) -#define SPI_FLASH_USR_ADDR (BIT(30)) -#define SPI_FLASH_USR_DUMMY (BIT(29)) -#define SPI_FLASH_USR_DIN (BIT(28)) -#define SPI_FLASH_DOUT (BIT(27)) -#define SPI_USR_DUMMY_IDLE (BIT(26)) -#define SPI_USR_DOUT_HIGHPART (BIT(25)) -#define SPI_USR_DIN_HIGHPART (BIT(24)) -#define SPI_USR_PREP_HOLD (BIT(23)) -#define SPI_USR_CMD_HOLD (BIT(22)) -#define SPI_USR_ADDR_HOLD (BIT(21)) -#define SPI_USR_DUMMY_HOLD (BIT(20)) -#define SPI_USR_DIN_HOLD (BIT(19)) -#define SPI_USR_DOUT_HOLD (BIT(18)) -#define SPI_USR_HOLD_POL (BIT(17)) -#define SPI_SIO (BIT(16)) -#define SPI_FWRITE_QIO (BIT(15)) -#define SPI_FWRITE_DIO (BIT(14)) -#define SPI_FWRITE_QUAD (BIT(13)) -#define SPI_FWRITE_DUAL (BIT(12)) -#define SPI_WR_BYTE_ORDER (BIT(11)) -#define SPI_RD_BYTE_ORDER (BIT(10)) -#define SPI_AHB_ENDIAN_MODE 0x00000003 -#define SPI_AHB_ENDIAN_MODE_S 8 -#define SPI_CK_OUT_EDGE (BIT(7)) -#define SPI_CK_I_EDGE (BIT(6)) -#define SPI_CS_SETUP (BIT(5)) -#define SPI_CS_HOLD (BIT(4)) -#define SPI_AHB_USR_COMMAND (BIT(3)) -#define SPI_AHB_USR_COMMAND_4BYTE (BIT(1)) -#define SPI_DOUTDIN (BIT(0)) - -#define SPI_FLASH_USER1(i) (REG_SPI_BASE(i) + 0x20) -#define SPI_USR_ADDR_BITLEN 0x0000003F -#define SPI_USR_ADDR_BITLEN_S 26 -#define SPI_USR_OUT_BITLEN 0x000001FF -#define SPI_USR_OUT_BITLEN_S 17 -#define SPI_USR_DIN_BITLEN 0x000001FF -#define SPI_USR_DIN_BITLEN_S 8 -#define SPI_USR_DUMMY_CYCLELEN 0x000000FF -#define SPI_USR_DUMMY_CYCLELEN_S 0 - -#define SPI_FLASH_USER2(i) (REG_SPI_BASE(i) + 0x24) -#define SPI_USR_COMMAND_BITLEN 0x0000000F -#define SPI_USR_COMMAND_BITLEN_S 28 -#define SPI_USR_COMMAND_VALUE 0x0000FFFF -#define SPI_USR_COMMAND_VALUE_S 0 - -#define SPI_FLASH_USER3(i) (REG_SPI_BASE(i) + 0x28) -#define SPI_FLASH_PIN(i) (REG_SPI_BASE(i) + 0x2C) -#define SPI_FLASH_SLAVE(i) (REG_SPI_BASE(i) + 0x30) -#define SPI_SYNC_RESET (BIT(31)) -#define SPI_SLAVE_MODE (BIT(30)) -#define SPI_SLV_WR_RD_BUF_EN (BIT(29)) -#define SPI_SLV_WR_RD_STA_EN (BIT(28)) -#define SPI_SLV_CMD_DEFINE (BIT(27)) -#define SPI_TRANS_CNT 0x0000000F -#define SPI_TRANS_CNT_S 23 -#define SPI_SLV_LAST_STATE 0x00000007 -#define SPI_SLV_LAST_STATE_S 20 -#define SPI_SLV_LAST_COMMAND 0x00000007 -#define SPI_SLV_LAST_COMMAND_S 17 -#define SPI_CS_I_MODE 0x00000003 -#define SPI_CS_I_MODE_S 10 -#define SPI_INT_EN 0x0000001F -#define SPI_INT_EN_S 5 -#define SPI_TRANS_DONE (BIT(4)) -#define SPI_SLV_WR_STA_DONE (BIT(3)) -#define SPI_SLV_RD_STA_DONE (BIT(2)) -#define SPI_SLV_WR_BUF_DONE (BIT(1)) -#define SPI_SLV_RD_BUF_DONE (BIT(0)) - -#define SPI_FLASH_SLAVE1(i) (REG_SPI_BASE(i) + 0x34) -#define SPI_SLV_STATUS_BITLEN 0x0000001F -#define SPI_SLV_STATUS_BITLEN_S 27 -#define SPI_SLV_STATUS_FAST_EN (BIT(26)) -#define SPI_SLV_STATUS_READBACK (BIT(25)) -#define SPI_SLV_BUF_BITLEN 0x000001FF -#define SPI_SLV_BUF_BITLEN_S 16 -#define SPI_SLV_RD_ADDR_BITLEN 0x0000003F -#define SPI_SLV_RD_ADDR_BITLEN_S 10 -#define SPI_SLV_WR_ADDR_BITLEN 0x0000003F -#define SPI_SLV_WR_ADDR_BITLEN_S 4 -#define SPI_SLV_WRSTA_DUMMY_EN (BIT(3)) -#define SPI_SLV_RDSTA_DUMMY_EN (BIT(2)) -#define SPI_SLV_WRBUF_DUMMY_EN (BIT(1)) -#define SPI_SLV_RDBUF_DUMMY_EN (BIT(0)) - -#define SPI_FLASH_SLAVE2(i) (REG_SPI_BASE(i) + 0x38) -#define SPI_SLV_WRBUF_DUMMY_CYCLELEN 0x000000FF -#define SPI_SLV_WRBUF_DUMMY_CYCLELEN_S 24 -#define SPI_SLV_RDBUF_DUMMY_CYCLELEN 0x000000FF -#define SPI_SLV_RDBUF_DUMMY_CYCLELEN_S 16 -#define SPI_SLV_WRSTA_DUMMY_CYCLELEN 0x000000FF -#define SPI_SLV_WRSTA_DUMMY_CYCLELEN_S 8 -#define SPI_SLV_RDSTA_DUMMY_CYCLELEN 0x000000FF -#define SPI_SLV_RDSTA_DUMMY_CYCLELEN_S 0 - -#define SPI_FLASH_SLAVE3(i) (REG_SPI_BASE(i) + 0x3C) -#define SPI_SLV_WRSTA_CMD_VALUE 0x000000FF -#define SPI_SLV_WRSTA_CMD_VALUE_S 24 -#define SPI_SLV_RDSTA_CMD_VALUE 0x000000FF -#define SPI_SLV_RDSTA_CMD_VALUE_S 16 -#define SPI_SLV_WRBUF_CMD_VALUE 0x000000FF -#define SPI_SLV_WRBUF_CMD_VALUE_S 8 -#define SPI_SLV_RDBUF_CMD_VALUE 0x000000FF -#define SPI_SLV_RDBUF_CMD_VALUE_S 0 - -#define SPI_FLASH_C0(i) (REG_SPI_BASE(i) +0x40) -#define SPI_FLASH_C1(i) (REG_SPI_BASE(i) +0x44) -#define SPI_FLASH_C2(i) (REG_SPI_BASE(i) +0x48) -#define SPI_FLASH_C3(i) (REG_SPI_BASE(i) +0x4C) -#define SPI_FLASH_C4(i) (REG_SPI_BASE(i) +0x50) -#define SPI_FLASH_C5(i) (REG_SPI_BASE(i) +0x54) -#define SPI_FLASH_C6(i) (REG_SPI_BASE(i) +0x58) -#define SPI_FLASH_C7(i) (REG_SPI_BASE(i) +0x5C) - -#define SPI_FLASH_EXT0(i) (REG_SPI_BASE(i) + 0xF0) -#define SPI_T_PP_ENA (BIT(31)) -#define SPI_T_PP_SHIFT 0x0000000F -#define SPI_T_PP_SHIFT_S 16 -#define SPI_T_PP_TIME 0x00000FFF -#define SPI_T_PP_TIME_S 0 - -#define SPI_FLASH_EXT1(i) (REG_SPI_BASE(i) + 0xF4) -#define SPI_T_ERASE_ENA (BIT(31)) -#define SPI_T_ERASE_SHIFT 0x0000000F -#define SPI_T_ERASE_SHIFT_S 16 -#define SPI_T_ERASE_TIME 0x00000FFF -#define SPI_T_ERASE_TIME_S 0 - -#define SPI_FLASH_EXT2(i) (REG_SPI_BASE(i) + 0xF8) -#define SPI_ST 0x00000007 -#define SPI_ST_S 0 - -#define SPI_FLASH_EXT3(i) (REG_SPI_BASE(i) + 0xFC) -#define SPI_INT_HOLD_ENA 0x00000003 -#define SPI_INT_HOLD_ENA_S 0 -#endif // SPI_REGISTER_H_INCLUDED diff --git a/libraries/Adafruit_ILI9341/examples/graphicstest/graphicstest.ino b/libraries/Adafruit_ILI9341/examples/graphicstest/graphicstest.ino deleted file mode 100644 index 7ba806f2d..000000000 --- a/libraries/Adafruit_ILI9341/examples/graphicstest/graphicstest.ino +++ /dev/null @@ -1,332 +0,0 @@ -/*************************************************** - This is our GFX example for the Adafruit ILI9341 Breakout and Shield - ----> http://www.adafruit.com/products/1651 - - Check out the links above for our tutorials and wiring diagrams - These displays use SPI to communicate, 4 or 5 pins are required to - interface (RST is optional) - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing - products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - MIT license, all text above must be included in any redistribution - - Modified by Sermus for ESP8266 - ****************************************************/ - - -#include "SPI.h" -#include "Adafruit_GFX.h" -#include "Adafruit_ILI9341.h" - -Adafruit_ILI9341 tft = Adafruit_ILI9341(); - -void setup() { - Serial.begin(115200); - Serial.println("ILI9341 Test!"); - - tft.begin(); - - Serial.println(F("Benchmark Time (microseconds)")); - - Serial.print(F("Screen fill ")); - Serial.println(testFillScreen()); - delay(500); - - Serial.print(F("Text ")); - Serial.println(testText()); - delay(3000); - - Serial.print(F("Lines ")); - Serial.println(testLines(ILI9341_CYAN)); - delay(500); - - Serial.print(F("Horiz/Vert Lines ")); - Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE)); - delay(500); - - Serial.print(F("Rectangles (outline) ")); - Serial.println(testRects(ILI9341_GREEN)); - delay(500); - - Serial.print(F("Rectangles (filled) ")); - Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA)); - delay(500); - - Serial.print(F("Circles (filled) ")); - Serial.println(testFilledCircles(10, ILI9341_MAGENTA)); - - Serial.print(F("Circles (outline) ")); - Serial.println(testCircles(10, ILI9341_WHITE)); - delay(500); - - Serial.print(F("Triangles (outline) ")); - Serial.println(testTriangles()); - delay(500); - - Serial.print(F("Triangles (filled) ")); - Serial.println(testFilledTriangles()); - delay(500); - - Serial.print(F("Rounded rects (outline) ")); - Serial.println(testRoundRects()); - delay(500); - - Serial.print(F("Rounded rects (filled) ")); - Serial.println(testFilledRoundRects()); - delay(500); - - Serial.println(F("Done!")); - -} - - -void loop(void) { - for(uint8_t rotation=0; rotation<4; rotation++) { - tft.setRotation(rotation); - testText(); - delay(1000); - } -} - -unsigned long testFillScreen() { - unsigned long start = micros(); - tft.fillScreen(ILI9341_BLACK); - tft.fillScreen(ILI9341_RED); - tft.fillScreen(ILI9341_GREEN); - tft.fillScreen(ILI9341_BLUE); - tft.fillScreen(ILI9341_BLACK); - return micros() - start; -} - -unsigned long testText() { - tft.fillScreen(ILI9341_BLACK); - unsigned long start = micros(); - tft.setCursor(0, 0); - tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1); - tft.println("Hello World!"); - tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2); - tft.println(1234.56); - tft.setTextColor(ILI9341_RED); tft.setTextSize(3); - tft.println(0xDEADBEEF, HEX); - tft.println(); - tft.setTextColor(ILI9341_GREEN); - tft.setTextSize(5); - tft.println("Groop"); - tft.setTextSize(2); - tft.println("I implore thee,"); - tft.setTextSize(1); - tft.println("my foonting turlingdromes."); - tft.println("And hooptiously drangle me"); - tft.println("with crinkly bindlewurdles,"); - tft.println("Or I will rend thee"); - tft.println("in the gobberwarts"); - tft.println("with my blurglecruncheon,"); - tft.println("see if I don't!"); - return micros() - start; -} - -unsigned long testLines(uint16_t color) { - unsigned long start, t; - int x1, y1, x2, y2, - w = tft.width(), - h = tft.height(); - - tft.fillScreen(ILI9341_BLACK); - - x1 = y1 = 0; - y2 = h - 1; - start = micros(); - for(x2=0; x20; i-=6) { - i2 = i / 2; - start = micros(); - tft.fillRect(cx-i2, cy-i2, i, i, color1); - t += micros() - start; - // Outlines are not included in timing results - tft.drawRect(cx-i2, cy-i2, i, i, color2); - } - - return t; -} - -unsigned long testFilledCircles(uint8_t radius, uint16_t color) { - unsigned long start; - int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2; - - tft.fillScreen(ILI9341_BLACK); - start = micros(); - for(x=radius; x10; i-=5) { - start = micros(); - tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, - tft.color565(0, i, i)); - t += micros() - start; - tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, - tft.color565(i, i, 0)); - } - - return t; -} - -unsigned long testRoundRects() { - unsigned long start; - int w, i, i2, - cx = tft.width() / 2 - 1, - cy = tft.height() / 2 - 1; - - tft.fillScreen(ILI9341_BLACK); - w = min(tft.width(), tft.height()); - start = micros(); - for(i=0; i20; i-=6) { - i2 = i / 2; - tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0)); - } - - return micros() - start; -} diff --git a/libraries/Adafruit_ILI9341/hspi.c b/libraries/Adafruit_ILI9341/hspi.c deleted file mode 100644 index 506c62bb8..000000000 --- a/libraries/Adafruit_ILI9341/hspi.c +++ /dev/null @@ -1,109 +0,0 @@ -#include "driver/hspi.h" - -/* -Pinout: -MISO GPIO12 -MOSI GPIO13 -CLK GPIO14 -CS GPIO15 -DC GPIO2 -*/ - -#define __min(a,b) ((a > b) ? (b):(a)) -uint32_t *spi_fifo; -uint32_t current_spi_port; - -spi_config spi_init(uint32_t spi_port, uint32_t prescaler, spi_mode mode) -{ - spi_config config; - - WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105); //clear bit9 - - if (spi_port == SPI) - { - PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA0_U, 2); // SD_D0 MISO - PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA1_U, 2); // SD_D1 MOSI - PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, 2); // CLK - } else if (spi_port == HSPI) - { - PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2); // HSPIQ MISO GPIO12 - PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2); // HSPID MOSI GPIO13 - PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2); // CLK GPIO14 - PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2); // CS GPIO15 - } - - - config.mode = mode; - config.spi_port = spi_port; - // SPI clock = CPU clock / 10 / 4 - // time length HIGHT level = (CPU clock / 10 / 2) ^ -1, - // time length LOW level = (CPU clock / 10 / 2) ^ -1 - config.clock_reg_val = (((prescaler - 1) & SPI_CLKDIV_PRE) << SPI_CLKDIV_PRE_S) | - ((1 & SPI_CLKCNT_N) << SPI_CLKCNT_N_S) | - ((0 & SPI_CLKCNT_H) << SPI_CLKCNT_H_S) | - ((1 & SPI_CLKCNT_L) << SPI_CLKCNT_L_S); - - spi_reinit(&config); - return config; -} - -void spi_reinit(spi_config *config) -{ - current_spi_port = config->spi_port; - spi_fifo = (uint32_t*)SPI_FLASH_C0(current_spi_port); - - uint32_t regvalue = SPI_FLASH_DOUT; - WRITE_PERI_REG(SPI_FLASH_CLOCK(current_spi_port), config->clock_reg_val); - WRITE_PERI_REG(SPI_FLASH_CTRL1(current_spi_port), 0); - - switch(config->mode) - { - case spi_mode_tx: - regvalue &= ~(BIT2 | SPI_FLASH_USR_ADDR | SPI_FLASH_USR_DUMMY | SPI_FLASH_USR_DIN | SPI_USR_COMMAND | SPI_DOUTDIN); - break; - case spi_mode_txrx: - regvalue |= SPI_DOUTDIN | SPI_CK_I_EDGE; - regvalue &= ~(BIT2 | SPI_FLASH_USR_ADDR | SPI_FLASH_USR_DUMMY | SPI_FLASH_USR_DIN | SPI_USR_COMMAND); - break; - } - - WRITE_PERI_REG(SPI_FLASH_USER(current_spi_port), regvalue); -} - -void spi_send_uint16_r(uint16_t data, int32_t repeats) -{ - uint32_t i; - uint32_t word = data << 16 | data; - - while(repeats > 0) - { - uint16_t bytes_to_transfer = __min(repeats * sizeof(uint16_t) , SPIFIFOSIZE * sizeof(uint32_t)); - spi_wait_ready(); - spi_prepare_tx(bytes_to_transfer); - for(i = 0; i < (bytes_to_transfer + 3) / 4;i++) - spi_fifo[i] = word; - spi_start_tx(); - repeats -= bytes_to_transfer / 2; - } -} - -void spi_send_data(const uint8_t * data, uint8_t datasize) -{ - uint32_t *_data = (uint32_t*)data; - uint8_t i; - - uint8_t words_to_send = __min((datasize + 3) / 4, SPIFIFOSIZE); - spi_prepare_tx(datasize); - for(i = 0; i < words_to_send;i++) - spi_fifo[i] = _data[i]; - spi_start_tx(); -} - -uint16_t spi_send_uint8_receive_13bits(uint8_t to_send) -{ - spi_prepare_txrx_bits(8, 13); - *spi_fifo = to_send; - spi_start_tx(); - spi_wait_ready(); - return (*spi_fifo) & 0x1FFF; -} diff --git a/libraries/Adafruit_ILI9341/mini-printf.c b/libraries/Adafruit_ILI9341/mini-printf.c deleted file mode 100644 index 29f948811..000000000 --- a/libraries/Adafruit_ILI9341/mini-printf.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * The Minimal snprintf() implementation - * - * Copyright (c) 2013,2014 Michal Ludvig - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the auhor nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ---- - * - * This is a minimal snprintf() implementation optimised - * for embedded systems with a very limited program memory. - * mini_snprintf() doesn't support _all_ the formatting - * the glibc does but on the other hand is a lot smaller. - * Here are some numbers from my STM32 project (.bin file size): - * no snprintf(): 10768 bytes - * mini snprintf(): 11420 bytes (+ 652 bytes) - * glibc snprintf(): 34860 bytes (+24092 bytes) - * Wasting nearly 24kB of memory just for snprintf() on - * a chip with 32kB flash is crazy. Use mini_snprintf() instead. - * - */ - -#include -#include -#include "mini-printf.h" - -static unsigned int -mini_strlen(const char *s) -{ - unsigned int len = 0; - while (s[len] != '\0') len++; - return len; -} - -static unsigned int -mini_itoa(int value, unsigned int radix, unsigned int uppercase, - char *buffer, unsigned int zero_pad) -{ - char *pbuffer = buffer; - int negative = 0; - unsigned int i, len; - - /* No support for unusual radixes. */ - if (radix > 16) - return 0; - - if (value < 0) { - negative = 1; - value = -value; - } - - /* This builds the string back to front ... */ - do { - int digit = value % radix; - *(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10); - value /= radix; - } while (value > 0); - - for (i = (pbuffer - buffer); i < zero_pad; i++) - *(pbuffer++) = '0'; - - if (negative) - *(pbuffer++) = '-'; - - *(pbuffer) = '\0'; - - /* ... now we reverse it (could do it recursively but will - * conserve the stack space) */ - len = (pbuffer - buffer); - for (i = 0; i < len / 2; i++) { - char j = buffer[i]; - buffer[i] = buffer[len-i-1]; - buffer[len-i-1] = j; - } - - return len; -} - -int -mini_vsnprintf(char *buffer, unsigned int buffer_len, const char *fmt, va_list va) -{ - char *pbuffer = buffer; - char bf[24]; - char ch; - - int _putc(char ch) - { - if ((unsigned int)((pbuffer - buffer) + 1) >= buffer_len) - return 0; - *(pbuffer++) = ch; - *(pbuffer) = '\0'; - return 1; - } - - int _puts(char *s, unsigned int len) - { - unsigned int i; - - if (buffer_len - (pbuffer - buffer) - 1 < len) - len = buffer_len - (pbuffer - buffer) - 1; - - /* Copy to buffer */ - for (i = 0; i < len; i++) - *(pbuffer++) = s[i]; - *(pbuffer) = '\0'; - - return len; - } - - while ((ch=*(fmt++))) { - if ((unsigned int)((pbuffer - buffer) + 1) >= buffer_len) - break; - if (ch!='%') - _putc(ch); - else { - char zero_pad = 0; - char *ptr; - unsigned int len; - - ch=*(fmt++); - - /* Zero padding requested */ - if (ch=='0') { - ch=*(fmt++); - if (ch == '\0') - goto end; - if (ch >= '0' && ch <= '9') - zero_pad = ch - '0'; - ch=*(fmt++); - } - - switch (ch) { - case 0: - goto end; - - case 'u': - case 'd': - len = mini_itoa(va_arg(va, unsigned int), 10, 0, bf, zero_pad); - _puts(bf, len); - break; - - case 'x': - case 'X': - len = mini_itoa(va_arg(va, unsigned int), 16, (ch=='X'), bf, zero_pad); - _puts(bf, len); - break; - - case 'c' : - _putc((char)(va_arg(va, int))); - break; - - case 's' : - ptr = va_arg(va, char*); - _puts(ptr, mini_strlen(ptr)); - break; - - default: - _putc(ch); - break; - } - } - } -end: - return pbuffer - buffer; -} - - -int -mini_snprintf(char* buffer, unsigned int buffer_len, const char *fmt, ...) -{ - int ret; - va_list va; - va_start(va, fmt); - ret = mini_vsnprintf(buffer, buffer_len, fmt, va); - va_end(va); - - return ret; -} diff --git a/libraries/Adafruit_ILI9341/mini-printf.h b/libraries/Adafruit_ILI9341/mini-printf.h deleted file mode 100644 index 45eb6705d..000000000 --- a/libraries/Adafruit_ILI9341/mini-printf.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * The Minimal snprintf() implementation - * - * Copyright (c) 2013 Michal Ludvig - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the auhor nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -#ifndef __MINI_PRINTF__ -#define __MINI_PRINTF__ -#include - -int mini_vsnprintf(char* buffer, unsigned int buffer_len, const char *fmt, va_list va); -int mini_snprintf(char* buffer, unsigned int buffer_len, const char *fmt, ...); - -#define vsnprintf mini_vsnprintf -#define snprintf mini_snprintf - -#endif diff --git a/libraries/Adafruit_ILI9341/readme.txt b/libraries/Adafruit_ILI9341/readme.txt deleted file mode 100644 index 90a7089e7..000000000 --- a/libraries/Adafruit_ILI9341/readme.txt +++ /dev/null @@ -1,12 +0,0 @@ -Port of Adafruit's library for ILI9341 to ESP8266 -Uses HSPI. -Wiring: -ILI9341 pin ESP8266 pin -MISO GPIO12 -MOSI GPIO13 -SCK GPIO14 -CS GPIO15 -DC GPIO2 - -Reset 3V3 -LED through 50-60 Ohm resistor to 3V3 \ No newline at end of file diff --git a/libraries/SPI/SPI.h b/libraries/SPI/SPI.h index a39f3d042..3a37c52e1 100644 --- a/libraries/SPI/SPI.h +++ b/libraries/SPI/SPI.h @@ -24,6 +24,8 @@ #include #include +#define SPI_HAS_TRANSACTION + // This defines are not representing the real Divider of the ESP8266 // the Defines match to an AVR Arduino on 16MHz for better compatibility #if F_CPU == 80000000L From 51b1daf6435187be42fa5733b1b7768dbb367ee1 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Fri, 8 May 2015 15:04:45 +0200 Subject: [PATCH 15/27] add esp8266_tcp_active_close.png image --- doc/esp8266_tcp_active_close.png | Bin 0 -> 132720 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/esp8266_tcp_active_close.png diff --git a/doc/esp8266_tcp_active_close.png b/doc/esp8266_tcp_active_close.png new file mode 100644 index 0000000000000000000000000000000000000000..f9dad0987335e0295247df2285ac93781b0c9649 GIT binary patch literal 132720 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 z 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 Date: Fri, 8 May 2015 15:27:32 +0200 Subject: [PATCH 16/27] fix SPI run on system clock --- libraries/SPI/SPI.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp index 2523e689f..740401c3a 100644 --- a/libraries/SPI/SPI.cpp +++ b/libraries/SPI/SPI.cpp @@ -43,7 +43,6 @@ void SPIClass::begin() { pinMode(MISO, SPECIAL); ///< GPIO12 pinMode(MOSI, SPECIAL); ///< GPIO13 - GPMUX = 0x105; // note crash if SPI flash Frequency < 40MHz SPI1C = 0; setFrequency(1000000); ///< 1MHz SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE; @@ -187,6 +186,11 @@ void SPIClass::setFrequency(uint32_t freq) { } void SPIClass::setClockDivider(uint32_t clockDiv) { + if(clockDiv == 0x80000000) { + GPMUX |= (1 << 9); // Set bit 9 if sysclock required + } else { + GPMUX &= ~(1 << 9); + } SPI1CLK = clockDiv; } From dcc899a1b5db2b894f28ac3c417608a80b8394af Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Fri, 8 May 2015 15:33:48 +0200 Subject: [PATCH 17/27] some speed optimizations --- libraries/SPI/SPI.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp index 740401c3a..d9f9ea1eb 100644 --- a/libraries/SPI/SPI.cpp +++ b/libraries/SPI/SPI.cpp @@ -123,7 +123,11 @@ void SPIClass::setFrequency(uint32_t freq) { const spiClk_t minFreqReg = { 0x7FFFF000 }; uint32_t minFreq = ClkRegToFreq((spiClk_t*) &minFreqReg); if(freq < minFreq) { - freq = minFreq; + // use minimum possible clock + setClockDivider(minFreqReg.regValue); + lastSetRegister = SPI1CLK; + lastSetFrequency = freq; + return; } uint8_t calN = 1; From 700108692014cec31fd19d5c42e1c7a0dd581bef Mon Sep 17 00:00:00 2001 From: ficeto Date: Sat, 9 May 2015 14:21:53 +0300 Subject: [PATCH 18/27] fix binary file http upload --- .../ESP8266WebServer/src/ESP8266WebServer.cpp | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp index 0057a2d1b..0b6d672e2 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp @@ -441,8 +441,6 @@ readfile: argByte = client.read(); if(argByte == 0x0A){ - line = client.readStringUntil(0x0D); - client.readStringUntil(0x0A); #ifdef DEBUG DEBUG_OUTPUT.print("Write File: "); DEBUG_OUTPUT.println(_currentUpload.buflen); @@ -450,7 +448,28 @@ readfile: if(_fileUploadHandler) _fileUploadHandler(); _currentUpload.size += _currentUpload.buflen; _currentUpload.buflen = 0; - if(line.startsWith("--"+boundary)){ + + argByte = client.read(); + if((char)argByte != '-'){ + //continue reading the file + _currentUpload.buf[_currentUpload.buflen++] = 0x0D; + _currentUpload.buf[_currentUpload.buflen++] = 0x0A; + goto readfile; + } else { + argByte = client.read(); + if((char)argByte != '-'){ + //continue reading the file + _currentUpload.buf[_currentUpload.buflen++] = 0x0D; + _currentUpload.buf[_currentUpload.buflen++] = 0x0A; + _currentUpload.buf[_currentUpload.buflen++] = (uint8_t)('-'); + goto readfile; + } + } + + uint8_t endBuf[boundary.length()]; + client.readBytes(endBuf, boundary.length()); + + if(strstr((const char*)endBuf, (const char*)(boundary.c_str())) != NULL){ _currentUpload.status = UPLOAD_FILE_END; #ifdef DEBUG DEBUG_OUTPUT.print("End File: "); @@ -461,7 +480,9 @@ readfile: DEBUG_OUTPUT.println(_currentUpload.size); #endif if(_fileUploadHandler) _fileUploadHandler(); - if(line == ("--"+boundary+"--")){ + line = client.readStringUntil(0x0D); + client.readStringUntil(0x0A); + if(line == "--"){ #ifdef DEBUG DEBUG_OUTPUT.println("Done Parsing POST"); #endif @@ -471,10 +492,9 @@ readfile: } else { _currentUpload.buf[_currentUpload.buflen++] = 0x0D; _currentUpload.buf[_currentUpload.buflen++] = 0x0A; - const char * lineChars = line.c_str(); uint32_t i = 0; - while(i < os_strlen(lineChars)){ - _currentUpload.buf[_currentUpload.buflen++] = lineChars[i++]; + while(i < boundary.length()){ + _currentUpload.buf[_currentUpload.buflen++] = endBuf[i++]; if(_currentUpload.buflen == 1460){ #ifdef DEBUG DEBUG_OUTPUT.println("Write File: 1460"); From 1f657fab7390a65ded113ca53dad9b7bc86917bd Mon Sep 17 00:00:00 2001 From: ficeto Date: Mon, 11 May 2015 13:43:26 +0300 Subject: [PATCH 19/27] plaintext POST fixes and rework of the SD example Added a single file web editor/browser/uploader and all needed methods to work with the files on the SD Card --- .../examples/SDWebServer/SDWebServer.ino | 275 ++++--- .../SDWebServer/SdRoot/edit/index.htm | 670 ++++++++++++++++++ .../examples/SDWebServer/SdRoot/index.htm | 22 + .../examples/SDWebServer/SdRoot/pins.png | Bin 0 -> 177869 bytes .../ESP8266WebServer/src/ESP8266WebServer.cpp | 5 +- 5 files changed, 888 insertions(+), 84 deletions(-) create mode 100644 libraries/ESP8266WebServer/examples/SDWebServer/SdRoot/edit/index.htm create mode 100644 libraries/ESP8266WebServer/examples/SDWebServer/SdRoot/index.htm create mode 100644 libraries/ESP8266WebServer/examples/SDWebServer/SdRoot/pins.png diff --git a/libraries/ESP8266WebServer/examples/SDWebServer/SDWebServer.ino b/libraries/ESP8266WebServer/examples/SDWebServer/SDWebServer.ino index bdc945d33..f7a1146e9 100644 --- a/libraries/ESP8266WebServer/examples/SDWebServer/SDWebServer.ino +++ b/libraries/ESP8266WebServer/examples/SDWebServer/SDWebServer.ino @@ -23,8 +23,10 @@ File extensions with more than 3 charecters are not supported by the SD Library File Names longer than 8 charecters will be truncated by the SD library, so keep filenames shorter index.htm is the default index (works on subfolders as well) -*/ + + upload the contents of SdRoot to the root of the SDcard and access the editor by going to http://esp8266sd.local/edit +*/ #include #include #include @@ -32,8 +34,8 @@ #include #include -//do not go larger than 1460 bytes as that is the maximum that could fit in a packet #define WWW_BUF_SIZE 1460 +#define DBG_OUTPUT_PORT Serial const char* ssid = "**********"; const char* password = "**********"; @@ -45,31 +47,36 @@ ESP8266WebServer server(80); static bool hasSD = false; File uploadFile; -void handleFileUpload(){ - if(server.uri() != "/upload") return; - HTTPUpload upload = server.upload(); - if(upload.status == UPLOAD_FILE_START){ - Serial.print("Upload: START, filename:"); - Serial.println(upload.filename); - if(SD.exists((char *)upload.filename.c_str())) SD.remove((char *)upload.filename.c_str()); - uploadFile = SD.open(upload.filename.c_str(), FILE_WRITE); - } else if(upload.status == UPLOAD_FILE_WRITE){ - Serial.print("Upload: WRITE, Bytes:"); - Serial.println(upload.buflen); - if(uploadFile) uploadFile.write(upload.buf, upload.buflen); - } else if(upload.status == UPLOAD_FILE_END){ - Serial.print("Upload: END, Size:"); - Serial.println(upload.size); - if(uploadFile) uploadFile.close(); - } +void returnOK(){ + WiFiClient client = server.client(); + String message = "HTTP/1.1 200 OK\r\n"; + message += "Content-Type: text/plain\r\n"; + message += "Connection: close\r\n"; + message += "Access-Control-Allow-Origin: *\r\n"; + message += "\r\n"; + client.print(message); + message = 0; + client.stop(); +} + +void returnFail(String msg){ + WiFiClient client = server.client(); + String message = "HTTP/1.1 500 Fail\r\n"; + message += "Content-Type: text/plain\r\n"; + message += "Connection: close\r\n"; + message += "Access-Control-Allow-Origin: *\r\n"; + message += "\r\n"; + message += msg; + message += "\r\n"; + client.print(message); + message = 0; + client.stop(); } bool loadFromSdCard(String path){ String dataType = "text/plain"; - //handle default index if(path.endsWith("/")) path += "index.htm"; - //set proper Content-Type for the most common extensions if(path.endsWith(".src")) path = path.substring(0, path.lastIndexOf(".")); else if(path.endsWith(".htm")) dataType = "text/html"; else if(path.endsWith(".css")) dataType = "text/css"; @@ -82,121 +89,225 @@ bool loadFromSdCard(String path){ else if(path.endsWith(".pdf")) dataType = "application/pdf"; else if(path.endsWith(".zip")) dataType = "application/zip"; - //Try to open the file File dataFile = SD.open(path.c_str()); - - //if it's a folder, try to open the default index - if(dataFile && dataFile.isDirectory()){ + if(dataFile.isDirectory()){ path += "/index.htm"; dataType = "text/html"; dataFile = SD.open(path.c_str()); } - //and finally if the file exists, stream the content to the client + if(server.hasArg("download")) dataType = "application/octet-stream"; + if (dataFile) { WiFiClient client = server.client(); - //send the file headers String head = "HTTP/1.1 200 OK\r\nContent-Type: "; head += dataType; head += "\r\nContent-Length: "; head += dataFile.size(); + head += "\r\nConnection: close"; + head += "\r\nAccess-Control-Allow-Origin: *"; head += "\r\n\r\n"; client.print(head); + dataType = 0; + path = 0; - //partition the data packets to fit in a TCP packet (1460 bytes MAX) uint8_t obuf[WWW_BUF_SIZE]; + while (dataFile.available() > WWW_BUF_SIZE){ dataFile.read(obuf, WWW_BUF_SIZE); if(client.write(obuf, WWW_BUF_SIZE) != WWW_BUF_SIZE){ - Serial.println("Sent less data than expected!"); + DBG_OUTPUT_PORT.println("Sent less data than expected!"); dataFile.close(); return true; } } - //stream the last data left (size is at most WWW_BUF_SIZE bytes) uint16_t leftLen = dataFile.available(); dataFile.read(obuf, leftLen); if(client.write(obuf, leftLen) != leftLen){ - Serial.println("Sent less data than expected!"); + DBG_OUTPUT_PORT.println("Sent less data than expected!"); dataFile.close(); return true; } - dataFile.close(); + client.stop(); return true; } return false; } -void tryLoadFromSdCard(){ - String message = "FileNotFound\n\n"; - if(hasSD){ - //try to load the URL from SD Card - if(loadFromSdCard(server.uri())) return; +void handleFileUpload(){ + if(server.uri() != "/edit") return; + HTTPUpload upload = server.upload(); + if(upload.status == UPLOAD_FILE_START){ + if(SD.exists((char *)upload.filename.c_str())) SD.remove((char *)upload.filename.c_str()); + uploadFile = SD.open(upload.filename.c_str(), FILE_WRITE); + DBG_OUTPUT_PORT.print("Upload: START, filename: "); DBG_OUTPUT_PORT.println(upload.filename); + } else if(upload.status == UPLOAD_FILE_WRITE){ + if(uploadFile) uploadFile.write(upload.buf, upload.buflen); + DBG_OUTPUT_PORT.print("Upload: WRITE, Bytes: "); DBG_OUTPUT_PORT.println(upload.buflen); + } else if(upload.status == UPLOAD_FILE_END){ + if(uploadFile) uploadFile.close(); + DBG_OUTPUT_PORT.print("Upload: END, Size: "); DBG_OUTPUT_PORT.println(upload.size); + } +} + +void deleteRecursive(String path){ + File file = SD.open((char *)path.c_str()); + if(!file.isDirectory()){ + file.close(); + SD.remove((char *)path.c_str()); + return; + } + file.rewindDirectory(); + File entry; + String entryPath; + while(true) { + entry = file.openNextFile(); + if (!entry) break; + entryPath = path + "/" +entry.name(); + if(entry.isDirectory()){ + entry.close(); + deleteRecursive(entryPath); + } else { + entry.close(); + SD.remove((char *)entryPath.c_str()); + } + entryPath = 0; + yield(); + } + SD.rmdir((char *)path.c_str()); + path = 0; + file.close(); +} + +void handleDelete(){ + if(server.args() == 0) return returnFail("BAD ARGS"); + String path = server.arg(0); + if(path == "/" || !SD.exists((char *)path.c_str())) return returnFail("BAD PATH"); + deleteRecursive(path); + returnOK(); + path = 0; +} + +void handleCreate(){ + if(server.args() == 0) return returnFail("BAD ARGS"); + String path = server.arg(0); + if(path == "/" || SD.exists((char *)path.c_str())) return returnFail("BAD PATH"); + if(path.indexOf('.') > 0){ + File file = SD.open((char *)path.c_str(), FILE_WRITE); + if(file){ + file.write((const char *)0); + file.close(); + } } else { - message = "SDCARD Not Detected\n\n"; + SD.mkdir((char *)path.c_str()); + } + returnOK(); + path = 0; +} + +void printDirectory() { + if(!server.hasArg("dir")) return returnFail("BAD ARGS"); + String path = server.arg("dir"); + if(path != "/" && !SD.exists((char *)path.c_str())) return returnFail("BAD PATH"); + File dir = SD.open((char *)path.c_str()); + path = 0; + if(!dir.isDirectory()){ + dir.close(); + return returnFail("NOT DIR"); + } + dir.rewindDirectory(); + + File entry; + WiFiClient client = server.client(); + client.print("HTTP/1.1 200 OK\r\nContent-Type: text/json\r\n\r\n"); + String output = "["; + while(true) { + entry = dir.openNextFile(); + if (!entry) break; + if(output != "[") output += ','; + output += "{\"type\":\""; + output += (entry.isDirectory())?"dir":"file"; + output += "\",\"name\":\""; + output += entry.name(); + output += "\""; + output += "}"; + entry.close(); + if(output.length() > 1460){ + client.write(output.substring(0, 1460).c_str(), 1460); + output = output.substring(1460); + } + } + dir.close(); + output += "]"; + client.write(output.c_str(), output.length()); + client.stop(); + output = 0; +} + +void handleNotFound(){ + if(hasSD && loadFromSdCard(server.uri())) return; + String message = "SDCARD Not Detected\n\n"; + message += "URI: "; + message += server.uri(); + message += "\nMethod: "; + message += (server.method() == HTTP_GET)?"GET":"POST"; + message += "\nArguments: "; + message += server.args(); + message += "\n"; + for (uint8_t i=0; i + + + SD Editor + + + + + +
+
+
+ + + + diff --git a/libraries/ESP8266WebServer/examples/SDWebServer/SdRoot/index.htm b/libraries/ESP8266WebServer/examples/SDWebServer/SdRoot/index.htm new file mode 100644 index 000000000..55fe5a66c --- /dev/null +++ b/libraries/ESP8266WebServer/examples/SDWebServer/SdRoot/index.htm @@ -0,0 +1,22 @@ + + + + + ESP Index + + + + +

ESP8266 Pin Functions

+ + + diff --git a/libraries/ESP8266WebServer/examples/SDWebServer/SdRoot/pins.png b/libraries/ESP8266WebServer/examples/SDWebServer/SdRoot/pins.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7fc0f9cb64d99f9f33b877798c61d02086d00b GIT binary patch literal 177869 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 z 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 Nla*4EtQ9v7`9ICfW 0) argValue += "\n"; + argValue += line; } #ifdef DEBUG DEBUG_OUTPUT.print("PostArg Value: "); From b5d695174313663b46cf56549c59d5c08811b8aa Mon Sep 17 00:00:00 2001 From: ficeto Date: Mon, 11 May 2015 14:17:13 +0300 Subject: [PATCH 20/27] fix PWM and Timer1 --- cores/esp8266/core_esp8266_timer.c | 23 +++++++++++++++-------- cores/esp8266/core_esp8266_wiring.c | 1 + 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/cores/esp8266/core_esp8266_timer.c b/cores/esp8266/core_esp8266_timer.c index 54ec65692..9edee3671 100644 --- a/cores/esp8266/core_esp8266_timer.c +++ b/cores/esp8266/core_esp8266_timer.c @@ -30,32 +30,39 @@ void timer1_isr_handler(void *para){ if(timer1_user_cb) timer1_user_cb(); } -void timer1_attachInterrupt(void (*userFunc)(void)) { +extern void __timer1_isr_init(){ + ETS_FRC_TIMER1_INTR_ATTACH(timer1_isr_handler, NULL); +} + +extern void __timer1_attachInterrupt(void (*userFunc)(void)) { timer1_user_cb = userFunc; ETS_FRC1_INTR_ENABLE(); } -void timer1_detachInterrupt() { +extern void __timer1_detachInterrupt() { timer1_user_cb = 0; TEIE &= ~TEIE1;//edge int disable ETS_FRC1_INTR_DISABLE(); } -void timer1_enable(uint8_t divider, uint8_t int_type, uint8_t reload){ +extern void __timer1_enable(uint8_t divider, uint8_t int_type, uint8_t reload){ T1C = (1 << TCTE) | ((divider & 3) << TCPD) | ((int_type & 1) << TCIT) | ((reload & 1) << TCAR); T1I = 0; } -void timer1_write(uint32_t ticks){ +extern void __timer1_write(uint32_t ticks){ T1L = ((ticks) & 0x7FFFFF); if((T1C & (1 << TCIT)) == 0) TEIE |= TEIE1;//edge int enable } -void timer1_disable(){ +extern void __timer1_disable(){ T1C = 0; T1I = 0; } -void timer1_isr_init(){ - ETS_FRC_TIMER1_INTR_ATTACH(timer1_isr_handler, NULL); -} \ No newline at end of file +extern void timer1_isr_init(void) __attribute__ ((weak, alias("__timer1_isr_init"))); +extern void timer1_detachInterrupt(void) __attribute__ ((weak, alias("__timer1_detachInterrupt"))); +extern void timer1_disable(void) __attribute__ ((weak, alias("__timer1_disable"))); +extern void timer1_attachInterrupt(void (*userFunc)(void)) __attribute__ ((weak, alias("__timer1_attachInterrupt"))); +extern void timer1_write(uint32_t ticks) __attribute__ ((weak, alias("__timer1_write"))); +extern void timer1_enable(uint8_t divider, uint8_t int_type, uint8_t reload) __attribute__ ((weak, alias("__timer1_enable"))); \ No newline at end of file diff --git a/cores/esp8266/core_esp8266_wiring.c b/cores/esp8266/core_esp8266_wiring.c index b16acc242..0170b4bcf 100644 --- a/cores/esp8266/core_esp8266_wiring.c +++ b/cores/esp8266/core_esp8266_wiring.c @@ -75,6 +75,7 @@ void delayMicroseconds(unsigned int us) { void init() { initPins(); + timer1_isr_init(); os_timer_setfn(µs_overflow_timer, (os_timer_func_t*) µs_overflow_tick, 0); os_timer_arm(µs_overflow_timer, 60000, REPEAT); } From 3ff208c3e937d8172abd30367934506dd2265eaa Mon Sep 17 00:00:00 2001 From: ficeto Date: Mon, 11 May 2015 14:28:37 +0300 Subject: [PATCH 21/27] add pwm freq adjustment --- cores/esp8266/Arduino.h | 1 + cores/esp8266/core_esp8266_wiring_pwm.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 51aa65602..6db13a088 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -172,6 +172,7 @@ int digitalRead(uint8_t); int analogRead(uint8_t); void analogReference(uint8_t mode); void analogWrite(uint8_t, int); +void analogWriteFreq(uint32_t freq); unsigned long millis(void); unsigned long micros(void); diff --git a/cores/esp8266/core_esp8266_wiring_pwm.c b/cores/esp8266/core_esp8266_wiring_pwm.c index 25ddceb2e..5552d53b4 100644 --- a/cores/esp8266/core_esp8266_wiring_pwm.c +++ b/cores/esp8266/core_esp8266_wiring_pwm.c @@ -139,4 +139,10 @@ extern void __analogWrite(uint8_t pin, int value) { } } +extern void __analogWriteFreq(uint32_t freq){ + pwm_freq = freq; + prep_pwm_steps(); +} + extern void analogWrite(uint8_t pin, int val) __attribute__ ((weak, alias("__analogWrite"))); +extern void analogWriteFreq(uint32_t freq) __attribute__ ((weak, alias("__analogWriteFreq"))); From 95007b229da203d9a4d5a847914f5304add50447 Mon Sep 17 00:00:00 2001 From: ficeto Date: Mon, 11 May 2015 22:29:02 +0300 Subject: [PATCH 22/27] Add option to select SPI speed at SD::begin --- libraries/SD/src/SD.cpp | 4 ++-- libraries/SD/src/SD.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/SD/src/SD.cpp b/libraries/SD/src/SD.cpp index 65d32741c..1d42e3738 100644 --- a/libraries/SD/src/SD.cpp +++ b/libraries/SD/src/SD.cpp @@ -332,7 +332,7 @@ boolean callback_rmdir(SdFile& parentDir, char *filePathComponent, -boolean SDClass::begin(uint8_t csPin) { +boolean SDClass::begin(uint8_t csPin, uint32_t speed) { /* Performs the initialisation required by the sdfatlib library. @@ -340,7 +340,7 @@ boolean SDClass::begin(uint8_t csPin) { Return true if initialization succeeds, false otherwise. */ - return card.init(SPI_HALF_SPEED, csPin) && + return card.init(speed, csPin) && volume.init(card) && root.openRoot(volume); } diff --git a/libraries/SD/src/SD.h b/libraries/SD/src/SD.h index 7435cf577..6ba08b21b 100644 --- a/libraries/SD/src/SD.h +++ b/libraries/SD/src/SD.h @@ -65,7 +65,7 @@ private: public: // This needs to be called to set up the connection to the SD card // before other methods are used. - boolean begin(uint8_t csPin = SD_CHIP_SELECT_PIN); + boolean begin(uint8_t csPin = SD_CHIP_SELECT_PIN, uint32_t speed = SPI_HALF_SPEED); // Open the specified file/directory with the supplied mode (e.g. read or // write, etc). Returns a File object for interacting with the file. From 4425e0921f69ef977c86f4cadf888c20384ac5f2 Mon Sep 17 00:00:00 2001 From: ficeto Date: Tue, 12 May 2015 10:36:12 +0300 Subject: [PATCH 23/27] removing timer aliases --- cores/esp8266/core_esp8266_timer.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/cores/esp8266/core_esp8266_timer.c b/cores/esp8266/core_esp8266_timer.c index 9edee3671..bfdd3692c 100644 --- a/cores/esp8266/core_esp8266_timer.c +++ b/cores/esp8266/core_esp8266_timer.c @@ -30,39 +30,32 @@ void timer1_isr_handler(void *para){ if(timer1_user_cb) timer1_user_cb(); } -extern void __timer1_isr_init(){ +void timer1_isr_init(){ ETS_FRC_TIMER1_INTR_ATTACH(timer1_isr_handler, NULL); } -extern void __timer1_attachInterrupt(void (*userFunc)(void)) { +void timer1_attachInterrupt(void (*userFunc)(void)) { timer1_user_cb = userFunc; ETS_FRC1_INTR_ENABLE(); } -extern void __timer1_detachInterrupt() { +void timer1_detachInterrupt() { timer1_user_cb = 0; TEIE &= ~TEIE1;//edge int disable ETS_FRC1_INTR_DISABLE(); } -extern void __timer1_enable(uint8_t divider, uint8_t int_type, uint8_t reload){ +void timer1_enable(uint8_t divider, uint8_t int_type, uint8_t reload){ T1C = (1 << TCTE) | ((divider & 3) << TCPD) | ((int_type & 1) << TCIT) | ((reload & 1) << TCAR); T1I = 0; } -extern void __timer1_write(uint32_t ticks){ +void timer1_write(uint32_t ticks){ T1L = ((ticks) & 0x7FFFFF); if((T1C & (1 << TCIT)) == 0) TEIE |= TEIE1;//edge int enable } -extern void __timer1_disable(){ +void timer1_disable(){ T1C = 0; T1I = 0; } - -extern void timer1_isr_init(void) __attribute__ ((weak, alias("__timer1_isr_init"))); -extern void timer1_detachInterrupt(void) __attribute__ ((weak, alias("__timer1_detachInterrupt"))); -extern void timer1_disable(void) __attribute__ ((weak, alias("__timer1_disable"))); -extern void timer1_attachInterrupt(void (*userFunc)(void)) __attribute__ ((weak, alias("__timer1_attachInterrupt"))); -extern void timer1_write(uint32_t ticks) __attribute__ ((weak, alias("__timer1_write"))); -extern void timer1_enable(uint8_t divider, uint8_t int_type, uint8_t reload) __attribute__ ((weak, alias("__timer1_enable"))); \ No newline at end of file From 88c6ee418d3a9129c53ea80f9de4e600939c1cd7 Mon Sep 17 00:00:00 2001 From: ficeto Date: Tue, 12 May 2015 13:58:05 +0300 Subject: [PATCH 24/27] add close and abort methods and enable disconnect callback --- .../ESP8266WiFi/src/include/ClientContext.h | 97 +++++++++---------- 1 file changed, 45 insertions(+), 52 deletions(-) diff --git a/libraries/ESP8266WiFi/src/include/ClientContext.h b/libraries/ESP8266WiFi/src/include/ClientContext.h index f9fd4e524..bf1166ac3 100644 --- a/libraries/ESP8266WiFi/src/include/ClientContext.h +++ b/libraries/ESP8266WiFi/src/include/ClientContext.h @@ -39,7 +39,39 @@ class ClientContext { tcp_sent(pcb, &_s_sent); tcp_err(pcb, &_s_error); } - + + err_t abort(){ + if(_pcb) { + DEBUGV(":abort\r\n"); + tcp_arg(_pcb, NULL); + tcp_sent(_pcb, NULL); + tcp_recv(_pcb, NULL); + tcp_err(_pcb, NULL); + tcp_abort(_pcb); + _pcb = 0; + } + return ERR_ABRT; + } + + err_t close(){ + err_t err = ERR_OK; + if(_pcb) { + DEBUGV(":close\r\n"); + tcp_arg(_pcb, NULL); + tcp_sent(_pcb, NULL); + tcp_recv(_pcb, NULL); + tcp_err(_pcb, NULL); + err = tcp_close(_pcb); + if(err != ERR_OK) { + DEBUGV(":tc err %d\r\n", err); + tcp_abort(_pcb); + err = ERR_ABRT; + } + _pcb = 0; + } + return err; + } + ~ClientContext() { } @@ -58,22 +90,10 @@ class ClientContext { } void unref() { - err_t err; DEBUGV(":ur %d\r\n", _refcnt); if(--_refcnt == 0) { flush(); - if(_pcb) { - tcp_arg(_pcb, NULL); - tcp_sent(_pcb, NULL); - tcp_recv(_pcb, NULL); - tcp_err(_pcb, NULL); - err = tcp_close(_pcb); - if(err != ERR_OK) { - DEBUGV(":tc err %d\r\n", err); - tcp_abort(_pcb); - } - _pcb = 0; - } + close(); delete this; } } @@ -179,6 +199,13 @@ class ClientContext { private: + err_t _sent(tcp_pcb* pcb, uint16_t len) { + DEBUGV(":sent %d\r\n", len); + _size_sent -= len; + if(_size_sent == 0 && _send_waiting) esp_schedule(); + return ERR_OK; + } + void _consume(size_t size) { ptrdiff_t left = _rx_buf->len - _rx_buf_offset - size; if(left > 0) { @@ -204,21 +231,9 @@ class ClientContext { if(pb == 0) // connection closed { - DEBUGV(":rcl\r\n"); - tcp_arg(pcb, NULL); - tcp_sent(pcb, NULL); - tcp_recv(pcb, NULL); - tcp_err(pcb, NULL); - // int error = tcp_close(pcb); - // if (error != ERR_OK) - { - DEBUGV(":rcla\r\n"); - tcp_abort(pcb); - _pcb = 0; - return ERR_ABRT; - } - _pcb = 0; - return ERR_OK; + if(_discard_cb) _discard_cb(_discard_cb_arg, this); + DEBUGV(":rcla\r\n"); + return abort(); } if(_rx_buf) { @@ -231,27 +246,12 @@ class ClientContext { _rx_buf = pb; _rx_buf_offset = 0; } - // tcp_recved(pcb, received); - // pbuf_free(pb); return ERR_OK; } void _error(err_t err) { DEBUGV(":er %d\r\n", err); - - if(_pcb) { - tcp_arg(_pcb, NULL); - tcp_sent(_pcb, NULL); - tcp_recv(_pcb, NULL); - tcp_err(_pcb, NULL); - err = tcp_close(_pcb); - if(err != ERR_OK) { - DEBUGV(":tc err %d\r\n", err); - tcp_abort(_pcb); - } - } - _pcb = 0; - + close(); if(_size_sent && _send_waiting) { esp_schedule(); } @@ -261,13 +261,6 @@ class ClientContext { return ERR_OK; } - err_t _sent(tcp_pcb* pcb, uint16_t len) { - DEBUGV(":sent %d\r\n", len); - _size_sent -= len; - if(_size_sent == 0 && _send_waiting) esp_schedule(); - return ERR_OK; - } - static err_t _s_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *pb, err_t err) { return reinterpret_cast(arg)->_recv(tpcb, pb, err); } From 1707d3d036f446fc246b9b3a843a5272309205db Mon Sep 17 00:00:00 2001 From: ficeto Date: Tue, 12 May 2015 14:22:16 +0300 Subject: [PATCH 25/27] move discard_cb to unref --- libraries/ESP8266WiFi/src/include/ClientContext.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266WiFi/src/include/ClientContext.h b/libraries/ESP8266WiFi/src/include/ClientContext.h index bf1166ac3..0001ef08b 100644 --- a/libraries/ESP8266WiFi/src/include/ClientContext.h +++ b/libraries/ESP8266WiFi/src/include/ClientContext.h @@ -94,6 +94,7 @@ class ClientContext { if(--_refcnt == 0) { flush(); close(); + if(_discard_cb) _discard_cb(_discard_cb_arg, this); delete this; } } @@ -231,7 +232,6 @@ class ClientContext { if(pb == 0) // connection closed { - if(_discard_cb) _discard_cb(_discard_cb_arg, this); DEBUGV(":rcla\r\n"); return abort(); } From bacc0b1f8bea02b26546df94d452546b91abc072 Mon Sep 17 00:00:00 2001 From: ficeto Date: Tue, 12 May 2015 15:21:35 +0300 Subject: [PATCH 26/27] add method to check for clients without referencing them --- libraries/ESP8266WiFi/src/WiFiServer.cpp | 5 +++++ libraries/ESP8266WiFi/src/WiFiServer.h | 1 + 2 files changed, 6 insertions(+) diff --git a/libraries/ESP8266WiFi/src/WiFiServer.cpp b/libraries/ESP8266WiFi/src/WiFiServer.cpp index ec61b424b..1ed2a64c1 100644 --- a/libraries/ESP8266WiFi/src/WiFiServer.cpp +++ b/libraries/ESP8266WiFi/src/WiFiServer.cpp @@ -75,6 +75,11 @@ void WiFiServer::begin() extern "C" uint32_t esp_micros_at_task_start(); +bool WiFiServer::hasClient(){ + if (_unclaimed) return true; + return false; +} + WiFiClient WiFiServer::available(byte* status) { static uint32_t lastPollTime = 0; diff --git a/libraries/ESP8266WiFi/src/WiFiServer.h b/libraries/ESP8266WiFi/src/WiFiServer.h index 0bd427e2f..7e7b0491b 100644 --- a/libraries/ESP8266WiFi/src/WiFiServer.h +++ b/libraries/ESP8266WiFi/src/WiFiServer.h @@ -44,6 +44,7 @@ private: public: WiFiServer(uint16_t port); WiFiClient available(uint8_t* status = NULL); + bool hasClient(); void begin(); virtual size_t write(uint8_t); virtual size_t write(const uint8_t *buf, size_t size); From 669609f3d7cc1b63dc5854ebc46236d2ecfe08a7 Mon Sep 17 00:00:00 2001 From: ficeto Date: Tue, 12 May 2015 18:44:31 +0300 Subject: [PATCH 27/27] fix uart receive --- cores/esp8266/HardwareSerial.cpp | 33 ++++++-------------------------- 1 file changed, 6 insertions(+), 27 deletions(-) diff --git a/cores/esp8266/HardwareSerial.cpp b/cores/esp8266/HardwareSerial.cpp index 727eb2639..87fd6dfbb 100644 --- a/cores/esp8266/HardwareSerial.cpp +++ b/cores/esp8266/HardwareSerial.cpp @@ -118,24 +118,14 @@ int uart_get_debug(); void ICACHE_RAM_ATTR uart_interrupt_handler(uart_t* uart) { // -------------- UART 0 -------------- - uint32_t status = U0IS; if(Serial.isRxEnabled()) { - if(status & (1 << UIFF)) { - while(true) { - int rx_count = (U0S >> USTXC) & 0xff; - if(!rx_count) - break; - - while(rx_count--) { - char c = U0F & 0xff; - Serial._rx_complete_irq(c); - } - } + while(U0IS & (1 << UIFF)) { + Serial._rx_complete_irq((char)(U0F & 0xff)); U0IC = (1 << UIFF); } } if(Serial.isTxEnabled()) { - if(status & (1 << UIFE)) { + if(U0IS & (1 << UIFE)) { U0IC = (1 << UIFE); Serial._tx_empty_irq(); } @@ -143,25 +133,14 @@ void ICACHE_RAM_ATTR uart_interrupt_handler(uart_t* uart) { // -------------- UART 1 -------------- - status = U1IS; if(Serial1.isRxEnabled()) { - if(status & (1 << UIFF)) { - while(true) { - int rx_count = (U1S >> USTXC) & 0xff; - if(!rx_count) - break; - - while(rx_count--) { - char c = U1F & 0xff; - Serial1._rx_complete_irq(c); - } - } + while(U1IS & (1 << UIFF)) { + Serial1._rx_complete_irq((char)(U1F & 0xff)); U1IC = (1 << UIFF); } } if(Serial1.isTxEnabled()) { - status = U1IS; - if(status & (1 << UIFE)) { + if(U1IS & (1 << UIFE)) { U1IC = (1 << UIFE); Serial1._tx_empty_irq(); }