Last active
July 11, 2024 20:09
-
-
Save Spirit532/fd1401601955a15969ff126f1bb5a8c7 to your computer and use it in GitHub Desktop.
Simple ESP8266/Arduino program to fully read and interact with the Inficon BPG400 vacuum gauge via RS232. Uses an SSD1306 128x32 display to show the reading and miscellaneous things, the on-board boot pin button to turn on degassing, and an SPDT switch to change between measurement units.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
BPG-400 gauge reader | |
Copyright 2022 Andrey T. | |
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: | |
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. | |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
*/ | |
#include <Arduino.h> | |
#include "SoftwareSerial.h" | |
#include <Wire.h> | |
#include <Adafruit_GFX.h> | |
#include <Adafruit_SSD1306.h> | |
#include <Fonts/FreeMonoBold12pt7b.h> | |
#include <Fonts/FreeMonoBold9pt7b.h> | |
#include <Fonts/FreeMono9pt7b.h> | |
#include <DejaVu_Sans_Bold_26.h> | |
#include <DejaVu_Sans_9.h> | |
#define SCREEN_WIDTH 128 | |
#define SCREEN_HEIGHT 32 | |
#define MBAR_TO_TORR 0.750061682822611 | |
#define MBAR_TO_PASCAL 100 | |
#define Rx D7 | |
#define Tx D8 | |
#define SW1 D5 | |
#define SW2 D6 | |
SoftwareSerial BPG400; | |
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire); | |
char* float2s(float f, unsigned int digits = 2); | |
enum EmissionBits | |
{ | |
EMISSION_off = 0, // literally just those as numbers in mask 0b00000011 | |
EMISSION_25uA = 1, | |
EMISSION_5mA = 2, | |
EMISSION_degas = 3 | |
}; | |
enum PressureUnit | |
{ | |
PRESSURE_mbar = 0, | |
PRESSURE_torr = 1, | |
PRESSURE_pascal = 2 | |
}; | |
enum ErrorStatus | |
{ | |
ERROR_none = 0, | |
ERROR_pirani_adjustment = 1,//error byte 0b1010000 | |
ERROR_bayard_alpert_failure = 2,//error byte 0b10000000 | |
ERROR_pirani_failure = 3 //error byte 0b10010000 | |
}; | |
struct BPG400PacketUnwrapped | |
{ | |
uint8_t emissionStatus; | |
uint8_t mbarAdjustment; | |
uint8_t toggleBit; | |
uint8_t pressureUnit; | |
uint8_t errorStatus; // error byte | |
float softwareVersion; // version byte divided by 20 | |
} DecodedPacket; | |
uint8_t StartDegas[5] = { 3, 16, 93, 105, 214 }; | |
uint8_t StopDegas[5] = { 3, 16, 93, 105, 214 }; | |
uint8_t SwitchToMbar[5] = { 3, 16, 62, 0, 78 }; | |
uint8_t SwitchToTorr[5] = { 3, 16, 62, 1, 79 }; | |
uint8_t SwitchToPascal[5] = { 3, 16, 62, 2, 80 }; | |
uint8_t invertBlinker = 0; | |
uint16_t degasTimer = 0; | |
uint8_t runDegas; | |
float CurrentPressure = 0; // mbar | |
uint8_t DisplayPressureUnit; | |
uint8_t disp_update; | |
void setup() { | |
Serial.begin(115200); | |
BPG400.begin(9600, SWSERIAL_8N1, Rx, Tx, false, 64, 150); | |
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { | |
Serial.println(F("SSD1306 allocation failed")); | |
for (;;); // Don't proceed, loop forever | |
} | |
Wire.setClock(400000UL); | |
display.clearDisplay(); | |
display.setFont(&FreeMonoBold12pt7b); | |
//display.setTextSize(1); | |
display.setTextColor(SSD1306_WHITE); | |
display.setCursor(0, 15); | |
display.print("BPG400"); | |
display.setFont(&FreeMonoBold9pt7b); | |
display.setCursor(0, 31); | |
display.print("Reader"); | |
display.display(); | |
pinMode(0, INPUT_PULLUP); // Flash button but also degas init | |
pinMode(SW1, INPUT_PULLUP); | |
pinMode(SW2, INPUT_PULLUP); | |
delay(1000); | |
} | |
void loop() { | |
uint8_t barray[9] = { 7, 0, 0, 0, 0, 0, 0, 0, 0 }; | |
uint8_t chkerr = 1; | |
if (digitalRead(SW1) && digitalRead(SW2)) | |
DisplayPressureUnit = PRESSURE_mbar; | |
else if (!digitalRead(SW1)) | |
DisplayPressureUnit = PRESSURE_pascal; | |
else if (!digitalRead(SW2)) | |
DisplayPressureUnit = PRESSURE_torr; | |
if (BPG400.available()) | |
{ | |
if (BPG400.read() == 7) // Wait for magic byte | |
{ | |
BPG400.readBytes(&barray[1], 8); // Eat the packet | |
if (barray[7] == 10) // BPG400 sensor | |
{ | |
uint8_t checksum = barray[1] + barray[2] + barray[3] + barray[4] + barray[5] + barray[6] + barray[7]; // Compute checksum | |
if (barray[8] == checksum) // Valid packet | |
{ | |
chkerr = 0; | |
DecodedPacket.emissionStatus = barray[2] & 0b00000011; // b0+b1 | |
DecodedPacket.mbarAdjustment = barray[2] & 0b00000100; // b2 | |
DecodedPacket.toggleBit = barray[2] & 0b00001000; // b3 | |
DecodedPacket.pressureUnit = barray[2] & 0b00110000; // b4+b5 | |
if (barray[3] == 0b01010000) | |
DecodedPacket.errorStatus = ERROR_pirani_adjustment; | |
else if (barray[3] == 0b10000000) | |
DecodedPacket.errorStatus = ERROR_bayard_alpert_failure; | |
else if (barray[3] == 0b10010000) | |
DecodedPacket.errorStatus = ERROR_pirani_failure; | |
DecodedPacket.softwareVersion = (float)barray[6] / 20; | |
if (DecodedPacket.pressureUnit == PRESSURE_mbar) // It's always going to be mbar but just in case, implement them according to the datasheet | |
CurrentPressure = pow(10, ((barray[4] * 256 + barray[5]) / 4000.0f - 12.5f)); | |
else if (DecodedPacket.pressureUnit == PRESSURE_torr) | |
CurrentPressure = pow(10, ((barray[4] * 256 + barray[5]) / 4000.0f - 12.625f)) * 1.33322368f; // CurrentPressure is always mbar, so convert Torr to mbar | |
else if (DecodedPacket.pressureUnit == PRESSURE_pascal) | |
CurrentPressure = pow(10, ((barray[4] * 256 + barray[5]) / 4000.0f - 10.5f)) * 0.01f; // CurrentPressure is always mbar, so convert Pa to mbar*/ | |
} | |
} | |
} | |
if (!chkerr && disp_update++ > 2) | |
{ | |
disp_update = 0; | |
switch (DisplayPressureUnit) | |
{ | |
case PRESSURE_torr: | |
CurrentPressure *= MBAR_TO_TORR; | |
break; | |
case PRESSURE_pascal: | |
CurrentPressure *= MBAR_TO_PASCAL; | |
break; | |
default: // We're in mbar | |
break; | |
} | |
display.clearDisplay(); | |
if (DecodedPacket.errorStatus == ERROR_pirani_adjustment) | |
{ | |
Serial.print("ERROR:Adjust Pirani\r\n"); | |
display.setFont(&FreeMono9pt7b); | |
display.setCursor(0, 10); | |
display.print("Adjust\nPirani"); | |
display.invertDisplay(invertBlinker); | |
invertBlinker = !invertBlinker; | |
delay(500); | |
} | |
else if (DecodedPacket.errorStatus == ERROR_pirani_failure) | |
{ | |
Serial.print("ERROR:Pirani failure\r\n"); | |
display.setFont(&FreeMono9pt7b); | |
display.setCursor(0, 10); | |
display.print("Pirani\nfailure"); | |
display.invertDisplay(invertBlinker); | |
invertBlinker = !invertBlinker; | |
delay(500); | |
} | |
else if (DecodedPacket.errorStatus == ERROR_bayard_alpert_failure) | |
{ | |
Serial.print("ERROR:BA Failure\r\n"); | |
display.setFont(&FreeMono9pt7b); | |
display.setCursor(0, 10); | |
display.print("BA\nfailure"); | |
display.invertDisplay(invertBlinker); | |
invertBlinker = !invertBlinker; | |
delay(500); | |
} | |
else if (DecodedPacket.emissionStatus == EMISSION_degas) | |
{ | |
Serial.printf("DEGAS IN PROGRESS\r\n"); | |
display.invertDisplay(1); | |
display.setFont(&FreeMono9pt7b); | |
display.setCursor(0, 10); | |
display.print("DEGAS\n"); | |
if (CurrentPressure > 1) // Print the digit | |
display.printf("%d", (int)CurrentPressure); | |
else | |
display.printf("%s", float2s(CurrentPressure, 2)); | |
if (!digitalRead(0)) // Force stop degas | |
{ | |
if (degasTimer++ >= 10) | |
{ | |
BPG400.write(StopDegas, 5); | |
degasTimer = 0; | |
} | |
} | |
} | |
else | |
{ | |
if (!digitalRead(0)) | |
{ | |
display.clearDisplay(); | |
display.setFont(&FreeMono9pt7b); | |
display.setCursor(0, 10); | |
display.setTextColor(SSD1306_WHITE); | |
if (degasTimer < 120) | |
{ | |
display.print("DEGAS? HOLD"); | |
degasTimer += 2; | |
} | |
else | |
{ | |
runDegas = 1; | |
display.print("!!!READY!!!"); | |
} | |
display.drawRect(2, 20, 124, 8, SSD1306_WHITE); | |
display.fillRect(4, 22, degasTimer, 4, SSD1306_WHITE); | |
} | |
else | |
{ | |
if (runDegas) | |
{ | |
Serial.printf("DEGASSING\r\n"); | |
BPG400.write(StartDegas, 5); | |
runDegas = 0; | |
degasTimer = 0; | |
} | |
display.invertDisplay(0); | |
display.setTextColor(SSD1306_WHITE); | |
display.clearDisplay(); | |
display.setFont(&DejaVu_Sans_Bold_26); | |
if (CurrentPressure > 1) // Print the digit | |
{ | |
display.setCursor(DisplayPressureUnit == PRESSURE_pascal ? 0 : 20, 31); | |
display.printf("%d", (int)CurrentPressure); | |
} | |
else | |
{ | |
display.setCursor(0, 31); | |
display.printf("%s", float2s(CurrentPressure, 2)); | |
} | |
display.setFont(&DejaVu_Sans_9); | |
if (DecodedPacket.mbarAdjustment) | |
{ | |
display.setCursor(100, 8); | |
display.write("P.Adj"); | |
display.setCursor(60, 8); | |
} | |
else | |
display.setCursor(90, 8); | |
switch (DisplayPressureUnit) | |
{ | |
case PRESSURE_torr: | |
display.write("Torr"); | |
break; | |
case PRESSURE_pascal: | |
display.write("Pa"); | |
break; | |
default: // We're in mbar | |
display.write("mbar"); | |
break; | |
} | |
display.setCursor(1, 8); | |
if (DecodedPacket.emissionStatus == EMISSION_off) | |
{ | |
display.write("E:OFF"); | |
} | |
else if (DecodedPacket.emissionStatus == EMISSION_25uA) | |
{ | |
display.setTextColor(SSD1306_BLACK); | |
display.fillRoundRect(0, 0, 41, 9, 1, SSD1306_WHITE); | |
display.write("E:25uA"); | |
} | |
else if (DecodedPacket.emissionStatus == EMISSION_5mA) | |
{ | |
display.setTextColor(SSD1306_BLACK); | |
display.fillRoundRect(0, 0, 37, 9, 1, SSD1306_WHITE); | |
display.write("E:5mA"); | |
} | |
} | |
} | |
Serial.printf("%smbar\r\n", float2s(CurrentPressure, 4)); // Always output mbar to avoid logger confusion | |
//Serial.printf("Got data: %d,%d,%d,%d,%d,%d,%d,%d,%d\r\n\r\n", barray[0], barray[1], barray[2], barray[3], barray[4], barray[5], barray[6], barray[7], barray[8]); | |
} | |
} | |
else | |
{ | |
display.setFont(&DejaVu_Sans_9); | |
display.fillRect(74,22, 100, 30, SSD1306_BLACK); | |
display.setCursor(75, 31); | |
display.write("Waiting..."); | |
} | |
display.display(); | |
} | |
unsigned long ipow10(unsigned power) | |
{ | |
const unsigned base = 10; | |
unsigned long retval = 1; | |
for (int i = 0; i < power; i++) { | |
retval *= base; | |
} | |
return retval; | |
} | |
char* float2s(float f, unsigned int digits) | |
{ | |
static char buf[16]; | |
int index = 0; | |
if (f < 0.0) { | |
buf[index++] = '-'; | |
f = -f; | |
} | |
if (isinf(f)) { | |
strcpy(buf + index, "INF"); | |
return buf; | |
} | |
if (isnan(f)) { | |
strcpy(buf + index, "NAN"); | |
return buf; | |
} | |
if (digits > 6) | |
digits = 6; | |
int exponent = 0; | |
if (f >= 10) { | |
while (f >= 10) { | |
f /= 10; | |
++exponent; | |
} | |
} | |
else if ((f > 0) && (f < 1)) { | |
while (f < 1) { | |
f *= 10; | |
--exponent; | |
} | |
} | |
float rounder = 0.5 / ipow10(digits); | |
f += rounder; | |
unsigned intpart = (unsigned)f; | |
unsigned long fracpart = (unsigned long)((f - intpart) * 1.0e7); | |
fracpart /= ipow10(6 - digits + 1); | |
char format[16]; | |
if (digits) { | |
sprintf(format, "%%u.%%0%dlue%%+d", digits); | |
sprintf(buf + index, format, intpart, fracpart, exponent); | |
} | |
else { | |
sprintf(format, "%%ue%%+d"); | |
sprintf(buf + index, format, intpart, exponent); | |
} | |
return buf; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Created by http://oleddisplay.squix.ch/ Consider a donation | |
// In case of problems make sure that you are using the font file with the correct version! | |
const uint8_t DejaVu_Sans_9Bitmaps[] PROGMEM = { | |
// Bitmap Data: | |
0x00, // ' ' | |
0xAA,0x88, // '!' | |
0xAA, // '"' | |
0x28,0x53,0xF1,0x4F,0xCA,0x14,0x00, // '#' | |
0x21,0xEA,0x38,0x38,0xAF,0x08, // '$' | |
0xE4,0x52,0x2A,0x1F,0xE1,0x51,0x28,0x9C, // '%' | |
0x30,0x91,0x03,0x29,0x53,0x1B,0x00, // '&' | |
0xA0, // ''' | |
0x52,0x49,0x22, // '(' | |
0x91,0x24,0xA4, // ')' | |
0xA9,0xC7,0x2A, // '*' | |
0x20,0x8F,0x88,0x20, // '+' | |
0xA0, // ',' | |
0xC0, // '-' | |
0x80, // '.' | |
0x22,0x44,0x48,0x80, // '/' | |
0x64,0xA5,0x29,0x49,0x80, // '0' | |
0xC4,0x44,0x44,0xE0, // '1' | |
0x64,0x84,0x44,0x43,0xC0, // '2' | |
0x64,0x84,0xC1,0x0B,0x80, // '3' | |
0x10,0xC5,0x14,0x93,0xE1,0x00, // '4' | |
0xF4,0x21,0xC1,0x0B,0x80, // '5' | |
0x76,0x21,0xC9,0x49,0x80, // '6' | |
0xF0,0x88,0x42,0x21,0x00, // '7' | |
0x64,0xA4,0xC9,0x49,0x80, // '8' | |
0x64,0xA5,0xE1,0x1B,0x80, // '9' | |
0x80,0x80, // ':' | |
0x80,0xA0, // ';' | |
0x04,0x73,0x01,0xC0,0x40, // '<' | |
0xFC,0x03,0xF0, // '=' | |
0x80,0xE0,0x33,0x88,0x00, // '>' | |
0xF0,0x88,0x84,0x01,0x00, // '?' | |
0x3C,0x21,0x27,0x54,0xAA,0x54,0xF1,0x10,0x70, // '@' | |
0x30,0x61,0x22,0x47,0x90,0xA1,0x00, // 'A' | |
0xF2,0x28,0xBC,0x8A,0x2F,0x00, // 'B' | |
0x73,0x28,0x20,0x83,0x07,0x80, // 'C' | |
0xF2,0x68,0xA2,0x8A,0x6F,0x00, // 'D' | |
0xF4,0x21,0xE8,0x43,0xC0, // 'E' | |
0xF4,0x21,0xE8,0x42,0x00, // 'F' | |
0x73,0x28,0x26,0x8B,0x27,0x00, // 'G' | |
0x8A,0x28,0xBE,0x8A,0x28,0x80, // 'H' | |
0xAA,0xA8, // 'I' | |
0x49,0x24,0x92,0x80, // 'J' | |
0x8A,0x4A,0x30,0xA2,0x48,0x80, // 'K' | |
0x84,0x21,0x08,0x43,0xC0, // 'L' | |
0x85,0x9B,0x35,0xAB,0x50,0xA1,0x00, // 'M' | |
0x8B,0x2C,0xAA,0x9A,0x68,0x80, // 'N' | |
0x73,0x68,0xA2,0x8B,0x67,0x00, // 'O' | |
0xE4,0xA5,0xC8,0x42,0x00, // 'P' | |
0x73,0x68,0xA2,0x8B,0x67,0x04, // 'Q' | |
0xF2,0x49,0x38,0xA2,0x48,0x80, // 'R' | |
0x72,0x28,0x1C,0x0A,0x27,0x00, // 'S' | |
0xF8,0x82,0x08,0x20,0x82,0x00, // 'T' | |
0x8A,0x28,0xA2,0x8A,0x27,0x00, // 'U' | |
0x85,0x09,0x22,0x44,0x86,0x0C,0x00, // 'V' | |
0x92,0x92,0x54,0x54,0x6C,0x28,0x28, // 'W' | |
0xCC,0x90,0xC1,0x83,0x09,0x23,0x00, // 'X' | |
0x89,0x45,0x08,0x20,0x82,0x00, // 'Y' | |
0xF8,0x21,0x08,0x42,0x0F,0x80, // 'Z' | |
0xD2,0x49,0x26, // '[' | |
0x88,0x44,0x42,0x20, // '\' | |
0xC9,0x24,0x96, // ']' | |
0x30,0x90, // '^' | |
0xF8, // '_' | |
0x88, // '`' | |
0x70,0xBD,0x2F,0x00, // 'a' | |
0x84,0x21,0xC9,0x4A,0x5C, // 'b' | |
0x74,0x21,0x07,0x00, // 'c' | |
0x10,0x84,0xE9,0x4A,0x4E, // 'd' | |
0x64,0xBD,0x07,0x00, // 'e' | |
0x72,0x11,0xC4,0x21,0x08, // 'f' | |
0x74,0xA5,0x27,0x09,0x80, // 'g' | |
0x84,0x21,0xE9,0x4A,0x52, // 'h' | |
0x8A,0xA8, // 'i' | |
0x41,0x24,0x92,0xC0, // 'j' | |
0x84,0x21,0x2A,0x62,0x92, // 'k' | |
0xAA,0xAA, // 'l' | |
0xFE,0x92,0x92,0x92,0x92, // 'm' | |
0xF4,0xA5,0x29,0x00, // 'n' | |
0x64,0xA5,0x26,0x00, // 'o' | |
0xE4,0xA5,0x2E,0x42,0x00, // 'p' | |
0x74,0xA5,0x27,0x08,0x40, // 'q' | |
0xE8,0x88,0x80, // 'r' | |
0xE8,0x62,0xE0, // 's' | |
0x47,0x90,0x84,0x38, // 't' | |
0x94,0xA5,0x2F,0x00, // 'u' | |
0x8A,0x25,0x14,0x20, // 'v' | |
0x92,0xAA,0xAA,0x44,0x44, // 'w' | |
0x89,0x42,0x14,0x88, // 'x' | |
0x89,0x11,0x42,0x82,0x04,0x30,0x00, // 'y' | |
0xF0,0x88,0x8F,0x00, // 'z' | |
0x64,0x48,0x44,0x46, // '{' | |
0xAA,0xAA,0x80, // '|' | |
0xC4,0x42,0x44,0x4C // '}' | |
}; | |
const GFXglyph DejaVu_Sans_9Glyphs[] PROGMEM = { | |
// bitmapOffset, width, height, xAdvance, xOffset, yOffset | |
{ 0, 1, 1, 4, 0, 0 }, // ' ' | |
{ 1, 2, 7, 4, 1, -7 }, // '!' | |
{ 3, 4, 2, 5, 1, -7 }, // '"' | |
{ 4, 7, 7, 9, 1, -7 }, // '#' | |
{ 11, 6, 8, 7, 0, -7 }, // '$' | |
{ 17, 9, 7, 10, 0, -7 }, // '%' | |
{ 25, 7, 7, 9, 1, -7 }, // '&' | |
{ 32, 2, 2, 3, 1, -7 }, // ''' | |
{ 33, 3, 8, 5, 1, -8 }, // '(' | |
{ 36, 3, 8, 5, 1, -8 }, // ')' | |
{ 39, 6, 4, 6, 0, -7 }, // '*' | |
{ 42, 6, 5, 9, 1, -5 }, // '+' | |
{ 46, 2, 2, 4, 1, -1 }, // ',' | |
{ 47, 3, 1, 4, 1, -3 }, // '-' | |
{ 48, 2, 1, 4, 1, -1 }, // '.' | |
{ 49, 4, 7, 4, 0, -7 }, // '/' | |
{ 53, 5, 7, 7, 1, -7 }, // '0' | |
{ 58, 4, 7, 7, 2, -7 }, // '1' | |
{ 62, 5, 7, 7, 1, -7 }, // '2' | |
{ 67, 5, 7, 7, 1, -7 }, // '3' | |
{ 72, 6, 7, 7, 1, -7 }, // '4' | |
{ 78, 5, 7, 7, 1, -7 }, // '5' | |
{ 83, 5, 7, 7, 1, -7 }, // '6' | |
{ 88, 5, 7, 7, 1, -7 }, // '7' | |
{ 93, 5, 7, 7, 1, -7 }, // '8' | |
{ 98, 5, 7, 7, 1, -7 }, // '9' | |
{ 103, 2, 5, 4, 1, -5 }, // ':' | |
{ 105, 2, 6, 4, 1, -5 }, // ';' | |
{ 107, 7, 5, 9, 1, -5 }, // '<' | |
{ 112, 7, 3, 9, 1, -4 }, // '=' | |
{ 115, 7, 5, 9, 1, -5 }, // '>' | |
{ 120, 5, 7, 6, 1, -7 }, // '?' | |
{ 125, 9, 8, 11, 1, -7 }, // '@' | |
{ 134, 7, 7, 7, 0, -7 }, // 'A' | |
{ 141, 6, 7, 8, 1, -7 }, // 'B' | |
{ 147, 6, 7, 8, 1, -7 }, // 'C' | |
{ 153, 6, 7, 8, 1, -7 }, // 'D' | |
{ 159, 5, 7, 7, 1, -7 }, // 'E' | |
{ 164, 5, 7, 7, 1, -7 }, // 'F' | |
{ 169, 6, 7, 8, 1, -7 }, // 'G' | |
{ 175, 6, 7, 8, 1, -7 }, // 'H' | |
{ 181, 2, 7, 4, 1, -7 }, // 'I' | |
{ 183, 3, 9, 4, 0, -7 }, // 'J' | |
{ 187, 6, 7, 7, 1, -7 }, // 'K' | |
{ 193, 5, 7, 6, 1, -7 }, // 'L' | |
{ 198, 7, 7, 9, 1, -7 }, // 'M' | |
{ 205, 6, 7, 8, 1, -7 }, // 'N' | |
{ 211, 6, 7, 8, 1, -7 }, // 'O' | |
{ 217, 5, 7, 7, 1, -7 }, // 'P' | |
{ 222, 6, 8, 8, 1, -7 }, // 'Q' | |
{ 228, 6, 7, 7, 1, -7 }, // 'R' | |
{ 234, 6, 7, 8, 1, -7 }, // 'S' | |
{ 240, 6, 7, 6, 0, -7 }, // 'T' | |
{ 246, 6, 7, 8, 1, -7 }, // 'U' | |
{ 252, 7, 7, 7, 0, -7 }, // 'V' | |
{ 259, 8, 7, 8, 0, -7 }, // 'W' | |
{ 266, 7, 7, 7, 0, -7 }, // 'X' | |
{ 273, 6, 7, 6, 0, -7 }, // 'Y' | |
{ 279, 6, 7, 6, 0, -7 }, // 'Z' | |
{ 285, 3, 8, 5, 1, -7 }, // '[' | |
{ 288, 4, 7, 4, 0, -7 }, // '\' | |
{ 292, 3, 8, 5, 1, -7 }, // ']' | |
{ 295, 7, 2, 9, 1, -7 }, // '^' | |
{ 297, 6, 1, 6, 0, 1 }, // '_' | |
{ 298, 3, 2, 6, 1, -8 }, // '`' | |
{ 299, 5, 5, 7, 1, -5 }, // 'a' | |
{ 303, 5, 8, 7, 1, -8 }, // 'b' | |
{ 308, 5, 5, 7, 1, -5 }, // 'c' | |
{ 312, 5, 8, 7, 1, -8 }, // 'd' | |
{ 317, 5, 5, 7, 1, -5 }, // 'e' | |
{ 321, 5, 8, 4, 0, -8 }, // 'f' | |
{ 326, 5, 7, 7, 1, -5 }, // 'g' | |
{ 331, 5, 8, 7, 1, -8 }, // 'h' | |
{ 336, 2, 7, 4, 1, -7 }, // 'i' | |
{ 338, 3, 9, 4, 0, -7 }, // 'j' | |
{ 342, 5, 8, 6, 1, -8 }, // 'k' | |
{ 347, 2, 8, 4, 1, -8 }, // 'l' | |
{ 349, 8, 5, 10, 1, -5 }, // 'm' | |
{ 354, 5, 5, 7, 1, -5 }, // 'n' | |
{ 358, 5, 5, 7, 1, -5 }, // 'o' | |
{ 362, 5, 7, 7, 1, -5 }, // 'p' | |
{ 367, 5, 7, 7, 1, -5 }, // 'q' | |
{ 372, 4, 5, 5, 1, -5 }, // 'r' | |
{ 375, 4, 5, 6, 1, -5 }, // 's' | |
{ 378, 5, 6, 5, 0, -6 }, // 't' | |
{ 382, 5, 5, 7, 1, -5 }, // 'u' | |
{ 386, 6, 5, 6, 0, -5 }, // 'v' | |
{ 390, 8, 5, 8, 0, -5 }, // 'w' | |
{ 395, 6, 5, 6, 0, -5 }, // 'x' | |
{ 399, 7, 7, 6, 0, -5 }, // 'y' | |
{ 406, 5, 5, 7, 1, -5 }, // 'z' | |
{ 410, 4, 8, 6, 1, -7 }, // '{' | |
{ 414, 2, 9, 4, 1, -7 }, // '|' | |
{ 417, 4, 8, 6, 1, -7 } // '}' | |
}; | |
const GFXfont DejaVu_Sans_9 PROGMEM = { | |
(uint8_t *)DejaVu_Sans_9Bitmaps,(GFXglyph *)DejaVu_Sans_9Glyphs,0x20, 0x7E, 12}; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Created by http://oleddisplay.squix.ch/ Consider a donation | |
// In case of problems make sure that you are using the font file with the correct version! | |
const uint8_t DejaVu_Sans_Bold_26Bitmaps[] PROGMEM = { | |
// Bitmap Data: | |
0x00, // ' ' | |
0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xE7,0x9C,0x00,0x0F,0xBE,0xFB,0xEF,0x80, // '!' | |
0xE3,0xB8,0xEE,0x3B,0x8E,0xE3,0xB8,0xEE,0x38, // '"' | |
0x01,0xC7,0x00,0x30,0xC0,0x0E,0x38,0x01,0xC7,0x00,0x38,0xE0,0xFF,0xFF,0x9F,0xFF,0xF3,0xFF,0xFE,0x07,0x1C,0x00,0xC3,0x00,0x38,0xE0,0x7F,0xFF,0xCF,0xFF,0xF9,0xFF,0xFF,0x07,0x1C,0x00,0xE3,0x80,0x1C,0x70,0x03,0x0E,0x00,0xE1,0x80,0x00, // '#' | |
0x03,0x00,0x06,0x00,0x0C,0x00,0xFF,0x03,0xFF,0x8F,0xFF,0x3E,0xC6,0x79,0x80,0xF3,0x01,0xFE,0x03,0xFF,0x83,0xFF,0xC1,0xFF,0x80,0x7F,0x80,0xCF,0x01,0x9E,0xC3,0x3D,0xFF,0xF3,0xFF,0xE1,0xFF,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80, // '$' | |
0x1E,0x00,0xC0,0x3F,0xC0,0x60,0x1C,0xE0,0x60,0x1C,0x38,0x70,0x0E,0x1C,0x30,0x07,0x0E,0x38,0x03,0x87,0x18,0x00,0xE7,0x18,0x00,0x7F,0x9C,0x00,0x0F,0x0C,0x3C,0x00,0x0E,0x7F,0x80,0x06,0x39,0xC0,0x06,0x38,0x70,0x07,0x1C,0x38,0x03,0x0E,0x1C,0x03,0x87,0x0E,0x01,0x81,0xCE,0x01,0x80,0xFF,0x00,0xC0,0x1E,0x00, // '%' | |
0x03,0xF0,0x00,0x7F,0xE0,0x03,0xFF,0x00,0x3E,0x18,0x01,0xF0,0x40,0x0F,0x80,0x00,0x3E,0x00,0x01,0xF8,0x00,0x1F,0xE1,0xE1,0xFF,0x0F,0x1F,0x7C,0x79,0xF1,0xF7,0x8F,0x87,0xFC,0x7C,0x1F,0xC3,0xF0,0x7C,0x0F,0xC3,0xF0,0x7F,0xFF,0xC1,0xFF,0xFF,0x03,0xF8,0xFC, // '&' | |
0xEE,0xEE,0xEE,0xE0, // ''' | |
0x1E,0x1C,0x3C,0x38,0x78,0x78,0x78,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0x78,0x78,0x78,0x38,0x3C,0x1C,0x1E, // '(' | |
0xF0,0x70,0x78,0x78,0x3C,0x3C,0x3C,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x3C,0x3C,0x3C,0x78,0x78,0x70,0xF0, // ')' | |
0x06,0x00,0x30,0x11,0x89,0xED,0xE7,0xFE,0x0F,0xC0,0x7E,0x0F,0xFC,0xF6,0xF2,0x31,0x01,0x80,0x0C,0x00, // '*' | |
0x01,0xC0,0x00,0x70,0x00,0x1C,0x00,0x07,0x00,0x01,0xC0,0x00,0x70,0x00,0x1C,0x03,0xFF,0xFE,0xFF,0xFF,0xBF,0xFF,0xE0,0x1C,0x00,0x07,0x00,0x01,0xC0,0x00,0x70,0x00,0x1C,0x00,0x07,0x00,0x01,0xC0,0x00, // '+' | |
0x7C,0xF9,0xF3,0xE7,0xCF,0x3E,0x78,0xE0, // ',' | |
0xFF,0x7F,0xBF,0xDF,0xE0, // '-' | |
0xFB,0xEF,0xBE,0xF8, // '.' | |
0x01,0xC0,0x38,0x0E,0x01,0xC0,0x38,0x0E,0x01,0xC0,0x30,0x0E,0x01,0xC0,0x30,0x0E,0x01,0xC0,0x30,0x0E,0x01,0xC0,0x70,0x0E,0x01,0xC0,0x70,0x0E,0x00, // '/' | |
0x07,0xE0,0x0F,0xFC,0x0F,0xFF,0x0F,0x87,0xC7,0xC3,0xE7,0xC0,0xF3,0xE0,0x7D,0xF0,0x3E,0xF8,0x1F,0x7C,0x0F,0xBE,0x07,0xDF,0x03,0xEF,0x81,0xF3,0xC0,0xF1,0xF0,0xF8,0xF8,0x7C,0x3F,0xFC,0x0F,0xFC,0x01,0xF8,0x00, // '0' | |
0x3F,0x83,0xFE,0x0F,0xF8,0x33,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0xFF,0xFB,0xFF,0xEF,0xFF,0x80, // '1' | |
0x3F,0xC1,0xFF,0xE3,0xFF,0xE7,0x07,0xE8,0x07,0xC0,0x0F,0x80,0x1F,0x00,0x3E,0x00,0xFC,0x03,0xF8,0x0F,0xE0,0x3F,0x80,0xFE,0x03,0xF8,0x0F,0xE0,0x3F,0x80,0xFF,0xFD,0xFF,0xFB,0xFF,0xF0, // '2' | |
0x1F,0xC0,0xFF,0xF1,0xFF,0xE2,0x07,0xE0,0x07,0xC0,0x0F,0x80,0x1F,0x00,0x7C,0x1F,0xF0,0x3F,0xC0,0x7F,0xE0,0x07,0xE0,0x07,0xC0,0x0F,0x80,0x1F,0x60,0x7E,0xFF,0xF9,0xFF,0xE0,0xFF,0x00, // '3' | |
0x01,0xF8,0x00,0xFC,0x00,0xFE,0x00,0xFF,0x00,0xFF,0x80,0x77,0xC0,0x7B,0xE0,0x79,0xF0,0x38,0xF8,0x3C,0x7C,0x3C,0x3E,0x1C,0x1F,0x0F,0xFF,0xF7,0xFF,0xFB,0xFF,0xFC,0x01,0xF0,0x00,0xF8,0x00,0x7C,0x00,0x3E,0x00, // '4' | |
0x7F,0xF8,0xFF,0xF1,0xFF,0xE3,0xC0,0x07,0x80,0x0F,0x00,0x1F,0xF0,0x3F,0xF8,0x7F,0xF8,0x83,0xF0,0x03,0xF0,0x03,0xE0,0x07,0xC0,0x0F,0x80,0x3F,0x60,0xFC,0xFF,0xF9,0xFF,0xE0,0xFF,0x00, // '5' | |
0x03,0xF8,0x0F,0xFC,0x3F,0xFC,0x3E,0x04,0x7C,0x00,0x78,0x00,0xFB,0xE0,0xFF,0xF8,0xFF,0xFC,0xFC,0x7C,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0x78,0x3E,0x7C,0x7C,0x3F,0xFC,0x1F,0xF8,0x07,0xE0, // '6' | |
0xFF,0xFD,0xFF,0xFB,0xFF,0xF0,0x07,0xE0,0x0F,0x80,0x3F,0x00,0x7C,0x01,0xF8,0x03,0xE0,0x0F,0xC0,0x1F,0x80,0x3E,0x00,0xFC,0x01,0xF0,0x07,0xE0,0x0F,0x80,0x3F,0x00,0x7C,0x01,0xF8,0x00, // '7' | |
0x0F,0xE0,0x3F,0xF8,0x7F,0xFC,0xFC,0x7E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0x7C,0x7C,0x3F,0xF8,0x0F,0xE0,0x3F,0xF8,0x7C,0x7C,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xFC,0x7E,0x7F,0xFC,0x3F,0xF8,0x0F,0xE0, // '8' | |
0x0F,0xC0,0x3F,0xF0,0x7F,0xF8,0x7C,0x7C,0xF8,0x3C,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xFC,0x7E,0x7F,0xFE,0x3F,0xFE,0x1F,0xBE,0x00,0x3C,0x00,0x7C,0x40,0xF8,0x7F,0xF8,0x7F,0xE0,0x3F,0x80, // '9' | |
0xFB,0xEF,0xBE,0xF8,0x00,0x00,0x03,0xEF,0xBE,0xFB,0xE0, // ':' | |
0x7C,0xF9,0xF3,0xE7,0xC0,0x00,0x00,0x00,0xF9,0xF3,0xE7,0xCF,0x9E,0x7C,0xF1,0xC0, // ';' | |
0x00,0x01,0x00,0x07,0x80,0x1F,0xC0,0x3F,0xC0,0xFF,0x03,0xFE,0x03,0xF8,0x01,0xE0,0x00,0xFE,0x00,0x3F,0xE0,0x03,0xFC,0x00,0x3F,0xC0,0x07,0xF0,0x00,0x78,0x00,0x04, // '<' | |
0xFF,0xFF,0x7F,0xFF,0xBF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFD,0xFF,0xFE,0xFF,0xFF,0x00, // '=' | |
0x80,0x00,0x78,0x00,0x3F,0x80,0x0F,0xF0,0x00,0xFF,0x00,0x1F,0xF0,0x01,0xFC,0x00,0x1E,0x00,0x7F,0x01,0xFF,0x03,0xFC,0x0F,0xF0,0x0F,0xE0,0x07,0x80,0x02,0x00,0x00, // '>' | |
0xFF,0x87,0xFF,0x3F,0xFD,0x87,0xE0,0x1F,0x00,0xF8,0x0F,0xC0,0xFC,0x0F,0xC0,0xFC,0x07,0xC0,0x3E,0x00,0x00,0x00,0x00,0x7C,0x03,0xE0,0x1F,0x00,0xF8,0x07,0xC0, // '?' | |
0x00,0xFE,0x00,0x07,0xFF,0x00,0x3C,0x0F,0x00,0xE0,0x07,0x83,0x80,0x03,0x06,0x00,0x03,0x18,0x3D,0xC6,0x30,0xFF,0x86,0xC1,0xCF,0x0D,0x87,0x0E,0x1B,0x0E,0x1C,0x36,0x1C,0x38,0x6C,0x38,0x71,0xD8,0x70,0xE3,0x30,0x73,0xCC,0x30,0xFF,0xF0,0x60,0xF7,0x80,0x60,0x00,0x00,0xE0,0x00,0x00,0xE0,0x06,0x00,0xF0,0x3E,0x00,0x7F,0xF8,0x00,0x3F,0x80,0x00, // '@' | |
0x01,0xF8,0x00,0x1F,0xC0,0x00,0xFF,0x00,0x07,0xF8,0x00,0x7F,0xE0,0x03,0xFF,0x00,0x1F,0xF8,0x01,0xFF,0xE0,0x0F,0x9F,0x00,0x7C,0xF8,0x07,0xE3,0xE0,0x3E,0x1F,0x03,0xFF,0xFC,0x1F,0xFF,0xE0,0xFF,0xFF,0x0F,0xC0,0xFC,0x7C,0x03,0xE3,0xE0,0x1F,0x3F,0x00,0xFC, // 'A' | |
0xFF,0xF0,0x7F,0xFE,0x3F,0xFF,0x1F,0x0F,0xCF,0x83,0xE7,0xC1,0xF3,0xE1,0xF9,0xFF,0xF8,0xFF,0xF8,0x7F,0xFF,0x3E,0x0F,0x9F,0x03,0xEF,0x81,0xF7,0xC0,0xFB,0xE0,0x7D,0xF0,0x7E,0xFF,0xFE,0x7F,0xFE,0x3F,0xFC,0x00, // 'B' | |
0x01,0xFC,0x07,0xFF,0x87,0xFF,0xC7,0xE0,0xE7,0xE0,0x13,0xE0,0x03,0xE0,0x01,0xF0,0x00,0xF8,0x00,0x7C,0x00,0x3E,0x00,0x1F,0x00,0x0F,0x80,0x03,0xE0,0x01,0xF8,0x04,0x7E,0x0E,0x1F,0xFF,0x07,0xFF,0x80,0x7F,0x00, // 'C' | |
0xFF,0xE0,0x1F,0xFF,0x83,0xFF,0xF8,0x7C,0x1F,0x8F,0x81,0xF9,0xF0,0x1F,0x3E,0x01,0xF7,0xC0,0x3E,0xF8,0x07,0xDF,0x00,0xFB,0xE0,0x1F,0x7C,0x03,0xEF,0x80,0xFD,0xF0,0x1F,0x3E,0x07,0xE7,0xC1,0xF8,0xFF,0xFE,0x1F,0xFF,0x83,0xFF,0x80,0x00, // 'D' | |
0xFF,0xFB,0xFF,0xEF,0xFF,0xBE,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3F,0xFC,0xFF,0xF3,0xFF,0xCF,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xFF,0xFB,0xFF,0xEF,0xFF,0x80, // 'E' | |
0xFF,0xFB,0xFF,0xEF,0xFF,0xBE,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3F,0xFC,0xFF,0xF3,0xFF,0xCF,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x00, // 'F' | |
0x01,0xFE,0x01,0xFF,0xF0,0x7F,0xFE,0x1F,0x81,0xC7,0xE0,0x08,0xF8,0x00,0x3E,0x00,0x07,0xC0,0x00,0xF8,0x3F,0xDF,0x07,0xFB,0xE0,0xFF,0x7C,0x03,0xEF,0x80,0x7C,0xF8,0x0F,0x9F,0x81,0xF1,0xF8,0x3E,0x1F,0xFF,0xC1,0xFF,0xF8,0x07,0xF8,0x00, // 'G' | |
0xF8,0x0F,0xBE,0x03,0xEF,0x80,0xFB,0xE0,0x3E,0xF8,0x0F,0xBE,0x03,0xEF,0x80,0xFB,0xFF,0xFE,0xFF,0xFF,0xBF,0xFF,0xEF,0x80,0xFB,0xE0,0x3E,0xF8,0x0F,0xBE,0x03,0xEF,0x80,0xFB,0xE0,0x3E,0xF8,0x0F,0xBE,0x03,0xEF,0x80,0xF8, // 'H' | |
0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0x80, // 'I' | |
0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x1F,0x3F,0xCF,0xE3,0xE0, // 'J' | |
0xF8,0x0F,0x8F,0x81,0xF0,0xF8,0x3E,0x0F,0x87,0xC0,0xF8,0xF8,0x0F,0xBF,0x00,0xFF,0xE0,0x0F,0xFC,0x00,0xFF,0x80,0x0F,0xF8,0x00,0xFF,0xC0,0x0F,0xFE,0x00,0xFB,0xF0,0x0F,0x9F,0x80,0xF8,0xFC,0x0F,0x87,0xE0,0xF8,0x3F,0x0F,0x81,0xF8,0xF8,0x0F,0xE0, // 'K' | |
0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xFF,0xFB,0xFF,0xEF,0xFF,0x80, // 'L' | |
0xFC,0x01,0xFB,0xF8,0x0F,0xEF,0xE0,0x3F,0xBF,0xC1,0xFE,0xFF,0x07,0xFB,0xFC,0x1F,0xEF,0xB8,0xEF,0xBE,0xE3,0xBE,0xFB,0xDE,0xFB,0xE7,0x73,0xEF,0x9D,0xCF,0xBE,0x3E,0x3E,0xF8,0xF8,0xFB,0xE3,0xE3,0xEF,0x87,0x0F,0xBE,0x00,0x3E,0xF8,0x00,0xFB,0xE0,0x03,0xEF,0x80,0x0F,0x80, // 'M' | |
0xFC,0x0F,0xBF,0x03,0xEF,0xE0,0xFB,0xF8,0x3E,0xFF,0x0F,0xBF,0xC3,0xEF,0xF8,0xFB,0xEE,0x3E,0xFB,0xCF,0xBE,0x73,0xEF,0x9E,0xFB,0xE3,0xBE,0xF8,0xEF,0xBE,0x1F,0xEF,0x87,0xFB,0xE0,0xFE,0xF8,0x3F,0xBE,0x07,0xEF,0x81,0xF8, // 'N' | |
0x03,0xFC,0x00,0x7F,0xF8,0x07,0xFF,0xE0,0x7E,0x1F,0x87,0xC0,0x3E,0x3E,0x01,0xF3,0xE0,0x07,0xDF,0x00,0x3E,0xF8,0x01,0xF7,0xC0,0x0F,0xBE,0x00,0x7D,0xF0,0x03,0xEF,0x80,0x1F,0x3E,0x01,0xF1,0xF0,0x1F,0x87,0xE1,0xF8,0x1F,0xFF,0x80,0x7F,0xF8,0x00,0xFF,0x00, // 'O' | |
0xFF,0xF0,0x7F,0xFE,0x3F,0xFF,0x9F,0x07,0xEF,0x81,0xF7,0xC0,0xFB,0xE0,0x7D,0xF0,0x3E,0xF8,0x3F,0x7F,0xFF,0x3F,0xFF,0x1F,0xFE,0x0F,0x80,0x07,0xC0,0x03,0xE0,0x01,0xF0,0x00,0xF8,0x00,0x7C,0x00,0x3E,0x00,0x00, // 'P' | |
0x03,0xFC,0x00,0x7F,0xF8,0x07,0xFF,0xE0,0x7E,0x1F,0x87,0xC0,0x3E,0x3E,0x01,0xF3,0xE0,0x07,0xDF,0x00,0x3E,0xF8,0x01,0xF7,0xC0,0x0F,0xBE,0x00,0x7D,0xF0,0x03,0xEF,0x80,0x1F,0x3E,0x01,0xF1,0xF0,0x1F,0x87,0xE1,0xF8,0x1F,0xFF,0x80,0x7F,0xF8,0x00,0xFF,0x80,0x00,0x3E,0x00,0x00,0xF8,0x00,0x03,0xC0,0x00,0x1F,0x00, // 'Q' | |
0xFF,0xE0,0x3F,0xFE,0x0F,0xFF,0xC3,0xE1,0xF8,0xF8,0x3E,0x3E,0x0F,0x8F,0x83,0xE3,0xE0,0xF8,0xF8,0x7C,0x3F,0xFE,0x0F,0xFE,0x03,0xFF,0xE0,0xF8,0xFC,0x3E,0x1F,0x8F,0x83,0xE3,0xE0,0xFC,0xF8,0x3F,0x3E,0x07,0xCF,0x81,0xF8, // 'R' | |
0x0F,0xF0,0x3F,0xFC,0x7F,0xFC,0xFC,0x1C,0xF8,0x04,0xF8,0x00,0xF8,0x00,0xFF,0x00,0x7F,0xF0,0x3F,0xF8,0x1F,0xFC,0x01,0xFE,0x00,0x7E,0x00,0x3E,0x80,0x3E,0xE0,0x7E,0xFF,0xFC,0xFF,0xF8,0x1F,0xE0, // 'S' | |
0xFF,0xFF,0xBF,0xFF,0xEF,0xFF,0xF8,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00, // 'T' | |
0xF8,0x1F,0x7C,0x0F,0xBE,0x07,0xDF,0x03,0xEF,0x81,0xF7,0xC0,0xFB,0xE0,0x7D,0xF0,0x3E,0xF8,0x1F,0x7C,0x0F,0xBE,0x07,0xDF,0x03,0xEF,0x81,0xF7,0xC0,0xFB,0xE0,0x7C,0xF8,0x7C,0x7F,0xFE,0x1F,0xFE,0x03,0xFC,0x00, // 'U' | |
0xFC,0x03,0xF3,0xE0,0x1F,0x1F,0x00,0xF8,0xFC,0x0F,0xC3,0xE0,0x7C,0x1F,0x03,0xE0,0xFC,0x3F,0x03,0xE1,0xF0,0x1F,0x9F,0x80,0x7C,0xF8,0x03,0xE7,0xC0,0x1F,0xFE,0x00,0x7F,0xE0,0x03,0xFF,0x00,0x1F,0xF8,0x00,0x7F,0x80,0x03,0xFC,0x00,0x0F,0xE0,0x00,0x7E,0x00, // 'V' | |
0xF8,0x1F,0x03,0xEF,0xC1,0xF0,0x7E,0x7C,0x1F,0x07,0xC7,0xC3,0xB8,0x7C,0x7C,0x3B,0x87,0xC7,0xC3,0xB8,0x7C,0x3E,0x3B,0x8F,0x83,0xE7,0x9C,0xF8,0x3E,0x71,0xCF,0x83,0xE7,0x1C,0xF8,0x3F,0x71,0xDF,0x81,0xFF,0x1F,0xF0,0x1F,0xE0,0xFF,0x01,0xFE,0x0F,0xF0,0x1F,0xE0,0xFF,0x00,0xFE,0x0F,0xE0,0x0F,0xC0,0x7E,0x00,0xFC,0x07,0xE0,0x0F,0xC0,0x7E,0x00, // 'W' | |
0xFC,0x07,0xE7,0xE0,0xFC,0x3F,0x1F,0x83,0xFB,0xF8,0x1F,0xBF,0x00,0xFF,0xE0,0x07,0xFC,0x00,0x7F,0xC0,0x03,0xF8,0x00,0x3F,0x80,0x03,0xF8,0x00,0x7F,0xC0,0x0F,0xFE,0x00,0xFF,0xE0,0x1F,0xBF,0x03,0xF1,0xF8,0x3F,0x1F,0x87,0xE0,0xFC,0xFC,0x07,0xE0, // 'X' | |
0xFC,0x07,0xE7,0xE0,0xFC,0x3F,0x1F,0x83,0xF1,0xF8,0x1F,0xBF,0x00,0xFB,0xF0,0x0F,0xFE,0x00,0x7F,0xC0,0x07,0xFC,0x00,0x3F,0x80,0x01,0xF0,0x00,0x1F,0x00,0x01,0xF0,0x00,0x1F,0x00,0x01,0xF0,0x00,0x1F,0x00,0x01,0xF0,0x00,0x1F,0x00,0x01,0xF0,0x00, // 'Y' | |
0xFF,0xFF,0xBF,0xFF,0xEF,0xFF,0xF8,0x00,0xFE,0x00,0x7F,0x00,0x3F,0x80,0x0F,0xC0,0x07,0xE0,0x03,0xF8,0x01,0xFC,0x00,0xFE,0x00,0x3F,0x00,0x1F,0x80,0x0F,0xC0,0x07,0xF0,0x03,0xF8,0x00,0xFF,0xFF,0xBF,0xFF,0xEF,0xFF,0xF8, // 'Z' | |
0xFF,0x7F,0xBF,0xDE,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0xF7,0xFB,0xFC, // '[' | |
0xE0,0x1C,0x01,0xC0,0x38,0x03,0x00,0x70,0x0E,0x00,0xC0,0x1C,0x03,0x80,0x30,0x07,0x00,0xE0,0x0C,0x01,0xC0,0x38,0x03,0x00,0x70,0x0E,0x00,0xE0,0x1C, // '\' | |
0xFF,0x7F,0xBF,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xEF,0xF7,0xFB,0xFC, // ']' | |
0x03,0xE0,0x01,0xFC,0x00,0xFF,0x80,0x7D,0xF0,0x3E,0x3E,0x1E,0x03,0xCF,0x00,0x78, // '^' | |
0xFF,0xFB,0xFF,0xE0, // '_' | |
0xF0,0x78,0x38,0x1C,0x0E, // '`' | |
0x1F,0xE0,0xFF,0xE1,0xFF,0xE2,0x07,0xE0,0x07,0xC3,0xFF,0x9F,0xFF,0x7F,0xFE,0xF8,0x7D,0xF0,0xFB,0xE3,0xF7,0xFF,0xE7,0xFF,0xC7,0xCF,0x80, // 'a' | |
0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF9,0xF0,0xFF,0xF8,0xFF,0xFC,0xFC,0x7C,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xFC,0x7C,0xFF,0xFC,0xFF,0xF8,0xF9,0xF0, // 'b' | |
0x07,0xF0,0x7F,0xE3,0xFF,0x9F,0x82,0xFC,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xF0,0x07,0xE0,0x8F,0xFE,0x1F,0xF8,0x1F,0xC0, // 'c' | |
0x00,0x3E,0x00,0x3E,0x00,0x3E,0x00,0x3E,0x00,0x3E,0x00,0x3E,0x1F,0x3E,0x3F,0xFE,0x7F,0xFE,0x7C,0x7E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0x7C,0x7E,0x7F,0xFE,0x3F,0xFE,0x1F,0x3E, // 'd' | |
0x0F,0xE0,0x1F,0xF0,0x7F,0xF8,0x7C,0x7C,0xF8,0x3E,0xF8,0x3E,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xF8,0x00,0x7C,0x0C,0x7F,0xFC,0x3F,0xFC,0x0F,0xF0, // 'e' | |
0x07,0xE1,0xFE,0x3F,0xE3,0xE0,0x3E,0x03,0xE0,0xFF,0xEF,0xFE,0xFF,0xE3,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0, // 'f' | |
0x1F,0x3E,0x3F,0xFE,0x7F,0xFE,0x7C,0x7E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0x7C,0x7E,0x7F,0xFE,0x3F,0xFE,0x1F,0x3E,0x00,0x3E,0x20,0x7C,0x3F,0xFC,0x3F,0xF8,0x1F,0xE0, // 'g' | |
0xF8,0x01,0xF0,0x03,0xE0,0x07,0xC0,0x0F,0x80,0x1F,0x00,0x3E,0x7C,0x7F,0xFC,0xFF,0xF9,0xF9,0xFB,0xE1,0xF7,0xC3,0xEF,0x87,0xDF,0x0F,0xBE,0x1F,0x7C,0x3E,0xF8,0x7D,0xF0,0xFB,0xE1,0xF7,0xC3,0xE0, // 'h' | |
0xFB,0xEF,0xBE,0x00,0x0F,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE, // 'i' | |
0x1F,0x0F,0x87,0xC3,0xE0,0x00,0x00,0x7C,0x3E,0x1F,0x0F,0x87,0xC3,0xE1,0xF0,0xF8,0x7C,0x3E,0x1F,0x0F,0x87,0xC3,0xE1,0xF1,0xFB,0xF9,0xFC,0xF8,0x00, // 'j' | |
0xF8,0x00,0x7C,0x00,0x3E,0x00,0x1F,0x00,0x0F,0x80,0x07,0xC0,0x03,0xE1,0xF1,0xF0,0xF0,0xF8,0xF0,0x7C,0xF0,0x3E,0xF0,0x1F,0xF0,0x0F,0xF0,0x07,0xFC,0x03,0xFF,0x01,0xF7,0xC0,0xF9,0xF0,0x7C,0x7C,0x3E,0x1F,0x1F,0x07,0xE0, // 'k' | |
0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE, // 'l' | |
0xF9,0xE0,0xF0,0xFF,0xFB,0xFC,0xFF,0xFF,0xFC,0xFC,0x7E,0x7E,0xF8,0x7C,0x3E,0xF8,0x7C,0x3E,0xF8,0x7C,0x3E,0xF8,0x7C,0x3E,0xF8,0x7C,0x3E,0xF8,0x7C,0x3E,0xF8,0x7C,0x3E,0xF8,0x7C,0x3E,0xF8,0x7C,0x3E,0xF8,0x7C,0x3E, // 'm' | |
0xF9,0xF1,0xFF,0xF3,0xFF,0xE7,0xE7,0xEF,0x87,0xDF,0x0F,0xBE,0x1F,0x7C,0x3E,0xF8,0x7D,0xF0,0xFB,0xE1,0xF7,0xC3,0xEF,0x87,0xDF,0x0F,0x80, // 'n' | |
0x07,0xE0,0x0F,0xFC,0x1F,0xFF,0x0F,0x87,0xCF,0x81,0xF7,0xC0,0xFB,0xE0,0x7D,0xF0,0x3E,0xF8,0x1F,0x7C,0x1F,0x9F,0x0F,0x8F,0xFF,0xC1,0xFF,0x80,0x3F,0x00, // 'o' | |
0xF9,0xF0,0xFF,0xF8,0xFF,0xFC,0xFC,0x7C,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xFC,0x7C,0xFF,0xFC,0xFF,0xF8,0xF9,0xF0,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00, // 'p' | |
0x1F,0x3E,0x3F,0xFE,0x7F,0xFE,0x7C,0x7E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0xF8,0x3E,0x7C,0x7E,0x7F,0xFE,0x3F,0xFE,0x1F,0x3E,0x00,0x3E,0x00,0x3E,0x00,0x3E,0x00,0x3E,0x00,0x3E, // 'q' | |
0xF9,0xEF,0xBE,0xFF,0xEF,0xE2,0xFC,0x0F,0x80,0xF8,0x0F,0x80,0xF8,0x0F,0x80,0xF8,0x0F,0x80,0xF8,0x0F,0x80, // 'r' | |
0x1F,0xC1,0xFF,0xCF,0xFF,0x3C,0x0C,0xF0,0x03,0xF0,0x07,0xFE,0x0F,0xFC,0x03,0xF8,0x01,0xEC,0x07,0xBF,0xFE,0xFF,0xF0,0xFF,0x00, // 's' | |
0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x0F,0xFF,0x7F,0xFB,0xFF,0xC7,0xC0,0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x03,0xE0,0x1F,0x00,0xF8,0x07,0xFC,0x1F,0xE0,0x7F,0x00, // 't' | |
0xF8,0x7D,0xF0,0xFB,0xE1,0xF7,0xC3,0xEF,0x87,0xDF,0x0F,0xBE,0x1F,0x7C,0x3E,0xF8,0x7D,0xF0,0xFB,0xF3,0xF3,0xFF,0xE7,0xFF,0xC7,0xCF,0x80, // 'u' | |
0xFC,0x3F,0x3E,0x1F,0x1F,0x0F,0x8F,0xCF,0xC3,0xE7,0xC1,0xFF,0xE0,0x7F,0xE0,0x3F,0xF0,0x1F,0xF8,0x07,0xF8,0x03,0xFC,0x00,0xFC,0x00,0x7E,0x00,0x3F,0x00, // 'v' | |
0xF8,0x78,0x7D,0xF8,0xF1,0xF9,0xF3,0xE3,0xE3,0xE7,0xE7,0xC7,0xCF,0xCF,0x8F,0xDF,0xBF,0x0F,0xBF,0x7C,0x1F,0xE7,0xF8,0x3F,0xCF,0xF0,0x3F,0x9F,0xE0,0x7F,0x3F,0x80,0xFC,0x3F,0x01,0xF8,0x7E,0x01,0xF0,0xF8,0x00, // 'w' | |
0xFE,0x7F,0x3F,0x3F,0x0F,0xFF,0x03,0xFF,0x01,0xFF,0x80,0x7F,0x80,0x1F,0x80,0x0F,0xC0,0x0F,0xF0,0x0F,0xFC,0x07,0xFE,0x07,0xFF,0x87,0xE7,0xE7,0xF3,0xF8, // 'x' | |
0xFC,0x3F,0x3E,0x1F,0x1F,0x8F,0x87,0xCF,0xC3,0xE7,0xC1,0xFF,0xE0,0x7F,0xE0,0x3F,0xF0,0x0F,0xF8,0x07,0xF8,0x01,0xFC,0x00,0xFC,0x00,0x7E,0x00,0x3F,0x00,0x1F,0x00,0x1F,0x80,0x3F,0x80,0x1F,0xC0,0x0F,0x80,0x00, // 'y' | |
0xFF,0xFB,0xFF,0xEF,0xFF,0x80,0xFE,0x07,0xF0,0x1F,0x80,0xFC,0x07,0xF0,0x3F,0x81,0xFC,0x0F,0xE0,0x3F,0xFE,0xFF,0xFB,0xFF,0xE0, // 'z' | |
0x03,0xF0,0x3F,0x83,0xFC,0x1F,0x00,0xF0,0x07,0x80,0x3C,0x01,0xE0,0x0F,0x00,0x78,0x07,0xC1,0xFC,0x0F,0xC0,0x7F,0x00,0x7C,0x01,0xE0,0x0F,0x00,0x78,0x03,0xC0,0x1E,0x00,0xF8,0x07,0xF8,0x1F,0xC0,0x7E, // '{' | |
0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, // '|' | |
0xFC,0x07,0xF0,0x3F,0xC0,0x3E,0x00,0xF0,0x07,0x80,0x3C,0x01,0xE0,0x0F,0x00,0x78,0x03,0xE0,0x0F,0xE0,0x3F,0x03,0xF8,0x3E,0x01,0xE0,0x0F,0x00,0x78,0x03,0xC0,0x1E,0x01,0xF0,0x7F,0x83,0xF8,0x1F,0x80 // '}' | |
}; | |
const GFXglyph DejaVu_Sans_Bold_26Glyphs[] PROGMEM = { | |
// bitmapOffset, width, height, xAdvance, xOffset, yOffset | |
{ 0, 1, 1, 10, 0, 0 }, // ' ' | |
{ 1, 6, 19, 13, 4, -19 }, // '!' | |
{ 16, 10, 7, 15, 2, -19 }, // '"' | |
{ 25, 19, 19, 23, 2, -19 }, // '#' | |
{ 71, 15, 24, 19, 2, -20 }, // '$' | |
{ 116, 25, 19, 27, 1, -19 }, // '%' | |
{ 176, 21, 19, 24, 1, -19 }, // '&' | |
{ 226, 4, 7, 9, 2, -19 }, // ''' | |
{ 230, 8, 23, 13, 2, -20 }, // '(' | |
{ 253, 8, 23, 13, 2, -20 }, // ')' | |
{ 276, 13, 12, 15, 1, -19 }, // '*' | |
{ 296, 18, 17, 23, 2, -17 }, // '+' | |
{ 335, 7, 9, 11, 2, -5 }, // ',' | |
{ 343, 9, 4, 12, 1, -10 }, // '-' | |
{ 348, 6, 5, 11, 3, -5 }, // '.' | |
{ 352, 11, 21, 11, 0, -19 }, // '/' | |
{ 381, 17, 19, 19, 1, -19 }, // '0' | |
{ 422, 14, 19, 19, 3, -19 }, // '1' | |
{ 456, 15, 19, 19, 2, -19 }, // '2' | |
{ 492, 15, 19, 19, 2, -19 }, // '3' | |
{ 528, 17, 19, 19, 1, -19 }, // '4' | |
{ 569, 15, 19, 19, 2, -19 }, // '5' | |
{ 605, 16, 19, 19, 1, -19 }, // '6' | |
{ 643, 15, 19, 19, 2, -19 }, // '7' | |
{ 679, 16, 19, 19, 1, -19 }, // '8' | |
{ 717, 16, 19, 19, 1, -19 }, // '9' | |
{ 755, 6, 14, 11, 3, -14 }, // ':' | |
{ 766, 7, 18, 11, 2, -14 }, // ';' | |
{ 782, 17, 15, 23, 3, -16 }, // '<' | |
{ 814, 17, 9, 23, 3, -13 }, // '=' | |
{ 834, 17, 15, 23, 3, -16 }, // '>' | |
{ 866, 13, 19, 16, 1, -19 }, // '?' | |
{ 897, 23, 23, 27, 2, -19 }, // '@' | |
{ 964, 21, 19, 21, 0, -19 }, // 'A' | |
{ 1014, 17, 19, 21, 2, -19 }, // 'B' | |
{ 1055, 17, 19, 20, 1, -19 }, // 'C' | |
{ 1096, 19, 19, 23, 2, -19 }, // 'D' | |
{ 1142, 14, 19, 19, 2, -19 }, // 'E' | |
{ 1176, 14, 19, 19, 2, -19 }, // 'F' | |
{ 1210, 19, 19, 22, 1, -19 }, // 'G' | |
{ 1256, 18, 19, 23, 2, -19 }, // 'H' | |
{ 1299, 6, 19, 11, 2, -19 }, // 'I' | |
{ 1314, 10, 24, 11, -2, -19 }, // 'J' | |
{ 1344, 20, 19, 21, 2, -19 }, // 'K' | |
{ 1392, 14, 19, 18, 2, -19 }, // 'L' | |
{ 1426, 22, 19, 27, 2, -19 }, // 'M' | |
{ 1479, 18, 19, 23, 2, -19 }, // 'N' | |
{ 1522, 21, 19, 23, 1, -19 }, // 'O' | |
{ 1572, 17, 19, 20, 2, -19 }, // 'P' | |
{ 1613, 21, 23, 23, 1, -19 }, // 'Q' | |
{ 1674, 18, 19, 21, 2, -19 }, // 'R' | |
{ 1717, 16, 19, 20, 2, -19 }, // 'S' | |
{ 1755, 18, 19, 19, 0, -19 }, // 'T' | |
{ 1798, 17, 19, 22, 2, -19 }, // 'U' | |
{ 1839, 21, 19, 21, 0, -19 }, // 'V' | |
{ 1889, 28, 19, 30, 1, -19 }, // 'W' | |
{ 1956, 20, 19, 21, 1, -19 }, // 'X' | |
{ 2004, 20, 19, 20, 0, -19 }, // 'Y' | |
{ 2052, 18, 19, 20, 1, -19 }, // 'Z' | |
{ 2095, 9, 23, 13, 2, -20 }, // '[' | |
{ 2121, 11, 21, 11, 0, -19 }, // '\' | |
{ 2150, 9, 23, 13, 1, -20 }, // ']' | |
{ 2176, 18, 7, 23, 3, -19 }, // '^' | |
{ 2192, 14, 2, 14, 0, 4 }, // '_' | |
{ 2196, 8, 5, 14, 1, -21 }, // '`' | |
{ 2201, 15, 14, 19, 1, -14 }, // 'a' | |
{ 2228, 16, 20, 20, 2, -20 }, // 'b' | |
{ 2268, 14, 14, 16, 1, -14 }, // 'c' | |
{ 2293, 16, 20, 20, 1, -20 }, // 'd' | |
{ 2333, 16, 14, 19, 1, -14 }, // 'e' | |
{ 2361, 12, 20, 12, 1, -20 }, // 'f' | |
{ 2391, 16, 19, 20, 1, -14 }, // 'g' | |
{ 2429, 15, 20, 20, 2, -20 }, // 'h' | |
{ 2467, 6, 20, 10, 2, -20 }, // 'i' | |
{ 2482, 9, 25, 10, -1, -20 }, // 'j' | |
{ 2511, 17, 20, 18, 2, -20 }, // 'k' | |
{ 2554, 6, 20, 10, 2, -20 }, // 'l' | |
{ 2569, 24, 14, 28, 2, -14 }, // 'm' | |
{ 2611, 15, 14, 20, 2, -14 }, // 'n' | |
{ 2638, 17, 14, 19, 1, -14 }, // 'o' | |
{ 2668, 16, 19, 20, 2, -14 }, // 'p' | |
{ 2706, 16, 19, 20, 1, -14 }, // 'q' | |
{ 2744, 12, 14, 14, 2, -14 }, // 'r' | |
{ 2765, 14, 14, 16, 1, -14 }, // 's' | |
{ 2790, 13, 18, 13, 0, -18 }, // 't' | |
{ 2820, 15, 14, 20, 2, -14 }, // 'u' | |
{ 2847, 17, 14, 18, 0, -14 }, // 'v' | |
{ 2877, 23, 14, 25, 1, -14 }, // 'w' | |
{ 2918, 17, 14, 18, 0, -14 }, // 'x' | |
{ 2948, 17, 19, 18, 0, -14 }, // 'y' | |
{ 2989, 14, 14, 16, 1, -14 }, // 'z' | |
{ 3014, 13, 24, 20, 3, -20 }, // '{' | |
{ 3053, 4, 26, 11, 3, -20 }, // '|' | |
{ 3066, 13, 24, 20, 3, -20 } // '}' | |
}; | |
const GFXfont DejaVu_Sans_Bold_26 PROGMEM = { | |
(uint8_t *)DejaVu_Sans_Bold_26Bitmaps,(GFXglyph *)DejaVu_Sans_Bold_26Glyphs,0x20, 0x7E, 32}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment