├── .gitignore ├── README.md ├── custompart.csv ├── include └── README ├── lib └── README ├── platformio.ini ├── remotehwinfo-custom ├── .gitignore ├── README.md ├── Source │ └── main.cpp ├── include │ ├── SerialPort.cpp │ └── SerialPort.h ├── remotehwinfo.sln ├── remotehwinfo.vcxproj ├── remotehwinfo.vcxproj.filters ├── sensors.txt └── x64 │ └── Release │ ├── remotehwinfo.exe │ └── sensors.txt ├── src ├── Fonts │ ├── GothamBook_12.h │ ├── GothamBook_5.h │ ├── GothamBook_7.h │ ├── GothamBook_9.h │ ├── GothamLight_12.h │ ├── GothamLight_5.h │ ├── GothamLight_7.h │ └── GothamLight_9.h ├── Free_Fonts.h ├── Gifs │ ├── EvgaIntro.h │ ├── EvgaMainGif.h │ └── NvidiaRtx.h ├── Knackles │ ├── knackles001.h │ ├── knackles002.h │ ├── knackles003.h │ ├── knackles004.h │ ├── knackles005.h │ ├── knackles006.h │ ├── knackles007.h │ └── knackles008.h └── main.cpp └── test └── README /.gitignore: -------------------------------------------------------------------------------- 1 | .pio 2 | .vscode/.browse.c_cpp.db* 3 | .vscode/c_cpp_properties.json 4 | .vscode/launch.json 5 | .vscode/ipch 6 | .vscode/ 7 | .vs/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GPU_Monitor_Display 2 | 3 | This is a project covering the hardware and software needed to have a color display in your desktop that provides GPU Stats like Temperature, Clock Speed, Load, etc. 4 | 5 | **YouTube Video:** 6 | 7 | [![Video](https://img.youtube.com/vi/c35jJTC9yYk/0.jpg)](https://www.youtube.com/watch?v=c35jJTC9yYk) 8 | 9 | ## Hardware: 10 | * TTGO TDisplay (Arduino-based Microcontroller) 11 | * [Example Link](https://www.aliexpress.com/item/4000059428373.html?spm=a2g0s.9042311.0.0.493c4c4dIXBpsw) 12 | * USB C cable 13 | * 3D Printed Case for the TTGO TDisplay 14 | * I modified [this model](https://www.thingiverse.com/thing:4501444) and filled in the face buttons 15 | 16 | ## Software: 17 | * Install Visual Studio Code (VS Code) 18 | * Install the PlatformIO Extension in VS Code 19 | * Install [HWInfo v6.4.2](https://www.fosshub.com/HWiNFO-old.html?dwl=hwi_642.exe) 20 | * Download and install the [CP210x USB to UART Driver](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers) 21 | * Open the project in VS Code and Build the project. 22 | * Navigate to the TFT_eSPI Library folder in your Project directory 23 | * Example: \GPU_Monitor_Display\.pio\libdeps\esp32dev\TFT_eSPI 24 | * Make the following changes to the User_Setup_Select.h file in the TFT_eSPI_restOfFolderName folder: 25 | * Comment out "#include " 26 | * Uncomment "#include " 27 | * Save Settings 28 | 29 | ## Setup: 30 | * Modify the Sensors.txt file located in GPU_Monitor_Display/remotehwinfo-custom/x64/Release/ 31 | * Modify the COM port to the value of your Arduino (default value is COM9 as that's what I had) 32 | * Run remotehwinfo.exe application located in GPU_Monitor_Display/remotehwinfo-custom/x64/Release/ 33 | * Sensors.txt needs to be in the same directory 34 | -------------------------------------------------------------------------------- /custompart.csv: -------------------------------------------------------------------------------- 1 | # Name, Type, SubType, Offset, Size, Flags 2 | nvs, data, nvs, 0x9000, 0x5000, 3 | otadata, data, ota, 0xe000, 0x2000, 4 | app0, app, ota_0, 0x10000, 0x372000, 5 | eeprom, data, 0x99, 0x382000,0x1000, 6 | spiffs, data, spiffs, 0x383000,0x7D000, -------------------------------------------------------------------------------- /include/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project header files. 3 | 4 | A header file is a file containing C declarations and macro definitions 5 | to be shared between several project source files. You request the use of a 6 | header file in your project source file (C, C++, etc) located in `src` folder 7 | by including it, with the C preprocessing directive `#include'. 8 | 9 | ```src/main.c 10 | 11 | #include "header.h" 12 | 13 | int main (void) 14 | { 15 | ... 16 | } 17 | ``` 18 | 19 | Including a header file produces the same results as copying the header file 20 | into each source file that needs it. Such copying would be time-consuming 21 | and error-prone. With a header file, the related declarations appear 22 | in only one place. If they need to be changed, they can be changed in one 23 | place, and programs that include the header file will automatically use the 24 | new version when next recompiled. The header file eliminates the labor of 25 | finding and changing all the copies as well as the risk that a failure to 26 | find one copy will result in inconsistencies within a program. 27 | 28 | In C, the usual convention is to give header files names that end with `.h'. 29 | It is most portable to use only letters, digits, dashes, and underscores in 30 | header file names, and at most one dot. 31 | 32 | Read more about using header files in official GCC documentation: 33 | 34 | * Include Syntax 35 | * Include Operation 36 | * Once-Only Headers 37 | * Computed Includes 38 | 39 | https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html 40 | -------------------------------------------------------------------------------- /lib/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project specific (private) libraries. 3 | PlatformIO will compile them to static libraries and link into executable file. 4 | 5 | The source code of each library should be placed in a an own separate directory 6 | ("lib/your_library_name/[here are source files]"). 7 | 8 | For example, see a structure of the following two libraries `Foo` and `Bar`: 9 | 10 | |--lib 11 | | | 12 | | |--Bar 13 | | | |--docs 14 | | | |--examples 15 | | | |--src 16 | | | |- Bar.c 17 | | | |- Bar.h 18 | | | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html 19 | | | 20 | | |--Foo 21 | | | |- Foo.c 22 | | | |- Foo.h 23 | | | 24 | | |- README --> THIS FILE 25 | | 26 | |- platformio.ini 27 | |--src 28 | |- main.c 29 | 30 | and a contents of `src/main.c`: 31 | ``` 32 | #include 33 | #include 34 | 35 | int main (void) 36 | { 37 | ... 38 | } 39 | 40 | ``` 41 | 42 | PlatformIO Library Dependency Finder will find automatically dependent 43 | libraries scanning project source files. 44 | 45 | More information about PlatformIO Library Dependency Finder 46 | - https://docs.platformio.org/page/librarymanager/ldf.html 47 | -------------------------------------------------------------------------------- /platformio.ini: -------------------------------------------------------------------------------- 1 | ; PlatformIO Project Configuration File 2 | ; 3 | ; Build options: build flags, source filter 4 | ; Upload options: custom upload port, speed and extra flags 5 | ; Library options: dependencies, extra library storages 6 | ; Advanced options: extra scripting 7 | ; 8 | ; Please visit documentation for the other options and examples 9 | ; https://docs.platformio.org/page/projectconf.html 10 | 11 | [env:esp32dev] 12 | platform = espressif32 13 | board = esp32dev 14 | framework = arduino 15 | board_build.partitions = custompart.csv 16 | 17 | monitor_speed = 115200 18 | 19 | lib_deps = 20 | #################################################### 21 | ##################### TFT_eSPI ##################### 22 | #################################################### 23 | # Using a library name 24 | TFT_eSPI@^2.1.6 25 | 26 | #################################################### 27 | #################### ArduinoJSON ################### 28 | #################################################### 29 | # Using a library name 30 | ArduinoJson@^6.16.1 31 | 32 | #################################################### 33 | #################### MillisTimer ################### 34 | #################################################### 35 | MillisTimer@^1.0.0 -------------------------------------------------------------------------------- /remotehwinfo-custom/.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | bld/ 21 | [Bb]in/ 22 | [Oo]bj/ 23 | [Ll]og/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | project.fragment.lock.json 46 | artifacts/ 47 | 48 | *_i.c 49 | *_p.c 50 | *_i.h 51 | *.ilk 52 | *.meta 53 | *.obj 54 | *.pch 55 | *.pdb 56 | *.pgc 57 | *.pgd 58 | *.rsp 59 | *.sbr 60 | *.tlb 61 | *.tli 62 | *.tlh 63 | *.tmp 64 | *.tmp_proj 65 | *.log 66 | *.vspscc 67 | *.vssscc 68 | .builds 69 | *.pidb 70 | *.svclog 71 | *.scc 72 | 73 | # Chutzpah Test files 74 | _Chutzpah* 75 | 76 | # Visual C++ cache files 77 | ipch/ 78 | *.aps 79 | *.ncb 80 | *.opendb 81 | *.opensdf 82 | *.sdf 83 | *.cachefile 84 | *.VC.db 85 | *.VC.VC.opendb 86 | 87 | # Visual Studio profiler 88 | *.psess 89 | *.vsp 90 | *.vspx 91 | *.sap 92 | 93 | # TFS 2012 Local Workspace 94 | $tf/ 95 | 96 | # Guidance Automation Toolkit 97 | *.gpState 98 | 99 | # ReSharper is a .NET coding add-in 100 | _ReSharper*/ 101 | *.[Rr]e[Ss]harper 102 | *.DotSettings.user 103 | 104 | # JustCode is a .NET coding add-in 105 | .JustCode 106 | 107 | # TeamCity is a build add-in 108 | _TeamCity* 109 | 110 | # DotCover is a Code Coverage Tool 111 | *.dotCover 112 | 113 | # NCrunch 114 | _NCrunch_* 115 | .*crunch*.local.xml 116 | nCrunchTemp_* 117 | 118 | # MightyMoose 119 | *.mm.* 120 | AutoTest.Net/ 121 | 122 | # Web workbench (sass) 123 | .sass-cache/ 124 | 125 | # Installshield output folder 126 | [Ee]xpress/ 127 | 128 | # DocProject is a documentation generator add-in 129 | DocProject/buildhelp/ 130 | DocProject/Help/*.HxT 131 | DocProject/Help/*.HxC 132 | DocProject/Help/*.hhc 133 | DocProject/Help/*.hhk 134 | DocProject/Help/*.hhp 135 | DocProject/Help/Html2 136 | DocProject/Help/html 137 | 138 | # Click-Once directory 139 | publish/ 140 | 141 | # Publish Web Output 142 | *.[Pp]ublish.xml 143 | *.azurePubxml 144 | # TODO: Comment the next line if you want to checkin your web deploy settings 145 | # but database connection strings (with potential passwords) will be unencrypted 146 | #*.pubxml 147 | *.publishproj 148 | 149 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 150 | # checkin your Azure Web App publish settings, but sensitive information contained 151 | # in these scripts will be unencrypted 152 | PublishScripts/ 153 | 154 | # NuGet Packages 155 | *.nupkg 156 | # The packages folder can be ignored because of Package Restore 157 | **/packages/* 158 | # except build/, which is used as an MSBuild target. 159 | !**/packages/build/ 160 | # Uncomment if necessary however generally it will be regenerated when needed 161 | #!**/packages/repositories.config 162 | # NuGet v3's project.json files produces more ignoreable files 163 | *.nuget.props 164 | *.nuget.targets 165 | 166 | # Microsoft Azure Build Output 167 | csx/ 168 | *.build.csdef 169 | 170 | # Microsoft Azure Emulator 171 | ecf/ 172 | rcf/ 173 | 174 | # Windows Store app package directories and files 175 | AppPackages/ 176 | BundleArtifacts/ 177 | Package.StoreAssociation.xml 178 | _pkginfo.txt 179 | 180 | # Visual Studio cache files 181 | # files ending in .cache can be ignored 182 | *.[Cc]ache 183 | # but keep track of directories ending in .cache 184 | !*.[Cc]ache/ 185 | 186 | # Others 187 | ClientBin/ 188 | ~$* 189 | *~ 190 | *.dbmdl 191 | *.dbproj.schemaview 192 | *.jfm 193 | *.pfx 194 | *.publishsettings 195 | node_modules/ 196 | orleans.codegen.cs 197 | 198 | # Since there are multiple workflows, uncomment next line to ignore bower_components 199 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 200 | #bower_components/ 201 | 202 | # RIA/Silverlight projects 203 | Generated_Code/ 204 | 205 | # Backup & report files from converting an old project file 206 | # to a newer Visual Studio version. Backup files are not needed, 207 | # because we have git ;-) 208 | _UpgradeReport_Files/ 209 | Backup*/ 210 | UpgradeLog*.XML 211 | UpgradeLog*.htm 212 | 213 | # SQL Server files 214 | *.mdf 215 | *.ldf 216 | 217 | # Business Intelligence projects 218 | *.rdl.data 219 | *.bim.layout 220 | *.bim_*.settings 221 | 222 | # Microsoft Fakes 223 | FakesAssemblies/ 224 | 225 | # GhostDoc plugin setting file 226 | *.GhostDoc.xml 227 | 228 | # Node.js Tools for Visual Studio 229 | .ntvs_analysis.dat 230 | 231 | # Visual Studio 6 build log 232 | *.plg 233 | 234 | # Visual Studio 6 workspace options file 235 | *.opt 236 | 237 | # Visual Studio LightSwitch build output 238 | **/*.HTMLClient/GeneratedArtifacts 239 | **/*.DesktopClient/GeneratedArtifacts 240 | **/*.DesktopClient/ModelManifest.xml 241 | **/*.Server/GeneratedArtifacts 242 | **/*.Server/ModelManifest.xml 243 | _Pvt_Extensions 244 | 245 | # Paket dependency manager 246 | .paket/paket.exe 247 | paket-files/ 248 | 249 | # FAKE - F# Make 250 | .fake/ 251 | 252 | # JetBrains Rider 253 | .idea/ 254 | *.sln.iml 255 | 256 | # CodeRush 257 | .cr/ 258 | 259 | # Python Tools for Visual Studio (PTVS) 260 | __pycache__/ 261 | *.pyc -------------------------------------------------------------------------------- /remotehwinfo-custom/README.md: -------------------------------------------------------------------------------- 1 | ### Changelog: 2 | 3 | - **1.0** - Initial release of a Serial version of RemoteHWInfo. 4 | 5 | ### About: 6 | 7 | RemoteHWInfo HWiNFO Remote Monitor Serial Json App 8 | 9 | ### Usage: 10 | Start it up with windows (Easily done with NSSM) 11 | 12 | ### Credits: 13 | 14 | - Demion - Created the RemoteHWInfo project that this project heavily modifies https://github.com/Demion/remotehwinfo 15 | -------------------------------------------------------------------------------- /remotehwinfo-custom/Source/main.cpp: -------------------------------------------------------------------------------- 1 | #define _CRT_SECURE_NO_WARNINGS 2 | #define _CRT_NONSTDC_NO_WARNINGS 3 | #define _CRT_NON_CONFORMING_SWPRINTFS 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | #include 18 | #include "SerialPort.h" 19 | 20 | using namespace std; 21 | 22 | string portName = "\\\\.\\"; 23 | DWORD BaudRate = CBR_256000; 24 | const char* portNameConstChar; 25 | #define MAX_DATA_LENGTH 256 26 | SerialPort* arduino; 27 | char incomingData[MAX_DATA_LENGTH]; 28 | #define SEND 29 | 30 | 31 | 32 | #pragma comment(lib, "ws2_32.lib") 33 | 34 | #pragma pack(push, 1) 35 | 36 | struct HWINFO_SENSORS_READING 37 | { 38 | unsigned int readingType; 39 | unsigned int sensorIndex; 40 | unsigned int readingId; 41 | char labelOriginal[128]; 42 | char labelUser[128]; 43 | char unit[16]; 44 | double value; 45 | double valueMin; 46 | double valueMax; 47 | double valueAvg; 48 | }; 49 | 50 | struct HWINFO_SENSORS_SENSOR 51 | { 52 | unsigned int sensorId; 53 | unsigned int sensorInst; 54 | char sensorNameOriginal[128]; 55 | char sensorNameUser[128]; 56 | }; 57 | 58 | struct HWINFO_SENSORS_SHARED_MEM2 59 | { 60 | unsigned int signature; 61 | unsigned int version; 62 | unsigned int revision; 63 | long long int pollTime; 64 | unsigned int sensorOffset; 65 | unsigned int sensorSize; 66 | unsigned int sensorCount; 67 | unsigned int readingOffset; 68 | unsigned int readingSize; 69 | unsigned int readingCount; 70 | }; 71 | 72 | struct MAHM_SHARED_MEMORY_ENTRY 73 | { 74 | char name[MAX_PATH]; 75 | char units[MAX_PATH]; 76 | char localName[MAX_PATH]; 77 | char localUnits[MAX_PATH]; 78 | char format[MAX_PATH]; 79 | float data; 80 | float minLimit; 81 | float maxLimit; 82 | unsigned int flags; 83 | }; 84 | 85 | struct MAHM_SHARED_MEMORY_HEADER 86 | { 87 | unsigned int signature; 88 | unsigned int version; 89 | unsigned int headerSize; 90 | unsigned int entryCount; 91 | unsigned int entrySize; 92 | int time; 93 | }; 94 | 95 | #pragma pack(pop) 96 | 97 | #define MAHM_SHARED_MEMORY_ENTRY_FLAG_SHOW_IN_OSD 0x00000001 98 | #define MAHM_SHARED_MEMORY_ENTRY_FLAG_SHOW_IN_LCD 0x00000002 99 | #define MAHM_SHARED_MEMORY_ENTRY_FLAG_SHOW_IN_TRAY 0x00000004 100 | 101 | enum class HwinfoReadingType 102 | { 103 | None, 104 | Temp, 105 | Voltage, 106 | Fan, 107 | Current, 108 | Power, 109 | Clock, 110 | Usage, 111 | Other 112 | }; 113 | 114 | const unsigned int EntryTotalCount = 1024; 115 | bool EntryEnabled[EntryTotalCount] = {0}; 116 | 117 | unsigned int Port = 60000; 118 | 119 | bool Hwinfo = true, Gpuz = false, Afterburner = false; 120 | bool LogFileEnable = false; 121 | 122 | // Sensor Entries Map that's filled by reading the config file 123 | map sensorEntries; 124 | map::iterator it; 125 | vector sensorVector; 126 | 127 | #define LOG(expression) Log(#expression, strrchr(__FILE__, '\\') + 1, __LINE__, (intptr_t) (expression)) 128 | 129 | FILE *LogFile = 0; 130 | 131 | intptr_t Log(const char *expression, const char *fileName, unsigned int line, intptr_t result) 132 | { 133 | if (LogFile) 134 | { 135 | time_t t = time(0); 136 | tm *local = localtime(&t); 137 | 138 | fprintf(LogFile, "[%02d.%02d.%04d %02d:%02d:%02d][%8s:%04d] %-102s %-20zd (0x%0*zX)\n", 139 | local->tm_mday, local->tm_mon + 1, local->tm_year + 1900, local->tm_hour, local->tm_min, local->tm_sec, fileName, line, expression, result, (unsigned int) sizeof(result) * 2, result); 140 | 141 | fflush(LogFile); 142 | } 143 | 144 | return result; 145 | } 146 | 147 | size_t UnicodeToUtf8(const wchar_t *unicode, char **utf8) 148 | { 149 | size_t utf8Size = 0; 150 | 151 | size_t unicodeSize = wcslen(unicode); 152 | 153 | if (unicodeSize > 0) 154 | { 155 | LOG(utf8Size = WideCharToMultiByte(CP_UTF8, 0, unicode, (int) unicodeSize, 0, 0, 0, 0)); 156 | 157 | if (utf8Size > 0) 158 | { 159 | if (utf8) 160 | { 161 | LOG(*utf8 = (char*) malloc(utf8Size * sizeof(char))); 162 | 163 | if (*utf8) 164 | { 165 | LOG(utf8Size = WideCharToMultiByte(CP_UTF8, 0, unicode, (int) unicodeSize, *utf8, (int) utf8Size, 0, 0)); 166 | 167 | if (utf8Size == 0) 168 | free(*utf8); 169 | } 170 | } 171 | } 172 | } 173 | 174 | return utf8Size; 175 | } 176 | 177 | char* FormatSpecialChar(char *str) 178 | { 179 | size_t length = strlen(str); 180 | 181 | for (unsigned int i = 0; i < length; ++i) 182 | { 183 | if ((str[i] == '\\') || (str[i] == '\"')) 184 | { 185 | for (size_t j = length; j > i; --j) 186 | str[j] = str[j - 1]; 187 | 188 | str[i++] = '\\'; 189 | 190 | ++length; 191 | } 192 | } 193 | 194 | str[length] = '\0'; 195 | 196 | return str; 197 | } 198 | 199 | wchar_t* FormatSpecialCharUnicode(wchar_t *str) 200 | { 201 | size_t length = wcslen(str); 202 | 203 | for (unsigned int i = 0; i < length; ++i) 204 | { 205 | if ((str[i] == L'\\') || (str[i] == L'\"')) 206 | { 207 | for (size_t j = length; j > i; --j) 208 | str[j] = str[j - 1]; 209 | 210 | str[i++] = L'\\'; 211 | 212 | ++length; 213 | } 214 | } 215 | 216 | str[length] = L'\0'; 217 | 218 | return str; 219 | } 220 | 221 | bool GetHwinfo(HWINFO_SENSORS_SHARED_MEM2 *hwinfo, void **sensors, void **readings) 222 | { 223 | bool result = false; 224 | 225 | HANDLE mapFile = 0; 226 | 227 | LOG(mapFile = OpenFileMappingA(FILE_MAP_READ, false, "Global\\HWiNFO_SENS_SM2")); 228 | 229 | if (mapFile) 230 | { 231 | void *mapAddress = 0; 232 | 233 | LOG(mapAddress = MapViewOfFile(mapFile, FILE_MAP_READ, 0, 0, 0)); 234 | 235 | if (mapAddress) 236 | { 237 | if (hwinfo) 238 | memcpy(hwinfo, mapAddress, sizeof(HWINFO_SENSORS_SHARED_MEM2)); 239 | 240 | result = true; 241 | 242 | if (sensors) 243 | { 244 | LOG(*sensors = malloc(hwinfo->sensorSize * hwinfo->sensorCount)); 245 | 246 | if (*sensors) 247 | memcpy(*sensors, (unsigned char*) mapAddress + hwinfo->sensorOffset, hwinfo->sensorSize * hwinfo->sensorCount); 248 | else 249 | result = false; 250 | } 251 | 252 | if (result) 253 | { 254 | if (readings) 255 | { 256 | LOG(*readings = malloc(hwinfo->readingSize * hwinfo->readingCount)); 257 | 258 | if (*readings) 259 | { 260 | memcpy(*readings, (unsigned char*) mapAddress + hwinfo->readingOffset, hwinfo->readingSize * hwinfo->readingCount); 261 | } 262 | else 263 | { 264 | if (sensors) 265 | free(*sensors); 266 | 267 | result = false; 268 | } 269 | } 270 | } 271 | 272 | LOG(UnmapViewOfFile(mapAddress)); 273 | } 274 | 275 | LOG(CloseHandle(mapFile)); 276 | } 277 | 278 | return result; 279 | } 280 | 281 | void WriteJsonToArduino(wchar_t* json) 282 | { 283 | char* str = new char[wcslen(json) + 1]; 284 | wcstombs(str, json, MAX_DATA_LENGTH); 285 | arduino->writeSerialPort(str, MAX_DATA_LENGTH); 286 | } 287 | 288 | void ReadArduino() 289 | { 290 | int readResult = arduino->readSerialPort(incomingData, MAX_DATA_LENGTH); 291 | printf("%s\n", incomingData); 292 | } 293 | 294 | size_t CreateJson(char **jsonData) 295 | { 296 | size_t utf8Size = 0; 297 | 298 | wchar_t *json = 0; 299 | 300 | LOG(json = (wchar_t*) malloc(1000000 * sizeof(wchar_t))); 301 | 302 | if (json) 303 | { 304 | int entryIndex = 0; 305 | 306 | bool first = false; 307 | bool first_output = true; 308 | 309 | swprintf(json, L"{"); 310 | 311 | if (Hwinfo) 312 | { 313 | HWINFO_SENSORS_SHARED_MEM2 hwinfo = {0}; 314 | 315 | void *sensors = 0; 316 | void *readings = 0; 317 | 318 | if (GetHwinfo(&hwinfo, &sensors, &readings)) 319 | { 320 | first_output = false; 321 | 322 | first = true; 323 | 324 | swprintf(json + wcslen(json), 325 | L"\"r\":" 326 | L"["); 327 | 328 | first = true; 329 | 330 | 331 | for (unsigned int i = 0; i < hwinfo.readingCount; ++i) 332 | { 333 | HWINFO_SENSORS_READING *reading = (HWINFO_SENSORS_READING*) ((unsigned char*) readings + hwinfo.readingSize * i); 334 | 335 | it = sensorEntries.find(reading->labelOriginal); 336 | 337 | 338 | // If reading is in the sensorEntries Map 339 | if (it != sensorEntries.end()) 340 | { 341 | sensorVector[it->second] = *reading; 342 | } 343 | 344 | ++entryIndex; 345 | } 346 | 347 | for (int i = 0; i < sensorVector.size(); i++) { 348 | HWINFO_SENSORS_READING* reading = &sensorVector[i]; 349 | 350 | swprintf(json + wcslen(json), 351 | L"%hs" 352 | L"{" 353 | L"\"a\":\"%hs\"," 354 | L"\"b\":\"%hs\"," 355 | L"\"c\":%d" 356 | L"}", 357 | first ? "" : ",", 358 | FormatSpecialChar(reading->labelUser), 359 | FormatSpecialChar(reading->unit), 360 | (int)reading->value); 361 | 362 | first = false; 363 | } 364 | 365 | swprintf(json + wcslen(json), 366 | L"" 367 | L"]" 368 | L"}\n"); 369 | 370 | free(sensors); 371 | free(readings); 372 | } 373 | } 374 | 375 | WriteJsonToArduino(json); 376 | free(json); 377 | } 378 | 379 | return utf8Size; 380 | } 381 | 382 | bool readConfig() { 383 | bool opened = false; 384 | bool isPortFoundInConfig = false; 385 | try { 386 | string filename = "sensors.txt"; 387 | string delimiter = "="; 388 | int counter = 0; 389 | 390 | ifstream sensorsFile(filename); 391 | opened = sensorsFile.good(); 392 | 393 | for (string line; getline(sensorsFile, line); ) 394 | { 395 | string sensorName = line.substr(0, line.find(delimiter)); 396 | string iteratorNumberAsString = line.substr(line.find(delimiter) + 1, line.length()); 397 | if (sensorName == "port") 398 | { 399 | portName = portName + iteratorNumberAsString; 400 | isPortFoundInConfig = true; 401 | } 402 | else 403 | { 404 | try 405 | { 406 | int iteratorNumber = stoi(iteratorNumberAsString); 407 | sensorEntries.insert(pair(sensorName, iteratorNumber)); 408 | counter++; 409 | } 410 | catch (std::invalid_argument& e) 411 | { 412 | string errorText = "There was an issue parsing the following value as an Int: " + iteratorNumberAsString + "\n"; 413 | printf(errorText.c_str()); 414 | printf("Verify that the names and values follow the requirements for the sensors.txt file."); 415 | return false; 416 | } 417 | } 418 | 419 | } 420 | 421 | // Create a vector with the size of the number of elements read from the sensors.txt file. 422 | HWINFO_SENSORS_READING blank; 423 | for (int i = 0; i < counter; i++) { 424 | sensorVector.push_back(blank); 425 | } 426 | 427 | if (opened) { 428 | sensorsFile.close(); 429 | } 430 | 431 | if (!isPortFoundInConfig) 432 | { 433 | printf("\nThere was no entry in the sensors.txt file in the format of 'port=COMx'. Validate the entry and try again later.\n"); 434 | return false; 435 | } 436 | } 437 | catch (int n) { 438 | return false; 439 | } 440 | 441 | return true; 442 | } 443 | 444 | void ConnectToArduino() 445 | { 446 | portNameConstChar = portName.c_str(); 447 | arduino = new SerialPort(portNameConstChar, BaudRate); 448 | } 449 | 450 | void CommunicateWithArduino() 451 | { 452 | // wait connection 453 | while (!arduino->isConnected()) { 454 | Sleep(100); 455 | printf("."); 456 | ConnectToArduino(); 457 | } 458 | 459 | //Checking if arduino is connected or not 460 | if (arduino->isConnected()) { 461 | auto _connectedText = "Connected on port: " + portName; 462 | printf(_connectedText.c_str()); 463 | printf("\n"); 464 | } 465 | 466 | while (arduino->isConnected()) 467 | { 468 | char* jsonData = 0; 469 | CreateJson(&jsonData); 470 | arduino->readSerialPort(incomingData, MAX_DATA_LENGTH); 471 | printf("%s", incomingData); 472 | 473 | // 474 | Sleep(1000); 475 | } 476 | } 477 | 478 | int main(int argc, char *argv[]) 479 | { 480 | if (!readConfig()) 481 | { 482 | return EXIT_FAILURE; 483 | } 484 | else 485 | { 486 | ConnectToArduino(); 487 | 488 | while (true) 489 | { 490 | CommunicateWithArduino(); 491 | } 492 | 493 | if (LogFile) 494 | fclose(LogFile); 495 | } 496 | 497 | 498 | return EXIT_SUCCESS; 499 | } -------------------------------------------------------------------------------- /remotehwinfo-custom/include/SerialPort.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Manash Kumar Mandal 3 | * Modified Library introduced in Arduino Playground which does not work 4 | * This works perfectly 5 | * LICENSE: MIT 6 | */ 7 | 8 | #include "SerialPort.h" 9 | 10 | SerialPort::SerialPort(const char *portName, DWORD baudRate) 11 | { 12 | this->connected = false; 13 | 14 | this->handler = CreateFileA(static_cast(portName), 15 | GENERIC_READ | GENERIC_WRITE, 16 | 0, 17 | NULL, 18 | OPEN_EXISTING, 19 | FILE_ATTRIBUTE_NORMAL, 20 | NULL); 21 | if (this->handler == INVALID_HANDLE_VALUE) 22 | { 23 | if (GetLastError() == ERROR_FILE_NOT_FOUND) 24 | { 25 | std::cerr << "ERROR: Handle was not attached.Reason : " << portName << " not available\n"; 26 | } 27 | else 28 | { 29 | std::cerr << "ERROR!!!\n"; 30 | } 31 | } 32 | else 33 | { 34 | DCB dcbSerialParameters = {0}; 35 | 36 | if (!GetCommState(this->handler, &dcbSerialParameters)) 37 | { 38 | std::cerr << "Failed to get current serial parameters\n"; 39 | } 40 | else 41 | { 42 | dcbSerialParameters.BaudRate = baudRate; 43 | dcbSerialParameters.ByteSize = 8; 44 | dcbSerialParameters.StopBits = ONESTOPBIT; 45 | dcbSerialParameters.Parity = NOPARITY; 46 | dcbSerialParameters.fDtrControl = DTR_CONTROL_ENABLE; 47 | //dcbSerialParameters.fDtrControl = DTR_CONTROL_HANDSHAKE; 48 | 49 | if (!SetCommState(handler, &dcbSerialParameters)) 50 | { 51 | std::cout << "ALERT: could not set serial port parameters\n"; 52 | } 53 | else 54 | { 55 | this->connected = true; 56 | PurgeComm(this->handler, PURGE_RXCLEAR | PURGE_TXCLEAR); 57 | Sleep(ARDUINO_WAIT_TIME); 58 | } 59 | } 60 | } 61 | } 62 | 63 | SerialPort::~SerialPort() 64 | { 65 | if (this->connected) 66 | { 67 | this->connected = false; 68 | CloseHandle(this->handler); 69 | } 70 | } 71 | 72 | // Reading bytes from serial port to buffer; 73 | // returns read bytes count, or if error occurs, returns 0 74 | int SerialPort::readSerialPort(const char *buffer, unsigned int buf_size) 75 | { 76 | DWORD bytesRead{}; 77 | unsigned int toRead = 0; 78 | 79 | ClearCommError(this->handler, &this->errors, &this->status); 80 | 81 | if (this->status.cbInQue > 0) 82 | { 83 | if (this->status.cbInQue > buf_size) 84 | { 85 | toRead = buf_size; 86 | } 87 | else 88 | { 89 | toRead = this->status.cbInQue; 90 | } 91 | } 92 | 93 | memset((void*) buffer, 0, buf_size); 94 | 95 | if (ReadFile(this->handler, (void*) buffer, toRead, &bytesRead, NULL)) 96 | { 97 | return bytesRead; 98 | } 99 | 100 | return 0; 101 | } 102 | 103 | // Sending provided buffer to serial port; 104 | // returns true if succeed, false if not 105 | bool SerialPort::writeSerialPort(const char *buffer, unsigned int buf_size) 106 | { 107 | DWORD bytesSend; 108 | 109 | if (!WriteFile(this->handler, (void*) buffer, buf_size, &bytesSend, 0)) 110 | { 111 | ClearCommError(this->handler, &this->errors, &this->status); 112 | return false; 113 | } 114 | 115 | return true; 116 | } 117 | 118 | // Checking if serial port is connected 119 | bool SerialPort::isConnected() 120 | { 121 | if (!ClearCommError(this->handler, &this->errors, &this->status)) 122 | { 123 | this->connected = false; 124 | } 125 | 126 | return this->connected; 127 | } 128 | 129 | void SerialPort::closeSerial() 130 | { 131 | CloseHandle(this->handler); 132 | } 133 | -------------------------------------------------------------------------------- /remotehwinfo-custom/include/SerialPort.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Manash Kumar Mandal 3 | * Modified Library introduced in Arduino Playground which does not work 4 | * This works perfectly 5 | * LICENSE: MIT 6 | */ 7 | 8 | #pragma once 9 | 10 | #define ARDUINO_WAIT_TIME 2000 11 | #define MAX_DATA_LENGTH 2000 12 | 13 | #include 14 | #include 15 | 16 | class SerialPort 17 | { 18 | private: 19 | HANDLE handler; 20 | bool connected; 21 | COMSTAT status; 22 | DWORD errors; 23 | public: 24 | explicit SerialPort(const char *portName, DWORD baudRate = CBR_9600); 25 | ~SerialPort(); 26 | 27 | int readSerialPort(const char *buffer, unsigned int buf_size); 28 | bool writeSerialPort(const char *buffer, unsigned int buf_size); 29 | bool isConnected(); 30 | void closeSerial(); 31 | }; -------------------------------------------------------------------------------- /remotehwinfo-custom/remotehwinfo.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.28307.271 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "remotehwinfo", "remotehwinfo.vcxproj", "{80DB4A4B-E5A3-450A-BA1F-576082B71C19}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Debug|x86 = Debug|x86 12 | Release|x64 = Release|x64 13 | Release|x86 = Release|x86 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {80DB4A4B-E5A3-450A-BA1F-576082B71C19}.Debug|x64.ActiveCfg = Debug|x64 17 | {80DB4A4B-E5A3-450A-BA1F-576082B71C19}.Debug|x64.Build.0 = Debug|x64 18 | {80DB4A4B-E5A3-450A-BA1F-576082B71C19}.Debug|x86.ActiveCfg = Debug|Win32 19 | {80DB4A4B-E5A3-450A-BA1F-576082B71C19}.Debug|x86.Build.0 = Debug|Win32 20 | {80DB4A4B-E5A3-450A-BA1F-576082B71C19}.Release|x64.ActiveCfg = Release|x64 21 | {80DB4A4B-E5A3-450A-BA1F-576082B71C19}.Release|x64.Build.0 = Release|x64 22 | {80DB4A4B-E5A3-450A-BA1F-576082B71C19}.Release|x86.ActiveCfg = Release|Win32 23 | {80DB4A4B-E5A3-450A-BA1F-576082B71C19}.Release|x86.Build.0 = Release|Win32 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {9480E7E9-83B2-4B85-8BF1-F375385F373E} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /remotehwinfo-custom/remotehwinfo.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {80DB4A4B-E5A3-450A-BA1F-576082B71C19} 24 | Win32Proj 25 | remotehwinfo 26 | 10.0 27 | 28 | 29 | 30 | Application 31 | true 32 | v142 33 | Unicode 34 | 35 | 36 | Application 37 | false 38 | v142 39 | true 40 | Unicode 41 | 42 | 43 | Application 44 | true 45 | v142 46 | Unicode 47 | 48 | 49 | Application 50 | false 51 | v142 52 | true 53 | Unicode 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | true 75 | 76 | 77 | true 78 | 79 | 80 | false 81 | 82 | 83 | false 84 | 85 | 86 | 87 | Level3 88 | Disabled 89 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 90 | true 91 | 92 | 93 | true 94 | Console 95 | ws2_32.lib;%(AdditionalDependencies) 96 | RequireAdministrator 97 | Default 98 | 99 | 100 | 101 | 102 | Level3 103 | Disabled 104 | _DEBUG;_CONSOLE;%(PreprocessorDefinitions) 105 | true 106 | $(SolutionDir)\include 107 | 108 | 109 | true 110 | Console 111 | ws2_32.lib;%(AdditionalDependencies) 112 | RequireAdministrator 113 | Default 114 | 115 | 116 | 117 | 118 | Level3 119 | MaxSpeed 120 | true 121 | true 122 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 123 | true 124 | 125 | 126 | true 127 | true 128 | true 129 | Console 130 | ws2_32.lib;%(AdditionalDependencies) 131 | RequireAdministrator 132 | 133 | 134 | 135 | 136 | Level3 137 | MaxSpeed 138 | true 139 | true 140 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 141 | true 142 | $(SolutionDir)\include 143 | 144 | 145 | true 146 | true 147 | true 148 | Console 149 | ws2_32.lib;%(AdditionalDependencies) 150 | RequireAdministrator 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | -------------------------------------------------------------------------------- /remotehwinfo-custom/remotehwinfo.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Include 7 | 8 | 9 | 10 | 11 | {4f277f3e-bc0d-4407-a2c5-6b95339cf6a3} 12 | 13 | 14 | 15 | 16 | Include 17 | 18 | 19 | -------------------------------------------------------------------------------- /remotehwinfo-custom/sensors.txt: -------------------------------------------------------------------------------- 1 | port=COM9 2 | GPU Temperature=0 3 | GPU Clock=1 4 | GPU Core Load=2 5 | GPU Power=3 -------------------------------------------------------------------------------- /remotehwinfo-custom/x64/Release/remotehwinfo.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodyECSL/GPU_Monitor_Display/8a8f7a530911d3f0be4f5c0c562be8a7cf99cc82/remotehwinfo-custom/x64/Release/remotehwinfo.exe -------------------------------------------------------------------------------- /remotehwinfo-custom/x64/Release/sensors.txt: -------------------------------------------------------------------------------- 1 | port=COM9 2 | GPU Temperature=0 3 | GPU Clock=1 4 | GPU Core Load=2 5 | GPU Power=3 -------------------------------------------------------------------------------- /src/Fonts/GothamBook_12.h: -------------------------------------------------------------------------------- 1 | const uint8_t GothamBook12pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0xFF, 0x55, 0x03, 0xC0, 0xE7, 0x8F, 0x1E, 0x28, 0x51, 0xA2, 0x00, 3 | 0x06, 0x18, 0x08, 0x30, 0x30, 0x40, 0x60, 0x80, 0xC3, 0x0F, 0xFF, 0xDF, 4 | 0xFF, 0x84, 0x18, 0x08, 0x20, 0x30, 0x40, 0x61, 0x87, 0xFF, 0xEF, 0xFF, 5 | 0xC2, 0x0C, 0x0C, 0x10, 0x18, 0x60, 0x30, 0xC0, 0x03, 0x00, 0x7E, 0x0F, 6 | 0xF8, 0xE4, 0x66, 0x20, 0x31, 0x01, 0x88, 0x0E, 0x40, 0x3E, 0x00, 0x7E, 7 | 0x00, 0xBC, 0x04, 0x60, 0x21, 0x81, 0x0D, 0x08, 0x7E, 0x46, 0x3F, 0xE0, 8 | 0x7E, 0x00, 0xC0, 0x06, 0x00, 0x3C, 0x03, 0x1F, 0x81, 0x86, 0x70, 0x43, 9 | 0x0C, 0x20, 0xC3, 0x18, 0x38, 0xCC, 0x07, 0xE2, 0x00, 0xF1, 0x80, 0x00, 10 | 0xCF, 0x00, 0x67, 0xE0, 0x11, 0x98, 0x0C, 0xC3, 0x06, 0x30, 0xC1, 0x0C, 11 | 0x30, 0xC3, 0x98, 0x60, 0x7E, 0x30, 0x0F, 0x00, 0x07, 0x80, 0x3F, 0x80, 12 | 0x63, 0x81, 0x83, 0x03, 0x06, 0x02, 0x0C, 0x06, 0x30, 0x07, 0x80, 0x33, 13 | 0x04, 0xC7, 0x1B, 0x07, 0x36, 0x07, 0xCC, 0x07, 0x18, 0x0F, 0x1C, 0x3F, 14 | 0x3F, 0xE7, 0x1F, 0x04, 0xFB, 0x69, 0x20, 0x06, 0x1C, 0x61, 0x86, 0x0C, 15 | 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x30, 0x38, 16 | 0x30, 0x40, 0xE0, 0x38, 0x18, 0x0C, 0x06, 0x06, 0x03, 0x03, 0x03, 0x03, 17 | 0x03, 0x02, 0x06, 0x06, 0x0C, 0x18, 0x38, 0x60, 0xC0, 0x11, 0x2B, 0x79, 18 | 0x8D, 0xD2, 0xC4, 0x00, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x0F, 19 | 0xFF, 0xFF, 0xF0, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x6D, 0x97, 0x80, 20 | 0xFF, 0xF0, 0xF0, 0x00, 0x30, 0x03, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x0C, 21 | 0x01, 0x80, 0x18, 0x03, 0x00, 0x30, 0x06, 0x00, 0x60, 0x0C, 0x00, 0xC0, 22 | 0x18, 0x01, 0x00, 0x30, 0x02, 0x00, 0x60, 0x04, 0x00, 0xC0, 0x08, 0x00, 23 | 0x07, 0xC0, 0x3F, 0xE0, 0xF0, 0xE1, 0x80, 0xC6, 0x00, 0xCC, 0x01, 0x98, 24 | 0x03, 0xA0, 0x03, 0xC0, 0x07, 0xC0, 0x0D, 0x80, 0x33, 0x00, 0x66, 0x00, 25 | 0xC6, 0x03, 0x0F, 0x0E, 0x0F, 0xF8, 0x07, 0xC0, 0x3F, 0xF6, 0x31, 0x8C, 26 | 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0x0F, 0x83, 0xFC, 0x30, 0xE6, 27 | 0x07, 0xC0, 0x30, 0x03, 0x00, 0x20, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 28 | 0x60, 0x0C, 0x01, 0x80, 0x70, 0x0F, 0xFF, 0xFF, 0xF0, 0x7F, 0xF7, 0xFF, 29 | 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xF8, 0x0F, 0xE0, 0x0E, 30 | 0x00, 0x30, 0x03, 0x40, 0x3E, 0x03, 0x70, 0x63, 0xFC, 0x0F, 0x80, 0x00, 31 | 0x60, 0x03, 0x80, 0x0E, 0x00, 0x58, 0x03, 0x60, 0x19, 0x80, 0xC6, 0x06, 32 | 0x18, 0x10, 0x60, 0xC1, 0x86, 0x06, 0x3F, 0xFF, 0xFF, 0xFC, 0x01, 0x80, 33 | 0x06, 0x00, 0x18, 0x00, 0x60, 0x3F, 0xF3, 0xFF, 0x20, 0x02, 0x00, 0x20, 34 | 0x02, 0x00, 0x6F, 0x87, 0xFE, 0x30, 0xF0, 0x03, 0x00, 0x30, 0x03, 0x00, 35 | 0x34, 0x03, 0xF0, 0xE3, 0xFE, 0x0F, 0x80, 0x07, 0xC0, 0xFF, 0x8E, 0x0C, 36 | 0x60, 0x46, 0x00, 0x30, 0x01, 0x9F, 0x0D, 0xFC, 0xD8, 0x77, 0x01, 0xF8, 37 | 0x06, 0xC0, 0x36, 0x01, 0xB0, 0x1C, 0xE1, 0xC3, 0xFC, 0x0F, 0xC0, 0xFF, 38 | 0xFF, 0xFC, 0x01, 0x80, 0x60, 0x0C, 0x03, 0x00, 0x60, 0x18, 0x03, 0x00, 39 | 0xC0, 0x18, 0x06, 0x00, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x70, 0x00, 0x0F, 40 | 0x81, 0xFF, 0x1C, 0x1C, 0xC0, 0x66, 0x03, 0x30, 0x18, 0xC1, 0x83, 0xF8, 41 | 0x3F, 0xE3, 0x83, 0x98, 0x0F, 0x80, 0x3C, 0x01, 0xF0, 0x1D, 0xC1, 0xC7, 42 | 0xFC, 0x0F, 0x80, 0x1F, 0x07, 0xFC, 0x60, 0xEC, 0x06, 0xC0, 0x38, 0x03, 43 | 0xC0, 0x3C, 0x07, 0xE0, 0xF7, 0xFB, 0x1F, 0x30, 0x03, 0x00, 0x68, 0x0E, 44 | 0xE1, 0xC7, 0xF8, 0x1E, 0x00, 0xF0, 0x00, 0x0F, 0x6C, 0x00, 0x00, 0x0D, 45 | 0xB2, 0xF0, 0x00, 0x20, 0x1C, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0x30, 0x07, 46 | 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x70, 0x02, 0xFF, 0xFF, 0xFC, 0x00, 47 | 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xF8, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 48 | 0x03, 0x80, 0x0E, 0x00, 0x30, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x00, 49 | 0x80, 0x00, 0x1F, 0x0F, 0xF3, 0x87, 0x60, 0x60, 0x06, 0x00, 0xC0, 0x18, 50 | 0x06, 0x0F, 0x81, 0xE0, 0x30, 0x06, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x60, 51 | 0x0C, 0x00, 0x00, 0xFC, 0x00, 0x38, 0x18, 0x03, 0x00, 0x30, 0x20, 0x00, 52 | 0x42, 0x00, 0x02, 0x10, 0x3D, 0x89, 0x07, 0xFC, 0x28, 0x71, 0xE1, 0x83, 53 | 0x07, 0x0C, 0x30, 0x10, 0x61, 0x80, 0x83, 0x0C, 0x0C, 0x18, 0x60, 0x60, 54 | 0xA1, 0x87, 0x89, 0x0F, 0xEF, 0xC8, 0x3E, 0x3C, 0x20, 0x00, 0x00, 0x80, 55 | 0x00, 0x03, 0x00, 0x20, 0x0E, 0x07, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xC0, 56 | 0x00, 0xE0, 0x00, 0xF8, 0x00, 0x6C, 0x00, 0x36, 0x00, 0x31, 0x80, 0x18, 57 | 0xC0, 0x18, 0x30, 0x0C, 0x18, 0x0C, 0x06, 0x06, 0x03, 0x07, 0xFF, 0xC3, 58 | 0xFF, 0xE1, 0x80, 0x31, 0x80, 0x0C, 0xC0, 0x06, 0xC0, 0x01, 0x80, 0xFF, 59 | 0xC3, 0xFF, 0xCC, 0x03, 0xB0, 0x06, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xB0, 60 | 0x0C, 0xFF, 0xE3, 0xFF, 0xCC, 0x03, 0xB0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 61 | 0x01, 0xBF, 0xFE, 0xFF, 0xE0, 0x07, 0xE0, 0x3F, 0xF0, 0xF0, 0x73, 0x80, 62 | 0x76, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 63 | 0x00, 0x06, 0x00, 0x06, 0x00, 0x0E, 0x01, 0x8F, 0x07, 0x8F, 0xFC, 0x07, 64 | 0xE0, 0xFF, 0x81, 0xFF, 0xC3, 0x01, 0xE6, 0x00, 0xEC, 0x00, 0xD8, 0x01, 65 | 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 66 | 0x00, 0xD8, 0x03, 0xB0, 0x1E, 0x7F, 0xF0, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 67 | 0xF0, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xFF, 0xE7, 68 | 0xFF, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x1F, 0xFF, 0xFF, 69 | 0xF8, 0xFF, 0xFF, 0xFF, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 70 | 0x00, 0xFF, 0xEF, 0xFE, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 71 | 0x00, 0xC0, 0x00, 0x07, 0xE0, 0x3F, 0xF0, 0xE0, 0x73, 0x80, 0x46, 0x00, 72 | 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0xFF, 0x81, 0xFF, 0x00, 0x1E, 73 | 0x00, 0x3E, 0x00, 0x6E, 0x00, 0xCE, 0x07, 0x8F, 0xFE, 0x07, 0xE0, 0xC0, 74 | 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 75 | 0x03, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 76 | 0x00, 0xF0, 0x03, 0xC0, 0x0C, 0xFF, 0xFF, 0x80, 0x00, 0xC0, 0x30, 0x0C, 77 | 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 78 | 0xF0, 0x3E, 0x19, 0xFE, 0x1E, 0x00, 0xC0, 0x1D, 0x80, 0x33, 0x00, 0xC6, 79 | 0x03, 0x0C, 0x0C, 0x18, 0x30, 0x30, 0xC0, 0x63, 0x00, 0xCF, 0x01, 0xB7, 80 | 0x03, 0xC7, 0x07, 0x06, 0x0C, 0x06, 0x18, 0x06, 0x30, 0x0E, 0x60, 0x0E, 81 | 0xC0, 0x0E, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 82 | 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 83 | 0x0F, 0xFF, 0xFF, 0xF0, 0xE0, 0x03, 0xE0, 0x03, 0xF0, 0x07, 0xF8, 0x0D, 84 | 0xD8, 0x0D, 0xCC, 0x19, 0xCE, 0x31, 0xC6, 0x31, 0xC3, 0x61, 0xC3, 0xC1, 85 | 0xC1, 0xC1, 0xC0, 0x81, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 86 | 0xC0, 0x01, 0xE0, 0x07, 0xC0, 0x0F, 0xC0, 0x1E, 0xC0, 0x3D, 0xC0, 0x79, 87 | 0x80, 0xF1, 0x81, 0xE1, 0x83, 0xC3, 0x87, 0x83, 0x8F, 0x03, 0x1E, 0x03, 88 | 0x3C, 0x03, 0x78, 0x07, 0xF0, 0x07, 0xE0, 0x07, 0xC0, 0x06, 0x07, 0xE0, 89 | 0x0F, 0xFC, 0x0F, 0x07, 0x0E, 0x01, 0xC6, 0x00, 0x76, 0x00, 0x1B, 0x00, 90 | 0x0F, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x66, 91 | 0x00, 0x73, 0x80, 0x30, 0xF0, 0x70, 0x3F, 0xF0, 0x07, 0xE0, 0x00, 0xFF, 92 | 0xC7, 0xFF, 0x30, 0x1D, 0x80, 0x7C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x07, 93 | 0xC0, 0x77, 0xFF, 0x3F, 0xE1, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 94 | 0x00, 0xC0, 0x00, 0x07, 0xE0, 0x0F, 0xFC, 0x0F, 0x07, 0x0E, 0x01, 0xC6, 95 | 0x00, 0x76, 0x00, 0x1B, 0x00, 0x0D, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 96 | 0xF0, 0x08, 0xF8, 0x0E, 0x66, 0x03, 0xF3, 0x80, 0x78, 0xF0, 0x78, 0x3F, 97 | 0xF6, 0x07, 0xE3, 0x80, 0x00, 0x80, 0xFF, 0xC3, 0xFF, 0xCC, 0x03, 0xB0, 98 | 0x06, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x06, 0xC0, 0x3B, 0xFF, 0xCF, 99 | 0xFC, 0x30, 0x70, 0xC0, 0xE3, 0x01, 0x8C, 0x03, 0x30, 0x06, 0xC0, 0x0C, 100 | 0x0F, 0x81, 0xFF, 0x1C, 0x1C, 0xC0, 0x26, 0x00, 0x30, 0x01, 0xC0, 0x07, 101 | 0x80, 0x0F, 0xC0, 0x07, 0x80, 0x0C, 0x00, 0x30, 0x01, 0xB0, 0x0F, 0xC1, 102 | 0xC7, 0xFE, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0x06, 0x00, 0x30, 103 | 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 104 | 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0xC0, 0x0F, 0x00, 0x3C, 105 | 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 106 | 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xE0, 0x0D, 0x80, 0x67, 0x83, 0x8F, 0xFC, 107 | 0x0F, 0xC0, 0xC0, 0x03, 0x60, 0x06, 0x60, 0x06, 0x70, 0x06, 0x30, 0x0C, 108 | 0x30, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x10, 0x0C, 0x30, 0x0C, 0x30, 109 | 0x06, 0x60, 0x06, 0x60, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x01, 0x80, 110 | 0xC0, 0x18, 0x03, 0xB0, 0x0E, 0x01, 0x98, 0x07, 0x00, 0xCC, 0x07, 0x80, 111 | 0xC3, 0x03, 0x60, 0x61, 0x81, 0xB0, 0x30, 0xC1, 0x98, 0x30, 0x30, 0xC6, 112 | 0x18, 0x18, 0x63, 0x0C, 0x0C, 0x61, 0x8C, 0x03, 0x30, 0x66, 0x01, 0x98, 113 | 0x32, 0x00, 0xD8, 0x1B, 0x00, 0x3C, 0x07, 0x80, 0x1E, 0x03, 0x80, 0x06, 114 | 0x01, 0xC0, 0x03, 0x00, 0x60, 0x00, 0xE0, 0x0E, 0xE0, 0x18, 0xC0, 0x60, 115 | 0xC1, 0x80, 0xC3, 0x01, 0xCC, 0x01, 0xB0, 0x01, 0xC0, 0x03, 0x80, 0x07, 116 | 0x80, 0x1B, 0x00, 0x63, 0x01, 0xC3, 0x03, 0x07, 0x0C, 0x06, 0x30, 0x06, 117 | 0xE0, 0x06, 0xC0, 0x07, 0x60, 0x0E, 0x70, 0x0C, 0x30, 0x18, 0x18, 0x30, 118 | 0x1C, 0x30, 0x0C, 0x60, 0x06, 0xC0, 0x07, 0xC0, 0x03, 0x80, 0x01, 0x80, 119 | 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 120 | 0xFF, 0xFF, 0xFF, 0xC0, 0x0C, 0x00, 0xC0, 0x06, 0x00, 0x60, 0x06, 0x00, 121 | 0x60, 0x06, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x01, 0x80, 122 | 0x1F, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 123 | 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0xFF, 0xF0, 0xC0, 0x02, 124 | 0x00, 0x18, 0x00, 0x40, 0x03, 0x00, 0x08, 0x00, 0x60, 0x01, 0x00, 0x0C, 125 | 0x00, 0x20, 0x01, 0x80, 0x04, 0x00, 0x30, 0x00, 0x80, 0x06, 0x00, 0x10, 126 | 0x00, 0xC0, 0x02, 0x00, 0x18, 0x00, 0x40, 0x03, 0x00, 0x0C, 0xFF, 0xFC, 127 | 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 128 | 0x02, 0x07, 0xFF, 0xF0, 0x18, 0x3C, 0x66, 0x42, 0xC3, 0xFF, 0xFF, 0xFF, 129 | 0xF0, 0x67, 0x0C, 0x30, 0x1F, 0x0F, 0xF8, 0x83, 0x80, 0x31, 0xF6, 0xFF, 130 | 0xF8, 0x1E, 0x03, 0xC0, 0x7C, 0x1D, 0xFF, 0x9F, 0x30, 0xC0, 0x06, 0x00, 131 | 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x3E, 0x1F, 0xFC, 0xF0, 0xF7, 132 | 0x01, 0xB0, 0x0D, 0x80, 0x3C, 0x01, 0xE0, 0x1B, 0x80, 0xDE, 0x0E, 0xDF, 133 | 0xE6, 0x7C, 0x00, 0x0F, 0x83, 0xFE, 0x70, 0x76, 0x02, 0xC0, 0x0C, 0x00, 134 | 0xC0, 0x0E, 0x00, 0x60, 0x27, 0x87, 0x3F, 0xC0, 0xF8, 0x00, 0x18, 0x00, 135 | 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x3E, 0x67, 0xFF, 0x70, 0x7B, 136 | 0x01, 0xD8, 0x07, 0x80, 0x3C, 0x01, 0xF0, 0x0D, 0x80, 0xEE, 0x0F, 0x3F, 137 | 0xD8, 0x7C, 0xC0, 0x0F, 0x83, 0xFC, 0x70, 0xE6, 0x02, 0xC0, 0x3F, 0xFF, 138 | 0xFF, 0xFC, 0x00, 0x60, 0x27, 0x07, 0x3F, 0xC0, 0xF8, 0x0F, 0x1F, 0x30, 139 | 0x30, 0x30, 0x30, 0xFF, 0xFF, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 140 | 0x30, 0x30, 0x30, 0x0F, 0x99, 0xFE, 0xDC, 0x1E, 0xC0, 0x7C, 0x01, 0xE0, 141 | 0x0F, 0x00, 0x6C, 0x07, 0x70, 0x79, 0xFE, 0xC3, 0xE6, 0x00, 0x34, 0x03, 142 | 0x38, 0x38, 0xFF, 0x81, 0xF0, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 143 | 0x80, 0x37, 0xC7, 0xFE, 0xF0, 0xD8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 144 | 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0C, 0xF0, 0x3F, 0xFF, 0xFF, 0xC0, 0x33, 145 | 0x00, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0xE0, 0xC0, 0x18, 146 | 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x3E, 0x0C, 0xC3, 0x18, 0xC3, 147 | 0x30, 0x6E, 0x0F, 0x61, 0xCE, 0x30, 0xC6, 0x0C, 0xC0, 0xD8, 0x1C, 0xFF, 148 | 0xFF, 0xFF, 0xFF, 0xF0, 0xCF, 0x0F, 0x9B, 0xF3, 0xFB, 0xC7, 0xC3, 0x70, 149 | 0x70, 0x3C, 0x0E, 0x07, 0x80, 0x80, 0xF0, 0x10, 0x1E, 0x02, 0x03, 0xC0, 150 | 0x40, 0x78, 0x08, 0x0F, 0x01, 0x01, 0xE0, 0x20, 0x30, 0xCF, 0x1B, 0xFB, 151 | 0xC3, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 152 | 0xE0, 0x30, 0x0F, 0x81, 0xFF, 0x1C, 0x1C, 0xC0, 0x7C, 0x01, 0xE0, 0x0F, 153 | 0x00, 0x7C, 0x03, 0x60, 0x3B, 0xC3, 0x8F, 0xF8, 0x1F, 0x00, 0xCF, 0x86, 154 | 0xFF, 0x3C, 0x3D, 0xC0, 0x6C, 0x03, 0x60, 0x0F, 0x00, 0x78, 0x06, 0xE0, 155 | 0x37, 0x83, 0xBF, 0xF9, 0x9F, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 156 | 0x0F, 0x99, 0xFE, 0xDC, 0x1E, 0xC0, 0x76, 0x01, 0xE0, 0x0F, 0x00, 0x7C, 157 | 0x03, 0x60, 0x3B, 0x83, 0xCF, 0xF6, 0x1F, 0x30, 0x01, 0x80, 0x0C, 0x00, 158 | 0x60, 0x03, 0xC7, 0xBF, 0xE7, 0x0E, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 159 | 0x00, 0x3E, 0x1F, 0xE6, 0x19, 0x00, 0x60, 0x0E, 0x00, 0x70, 0x02, 0x80, 160 | 0xF8, 0x67, 0xF8, 0x7C, 0x30, 0x30, 0x30, 0x30, 0xFF, 0xFF, 0x30, 0x30, 161 | 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3E, 0x1E, 0xC0, 0x78, 0x0F, 0x01, 162 | 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xFC, 0x3D, 0xFD, 0x9F, 163 | 0x30, 0xC0, 0x3E, 0x03, 0x60, 0x66, 0x06, 0x30, 0xC3, 0x0C, 0x19, 0x81, 164 | 0x98, 0x09, 0x00, 0xF0, 0x07, 0x00, 0x60, 0xC0, 0xC0, 0x6C, 0x1C, 0x19, 165 | 0x83, 0x83, 0x30, 0xD0, 0x43, 0x1B, 0x18, 0x62, 0x63, 0x0C, 0xC4, 0x40, 166 | 0xD8, 0xD8, 0x1A, 0x1B, 0x03, 0xC1, 0xC0, 0x38, 0x38, 0x06, 0x06, 0x00, 167 | 0xE0, 0x76, 0x0C, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0xE0, 0x0E, 0x00, 0xF0, 168 | 0x19, 0x83, 0x0C, 0x60, 0x6C, 0x07, 0xC0, 0x36, 0x03, 0x60, 0x66, 0x06, 169 | 0x30, 0x43, 0x0C, 0x18, 0xC1, 0x98, 0x0D, 0x80, 0xD0, 0x07, 0x00, 0x70, 170 | 0x06, 0x00, 0xE0, 0x7C, 0x0F, 0x80, 0x7F, 0xEF, 0xFC, 0x03, 0x00, 0xC0, 171 | 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x10, 0x04, 0x01, 0xFF, 0xFF, 0xF0, 0x01, 172 | 0x83, 0x83, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x10, 0x18, 0x78, 0x3C, 0x03, 173 | 0x00, 0x80, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x01, 0xC0, 0x30, 0xFF, 0xFF, 174 | 0xFC, 0xE0, 0x3C, 0x06, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0E, 0x03, 175 | 0xC1, 0xE1, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x0C, 0x1E, 0x1C, 0x00, 176 | 0x73, 0xFE, 0x8E }; 177 | 178 | const GFXglyph GothamBook12pt7bGlyphs[] PROGMEM = { 179 | { 0, 0, 0, 7, 0, 1 }, // 0x20 ' ' 180 | { 0, 2, 17, 7, 2, -16 }, // 0x21 '!' 181 | { 5, 7, 7, 11, 2, -16 }, // 0x22 '"' 182 | { 12, 15, 17, 17, 1, -16 }, // 0x23 '#' 183 | { 44, 13, 20, 15, 1, -17 }, // 0x24 '$' 184 | { 77, 18, 17, 20, 1, -16 }, // 0x25 '%' 185 | { 116, 15, 17, 17, 1, -16 }, // 0x26 '&' 186 | { 148, 3, 7, 6, 2, -16 }, // 0x27 ''' 187 | { 151, 7, 20, 10, 2, -16 }, // 0x28 '(' 188 | { 169, 8, 20, 10, 1, -16 }, // 0x29 ')' 189 | { 189, 7, 7, 10, 2, -16 }, // 0x2A '*' 190 | { 196, 12, 11, 15, 2, -13 }, // 0x2B '+' 191 | { 213, 3, 6, 6, 1, -2 }, // 0x2C ',' 192 | { 216, 6, 2, 10, 2, -7 }, // 0x2D '-' 193 | { 218, 2, 2, 6, 2, -1 }, // 0x2E '.' 194 | { 219, 12, 22, 12, 0, -18 }, // 0x2F '/' 195 | { 252, 15, 17, 17, 1, -16 }, // 0x30 '0' 196 | { 284, 5, 17, 9, 1, -16 }, // 0x31 '1' 197 | { 295, 12, 17, 14, 1, -16 }, // 0x32 '2' 198 | { 321, 12, 17, 15, 1, -16 }, // 0x33 '3' 199 | { 347, 14, 17, 16, 1, -16 }, // 0x34 '4' 200 | { 377, 12, 17, 15, 1, -16 }, // 0x35 '5' 201 | { 403, 13, 17, 16, 1, -16 }, // 0x36 '6' 202 | { 431, 11, 17, 14, 2, -16 }, // 0x37 '7' 203 | { 455, 13, 17, 15, 1, -16 }, // 0x38 '8' 204 | { 483, 12, 17, 16, 2, -16 }, // 0x39 '9' 205 | { 509, 2, 12, 6, 2, -11 }, // 0x3A ':' 206 | { 512, 3, 15, 6, 1, -11 }, // 0x3B ';' 207 | { 518, 11, 13, 15, 2, -14 }, // 0x3C '<' 208 | { 536, 11, 7, 15, 2, -11 }, // 0x3D '=' 209 | { 546, 12, 13, 15, 2, -14 }, // 0x3E '>' 210 | { 566, 11, 17, 13, 1, -16 }, // 0x3F '?' 211 | { 590, 21, 21, 24, 1, -16 }, // 0x40 '@' 212 | { 646, 17, 17, 19, 1, -16 }, // 0x41 'A' 213 | { 683, 14, 17, 17, 2, -16 }, // 0x42 'B' 214 | { 713, 15, 17, 18, 2, -16 }, // 0x43 'C' 215 | { 745, 15, 17, 19, 2, -16 }, // 0x44 'D' 216 | { 777, 13, 17, 16, 2, -16 }, // 0x45 'E' 217 | { 805, 12, 17, 16, 2, -16 }, // 0x46 'F' 218 | { 831, 15, 17, 19, 2, -16 }, // 0x47 'G' 219 | { 863, 14, 17, 18, 2, -16 }, // 0x48 'H' 220 | { 893, 1, 17, 7, 3, -16 }, // 0x49 'I' 221 | { 896, 10, 17, 13, 1, -16 }, // 0x4A 'J' 222 | { 918, 15, 17, 17, 2, -16 }, // 0x4B 'K' 223 | { 950, 12, 17, 15, 2, -16 }, // 0x4C 'L' 224 | { 976, 16, 17, 21, 2, -16 }, // 0x4D 'M' 225 | { 1010, 15, 17, 19, 2, -16 }, // 0x4E 'N' 226 | { 1042, 17, 17, 20, 2, -16 }, // 0x4F 'O' 227 | { 1079, 13, 17, 16, 2, -16 }, // 0x50 'P' 228 | { 1107, 17, 18, 20, 2, -16 }, // 0x51 'Q' 229 | { 1146, 14, 17, 17, 2, -16 }, // 0x52 'R' 230 | { 1176, 13, 17, 15, 1, -16 }, // 0x53 'S' 231 | { 1204, 13, 17, 16, 1, -16 }, // 0x54 'T' 232 | { 1232, 14, 17, 18, 2, -16 }, // 0x55 'U' 233 | { 1262, 16, 17, 18, 1, -16 }, // 0x56 'V' 234 | { 1296, 25, 17, 27, 1, -16 }, // 0x57 'W' 235 | { 1350, 15, 17, 17, 1, -16 }, // 0x58 'X' 236 | { 1382, 16, 17, 17, 1, -16 }, // 0x59 'Y' 237 | { 1416, 13, 17, 17, 2, -16 }, // 0x5A 'Z' 238 | { 1444, 7, 20, 11, 2, -16 }, // 0x5B '[' 239 | { 1462, 13, 22, 12, 0, -18 }, // 0x5C '\' 240 | { 1498, 7, 20, 11, 1, -16 }, // 0x5D ']' 241 | { 1516, 8, 5, 12, 2, -16 }, // 0x5E '^' 242 | { 1521, 14, 2, 14, 0, 3 }, // 0x5F '_' 243 | { 1525, 5, 4, 12, 3, -17 }, // 0x60 '`' 244 | { 1528, 11, 12, 14, 1, -11 }, // 0x61 'a' 245 | { 1545, 13, 18, 16, 2, -17 }, // 0x62 'b' 246 | { 1575, 12, 12, 14, 1, -11 }, // 0x63 'c' 247 | { 1593, 13, 18, 16, 1, -17 }, // 0x64 'd' 248 | { 1623, 12, 12, 14, 1, -11 }, // 0x65 'e' 249 | { 1641, 8, 18, 9, 1, -17 }, // 0x66 'f' 250 | { 1659, 13, 16, 16, 1, -11 }, // 0x67 'g' 251 | { 1685, 11, 18, 15, 2, -17 }, // 0x68 'h' 252 | { 1710, 2, 17, 6, 2, -16 }, // 0x69 'i' 253 | { 1715, 4, 21, 6, 0, -16 }, // 0x6A 'j' 254 | { 1726, 11, 18, 14, 2, -17 }, // 0x6B 'k' 255 | { 1751, 2, 18, 6, 2, -17 }, // 0x6C 'l' 256 | { 1756, 19, 12, 23, 2, -11 }, // 0x6D 'm' 257 | { 1785, 11, 12, 15, 2, -11 }, // 0x6E 'n' 258 | { 1802, 13, 12, 16, 1, -11 }, // 0x6F 'o' 259 | { 1822, 13, 16, 16, 2, -11 }, // 0x70 'p' 260 | { 1848, 13, 16, 16, 1, -11 }, // 0x71 'q' 261 | { 1874, 7, 12, 10, 2, -11 }, // 0x72 'r' 262 | { 1885, 10, 12, 12, 1, -11 }, // 0x73 's' 263 | { 1900, 8, 16, 10, 1, -15 }, // 0x74 't' 264 | { 1916, 11, 12, 15, 2, -11 }, // 0x75 'u' 265 | { 1933, 12, 12, 14, 1, -11 }, // 0x76 'v' 266 | { 1951, 19, 12, 21, 1, -11 }, // 0x77 'w' 267 | { 1980, 12, 12, 14, 1, -11 }, // 0x78 'x' 268 | { 1998, 12, 16, 14, 1, -11 }, // 0x79 'y' 269 | { 2022, 11, 12, 13, 1, -11 }, // 0x7A 'z' 270 | { 2039, 9, 20, 12, 1, -16 }, // 0x7B '{' 271 | { 2062, 1, 22, 7, 3, -18 }, // 0x7C '|' 272 | { 2065, 9, 20, 12, 1, -16 }, // 0x7D '}' 273 | { 2088, 8, 3, 11, 2, -8 } }; // 0x7E '~' 274 | 275 | const GFXfont GothamBook12pt7b PROGMEM = { 276 | (uint8_t *)GothamBook12pt7bBitmaps, 277 | (GFXglyph *)GothamBook12pt7bGlyphs, 278 | 0x20, 0x7E, 23 }; 279 | 280 | // Approx. 2763 bytes 281 | -------------------------------------------------------------------------------- /src/Fonts/GothamBook_5.h: -------------------------------------------------------------------------------- 1 | const uint8_t GothamBook5pt7bBitmaps[] PROGMEM = { 2 | 0xFA, 0xBB, 0x00, 0x24, 0x49, 0xF9, 0x4F, 0xC9, 0x12, 0x00, 0x27, 0xA9, 3 | 0x47, 0x16, 0xAE, 0x20, 0xC5, 0x53, 0x40, 0xE3, 0x2A, 0x63, 0x00, 0x38, 4 | 0x91, 0x23, 0xA8, 0xD9, 0x9C, 0x80, 0xE0, 0x3A, 0x49, 0x23, 0x89, 0x12, 5 | 0x94, 0x9F, 0x80, 0x21, 0x3E, 0x42, 0x00, 0x70, 0xC0, 0x80, 0x08, 0x84, 6 | 0x42, 0x21, 0x10, 0x80, 0x72, 0x28, 0xA1, 0x8A, 0x27, 0x00, 0x74, 0x92, 7 | 0x48, 0x3A, 0x42, 0x13, 0x23, 0xE0, 0xF1, 0x27, 0x19, 0x70, 0x08, 0x62, 8 | 0x8A, 0x4B, 0xF0, 0x80, 0xF4, 0x21, 0xE1, 0x4D, 0xC0, 0x74, 0xFD, 0x18, 9 | 0xC5, 0xC0, 0xF1, 0x22, 0x44, 0x80, 0x74, 0x64, 0xE8, 0xC7, 0xC0, 0x74, 10 | 0xE3, 0x3E, 0xC9, 0xC0, 0x88, 0x8C, 0x16, 0x86, 0x10, 0xF8, 0x3E, 0x83, 11 | 0x06, 0x6C, 0x00, 0x74, 0x42, 0x22, 0x00, 0x80, 0x3C, 0x42, 0xBD, 0xA5, 12 | 0xC5, 0xBF, 0x80, 0x42, 0x3C, 0x18, 0x28, 0x28, 0x24, 0x3C, 0x42, 0x83, 13 | 0xFA, 0x28, 0xBC, 0x8E, 0x1F, 0x80, 0x7B, 0x18, 0x20, 0x83, 0x17, 0x80, 14 | 0xF2, 0x38, 0x61, 0x86, 0x3F, 0x00, 0xFC, 0x21, 0xF8, 0x43, 0xE0, 0xFC, 15 | 0x21, 0xF8, 0x42, 0x00, 0x7B, 0x18, 0x27, 0x87, 0x17, 0x80, 0x86, 0x18, 16 | 0x7F, 0x86, 0x18, 0x40, 0xFE, 0x08, 0x42, 0x10, 0xC5, 0xC0, 0x8E, 0x4A, 17 | 0x38, 0x92, 0x28, 0x40, 0x84, 0x21, 0x08, 0x43, 0xE0, 0x83, 0x8F, 0x2D, 18 | 0x99, 0x30, 0x60, 0x80, 0x87, 0x1A, 0x69, 0x96, 0x38, 0x40, 0x79, 0x8A, 19 | 0x0C, 0x18, 0x38, 0x9E, 0x00, 0xF4, 0x63, 0x1F, 0x42, 0x00, 0x79, 0x8A, 20 | 0x0C, 0x18, 0xB8, 0x9E, 0x80, 0xFA, 0x28, 0xFE, 0x92, 0x28, 0xC0, 0xF4, 21 | 0xE0, 0xC1, 0xC5, 0xC0, 0xFC, 0x41, 0x04, 0x10, 0x41, 0x00, 0x86, 0x18, 22 | 0x61, 0x86, 0x27, 0x80, 0x82, 0x89, 0x11, 0x22, 0x83, 0x04, 0x00, 0x84, 23 | 0x68, 0x89, 0x29, 0x15, 0x43, 0x28, 0x63, 0x04, 0x40, 0x46, 0x48, 0xA0, 24 | 0x82, 0x88, 0xB1, 0x80, 0xC2, 0x88, 0xA0, 0x81, 0x02, 0x04, 0x00, 0xF8, 25 | 0x84, 0x44, 0x43, 0xE0, 0xF2, 0x49, 0x27, 0x84, 0x10, 0x82, 0x10, 0x41, 26 | 0x08, 0xD5, 0x57, 0x54, 0xFC, 0xC0, 0x70, 0x5F, 0x17, 0x80, 0x84, 0x3D, 27 | 0x18, 0xC7, 0xC0, 0x79, 0x89, 0x70, 0x08, 0x5F, 0x18, 0xC5, 0xE0, 0x69, 28 | 0xF9, 0x60, 0x74, 0xF4, 0x44, 0x40, 0x7C, 0x63, 0x17, 0xC7, 0xC0, 0x88, 29 | 0xF9, 0x99, 0x90, 0xBE, 0x45, 0x55, 0xC0, 0x88, 0x9A, 0xCA, 0x90, 0xFE, 30 | 0xFE, 0x91, 0x91, 0x91, 0x91, 0xF9, 0x99, 0x90, 0x74, 0x63, 0x17, 0x00, 31 | 0xF4, 0x63, 0x1F, 0x42, 0x00, 0x6C, 0xE3, 0x17, 0x84, 0x20, 0xF2, 0x48, 32 | 0x79, 0x69, 0x70, 0x44, 0xF4, 0x44, 0x70, 0x99, 0x99, 0xF0, 0x8D, 0x25, 33 | 0x0C, 0x20, 0x89, 0x59, 0x56, 0x66, 0x22, 0xC9, 0x88, 0xAC, 0x80, 0x8D, 34 | 0x24, 0x8C, 0x30, 0x86, 0x00, 0xF2, 0x48, 0xF0, 0x29, 0x28, 0x93, 0xFF, 35 | 0x80, 0x89, 0x22, 0x94, 0xBC }; 36 | 37 | const GFXglyph GothamBook5pt7bGlyphs[] PROGMEM = { 38 | { 0, 0, 0, 3, 0, 1 }, // 0x20 ' ' 39 | { 0, 1, 7, 3, 1, -6 }, // 0x21 '!' 40 | { 1, 3, 3, 4, 1, -6 }, // 0x22 '"' 41 | { 3, 7, 7, 7, 0, -6 }, // 0x23 '#' 42 | { 10, 5, 9, 6, 1, -7 }, // 0x24 '$' 43 | { 16, 7, 7, 8, 1, -6 }, // 0x25 '%' 44 | { 23, 7, 7, 7, 0, -6 }, // 0x26 '&' 45 | { 30, 1, 3, 2, 1, -6 }, // 0x27 ''' 46 | { 31, 3, 8, 4, 1, -6 }, // 0x28 '(' 47 | { 34, 3, 8, 4, 1, -6 }, // 0x29 ')' 48 | { 37, 3, 3, 4, 1, -6 }, // 0x2A '*' 49 | { 39, 5, 5, 6, 1, -5 }, // 0x2B '+' 50 | { 43, 2, 2, 2, 0, 0 }, // 0x2C ',' 51 | { 44, 2, 1, 4, 1, -3 }, // 0x2D '-' 52 | { 45, 1, 1, 2, 1, 0 }, // 0x2E '.' 53 | { 46, 5, 9, 5, 0, -7 }, // 0x2F '/' 54 | { 52, 6, 7, 7, 1, -6 }, // 0x30 '0' 55 | { 58, 3, 7, 4, 0, -6 }, // 0x31 '1' 56 | { 61, 5, 7, 6, 0, -6 }, // 0x32 '2' 57 | { 66, 4, 7, 6, 1, -6 }, // 0x33 '3' 58 | { 70, 6, 7, 7, 0, -6 }, // 0x34 '4' 59 | { 76, 5, 7, 6, 1, -6 }, // 0x35 '5' 60 | { 81, 5, 7, 6, 1, -6 }, // 0x36 '6' 61 | { 86, 4, 7, 6, 1, -6 }, // 0x37 '7' 62 | { 90, 5, 7, 6, 1, -6 }, // 0x38 '8' 63 | { 95, 5, 7, 6, 1, -6 }, // 0x39 '9' 64 | { 100, 1, 5, 3, 1, -4 }, // 0x3A ':' 65 | { 101, 1, 6, 3, 1, -4 }, // 0x3B ';' 66 | { 102, 4, 5, 6, 1, -5 }, // 0x3C '<' 67 | { 105, 5, 3, 6, 1, -4 }, // 0x3D '=' 68 | { 107, 5, 5, 6, 1, -5 }, // 0x3E '>' 69 | { 111, 5, 7, 5, 0, -6 }, // 0x3F '?' 70 | { 116, 8, 9, 10, 1, -6 }, // 0x40 '@' 71 | { 125, 8, 7, 8, 0, -6 }, // 0x41 'A' 72 | { 132, 6, 7, 7, 1, -6 }, // 0x42 'B' 73 | { 138, 6, 7, 7, 1, -6 }, // 0x43 'C' 74 | { 144, 6, 7, 8, 1, -6 }, // 0x44 'D' 75 | { 150, 5, 7, 7, 1, -6 }, // 0x45 'E' 76 | { 155, 5, 7, 7, 1, -6 }, // 0x46 'F' 77 | { 160, 6, 7, 8, 1, -6 }, // 0x47 'G' 78 | { 166, 6, 7, 8, 1, -6 }, // 0x48 'H' 79 | { 172, 1, 7, 3, 1, -6 }, // 0x49 'I' 80 | { 173, 5, 7, 6, 0, -6 }, // 0x4A 'J' 81 | { 178, 6, 7, 7, 1, -6 }, // 0x4B 'K' 82 | { 184, 5, 7, 6, 1, -6 }, // 0x4C 'L' 83 | { 189, 7, 7, 9, 1, -6 }, // 0x4D 'M' 84 | { 196, 6, 7, 8, 1, -6 }, // 0x4E 'N' 85 | { 202, 7, 7, 9, 1, -6 }, // 0x4F 'O' 86 | { 209, 5, 7, 7, 1, -6 }, // 0x50 'P' 87 | { 214, 7, 7, 9, 1, -6 }, // 0x51 'Q' 88 | { 221, 6, 7, 7, 1, -6 }, // 0x52 'R' 89 | { 227, 5, 7, 6, 1, -6 }, // 0x53 'S' 90 | { 232, 6, 7, 6, 0, -6 }, // 0x54 'T' 91 | { 238, 6, 7, 8, 1, -6 }, // 0x55 'U' 92 | { 244, 7, 7, 8, 0, -6 }, // 0x56 'V' 93 | { 251, 11, 7, 11, 0, -6 }, // 0x57 'W' 94 | { 261, 7, 7, 7, 0, -6 }, // 0x58 'X' 95 | { 268, 7, 7, 7, 0, -6 }, // 0x59 'Y' 96 | { 275, 5, 7, 7, 1, -6 }, // 0x5A 'Z' 97 | { 280, 3, 8, 4, 1, -6 }, // 0x5B '[' 98 | { 283, 5, 9, 5, 0, -7 }, // 0x5C '\' 99 | { 289, 2, 8, 4, 1, -6 }, // 0x5D ']' 100 | { 291, 3, 2, 5, 1, -6 }, // 0x5E '^' 101 | { 292, 6, 1, 6, 0, 2 }, // 0x5F '_' 102 | { 293, 2, 1, 5, 1, -6 }, // 0x60 '`' 103 | { 294, 5, 5, 6, 0, -4 }, // 0x61 'a' 104 | { 298, 5, 7, 7, 1, -6 }, // 0x62 'b' 105 | { 303, 4, 5, 6, 1, -4 }, // 0x63 'c' 106 | { 306, 5, 7, 7, 1, -6 }, // 0x64 'd' 107 | { 311, 4, 5, 6, 1, -4 }, // 0x65 'e' 108 | { 314, 4, 7, 4, 0, -6 }, // 0x66 'f' 109 | { 318, 5, 7, 7, 1, -4 }, // 0x67 'g' 110 | { 323, 4, 7, 6, 1, -6 }, // 0x68 'h' 111 | { 327, 1, 7, 3, 1, -6 }, // 0x69 'i' 112 | { 328, 2, 9, 3, 0, -6 }, // 0x6A 'j' 113 | { 331, 4, 7, 6, 1, -6 }, // 0x6B 'k' 114 | { 335, 1, 7, 3, 1, -6 }, // 0x6C 'l' 115 | { 336, 8, 5, 10, 1, -4 }, // 0x6D 'm' 116 | { 341, 4, 5, 6, 1, -4 }, // 0x6E 'n' 117 | { 344, 5, 5, 6, 1, -4 }, // 0x6F 'o' 118 | { 348, 5, 7, 7, 1, -4 }, // 0x70 'p' 119 | { 353, 5, 7, 7, 1, -4 }, // 0x71 'q' 120 | { 358, 3, 5, 4, 1, -4 }, // 0x72 'r' 121 | { 360, 4, 5, 5, 0, -4 }, // 0x73 's' 122 | { 363, 4, 7, 4, 0, -6 }, // 0x74 't' 123 | { 367, 4, 5, 6, 1, -4 }, // 0x75 'u' 124 | { 370, 6, 5, 6, 0, -4 }, // 0x76 'v' 125 | { 374, 8, 5, 9, 0, -4 }, // 0x77 'w' 126 | { 379, 5, 5, 6, 0, -4 }, // 0x78 'x' 127 | { 383, 6, 7, 6, 0, -4 }, // 0x79 'y' 128 | { 389, 4, 5, 6, 1, -4 }, // 0x7A 'z' 129 | { 392, 3, 8, 5, 1, -6 }, // 0x7B '{' 130 | { 395, 1, 9, 3, 1, -7 }, // 0x7C '|' 131 | { 397, 3, 8, 5, 1, -6 }, // 0x7D '}' 132 | { 400, 3, 2, 5, 1, -3 } }; // 0x7E '~' 133 | 134 | const GFXfont GothamBook5pt7b PROGMEM = { 135 | (uint8_t *)GothamBook5pt7bBitmaps, 136 | (GFXglyph *)GothamBook5pt7bGlyphs, 137 | 0x20, 0x7E, 10 }; 138 | 139 | // Approx. 1073 bytes 140 | -------------------------------------------------------------------------------- /src/Fonts/GothamBook_7.h: -------------------------------------------------------------------------------- 1 | const uint8_t GothamBook7pt7bBitmaps[] PROGMEM = { 2 | 0xEA, 0xA8, 0x30, 0xD9, 0x9A, 0x22, 0x22, 0x22, 0xFF, 0x24, 0x24, 0x44, 3 | 0xFF, 0x44, 0x48, 0x10, 0xFB, 0x5C, 0x8D, 0x0E, 0x07, 0x09, 0x13, 0xAD, 4 | 0xF0, 0x80, 0x60, 0xA4, 0x49, 0x22, 0x50, 0x64, 0x02, 0xE1, 0x24, 0x51, 5 | 0x22, 0x50, 0xE0, 0x38, 0x44, 0x44, 0x4C, 0x30, 0xD1, 0x8A, 0x86, 0x8E, 6 | 0x79, 0xEA, 0x12, 0x4C, 0x88, 0x88, 0xC4, 0x21, 0x84, 0x23, 0x11, 0x11, 7 | 0x32, 0x48, 0x4F, 0xF4, 0x10, 0x20, 0x47, 0xF1, 0x02, 0x00, 0xE0, 0xF0, 8 | 0x80, 0x02, 0x08, 0x10, 0x40, 0x82, 0x04, 0x10, 0x20, 0x81, 0x04, 0x08, 9 | 0x00, 0x3C, 0x42, 0xC3, 0x81, 0x81, 0x81, 0x81, 0xC3, 0x62, 0x3C, 0x7B, 10 | 0x33, 0x33, 0x33, 0x33, 0x79, 0x8A, 0x10, 0x20, 0x41, 0x04, 0x10, 0xC1, 11 | 0xFC, 0xFC, 0x08, 0x20, 0x83, 0x80, 0x81, 0x83, 0xC4, 0xF0, 0x04, 0x0C, 12 | 0x1C, 0x34, 0x24, 0x44, 0x84, 0xFF, 0x04, 0x04, 0x7C, 0x81, 0x04, 0x0F, 13 | 0x90, 0x80, 0x81, 0xC4, 0xF0, 0x3C, 0x87, 0x04, 0x0B, 0xD8, 0xE0, 0xC1, 14 | 0x46, 0x78, 0xFE, 0x08, 0x10, 0x40, 0x82, 0x04, 0x10, 0x20, 0x80, 0x79, 15 | 0x8E, 0x0E, 0x23, 0x98, 0xE0, 0xC1, 0xC6, 0xF8, 0x79, 0x8A, 0x0C, 0x1C, 16 | 0x6F, 0x40, 0x83, 0x84, 0xF0, 0x82, 0x83, 0x80, 0x02, 0x18, 0xC6, 0x0C, 17 | 0x06, 0x03, 0x01, 0xFE, 0x00, 0x07, 0xF0, 0x80, 0xC0, 0x60, 0x30, 0x63, 18 | 0x18, 0x40, 0x3C, 0x8E, 0x08, 0x10, 0x43, 0x04, 0x00, 0x00, 0x20, 0x0F, 19 | 0x03, 0x0C, 0x40, 0x28, 0xE9, 0x91, 0x99, 0x09, 0x91, 0x19, 0x11, 0x8E, 20 | 0xE8, 0x00, 0x40, 0x02, 0x04, 0x1F, 0x80, 0x08, 0x05, 0x01, 0x40, 0x88, 21 | 0x22, 0x08, 0x47, 0xF1, 0x04, 0x80, 0xA0, 0x30, 0xFE, 0x82, 0x81, 0x81, 22 | 0x82, 0xFE, 0x81, 0x81, 0x81, 0xFE, 0x1E, 0x30, 0xD0, 0x10, 0x08, 0x04, 23 | 0x02, 0x00, 0x80, 0x61, 0x8F, 0x00, 0xFC, 0x41, 0xA0, 0x50, 0x18, 0x0C, 24 | 0x06, 0x03, 0x02, 0x83, 0x7E, 0x00, 0xFE, 0x80, 0x80, 0x80, 0x80, 0xFE, 25 | 0x80, 0x80, 0x80, 0xFF, 0xFF, 0x02, 0x04, 0x08, 0x1F, 0xE0, 0x40, 0x81, 26 | 0x00, 0x1E, 0x30, 0xD0, 0x10, 0x08, 0x04, 0x3E, 0x02, 0x81, 0x61, 0x8F, 27 | 0x00, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0xFF, 28 | 0xFF, 0xF0, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x82, 0xC4, 0x70, 0x81, 29 | 0xC1, 0x21, 0x11, 0x09, 0x05, 0x43, 0x11, 0x0C, 0x83, 0x40, 0xC0, 0x81, 30 | 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0xFC, 0xC0, 0xF0, 0x3A, 0x16, 31 | 0x4D, 0x92, 0x63, 0x18, 0x46, 0x01, 0x80, 0x60, 0x10, 0xC0, 0xF0, 0x68, 32 | 0x32, 0x18, 0x8C, 0x66, 0x13, 0x05, 0x81, 0xC0, 0xC0, 0x1E, 0x18, 0x64, 33 | 0x0A, 0x01, 0x80, 0x60, 0x18, 0x05, 0x02, 0x61, 0x87, 0x80, 0xFC, 0x82, 34 | 0x83, 0x81, 0x83, 0x82, 0xFC, 0x80, 0x80, 0x80, 0x1E, 0x18, 0x64, 0x0A, 35 | 0x01, 0x80, 0x60, 0x18, 0x25, 0x1E, 0x61, 0x87, 0x90, 0xFE, 0x83, 0x81, 36 | 0x81, 0x83, 0xFC, 0x84, 0x86, 0x82, 0x81, 0x7D, 0x8E, 0x06, 0x07, 0x03, 37 | 0x80, 0x81, 0xC6, 0xF8, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 38 | 0x20, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x41, 0x63, 0x3C, 0x80, 39 | 0xC0, 0x90, 0x48, 0x46, 0x21, 0x10, 0x90, 0x28, 0x18, 0x04, 0x00, 0x82, 40 | 0x06, 0x0C, 0x2C, 0x30, 0x91, 0x42, 0x44, 0x90, 0x92, 0x42, 0x89, 0x0A, 41 | 0x18, 0x18, 0x60, 0x41, 0x80, 0x81, 0x21, 0x09, 0x86, 0x81, 0x80, 0xC0, 42 | 0x90, 0xCC, 0x42, 0x40, 0xC0, 0xC0, 0xD8, 0x62, 0x10, 0x48, 0x1E, 0x03, 43 | 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xFF, 0x02, 0x04, 0x0C, 0x08, 0x10, 44 | 0x20, 0x60, 0x40, 0xFF, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x8F, 0x80, 0x81, 45 | 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0xF1, 0x11, 46 | 0x11, 0x11, 0x11, 0x1F, 0x22, 0xA2, 0xFF, 0x90, 0x7A, 0x17, 0xE1, 0x86, 47 | 0x37, 0x40, 0x80, 0x80, 0x80, 0xBC, 0xC6, 0x82, 0x83, 0x82, 0xC6, 0xBC, 48 | 0x3B, 0x18, 0x20, 0x83, 0x13, 0x80, 0x02, 0x04, 0x0B, 0xDC, 0x70, 0x60, 49 | 0xC1, 0xC6, 0xF4, 0x79, 0x8A, 0x17, 0xF8, 0x18, 0x9E, 0x00, 0x74, 0x4F, 50 | 0x44, 0x44, 0x44, 0x7B, 0x8E, 0x0C, 0x1C, 0x6F, 0x40, 0xC3, 0x7C, 0x81, 51 | 0x02, 0x05, 0xCC, 0x50, 0xE1, 0xC3, 0x87, 0x0C, 0x9F, 0xC0, 0x41, 0x55, 52 | 0x57, 0x81, 0x02, 0x04, 0x38, 0x92, 0x2C, 0x6C, 0x89, 0x0C, 0xFF, 0xC0, 53 | 0xB9, 0xD8, 0xC6, 0x10, 0xC2, 0x18, 0x43, 0x08, 0x61, 0x08, 0xB9, 0x8A, 54 | 0x1C, 0x38, 0x70, 0xE1, 0x80, 0x39, 0x8E, 0x0C, 0x18, 0x38, 0xCE, 0x00, 55 | 0xBC, 0xC6, 0x82, 0x83, 0x82, 0xC6, 0xBC, 0x80, 0x80, 0x7B, 0x8E, 0x0C, 56 | 0x18, 0x38, 0xDE, 0x81, 0x02, 0xBC, 0xC8, 0x88, 0x80, 0x74, 0x60, 0xE0, 57 | 0xC5, 0xC0, 0x44, 0xF4, 0x44, 0x44, 0x70, 0x86, 0x18, 0x61, 0x87, 0x17, 58 | 0xC0, 0xC3, 0x42, 0x26, 0x24, 0x14, 0x18, 0x18, 0x8C, 0x63, 0x1C, 0xCD, 59 | 0x4A, 0x52, 0x8C, 0xC2, 0x10, 0x85, 0x23, 0x0C, 0x39, 0x28, 0x40, 0xC3, 60 | 0x42, 0x22, 0x24, 0x14, 0x18, 0x08, 0x18, 0x70, 0xFC, 0x21, 0x08, 0x61, 61 | 0x0F, 0xC0, 0x19, 0x08, 0x42, 0x61, 0x84, 0x21, 0x08, 0x30, 0xFF, 0xF8, 62 | 0xC1, 0x08, 0x42, 0x0C, 0x84, 0x21, 0x19, 0x80, 0xCD, 0x80 }; 63 | 64 | const GFXglyph GothamBook7pt7bGlyphs[] PROGMEM = { 65 | { 0, 0, 0, 4, 0, 1 }, // 0x20 ' ' 66 | { 0, 2, 10, 4, 1, -9 }, // 0x21 '!' 67 | { 3, 4, 4, 6, 1, -9 }, // 0x22 '"' 68 | { 5, 8, 10, 10, 1, -9 }, // 0x23 '#' 69 | { 15, 7, 12, 9, 1, -10 }, // 0x24 '$' 70 | { 26, 10, 10, 12, 1, -9 }, // 0x25 '%' 71 | { 39, 8, 10, 10, 1, -9 }, // 0x26 '&' 72 | { 49, 2, 4, 3, 1, -9 }, // 0x27 ''' 73 | { 50, 4, 12, 6, 1, -9 }, // 0x28 '(' 74 | { 56, 4, 12, 6, 1, -9 }, // 0x29 ')' 75 | { 62, 4, 4, 6, 1, -9 }, // 0x2A '*' 76 | { 64, 7, 6, 9, 1, -7 }, // 0x2B '+' 77 | { 70, 1, 3, 3, 1, 0 }, // 0x2C ',' 78 | { 71, 4, 1, 6, 1, -4 }, // 0x2D '-' 79 | { 72, 1, 1, 3, 1, 0 }, // 0x2E '.' 80 | { 73, 7, 13, 7, 0, -10 }, // 0x2F '/' 81 | { 85, 8, 10, 10, 1, -9 }, // 0x30 '0' 82 | { 95, 4, 10, 5, 0, -9 }, // 0x31 '1' 83 | { 100, 7, 10, 8, 1, -9 }, // 0x32 '2' 84 | { 109, 7, 10, 9, 1, -9 }, // 0x33 '3' 85 | { 118, 8, 10, 9, 1, -9 }, // 0x34 '4' 86 | { 128, 7, 10, 9, 1, -9 }, // 0x35 '5' 87 | { 137, 7, 10, 9, 1, -9 }, // 0x36 '6' 88 | { 146, 7, 10, 8, 1, -9 }, // 0x37 '7' 89 | { 155, 7, 10, 9, 1, -9 }, // 0x38 '8' 90 | { 164, 7, 10, 9, 1, -9 }, // 0x39 '9' 91 | { 173, 1, 7, 4, 1, -6 }, // 0x3A ':' 92 | { 174, 1, 9, 4, 1, -6 }, // 0x3B ';' 93 | { 176, 7, 8, 9, 1, -8 }, // 0x3C '<' 94 | { 183, 7, 4, 9, 1, -6 }, // 0x3D '=' 95 | { 187, 7, 8, 9, 1, -8 }, // 0x3E '>' 96 | { 194, 7, 10, 8, 0, -9 }, // 0x3F '?' 97 | { 203, 12, 13, 14, 1, -9 }, // 0x40 '@' 98 | { 223, 10, 10, 11, 1, -9 }, // 0x41 'A' 99 | { 236, 8, 10, 10, 1, -9 }, // 0x42 'B' 100 | { 246, 9, 10, 10, 1, -9 }, // 0x43 'C' 101 | { 258, 9, 10, 11, 1, -9 }, // 0x44 'D' 102 | { 270, 8, 10, 9, 1, -9 }, // 0x45 'E' 103 | { 280, 7, 10, 9, 1, -9 }, // 0x46 'F' 104 | { 289, 9, 10, 11, 1, -9 }, // 0x47 'G' 105 | { 301, 8, 10, 11, 1, -9 }, // 0x48 'H' 106 | { 311, 2, 10, 4, 1, -9 }, // 0x49 'I' 107 | { 314, 7, 10, 8, 0, -9 }, // 0x4A 'J' 108 | { 323, 9, 10, 10, 1, -9 }, // 0x4B 'K' 109 | { 335, 7, 10, 9, 1, -9 }, // 0x4C 'L' 110 | { 344, 10, 10, 12, 1, -9 }, // 0x4D 'M' 111 | { 357, 9, 10, 11, 1, -9 }, // 0x4E 'N' 112 | { 369, 10, 10, 12, 1, -9 }, // 0x4F 'O' 113 | { 382, 8, 10, 9, 1, -9 }, // 0x50 'P' 114 | { 392, 10, 10, 12, 1, -9 }, // 0x51 'Q' 115 | { 405, 8, 10, 10, 1, -9 }, // 0x52 'R' 116 | { 415, 7, 10, 9, 1, -9 }, // 0x53 'S' 117 | { 424, 7, 10, 9, 1, -9 }, // 0x54 'T' 118 | { 433, 8, 10, 11, 1, -9 }, // 0x55 'U' 119 | { 443, 9, 10, 11, 1, -9 }, // 0x56 'V' 120 | { 455, 14, 10, 16, 1, -9 }, // 0x57 'W' 121 | { 473, 9, 10, 10, 1, -9 }, // 0x58 'X' 122 | { 485, 10, 10, 10, 0, -9 }, // 0x59 'Y' 123 | { 498, 8, 10, 10, 1, -9 }, // 0x5A 'Z' 124 | { 508, 4, 12, 6, 1, -9 }, // 0x5B '[' 125 | { 514, 7, 13, 7, 0, -10 }, // 0x5C '\' 126 | { 526, 4, 12, 6, 1, -9 }, // 0x5D ']' 127 | { 532, 5, 3, 7, 1, -9 }, // 0x5E '^' 128 | { 534, 8, 1, 8, 0, 2 }, // 0x5F '_' 129 | { 535, 2, 2, 7, 2, -9 }, // 0x60 '`' 130 | { 536, 6, 7, 8, 1, -6 }, // 0x61 'a' 131 | { 542, 8, 10, 9, 1, -9 }, // 0x62 'b' 132 | { 552, 6, 7, 8, 1, -6 }, // 0x63 'c' 133 | { 558, 7, 10, 9, 1, -9 }, // 0x64 'd' 134 | { 567, 7, 7, 8, 1, -6 }, // 0x65 'e' 135 | { 574, 4, 10, 5, 1, -9 }, // 0x66 'f' 136 | { 579, 7, 9, 9, 1, -6 }, // 0x67 'g' 137 | { 587, 7, 10, 9, 1, -9 }, // 0x68 'h' 138 | { 596, 1, 10, 4, 1, -9 }, // 0x69 'i' 139 | { 598, 2, 12, 4, 0, -9 }, // 0x6A 'j' 140 | { 601, 7, 10, 8, 1, -9 }, // 0x6B 'k' 141 | { 610, 1, 10, 4, 1, -9 }, // 0x6C 'l' 142 | { 612, 11, 7, 13, 1, -6 }, // 0x6D 'm' 143 | { 622, 7, 7, 9, 1, -6 }, // 0x6E 'n' 144 | { 629, 7, 7, 9, 1, -6 }, // 0x6F 'o' 145 | { 636, 8, 9, 9, 1, -6 }, // 0x70 'p' 146 | { 645, 7, 9, 9, 1, -6 }, // 0x71 'q' 147 | { 653, 4, 7, 6, 1, -6 }, // 0x72 'r' 148 | { 657, 5, 7, 7, 1, -6 }, // 0x73 's' 149 | { 662, 4, 9, 6, 1, -8 }, // 0x74 't' 150 | { 667, 6, 7, 9, 1, -6 }, // 0x75 'u' 151 | { 673, 8, 7, 8, 0, -6 }, // 0x76 'v' 152 | { 680, 10, 7, 12, 1, -6 }, // 0x77 'w' 153 | { 689, 6, 7, 8, 1, -6 }, // 0x78 'x' 154 | { 695, 8, 9, 8, 0, -6 }, // 0x79 'y' 155 | { 704, 6, 7, 8, 1, -6 }, // 0x7A 'z' 156 | { 710, 5, 12, 7, 1, -9 }, // 0x7B '{' 157 | { 718, 1, 13, 4, 2, -10 }, // 0x7C '|' 158 | { 720, 5, 12, 7, 1, -9 }, // 0x7D '}' 159 | { 728, 5, 2, 7, 1, -4 } }; // 0x7E '~' 160 | 161 | const GFXfont GothamBook7pt7b PROGMEM = { 162 | (uint8_t *)GothamBook7pt7bBitmaps, 163 | (GFXglyph *)GothamBook7pt7bGlyphs, 164 | 0x20, 0x7E, 13 }; 165 | 166 | // Approx. 1402 bytes 167 | -------------------------------------------------------------------------------- /src/Fonts/GothamBook_9.h: -------------------------------------------------------------------------------- 1 | const uint8_t GothamBook9pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0x88, 0x4D, 0x2C, 0xA2, 0x88, 0x18, 0x82, 0x10, 0x42, 0x08, 0x47, 3 | 0xFE, 0x23, 0x0C, 0x41, 0x88, 0x21, 0x1F, 0xF8, 0x8C, 0x31, 0x06, 0x20, 4 | 0x08, 0x1F, 0x1A, 0xE9, 0x2C, 0x83, 0x41, 0xE0, 0x7C, 0x0F, 0x84, 0xC2, 5 | 0x31, 0x1E, 0x99, 0xF0, 0x20, 0x10, 0x70, 0x36, 0x43, 0x23, 0x11, 0x19, 6 | 0x08, 0xD8, 0x64, 0x81, 0xC8, 0x00, 0x8E, 0x0C, 0x98, 0x4C, 0x44, 0x62, 7 | 0x61, 0x36, 0x07, 0x00, 0x1E, 0x04, 0x60, 0x84, 0x10, 0x83, 0x20, 0x38, 8 | 0x1E, 0x16, 0x63, 0xC6, 0xD0, 0x72, 0x06, 0x61, 0x63, 0xC6, 0x5E, 0x80, 9 | 0x0C, 0x63, 0x18, 0x41, 0x0C, 0x30, 0xC3, 0x04, 0x10, 0x60, 0xC1, 0x83, 10 | 0x81, 0x83, 0x04, 0x18, 0x20, 0x83, 0x0C, 0x20, 0x86, 0x10, 0xC6, 0x20, 11 | 0x22, 0xA7, 0x5C, 0xAC, 0x80, 0x08, 0x04, 0x02, 0x01, 0x0F, 0xF8, 0x40, 12 | 0x20, 0x10, 0x08, 0x00, 0xF6, 0xF8, 0xC0, 0x00, 0x80, 0x80, 0x40, 0x40, 13 | 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x0C, 0x04, 0x06, 0x02, 0x03, 0x01, 14 | 0x00, 0x1F, 0x06, 0x31, 0x83, 0x20, 0x2C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 15 | 0xC0, 0x68, 0x09, 0x83, 0x18, 0xC1, 0xF0, 0x7F, 0x33, 0x33, 0x33, 0x33, 16 | 0x33, 0x30, 0x3E, 0x31, 0xB0, 0x40, 0x30, 0x10, 0x18, 0x0C, 0x0C, 0x0C, 17 | 0x1C, 0x1C, 0x1C, 0x0F, 0xF8, 0x7F, 0x81, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 18 | 0x78, 0x06, 0x01, 0x80, 0xE0, 0x7C, 0x63, 0xE0, 0x01, 0x00, 0xC0, 0x70, 19 | 0x34, 0x19, 0x04, 0x43, 0x11, 0x84, 0xC1, 0x3F, 0xF0, 0x10, 0x04, 0x01, 20 | 0x00, 0x7F, 0x20, 0x10, 0x08, 0x04, 0x03, 0xF1, 0x0C, 0x03, 0x01, 0x80, 21 | 0xE0, 0x7C, 0x63, 0xE0, 0x1F, 0x0C, 0x66, 0x01, 0x00, 0xC0, 0x37, 0x8E, 22 | 0x1B, 0x02, 0xC0, 0xF0, 0x24, 0x09, 0x86, 0x1E, 0x00, 0xFF, 0x80, 0xC0, 23 | 0xC0, 0x60, 0x60, 0x30, 0x10, 0x18, 0x08, 0x0C, 0x04, 0x06, 0x06, 0x00, 24 | 0x3E, 0x31, 0x90, 0x78, 0x14, 0x1B, 0x18, 0xF8, 0xC3, 0xC0, 0xC0, 0x70, 25 | 0x2C, 0x33, 0xE0, 0x3E, 0x18, 0xCC, 0x1B, 0x02, 0xC0, 0xB0, 0x76, 0x3C, 26 | 0xFA, 0x00, 0x80, 0x20, 0x19, 0x0C, 0xBC, 0x00, 0xC0, 0x00, 0xC0, 0xC0, 27 | 0x03, 0xD8, 0x00, 0x81, 0x87, 0x0E, 0x0C, 0x03, 0x80, 0x70, 0x06, 0x00, 28 | 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xE0, 0x38, 0x06, 0x01, 0x06, 29 | 0x38, 0xE0, 0x80, 0x7C, 0xC6, 0x83, 0x03, 0x03, 0x06, 0x1C, 0x10, 0x10, 30 | 0x00, 0x00, 0x00, 0x10, 0x07, 0xE0, 0x18, 0x18, 0x20, 0x0C, 0x40, 0x04, 31 | 0x43, 0xD2, 0x84, 0x72, 0x88, 0x21, 0x88, 0x21, 0x88, 0x21, 0x88, 0x62, 32 | 0x8C, 0x62, 0x47, 0x9C, 0x40, 0x00, 0x20, 0x00, 0x18, 0x18, 0x07, 0xE0, 33 | 0x06, 0x00, 0x30, 0x03, 0xC0, 0x1A, 0x01, 0x98, 0x0C, 0xC0, 0x43, 0x06, 34 | 0x18, 0x20, 0x63, 0xFF, 0x10, 0x09, 0x80, 0x68, 0x01, 0x80, 0xFF, 0x20, 35 | 0x68, 0x0A, 0x02, 0x80, 0xA0, 0x4F, 0xF2, 0x06, 0x80, 0xE0, 0x18, 0x0E, 36 | 0x06, 0xFF, 0x00, 0x0F, 0xC3, 0x06, 0x20, 0x34, 0x00, 0x40, 0x0C, 0x00, 37 | 0xC0, 0x0C, 0x00, 0xC0, 0x04, 0x00, 0x60, 0x23, 0x87, 0x0F, 0xC0, 0xFE, 38 | 0x10, 0x72, 0x03, 0x40, 0x28, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 39 | 0x0A, 0x03, 0x40, 0xCF, 0xE0, 0xFF, 0xC0, 0x20, 0x10, 0x08, 0x04, 0x03, 40 | 0xFD, 0x00, 0x80, 0x40, 0x20, 0x10, 0x0F, 0xF8, 0xFF, 0xC0, 0x20, 0x10, 41 | 0x08, 0x04, 0x03, 0xFD, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, 0x0F, 42 | 0xC3, 0x06, 0x20, 0x04, 0x00, 0x40, 0x0C, 0x00, 0xC3, 0xFC, 0x03, 0xC0, 43 | 0x34, 0x03, 0x60, 0x33, 0x06, 0x0F, 0x80, 0x80, 0xE0, 0x38, 0x0E, 0x03, 44 | 0x80, 0xE0, 0x3F, 0xFE, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xC0, 45 | 0xFF, 0xF8, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x06, 0x0E, 46 | 0x37, 0x80, 0x80, 0xD0, 0x32, 0x0C, 0x43, 0x08, 0xC1, 0x30, 0x2F, 0x07, 47 | 0x60, 0xC6, 0x10, 0x62, 0x06, 0x40, 0x48, 0x0E, 0x80, 0x80, 0x80, 0x80, 48 | 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xC0, 0x3C, 0x07, 49 | 0xE0, 0x7A, 0x0F, 0x91, 0xB9, 0x93, 0x8B, 0x38, 0xE3, 0x84, 0x38, 0x03, 50 | 0x80, 0x38, 0x03, 0x80, 0x30, 0x80, 0x70, 0x1E, 0x06, 0xC1, 0x98, 0x62, 51 | 0x18, 0xC6, 0x19, 0x83, 0x60, 0x58, 0x1E, 0x03, 0x80, 0x40, 0x0F, 0x81, 52 | 0x83, 0x08, 0x0C, 0x80, 0x24, 0x01, 0xE0, 0x07, 0x00, 0x38, 0x01, 0x40, 53 | 0x1A, 0x00, 0x88, 0x0C, 0x70, 0xC0, 0xF8, 0x00, 0xFE, 0x41, 0xA0, 0x70, 54 | 0x18, 0x0C, 0x0E, 0x0D, 0xFC, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, 0x0F, 55 | 0x81, 0x83, 0x08, 0x0C, 0x80, 0x24, 0x01, 0xE0, 0x07, 0x00, 0x38, 0x01, 56 | 0x40, 0x9A, 0x0E, 0x88, 0x1C, 0x70, 0xF0, 0xF8, 0x80, 0xFF, 0x20, 0x68, 57 | 0x0E, 0x03, 0x80, 0xE0, 0x28, 0x1B, 0xF8, 0x86, 0x20, 0xC8, 0x12, 0x06, 58 | 0x80, 0xC0, 0x3F, 0x30, 0xD0, 0x18, 0x04, 0x03, 0xC0, 0xFC, 0x0F, 0x00, 59 | 0x80, 0x60, 0x3C, 0x33, 0xE0, 0xFF, 0xC3, 0x00, 0xC0, 0x30, 0x0C, 0x03, 60 | 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x00, 0x80, 0x60, 61 | 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x3C, 0x09, 62 | 0x86, 0x3E, 0x00, 0x80, 0x3C, 0x02, 0x40, 0x66, 0x04, 0x20, 0xC2, 0x0C, 63 | 0x30, 0x81, 0x18, 0x19, 0x00, 0xB0, 0x0E, 0x00, 0xE0, 0x06, 0x00, 0xC0, 64 | 0xC0, 0xF0, 0x30, 0x34, 0x0C, 0x09, 0x87, 0x86, 0x61, 0x21, 0x88, 0x48, 65 | 0x43, 0x33, 0x30, 0xC8, 0x4C, 0x12, 0x12, 0x07, 0x87, 0x81, 0xC0, 0xE0, 66 | 0x30, 0x30, 0x0C, 0x0C, 0x00, 0xC0, 0x6C, 0x18, 0xC2, 0x08, 0x81, 0xB0, 67 | 0x1C, 0x01, 0x00, 0x50, 0x1B, 0x06, 0x30, 0x82, 0x30, 0x6C, 0x06, 0xE0, 68 | 0x36, 0x02, 0x30, 0x61, 0x8C, 0x18, 0x80, 0xD8, 0x07, 0x00, 0x60, 0x02, 69 | 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0xFF, 0xC0, 0x30, 0x18, 0x04, 70 | 0x03, 0x01, 0x80, 0xC0, 0x20, 0x18, 0x0C, 0x06, 0x01, 0x00, 0xFF, 0xC0, 71 | 0xFC, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, 0x43, 0xE0, 0x80, 0x10, 72 | 0x04, 0x00, 0x80, 0x30, 0x04, 0x01, 0x80, 0x20, 0x0C, 0x01, 0x00, 0x60, 73 | 0x08, 0x03, 0x00, 0x40, 0x18, 0x03, 0xF8, 0x42, 0x10, 0x84, 0x21, 0x08, 74 | 0x42, 0x10, 0x87, 0xE0, 0x10, 0x51, 0x16, 0x30, 0xFF, 0xE0, 0x8C, 0x7C, 75 | 0x83, 0x01, 0x7F, 0xC1, 0x81, 0x83, 0xC7, 0x79, 0x80, 0x40, 0x20, 0x10, 76 | 0x0B, 0xE7, 0x1A, 0x07, 0x03, 0x80, 0xC0, 0xE0, 0x7C, 0x6B, 0xE0, 0x1E, 77 | 0x31, 0xB0, 0x18, 0x08, 0x06, 0x03, 0x00, 0xC3, 0x1E, 0x00, 0x00, 0x80, 78 | 0x40, 0x20, 0x13, 0xEB, 0x1F, 0x07, 0x81, 0x80, 0xE0, 0x70, 0x6C, 0x73, 79 | 0xC8, 0x3E, 0x31, 0xB0, 0x50, 0x3F, 0xFC, 0x03, 0x00, 0xC2, 0x3E, 0x00, 80 | 0x3B, 0x10, 0x8F, 0xA1, 0x08, 0x42, 0x10, 0x84, 0x00, 0x3E, 0xB0, 0xF0, 81 | 0x30, 0x18, 0x0E, 0x05, 0x86, 0x7D, 0x00, 0x80, 0xD0, 0x57, 0xC0, 0x80, 82 | 0x80, 0x80, 0x80, 0xBC, 0xC6, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 83 | 0x8F, 0xF8, 0x20, 0x02, 0x49, 0x24, 0x92, 0x5E, 0x80, 0x80, 0x80, 0x80, 84 | 0x87, 0x8C, 0x98, 0xB0, 0xF0, 0xD8, 0x8C, 0x86, 0x83, 0xFF, 0xF8, 0xBC, 85 | 0xF3, 0x1C, 0x68, 0x30, 0xE0, 0x83, 0x82, 0x0E, 0x08, 0x38, 0x20, 0xE0, 86 | 0x83, 0x82, 0x0C, 0xBC, 0xC6, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 87 | 0x1E, 0x18, 0x4C, 0x0B, 0x03, 0x80, 0xF0, 0x3C, 0x09, 0x84, 0x1E, 0x00, 88 | 0x9E, 0x71, 0xA0, 0x70, 0x38, 0x0C, 0x0E, 0x07, 0xC6, 0xBE, 0x40, 0x20, 89 | 0x10, 0x00, 0x3C, 0xB1, 0xF0, 0x78, 0x18, 0x0E, 0x07, 0x06, 0xC7, 0x3E, 90 | 0x80, 0x40, 0x20, 0x10, 0x9D, 0x31, 0x08, 0x42, 0x10, 0x80, 0x7D, 0x8F, 91 | 0x07, 0x03, 0xC0, 0xC0, 0xE3, 0x7C, 0x42, 0x11, 0xF4, 0x21, 0x08, 0x42, 92 | 0x1A, 0x70, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0D, 0x06, 0xC7, 0x3D, 93 | 0x80, 0x81, 0xE0, 0x90, 0xCC, 0x42, 0x21, 0x20, 0x50, 0x38, 0x18, 0x00, 94 | 0x83, 0x0F, 0x0C, 0x24, 0x71, 0x91, 0x64, 0x64, 0x90, 0xA2, 0xC2, 0x8E, 95 | 0x0E, 0x18, 0x10, 0x60, 0xC1, 0x31, 0x09, 0x03, 0x81, 0x81, 0xE0, 0x98, 96 | 0x84, 0xC1, 0x80, 0x81, 0xE0, 0x90, 0x4C, 0x62, 0x21, 0xB0, 0x50, 0x28, 97 | 0x08, 0x04, 0x06, 0x1E, 0x00, 0xFF, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 98 | 0x40, 0xFF, 0x06, 0x30, 0x40, 0x81, 0x02, 0x0C, 0x60, 0x20, 0x20, 0x40, 99 | 0x81, 0x02, 0x06, 0x03, 0xFF, 0xFF, 0xC0, 0x60, 0x40, 0x81, 0x02, 0x06, 100 | 0x03, 0x18, 0x20, 0x40, 0x81, 0x02, 0x18, 0x60, 0x05, 0xF8, 0x00 }; 101 | 102 | const GFXglyph GothamBook9pt7bGlyphs[] PROGMEM = { 103 | { 0, 0, 0, 5, 0, 1 }, // 0x20 ' ' 104 | { 0, 1, 13, 5, 2, -12 }, // 0x21 '!' 105 | { 2, 6, 5, 8, 1, -12 }, // 0x22 '"' 106 | { 6, 11, 13, 13, 1, -12 }, // 0x23 '#' 107 | { 24, 9, 16, 11, 1, -13 }, // 0x24 '$' 108 | { 42, 13, 13, 15, 1, -12 }, // 0x25 '%' 109 | { 64, 11, 13, 13, 1, -12 }, // 0x26 '&' 110 | { 82, 2, 5, 4, 1, -12 }, // 0x27 ''' 111 | { 84, 6, 16, 8, 1, -12 }, // 0x28 '(' 112 | { 96, 6, 16, 8, 1, -12 }, // 0x29 ')' 113 | { 108, 6, 6, 8, 1, -12 }, // 0x2A '*' 114 | { 113, 9, 9, 12, 1, -10 }, // 0x2B '+' 115 | { 124, 2, 4, 4, 1, -1 }, // 0x2C ',' 116 | { 125, 5, 1, 7, 1, -5 }, // 0x2D '-' 117 | { 126, 2, 1, 4, 1, 0 }, // 0x2E '.' 118 | { 127, 9, 16, 9, 0, -13 }, // 0x2F '/' 119 | { 145, 11, 13, 13, 1, -12 }, // 0x30 '0' 120 | { 163, 4, 13, 6, 1, -12 }, // 0x31 '1' 121 | { 170, 9, 13, 11, 1, -12 }, // 0x32 '2' 122 | { 185, 9, 13, 11, 1, -12 }, // 0x33 '3' 123 | { 200, 10, 13, 12, 1, -12 }, // 0x34 '4' 124 | { 217, 9, 13, 11, 1, -12 }, // 0x35 '5' 125 | { 232, 10, 13, 12, 1, -12 }, // 0x36 '6' 126 | { 249, 9, 13, 11, 1, -12 }, // 0x37 '7' 127 | { 264, 9, 13, 11, 1, -12 }, // 0x38 '8' 128 | { 279, 10, 13, 12, 1, -12 }, // 0x39 '9' 129 | { 296, 2, 9, 5, 1, -8 }, // 0x3A ':' 130 | { 299, 2, 11, 5, 1, -8 }, // 0x3B ';' 131 | { 302, 9, 9, 12, 1, -10 }, // 0x3C '<' 132 | { 313, 8, 5, 12, 2, -8 }, // 0x3D '=' 133 | { 318, 8, 9, 12, 2, -10 }, // 0x3E '>' 134 | { 327, 8, 13, 10, 1, -12 }, // 0x3F '?' 135 | { 340, 16, 16, 18, 1, -12 }, // 0x40 '@' 136 | { 372, 13, 13, 14, 1, -12 }, // 0x41 'A' 137 | { 394, 10, 13, 13, 2, -12 }, // 0x42 'B' 138 | { 411, 12, 13, 13, 1, -12 }, // 0x43 'C' 139 | { 431, 11, 13, 14, 2, -12 }, // 0x44 'D' 140 | { 449, 9, 13, 12, 2, -12 }, // 0x45 'E' 141 | { 464, 9, 13, 12, 2, -12 }, // 0x46 'F' 142 | { 479, 12, 13, 14, 1, -12 }, // 0x47 'G' 143 | { 499, 10, 13, 14, 2, -12 }, // 0x48 'H' 144 | { 516, 1, 13, 5, 2, -12 }, // 0x49 'I' 145 | { 518, 7, 13, 10, 1, -12 }, // 0x4A 'J' 146 | { 530, 11, 13, 13, 2, -12 }, // 0x4B 'K' 147 | { 548, 8, 13, 11, 2, -12 }, // 0x4C 'L' 148 | { 561, 12, 13, 16, 2, -12 }, // 0x4D 'M' 149 | { 581, 10, 13, 14, 2, -12 }, // 0x4E 'N' 150 | { 598, 13, 13, 15, 1, -12 }, // 0x4F 'O' 151 | { 620, 9, 13, 12, 2, -12 }, // 0x50 'P' 152 | { 635, 13, 13, 15, 1, -12 }, // 0x51 'Q' 153 | { 657, 10, 13, 13, 2, -12 }, // 0x52 'R' 154 | { 674, 9, 13, 12, 1, -12 }, // 0x53 'S' 155 | { 689, 10, 13, 12, 1, -12 }, // 0x54 'T' 156 | { 706, 10, 13, 14, 2, -12 }, // 0x55 'U' 157 | { 723, 12, 13, 14, 1, -12 }, // 0x56 'V' 158 | { 743, 18, 13, 20, 1, -12 }, // 0x57 'W' 159 | { 773, 11, 13, 13, 1, -12 }, // 0x58 'X' 160 | { 791, 12, 13, 13, 0, -12 }, // 0x59 'Y' 161 | { 811, 10, 13, 12, 1, -12 }, // 0x5A 'Z' 162 | { 828, 5, 15, 8, 2, -12 }, // 0x5B '[' 163 | { 838, 10, 16, 9, 0, -13 }, // 0x5C '\' 164 | { 858, 5, 15, 8, 1, -12 }, // 0x5D ']' 165 | { 868, 7, 4, 9, 1, -12 }, // 0x5E '^' 166 | { 872, 11, 1, 11, 0, 3 }, // 0x5F '_' 167 | { 874, 3, 2, 9, 3, -12 }, // 0x60 '`' 168 | { 875, 8, 9, 10, 1, -8 }, // 0x61 'a' 169 | { 884, 9, 13, 12, 2, -12 }, // 0x62 'b' 170 | { 899, 9, 9, 10, 1, -8 }, // 0x63 'c' 171 | { 910, 9, 13, 12, 1, -12 }, // 0x64 'd' 172 | { 925, 9, 9, 11, 1, -8 }, // 0x65 'e' 173 | { 936, 5, 13, 7, 1, -12 }, // 0x66 'f' 174 | { 945, 9, 12, 12, 1, -8 }, // 0x67 'g' 175 | { 959, 8, 13, 11, 2, -12 }, // 0x68 'h' 176 | { 972, 1, 13, 5, 2, -12 }, // 0x69 'i' 177 | { 974, 3, 16, 5, 0, -12 }, // 0x6A 'j' 178 | { 980, 8, 13, 10, 2, -12 }, // 0x6B 'k' 179 | { 993, 1, 13, 5, 2, -12 }, // 0x6C 'l' 180 | { 995, 14, 9, 17, 2, -8 }, // 0x6D 'm' 181 | { 1011, 8, 9, 11, 2, -8 }, // 0x6E 'n' 182 | { 1020, 10, 9, 12, 1, -8 }, // 0x6F 'o' 183 | { 1032, 9, 12, 12, 2, -8 }, // 0x70 'p' 184 | { 1046, 9, 12, 12, 1, -8 }, // 0x71 'q' 185 | { 1060, 5, 9, 7, 2, -8 }, // 0x72 'r' 186 | { 1066, 7, 9, 9, 1, -8 }, // 0x73 's' 187 | { 1074, 5, 12, 7, 1, -11 }, // 0x74 't' 188 | { 1082, 9, 9, 11, 1, -8 }, // 0x75 'u' 189 | { 1093, 9, 9, 11, 1, -8 }, // 0x76 'v' 190 | { 1104, 14, 9, 16, 1, -8 }, // 0x77 'w' 191 | { 1120, 9, 9, 10, 1, -8 }, // 0x78 'x' 192 | { 1131, 9, 12, 11, 1, -8 }, // 0x79 'y' 193 | { 1145, 8, 9, 10, 1, -8 }, // 0x7A 'z' 194 | { 1154, 7, 16, 9, 1, -12 }, // 0x7B '{' 195 | { 1168, 1, 16, 5, 2, -13 }, // 0x7C '|' 196 | { 1170, 7, 16, 9, 1, -12 }, // 0x7D '}' 197 | { 1184, 6, 3, 9, 1, -6 } }; // 0x7E '~' 198 | 199 | const GFXfont GothamBook9pt7b PROGMEM = { 200 | (uint8_t *)GothamBook9pt7bBitmaps, 201 | (GFXglyph *)GothamBook9pt7bGlyphs, 202 | 0x20, 0x7E, 17 }; 203 | 204 | // Approx. 1859 bytes 205 | -------------------------------------------------------------------------------- /src/Fonts/GothamLight_12.h: -------------------------------------------------------------------------------- 1 | const uint8_t GothamLight12pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0xFD, 0xAA, 0x03, 0xC0, 0xC7, 0x18, 0xE2, 0x8A, 0x20, 0x04, 0x10, 3 | 0x08, 0x20, 0x10, 0x40, 0x20, 0x80, 0x41, 0x0F, 0xFF, 0xC2, 0x08, 0x04, 4 | 0x10, 0x08, 0x20, 0x10, 0x40, 0x61, 0x87, 0xFF, 0xE1, 0x04, 0x02, 0x08, 5 | 0x04, 0x10, 0x08, 0x20, 0x30, 0xC0, 0x02, 0x00, 0xFC, 0x32, 0x62, 0x23, 6 | 0x42, 0x04, 0x20, 0x62, 0x03, 0x20, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x23, 7 | 0x02, 0x10, 0x21, 0x02, 0x1C, 0x21, 0x32, 0x60, 0xFC, 0x02, 0x00, 0x20, 8 | 0x3C, 0x03, 0x33, 0x03, 0x10, 0x81, 0x18, 0x61, 0x0C, 0x31, 0x06, 0x19, 9 | 0x81, 0x08, 0x80, 0xCC, 0x80, 0x3C, 0xC0, 0x00, 0x47, 0x80, 0x44, 0x60, 10 | 0x46, 0x10, 0x62, 0x08, 0x21, 0x04, 0x20, 0xC2, 0x20, 0x23, 0x30, 0x0F, 11 | 0x00, 0x07, 0x80, 0x31, 0x80, 0x41, 0x80, 0x83, 0x01, 0x06, 0x02, 0x08, 12 | 0x02, 0x20, 0x07, 0x80, 0x1A, 0x04, 0xC6, 0x09, 0x06, 0x26, 0x06, 0x48, 13 | 0x07, 0x18, 0x06, 0x10, 0x1E, 0x30, 0x66, 0x1F, 0x06, 0xFA, 0xA0, 0x06, 14 | 0x18, 0x41, 0x06, 0x08, 0x30, 0x40, 0x81, 0x02, 0x04, 0x08, 0x18, 0x10, 15 | 0x30, 0x20, 0x20, 0x30, 0x30, 0x40, 0xA0, 0x10, 0x08, 0x04, 0x06, 0x02, 16 | 0x02, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x06, 0x04, 0x08, 0x10, 0x20, 17 | 0xC0, 0x11, 0x29, 0xB8, 0x87, 0xD2, 0xC4, 0x00, 0x04, 0x00, 0x80, 0x10, 18 | 0x02, 0x00, 0x41, 0xFF, 0xC1, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x00, 19 | 0x6C, 0xA8, 0xFC, 0xF0, 0x00, 0x10, 0x02, 0x00, 0x20, 0x04, 0x00, 0x40, 20 | 0x08, 0x00, 0x80, 0x10, 0x01, 0x00, 0x20, 0x06, 0x00, 0x40, 0x0C, 0x00, 21 | 0x80, 0x18, 0x01, 0x00, 0x30, 0x02, 0x00, 0x60, 0x04, 0x00, 0xC0, 0x08, 22 | 0x00, 0x0F, 0x81, 0x87, 0x08, 0x0C, 0x80, 0x2C, 0x01, 0xC0, 0x06, 0x00, 23 | 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x1C, 0x01, 0xA0, 0x09, 24 | 0x80, 0xC6, 0x0C, 0x0F, 0x80, 0x3F, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 25 | 0x31, 0x8C, 0x63, 0x18, 0x0F, 0x83, 0x0C, 0x60, 0x6C, 0x02, 0x00, 0x20, 26 | 0x02, 0x00, 0x20, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 27 | 0x80, 0x30, 0x06, 0x00, 0xFF, 0xF0, 0x7F, 0xF0, 0x02, 0x00, 0x40, 0x0C, 28 | 0x01, 0x80, 0x30, 0x02, 0x00, 0x40, 0x0F, 0x80, 0x0E, 0x00, 0x20, 0x03, 29 | 0x00, 0x18, 0x03, 0x40, 0x23, 0x06, 0x1F, 0x80, 0x00, 0x60, 0x01, 0x80, 30 | 0x0A, 0x00, 0x68, 0x03, 0x20, 0x18, 0x80, 0x42, 0x02, 0x08, 0x10, 0x20, 31 | 0xC0, 0x86, 0x02, 0x10, 0x08, 0xFF, 0xFC, 0x00, 0x80, 0x02, 0x00, 0x08, 32 | 0x00, 0x20, 0x3F, 0xE2, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 33 | 0x02, 0xF8, 0x70, 0xE0, 0x02, 0x00, 0x10, 0x01, 0x00, 0x10, 0x03, 0xC0, 34 | 0x23, 0x06, 0x0F, 0x80, 0x0F, 0x83, 0x06, 0x60, 0x24, 0x00, 0xC0, 0x08, 35 | 0x00, 0x80, 0x09, 0xF8, 0xB0, 0xCC, 0x02, 0xC0, 0x38, 0x03, 0x80, 0x3C, 36 | 0x03, 0x40, 0x23, 0x0C, 0x1F, 0x00, 0xFF, 0xE0, 0x08, 0x01, 0x00, 0x60, 37 | 0x08, 0x03, 0x00, 0x40, 0x18, 0x02, 0x00, 0xC0, 0x10, 0x06, 0x00, 0x80, 38 | 0x30, 0x04, 0x01, 0x80, 0x20, 0x00, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0x80, 39 | 0x24, 0x01, 0x20, 0x09, 0x80, 0xC6, 0x0C, 0x0F, 0x81, 0x83, 0x10, 0x05, 40 | 0x80, 0x3C, 0x01, 0xE0, 0x0D, 0x00, 0x46, 0x0C, 0x0F, 0x80, 0x1F, 0x06, 41 | 0x0C, 0x40, 0x48, 0x02, 0x80, 0x28, 0x03, 0x80, 0x38, 0x03, 0xC0, 0x56, 42 | 0x09, 0x1F, 0x30, 0x02, 0x00, 0x20, 0x06, 0x80, 0xC6, 0x18, 0x3E, 0x00, 43 | 0xF0, 0x00, 0x0F, 0x6C, 0x00, 0x00, 0x01, 0xB2, 0xB0, 0x00, 0x20, 0x1C, 44 | 0x0E, 0x07, 0x01, 0x80, 0xC0, 0x20, 0x03, 0x00, 0x18, 0x01, 0xC0, 0x0E, 45 | 0x00, 0x70, 0x02, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 46 | 0xF8, 0x80, 0x06, 0x00, 0x18, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x30, 47 | 0x0E, 0x03, 0x80, 0x60, 0x18, 0x06, 0x00, 0x80, 0x00, 0x1F, 0x0C, 0x33, 48 | 0x01, 0x00, 0x20, 0x06, 0x00, 0x80, 0x10, 0x06, 0x0F, 0x01, 0x80, 0x20, 49 | 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x60, 0x0C, 0x00, 0x00, 0xFC, 0x00, 50 | 0x38, 0x18, 0x03, 0x00, 0x30, 0x20, 0x00, 0x42, 0x00, 0x01, 0x10, 0x3C, 51 | 0x89, 0x06, 0x14, 0x28, 0x60, 0xE1, 0x82, 0x02, 0x0C, 0x30, 0x10, 0x61, 52 | 0x80, 0x83, 0x0C, 0x0C, 0x18, 0x20, 0x60, 0xA1, 0x85, 0x09, 0x07, 0xC7, 53 | 0x88, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x20, 0x0E, 54 | 0x06, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x80, 0x00, 0xA0, 0x00, 0x50, 0x00, 55 | 0x4C, 0x00, 0x22, 0x00, 0x31, 0x80, 0x10, 0x40, 0x18, 0x30, 0x08, 0x08, 56 | 0x04, 0x04, 0x04, 0x01, 0x03, 0xFF, 0x82, 0x00, 0x21, 0x00, 0x11, 0x00, 57 | 0x0C, 0x80, 0x02, 0xC0, 0x01, 0x80, 0xFF, 0x84, 0x03, 0x20, 0x09, 0x00, 58 | 0x68, 0x01, 0x40, 0x1A, 0x00, 0x90, 0x08, 0xFF, 0x84, 0x03, 0x20, 0x05, 59 | 0x00, 0x38, 0x00, 0xC0, 0x0E, 0x00, 0x50, 0x04, 0xFF, 0xC0, 0x07, 0xE0, 60 | 0x38, 0x30, 0xC0, 0x1B, 0x00, 0x04, 0x00, 0x18, 0x00, 0x20, 0x00, 0x40, 61 | 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x0C, 0x00, 62 | 0x8C, 0x01, 0x8E, 0x0C, 0x07, 0xE0, 0xFF, 0x02, 0x03, 0x08, 0x03, 0x20, 63 | 0x04, 0x80, 0x0A, 0x00, 0x38, 0x00, 0xE0, 0x01, 0x80, 0x06, 0x00, 0x18, 64 | 0x00, 0xE0, 0x02, 0x80, 0x0A, 0x00, 0x48, 0x03, 0x20, 0x30, 0xFF, 0x00, 65 | 0xFF, 0xE8, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 66 | 0xFF, 0xC8, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 67 | 0xFF, 0xF0, 0xFF, 0xF0, 0x02, 0x00, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 68 | 0x00, 0xFF, 0xD0, 0x02, 0x00, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 69 | 0x80, 0x00, 0x07, 0xE0, 0x30, 0x30, 0xC0, 0x13, 0x00, 0x04, 0x00, 0x18, 70 | 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0xFF, 0x00, 0x06, 0x00, 0x0E, 0x00, 71 | 0x14, 0x00, 0x2C, 0x00, 0x4C, 0x01, 0x8C, 0x0C, 0x07, 0xE0, 0x80, 0x1C, 72 | 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0xFF, 73 | 0xFC, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 74 | 0x80, 0x18, 0xFF, 0xFF, 0x80, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 75 | 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x60, 0x3C, 0x09, 76 | 0x86, 0x3E, 0x00, 0x80, 0x1C, 0x01, 0xA0, 0x19, 0x01, 0x88, 0x18, 0x41, 77 | 0x82, 0x18, 0x11, 0x80, 0x9E, 0x05, 0x90, 0x38, 0x41, 0x83, 0x08, 0x0C, 78 | 0x40, 0x32, 0x00, 0x90, 0x02, 0x80, 0x18, 0x80, 0x10, 0x02, 0x00, 0x40, 79 | 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00, 0x40, 0x08, 80 | 0x01, 0x00, 0x20, 0x04, 0x00, 0xFF, 0xE0, 0x80, 0x03, 0x80, 0x0F, 0x00, 81 | 0x1D, 0x00, 0x5B, 0x01, 0xB2, 0x06, 0x62, 0x08, 0xC6, 0x31, 0x84, 0xC3, 82 | 0x05, 0x06, 0x0C, 0x0C, 0x08, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 83 | 0x01, 0x80, 0x02, 0x80, 0x0E, 0x00, 0x78, 0x03, 0x40, 0x19, 0x00, 0xC4, 84 | 0x06, 0x30, 0x30, 0xC1, 0x82, 0x0C, 0x08, 0x60, 0x63, 0x01, 0x98, 0x04, 85 | 0xC0, 0x16, 0x00, 0x70, 0x03, 0x80, 0x08, 0x07, 0xE0, 0x0E, 0x0C, 0x0C, 86 | 0x01, 0x0C, 0x00, 0x44, 0x00, 0x36, 0x00, 0x0A, 0x00, 0x05, 0x00, 0x03, 87 | 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x58, 0x00, 0x24, 0x00, 0x33, 0x00, 88 | 0x10, 0xC0, 0x10, 0x38, 0x30, 0x07, 0xE0, 0x00, 0xFF, 0x08, 0x0C, 0x80, 89 | 0x28, 0x03, 0x80, 0x38, 0x01, 0x80, 0x38, 0x02, 0x80, 0x68, 0x0C, 0xFF, 90 | 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x00, 0x07, 0xE0, 91 | 0x0E, 0x0C, 0x0C, 0x01, 0x0C, 0x00, 0x44, 0x00, 0x36, 0x00, 0x0A, 0x00, 92 | 0x05, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x04, 0x24, 93 | 0x07, 0x33, 0x00, 0x50, 0xC0, 0x18, 0x38, 0x34, 0x07, 0xE1, 0x00, 0x00, 94 | 0xC0, 0xFF, 0x84, 0x03, 0x20, 0x0D, 0x00, 0x28, 0x01, 0xC0, 0x0E, 0x00, 95 | 0x50, 0x06, 0x80, 0x67, 0xFC, 0x20, 0x41, 0x03, 0x08, 0x0C, 0x40, 0x22, 96 | 0x00, 0x90, 0x06, 0x80, 0x18, 0x0F, 0xC1, 0x83, 0x88, 0x04, 0x80, 0x04, 97 | 0x00, 0x30, 0x00, 0xC0, 0x07, 0x80, 0x0F, 0xC0, 0x07, 0x00, 0x04, 0x00, 98 | 0x30, 0x01, 0xC0, 0x0F, 0x00, 0x46, 0x04, 0x0F, 0xC0, 0xFF, 0xF8, 0x10, 99 | 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 100 | 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 101 | 0x00, 0x80, 0x06, 0x00, 0x18, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x18, 102 | 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x1C, 0x00, 0x70, 0x01, 0x40, 0x0D, 103 | 0x00, 0x22, 0x01, 0x86, 0x0C, 0x0F, 0xC0, 0xC0, 0x03, 0x40, 0x02, 0x60, 104 | 0x02, 0x20, 0x04, 0x20, 0x04, 0x30, 0x0C, 0x10, 0x08, 0x18, 0x18, 0x08, 105 | 0x10, 0x08, 0x10, 0x04, 0x20, 0x04, 0x20, 0x06, 0x60, 0x02, 0x40, 0x03, 106 | 0xC0, 0x01, 0x80, 0x01, 0x80, 0xC0, 0x08, 0x01, 0x40, 0x18, 0x03, 0x40, 107 | 0x1C, 0x02, 0x60, 0x14, 0x02, 0x20, 0x34, 0x06, 0x30, 0x26, 0x04, 0x10, 108 | 0x22, 0x04, 0x10, 0x42, 0x0C, 0x18, 0x43, 0x08, 0x08, 0x41, 0x08, 0x08, 109 | 0x81, 0x10, 0x0C, 0x81, 0x90, 0x04, 0x80, 0x90, 0x05, 0x00, 0xA0, 0x07, 110 | 0x00, 0xE0, 0x03, 0x00, 0x60, 0x02, 0x00, 0x40, 0xC0, 0x06, 0x40, 0x18, 111 | 0xC0, 0x20, 0xC0, 0x80, 0x82, 0x00, 0x8C, 0x01, 0xB0, 0x01, 0xC0, 0x01, 112 | 0x80, 0x05, 0x00, 0x19, 0x00, 0x63, 0x00, 0x83, 0x02, 0x02, 0x0C, 0x02, 113 | 0x30, 0x06, 0xC0, 0x06, 0xC0, 0x02, 0x80, 0x09, 0x80, 0x31, 0x80, 0x41, 114 | 0x01, 0x01, 0x06, 0x03, 0x18, 0x02, 0x20, 0x02, 0x80, 0x07, 0x00, 0x04, 115 | 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 116 | 0xFF, 0xF8, 0x00, 0x80, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0x40, 0x06, 0x00, 117 | 0x60, 0x06, 0x00, 0x20, 0x03, 0x00, 0x30, 0x03, 0x00, 0x10, 0x01, 0x80, 118 | 0x18, 0x00, 0xFF, 0xF8, 0xFF, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 119 | 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x07, 0xF0, 0x80, 0x04, 120 | 0x00, 0x40, 0x02, 0x00, 0x20, 0x01, 0x00, 0x10, 0x00, 0x80, 0x0C, 0x00, 121 | 0x40, 0x06, 0x00, 0x20, 0x03, 0x00, 0x10, 0x01, 0x80, 0x08, 0x00, 0xC0, 122 | 0x04, 0x00, 0x60, 0x02, 0x00, 0x30, 0x01, 0xFE, 0x04, 0x08, 0x10, 0x20, 123 | 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x04, 0x0F, 124 | 0xF0, 0x18, 0x3C, 0x24, 0x42, 0x81, 0xFF, 0xFC, 0xD9, 0x90, 0x1F, 0x0C, 125 | 0x18, 0x01, 0x00, 0x11, 0xFE, 0xC0, 0xD0, 0x0E, 0x01, 0xC0, 0x78, 0x0D, 126 | 0x86, 0x8F, 0x10, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 127 | 0x8F, 0x8B, 0x0C, 0xE0, 0x2C, 0x01, 0xC0, 0x18, 0x01, 0x80, 0x1C, 0x01, 128 | 0xC0, 0x1A, 0x02, 0x90, 0x48, 0xF8, 0x0F, 0x81, 0x06, 0x20, 0x34, 0x00, 129 | 0x40, 0x0C, 0x00, 0xC0, 0x04, 0x00, 0x40, 0x02, 0x02, 0x38, 0x70, 0xF8, 130 | 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x3E, 0x66, 131 | 0x0F, 0x20, 0x3A, 0x00, 0xD0, 0x07, 0x80, 0x3C, 0x01, 0xA0, 0x0D, 0x00, 132 | 0x6C, 0x07, 0x30, 0x58, 0x7C, 0xC0, 0x0F, 0x83, 0x0C, 0x60, 0x24, 0x02, 133 | 0x40, 0x3F, 0xFF, 0xC0, 0x04, 0x00, 0x40, 0x06, 0x02, 0x30, 0x60, 0xF8, 134 | 0x0E, 0x20, 0x81, 0x02, 0x04, 0x3F, 0x90, 0x20, 0x40, 0x81, 0x02, 0x04, 135 | 0x08, 0x10, 0x20, 0x40, 0x0F, 0x99, 0x83, 0xD8, 0x0E, 0x80, 0x34, 0x01, 136 | 0xE0, 0x0F, 0x00, 0x68, 0x03, 0x60, 0x39, 0x82, 0xC3, 0xE6, 0x00, 0x20, 137 | 0x01, 0x20, 0x19, 0xC1, 0x83, 0xF0, 0x80, 0x10, 0x02, 0x00, 0x40, 0x08, 138 | 0x01, 0x00, 0x27, 0xC5, 0x86, 0xC0, 0x58, 0x0E, 0x01, 0xC0, 0x18, 0x03, 139 | 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x04, 0xF0, 0x3F, 0xFF, 0xFF, 0xC0, 140 | 0x33, 0x00, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x32, 0xE0, 0x80, 141 | 0x10, 0x02, 0x00, 0x40, 0x08, 0x01, 0x00, 0x20, 0x3C, 0x0C, 0x83, 0x10, 142 | 0xC2, 0x30, 0x4C, 0x0B, 0x41, 0xC4, 0x30, 0xC4, 0x0C, 0x80, 0xD0, 0x0C, 143 | 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x9F, 0x0F, 0x14, 0x36, 0x1B, 0x03, 0x81, 144 | 0x60, 0x20, 0x38, 0x04, 0x03, 0x00, 0x80, 0x60, 0x10, 0x0C, 0x02, 0x01, 145 | 0x80, 0x40, 0x30, 0x08, 0x06, 0x01, 0x00, 0xC0, 0x20, 0x10, 0x9F, 0x16, 146 | 0x1B, 0x01, 0x60, 0x38, 0x07, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 147 | 0x00, 0xC0, 0x10, 0x0F, 0x80, 0x83, 0x08, 0x0C, 0x80, 0x24, 0x01, 0xE0, 148 | 0x07, 0x00, 0x28, 0x03, 0x40, 0x13, 0x01, 0x8C, 0x18, 0x1F, 0x00, 0x8F, 149 | 0x89, 0x0C, 0xA0, 0x2C, 0x01, 0xC0, 0x18, 0x01, 0x80, 0x1C, 0x01, 0xC0, 150 | 0x1E, 0x02, 0xB0, 0x48, 0xF8, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x0F, 151 | 0x99, 0x82, 0xC8, 0x0E, 0x80, 0x34, 0x01, 0xE0, 0x0F, 0x00, 0x68, 0x03, 152 | 0x40, 0x1B, 0x01, 0xCC, 0x1E, 0x1F, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 153 | 0x03, 0x8F, 0x22, 0x86, 0x0C, 0x18, 0x20, 0x40, 0x81, 0x02, 0x04, 0x00, 154 | 0x1F, 0x30, 0xD0, 0x08, 0x06, 0x01, 0xE0, 0x1C, 0x01, 0x00, 0xC0, 0x78, 155 | 0x67, 0xC0, 0x20, 0x40, 0x81, 0x0F, 0xE4, 0x08, 0x10, 0x20, 0x40, 0x81, 156 | 0x02, 0x04, 0x0C, 0x8F, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 157 | 0x06, 0x01, 0x80, 0x70, 0x36, 0x1C, 0x79, 0xC0, 0x34, 0x02, 0x40, 0x22, 158 | 0x04, 0x20, 0x43, 0x08, 0x10, 0x81, 0x98, 0x09, 0x00, 0xF0, 0x06, 0x00, 159 | 0x60, 0xC0, 0x40, 0x50, 0x30, 0x14, 0x0A, 0x0D, 0x82, 0x82, 0x21, 0x20, 160 | 0x88, 0x44, 0x41, 0x11, 0x10, 0x48, 0x44, 0x1A, 0x0A, 0x02, 0x82, 0x80, 161 | 0xC0, 0xE0, 0x30, 0x10, 0xC0, 0x26, 0x04, 0x30, 0x81, 0x98, 0x0B, 0x00, 162 | 0x60, 0x06, 0x00, 0x90, 0x11, 0x82, 0x0C, 0x60, 0x4C, 0x03, 0xC0, 0x14, 163 | 0x02, 0x40, 0x22, 0x06, 0x20, 0x41, 0x04, 0x10, 0x80, 0x88, 0x09, 0x80, 164 | 0x50, 0x05, 0x00, 0x20, 0x02, 0x00, 0x40, 0x0C, 0x0F, 0x80, 0x7F, 0xE0, 165 | 0x08, 0x02, 0x00, 0xC0, 0x30, 0x0C, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 166 | 0x80, 0x7F, 0xF0, 0x01, 0x83, 0x03, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 167 | 0x08, 0x08, 0x38, 0x02, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x06, 0x01, 168 | 0x80, 0x30, 0xFF, 0xFF, 0xFC, 0xC0, 0x18, 0x02, 0x01, 0x00, 0xC0, 0x60, 169 | 0x30, 0x18, 0x04, 0x03, 0x00, 0x60, 0xC0, 0x40, 0x60, 0x30, 0x18, 0x0C, 170 | 0x04, 0x06, 0x1C, 0x00, 0x73, 0x38 }; 171 | 172 | const GFXglyph GothamLight12pt7bGlyphs[] PROGMEM = { 173 | { 0, 0, 0, 7, 0, 1 }, // 0x20 ' ' 174 | { 0, 2, 17, 6, 2, -16 }, // 0x21 '!' 175 | { 5, 6, 6, 10, 2, -16 }, // 0x22 '"' 176 | { 10, 15, 17, 17, 1, -16 }, // 0x23 '#' 177 | { 42, 12, 20, 15, 1, -17 }, // 0x24 '$' 178 | { 72, 17, 17, 20, 1, -16 }, // 0x25 '%' 179 | { 109, 15, 17, 17, 1, -16 }, // 0x26 '&' 180 | { 141, 2, 6, 6, 2, -16 }, // 0x27 ''' 181 | { 143, 7, 20, 10, 2, -16 }, // 0x28 '(' 182 | { 161, 8, 20, 10, 1, -16 }, // 0x29 ')' 183 | { 181, 7, 7, 10, 2, -16 }, // 0x2A '*' 184 | { 188, 11, 11, 15, 2, -13 }, // 0x2B '+' 185 | { 204, 3, 5, 6, 1, -1 }, // 0x2C ',' 186 | { 206, 6, 1, 10, 2, -7 }, // 0x2D '-' 187 | { 207, 2, 2, 6, 2, -1 }, // 0x2E '.' 188 | { 208, 12, 22, 12, 0, -18 }, // 0x2F '/' 189 | { 241, 13, 17, 17, 2, -16 }, // 0x30 '0' 190 | { 269, 5, 17, 8, 1, -16 }, // 0x31 '1' 191 | { 280, 12, 17, 14, 1, -16 }, // 0x32 '2' 192 | { 306, 12, 17, 15, 1, -16 }, // 0x33 '3' 193 | { 332, 14, 17, 16, 1, -16 }, // 0x34 '4' 194 | { 362, 12, 17, 15, 1, -16 }, // 0x35 '5' 195 | { 388, 12, 17, 15, 2, -16 }, // 0x36 '6' 196 | { 414, 11, 17, 14, 2, -16 }, // 0x37 '7' 197 | { 438, 13, 17, 15, 1, -16 }, // 0x38 '8' 198 | { 466, 12, 17, 15, 2, -16 }, // 0x39 '9' 199 | { 492, 2, 12, 6, 2, -11 }, // 0x3A ':' 200 | { 495, 3, 15, 6, 1, -11 }, // 0x3B ';' 201 | { 501, 11, 13, 15, 2, -14 }, // 0x3C '<' 202 | { 519, 11, 7, 15, 2, -11 }, // 0x3D '=' 203 | { 529, 12, 13, 15, 2, -14 }, // 0x3E '>' 204 | { 549, 11, 17, 13, 1, -16 }, // 0x3F '?' 205 | { 573, 21, 21, 24, 1, -16 }, // 0x40 '@' 206 | { 629, 17, 17, 19, 1, -16 }, // 0x41 'A' 207 | { 666, 13, 17, 17, 3, -16 }, // 0x42 'B' 208 | { 694, 15, 17, 18, 2, -16 }, // 0x43 'C' 209 | { 726, 14, 17, 19, 3, -16 }, // 0x44 'D' 210 | { 756, 12, 17, 16, 3, -16 }, // 0x45 'E' 211 | { 782, 11, 17, 16, 3, -16 }, // 0x46 'F' 212 | { 806, 15, 17, 19, 2, -16 }, // 0x47 'G' 213 | { 838, 13, 17, 18, 3, -16 }, // 0x48 'H' 214 | { 866, 1, 17, 7, 3, -16 }, // 0x49 'I' 215 | { 869, 10, 17, 13, 1, -16 }, // 0x4A 'J' 216 | { 891, 13, 17, 17, 3, -16 }, // 0x4B 'K' 217 | { 919, 11, 17, 15, 3, -16 }, // 0x4C 'L' 218 | { 943, 15, 17, 21, 3, -16 }, // 0x4D 'M' 219 | { 975, 13, 17, 19, 3, -16 }, // 0x4E 'N' 220 | { 1003, 17, 17, 20, 2, -16 }, // 0x4F 'O' 221 | { 1040, 12, 17, 16, 3, -16 }, // 0x50 'P' 222 | { 1066, 17, 18, 20, 2, -16 }, // 0x51 'Q' 223 | { 1105, 13, 17, 17, 3, -16 }, // 0x52 'R' 224 | { 1133, 13, 17, 15, 1, -16 }, // 0x53 'S' 225 | { 1161, 13, 17, 16, 1, -16 }, // 0x54 'T' 226 | { 1189, 14, 17, 18, 2, -16 }, // 0x55 'U' 227 | { 1219, 16, 17, 18, 1, -16 }, // 0x56 'V' 228 | { 1253, 24, 17, 26, 1, -16 }, // 0x57 'W' 229 | { 1304, 15, 17, 17, 1, -16 }, // 0x58 'X' 230 | { 1336, 15, 17, 17, 1, -16 }, // 0x59 'Y' 231 | { 1368, 13, 17, 17, 2, -16 }, // 0x5A 'Z' 232 | { 1396, 7, 20, 10, 2, -16 }, // 0x5B '[' 233 | { 1414, 12, 22, 12, 0, -18 }, // 0x5C '\' 234 | { 1447, 7, 20, 10, 1, -16 }, // 0x5D ']' 235 | { 1465, 8, 5, 12, 2, -16 }, // 0x5E '^' 236 | { 1470, 14, 1, 14, 0, 4 }, // 0x5F '_' 237 | { 1472, 3, 4, 12, 4, -17 }, // 0x60 '`' 238 | { 1474, 11, 12, 14, 1, -11 }, // 0x61 'a' 239 | { 1491, 12, 18, 16, 2, -17 }, // 0x62 'b' 240 | { 1518, 12, 12, 14, 1, -11 }, // 0x63 'c' 241 | { 1536, 13, 18, 16, 1, -17 }, // 0x64 'd' 242 | { 1566, 12, 12, 14, 1, -11 }, // 0x65 'e' 243 | { 1584, 7, 18, 9, 1, -17 }, // 0x66 'f' 244 | { 1600, 13, 16, 16, 1, -11 }, // 0x67 'g' 245 | { 1626, 11, 18, 15, 2, -17 }, // 0x68 'h' 246 | { 1651, 2, 17, 6, 2, -16 }, // 0x69 'i' 247 | { 1656, 4, 21, 6, 0, -16 }, // 0x6A 'j' 248 | { 1667, 11, 18, 13, 2, -17 }, // 0x6B 'k' 249 | { 1692, 2, 18, 6, 2, -17 }, // 0x6C 'l' 250 | { 1697, 19, 12, 23, 2, -11 }, // 0x6D 'm' 251 | { 1726, 11, 12, 15, 2, -11 }, // 0x6E 'n' 252 | { 1743, 13, 12, 15, 1, -11 }, // 0x6F 'o' 253 | { 1763, 12, 16, 16, 2, -11 }, // 0x70 'p' 254 | { 1787, 13, 16, 16, 1, -11 }, // 0x71 'q' 255 | { 1813, 7, 12, 10, 2, -11 }, // 0x72 'r' 256 | { 1824, 9, 12, 12, 1, -11 }, // 0x73 's' 257 | { 1838, 7, 16, 10, 1, -15 }, // 0x74 't' 258 | { 1852, 10, 12, 15, 2, -11 }, // 0x75 'u' 259 | { 1867, 12, 12, 14, 1, -11 }, // 0x76 'v' 260 | { 1885, 18, 12, 21, 1, -11 }, // 0x77 'w' 261 | { 1912, 12, 12, 14, 1, -11 }, // 0x78 'x' 262 | { 1930, 12, 16, 14, 1, -11 }, // 0x79 'y' 263 | { 1954, 11, 12, 13, 1, -11 }, // 0x7A 'z' 264 | { 1971, 9, 20, 12, 1, -16 }, // 0x7B '{' 265 | { 1994, 1, 22, 7, 3, -18 }, // 0x7C '|' 266 | { 1997, 9, 20, 12, 1, -16 }, // 0x7D '}' 267 | { 2020, 7, 2, 11, 2, -7 } }; // 0x7E '~' 268 | 269 | const GFXfont GothamLight12pt7b PROGMEM = { 270 | (uint8_t *)GothamLight12pt7bBitmaps, 271 | (GFXglyph *)GothamLight12pt7bGlyphs, 272 | 0x20, 0x7E, 23 }; 273 | 274 | // Approx. 2694 bytes 275 | -------------------------------------------------------------------------------- /src/Fonts/GothamLight_5.h: -------------------------------------------------------------------------------- 1 | const uint8_t GothamLight5pt7bBitmaps[] PROGMEM = { 2 | 0xFA, 0xFC, 0x24, 0x51, 0xFA, 0x4F, 0xC9, 0x14, 0x00, 0x47, 0x35, 0x86, 3 | 0x2B, 0x2E, 0x40, 0xC5, 0x53, 0x41, 0x63, 0x2A, 0x63, 0x00, 0x30, 0x91, 4 | 0x45, 0x29, 0x51, 0x1D, 0x80, 0xE0, 0x72, 0x49, 0x23, 0x89, 0x12, 0x94, 5 | 0x9F, 0x80, 0x42, 0x3E, 0x84, 0x00, 0xA0, 0xC0, 0x80, 0x08, 0x84, 0x42, 6 | 0x21, 0x10, 0x80, 0x74, 0x63, 0x18, 0xC5, 0xC0, 0x75, 0x54, 0x3A, 0x42, 7 | 0x22, 0x23, 0xE0, 0xF2, 0x47, 0x19, 0x70, 0x08, 0x62, 0x92, 0x49, 0xF8, 8 | 0x80, 0xF8, 0xF1, 0x19, 0x70, 0x74, 0xFD, 0x18, 0xC5, 0xC0, 0xF1, 0x22, 9 | 0x44, 0x80, 0x74, 0xA6, 0xC9, 0xC7, 0xC0, 0x74, 0xA3, 0x17, 0xC9, 0x80, 10 | 0x88, 0x8C, 0x16, 0x84, 0x30, 0xF0, 0xF0, 0x83, 0x06, 0x6C, 0x00, 0x74, 11 | 0x42, 0x13, 0x10, 0x80, 0x3C, 0x42, 0x9D, 0xA5, 0xC5, 0xC5, 0xBF, 0x42, 12 | 0x3C, 0x10, 0x50, 0xA2, 0x23, 0xC8, 0x60, 0x80, 0xFA, 0x28, 0xBC, 0x8E, 13 | 0x1F, 0x80, 0x7A, 0x18, 0x20, 0x82, 0x17, 0x80, 0xF2, 0x28, 0x61, 0x86, 14 | 0x2F, 0x00, 0xFC, 0x21, 0xF8, 0x43, 0xE0, 0xFC, 0x21, 0xF8, 0x42, 0x00, 15 | 0x7A, 0x18, 0x27, 0x86, 0x17, 0x80, 0x86, 0x18, 0x7F, 0x86, 0x18, 0x40, 16 | 0xFE, 0x08, 0x42, 0x10, 0xC9, 0xC0, 0x8E, 0x4A, 0x28, 0xD2, 0x28, 0xC0, 17 | 0x84, 0x21, 0x08, 0x43, 0xE0, 0x83, 0x8F, 0x2D, 0x99, 0x30, 0x60, 0x80, 18 | 0x87, 0x1A, 0x69, 0x96, 0x38, 0x40, 0x79, 0x0A, 0x0C, 0x18, 0x30, 0x9E, 19 | 0x00, 0xF4, 0x63, 0x1F, 0x42, 0x00, 0x79, 0x0A, 0x0C, 0x19, 0x31, 0x9E, 20 | 0x80, 0xFA, 0x28, 0xBC, 0x92, 0x28, 0xC0, 0xE4, 0xE0, 0xC1, 0xC5, 0xC0, 21 | 0xF9, 0x08, 0x42, 0x10, 0x80, 0x86, 0x18, 0x61, 0x86, 0x27, 0x80, 0x82, 22 | 0x89, 0x11, 0x22, 0x85, 0x04, 0x00, 0x88, 0xE6, 0x29, 0x4A, 0x54, 0x65, 23 | 0x18, 0xC2, 0x20, 0x8E, 0x45, 0x08, 0x52, 0x28, 0xC0, 0x86, 0x88, 0xA1, 24 | 0x81, 0x02, 0x04, 0x00, 0xF8, 0x88, 0x44, 0x43, 0xE0, 0xF2, 0x49, 0x24, 25 | 0xE0, 0x84, 0x10, 0x82, 0x10, 0x42, 0x08, 0xD5, 0x55, 0xC0, 0xD4, 0xFC, 26 | 0x80, 0xE1, 0xF9, 0xF0, 0x84, 0x3D, 0x18, 0xC7, 0xC0, 0x69, 0x89, 0x60, 27 | 0x08, 0x5F, 0x18, 0xC5, 0xE0, 0x69, 0xF9, 0x60, 0x34, 0xF4, 0x44, 0x40, 28 | 0x7C, 0x63, 0x17, 0xC5, 0xC0, 0x88, 0xF9, 0x99, 0x90, 0xBE, 0x4A, 0xAA, 29 | 0x80, 0x88, 0x9A, 0xCA, 0x90, 0xFE, 0xEE, 0x91, 0x91, 0x91, 0x91, 0xF9, 30 | 0x99, 0x90, 0x74, 0x63, 0x17, 0x00, 0xF4, 0x63, 0x1F, 0x42, 0x00, 0x7C, 31 | 0x63, 0x17, 0x84, 0x20, 0xF2, 0x48, 0x79, 0x69, 0x70, 0x4B, 0xA4, 0x98, 32 | 0x99, 0x99, 0xF0, 0x8A, 0x54, 0x62, 0x00, 0x89, 0x59, 0x5A, 0x66, 0x24, 33 | 0x4A, 0x88, 0xA8, 0x80, 0x8A, 0x54, 0x61, 0x11, 0x80, 0xF2, 0x48, 0xF0, 34 | 0x29, 0x48, 0x93, 0xFF, 0x80, 0x89, 0x22, 0x94, 0xB8 }; 35 | 36 | const GFXglyph GothamLight5pt7bGlyphs[] PROGMEM = { 37 | { 0, 0, 0, 3, 0, 1 }, // 0x20 ' ' 38 | { 0, 1, 7, 3, 1, -6 }, // 0x21 '!' 39 | { 1, 2, 3, 4, 1, -6 }, // 0x22 '"' 40 | { 2, 7, 7, 7, 0, -6 }, // 0x23 '#' 41 | { 9, 5, 9, 6, 1, -7 }, // 0x24 '$' 42 | { 15, 7, 7, 8, 1, -6 }, // 0x25 '%' 43 | { 22, 7, 7, 7, 0, -6 }, // 0x26 '&' 44 | { 29, 1, 3, 2, 1, -6 }, // 0x27 ''' 45 | { 30, 3, 8, 4, 1, -6 }, // 0x28 '(' 46 | { 33, 3, 8, 4, 1, -6 }, // 0x29 ')' 47 | { 36, 3, 3, 4, 1, -6 }, // 0x2A '*' 48 | { 38, 5, 5, 6, 1, -5 }, // 0x2B '+' 49 | { 42, 2, 2, 2, 0, 0 }, // 0x2C ',' 50 | { 43, 2, 1, 4, 1, -2 }, // 0x2D '-' 51 | { 44, 2, 1, 2, 0, 0 }, // 0x2E '.' 52 | { 45, 5, 9, 5, 0, -7 }, // 0x2F '/' 53 | { 51, 5, 7, 7, 1, -6 }, // 0x30 '0' 54 | { 56, 2, 7, 3, 0, -6 }, // 0x31 '1' 55 | { 58, 5, 7, 6, 0, -6 }, // 0x32 '2' 56 | { 63, 4, 7, 6, 1, -6 }, // 0x33 '3' 57 | { 67, 6, 7, 7, 0, -6 }, // 0x34 '4' 58 | { 73, 4, 7, 6, 1, -6 }, // 0x35 '5' 59 | { 77, 5, 7, 6, 1, -6 }, // 0x36 '6' 60 | { 82, 4, 7, 6, 1, -6 }, // 0x37 '7' 61 | { 86, 5, 7, 6, 1, -6 }, // 0x38 '8' 62 | { 91, 5, 7, 6, 1, -6 }, // 0x39 '9' 63 | { 96, 1, 5, 2, 1, -4 }, // 0x3A ':' 64 | { 97, 1, 6, 2, 1, -4 }, // 0x3B ';' 65 | { 98, 4, 5, 6, 1, -5 }, // 0x3C '<' 66 | { 101, 4, 3, 6, 1, -4 }, // 0x3D '=' 67 | { 103, 5, 5, 6, 1, -5 }, // 0x3E '>' 68 | { 107, 5, 7, 5, 0, -6 }, // 0x3F '?' 69 | { 112, 8, 9, 10, 1, -6 }, // 0x40 '@' 70 | { 121, 7, 7, 8, 0, -6 }, // 0x41 'A' 71 | { 128, 6, 7, 7, 1, -6 }, // 0x42 'B' 72 | { 134, 6, 7, 7, 1, -6 }, // 0x43 'C' 73 | { 140, 6, 7, 8, 1, -6 }, // 0x44 'D' 74 | { 146, 5, 7, 7, 1, -6 }, // 0x45 'E' 75 | { 151, 5, 7, 7, 1, -6 }, // 0x46 'F' 76 | { 156, 6, 7, 8, 1, -6 }, // 0x47 'G' 77 | { 162, 6, 7, 8, 1, -6 }, // 0x48 'H' 78 | { 168, 1, 7, 3, 1, -6 }, // 0x49 'I' 79 | { 169, 5, 7, 5, 0, -6 }, // 0x4A 'J' 80 | { 174, 6, 7, 7, 1, -6 }, // 0x4B 'K' 81 | { 180, 5, 7, 6, 1, -6 }, // 0x4C 'L' 82 | { 185, 7, 7, 9, 1, -6 }, // 0x4D 'M' 83 | { 192, 6, 7, 8, 1, -6 }, // 0x4E 'N' 84 | { 198, 7, 7, 9, 1, -6 }, // 0x4F 'O' 85 | { 205, 5, 7, 7, 1, -6 }, // 0x50 'P' 86 | { 210, 7, 7, 9, 1, -6 }, // 0x51 'Q' 87 | { 217, 6, 7, 7, 1, -6 }, // 0x52 'R' 88 | { 223, 5, 7, 6, 1, -6 }, // 0x53 'S' 89 | { 228, 5, 7, 6, 1, -6 }, // 0x54 'T' 90 | { 233, 6, 7, 8, 1, -6 }, // 0x55 'U' 91 | { 239, 7, 7, 8, 0, -6 }, // 0x56 'V' 92 | { 246, 10, 7, 11, 1, -6 }, // 0x57 'W' 93 | { 255, 6, 7, 7, 1, -6 }, // 0x58 'X' 94 | { 261, 7, 7, 7, 0, -6 }, // 0x59 'Y' 95 | { 268, 5, 7, 7, 1, -6 }, // 0x5A 'Z' 96 | { 273, 3, 9, 4, 1, -6 }, // 0x5B '[' 97 | { 277, 5, 9, 5, 0, -7 }, // 0x5C '\' 98 | { 283, 2, 9, 4, 1, -6 }, // 0x5D ']' 99 | { 286, 3, 2, 5, 1, -6 }, // 0x5E '^' 100 | { 287, 6, 1, 6, 0, 2 }, // 0x5F '_' 101 | { 288, 1, 1, 5, 2, -6 }, // 0x60 '`' 102 | { 289, 4, 5, 6, 1, -4 }, // 0x61 'a' 103 | { 292, 5, 7, 7, 1, -6 }, // 0x62 'b' 104 | { 297, 4, 5, 6, 1, -4 }, // 0x63 'c' 105 | { 300, 5, 7, 7, 1, -6 }, // 0x64 'd' 106 | { 305, 4, 5, 6, 1, -4 }, // 0x65 'e' 107 | { 308, 4, 7, 4, 0, -6 }, // 0x66 'f' 108 | { 312, 5, 7, 7, 1, -4 }, // 0x67 'g' 109 | { 317, 4, 7, 6, 1, -6 }, // 0x68 'h' 110 | { 321, 1, 7, 2, 1, -6 }, // 0x69 'i' 111 | { 322, 2, 9, 2, 0, -6 }, // 0x6A 'j' 112 | { 325, 4, 7, 6, 1, -6 }, // 0x6B 'k' 113 | { 329, 1, 7, 2, 1, -6 }, // 0x6C 'l' 114 | { 330, 8, 5, 10, 1, -4 }, // 0x6D 'm' 115 | { 335, 4, 5, 6, 1, -4 }, // 0x6E 'n' 116 | { 338, 5, 5, 6, 1, -4 }, // 0x6F 'o' 117 | { 342, 5, 7, 7, 1, -4 }, // 0x70 'p' 118 | { 347, 5, 7, 7, 1, -4 }, // 0x71 'q' 119 | { 352, 3, 5, 4, 1, -4 }, // 0x72 'r' 120 | { 354, 4, 5, 5, 0, -4 }, // 0x73 's' 121 | { 357, 3, 7, 4, 0, -6 }, // 0x74 't' 122 | { 360, 4, 5, 6, 1, -4 }, // 0x75 'u' 123 | { 363, 5, 5, 6, 0, -4 }, // 0x76 'v' 124 | { 367, 8, 5, 9, 0, -4 }, // 0x77 'w' 125 | { 372, 5, 5, 6, 0, -4 }, // 0x78 'x' 126 | { 376, 5, 7, 6, 0, -4 }, // 0x79 'y' 127 | { 381, 4, 5, 6, 1, -4 }, // 0x7A 'z' 128 | { 384, 3, 8, 5, 1, -6 }, // 0x7B '{' 129 | { 387, 1, 9, 3, 1, -7 }, // 0x7C '|' 130 | { 389, 3, 8, 5, 1, -6 }, // 0x7D '}' 131 | { 392, 3, 2, 5, 1, -3 } }; // 0x7E '~' 132 | 133 | const GFXfont GothamLight5pt7b PROGMEM = { 134 | (uint8_t *)GothamLight5pt7bBitmaps, 135 | (GFXglyph *)GothamLight5pt7bGlyphs, 136 | 0x20, 0x7E, 10 }; 137 | 138 | // Approx. 1065 bytes 139 | -------------------------------------------------------------------------------- /src/Fonts/GothamLight_7.h: -------------------------------------------------------------------------------- 1 | const uint8_t GothamLight7pt7bBitmaps[] PROGMEM = { 2 | 0xFE, 0x40, 0x99, 0xAA, 0x22, 0x22, 0x24, 0xFF, 0x24, 0x44, 0x44, 0xFF, 3 | 0x44, 0x48, 0x10, 0xF3, 0x5C, 0x89, 0x0A, 0x0F, 0x09, 0x13, 0xAC, 0xF0, 4 | 0x80, 0x61, 0xA4, 0x49, 0x22, 0x50, 0x64, 0x02, 0xE1, 0x24, 0x91, 0x22, 5 | 0x50, 0xE0, 0x38, 0x44, 0x44, 0x48, 0x30, 0xD1, 0x8A, 0x86, 0x8E, 0x79, 6 | 0xF0, 0x12, 0x48, 0x88, 0x88, 0x84, 0x21, 0x84, 0x21, 0x11, 0x11, 0x12, 7 | 0x48, 0x4F, 0x6D, 0x10, 0x20, 0x47, 0xF1, 0x02, 0x00, 0xE0, 0xF0, 0x80, 8 | 0x02, 0x08, 0x10, 0x40, 0x82, 0x04, 0x10, 0x20, 0x81, 0x04, 0x08, 0x00, 9 | 0x3C, 0x42, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x42, 0x3C, 0x74, 0x92, 10 | 0x49, 0x24, 0x39, 0x18, 0x41, 0x04, 0x21, 0x08, 0xC3, 0xF0, 0xFC, 0x10, 11 | 0x40, 0x83, 0x80, 0x80, 0xC1, 0x84, 0xF0, 0x04, 0x0C, 0x14, 0x24, 0x24, 12 | 0x44, 0x84, 0xFF, 0x04, 0x04, 0x7D, 0x02, 0x04, 0x0F, 0x90, 0x80, 0x81, 13 | 0xC4, 0x70, 0x38, 0x8E, 0x04, 0x0B, 0xD8, 0xE0, 0xC1, 0x46, 0x78, 0xFC, 14 | 0x10, 0x42, 0x08, 0x41, 0x08, 0x21, 0x00, 0x79, 0x0E, 0x0C, 0x27, 0x98, 15 | 0xA0, 0xC1, 0x86, 0xF0, 0x38, 0x8A, 0x0C, 0x18, 0x38, 0xDE, 0x81, 0x84, 16 | 0xF0, 0x82, 0x83, 0x80, 0x02, 0x18, 0xC6, 0x0C, 0x06, 0x02, 0x03, 0xFE, 17 | 0x00, 0x07, 0xF0, 0x80, 0xC0, 0x60, 0x30, 0x63, 0x08, 0x60, 0x38, 0x8A, 18 | 0x08, 0x10, 0x43, 0x04, 0x08, 0x00, 0x20, 0x0F, 0x03, 0x0C, 0x40, 0x28, 19 | 0xE9, 0x91, 0x99, 0x11, 0xA1, 0x19, 0x11, 0x8E, 0xE8, 0x00, 0x40, 0x02, 20 | 0x04, 0x1F, 0x80, 0x18, 0x0A, 0x05, 0x04, 0x82, 0x22, 0x11, 0xFD, 0x02, 21 | 0x80, 0xC0, 0x40, 0xFC, 0x82, 0x81, 0x81, 0x82, 0xFC, 0x83, 0x81, 0x81, 22 | 0xFE, 0x1E, 0x30, 0x90, 0x30, 0x08, 0x04, 0x02, 0x00, 0x82, 0x61, 0x8F, 23 | 0x00, 0xFC, 0x41, 0xA0, 0x50, 0x18, 0x0C, 0x06, 0x03, 0x02, 0x83, 0x7E, 24 | 0x00, 0xFE, 0x80, 0x80, 0x80, 0x80, 0xFE, 0x80, 0x80, 0x80, 0xFF, 0xFF, 25 | 0x02, 0x04, 0x08, 0x1F, 0xE0, 0x40, 0x81, 0x00, 0x1E, 0x30, 0x90, 0x10, 26 | 0x08, 0x04, 0x3E, 0x02, 0x81, 0x61, 0x8F, 0x00, 0x81, 0x81, 0x81, 0x81, 27 | 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0xAA, 0xAA, 0xA0, 0x08, 0x42, 0x10, 28 | 0x84, 0x31, 0x8B, 0x80, 0x81, 0x41, 0x21, 0x11, 0x09, 0x05, 0x43, 0x11, 29 | 0x04, 0x82, 0x40, 0xC0, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 30 | 0xFC, 0x80, 0x70, 0x3A, 0x16, 0x89, 0x92, 0x63, 0x18, 0x86, 0x01, 0x80, 31 | 0x60, 0x10, 0xC0, 0xE0, 0x68, 0x32, 0x18, 0x8C, 0x46, 0x13, 0x05, 0x81, 32 | 0xC0, 0x40, 0x1E, 0x18, 0x64, 0x0A, 0x01, 0x80, 0x60, 0x18, 0x05, 0x02, 33 | 0x61, 0x87, 0x80, 0xFC, 0x82, 0x81, 0x81, 0x81, 0x82, 0xFC, 0x80, 0x80, 34 | 0x80, 0x1E, 0x18, 0x64, 0x0A, 0x01, 0x80, 0x60, 0x18, 0x25, 0x06, 0x61, 35 | 0x87, 0x90, 0xFE, 0x81, 0x81, 0x81, 0x83, 0xFC, 0x84, 0x82, 0x82, 0x81, 36 | 0x79, 0x8E, 0x04, 0x04, 0x07, 0x80, 0x81, 0xC2, 0x78, 0xFE, 0x20, 0x40, 37 | 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 38 | 0x81, 0x81, 0x43, 0x3C, 0x80, 0xC0, 0xA0, 0x48, 0x44, 0x21, 0x10, 0x90, 39 | 0x28, 0x18, 0x04, 0x00, 0x82, 0x06, 0x0C, 0x28, 0x50, 0x91, 0x44, 0x45, 40 | 0x11, 0x22, 0x42, 0x8A, 0x0A, 0x28, 0x30, 0x60, 0x41, 0x00, 0x81, 0x42, 41 | 0x24, 0x24, 0x18, 0x18, 0x24, 0x44, 0x42, 0x81, 0xC0, 0xD0, 0x22, 0x10, 42 | 0x48, 0x14, 0x03, 0x00, 0x80, 0x20, 0x08, 0x02, 0x00, 0xFF, 0x02, 0x04, 43 | 0x08, 0x10, 0x10, 0x20, 0x40, 0x80, 0xFF, 0xF8, 0x88, 0x88, 0x88, 0x88, 44 | 0x8F, 0x81, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 45 | 0x20, 0xF1, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x22, 0xA2, 0xFF, 0x90, 0x7A, 46 | 0x17, 0xE1, 0x86, 0x37, 0x40, 0x81, 0x02, 0x05, 0xEC, 0x30, 0x60, 0xC1, 47 | 0xC3, 0x78, 0x3B, 0x18, 0x20, 0x83, 0x13, 0x80, 0x02, 0x04, 0x09, 0xDC, 48 | 0x70, 0x60, 0xC1, 0xC6, 0xF4, 0x7A, 0x18, 0x7F, 0x83, 0x17, 0x80, 0x74, 49 | 0x8F, 0x88, 0x88, 0x88, 0x7B, 0x8E, 0x0C, 0x18, 0x38, 0xDE, 0xC1, 0x7C, 50 | 0x82, 0x08, 0x2E, 0xC6, 0x18, 0x61, 0x86, 0x10, 0x9F, 0xC0, 0x41, 0x55, 51 | 0x57, 0x82, 0x08, 0x21, 0x8A, 0x4B, 0x34, 0x8A, 0x10, 0xFF, 0xC0, 0xB9, 52 | 0xD8, 0xC6, 0x10, 0xC2, 0x18, 0x43, 0x08, 0x61, 0x08, 0xBB, 0x18, 0x61, 53 | 0x86, 0x18, 0x40, 0x39, 0x8E, 0x0C, 0x18, 0x38, 0x8E, 0x00, 0xBD, 0x86, 54 | 0x0C, 0x18, 0x38, 0x6F, 0x40, 0x80, 0x3B, 0x8E, 0x0C, 0x18, 0x38, 0xDE, 55 | 0x81, 0x02, 0xBC, 0x88, 0x88, 0x80, 0x74, 0x60, 0xC1, 0xC5, 0xC0, 0x88, 56 | 0xF8, 0x88, 0x84, 0x70, 0x86, 0x18, 0x61, 0x87, 0x17, 0xC0, 0x87, 0x0A, 57 | 0x22, 0x44, 0x86, 0x04, 0x00, 0x88, 0x63, 0x18, 0xC9, 0x4A, 0x52, 0x98, 58 | 0xC2, 0x10, 0x85, 0x23, 0x08, 0x51, 0x28, 0x40, 0x87, 0x09, 0x12, 0x44, 59 | 0x86, 0x04, 0x10, 0xE0, 0xFC, 0x21, 0x08, 0x42, 0x0F, 0xC0, 0x19, 0x08, 60 | 0x44, 0x41, 0x04, 0x21, 0x08, 0x30, 0xAA, 0xAA, 0xAA, 0x80, 0xC1, 0x08, 61 | 0x42, 0x0C, 0xC4, 0x21, 0x09, 0x80, 0x5B }; 62 | 63 | const GFXglyph GothamLight7pt7bGlyphs[] PROGMEM = { 64 | { 0, 0, 0, 4, 0, 1 }, // 0x20 ' ' 65 | { 0, 1, 10, 4, 1, -9 }, // 0x21 '!' 66 | { 2, 4, 4, 6, 1, -9 }, // 0x22 '"' 67 | { 4, 8, 10, 10, 1, -9 }, // 0x23 '#' 68 | { 14, 7, 12, 9, 1, -10 }, // 0x24 '$' 69 | { 25, 10, 10, 12, 1, -9 }, // 0x25 '%' 70 | { 38, 8, 10, 10, 1, -9 }, // 0x26 '&' 71 | { 48, 1, 4, 3, 1, -9 }, // 0x27 ''' 72 | { 49, 4, 12, 6, 1, -9 }, // 0x28 '(' 73 | { 55, 4, 12, 6, 1, -9 }, // 0x29 ')' 74 | { 61, 4, 4, 6, 1, -9 }, // 0x2A '*' 75 | { 63, 7, 6, 9, 1, -7 }, // 0x2B '+' 76 | { 69, 1, 3, 3, 1, 0 }, // 0x2C ',' 77 | { 70, 4, 1, 6, 1, -4 }, // 0x2D '-' 78 | { 71, 1, 1, 3, 1, 0 }, // 0x2E '.' 79 | { 72, 7, 13, 7, 0, -10 }, // 0x2F '/' 80 | { 84, 8, 10, 10, 1, -9 }, // 0x30 '0' 81 | { 94, 3, 10, 5, 0, -9 }, // 0x31 '1' 82 | { 98, 6, 10, 8, 1, -9 }, // 0x32 '2' 83 | { 106, 7, 10, 9, 1, -9 }, // 0x33 '3' 84 | { 115, 8, 10, 9, 1, -9 }, // 0x34 '4' 85 | { 125, 7, 10, 8, 1, -9 }, // 0x35 '5' 86 | { 134, 7, 10, 9, 1, -9 }, // 0x36 '6' 87 | { 143, 6, 10, 8, 1, -9 }, // 0x37 '7' 88 | { 151, 7, 10, 9, 1, -9 }, // 0x38 '8' 89 | { 160, 7, 10, 9, 1, -9 }, // 0x39 '9' 90 | { 169, 1, 7, 3, 1, -6 }, // 0x3A ':' 91 | { 170, 1, 9, 3, 1, -6 }, // 0x3B ';' 92 | { 172, 7, 8, 9, 1, -8 }, // 0x3C '<' 93 | { 179, 7, 4, 9, 1, -6 }, // 0x3D '=' 94 | { 183, 7, 8, 9, 1, -8 }, // 0x3E '>' 95 | { 190, 7, 10, 7, 0, -9 }, // 0x3F '?' 96 | { 199, 12, 13, 14, 1, -9 }, // 0x40 '@' 97 | { 219, 9, 10, 11, 1, -9 }, // 0x41 'A' 98 | { 231, 8, 10, 10, 1, -9 }, // 0x42 'B' 99 | { 241, 9, 10, 10, 1, -9 }, // 0x43 'C' 100 | { 253, 9, 10, 11, 1, -9 }, // 0x44 'D' 101 | { 265, 8, 10, 9, 1, -9 }, // 0x45 'E' 102 | { 275, 7, 10, 9, 1, -9 }, // 0x46 'F' 103 | { 284, 9, 10, 11, 1, -9 }, // 0x47 'G' 104 | { 296, 8, 10, 11, 1, -9 }, // 0x48 'H' 105 | { 306, 2, 10, 4, 1, -9 }, // 0x49 'I' 106 | { 309, 5, 10, 8, 1, -9 }, // 0x4A 'J' 107 | { 316, 9, 10, 10, 1, -9 }, // 0x4B 'K' 108 | { 328, 7, 10, 9, 1, -9 }, // 0x4C 'L' 109 | { 337, 10, 10, 12, 1, -9 }, // 0x4D 'M' 110 | { 350, 9, 10, 11, 1, -9 }, // 0x4E 'N' 111 | { 362, 10, 10, 12, 1, -9 }, // 0x4F 'O' 112 | { 375, 8, 10, 9, 1, -9 }, // 0x50 'P' 113 | { 385, 10, 10, 12, 1, -9 }, // 0x51 'Q' 114 | { 398, 8, 10, 10, 1, -9 }, // 0x52 'R' 115 | { 408, 7, 10, 9, 1, -9 }, // 0x53 'S' 116 | { 417, 7, 10, 9, 1, -9 }, // 0x54 'T' 117 | { 426, 8, 10, 11, 1, -9 }, // 0x55 'U' 118 | { 436, 9, 10, 11, 1, -9 }, // 0x56 'V' 119 | { 448, 14, 10, 15, 1, -9 }, // 0x57 'W' 120 | { 466, 8, 10, 10, 1, -9 }, // 0x58 'X' 121 | { 476, 10, 10, 10, 0, -9 }, // 0x59 'Y' 122 | { 489, 8, 10, 10, 1, -9 }, // 0x5A 'Z' 123 | { 499, 4, 12, 6, 1, -9 }, // 0x5B '[' 124 | { 505, 7, 13, 7, 0, -10 }, // 0x5C '\' 125 | { 517, 4, 12, 6, 1, -9 }, // 0x5D ']' 126 | { 523, 5, 3, 7, 1, -9 }, // 0x5E '^' 127 | { 525, 8, 1, 8, 0, 2 }, // 0x5F '_' 128 | { 526, 2, 2, 7, 2, -9 }, // 0x60 '`' 129 | { 527, 6, 7, 8, 1, -6 }, // 0x61 'a' 130 | { 533, 7, 10, 9, 1, -9 }, // 0x62 'b' 131 | { 542, 6, 7, 8, 1, -6 }, // 0x63 'c' 132 | { 548, 7, 10, 9, 1, -9 }, // 0x64 'd' 133 | { 557, 6, 7, 8, 1, -6 }, // 0x65 'e' 134 | { 563, 4, 10, 5, 1, -9 }, // 0x66 'f' 135 | { 568, 7, 9, 9, 1, -6 }, // 0x67 'g' 136 | { 576, 6, 10, 9, 1, -9 }, // 0x68 'h' 137 | { 584, 1, 10, 3, 1, -9 }, // 0x69 'i' 138 | { 586, 2, 12, 3, 0, -9 }, // 0x6A 'j' 139 | { 589, 6, 10, 8, 1, -9 }, // 0x6B 'k' 140 | { 597, 1, 10, 3, 1, -9 }, // 0x6C 'l' 141 | { 599, 11, 7, 13, 1, -6 }, // 0x6D 'm' 142 | { 609, 6, 7, 9, 1, -6 }, // 0x6E 'n' 143 | { 615, 7, 7, 9, 1, -6 }, // 0x6F 'o' 144 | { 622, 7, 9, 9, 1, -6 }, // 0x70 'p' 145 | { 630, 7, 9, 9, 1, -6 }, // 0x71 'q' 146 | { 638, 4, 7, 6, 1, -6 }, // 0x72 'r' 147 | { 642, 5, 7, 7, 1, -6 }, // 0x73 's' 148 | { 647, 4, 9, 6, 1, -8 }, // 0x74 't' 149 | { 652, 6, 7, 9, 1, -6 }, // 0x75 'u' 150 | { 658, 7, 7, 8, 1, -6 }, // 0x76 'v' 151 | { 665, 10, 7, 12, 1, -6 }, // 0x77 'w' 152 | { 674, 6, 7, 8, 1, -6 }, // 0x78 'x' 153 | { 680, 7, 9, 8, 1, -6 }, // 0x79 'y' 154 | { 688, 6, 7, 8, 1, -6 }, // 0x7A 'z' 155 | { 694, 5, 12, 7, 1, -9 }, // 0x7B '{' 156 | { 702, 2, 13, 4, 1, -10 }, // 0x7C '|' 157 | { 706, 5, 12, 7, 1, -9 }, // 0x7D '}' 158 | { 714, 4, 2, 6, 1, -4 } }; // 0x7E '~' 159 | 160 | const GFXfont GothamLight7pt7b PROGMEM = { 161 | (uint8_t *)GothamLight7pt7bBitmaps, 162 | (GFXglyph *)GothamLight7pt7bGlyphs, 163 | 0x20, 0x7E, 13 }; 164 | 165 | // Approx. 1387 bytes 166 | -------------------------------------------------------------------------------- /src/Fonts/GothamLight_9.h: -------------------------------------------------------------------------------- 1 | const uint8_t GothamLight9pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0x98, 0x4A, 0x63, 0x29, 0x00, 0x18, 0x82, 0x10, 0x42, 0x08, 0x47, 3 | 0xFE, 0x22, 0x04, 0x41, 0x08, 0x21, 0x1F, 0xF8, 0x88, 0x11, 0x04, 0x20, 4 | 0x08, 0x1F, 0x1A, 0x49, 0x18, 0x82, 0x41, 0xA0, 0x38, 0x0B, 0x04, 0x42, 5 | 0x31, 0x16, 0x91, 0xF0, 0x20, 0x10, 0x70, 0x36, 0x42, 0x22, 0x11, 0x09, 6 | 0x08, 0x90, 0x64, 0x81, 0xC8, 0x00, 0x8E, 0x08, 0x90, 0x48, 0x44, 0x42, 7 | 0x41, 0x26, 0x0F, 0x00, 0x1E, 0x04, 0x40, 0x84, 0x10, 0x82, 0x20, 0x28, 8 | 0x0A, 0x12, 0x22, 0x82, 0x50, 0x32, 0x06, 0x21, 0x23, 0xC2, 0x5A, 0x80, 9 | 0x0C, 0x42, 0x08, 0x41, 0x08, 0x20, 0x82, 0x04, 0x10, 0x20, 0x81, 0x03, 10 | 0x83, 0x08, 0x20, 0x84, 0x21, 0x08, 0x42, 0x11, 0x11, 0x90, 0x25, 0x5C, 11 | 0xEA, 0x90, 0x08, 0x04, 0x02, 0x01, 0x0F, 0xF8, 0x40, 0x20, 0x10, 0x08, 12 | 0x00, 0xF6, 0xF8, 0xF0, 0x00, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 13 | 0x10, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x1F, 0x06, 14 | 0x31, 0x03, 0x20, 0x28, 0x05, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x48, 0x09, 15 | 0x03, 0x18, 0xC1, 0xE0, 0x74, 0x92, 0x49, 0x24, 0x92, 0x3E, 0x63, 0x81, 16 | 0x01, 0x01, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0xFF, 0x7F, 0x80, 17 | 0x80, 0x80, 0x80, 0x80, 0x40, 0x78, 0x06, 0x01, 0x80, 0x60, 0x68, 0x63, 18 | 0xE0, 0x01, 0x00, 0xC0, 0x50, 0x24, 0x09, 0x04, 0x42, 0x11, 0x04, 0x81, 19 | 0x3F, 0xF0, 0x10, 0x04, 0x01, 0x00, 0x7F, 0x20, 0x10, 0x08, 0x04, 0x03, 20 | 0xF1, 0x0C, 0x03, 0x00, 0x80, 0x60, 0x6C, 0x63, 0xE0, 0x1E, 0x10, 0xD0, 21 | 0x08, 0x08, 0x04, 0xF2, 0x87, 0x81, 0xC0, 0xE0, 0x50, 0x24, 0x21, 0xE0, 22 | 0xFF, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 23 | 0x02, 0x02, 0x00, 0x3E, 0x30, 0x90, 0x30, 0x14, 0x0B, 0x08, 0x78, 0xC2, 24 | 0x80, 0xC0, 0x60, 0x28, 0x33, 0xE0, 0x3E, 0x30, 0x90, 0x30, 0x18, 0x0E, 25 | 0x05, 0x86, 0x7D, 0x00, 0x80, 0x40, 0x58, 0x63, 0xC0, 0xC1, 0x80, 0x50, 26 | 0x01, 0x58, 0x00, 0x81, 0x83, 0x06, 0x0C, 0x03, 0x00, 0x60, 0x0E, 0x00, 27 | 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x60, 0x18, 0x06, 0x01, 0x06, 28 | 0x18, 0x60, 0x80, 0x3C, 0xC2, 0x82, 0x01, 0x01, 0x02, 0x0C, 0x10, 0x10, 29 | 0x10, 0x00, 0x10, 0x10, 0x07, 0xE0, 0x18, 0x18, 0x20, 0x0C, 0x40, 0x04, 30 | 0x43, 0xD2, 0x84, 0x62, 0x88, 0x21, 0x88, 0x21, 0x88, 0x21, 0x88, 0x22, 31 | 0x88, 0x62, 0x87, 0x9C, 0x40, 0x00, 0x20, 0x00, 0x18, 0x18, 0x07, 0xE0, 32 | 0x06, 0x00, 0x60, 0x07, 0x00, 0x90, 0x09, 0x81, 0x08, 0x10, 0x82, 0x04, 33 | 0x20, 0x47, 0xFE, 0x40, 0x2C, 0x01, 0x80, 0x10, 0xFE, 0x20, 0x68, 0x0A, 34 | 0x02, 0x80, 0xA0, 0x4F, 0xE2, 0x06, 0x80, 0x60, 0x18, 0x06, 0x02, 0xFF, 35 | 0x00, 0x0F, 0x81, 0x06, 0x20, 0x34, 0x00, 0x40, 0x08, 0x00, 0x80, 0x08, 36 | 0x00, 0x40, 0x04, 0x00, 0x20, 0x23, 0x07, 0x0F, 0x80, 0xFE, 0x10, 0x32, 37 | 0x02, 0x40, 0x28, 0x05, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x50, 0x0A, 0x02, 38 | 0x40, 0x8F, 0xE0, 0xFF, 0xC0, 0x20, 0x10, 0x08, 0x04, 0x03, 0xFD, 0x00, 39 | 0x80, 0x40, 0x20, 0x10, 0x0F, 0xF8, 0xFF, 0xC0, 0x20, 0x10, 0x08, 0x04, 40 | 0x03, 0xFD, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, 0x0F, 0x83, 0x06, 41 | 0x20, 0x24, 0x00, 0x40, 0x08, 0x00, 0x83, 0xF8, 0x01, 0x40, 0x14, 0x01, 42 | 0x20, 0x13, 0x06, 0x0F, 0x80, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 43 | 0x1F, 0xFE, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x40, 0xFF, 0xF8, 44 | 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x06, 0x0E, 0x27, 0x80, 45 | 0x80, 0xE0, 0x68, 0x32, 0x08, 0x84, 0x22, 0x09, 0x82, 0x90, 0xC6, 0x20, 46 | 0xC8, 0x12, 0x02, 0x80, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 47 | 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x1C, 0x03, 0xC0, 0x5A, 0x05, 48 | 0x90, 0x99, 0x11, 0x89, 0x18, 0x61, 0x84, 0x18, 0x01, 0x80, 0x18, 0x01, 49 | 0x80, 0x10, 0x80, 0x70, 0x1A, 0x06, 0x81, 0x90, 0x62, 0x18, 0x46, 0x19, 50 | 0x82, 0x60, 0x58, 0x0E, 0x03, 0x80, 0x40, 0x0F, 0x80, 0x83, 0x08, 0x0C, 51 | 0x80, 0x24, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x40, 0x0A, 0x00, 0x88, 52 | 0x0C, 0x20, 0xC0, 0xF8, 0x00, 0xFE, 0x40, 0xA0, 0x30, 0x18, 0x0C, 0x06, 53 | 0x05, 0xFC, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, 0x0F, 0x80, 0x83, 0x08, 54 | 0x0C, 0x80, 0x24, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x40, 0x8A, 0x06, 55 | 0x88, 0x0C, 0x20, 0xE0, 0xF8, 0x80, 0xFF, 0x20, 0x68, 0x0A, 0x01, 0x80, 56 | 0x60, 0x28, 0x1B, 0xF8, 0x86, 0x20, 0x88, 0x12, 0x02, 0x80, 0x40, 0x3E, 57 | 0x30, 0xD0, 0x08, 0x04, 0x03, 0x00, 0x78, 0x02, 0x00, 0x80, 0x60, 0x2C, 58 | 0x31, 0xE0, 0xFF, 0xC2, 0x00, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 59 | 0x08, 0x02, 0x00, 0x80, 0x20, 0x08, 0x00, 0x80, 0x60, 0x18, 0x06, 0x01, 60 | 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x1C, 0x09, 0x86, 0x3E, 0x00, 61 | 0x80, 0x38, 0x02, 0x40, 0x24, 0x04, 0x20, 0x42, 0x08, 0x10, 0x81, 0x08, 62 | 0x11, 0x00, 0x90, 0x0A, 0x00, 0x60, 0x04, 0x00, 0x80, 0x80, 0x60, 0x30, 63 | 0x24, 0x0C, 0x09, 0x05, 0x02, 0x41, 0x21, 0x08, 0x48, 0x42, 0x22, 0x10, 64 | 0x48, 0x48, 0x12, 0x12, 0x05, 0x04, 0x80, 0xC0, 0xC0, 0x30, 0x30, 0x08, 65 | 0x0C, 0x00, 0xC0, 0x68, 0x08, 0x82, 0x08, 0x80, 0xA0, 0x14, 0x01, 0x00, 66 | 0x50, 0x11, 0x02, 0x20, 0x82, 0x20, 0x28, 0x02, 0x80, 0x28, 0x09, 0x01, 67 | 0x10, 0x41, 0x10, 0x26, 0x02, 0x80, 0x20, 0x04, 0x00, 0x80, 0x10, 0x02, 68 | 0x00, 0x40, 0x7F, 0xC0, 0x20, 0x08, 0x04, 0x02, 0x01, 0x00, 0x40, 0x20, 69 | 0x10, 0x08, 0x02, 0x01, 0x00, 0xFF, 0xC0, 0xFC, 0x21, 0x08, 0x42, 0x10, 70 | 0x84, 0x21, 0x08, 0x43, 0xE0, 0x80, 0x20, 0x10, 0x04, 0x02, 0x00, 0x80, 71 | 0x40, 0x10, 0x08, 0x02, 0x01, 0x00, 0x40, 0x20, 0x08, 0x02, 0x01, 0xF8, 72 | 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0x87, 0xE0, 0x10, 0x51, 0x16, 73 | 0x30, 0xFF, 0xE0, 0x8C, 0x3C, 0x42, 0x01, 0x3F, 0xC1, 0x81, 0x81, 0xC3, 74 | 0x7D, 0x80, 0x40, 0x20, 0x10, 0x0B, 0xC6, 0x1A, 0x05, 0x01, 0x80, 0xC0, 75 | 0x60, 0x58, 0x6B, 0xC0, 0x1E, 0x61, 0x41, 0x80, 0x80, 0x80, 0x41, 0x61, 76 | 0x1E, 0x00, 0x80, 0x40, 0x20, 0x13, 0xEB, 0x0D, 0x03, 0x01, 0x80, 0xC0, 77 | 0x50, 0x2C, 0x33, 0xE8, 0x3C, 0x31, 0xA0, 0x50, 0x2F, 0xFC, 0x03, 0x00, 78 | 0xC2, 0x3E, 0x00, 0x39, 0x10, 0x8F, 0xA1, 0x08, 0x42, 0x10, 0x84, 0x00, 79 | 0x3E, 0xB0, 0xE0, 0x30, 0x18, 0x0C, 0x05, 0x86, 0x7D, 0x00, 0x80, 0x70, 80 | 0x47, 0xC0, 0x80, 0x80, 0x80, 0x80, 0xBC, 0xC2, 0x82, 0x81, 0x81, 0x81, 81 | 0x81, 0x81, 0x81, 0x8F, 0xF8, 0x20, 0x02, 0x49, 0x24, 0x92, 0x4E, 0x80, 82 | 0x80, 0x80, 0x80, 0x82, 0x84, 0x88, 0x90, 0xB0, 0xC8, 0x88, 0x84, 0x83, 83 | 0xFF, 0xF8, 0xB8, 0xF3, 0x14, 0x28, 0x20, 0xA0, 0x81, 0x82, 0x06, 0x08, 84 | 0x18, 0x20, 0x60, 0x81, 0x82, 0x04, 0xBC, 0xC2, 0x82, 0x81, 0x81, 0x81, 85 | 0x81, 0x81, 0x81, 0x1E, 0x30, 0x90, 0x30, 0x18, 0x0C, 0x05, 0x02, 0xC2, 86 | 0x1E, 0x00, 0xBC, 0x61, 0xA0, 0x50, 0x18, 0x0C, 0x06, 0x05, 0x86, 0xBC, 87 | 0x40, 0x20, 0x10, 0x00, 0x3E, 0xB0, 0xD0, 0x30, 0x18, 0x0C, 0x05, 0x02, 88 | 0xC3, 0x3E, 0x80, 0x40, 0x20, 0x10, 0x9F, 0x21, 0x08, 0x42, 0x10, 0x80, 89 | 0x78, 0x8E, 0x02, 0x03, 0x80, 0xC0, 0xE3, 0x3C, 0x42, 0x11, 0xF4, 0x21, 90 | 0x08, 0x42, 0x10, 0x70, 0x02, 0x04, 0x08, 0x10, 0x30, 0x60, 0xC3, 0x7A, 91 | 0x80, 0xC0, 0x90, 0x48, 0x42, 0x21, 0x20, 0x50, 0x30, 0x08, 0x00, 0x82, 92 | 0x0E, 0x0C, 0x24, 0x50, 0x91, 0x44, 0x44, 0x90, 0xA2, 0x42, 0x8A, 0x06, 93 | 0x18, 0x10, 0x40, 0x81, 0x42, 0x24, 0x18, 0x08, 0x14, 0x24, 0x42, 0x81, 94 | 0x80, 0xC0, 0x90, 0x48, 0x42, 0x21, 0x10, 0x50, 0x28, 0x08, 0x04, 0x04, 95 | 0x1C, 0x00, 0xFF, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x40, 0xFF, 0x06, 96 | 0x30, 0x40, 0x81, 0x02, 0x08, 0x60, 0x20, 0x20, 0x40, 0x81, 0x02, 0x06, 97 | 0x03, 0xFF, 0xFF, 0xC0, 0x40, 0x40, 0x81, 0x02, 0x04, 0x07, 0x08, 0x20, 98 | 0x40, 0x81, 0x02, 0x08, 0x60, 0x66, 0x60 }; 99 | 100 | const GFXglyph GothamLight9pt7bGlyphs[] PROGMEM = { 101 | { 0, 0, 0, 5, 0, 1 }, // 0x20 ' ' 102 | { 0, 1, 13, 5, 2, -12 }, // 0x21 '!' 103 | { 2, 5, 5, 7, 1, -12 }, // 0x22 '"' 104 | { 6, 11, 13, 13, 1, -12 }, // 0x23 '#' 105 | { 24, 9, 16, 11, 1, -13 }, // 0x24 '$' 106 | { 42, 13, 13, 15, 1, -12 }, // 0x25 '%' 107 | { 64, 11, 13, 13, 1, -12 }, // 0x26 '&' 108 | { 82, 2, 5, 4, 1, -12 }, // 0x27 ''' 109 | { 84, 6, 16, 8, 1, -12 }, // 0x28 '(' 110 | { 96, 5, 16, 8, 1, -12 }, // 0x29 ')' 111 | { 106, 5, 6, 8, 1, -12 }, // 0x2A '*' 112 | { 110, 9, 9, 12, 1, -10 }, // 0x2B '+' 113 | { 121, 2, 4, 4, 1, -1 }, // 0x2C ',' 114 | { 122, 5, 1, 7, 1, -5 }, // 0x2D '-' 115 | { 123, 2, 2, 4, 1, -1 }, // 0x2E '.' 116 | { 124, 9, 16, 9, 0, -13 }, // 0x2F '/' 117 | { 142, 11, 13, 13, 1, -12 }, // 0x30 '0' 118 | { 160, 3, 13, 6, 1, -12 }, // 0x31 '1' 119 | { 165, 8, 13, 11, 1, -12 }, // 0x32 '2' 120 | { 178, 9, 13, 11, 1, -12 }, // 0x33 '3' 121 | { 193, 10, 13, 12, 1, -12 }, // 0x34 '4' 122 | { 210, 9, 13, 11, 1, -12 }, // 0x35 '5' 123 | { 225, 9, 13, 12, 1, -12 }, // 0x36 '6' 124 | { 240, 9, 13, 11, 1, -12 }, // 0x37 '7' 125 | { 255, 9, 13, 11, 1, -12 }, // 0x38 '8' 126 | { 270, 9, 13, 12, 1, -12 }, // 0x39 '9' 127 | { 285, 1, 9, 4, 2, -8 }, // 0x3A ':' 128 | { 287, 2, 11, 4, 1, -8 }, // 0x3B ';' 129 | { 290, 9, 9, 12, 1, -10 }, // 0x3C '<' 130 | { 301, 8, 5, 12, 2, -8 }, // 0x3D '=' 131 | { 306, 8, 9, 12, 2, -10 }, // 0x3E '>' 132 | { 315, 8, 13, 10, 1, -12 }, // 0x3F '?' 133 | { 328, 16, 16, 18, 1, -12 }, // 0x40 '@' 134 | { 360, 12, 13, 14, 1, -12 }, // 0x41 'A' 135 | { 380, 10, 13, 13, 2, -12 }, // 0x42 'B' 136 | { 397, 12, 13, 13, 1, -12 }, // 0x43 'C' 137 | { 417, 11, 13, 14, 2, -12 }, // 0x44 'D' 138 | { 435, 9, 13, 12, 2, -12 }, // 0x45 'E' 139 | { 450, 9, 13, 12, 2, -12 }, // 0x46 'F' 140 | { 465, 12, 13, 14, 1, -12 }, // 0x47 'G' 141 | { 485, 10, 13, 14, 2, -12 }, // 0x48 'H' 142 | { 502, 1, 13, 5, 2, -12 }, // 0x49 'I' 143 | { 504, 7, 13, 10, 1, -12 }, // 0x4A 'J' 144 | { 516, 10, 13, 13, 2, -12 }, // 0x4B 'K' 145 | { 533, 8, 13, 11, 2, -12 }, // 0x4C 'L' 146 | { 546, 12, 13, 16, 2, -12 }, // 0x4D 'M' 147 | { 566, 10, 13, 14, 2, -12 }, // 0x4E 'N' 148 | { 583, 13, 13, 15, 1, -12 }, // 0x4F 'O' 149 | { 605, 9, 13, 12, 2, -12 }, // 0x50 'P' 150 | { 620, 13, 13, 15, 1, -12 }, // 0x51 'Q' 151 | { 642, 10, 13, 13, 2, -12 }, // 0x52 'R' 152 | { 659, 9, 13, 12, 1, -12 }, // 0x53 'S' 153 | { 674, 10, 13, 12, 1, -12 }, // 0x54 'T' 154 | { 691, 10, 13, 14, 2, -12 }, // 0x55 'U' 155 | { 708, 12, 13, 14, 1, -12 }, // 0x56 'V' 156 | { 728, 18, 13, 20, 1, -12 }, // 0x57 'W' 157 | { 758, 11, 13, 13, 1, -12 }, // 0x58 'X' 158 | { 776, 11, 13, 13, 1, -12 }, // 0x59 'Y' 159 | { 794, 10, 13, 12, 1, -12 }, // 0x5A 'Z' 160 | { 811, 5, 15, 8, 2, -12 }, // 0x5B '[' 161 | { 821, 9, 16, 9, 0, -13 }, // 0x5C '\' 162 | { 839, 5, 15, 8, 1, -12 }, // 0x5D ']' 163 | { 849, 7, 4, 9, 1, -12 }, // 0x5E '^' 164 | { 853, 11, 1, 11, 0, 3 }, // 0x5F '_' 165 | { 855, 3, 2, 9, 3, -12 }, // 0x60 '`' 166 | { 856, 8, 9, 10, 1, -8 }, // 0x61 'a' 167 | { 865, 9, 13, 12, 2, -12 }, // 0x62 'b' 168 | { 880, 8, 9, 10, 1, -8 }, // 0x63 'c' 169 | { 889, 9, 13, 12, 1, -12 }, // 0x64 'd' 170 | { 904, 9, 9, 11, 1, -8 }, // 0x65 'e' 171 | { 915, 5, 13, 7, 1, -12 }, // 0x66 'f' 172 | { 924, 9, 12, 12, 1, -8 }, // 0x67 'g' 173 | { 938, 8, 13, 11, 2, -12 }, // 0x68 'h' 174 | { 951, 1, 13, 4, 2, -12 }, // 0x69 'i' 175 | { 953, 3, 16, 4, 0, -12 }, // 0x6A 'j' 176 | { 959, 8, 13, 10, 2, -12 }, // 0x6B 'k' 177 | { 972, 1, 13, 4, 2, -12 }, // 0x6C 'l' 178 | { 974, 14, 9, 17, 2, -8 }, // 0x6D 'm' 179 | { 990, 8, 9, 11, 2, -8 }, // 0x6E 'n' 180 | { 999, 9, 9, 12, 1, -8 }, // 0x6F 'o' 181 | { 1010, 9, 12, 12, 2, -8 }, // 0x70 'p' 182 | { 1024, 9, 12, 12, 1, -8 }, // 0x71 'q' 183 | { 1038, 5, 9, 7, 2, -8 }, // 0x72 'r' 184 | { 1044, 7, 9, 9, 1, -8 }, // 0x73 's' 185 | { 1052, 5, 12, 7, 1, -11 }, // 0x74 't' 186 | { 1060, 7, 9, 11, 2, -8 }, // 0x75 'u' 187 | { 1068, 9, 9, 10, 1, -8 }, // 0x76 'v' 188 | { 1079, 14, 9, 16, 1, -8 }, // 0x77 'w' 189 | { 1095, 8, 9, 10, 1, -8 }, // 0x78 'x' 190 | { 1104, 9, 12, 11, 1, -8 }, // 0x79 'y' 191 | { 1118, 8, 9, 10, 1, -8 }, // 0x7A 'z' 192 | { 1127, 7, 16, 9, 1, -12 }, // 0x7B '{' 193 | { 1141, 1, 16, 5, 2, -13 }, // 0x7C '|' 194 | { 1143, 7, 16, 9, 1, -12 }, // 0x7D '}' 195 | { 1157, 6, 2, 8, 1, -5 } }; // 0x7E '~' 196 | 197 | const GFXfont GothamLight9pt7b PROGMEM = { 198 | (uint8_t *)GothamLight9pt7bBitmaps, 199 | (GFXglyph *)GothamLight9pt7bGlyphs, 200 | 0x20, 0x7E, 17 }; 201 | 202 | // Approx. 1831 bytes 203 | -------------------------------------------------------------------------------- /src/Free_Fonts.h: -------------------------------------------------------------------------------- 1 | // Attach this header file to your sketch to use the GFX Free Fonts. You can write 2 | // sketches without it, but it makes referencing them easier. 3 | 4 | // This calls up ALL the fonts but they only get loaded if you actually 5 | // use them in your sketch. 6 | // 7 | // No changes are needed to this header file unless new fonts are added to the 8 | // library "Fonts/GFXFF" folder. 9 | // 10 | // To save a lot of typing long names, each font can easily be referenced in the 11 | // sketch in three ways, either with: 12 | // 13 | // 1. Font file name with the & in front such as &FreeSansBoldOblique24pt7b 14 | // an example being: 15 | // 16 | // tft.setFreeFont(&FreeSansBoldOblique24pt7b); 17 | // 18 | // 2. FF# where # is a number determined by looking at the list below 19 | // an example being: 20 | // 21 | // tft.setFreeFont(FF32); 22 | // 23 | // 3. An abbreviation of the file name. Look at the list below to see 24 | // the abbreviations used, for example: 25 | // 26 | // tft.setFreeFont(FSSBO24) 27 | // 28 | // Where the letters mean: 29 | // F = Free font 30 | // M = Mono 31 | // SS = Sans Serif (double S to distinguish is form serif fonts) 32 | // S = Serif 33 | // B = Bold 34 | // O = Oblique (letter O not zero) 35 | // I = Italic 36 | // # = point size, either 9, 12, 18 or 24 37 | // 38 | // Setting the font to NULL will select the GLCD font: 39 | // 40 | // tft.setFreeFont(NULL); // Set font to GLCD 41 | 42 | #ifdef LOAD_GFXFF // Only include the fonts if LOAD_GFXFF is defined in User_Setup.h 43 | 44 | // Use these when printing or drawing text in GLCD and high rendering speed fonts 45 | #define GFXFF 1 46 | #define GLCD 0 47 | #define FONT2 2 48 | #define FONT4 4 49 | #define FONT6 6 50 | #define FONT7 7 51 | #define FONT8 8 52 | 53 | // Use the following when calling setFont() 54 | // 55 | // Reserved for GLCD font // FF0 56 | // 57 | 58 | #define TT1 &TomThumb 59 | 60 | #define FM9 &FreeMono9pt7b 61 | #define FM12 &FreeMono12pt7b 62 | #define FM18 &FreeMono18pt7b 63 | #define FM24 &FreeMono24pt7b 64 | 65 | #define FMB9 &FreeMonoBold9pt7b 66 | #define FMB12 &FreeMonoBold12pt7b 67 | #define FMB18 &FreeMonoBold18pt7b 68 | #define FMB24 &FreeMonoBold24pt7b 69 | 70 | #define FMO9 &FreeMonoOblique9pt7b 71 | #define FMO12 &FreeMonoOblique12pt7b 72 | #define FMO18 &FreeMonoOblique18pt7b 73 | #define FMO24 &FreeMonoOblique24pt7b 74 | 75 | #define FMBO9 &FreeMonoBoldOblique9pt7b 76 | #define FMBO12 &FreeMonoBoldOblique12pt7b 77 | #define FMBO18 &FreeMonoBoldOblique18pt7b 78 | #define FMBO24 &FreeMonoBoldOblique24pt7b 79 | 80 | #define FSS9 &FreeSans9pt7b 81 | #define FSS12 &FreeSans12pt7b 82 | #define FSS18 &FreeSans18pt7b 83 | #define FSS24 &FreeSans24pt7b 84 | 85 | #define FSSB9 &FreeSansBold9pt7b 86 | #define FSSB12 &FreeSansBold12pt7b 87 | #define FSSB18 &FreeSansBold18pt7b 88 | #define FSSB24 &FreeSansBold24pt7b 89 | 90 | #define FSSO9 &FreeSansOblique9pt7b 91 | #define FSSO12 &FreeSansOblique12pt7b 92 | #define FSSO18 &FreeSansOblique18pt7b 93 | #define FSSO24 &FreeSansOblique24pt7b 94 | 95 | #define FSSBO9 &FreeSansBoldOblique9pt7b 96 | #define FSSBO12 &FreeSansBoldOblique12pt7b 97 | #define FSSBO18 &FreeSansBoldOblique18pt7b 98 | #define FSSBO24 &FreeSansBoldOblique24pt7b 99 | 100 | #define FS9 &FreeSerif9pt7b 101 | #define FS12 &FreeSerif12pt7b 102 | #define FS18 &FreeSerif18pt7b 103 | #define FS24 &FreeSerif24pt7b 104 | 105 | #define FSI9 &FreeSerifItalic9pt7b 106 | #define FSI12 &FreeSerifItalic12pt7b 107 | #define FSI19 &FreeSerifItalic18pt7b 108 | #define FSI24 &FreeSerifItalic24pt7b 109 | 110 | #define FSB9 &FreeSerifBold9pt7b 111 | #define FSB12 &FreeSerifBold12pt7b 112 | #define FSB18 &FreeSerifBold18pt7b 113 | #define FSB24 &FreeSerifBold24pt7b 114 | 115 | #define FSBI9 &FreeSerifBoldItalic9pt7b 116 | #define FSBI12 &FreeSerifBoldItalic12pt7b 117 | #define FSBI18 &FreeSerifBoldItalic18pt7b 118 | #define FSBI24 &FreeSerifBoldItalic24pt7b 119 | 120 | #define FF0 NULL //ff0 reserved for GLCD 121 | #define FF1 &FreeMono9pt7b 122 | #define FF2 &FreeMono12pt7b 123 | #define FF3 &FreeMono18pt7b 124 | #define FF4 &FreeMono24pt7b 125 | 126 | #define FF5 &FreeMonoBold9pt7b 127 | #define FF6 &FreeMonoBold12pt7b 128 | #define FF7 &FreeMonoBold18pt7b 129 | #define FF8 &FreeMonoBold24pt7b 130 | 131 | #define FF9 &FreeMonoOblique9pt7b 132 | #define FF10 &FreeMonoOblique12pt7b 133 | #define FF11 &FreeMonoOblique18pt7b 134 | #define FF12 &FreeMonoOblique24pt7b 135 | 136 | #define FF13 &FreeMonoBoldOblique9pt7b 137 | #define FF14 &FreeMonoBoldOblique12pt7b 138 | #define FF15 &FreeMonoBoldOblique18pt7b 139 | #define FF16 &FreeMonoBoldOblique24pt7b 140 | 141 | #define FF17 &FreeSans9pt7b 142 | #define FF18 &FreeSans12pt7b 143 | #define FF19 &FreeSans18pt7b 144 | #define FF20 &FreeSans24pt7b 145 | 146 | #define FF21 &FreeSansBold9pt7b 147 | #define FF22 &FreeSansBold12pt7b 148 | #define FF23 &FreeSansBold18pt7b 149 | #define FF24 &FreeSansBold24pt7b 150 | 151 | #define FF25 &FreeSansOblique9pt7b 152 | #define FF26 &FreeSansOblique12pt7b 153 | #define FF27 &FreeSansOblique18pt7b 154 | #define FF28 &FreeSansOblique24pt7b 155 | 156 | #define FF29 &FreeSansBoldOblique9pt7b 157 | #define FF30 &FreeSansBoldOblique12pt7b 158 | #define FF31 &FreeSansBoldOblique18pt7b 159 | #define FF32 &FreeSansBoldOblique24pt7b 160 | 161 | #define FF33 &FreeSerif9pt7b 162 | #define FF34 &FreeSerif12pt7b 163 | #define FF35 &FreeSerif18pt7b 164 | #define FF36 &FreeSerif24pt7b 165 | 166 | #define FF37 &FreeSerifItalic9pt7b 167 | #define FF38 &FreeSerifItalic12pt7b 168 | #define FF39 &FreeSerifItalic18pt7b 169 | #define FF40 &FreeSerifItalic24pt7b 170 | 171 | #define FF41 &FreeSerifBold9pt7b 172 | #define FF42 &FreeSerifBold12pt7b 173 | #define FF43 &FreeSerifBold18pt7b 174 | #define FF44 &FreeSerifBold24pt7b 175 | 176 | #define FF45 &FreeSerifBoldItalic9pt7b 177 | #define FF46 &FreeSerifBoldItalic12pt7b 178 | #define FF47 &FreeSerifBoldItalic18pt7b 179 | #define FF48 &FreeSerifBoldItalic24pt7b 180 | 181 | // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 182 | // Now we define "s"tring versions for easy printing of the font name so: 183 | // tft.println(sFF5); 184 | // will print 185 | // Mono bold 9 186 | // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 187 | 188 | #define sFF0 "GLCD" 189 | #define sTT1 "Tom Thumb" 190 | #define sFF1 "Mono 9" 191 | #define sFF2 "Mono 12" 192 | #define sFF3 "Mono 18" 193 | #define sFF4 "Mono 24" 194 | 195 | #define sFF5 "Mono bold 9" 196 | #define sFF6 "Mono bold 12" 197 | #define sFF7 "Mono bold 18" 198 | #define sFF8 "Mono bold 24" 199 | 200 | #define sFF9 "Mono oblique 9" 201 | #define sFF10 "Mono oblique 12" 202 | #define sFF11 "Mono oblique 18" 203 | #define sFF12 "Mono oblique 24" 204 | 205 | #define sFF13 "Mono bold oblique 9" 206 | #define sFF14 "Mono bold oblique 12" 207 | #define sFF15 "Mono bold oblique 18" 208 | #define sFF16 "Mono bold obl. 24" // Full text line is too big for 480 pixel wide screen 209 | 210 | #define sFF17 "Sans 9" 211 | #define sFF18 "Sans 12" 212 | #define sFF19 "Sans 18" 213 | #define sFF20 "Sans 24" 214 | 215 | #define sFF21 "Sans bold 9" 216 | #define sFF22 "Sans bold 12" 217 | #define sFF23 "Sans bold 18" 218 | #define sFF24 "Sans bold 24" 219 | 220 | #define sFF25 "Sans oblique 9" 221 | #define sFF26 "Sans oblique 12" 222 | #define sFF27 "Sans oblique 18" 223 | #define sFF28 "Sans oblique 24" 224 | 225 | #define sFF29 "Sans bold oblique 9" 226 | #define sFF30 "Sans bold oblique 12" 227 | #define sFF31 "Sans bold oblique 18" 228 | #define sFF32 "Sans bold oblique 24" 229 | 230 | #define sFF33 "Serif 9" 231 | #define sFF34 "Serif 12" 232 | #define sFF35 "Serif 18" 233 | #define sFF36 "Serif 24" 234 | 235 | #define sFF37 "Serif italic 9" 236 | #define sFF38 "Serif italic 12" 237 | #define sFF39 "Serif italic 18" 238 | #define sFF40 "Serif italic 24" 239 | 240 | #define sFF41 "Serif bold 9" 241 | #define sFF42 "Serif bold 12" 242 | #define sFF43 "Serif bold 18" 243 | #define sFF44 "Serif bold 24" 244 | 245 | #define sFF45 "Serif bold italic 9" 246 | #define sFF46 "Serif bold italic 12" 247 | #define sFF47 "Serif bold italic 18" 248 | #define sFF48 "Serif bold italic 24" 249 | 250 | #else // LOAD_GFXFF not defined so setup defaults to prevent error messages 251 | 252 | // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 253 | // Free fonts are not loaded in User_Setup.h so we must define all as font 1 254 | // to prevent compile error messages 255 | // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 256 | 257 | #define GFXFF 1 258 | #define GLCD 1 259 | #define FONT2 2 260 | #define FONT4 4 261 | #define FONT6 6 262 | #define FONT7 7 263 | #define FONT8 8 264 | 265 | #define TT1 1 266 | 267 | #define FF0 1 268 | #define FF1 1 269 | #define FF2 1 270 | #define FF3 1 271 | #define FF4 1 272 | #define FF5 1 273 | #define FF6 1 274 | #define FF7 1 275 | #define FF8 1 276 | #define FF9 1 277 | #define FF10 1 278 | #define FF11 1 279 | #define FF12 1 280 | #define FF13 1 281 | #define FF14 1 282 | #define FF15 1 283 | #define FF16 1 284 | #define FF17 1 285 | #define FF18 1 286 | #define FF19 1 287 | #define FF20 1 288 | #define FF21 1 289 | #define FF22 1 290 | #define FF23 1 291 | #define FF24 1 292 | #define FF25 1 293 | #define FF26 1 294 | #define FF27 1 295 | #define FF28 1 296 | #define FF29 1 297 | #define FF30 1 298 | #define FF31 1 299 | #define FF32 1 300 | #define FF33 1 301 | #define FF34 1 302 | #define FF35 1 303 | #define FF36 1 304 | #define FF37 1 305 | #define FF38 1 306 | #define FF39 1 307 | #define FF40 1 308 | #define FF41 1 309 | #define FF42 1 310 | #define FF43 1 311 | #define FF44 1 312 | #define FF45 1 313 | #define FF46 1 314 | #define FF47 1 315 | #define FF48 1 316 | 317 | #define FM9 1 318 | #define FM12 1 319 | #define FM18 1 320 | #define FM24 1 321 | 322 | #define FMB9 1 323 | #define FMB12 1 324 | #define FMB18 1 325 | #define FMB24 1 326 | 327 | #define FMO9 1 328 | #define FMO12 1 329 | #define FMO18 1 330 | #define FMO24 1 331 | 332 | #define FMBO9 1 333 | #define FMBO12 1 334 | #define FMBO18 1 335 | #define FMBO24 1 336 | 337 | #define FSS9 1 338 | #define FSS12 1 339 | #define FSS18 1 340 | #define FSS24 1 341 | 342 | #define FSSB9 1 343 | #define FSSB12 1 344 | #define FSSB18 1 345 | #define FSSB24 1 346 | 347 | #define FSSO9 1 348 | #define FSSO12 1 349 | #define FSSO18 1 350 | #define FSSO24 1 351 | 352 | #define FSSBO9 1 353 | #define FSSBO12 1 354 | #define FSSBO18 1 355 | #define FSSBO24 1 356 | 357 | #define FS9 1 358 | #define FS12 1 359 | #define FS18 1 360 | #define FS24 1 361 | 362 | #define FSI9 1 363 | #define FSI12 1 364 | #define FSI19 1 365 | #define FSI24 1 366 | 367 | #define FSB9 1 368 | #define FSB12 1 369 | #define FSB18 1 370 | #define FSB24 1 371 | 372 | #define FSBI9 1 373 | #define FSBI12 1 374 | #define FSBI18 1 375 | #define FSBI24 1 376 | 377 | #endif // LOAD_GFXFF -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include //https://arduinojson.org/v6/assistant/ 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | 17 | #define LED_ON HIGH 18 | #define LED_OFF LOW 19 | 20 | #ifndef TFT_DISPOFF 21 | #define TFT_DISPOFF 0x28 22 | #endif 23 | 24 | #ifndef TFT_SLPIN 25 | #define TFT_SLPIN 0x10 26 | #endif 27 | 28 | #define TFT_MOSI 19 29 | #define TFT_SCLK 18 30 | #define TFT_CS 5 31 | #define TFT_DC 16 32 | #define TFT_RST 23 33 | 34 | #define TFT_BL 4 // Display backlight control pin 35 | #define ADC_EN 14 36 | #define ADC_PIN 34 37 | #define BUTTON_1 35 38 | #define BUTTON_2 0 39 | 40 | // Supposed dimensions 41 | #define SCREEN_HEIGHT 135 42 | #define SCREEN_WIDTH 240 43 | 44 | struct SENSOR_DATA { 45 | String label; 46 | String value; 47 | String unit; 48 | }; 49 | SENSOR_DATA sensorDataDummyStruct = {}; 50 | 51 | auto evgaMainGif = { EvgaMainGif_0, EvgaMainGif_1, EvgaMainGif_2, EvgaMainGif_3, EvgaMainGif_4, EvgaMainGif_5, EvgaMainGif_6, EvgaMainGif_7, EvgaMainGif_8, EvgaMainGif_9, EvgaMainGif_10, EvgaMainGif_11, EvgaMainGif_12, EvgaMainGif_13, EvgaMainGif_14, EvgaMainGif_15 }; 52 | auto evgaIntroGif = { EvgaIntro_0, EvgaIntro_1, EvgaIntro_2, EvgaIntro_3, EvgaIntro_4, EvgaIntro_5, EvgaIntro_6, EvgaIntro_7, EvgaIntro_8, EvgaIntro_9, EvgaIntro_10, EvgaIntro_11, EvgaIntro_12, EvgaIntro_13, EvgaIntro_14, EvgaIntro_15, EvgaIntro_16, EvgaIntro_17, EvgaIntro_18, EvgaIntro_19, EvgaIntro_20, EvgaIntro_21, EvgaIntro_22 }; 53 | auto nvidiaGif = { NvidiaRtx_0, NvidiaRtx_1, NvidiaRtx_2, NvidiaRtx_3, NvidiaRtx_4, NvidiaRtx_5, NvidiaRtx_6, NvidiaRtx_7, NvidiaRtx_8, NvidiaRtx_9, NvidiaRtx_10, NvidiaRtx_11, NvidiaRtx_12, NvidiaRtx_13 }; 54 | 55 | // Update Status every 1 second 56 | MillisTimer statusTimer = MillisTimer(1000); 57 | // Update Status every 2.5 seconds 58 | MillisTimer gifTimer = MillisTimer(2500); 59 | 60 | TaskHandle_t ReadSerialTask; 61 | 62 | TFT_eSPI tft = TFT_eSPI(SCREEN_HEIGHT, SCREEN_WIDTH); 63 | 64 | const size_t capacity = JSON_ARRAY_SIZE(221) + 221 * JSON_OBJECT_SIZE(6) + 18290; 65 | DynamicJsonDocument doc(capacity); 66 | DynamicJsonDocument docCopy(capacity); 67 | bool firstIteration = true; 68 | bool confirmedSerialConnection = false; 69 | 70 | //////////////////////////////////////////////////////// Function Declerations //////////////////////////////////////////////////////// 71 | 72 | void SetTextDisplayDefaults(); 73 | void DrawIntroLoop(); 74 | void DrawEVGA(); 75 | void DrawEVGAIntro(); 76 | void DrawNvidia(); 77 | void DrawDisplayEvent(MillisTimer &mt); 78 | void AnimateGifEvent(MillisTimer &mt); 79 | void ReadSerial(void * parameter); 80 | void DrawJsonDataToDisplay(); 81 | void CreateAsyncSerialTask(); 82 | 83 | //////////////////////////////////////////////////////// Setup & Loop //////////////////////////////////////////////////////// 84 | 85 | void setup() 86 | { 87 | 88 | Serial.end(); 89 | Serial.begin(256000); 90 | 91 | SetTextDisplayDefaults(); 92 | 93 | DrawIntroLoop(); 94 | 95 | CreateAsyncSerialTask(); 96 | 97 | while (!confirmedSerialConnection) 98 | { 99 | // Chill out here until we have a verified Serial Connection with the app 100 | DrawIntroLoop(); 101 | } 102 | 103 | tft.fillScreen(TFT_BLACK); 104 | DrawEVGA(); 105 | statusTimer.expiredHandler(DrawDisplayEvent); 106 | statusTimer.start(); 107 | gifTimer.expiredHandler(AnimateGifEvent); 108 | gifTimer.start(); 109 | } 110 | 111 | void loop() 112 | { 113 | statusTimer.run(); 114 | gifTimer.run(); 115 | } 116 | 117 | //////////////////////////////////////////////////////// Functions Implementations //////////////////////////////////////////////////////// 118 | 119 | void SetTextDisplayDefaults() 120 | { 121 | tft.init(); 122 | tft.setRotation(1); 123 | tft.setSwapBytes(true); 124 | tft.fillScreen(TFT_BLACK); 125 | tft.setFreeFont(&GothamBook9pt7b); 126 | tft.setTextColor(TFT_WHITE, TFT_BLACK); 127 | tft.setTextDatum(TL_DATUM); 128 | } 129 | 130 | void CreateAsyncSerialTask() 131 | { 132 | // Set data fetching on Core 0 which leaves UI updates on Core 1 133 | xTaskCreatePinnedToCore( 134 | ReadSerial, /* Function to implement the task */ 135 | "ReadSerialTaskOnCore0", /* Name of the task */ 136 | 10000, /* Stack size in words */ 137 | NULL, /* Task input parameter */ 138 | 0, /* Priority of the task */ 139 | &ReadSerialTask, /* Task handle. */ 140 | 0); /* Core where the task should run */ 141 | } 142 | 143 | void DrawDisplayEvent(MillisTimer &mt) { 144 | DrawJsonDataToDisplay(); 145 | } 146 | 147 | void AnimateGifEvent(MillisTimer &mt) { 148 | DrawEVGA(); 149 | } 150 | 151 | void ReadSerial(void * parameter) 152 | { 153 | while (true) 154 | { 155 | if (Serial.available() > 0) 156 | { 157 | String serialData = Serial.readStringUntil('\n'); 158 | DeserializationError deserializationError = deserializeJson(doc, serialData); 159 | if (deserializationError) 160 | { 161 | // Serial.println("deserialization failed"); 162 | // Serial.println(serialData); 163 | // return; 164 | } 165 | else 166 | { 167 | // Create a copy of the doc object so there is no contention of the same 168 | // object between cores 169 | confirmedSerialConnection = true; 170 | docCopy = doc; 171 | Serial.println(serialData); 172 | } 173 | 174 | } 175 | 176 | // vTaskDelay(250); 177 | } 178 | 179 | } 180 | 181 | void DrawJsonDataToDisplay () 182 | { 183 | size_t sizeOfJsonDoc = docCopy["r"].size(); 184 | 185 | for (int i = 0 ; i < sizeOfJsonDoc ; i++ ) { 186 | 187 | sensorDataDummyStruct = { 188 | docCopy["r"][i]["a"], 189 | docCopy["r"][i]["c"], 190 | docCopy["r"][i]["b"], 191 | }; 192 | 193 | String label = sensorDataDummyStruct.label; 194 | String valueWithUnit = String(sensorDataDummyStruct.value.toInt()) + " " + sensorDataDummyStruct.unit; 195 | tft.setTextPadding(tft.textWidth(valueWithUnit) + 30); 196 | 197 | switch(i) { 198 | case 0: 199 | if (firstIteration) 200 | { 201 | tft.drawString(label, 1, 5); 202 | } 203 | tft.drawString(valueWithUnit, 1, 25); 204 | break; 205 | case 1: 206 | if (firstIteration) 207 | { 208 | tft.drawString(label, 140, 5); 209 | } 210 | tft.drawString(valueWithUnit, 140, 25); 211 | break; 212 | case 2: 213 | if (firstIteration) 214 | { 215 | tft.drawString(label, 1, 45); 216 | } 217 | tft.drawString(valueWithUnit, 1, 65); 218 | break; 219 | case 3: 220 | if (firstIteration) 221 | { 222 | tft.drawString(label, 140, 45); 223 | } 224 | tft.drawString(valueWithUnit, 140, 65); 225 | break; 226 | } 227 | 228 | // This delay is here as you're fighting with the 229 | // display's refresh rate and refershing text too 230 | // quickly causes flickering on the screen. 231 | // Delay time was increased until a majority of 232 | // flickering was no longer observed. 233 | if (!firstIteration) 234 | { 235 | delay(350); 236 | } 237 | } 238 | 239 | if (firstIteration && sizeOfJsonDoc > 0) 240 | { 241 | Serial.println("Finished first iteration"); 242 | firstIteration = false; 243 | } 244 | } 245 | 246 | void DrawIntroLoop() 247 | { 248 | tft.fillScreen(TFT_BLACK); 249 | DrawEVGAIntro(); 250 | tft.fillScreen(TFT_BLACK); 251 | DrawNvidia(); 252 | } 253 | 254 | void DrawEVGA() 255 | { 256 | for (auto it = begin(evgaMainGif); it != end(evgaMainGif); ++it) 257 | { 258 | tft.pushImage(0, SCREEN_HEIGHT - 53, 240, 53, *it); 259 | delay(50); 260 | } 261 | } 262 | 263 | void DrawEVGAIntro() 264 | { 265 | int gifHeight = 113; 266 | int gifWidth = 200; 267 | for (auto it = begin(evgaIntroGif); it != end(evgaIntroGif); ++it) 268 | { 269 | tft.pushImage( ((SCREEN_WIDTH - gifWidth) / 2), ((SCREEN_HEIGHT - gifHeight) / 2), gifWidth, gifHeight, *it); 270 | delay(75); 271 | } 272 | delay(1000); 273 | } 274 | 275 | void DrawNvidia() 276 | { 277 | int counter = 0; 278 | int gifHeight = 63; 279 | int gifWidth = 190; 280 | for (auto it = begin(nvidiaGif); it != end(nvidiaGif); ++it) 281 | { 282 | tft.pushImage( ((SCREEN_WIDTH - gifWidth) / 2), ((SCREEN_HEIGHT - gifHeight) / 2), gifWidth, gifHeight, *it); 283 | if (counter < 6) 284 | { 285 | delay(100); 286 | } 287 | else 288 | { 289 | delay(20); 290 | } 291 | if (counter == 6) 292 | { 293 | delay(1000); 294 | } 295 | if (counter == 13) 296 | { 297 | delay(2000); 298 | } 299 | counter++; 300 | } 301 | } -------------------------------------------------------------------------------- /test/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for PlatformIO Unit Testing and project tests. 3 | 4 | Unit Testing is a software testing method by which individual units of 5 | source code, sets of one or more MCU program modules together with associated 6 | control data, usage procedures, and operating procedures, are tested to 7 | determine whether they are fit for use. Unit testing finds problems early 8 | in the development cycle. 9 | 10 | More information about PlatformIO Unit Testing: 11 | - https://docs.platformio.org/page/plus/unit-testing.html 12 | --------------------------------------------------------------------------------