ref: a80af55313ca99a442b2574dd53ebedfb9e736fc
parent: e586373df54e57b080fb59c06b72ba1f50e975ff
author: spiricom <jeff@snyderphonics.com>
date: Sun Mar 1 10:30:26 EST 2020
not sure - updated things
binary files a/.DS_Store b/.DS_Store differ
binary files a/LEAF/.DS_Store b/LEAF/.DS_Store differ
binary files a/LEAF/Inc/.DS_Store /dev/null differ
--- /dev/null
+++ b/LEAF/Inc/MIDI_application.h
@@ -1,0 +1,50 @@
+/*
+ * MIDI_application.h
+ * Created on: 6 d�c. 2014
+ * Author: Xavier Halgand
+ *
+ * Modified on: 9/12/16 by C.P. to handle the MIDI_IDLE state properly, and
+ * added required code to be compatible with "NucleoSynth"
+ *
+ */
+
+#ifndef MIDI_APPLICATION_H_
+#define MIDI_APPLICATION_H_
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "stdio.h"
+#include "usbh_core.h"
+#include "usbh_MIDI.h"
+#include "main.h"
+
+#include <math.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+/*------------------------------------------------------------------------------*/
+typedef enum
+{
+ MIDI_APPLICATION_IDLE = 0,
+ MIDI_APPLICATION_START,
+ MIDI_APPLICATION_READY,
+ MIDI_APPLICATION_RUNNING,
+ MIDI_APPLICATION_DISCONNECT
+}
+MIDI_ApplicationTypeDef;
+
+
+#define RX_BUFF_SIZE 64 /* Max Received data 64 bytes */
+
+extern uint8_t MIDI_RX_Buffer[RX_BUFF_SIZE];// __ATTR_RAM_D2; // MIDI reception buffer
+extern uint8_t CCs[128];
+
+extern uint8_t MIDIStartOfFrame;
+
+/* Exported functions ------------------------------------------------------- */
+void MIDI_Application(void);
+void LocalMidiHandler(uint8_t param, uint8_t data);
+void ProcessReceivedMidiDatas(uint32_t myLength);
+
+/*------------------------------------------------------------------------------*/
+#endif /* MIDI_APPLICATION_H_ */
--- /dev/null
+++ b/LEAF/Inc/adc.h
@@ -1,0 +1,58 @@
+/**
+ ******************************************************************************
+ * File Name : ADC.h
+ * Description : This file provides code for the configuration
+ * of the ADC instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __adc_H
+#define __adc_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern ADC_HandleTypeDef hadc1;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_ADC1_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ adc_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/audiostream.h
@@ -1,0 +1,93 @@
+/**
+ ******************************************************************************
+ * @file Audio_playback_and_record/inc/waveplayer.h
+ * @author MCD Application Team
+ * @version V1.1.0
+ * @date 26-June-2014
+ * @brief Header for waveplayer.c module.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __AUDIOSTREAM_H
+#define __AUDIOSTREAM_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_hal.h"
+#include "leaf.h"
+#include "main.h"
+
+#define AUDIO_FRAME_SIZE 128
+#define HALF_BUFFER_SIZE AUDIO_FRAME_SIZE * 2 //number of samples per half of the "double-buffer" (twice the audio frame size because there are interleaved samples for both left and right channels)
+#define AUDIO_BUFFER_SIZE AUDIO_FRAME_SIZE * 4 //number of samples in the whole data structure (four times the audio frame size because of stereo and also double-buffering/ping-ponging)
+
+
+extern int32_t audioOutBuffer[AUDIO_BUFFER_SIZE];
+extern int32_t audioInBuffer[AUDIO_BUFFER_SIZE];
+extern tMempool smallPool;
+extern tMempool largePool;
+extern uint8_t codecReady;
+extern float sample;
+extern float rightOut;
+extern float rightIn;
+extern tRamp adc[6];
+extern float smoothedADC[6];
+extern float audioDisplayBuffer[128];
+extern uint8_t displayBufferIndex;
+
+/* Exported types ------------------------------------------------------------*/
+typedef enum
+{
+ BUFFER_OFFSET_NONE = 0,
+ BUFFER_OFFSET_HALF,
+ BUFFER_OFFSET_FULL,
+}BUFFER_StateTypeDef;
+
+#ifdef SAMPLERATE96K
+#define SAMPLE_RATE 96000.f
+#else
+#define SAMPLE_RATE 48000.f
+#endif
+
+typedef enum BOOL {
+ FALSE = 0,
+ TRUE
+} BOOL;
+
+#define INV_SAMPLE_RATE 1.f/SAMPLE_RATE
+#define SAMPLE_RATE_MS (SAMPLE_RATE / 1000.f)
+#define INV_SR_MS 1.f/SAMPLE_RATE_MS
+#define SAMPLE_RATE_DIV_PARAMS SAMPLE_RATE / 3
+#define SAMPLE_RATE_DIV_PARAMS_MS (SAMPLE_RATE_DIV_PARAMS / 1000.f)
+#define INV_SR_DIV_PARAMS_MS 1.f/SAMPLE_RATE_DIV_PARAMS_MS
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+void audioInit(I2C_HandleTypeDef* hi2c, SAI_HandleTypeDef* hsaiOut, SAI_HandleTypeDef* hsaiIn);
+
+void initFunctionPointers(void);
+
+void audioFrame(uint16_t buffer_offset);
+
+void DMA1_TransferCpltCallback(DMA_HandleTypeDef *hdma);
+void DMA1_HalfTransferCpltCallback(DMA_HandleTypeDef *hdma);
+
+#endif /* __AUDIOSTREAM_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/bdma.h
@@ -1,0 +1,56 @@
+/**
+ ******************************************************************************
+ * File Name : dma.h
+ * Description : This file contains all the function prototypes for
+ * the dma.c file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __bdma_H
+#define __bdma_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* DMA memory to memory transfer handles -------------------------------------*/
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_BDMA_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __bdma_H */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/bsp_driver_sd.h
@@ -1,0 +1,84 @@
+/**
+ ******************************************************************************
+ * @file bsp_driver_sd.h (based on stm32h743i_eval_sd.h)
+ * @brief This file contains the common defines and functions prototypes for
+ * the bsp_driver_sd.c driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32H7_SD_H
+#define __STM32H7_SD_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_hal.h"
+#include "fatfs_platform.h"
+
+/* Exported types --------------------------------------------------------*/
+/**
+ * @brief SD Card information structure
+ */
+#define BSP_SD_CardInfo HAL_SD_CardInfoTypeDef
+
+/* Exported constants --------------------------------------------------------*/
+/**
+ * @brief SD status structure definition
+ */
+#define MSD_OK ((uint8_t)0x00)
+#define MSD_ERROR ((uint8_t)0x01)
+#define MSD_ERROR_SD_NOT_PRESENT ((uint8_t)0x02)
+
+/**
+ * @brief SD transfer state definition
+ */
+#define SD_TRANSFER_OK ((uint8_t)0x00)
+#define SD_TRANSFER_BUSY ((uint8_t)0x01)
+
+#define SD_PRESENT ((uint8_t)0x01)
+#define SD_NOT_PRESENT ((uint8_t)0x00)
+#define SD_DATATIMEOUT ((uint32_t)100000000)
+
+/* USER CODE BEGIN BSP_H_CODE */
+#define SD_DetectIRQHandler() HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8)
+
+/* Exported functions --------------------------------------------------------*/
+uint8_t BSP_SD_Init(void);
+uint8_t BSP_SD_ITConfig(void);
+uint8_t BSP_SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout);
+uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout);
+uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks);
+uint8_t BSP_SD_WriteBlocks_DMA(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks);
+uint8_t BSP_SD_Erase(uint32_t StartAddr, uint32_t EndAddr);
+uint8_t BSP_SD_GetCardState(void);
+void BSP_SD_GetCardInfo(BSP_SD_CardInfo *CardInfo);
+uint8_t BSP_SD_IsDetected(void);
+
+/* These functions can be modified in case the current settings (e.g. DMA stream)
+ need to be changed for specific application needs */
+void BSP_SD_AbortCallback(void);
+void BSP_SD_WriteCpltCallback(void);
+void BSP_SD_ReadCpltCallback(void);
+/* USER CODE END BSP_H_CODE */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32H7_SD_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/codec.h
@@ -1,0 +1,162 @@
+#include "stm32h7xx_hal.h"
+
+#define CODEC_I2C_ADDRESS (0x10 << 1) // 7-bit address goes one bit over to the left to make room for R/W bit
+
+void AudioCodec_init(I2C_HandleTypeDef* hi2c);
+
+
+
+
+
+
+//Settings for CS4271
+// translated from the datasheet by JS
+
+// 01h mode control 1
+//
+// M1 M0 ratio1 ratio0 m/s dac_dif2 dac_dif1 dac_dif0 // unsure if setting bit selects master means 1
+// for 48k == 0 1 0 0 0 0 0 1 ( ratio bit chosen as 0 0 based on assumption of 256X master clock)
+// == 0x41
+// for 96k == 1 0 0 0 0 0 0 1 ( ratio bit chosen as 0 0 based on assumption of <= 256X master clock)
+// == 0x81
+// for 192k == 1 1 1 0 0 0 0 1 ( ratio bit chosen as 1 0 based on assumption of 256X master clock, choose 0 0 (full word would be 0xc1 instead of 0xe1) instead if using something like 64X)
+// == 0xe1
+
+// 02h DAC control
+// AMUTE, FILT_SEL, DEM1, DEM0, RMP_UP, RMP_DN, INV_A, INV_B
+// 0 0 0 0 1 1 0 0
+// == 0x0c
+
+// 03h dac volume and mixing
+// (NA) B=A soft zerocross ATAPI3 ATAPI2 ATAPI1 ATAPI0 (B=A makes channel volumes not independent)
+// 0 1 1 1 1 0 0 1 (the last four bits set channel L to go to output A and channel R to go to output B, but this is easily changed with mixing or reversal)
+// == 0x79
+
+// 04h Volume A
+// MUTE vol6 vol5 vol4 vol3 vol2 vol1 vol0
+// 0 0 0 0 0 0 0 0
+// == 0x00
+
+// 05h Volume B
+// MUTE vol6 vol5 vol4 vol3 vol2 vol1 vol0
+// 0 0 0 0 0 0 0 0
+// == 0x00
+
+// 06h ADC control
+// (NA) (NA) Dither16 ADC_DIF MUTEA MUTEB HPFDisableA HPFDisableB
+// 0 0 0 1 0 0 0 0
+// ==0x10
+
+// 07h mode control 2
+// (NA) (NA) (NA) LOOP MUTECA=B FREEZE CPEN PDN
+// for power down version == 0 0 0 0 0 1 1 1
+// == 0x07
+// to send dry ADC input into DAC == 0 0 0 1 0 0 1 0
+// == 0x12
+// for normal operation == 0 0 0 0 0 0 1 0
+// == 0x02
+
+/*
+
+
+#ifndef ADCHPD
+ #define ADCHPD 0
+#elif (ADCHPD == 0)||(ADCHPD == 1)
+#else
+ #error ADCHPD value not defined
+#endif
+
+#ifndef ADCS
+ #define ADCS 2
+#elif (ADCS >=0)&&(ADCS <= 2)
+#else
+ #error ADCS value not defined
+#endif
+
+#ifndef HYST
+ #define HYST 32
+#elif (HYST >= 0)&&(HYST <= 255)
+#else
+ #error HYST value not defined
+#endif
+
+#ifndef LINVOL
+ #define LINVOL 0x17
+#elif (LINVOL >= 0) && (LINVOL <= 0x1f)
+#else
+ #error LINVOL value not defined
+#endif
+
+#ifndef RINVOL
+ #define RINVOL 0x17
+#elif (RINVOL >= 0) && (RINVOL <= 0x1f)
+#else
+ #error RINVOL value not defined
+#endif
+
+#ifndef LHPVOL
+ #define LHPVOL 127
+#elif (LHPVOL == 0) || ((LHPVOL >= 0x30) && (LHPVOL <= 0x7f))
+#else
+ #error LHPVOL value not defined
+#endif
+
+#ifndef RHPVOL
+ #define RHPVOL 127
+#elif (RHPVOL == 0) || ((RHPVOL >= 0x30) && (RHPVOL <= 0x7f))
+#else
+ #error RHPVOL value not defined
+#endif
+
+#ifndef MICBOOST
+ #define MICBOOST 0
+#elif (MICBOOST == 0)||(MICBOOST == 1)
+#else
+ #error MICBOOST value not defined
+#endif
+
+ // 1 = muted
+#ifndef MUTEMIC
+ #define MUTEMIC 1
+#elif (MUTEMIC == 0)||(MUTEMIC == 1)
+#else
+ #error MUTEMIC value not defined
+#endif
+
+ // 0 = line inputs, 1 = mic in
+#ifndef INSEL
+ #define INSEL 0
+#elif (INSEL == 0)||(INSEL == 1)
+#else
+ #error INSEL value not defined
+#endif
+
+#ifndef BYPASS
+ #define BYPASS 0 //setting this to 1 passes the line input straight to the line output
+#elif (BYPASS == 0)||(BYPASS == 1)
+#else
+ #error BYPASS value not defined
+#endif
+
+#ifndef DACSEL
+ #define DACSEL 1
+#elif (DACSEL == 0)||(DACSEL == 1)
+#else
+ #error DACSEL value not defined
+#endif
+
+#ifndef SIDETONE
+ #define SIDETONE 0 // setting this to 1 passes the mic input straight to the line output
+#elif (SIDETONE == 0)||(SIDETONE == 1)
+#else
+ #error SIDETONE value not defined
+#endif
+
+#ifndef SIDEATT
+ #define SIDEATT 0
+#elif (SIDEATT >= 0)&&(SIDEATT <= 3)
+#else
+ #error SIDEATT value not defined
+#endif
+
+*/
--- /dev/null
+++ b/LEAF/Inc/custom_fonts.h
@@ -1,0 +1,6894 @@
+/*
+ * gothic_font.h
+ *
+ * Created on: Jul 8, 2018
+ * Author: jeffsnyder
+ */
+
+#ifndef CUSTOM_FONTS_H_
+#define CUSTOM_FONTS_H_
+
+#include "stm32h7xx_hal.h"
+#include "gfx_font.h"
+
+
+#define PROGMEM
+
+// 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 Monospaced_plain_18Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0xFF,0xFF,0xC3,0xC0, // '!'
+ 0xCF,0x3C,0xF3,0xCC, // '"'
+ 0x04,0xC1,0x90,0x32,0x04,0xC7,0xFE,0xFF,0xC6,0x40,0x98,0xFF,0xDF,0xF8,0xC8,0x11,0x02,0x60,0xCC,0x00, // '#'
+ 0x08,0x04,0x0F,0x8F,0xEC,0x96,0x43,0x20,0xF0,0x0F,0x04,0xC2,0x71,0x3F,0xF3,0xF0,0x20,0x10,0x08,0x00, // '$'
+ 0x78,0x19,0x83,0x30,0x66,0x0C,0xC0,0xF3,0x83,0x83,0x9E,0x06,0x60,0xCC,0x19,0x83,0x30,0x3C, // '%'
+ 0x1F,0x0F,0xC3,0x00,0xC0,0x18,0x0F,0x06,0xCF,0x3B,0xC7,0xF0,0xEE,0x31,0xF6,0x3D,0xC0, // '&'
+ 0xFF,0xC0, // '''
+ 0x32,0x66,0x4C,0xCC,0xCC,0xC4,0x66,0x23, // '('
+ 0xC4,0x66,0x23,0x33,0x33,0x32,0x66,0x4C, // ')'
+ 0x11,0x25,0x51,0xC3,0x8A,0xA4,0x88, // '*'
+ 0x0C,0x03,0x00,0xC0,0x30,0xFF,0xFF,0xF0,0xC0,0x30,0x0C,0x03,0x00, // '+'
+ 0x6D,0xE8, // ','
+ 0xFF,0xC0, // '-'
+ 0xFC, // '.'
+ 0x01,0x81,0x80,0xC0,0xC0,0x60,0x60,0x30,0x38,0x18,0x0C,0x0C,0x06,0x06,0x03,0x03,0x00, // '/'
+ 0x3E,0x3F,0x98,0xD8,0x3C,0x1E,0x6F,0x37,0x83,0xC1,0xE0,0xD8,0xCF,0xE3,0xE0, // '0'
+ 0x38,0xF8,0xD8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF, // '1'
+ 0x7E,0x7F,0xA0,0xE0,0x30,0x18,0x1C,0x0C,0x1C,0x1C,0x1C,0x18,0x1F,0xFF,0xF8, // '2'
+ 0x7E,0x7F,0xA0,0xE0,0x30,0x39,0xF8,0xFC,0x07,0x01,0x80,0xE0,0xFF,0xE7,0xE0, // '3'
+ 0x06,0x07,0x03,0x82,0xC3,0x61,0x31,0x99,0x8C,0xFF,0xFF,0xC1,0x80,0xC0,0x60, // '4'
+ 0x7F,0x3F,0x98,0x0C,0x07,0xE3,0xF9,0x0E,0x03,0x01,0x80,0xE0,0xFF,0xE7,0xE0, // '5'
+ 0x1E,0x3F,0x9C,0x5C,0x0C,0x06,0xF3,0xFD,0xC7,0xC1,0xE0,0xD8,0xEF,0xE3,0xE0, // '6'
+ 0xFF,0xFF,0xC0,0xC0,0x60,0x70,0x30,0x18,0x18,0x0C,0x0E,0x06,0x03,0x03,0x00, // '7'
+ 0x3E,0x3F,0xB0,0x78,0x3C,0x1B,0xF9,0xFD,0xC7,0xC1,0xE0,0xF8,0xEF,0xE3,0xE0, // '8'
+ 0x3E,0x3F,0xB8,0xD8,0x3C,0x1F,0x1D,0xFE,0x7B,0x01,0x81,0xD1,0xCF,0xE3,0xC0, // '9'
+ 0xFC,0x0F,0xC0, // ':'
+ 0x6D,0x80,0x1B,0x7A,0x00, // ';'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc0, 0x1c, 0x03, 0xc0, 0x7c, 0x0f,
+ 0xc1, 0xfc, 0x0f, 0xc0, 0x7c, 0x03, 0xc0, 0x1c, 0x00, 0xc0, 0x04, // '<'
+ 0xFF,0xFF,0xC0,0x00,0x0F,0xFF,0xFC, // '='
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x60, 0x07, 0x00, 0x78, 0x07, 0xc0, 0x7e,
+ 0x07, 0xf0, 0x7e, 0x07, 0xc0, 0x78, 0x07, 0x00, 0x60, 0x04, 0x00, // '>'
+ 0x7D,0xFE,0x18,0x30,0xE3,0x8E,0x18,0x30,0x60,0x01,0x83,0x00, // '?'
+ 0x1E,0x19,0x98,0x6C,0xFC,0xDE,0x6F,0x37,0x9B,0xCD,0xE6,0xF1,0xEC,0x06,0x01,0x80,0x78, // '@'
+ 0x1C,0x0E,0x07,0x03,0x83,0x61,0xB0,0xD8,0x6C,0x7F,0x3F,0x98,0xD8,0x3C,0x18, // 'A'
+ 0xFE,0x7F,0xB0,0x78,0x3C,0x1F,0xFB,0xFD,0x87,0xC1,0xE0,0xF0,0xFF,0xEF,0xE0, // 'B'
+ 0x1F,0x1F,0xDC,0x3C,0x0C,0x06,0x03,0x01,0x80,0xC0,0x70,0x1C,0x27,0xF1,0xF0, // 'C'
+ 0xFC,0x7F,0x31,0xD8,0x7C,0x1E,0x0F,0x07,0x83,0xC1,0xE1,0xF1,0xDF,0xCF,0xC0, // 'D'
+ 0xFF,0xFF,0xF0,0x18,0x0C,0x07,0xFF,0xFF,0x80,0xC0,0x60,0x30,0x1F,0xFF,0xF8, // 'E'
+ 0xFF,0xFF,0xF0,0x18,0x0C,0x07,0xFB,0xFD,0x80,0xC0,0x60,0x30,0x18,0x0C,0x00, // 'F'
+ 0x1F,0x1F,0xDC,0x3C,0x0C,0x06,0x3F,0x1F,0x83,0xC1,0xF0,0xD8,0x67,0xF1,0xE0, // 'G'
+ 0xC1,0xE0,0xF0,0x78,0x3C,0x1F,0xFF,0xFF,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x18, // 'H'
+ 0xFF,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF, // 'I'
+ 0x3E,0x7C,0x18,0x30,0x60,0xC1,0x83,0x06,0x0E,0x1F,0xE7,0x80, // 'J'
+ 0xC1,0xB0,0xCC,0x63,0x30,0xD8,0x3E,0x0F,0x83,0x30,0xCE,0x31,0x8C,0x33,0x0E,0xC1,0x80, // 'K'
+ 0xC0,0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x80,0xC0,0x60,0x30,0x1F,0xFF,0xF8, // 'L'
+ 0xE3,0xF1,0xF8,0xFE,0xFD,0x5E,0xAF,0x77,0x93,0xC1,0xE0,0xF0,0x78,0x3C,0x18, // 'M'
+ 0xE1,0xF0,0xFC,0x7A,0x3D,0x1E,0xCF,0x27,0x9B,0xC5,0xE2,0xF1,0xF8,0x7C,0x38, // 'N'
+ 0x3E,0x3F,0x98,0xD8,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xD8,0xCF,0xE3,0xE0, // 'O'
+ 0xFE,0x7F,0xB0,0xF8,0x3C,0x1E,0x1F,0xFD,0xFC,0xC0,0x60,0x30,0x18,0x0C,0x00, // 'P'
+ 0x3E,0x3F,0x98,0xD8,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xD8,0xCF,0xE3,0xE0,0x38,0x0C, // 'Q'
+ 0xFE,0x3F,0xCC,0x3B,0x06,0xC1,0xB0,0xEF,0xF3,0xF8,0xC3,0x30,0xEC,0x1B,0x06,0xC0,0xC0, // 'R'
+ 0x3E,0x3F,0xB8,0x58,0x0C,0x03,0xE0,0xFC,0x07,0x01,0x80,0xE0,0xFF,0xE7,0xE0, // 'S'
+ 0xFF,0xFF,0xF0,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x00, // 'T'
+ 0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF8,0xEF,0xE3,0xE0, // 'U'
+ 0xC1,0xE0,0xD8,0xCC,0x66,0x33,0xB8,0xD8,0x6C,0x36,0x0E,0x07,0x03,0x81,0xC0, // 'V'
+ 0xC0,0x78,0x0F,0x01,0xB0,0x66,0xEC,0xDD,0x9A,0xB3,0x56,0x6A,0xCF,0x78,0xC6,0x18,0xC3,0x18, // 'W'
+ 0xE3,0xB1,0x9D,0x86,0xC1,0xC0,0xE0,0x70,0x38,0x3E,0x1B,0x1D,0xCC,0x6E,0x38, // 'X'
+ 0xE1,0xD8,0x67,0x38,0xCC,0x1E,0x07,0x80,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x00, // 'Y'
+ 0xFF,0xFF,0xC0,0xC0,0xE0,0x60,0x60,0x70,0x30,0x38,0x38,0x18,0x1F,0xFF,0xF8, // 'Z'
+ 0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xFF, // '['
+ 0xC0,0x30,0x18,0x06,0x03,0x00,0xC0,0x60,0x38,0x0C,0x06,0x01,0x80,0xC0,0x30,0x18,0x06, // '\'
+ 0xFF,0x33,0x33,0x33,0x33,0x33,0x33,0xFF, // ']'
+ 0x0C,0x07,0x83,0x31,0x86,0xC0,0xC0, // '^'
+ 0xFF,0xFF,0xFC, // '_'
+ 0xC6,0x30, // '`'
+ 0x3E,0x3F,0x90,0xE0,0x33,0xFF,0xFF,0x07,0x87,0xFF,0xBE,0xC0, // 'a'
+ 0xC0,0x60,0x30,0x18,0x0D,0xE7,0xFB,0x8F,0x83,0xC1,0xE0,0xF0,0x7C,0x7F,0xF6,0xF0, // 'b'
+ 0x1E,0x7F,0x61,0xC0,0xC0,0xC0,0xC0,0x61,0x7F,0x1E, // 'c'
+ 0x01,0x80,0xC0,0x60,0x33,0xDB,0xFF,0x8F,0x83,0xC1,0xE0,0xF0,0x7C,0x77,0xF9,0xEC, // 'd'
+ 0x3E,0x3F,0x98,0xF8,0x3F,0xFF,0xFF,0x00,0xC1,0x7F,0x8F,0x80, // 'e'
+ 0x0F,0x1F,0x18,0x18,0xFF,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, // 'f'
+ 0x3D,0xBF,0xF8,0xF8,0x3C,0x1E,0x0F,0x07,0xC7,0x7F,0x9E,0xC0,0x68,0x77,0xF1,0xF0, // 'g'
+ 0xC0,0x60,0x30,0x18,0x0C,0xE7,0xFB,0x8F,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0C, // 'h'
+ 0x18,0x18,0x00,0x00,0xF8,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF, // 'i'
+ 0x0C,0x30,0x00,0x7D,0xF0,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0xFB,0xC0, // 'j'
+ 0xC0,0x60,0x30,0x18,0x0C,0x3E,0x3B,0x39,0xB8,0xF8,0x7E,0x33,0x18,0xCC,0x76,0x1C, // 'k'
+ 0xF8,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0F,0x0F, // 'l'
+ 0xDB,0xBF,0xFC,0xCF,0x33,0xCC,0xF3,0x3C,0xCF,0x33,0xCC,0xF3,0x30, // 'm'
+ 0xCE,0x7F,0xB8,0xF8,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xC0, // 'n'
+ 0x3E,0x3F,0xB8,0xF8,0x3C,0x1E,0x0F,0x07,0xC7,0x7F,0x1F,0x00, // 'o'
+ 0xDE,0x7F,0xB8,0xF8,0x3C,0x1E,0x0F,0x07,0xC7,0xFF,0x6F,0x30,0x18,0x0C,0x06,0x00, // 'p'
+ 0x3D,0xBF,0xF8,0xF8,0x3C,0x1E,0x0F,0x07,0xC7,0x7F,0x9E,0xC0,0x60,0x30,0x18,0x0C, // 'q'
+ 0xDD,0xBF,0x8E,0x0C,0x18,0x30,0x60,0xC1,0x80, // 'r'
+ 0x3F,0x7F,0xF0,0x3F,0x07,0xF0,0x3C,0x07,0x03,0xFF,0xBF,0x00, // 's'
+ 0x18,0x0C,0x06,0x1F,0xFF,0xF8,0xC0,0x60,0x30,0x18,0x0C,0x06,0x03,0xF0,0xF8, // 't'
+ 0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0xC7,0x7F,0x9C,0xC0, // 'u'
+ 0xC1,0xB1,0x98,0xCC,0x63,0x61,0xB0,0xD8,0x38,0x1C,0x0E,0x00, // 'v'
+ 0xC0,0x78,0x0D,0x83,0x32,0x66,0xEC,0xD5,0x8E,0xE1,0xDC,0x31,0x86,0x30, // 'w'
+ 0xE3,0xBB,0x8D,0x83,0x81,0xC0,0xE0,0xF8,0x6C,0x63,0x71,0xC0, // 'x'
+ 0xC1,0xB1,0x98,0xCE,0x63,0x61,0xB0,0x78,0x38,0x0C,0x0E,0x06,0x03,0x07,0x83,0x80, // 'y'
+ 0xFF,0xFF,0xC1,0xC1,0xC1,0xC0,0xC0,0xC0,0xE0,0xFF,0xFF,0xC0, // 'z'
+ 0x0F,0x1F,0x18,0x18,0x18,0x18,0x18,0xF0,0xF0,0x38,0x18,0x18,0x18,0x18,0x18,0x1F,0x0F, // '{'
+ 0xFF,0xFF,0xFF,0xFF,0xF0, // '|'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x81, 0x98, 0x19, 0x81, 0x98, 0x7f,
+ 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe0, 0x00// lock icon
+ //0xF0,0xF8,0x18,0x18,0x18,0x18,0x18,0x0F,0x0F,0x1C,0x18,0x18,0x18,0x18,0x18,0xF8,0xF0 // '}'
+};
+const GFXglyph Monospaced_plain_18Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 12, 0, 0 }, // ' '
+ { 1, 2, 13, 12, 5, -13 }, // '!'
+ { 5, 6, 5, 12, 3, -13 }, // '"'
+ { 9, 11, 14, 12, 0, -14 }, // '#'
+ { 29, 9, 17, 12, 1, -14 }, // '$'
+ { 49, 11, 13, 12, 0, -13 }, // '%'
+ { 67, 10, 13, 12, 1, -13 }, // '&'
+ { 84, 2, 5, 12, 5, -13 }, // '''
+ { 86, 4, 16, 12, 4, -14 }, // '('
+ { 94, 4, 16, 12, 3, -14 }, // ')'
+ { 102, 7, 8, 12, 2, -13 }, // '*'
+ { 109, 10, 10, 12, 1, -11 }, // '+'
+ { 122, 3, 5, 12, 3, -3 }, // ','
+ { 124, 5, 2, 12, 3, -6 }, // '-'
+ { 126, 2, 3, 12, 4, -3 }, // '.'
+ { 127, 9, 15, 12, 1, -13 }, // '/'
+ { 144, 9, 13, 12, 1, -13 }, // '0'
+ { 159, 8, 13, 12, 2, -13 }, // '1'
+ { 172, 9, 13, 12, 1, -13 }, // '2'
+ { 187, 9, 13, 12, 1, -13 }, // '3'
+ { 202, 9, 13, 12, 1, -13 }, // '4'
+ { 217, 9, 13, 12, 1, -13 }, // '5'
+ { 232, 9, 13, 12, 1, -13 }, // '6'
+ { 247, 9, 13, 12, 1, -13 }, // '7'
+ { 262, 9, 13, 12, 1, -13 }, // '8'
+ { 277, 9, 13, 12, 1, -13 }, // '9'
+ { 292, 2, 9, 12, 4, -9 }, // ':'
+ { 295, 3, 11, 12, 3, -9 }, // ';'
+ { 300, 12, 18, 12, 0, -18 }, // '<'
+ { 327, 9, 6, 12, 1, -9 }, // '='
+ { 334, 12, 18, 12, 0, -18 }, // '>'
+ { 361, 7, 13, 12, 2, -13 }, // '?'
+ { 373, 9, 15, 12, 1, -12 }, // '@'
+ { 390, 9, 13, 12, 1, -13 }, // 'A'
+ { 405, 9, 13, 12, 1, -13 }, // 'B'
+ { 420, 9, 13, 12, 1, -13 }, // 'C'
+ { 435, 9, 13, 12, 1, -13 }, // 'D'
+ { 450, 9, 13, 12, 1, -13 }, // 'E'
+ { 465, 9, 13, 12, 1, -13 }, // 'F'
+ { 480, 9, 13, 12, 1, -13 }, // 'G'
+ { 495, 9, 13, 12, 1, -13 }, // 'H'
+ { 510, 8, 13, 12, 2, -13 }, // 'I'
+ { 524, 7, 13, 12, 1, -13 }, // 'J'
+ { 535, 10, 13, 12, 1, -13 }, // 'K'
+ { 552, 9, 13, 12, 1, -13 }, // 'L'
+ { 567, 9, 13, 12, 1, -13 }, // 'M'
+ { 582, 9, 13, 12, 1, -13 }, // 'N'
+ { 597, 9, 13, 12, 1, -13 }, // 'O'
+ { 612, 9, 13, 12, 1, -13 }, // 'P'
+ { 627, 9, 15, 12, 1, -13 }, // 'Q'
+ { 644, 10, 13, 12, 1, -13 }, // 'R'
+ { 661, 9, 13, 12, 1, -13 }, // 'S'
+ { 676, 10, 13, 12, 1, -13 }, // 'T'
+ { 693, 9, 13, 12, 1, -13 }, // 'U'
+ { 708, 9, 13, 12, 1, -13 }, // 'V'
+ { 723, 11, 13, 12, 0, -13 }, // 'W'
+ { 741, 9, 13, 12, 1, -13 }, // 'X'
+ { 756, 10, 13, 12, 1, -13 }, // 'Y'
+ { 773, 9, 13, 12, 1, -13 }, // 'Z'
+ { 788, 4, 16, 12, 4, -14 }, // '['
+ { 796, 9, 15, 12, 1, -13 }, // '\'
+ { 813, 4, 16, 12, 3, -14 }, // ']'
+ { 821, 10, 5, 12, 1, -13 }, // '^'
+ { 828, 11, 2, 12, 0, 2 }, // '_'
+ { 831, 4, 3, 12, 2, -14 }, // '`'
+ { 833, 9, 10, 12, 1, -10 }, // 'a'
+ { 845, 9, 14, 12, 1, -14 }, // 'b'
+ { 861, 8, 10, 12, 1, -10 }, // 'c'
+ { 871, 9, 14, 12, 1, -14 }, // 'd'
+ { 887, 9, 10, 12, 1, -10 }, // 'e'
+ { 899, 8, 14, 12, 1, -14 }, // 'f'
+ { 913, 9, 14, 12, 1, -10 }, // 'g'
+ { 929, 9, 14, 12, 1, -14 }, // 'h'
+ { 945, 8, 14, 12, 2, -14 }, // 'i'
+ { 959, 6, 18, 12, 1, -14 }, // 'j'
+ { 973, 9, 14, 12, 1, -14 }, // 'k'
+ { 989, 8, 14, 12, 1, -14 }, // 'l'
+ { 1003, 10, 10, 12, 1, -10 }, // 'm'
+ { 1017, 9, 10, 12, 1, -10 }, // 'n'
+ { 1028, 9, 10, 12, 1, -10 }, // 'o'
+ { 1040, 9, 14, 12, 1, -10 }, // 'p'
+ { 1056, 9, 14, 12, 1, -10 }, // 'q'
+ { 1072, 7, 10, 12, 3, -10 }, // 'r'
+ { 1081, 9, 10, 12, 1, -10 }, // 's'
+ { 1093, 9, 13, 12, 1, -13 }, // 't'
+ { 1108, 9, 10, 12, 1, -10 }, // 'u'
+ { 1120, 9, 10, 12, 1, -10 }, // 'v'
+ { 1132, 11, 10, 12, 0, -10 }, // 'w'
+ { 1146, 9, 10, 12, 1, -10 }, // 'x'
+ { 1158, 9, 14, 12, 1, -10 }, // 'y'
+ { 1174, 9, 10, 12, 1, -10 }, // 'z'
+ { 1186, 8, 17, 12, 2, -14 }, // '{'
+ { 1203, 2, 18, 12, 5, -14 }, // '|'
+ { 1208, 12, 18, 12, 0, -18 } // lock icon
+ //{ 1176, 8, 17, 12, 2, -14 } // '}'
+};
+const GFXfont Monospaced_plain_18 PROGMEM = {
+(uint8_t *)Monospaced_plain_18Bitmaps,(GFXglyph *)Monospaced_plain_18Glyphs,0x20, 0x7E, 16};
+
+
+const uint8_t FreeMono9pt7bBitmaps[] = {
+ 0xAA, 0xA8, 0x0C, 0xED, 0x24, 0x92, 0x48, 0x24, 0x48, 0x91, 0x2F, 0xE4,
+ 0x89, 0x7F, 0x28, 0x51, 0x22, 0x40, 0x08, 0x3E, 0x62, 0x40, 0x30, 0x0E,
+ 0x01, 0x81, 0xC3, 0xBE, 0x08, 0x08, 0x71, 0x12, 0x23, 0x80, 0x23, 0xB8,
+ 0x0E, 0x22, 0x44, 0x70, 0x38, 0x81, 0x02, 0x06, 0x1A, 0x65, 0x46, 0xC8,
+ 0xEC, 0xE9, 0x24, 0x5A, 0xAA, 0xA9, 0x40, 0xA9, 0x55, 0x5A, 0x80, 0x10,
+ 0x22, 0x4B, 0xE3, 0x05, 0x11, 0x00, 0x10, 0x20, 0x47, 0xF1, 0x02, 0x04,
+ 0x00, 0x6B, 0x48, 0xFF, 0x00, 0xF0, 0x02, 0x08, 0x10, 0x60, 0x81, 0x04,
+ 0x08, 0x20, 0x41, 0x02, 0x08, 0x00, 0x38, 0x8A, 0x0C, 0x18, 0x30, 0x60,
+ 0xC1, 0x82, 0x88, 0xE0, 0x27, 0x28, 0x42, 0x10, 0x84, 0x21, 0x3E, 0x38,
+ 0x8A, 0x08, 0x10, 0x20, 0x82, 0x08, 0x61, 0x03, 0xF8, 0x7C, 0x06, 0x02,
+ 0x02, 0x1C, 0x06, 0x01, 0x01, 0x01, 0x42, 0x3C, 0x18, 0xA2, 0x92, 0x8A,
+ 0x28, 0xBF, 0x08, 0x21, 0xC0, 0x7C, 0x81, 0x03, 0xE4, 0x40, 0x40, 0x81,
+ 0x03, 0x88, 0xE0, 0x1E, 0x41, 0x04, 0x0B, 0x98, 0xB0, 0xC1, 0xC2, 0x88,
+ 0xE0, 0xFE, 0x04, 0x08, 0x20, 0x40, 0x82, 0x04, 0x08, 0x20, 0x40, 0x38,
+ 0x8A, 0x0C, 0x14, 0x47, 0x11, 0x41, 0x83, 0x8C, 0xE0, 0x38, 0x8A, 0x1C,
+ 0x18, 0x68, 0xCE, 0x81, 0x04, 0x13, 0xC0, 0xF0, 0x0F, 0x6C, 0x00, 0xD2,
+ 0xD2, 0x00, 0x03, 0x04, 0x18, 0x60, 0x60, 0x18, 0x04, 0x03, 0xFF, 0x80,
+ 0x00, 0x1F, 0xF0, 0x40, 0x18, 0x03, 0x00, 0x60, 0x20, 0x60, 0xC0, 0x80,
+ 0x3D, 0x84, 0x08, 0x30, 0xC2, 0x00, 0x00, 0x00, 0x30, 0x3C, 0x46, 0x82,
+ 0x8E, 0xB2, 0xA2, 0xA2, 0x9F, 0x80, 0x80, 0x40, 0x3C, 0x3C, 0x01, 0x40,
+ 0x28, 0x09, 0x01, 0x10, 0x42, 0x0F, 0xC1, 0x04, 0x40, 0x9E, 0x3C, 0xFE,
+ 0x21, 0x90, 0x48, 0x67, 0xE2, 0x09, 0x02, 0x81, 0x41, 0xFF, 0x80, 0x3E,
+ 0xB0, 0xF0, 0x30, 0x08, 0x04, 0x02, 0x00, 0x80, 0x60, 0x8F, 0x80, 0xFE,
+ 0x21, 0x90, 0x68, 0x14, 0x0A, 0x05, 0x02, 0x83, 0x43, 0x7F, 0x00, 0xFF,
+ 0x20, 0x90, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x81, 0x40, 0xFF, 0xC0, 0xFF,
+ 0xA0, 0x50, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x80, 0x40, 0x78, 0x00, 0x1E,
+ 0x98, 0x6C, 0x0A, 0x00, 0x80, 0x20, 0xF8, 0x0B, 0x02, 0x60, 0x87, 0xC0,
+ 0xE3, 0xA0, 0x90, 0x48, 0x27, 0xF2, 0x09, 0x04, 0x82, 0x41, 0x71, 0xC0,
+ 0xF9, 0x08, 0x42, 0x10, 0x84, 0x27, 0xC0, 0x1F, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x82, 0x82, 0xC6, 0x78, 0xE3, 0xA1, 0x11, 0x09, 0x05, 0x83, 0x21,
+ 0x08, 0x84, 0x41, 0x70, 0xC0, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41,
+ 0x41, 0x41, 0xFF, 0xE0, 0xEC, 0x19, 0x45, 0x28, 0xA4, 0xA4, 0x94, 0x91,
+ 0x12, 0x02, 0x40, 0x5C, 0x1C, 0xC3, 0xB0, 0x94, 0x4A, 0x24, 0x92, 0x49,
+ 0x14, 0x8A, 0x43, 0x70, 0x80, 0x1E, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06,
+ 0x02, 0x82, 0x63, 0x0F, 0x00, 0xFE, 0x43, 0x41, 0x41, 0x42, 0x7C, 0x40,
+ 0x40, 0x40, 0xF0, 0x1C, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06, 0x02, 0x82,
+ 0x63, 0x1F, 0x04, 0x07, 0x92, 0x30, 0xFE, 0x21, 0x90, 0x48, 0x24, 0x23,
+ 0xE1, 0x10, 0x84, 0x41, 0x70, 0xC0, 0x3A, 0xCD, 0x0A, 0x03, 0x01, 0x80,
+ 0xC1, 0xC7, 0x78, 0xFF, 0xC4, 0x62, 0x21, 0x00, 0x80, 0x40, 0x20, 0x10,
+ 0x08, 0x1F, 0x00, 0xE3, 0xA0, 0x90, 0x48, 0x24, 0x12, 0x09, 0x04, 0x82,
+ 0x22, 0x0E, 0x00, 0xF1, 0xE8, 0x10, 0x82, 0x10, 0x42, 0x10, 0x22, 0x04,
+ 0x80, 0x50, 0x0C, 0x00, 0x80, 0xF1, 0xE8, 0x09, 0x11, 0x25, 0x44, 0xA8,
+ 0x55, 0x0C, 0xA1, 0x8C, 0x31, 0x84, 0x30, 0xE3, 0xA0, 0x88, 0x82, 0x80,
+ 0x80, 0xC0, 0x90, 0x44, 0x41, 0x71, 0xC0, 0xE3, 0xA0, 0x88, 0x82, 0x81,
+ 0x40, 0x40, 0x20, 0x10, 0x08, 0x1F, 0x00, 0xFD, 0x0A, 0x20, 0x81, 0x04,
+ 0x10, 0x21, 0x83, 0xFC, 0xEA, 0xAA, 0xAA, 0xC0, 0x80, 0x81, 0x03, 0x02,
+ 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0xD5, 0x55, 0x55, 0xC0,
+ 0x10, 0x51, 0x22, 0x28, 0x20, 0xFF, 0xE0, 0x88, 0x80, 0x7E, 0x00, 0x80,
+ 0x47, 0xEC, 0x14, 0x0A, 0x0C, 0xFB, 0xC0, 0x20, 0x10, 0x0B, 0xC6, 0x12,
+ 0x05, 0x02, 0x81, 0x40, 0xB0, 0xB7, 0x80, 0x3A, 0x8E, 0x0C, 0x08, 0x10,
+ 0x10, 0x9E, 0x03, 0x00, 0x80, 0x47, 0xA4, 0x34, 0x0A, 0x05, 0x02, 0x81,
+ 0x21, 0x8F, 0x60, 0x3C, 0x43, 0x81, 0xFF, 0x80, 0x80, 0x61, 0x3E, 0x3D,
+ 0x04, 0x3E, 0x41, 0x04, 0x10, 0x41, 0x0F, 0x80, 0x3D, 0xA1, 0xA0, 0x50,
+ 0x28, 0x14, 0x09, 0x0C, 0x7A, 0x01, 0x01, 0x87, 0x80, 0xC0, 0x20, 0x10,
+ 0x0B, 0xC6, 0x32, 0x09, 0x04, 0x82, 0x41, 0x20, 0xB8, 0xE0, 0x10, 0x01,
+ 0xC0, 0x81, 0x02, 0x04, 0x08, 0x11, 0xFC, 0x10, 0x3E, 0x10, 0x84, 0x21,
+ 0x08, 0x42, 0x3F, 0x00, 0xC0, 0x40, 0x40, 0x4F, 0x44, 0x58, 0x70, 0x48,
+ 0x44, 0x42, 0xC7, 0x70, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x23,
+ 0xF8, 0xB7, 0x64, 0x62, 0x31, 0x18, 0x8C, 0x46, 0x23, 0x91, 0x5E, 0x31,
+ 0x90, 0x48, 0x24, 0x12, 0x09, 0x05, 0xC7, 0x3E, 0x31, 0xA0, 0x30, 0x18,
+ 0x0C, 0x05, 0x8C, 0x7C, 0xDE, 0x30, 0x90, 0x28, 0x14, 0x0A, 0x05, 0x84,
+ 0xBC, 0x40, 0x20, 0x38, 0x00, 0x3D, 0xA1, 0xA0, 0x50, 0x28, 0x14, 0x09,
+ 0x0C, 0x7A, 0x01, 0x00, 0x80, 0xE0, 0xCE, 0xA1, 0x82, 0x04, 0x08, 0x10,
+ 0x7C, 0x3A, 0x8D, 0x0B, 0x80, 0xF0, 0x70, 0xDE, 0x40, 0x40, 0xFC, 0x40,
+ 0x40, 0x40, 0x40, 0x40, 0x41, 0x3E, 0xC3, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x43, 0x3D, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x20, 0xA0, 0x50, 0x10, 0xE3,
+ 0xC0, 0x92, 0x4B, 0x25, 0x92, 0xA9, 0x98, 0x44, 0xE3, 0x31, 0x05, 0x01,
+ 0x01, 0x41, 0x11, 0x05, 0xC7, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x40, 0xA0,
+ 0x60, 0x10, 0x10, 0x08, 0x3E, 0x00, 0xFD, 0x08, 0x20, 0x82, 0x08, 0x10,
+ 0xBF, 0x29, 0x24, 0xA2, 0x49, 0x26, 0xFF, 0xF8, 0x89, 0x24, 0x8A, 0x49,
+ 0x2C, 0x61, 0x24, 0x30 };
+
+const GFXglyph FreeMono9pt7bGlyphs[] = {
+ { 0, 0, 0, 11, 0, 1 }, // 0x20 ' '
+ { 0, 2, 11, 11, 4, -10 }, // 0x21 '!'
+ { 3, 6, 5, 11, 2, -10 }, // 0x22 '"'
+ { 7, 7, 12, 11, 2, -10 }, // 0x23 '#'
+ { 18, 8, 12, 11, 1, -10 }, // 0x24 '$'
+ { 30, 7, 11, 11, 2, -10 }, // 0x25 '%'
+ { 40, 7, 10, 11, 2, -9 }, // 0x26 '&'
+ { 49, 3, 5, 11, 4, -10 }, // 0x27 '''
+ { 51, 2, 13, 11, 5, -10 }, // 0x28 '('
+ { 55, 2, 13, 11, 4, -10 }, // 0x29 ')'
+ { 59, 7, 7, 11, 2, -10 }, // 0x2A '*'
+ { 66, 7, 7, 11, 2, -8 }, // 0x2B '+'
+ { 73, 3, 5, 11, 2, -1 }, // 0x2C ','
+ { 75, 9, 1, 11, 1, -5 }, // 0x2D '-'
+ { 77, 2, 2, 11, 4, -1 }, // 0x2E '.'
+ { 78, 7, 13, 11, 2, -11 }, // 0x2F '/'
+ { 90, 7, 11, 11, 2, -10 }, // 0x30 '0'
+ { 100, 5, 11, 11, 3, -10 }, // 0x31 '1'
+ { 107, 7, 11, 11, 2, -10 }, // 0x32 '2'
+ { 117, 8, 11, 11, 1, -10 }, // 0x33 '3'
+ { 128, 6, 11, 11, 3, -10 }, // 0x34 '4'
+ { 137, 7, 11, 11, 2, -10 }, // 0x35 '5'
+ { 147, 7, 11, 11, 2, -10 }, // 0x36 '6'
+ { 157, 7, 11, 11, 2, -10 }, // 0x37 '7'
+ { 167, 7, 11, 11, 2, -10 }, // 0x38 '8'
+ { 177, 7, 11, 11, 2, -10 }, // 0x39 '9'
+ { 187, 2, 8, 11, 4, -7 }, // 0x3A ':'
+ { 189, 3, 11, 11, 3, -7 }, // 0x3B ';'
+ { 194, 8, 8, 11, 1, -8 }, // 0x3C '<'
+ { 202, 9, 4, 11, 1, -6 }, // 0x3D '='
+ { 207, 9, 8, 11, 1, -8 }, // 0x3E '>'
+ { 216, 7, 10, 11, 2, -9 }, // 0x3F '?'
+ { 225, 8, 12, 11, 2, -10 }, // 0x40 '@'
+ { 237, 11, 10, 11, 0, -9 }, // 0x41 'A'
+ { 251, 9, 10, 11, 1, -9 }, // 0x42 'B'
+ { 263, 9, 10, 11, 1, -9 }, // 0x43 'C'
+ { 275, 9, 10, 11, 1, -9 }, // 0x44 'D'
+ { 287, 9, 10, 11, 1, -9 }, // 0x45 'E'
+ { 299, 9, 10, 11, 1, -9 }, // 0x46 'F'
+ { 311, 10, 10, 11, 1, -9 }, // 0x47 'G'
+ { 324, 9, 10, 11, 1, -9 }, // 0x48 'H'
+ { 336, 5, 10, 11, 3, -9 }, // 0x49 'I'
+ { 343, 8, 10, 11, 2, -9 }, // 0x4A 'J'
+ { 353, 9, 10, 11, 1, -9 }, // 0x4B 'K'
+ { 365, 8, 10, 11, 2, -9 }, // 0x4C 'L'
+ { 375, 11, 10, 11, 0, -9 }, // 0x4D 'M'
+ { 389, 9, 10, 11, 1, -9 }, // 0x4E 'N'
+ { 401, 9, 10, 11, 1, -9 }, // 0x4F 'O'
+ { 413, 8, 10, 11, 1, -9 }, // 0x50 'P'
+ { 423, 9, 13, 11, 1, -9 }, // 0x51 'Q'
+ { 438, 9, 10, 11, 1, -9 }, // 0x52 'R'
+ { 450, 7, 10, 11, 2, -9 }, // 0x53 'S'
+ { 459, 9, 10, 11, 1, -9 }, // 0x54 'T'
+ { 471, 9, 10, 11, 1, -9 }, // 0x55 'U'
+ { 483, 11, 10, 11, 0, -9 }, // 0x56 'V'
+ { 497, 11, 10, 11, 0, -9 }, // 0x57 'W'
+ { 511, 9, 10, 11, 1, -9 }, // 0x58 'X'
+ { 523, 9, 10, 11, 1, -9 }, // 0x59 'Y'
+ { 535, 7, 10, 11, 2, -9 }, // 0x5A 'Z'
+ { 544, 2, 13, 11, 5, -10 }, // 0x5B '['
+ { 548, 7, 13, 11, 2, -11 }, // 0x5C '\'
+ { 560, 2, 13, 11, 4, -10 }, // 0x5D ']'
+ { 564, 7, 5, 11, 2, -10 }, // 0x5E '^'
+ { 569, 11, 1, 11, 0, 2 }, // 0x5F '_'
+ { 571, 3, 3, 11, 3, -11 }, // 0x60 '`'
+ { 573, 9, 8, 11, 1, -7 }, // 0x61 'a'
+ { 582, 9, 11, 11, 1, -10 }, // 0x62 'b'
+ { 595, 7, 8, 11, 2, -7 }, // 0x63 'c'
+ { 602, 9, 11, 11, 1, -10 }, // 0x64 'd'
+ { 615, 8, 8, 11, 1, -7 }, // 0x65 'e'
+ { 623, 6, 11, 11, 3, -10 }, // 0x66 'f'
+ { 632, 9, 11, 11, 1, -7 }, // 0x67 'g'
+ { 645, 9, 11, 11, 1, -10 }, // 0x68 'h'
+ { 658, 7, 10, 11, 2, -9 }, // 0x69 'i'
+ { 667, 5, 13, 11, 3, -9 }, // 0x6A 'j'
+ { 676, 8, 11, 11, 2, -10 }, // 0x6B 'k'
+ { 687, 7, 11, 11, 2, -10 }, // 0x6C 'l'
+ { 697, 9, 8, 11, 1, -7 }, // 0x6D 'm'
+ { 706, 9, 8, 11, 1, -7 }, // 0x6E 'n'
+ { 715, 9, 8, 11, 1, -7 }, // 0x6F 'o'
+ { 724, 9, 11, 11, 1, -7 }, // 0x70 'p'
+ { 737, 9, 11, 11, 1, -7 }, // 0x71 'q'
+ { 750, 7, 8, 11, 3, -7 }, // 0x72 'r'
+ { 757, 7, 8, 11, 2, -7 }, // 0x73 's'
+ { 764, 8, 10, 11, 2, -9 }, // 0x74 't'
+ { 774, 8, 8, 11, 1, -7 }, // 0x75 'u'
+ { 782, 9, 8, 11, 1, -7 }, // 0x76 'v'
+ { 791, 9, 8, 11, 1, -7 }, // 0x77 'w'
+ { 800, 9, 8, 11, 1, -7 }, // 0x78 'x'
+ { 809, 9, 11, 11, 1, -7 }, // 0x79 'y'
+ { 822, 7, 8, 11, 2, -7 }, // 0x7A 'z'
+ { 829, 3, 13, 11, 4, -10 }, // 0x7B '{'
+ { 834, 1, 13, 11, 5, -10 }, // 0x7C '|'
+ { 836, 3, 13, 11, 4, -10 }, // 0x7D '}'
+ { 841, 7, 3, 11, 2, -6 } }; // 0x7E '~'
+
+const GFXfont FreeMono9pt7b = {
+ (uint8_t *)FreeMono9pt7bBitmaps,
+ (GFXglyph *)FreeMono9pt7bGlyphs,
+ 0x20, 0x7E, 18 };
+const uint8_t FreeSans12pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xCF, 0x3C, 0xF3, 0x8A, 0x20, 0x06, 0x30,
+ 0x31, 0x03, 0x18, 0x18, 0xC7, 0xFF, 0xBF, 0xFC, 0x31, 0x03, 0x18, 0x18,
+ 0xC7, 0xFF, 0xBF, 0xFC, 0x31, 0x01, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x30,
+ 0x04, 0x03, 0xE1, 0xFF, 0x72, 0x6C, 0x47, 0x88, 0xF1, 0x07, 0x20, 0x7E,
+ 0x03, 0xF0, 0x17, 0x02, 0x3C, 0x47, 0x88, 0xF1, 0x1B, 0x26, 0x7F, 0xC3,
+ 0xE0, 0x10, 0x02, 0x00, 0x00, 0x06, 0x03, 0xC0, 0x40, 0x7E, 0x0C, 0x0E,
+ 0x70, 0x80, 0xC3, 0x18, 0x0C, 0x31, 0x00, 0xE7, 0x30, 0x07, 0xE6, 0x00,
+ 0x3C, 0x40, 0x00, 0x0C, 0x7C, 0x00, 0x8F, 0xE0, 0x19, 0xC7, 0x01, 0x18,
+ 0x30, 0x31, 0x83, 0x02, 0x1C, 0x70, 0x40, 0xFE, 0x04, 0x07, 0xC0, 0x0F,
+ 0x00, 0x7E, 0x03, 0x9C, 0x0C, 0x30, 0x30, 0xC0, 0xE7, 0x01, 0xF8, 0x03,
+ 0x80, 0x3E, 0x01, 0xCC, 0x6E, 0x19, 0xB0, 0x7C, 0xC0, 0xF3, 0x03, 0xCE,
+ 0x1F, 0x9F, 0xE6, 0x1E, 0x1C, 0xFF, 0xA0, 0x08, 0x8C, 0x66, 0x31, 0x98,
+ 0xC6, 0x31, 0x8C, 0x63, 0x08, 0x63, 0x08, 0x61, 0x0C, 0x20, 0x82, 0x18,
+ 0xC3, 0x18, 0xC3, 0x18, 0xC6, 0x31, 0x8C, 0x62, 0x31, 0x88, 0xC4, 0x62,
+ 0x00, 0x10, 0x23, 0x5B, 0xE3, 0x8D, 0x91, 0x00, 0x0C, 0x03, 0x00, 0xC0,
+ 0x30, 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0xF5, 0x60,
+ 0xFF, 0xF0, 0xF0, 0x02, 0x0C, 0x10, 0x20, 0xC1, 0x02, 0x0C, 0x10, 0x20,
+ 0xC1, 0x02, 0x0C, 0x10, 0x20, 0xC1, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x30,
+ 0x6E, 0x0F, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C,
+ 0x0E, 0xC1, 0x9C, 0x71, 0xFC, 0x1F, 0x00, 0x08, 0xCF, 0xFF, 0x8C, 0x63,
+ 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0x1F, 0x0F, 0xF9, 0x87, 0x60, 0x7C,
+ 0x06, 0x00, 0xC0, 0x18, 0x07, 0x01, 0xC0, 0xF0, 0x78, 0x1C, 0x06, 0x00,
+ 0x80, 0x30, 0x07, 0xFF, 0xFF, 0xE0, 0x3F, 0x0F, 0xF3, 0x87, 0x60, 0x6C,
+ 0x0C, 0x01, 0x80, 0x70, 0x7C, 0x0F, 0x80, 0x18, 0x01, 0x80, 0x3C, 0x07,
+ 0x80, 0xD8, 0x73, 0xFC, 0x1F, 0x00, 0x01, 0x80, 0x70, 0x0E, 0x03, 0xC0,
+ 0xD8, 0x1B, 0x06, 0x61, 0x8C, 0x21, 0x8C, 0x33, 0x06, 0x7F, 0xFF, 0xFE,
+ 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x3F, 0xCF, 0xF9, 0x80, 0x30, 0x06,
+ 0x00, 0xDE, 0x1F, 0xE7, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x07,
+ 0x81, 0xF8, 0x73, 0xFC, 0x1F, 0x00, 0x0F, 0x07, 0xF9, 0xC3, 0x30, 0x74,
+ 0x01, 0x80, 0x33, 0xC7, 0xFE, 0xF0, 0xDC, 0x1F, 0x01, 0xE0, 0x3C, 0x06,
+ 0xC1, 0xDC, 0x71, 0xFC, 0x1F, 0x00, 0xFF, 0xFF, 0xFC, 0x01, 0x00, 0x60,
+ 0x18, 0x02, 0x00, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x30, 0x04, 0x01, 0x80,
+ 0x30, 0x06, 0x01, 0x80, 0x30, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x30, 0x66,
+ 0x0C, 0xC1, 0x8C, 0x61, 0xFC, 0x3F, 0x8E, 0x3B, 0x01, 0xE0, 0x3C, 0x07,
+ 0x80, 0xD8, 0x31, 0xFC, 0x1F, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x6C,
+ 0x07, 0x80, 0xF0, 0x1E, 0x07, 0x61, 0xEF, 0xFC, 0x79, 0x80, 0x30, 0x05,
+ 0x81, 0x98, 0x73, 0xFC, 0x1E, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0xF0, 0x00,
+ 0x0F, 0x56, 0x00, 0x00, 0x07, 0x01, 0xE0, 0xF8, 0x3C, 0x0F, 0x00, 0xE0,
+ 0x07, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x0E, 0x00, 0x78, 0x01, 0xF0, 0x07,
+ 0xC0, 0x0F, 0x00, 0x70, 0x1E, 0x0F, 0x03, 0xC0, 0xF0, 0x08, 0x00, 0x1F,
+ 0x1F, 0xEE, 0x1B, 0x03, 0xC0, 0xC0, 0x30, 0x0C, 0x06, 0x03, 0x81, 0xC0,
+ 0xE0, 0x30, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x03, 0x00, 0x00, 0xFE,
+ 0x00, 0x0F, 0xFE, 0x00, 0xF0, 0x3E, 0x07, 0x00, 0x3C, 0x38, 0x00, 0x30,
+ 0xC1, 0xE0, 0x66, 0x0F, 0xD9, 0xD8, 0x61, 0xC3, 0xC3, 0x07, 0x0F, 0x1C,
+ 0x1C, 0x3C, 0x60, 0x60, 0xF1, 0x81, 0x83, 0xC6, 0x06, 0x1B, 0x18, 0x38,
+ 0xEE, 0x71, 0xE7, 0x18, 0xFD, 0xF8, 0x71, 0xE7, 0xC0, 0xE0, 0x00, 0x01,
+ 0xE0, 0x00, 0x01, 0xFF, 0xC0, 0x01, 0xFC, 0x00, 0x03, 0xC0, 0x03, 0xC0,
+ 0x03, 0xC0, 0x07, 0xE0, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x0C, 0x30,
+ 0x0C, 0x30, 0x1C, 0x38, 0x18, 0x18, 0x1F, 0xF8, 0x3F, 0xFC, 0x30, 0x1C,
+ 0x30, 0x0C, 0x70, 0x0E, 0x60, 0x06, 0x60, 0x06, 0xFF, 0xC7, 0xFF, 0x30,
+ 0x19, 0x80, 0x6C, 0x03, 0x60, 0x1B, 0x00, 0xD8, 0x0C, 0xFF, 0xC7, 0xFF,
+ 0x30, 0x0D, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x06, 0xFF, 0xF7,
+ 0xFE, 0x00, 0x07, 0xE0, 0x3F, 0xF0, 0xE0, 0x73, 0x80, 0x66, 0x00, 0x6C,
+ 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, 0x00,
+ 0x06, 0x00, 0x6C, 0x00, 0xDC, 0x03, 0x1E, 0x0E, 0x1F, 0xF8, 0x0F, 0xC0,
+ 0xFF, 0x83, 0xFF, 0x8C, 0x07, 0x30, 0x0E, 0xC0, 0x1B, 0x00, 0x7C, 0x00,
+ 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1F, 0x00,
+ 0x6C, 0x03, 0xB0, 0x1C, 0xFF, 0xE3, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xC0,
+ 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFF, 0xEF, 0xFE, 0xC0,
+ 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xFF, 0xDF,
+ 0xFB, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x00,
+ 0x07, 0xF0, 0x1F, 0xFC, 0x3C, 0x1E, 0x70, 0x06, 0x60, 0x03, 0xE0, 0x00,
+ 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x7F, 0xC0, 0x7F, 0xC0, 0x03, 0xC0, 0x03,
+ 0x60, 0x03, 0x60, 0x07, 0x30, 0x0F, 0x3C, 0x1F, 0x1F, 0xFB, 0x07, 0xE1,
+ 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78,
+ 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00,
+ 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01,
+ 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60,
+ 0x3C, 0x1E, 0x0F, 0x07, 0xC7, 0x7F, 0x1F, 0x00, 0xC0, 0x3B, 0x01, 0xCC,
+ 0x0E, 0x30, 0x70, 0xC3, 0x83, 0x1C, 0x0C, 0xE0, 0x33, 0x80, 0xDE, 0x03,
+ 0xDC, 0x0E, 0x38, 0x30, 0x60, 0xC1, 0xC3, 0x03, 0x8C, 0x06, 0x30, 0x1C,
+ 0xC0, 0x3B, 0x00, 0x60, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C,
+ 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00,
+ 0xFF, 0xFF, 0xF0, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0F, 0xF0, 0x0F, 0xD0,
+ 0x0F, 0xD8, 0x1B, 0xD8, 0x1B, 0xD8, 0x1B, 0xCC, 0x33, 0xCC, 0x33, 0xCC,
+ 0x33, 0xC6, 0x63, 0xC6, 0x63, 0xC6, 0x63, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC1, 0x83, 0xE0, 0x1F, 0x00, 0xFC, 0x07, 0xE0, 0x3D, 0x81, 0xEE,
+ 0x0F, 0x30, 0x79, 0xC3, 0xC6, 0x1E, 0x18, 0xF0, 0xE7, 0x83, 0x3C, 0x1D,
+ 0xE0, 0x6F, 0x01, 0xF8, 0x0F, 0xC0, 0x3E, 0x01, 0xC0, 0x03, 0xE0, 0x0F,
+ 0xFC, 0x0F, 0x07, 0x86, 0x00, 0xC6, 0x00, 0x33, 0x00, 0x1B, 0x00, 0x07,
+ 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x36, 0x00,
+ 0x33, 0x00, 0x18, 0xC0, 0x18, 0x78, 0x3C, 0x1F, 0xFC, 0x03, 0xF8, 0x00,
+ 0xFF, 0x8F, 0xFE, 0xC0, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x07,
+ 0xFF, 0xEF, 0xFC, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00,
+ 0xC0, 0x0C, 0x00, 0x03, 0xE0, 0x0F, 0xFC, 0x0F, 0x07, 0x86, 0x00, 0xC6,
+ 0x00, 0x33, 0x00, 0x1B, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00,
+ 0xF0, 0x00, 0x78, 0x00, 0x36, 0x00, 0x33, 0x01, 0x98, 0xC0, 0xFC, 0x78,
+ 0x3C, 0x1F, 0xFF, 0x03, 0xF9, 0x80, 0x00, 0x40, 0xFF, 0xC3, 0xFF, 0xCC,
+ 0x03, 0xB0, 0x06, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xB0, 0x0C, 0xFF, 0xE3,
+ 0xFF, 0xCC, 0x03, 0xB0, 0x06, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xB0, 0x06,
+ 0xC0, 0x1B, 0x00, 0x70, 0x0F, 0xE0, 0x7F, 0xC3, 0x83, 0x9C, 0x07, 0x60,
+ 0x0D, 0x80, 0x06, 0x00, 0x1E, 0x00, 0x3F, 0x80, 0x3F, 0xC0, 0x0F, 0x80,
+ 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0xDE, 0x0E, 0x3F, 0xF0, 0x3F, 0x80,
+ 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
+ 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
+ 0x06, 0x00, 0x60, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0,
+ 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01,
+ 0xE0, 0x0F, 0x80, 0xEE, 0x0E, 0x3F, 0xE0, 0x7C, 0x00, 0x60, 0x06, 0xC0,
+ 0x1D, 0xC0, 0x31, 0x80, 0x63, 0x01, 0xC7, 0x03, 0x06, 0x06, 0x0C, 0x1C,
+ 0x1C, 0x30, 0x18, 0x60, 0x31, 0xC0, 0x73, 0x00, 0x66, 0x00, 0xDC, 0x01,
+ 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0xE0, 0x30, 0x1D, 0x80, 0xE0,
+ 0x76, 0x07, 0x81, 0xD8, 0x1E, 0x06, 0x70, 0x7C, 0x18, 0xC1, 0xB0, 0xE3,
+ 0x0C, 0xC3, 0x8C, 0x33, 0x0C, 0x38, 0xC6, 0x30, 0x67, 0x18, 0xC1, 0x98,
+ 0x67, 0x06, 0x61, 0xD8, 0x1D, 0x83, 0x60, 0x3C, 0x0D, 0x80, 0xF0, 0x3E,
+ 0x03, 0xC0, 0x70, 0x0F, 0x01, 0xC0, 0x18, 0x07, 0x00, 0x70, 0x0E, 0x60,
+ 0x38, 0xE0, 0x60, 0xE1, 0xC0, 0xC3, 0x01, 0xCC, 0x01, 0xF8, 0x01, 0xE0,
+ 0x03, 0x80, 0x07, 0x80, 0x1F, 0x00, 0x33, 0x00, 0xE7, 0x03, 0x86, 0x06,
+ 0x0E, 0x1C, 0x0E, 0x70, 0x0C, 0xC0, 0x1C, 0x60, 0x06, 0x70, 0x0E, 0x30,
+ 0x1C, 0x38, 0x18, 0x1C, 0x38, 0x0C, 0x30, 0x0E, 0x70, 0x06, 0x60, 0x03,
+ 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
+ 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0x0E,
+ 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x07, 0x00, 0x70, 0x07, 0x00, 0x30, 0x03,
+ 0x80, 0x38, 0x03, 0x80, 0x18, 0x01, 0xC0, 0x1C, 0x00, 0xFF, 0xFF, 0xFF,
+ 0xC0, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF,
+ 0xF0, 0x81, 0x81, 0x02, 0x06, 0x04, 0x08, 0x18, 0x10, 0x20, 0x60, 0x40,
+ 0x81, 0x81, 0x02, 0x06, 0x04, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x33, 0x33, 0x33, 0x3F, 0xF0, 0x0C, 0x0E, 0x05, 0x86, 0xC3, 0x21, 0x19,
+ 0x8C, 0x83, 0xC1, 0x80, 0xFF, 0xFE, 0xE3, 0x8C, 0x30, 0x3F, 0x07, 0xF8,
+ 0xE1, 0xCC, 0x0C, 0x00, 0xC0, 0x1C, 0x3F, 0xCF, 0x8C, 0xC0, 0xCC, 0x0C,
+ 0xE3, 0xC7, 0xEF, 0x3C, 0x70, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0,
+ 0x0C, 0xF8, 0xDF, 0xCF, 0x0E, 0xE0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0,
+ 0x3C, 0x03, 0xE0, 0x6F, 0x0E, 0xDF, 0xCC, 0xF8, 0x1F, 0x0F, 0xE7, 0x1B,
+ 0x83, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x38, 0x37, 0x1C, 0xFE, 0x1F,
+ 0x00, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x3C, 0xCF, 0xFB, 0x8F,
+ 0xE0, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF8, 0x3B, 0x8F, 0x3F,
+ 0x63, 0xCC, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x3C, 0x07, 0xFF, 0xFF, 0xFE,
+ 0x00, 0xC0, 0x1C, 0x0D, 0xC3, 0x1F, 0xE1, 0xF0, 0x3B, 0xD8, 0xC6, 0x7F,
+ 0xEC, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x00, 0x1E, 0x67, 0xFD, 0xC7,
+ 0xF0, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x7C, 0x1D, 0xC7, 0x9F,
+ 0xB1, 0xE6, 0x00, 0xC0, 0x3E, 0x0E, 0x7F, 0xC7, 0xE0, 0xC0, 0x30, 0x0C,
+ 0x03, 0x00, 0xC0, 0x33, 0xCD, 0xFB, 0xC7, 0xE0, 0xF0, 0x3C, 0x0F, 0x03,
+ 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x30, 0xF0, 0x3F, 0xFF, 0xFF,
+ 0xF0, 0x33, 0x00, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F,
+ 0xE0, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x83, 0x30, 0xC6, 0x30,
+ 0xCC, 0x1B, 0x83, 0xF0, 0x77, 0x0C, 0x61, 0x8E, 0x30, 0xE6, 0x0C, 0xC1,
+ 0xD8, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xCF, 0x1F, 0x6F, 0xDF, 0xFC,
+ 0x78, 0xFC, 0x18, 0x3C, 0x0C, 0x1E, 0x06, 0x0F, 0x03, 0x07, 0x81, 0x83,
+ 0xC0, 0xC1, 0xE0, 0x60, 0xF0, 0x30, 0x78, 0x18, 0x3C, 0x0C, 0x18, 0xCF,
+ 0x37, 0xEF, 0x1F, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C,
+ 0x0F, 0x03, 0xC0, 0xC0, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80,
+ 0xF0, 0x1E, 0x03, 0xC0, 0x7C, 0x1D, 0xC7, 0x1F, 0xC1, 0xF0, 0xCF, 0x8D,
+ 0xFC, 0xF0, 0xEE, 0x06, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3E,
+ 0x07, 0xF0, 0xEF, 0xFC, 0xCF, 0x8C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x00,
+ 0x1E, 0x67, 0xFD, 0xC7, 0xF0, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0,
+ 0x7C, 0x1D, 0xC7, 0x9F, 0xF1, 0xE6, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60,
+ 0xCF, 0x7F, 0x38, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC0, 0x3E, 0x1F,
+ 0xEE, 0x1B, 0x00, 0xC0, 0x3C, 0x07, 0xF0, 0x3E, 0x01, 0xF0, 0x3E, 0x1D,
+ 0xFE, 0x3E, 0x00, 0x63, 0x19, 0xFF, 0xB1, 0x8C, 0x63, 0x18, 0xC6, 0x31,
+ 0xE7, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0,
+ 0xF0, 0x7E, 0x3D, 0xFB, 0x3C, 0xC0, 0xE0, 0x66, 0x06, 0x60, 0x67, 0x0C,
+ 0x30, 0xC3, 0x0C, 0x39, 0x81, 0x98, 0x19, 0x81, 0xF0, 0x0F, 0x00, 0xE0,
+ 0x0E, 0x00, 0xC1, 0xC1, 0xB0, 0xE1, 0xD8, 0x70, 0xCC, 0x2C, 0x66, 0x36,
+ 0x31, 0x9B, 0x18, 0xCD, 0x98, 0x64, 0x6C, 0x16, 0x36, 0x0F, 0x1A, 0x07,
+ 0x8F, 0x03, 0x83, 0x80, 0xC1, 0xC0, 0x60, 0xEE, 0x18, 0xC6, 0x0C, 0xC1,
+ 0xF0, 0x1C, 0x01, 0x80, 0x78, 0x1B, 0x03, 0x30, 0xC7, 0x30, 0x66, 0x06,
+ 0xE0, 0x6C, 0x0D, 0x83, 0x38, 0x63, 0x0C, 0x63, 0x0E, 0x60, 0xCC, 0x1B,
+ 0x03, 0x60, 0x3C, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, 0xE0, 0x78, 0x0E,
+ 0x00, 0xFF, 0xFF, 0xF0, 0x18, 0x0C, 0x07, 0x03, 0x81, 0xC0, 0x60, 0x30,
+ 0x18, 0x0E, 0x03, 0xFF, 0xFF, 0xC0, 0x19, 0xCC, 0x63, 0x18, 0xC6, 0x31,
+ 0x99, 0x86, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x1C, 0x60, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFC, 0xC7, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x0C, 0x33, 0x31,
+ 0x8C, 0x63, 0x18, 0xC6, 0x73, 0x00, 0x70, 0x3E, 0x09, 0xE4, 0x1F, 0x03,
+ 0x80 };
+
+const GFXglyph FreeSans12pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 6, 0, 1 }, // 0x20 ' '
+ { 0, 2, 18, 8, 3, -17 }, // 0x21 '!'
+ { 5, 6, 6, 8, 1, -16 }, // 0x22 '"'
+ { 10, 13, 16, 13, 0, -15 }, // 0x23 '#'
+ { 36, 11, 20, 13, 1, -17 }, // 0x24 '$'
+ { 64, 20, 17, 21, 1, -16 }, // 0x25 '%'
+ { 107, 14, 17, 16, 1, -16 }, // 0x26 '&'
+ { 137, 2, 6, 5, 1, -16 }, // 0x27 '''
+ { 139, 5, 23, 8, 2, -17 }, // 0x28 '('
+ { 154, 5, 23, 8, 1, -17 }, // 0x29 ')'
+ { 169, 7, 7, 9, 1, -17 }, // 0x2A '*'
+ { 176, 10, 11, 14, 2, -10 }, // 0x2B '+'
+ { 190, 2, 6, 7, 2, -1 }, // 0x2C ','
+ { 192, 6, 2, 8, 1, -7 }, // 0x2D '-'
+ { 194, 2, 2, 6, 2, -1 }, // 0x2E '.'
+ { 195, 7, 18, 7, 0, -17 }, // 0x2F '/'
+ { 211, 11, 17, 13, 1, -16 }, // 0x30 '0'
+ { 235, 5, 17, 13, 3, -16 }, // 0x31 '1'
+ { 246, 11, 17, 13, 1, -16 }, // 0x32 '2'
+ { 270, 11, 17, 13, 1, -16 }, // 0x33 '3'
+ { 294, 11, 17, 13, 1, -16 }, // 0x34 '4'
+ { 318, 11, 17, 13, 1, -16 }, // 0x35 '5'
+ { 342, 11, 17, 13, 1, -16 }, // 0x36 '6'
+ { 366, 11, 17, 13, 1, -16 }, // 0x37 '7'
+ { 390, 11, 17, 13, 1, -16 }, // 0x38 '8'
+ { 414, 11, 17, 13, 1, -16 }, // 0x39 '9'
+ { 438, 2, 13, 6, 2, -12 }, // 0x3A ':'
+ { 442, 2, 16, 6, 2, -11 }, // 0x3B ';'
+ { 446, 12, 12, 14, 1, -11 }, // 0x3C '<'
+ { 464, 12, 6, 14, 1, -8 }, // 0x3D '='
+ { 473, 12, 12, 14, 1, -11 }, // 0x3E '>'
+ { 491, 10, 18, 13, 2, -17 }, // 0x3F '?'
+ { 514, 22, 21, 24, 1, -17 }, // 0x40 '@'
+ { 572, 16, 18, 16, 0, -17 }, // 0x41 'A'
+ { 608, 13, 18, 16, 2, -17 }, // 0x42 'B'
+ { 638, 15, 18, 17, 1, -17 }, // 0x43 'C'
+ { 672, 14, 18, 17, 2, -17 }, // 0x44 'D'
+ { 704, 12, 18, 15, 2, -17 }, // 0x45 'E'
+ { 731, 11, 18, 14, 2, -17 }, // 0x46 'F'
+ { 756, 16, 18, 18, 1, -17 }, // 0x47 'G'
+ { 792, 13, 18, 17, 2, -17 }, // 0x48 'H'
+ { 822, 2, 18, 7, 2, -17 }, // 0x49 'I'
+ { 827, 9, 18, 13, 1, -17 }, // 0x4A 'J'
+ { 848, 14, 18, 16, 2, -17 }, // 0x4B 'K'
+ { 880, 10, 18, 14, 2, -17 }, // 0x4C 'L'
+ { 903, 16, 18, 20, 2, -17 }, // 0x4D 'M'
+ { 939, 13, 18, 18, 2, -17 }, // 0x4E 'N'
+ { 969, 17, 18, 19, 1, -17 }, // 0x4F 'O'
+ { 1008, 12, 18, 16, 2, -17 }, // 0x50 'P'
+ { 1035, 17, 19, 19, 1, -17 }, // 0x51 'Q'
+ { 1076, 14, 18, 17, 2, -17 }, // 0x52 'R'
+ { 1108, 14, 18, 16, 1, -17 }, // 0x53 'S'
+ { 1140, 12, 18, 15, 1, -17 }, // 0x54 'T'
+ { 1167, 13, 18, 17, 2, -17 }, // 0x55 'U'
+ { 1197, 15, 18, 15, 0, -17 }, // 0x56 'V'
+ { 1231, 22, 18, 22, 0, -17 }, // 0x57 'W'
+ { 1281, 15, 18, 16, 0, -17 }, // 0x58 'X'
+ { 1315, 16, 18, 16, 0, -17 }, // 0x59 'Y'
+ { 1351, 13, 18, 15, 1, -17 }, // 0x5A 'Z'
+ { 1381, 4, 23, 7, 2, -17 }, // 0x5B '['
+ { 1393, 7, 18, 7, 0, -17 }, // 0x5C '\'
+ { 1409, 4, 23, 7, 1, -17 }, // 0x5D ']'
+ { 1421, 9, 9, 11, 1, -16 }, // 0x5E '^'
+ { 1432, 15, 1, 13, -1, 4 }, // 0x5F '_'
+ { 1434, 5, 4, 6, 1, -17 }, // 0x60 '`'
+ { 1437, 12, 13, 13, 1, -12 }, // 0x61 'a'
+ { 1457, 12, 18, 13, 1, -17 }, // 0x62 'b'
+ { 1484, 10, 13, 12, 1, -12 }, // 0x63 'c'
+ { 1501, 11, 18, 13, 1, -17 }, // 0x64 'd'
+ { 1526, 11, 13, 13, 1, -12 }, // 0x65 'e'
+ { 1544, 5, 18, 7, 1, -17 }, // 0x66 'f'
+ { 1556, 11, 18, 13, 1, -12 }, // 0x67 'g'
+ { 1581, 10, 18, 13, 1, -17 }, // 0x68 'h'
+ { 1604, 2, 18, 5, 2, -17 }, // 0x69 'i'
+ { 1609, 4, 23, 6, 0, -17 }, // 0x6A 'j'
+ { 1621, 11, 18, 12, 1, -17 }, // 0x6B 'k'
+ { 1646, 2, 18, 5, 1, -17 }, // 0x6C 'l'
+ { 1651, 17, 13, 19, 1, -12 }, // 0x6D 'm'
+ { 1679, 10, 13, 13, 1, -12 }, // 0x6E 'n'
+ { 1696, 11, 13, 13, 1, -12 }, // 0x6F 'o'
+ { 1714, 12, 17, 13, 1, -12 }, // 0x70 'p'
+ { 1740, 11, 17, 13, 1, -12 }, // 0x71 'q'
+ { 1764, 6, 13, 8, 1, -12 }, // 0x72 'r'
+ { 1774, 10, 13, 12, 1, -12 }, // 0x73 's'
+ { 1791, 5, 16, 7, 1, -15 }, // 0x74 't'
+ { 1801, 10, 13, 13, 1, -12 }, // 0x75 'u'
+ { 1818, 12, 13, 12, 0, -12 }, // 0x76 'v'
+ { 1838, 17, 13, 17, 0, -12 }, // 0x77 'w'
+ { 1866, 11, 13, 11, 0, -12 }, // 0x78 'x'
+ { 1884, 11, 18, 11, 0, -12 }, // 0x79 'y'
+ { 1909, 10, 13, 12, 1, -12 }, // 0x7A 'z'
+ { 1926, 5, 23, 8, 1, -17 }, // 0x7B '{'
+ { 1941, 2, 23, 6, 2, -17 }, // 0x7C '|'
+ { 1947, 5, 23, 8, 2, -17 }, // 0x7D '}'
+ { 1962, 10, 5, 12, 1, -10 } }; // 0x7E '~'
+
+const GFXfont FreeSans12pt7b PROGMEM = {
+ (uint8_t *)FreeSans12pt7bBitmaps,
+ (GFXglyph *)FreeSans12pt7bGlyphs,
+ 0x20, 0x7E, 29 };
+
+// Approx. 2641 bytes
+const uint8_t FreeSans9pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFF, 0xF8, 0xC0, 0xDE, 0xF7, 0x20, 0x09, 0x86, 0x41, 0x91, 0xFF,
+ 0x13, 0x04, 0xC3, 0x20, 0xC8, 0xFF, 0x89, 0x82, 0x61, 0x90, 0x10, 0x1F,
+ 0x14, 0xDA, 0x3D, 0x1E, 0x83, 0x40, 0x78, 0x17, 0x08, 0xF4, 0x7A, 0x35,
+ 0x33, 0xF0, 0x40, 0x20, 0x38, 0x10, 0xEC, 0x20, 0xC6, 0x20, 0xC6, 0x40,
+ 0xC6, 0x40, 0x6C, 0x80, 0x39, 0x00, 0x01, 0x3C, 0x02, 0x77, 0x02, 0x63,
+ 0x04, 0x63, 0x04, 0x77, 0x08, 0x3C, 0x0E, 0x06, 0x60, 0xCC, 0x19, 0x81,
+ 0xE0, 0x18, 0x0F, 0x03, 0x36, 0xC2, 0xD8, 0x73, 0x06, 0x31, 0xE3, 0xC4,
+ 0xFE, 0x13, 0x26, 0x6C, 0xCC, 0xCC, 0xC4, 0x66, 0x23, 0x10, 0x8C, 0x46,
+ 0x63, 0x33, 0x33, 0x32, 0x66, 0x4C, 0x80, 0x25, 0x7E, 0xA5, 0x00, 0x30,
+ 0xC3, 0x3F, 0x30, 0xC3, 0x0C, 0xD6, 0xF0, 0xC0, 0x08, 0x44, 0x21, 0x10,
+ 0x84, 0x42, 0x11, 0x08, 0x00, 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, 0x11, 0x3F, 0x33, 0x33, 0x33, 0x33,
+ 0x30, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x1C, 0x1C, 0x1C, 0x18, 0x18,
+ 0x10, 0x08, 0x07, 0xF8, 0x3C, 0x66, 0xC3, 0xC3, 0x03, 0x06, 0x1C, 0x07,
+ 0x03, 0xC3, 0xC3, 0x66, 0x3C, 0x0C, 0x18, 0x71, 0x62, 0xC9, 0xA3, 0x46,
+ 0xFE, 0x18, 0x30, 0x60, 0xC0, 0x7F, 0x20, 0x10, 0x08, 0x08, 0x07, 0xF3,
+ 0x8C, 0x03, 0x01, 0x80, 0xF0, 0x6C, 0x63, 0xE0, 0x1E, 0x31, 0x98, 0x78,
+ 0x0C, 0x06, 0xF3, 0x8D, 0x83, 0xC1, 0xE0, 0xD0, 0x6C, 0x63, 0xE0, 0xFF,
+ 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30,
+ 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1B, 0x18, 0xF8, 0xC6, 0xC1, 0xE0, 0xF0,
+ 0x6C, 0x63, 0xE0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03,
+ 0x03, 0xC2, 0x66, 0x3C, 0xC0, 0x00, 0x30, 0xC0, 0x00, 0x00, 0x64, 0xA0,
+ 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x07, 0x80, 0x70, 0x0E, 0x01, 0x80, 0xFF,
+ 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x70, 0x0E, 0x01, 0xC0, 0x18, 0x38, 0x71,
+ 0xC0, 0x80, 0x00, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x38, 0x18,
+ 0x18, 0x0C, 0x00, 0x00, 0x01, 0x80, 0x03, 0xF0, 0x06, 0x0E, 0x06, 0x01,
+ 0x86, 0x00, 0x66, 0x1D, 0xBB, 0x31, 0xCF, 0x18, 0xC7, 0x98, 0x63, 0xCC,
+ 0x31, 0xE6, 0x11, 0xB3, 0x99, 0xCC, 0xF7, 0x86, 0x00, 0x01, 0x80, 0x00,
+ 0x70, 0x40, 0x0F, 0xE0, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81,
+ 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, 0x30,
+ 0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0,
+ 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C,
+ 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0,
+ 0xFF, 0x18, 0x33, 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0,
+ 0x78, 0x0F, 0x03, 0x60, 0xCF, 0xF0, 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06,
+ 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, 0xFF, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, 0x83,
+ 0x0E, 0x60, 0x66, 0x03, 0xC0, 0x0C, 0x00, 0xC1, 0xFC, 0x03, 0xC0, 0x36,
+ 0x03, 0x60, 0x73, 0x0F, 0x0F, 0x10, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C,
+ 0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06,
+ 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07,
+ 0x8F, 0x1E, 0x27, 0x80, 0xC0, 0xD8, 0x33, 0x0C, 0x63, 0x0C, 0xC1, 0xB8,
+ 0x3F, 0x07, 0x30, 0xC3, 0x18, 0x63, 0x06, 0x60, 0x6C, 0x0C, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xE0,
+ 0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13,
+ 0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, 0x80, 0xE0, 0x7C, 0x0F,
+ 0xC1, 0xE8, 0x3D, 0x87, 0x98, 0xF1, 0x1E, 0x33, 0xC3, 0x78, 0x6F, 0x07,
+ 0xE0, 0x7C, 0x0E, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0,
+ 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8,
+ 0x00, 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0,
+ 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0,
+ 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x6C,
+ 0x60, 0xC0, 0xFB, 0x00, 0x08, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0,
+ 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0,
+ 0x70, 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00,
+ 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0,
+ 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x78, 0x0F,
+ 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01,
+ 0xB0, 0x61, 0xF0, 0xC0, 0x6C, 0x0D, 0x81, 0x10, 0x63, 0x0C, 0x61, 0x04,
+ 0x60, 0xCC, 0x19, 0x01, 0x60, 0x3C, 0x07, 0x00, 0x60, 0xC1, 0x81, 0x30,
+ 0xE1, 0x98, 0x70, 0xCC, 0x28, 0x66, 0x26, 0x21, 0x13, 0x30, 0xC8, 0x98,
+ 0x6C, 0x4C, 0x14, 0x34, 0x0A, 0x1A, 0x07, 0x07, 0x03, 0x03, 0x80, 0x81,
+ 0x80, 0x60, 0x63, 0x0C, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0xE0, 0x06, 0x00,
+ 0xF0, 0x19, 0x01, 0x98, 0x30, 0xC6, 0x0E, 0x60, 0x60, 0xC0, 0x36, 0x06,
+ 0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60,
+ 0x06, 0x00, 0x60, 0x06, 0x00, 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03,
+ 0x01, 0xC0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xFF, 0xC0, 0xFB, 0x6D,
+ 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84,
+ 0x10, 0x80, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, 0x30, 0x60, 0xA2,
+ 0x44, 0xD8, 0xA1, 0x80, 0xFF, 0xC0, 0xC6, 0x30, 0x7E, 0x71, 0xB0, 0xC0,
+ 0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, 0xC0, 0x60, 0x30, 0x1B,
+ 0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, 0x3C,
+ 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x03, 0x03, 0x03,
+ 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x3C, 0x66,
+ 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x36, 0x6F, 0x66, 0x66,
+ 0x66, 0x66, 0x60, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67,
+ 0x3B, 0x03, 0x03, 0xC6, 0x7C, 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC0, 0x30, 0x03,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x4C,
+ 0x46, 0x63, 0x61, 0xF0, 0xEC, 0x62, 0x31, 0x98, 0x6C, 0x30, 0xFF, 0xFF,
+ 0xFF, 0xC0, 0xDE, 0xF7, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F,
+ 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0x66, 0x3C, 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83,
+ 0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0x03, 0xDF, 0x31, 0x8C, 0x63, 0x18,
+ 0xC6, 0x00, 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E,
+ 0x66, 0xF6, 0x66, 0x66, 0x66, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC7, 0x7B, 0xC1, 0xA0, 0x98, 0xCC, 0x42, 0x21, 0xB0, 0xD0,
+ 0x28, 0x1C, 0x0C, 0x00, 0xC6, 0x1E, 0x38, 0x91, 0xC4, 0xCA, 0x66, 0xD3,
+ 0x16, 0xD0, 0xA6, 0x87, 0x1C, 0x38, 0xC0, 0xC6, 0x00, 0x43, 0x62, 0x36,
+ 0x1C, 0x18, 0x1C, 0x3C, 0x26, 0x62, 0x43, 0xC1, 0x21, 0x98, 0xCC, 0x42,
+ 0x61, 0xB0, 0xD0, 0x38, 0x1C, 0x0C, 0x06, 0x03, 0x01, 0x03, 0x00, 0xFE,
+ 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xC1, 0xFC, 0x36, 0x66, 0x66, 0x6E,
+ 0xCE, 0x66, 0x66, 0x66, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC6, 0x66,
+ 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, 0xC0, 0x61, 0x24, 0x38 };
+
+const GFXglyph FreeSans9pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 5, 0, 1 }, // 0x20 ' '
+ { 0, 2, 13, 6, 2, -12 }, // 0x21 '!'
+ { 4, 5, 4, 6, 1, -12 }, // 0x22 '"'
+ { 7, 10, 12, 10, 0, -11 }, // 0x23 '#'
+ { 22, 9, 16, 10, 1, -13 }, // 0x24 '$'
+ { 40, 16, 13, 16, 1, -12 }, // 0x25 '%'
+ { 66, 11, 13, 12, 1, -12 }, // 0x26 '&'
+ { 84, 2, 4, 4, 1, -12 }, // 0x27 '''
+ { 85, 4, 17, 6, 1, -12 }, // 0x28 '('
+ { 94, 4, 17, 6, 1, -12 }, // 0x29 ')'
+ { 103, 5, 5, 7, 1, -12 }, // 0x2A '*'
+ { 107, 6, 8, 11, 3, -7 }, // 0x2B '+'
+ { 113, 2, 4, 5, 2, 0 }, // 0x2C ','
+ { 114, 4, 1, 6, 1, -4 }, // 0x2D '-'
+ { 115, 2, 1, 5, 1, 0 }, // 0x2E '.'
+ { 116, 5, 13, 5, 0, -12 }, // 0x2F '/'
+ { 125, 8, 13, 10, 1, -12 }, // 0x30 '0'
+ { 138, 4, 13, 10, 3, -12 }, // 0x31 '1'
+ { 145, 9, 13, 10, 1, -12 }, // 0x32 '2'
+ { 160, 8, 13, 10, 1, -12 }, // 0x33 '3'
+ { 173, 7, 13, 10, 2, -12 }, // 0x34 '4'
+ { 185, 9, 13, 10, 1, -12 }, // 0x35 '5'
+ { 200, 9, 13, 10, 1, -12 }, // 0x36 '6'
+ { 215, 8, 13, 10, 0, -12 }, // 0x37 '7'
+ { 228, 9, 13, 10, 1, -12 }, // 0x38 '8'
+ { 243, 8, 13, 10, 1, -12 }, // 0x39 '9'
+ { 256, 2, 10, 5, 1, -9 }, // 0x3A ':'
+ { 259, 3, 12, 5, 1, -8 }, // 0x3B ';'
+ { 264, 9, 9, 11, 1, -8 }, // 0x3C '<'
+ { 275, 9, 4, 11, 1, -5 }, // 0x3D '='
+ { 280, 9, 9, 11, 1, -8 }, // 0x3E '>'
+ { 291, 9, 13, 10, 1, -12 }, // 0x3F '?'
+ { 306, 17, 16, 18, 1, -12 }, // 0x40 '@'
+ { 340, 12, 13, 12, 0, -12 }, // 0x41 'A'
+ { 360, 11, 13, 12, 1, -12 }, // 0x42 'B'
+ { 378, 11, 13, 13, 1, -12 }, // 0x43 'C'
+ { 396, 11, 13, 13, 1, -12 }, // 0x44 'D'
+ { 414, 9, 13, 11, 1, -12 }, // 0x45 'E'
+ { 429, 8, 13, 11, 1, -12 }, // 0x46 'F'
+ { 442, 12, 13, 14, 1, -12 }, // 0x47 'G'
+ { 462, 11, 13, 13, 1, -12 }, // 0x48 'H'
+ { 480, 2, 13, 5, 2, -12 }, // 0x49 'I'
+ { 484, 7, 13, 10, 1, -12 }, // 0x4A 'J'
+ { 496, 11, 13, 12, 1, -12 }, // 0x4B 'K'
+ { 514, 8, 13, 10, 1, -12 }, // 0x4C 'L'
+ { 527, 13, 13, 15, 1, -12 }, // 0x4D 'M'
+ { 549, 11, 13, 13, 1, -12 }, // 0x4E 'N'
+ { 567, 13, 13, 14, 1, -12 }, // 0x4F 'O'
+ { 589, 10, 13, 12, 1, -12 }, // 0x50 'P'
+ { 606, 13, 14, 14, 1, -12 }, // 0x51 'Q'
+ { 629, 12, 13, 13, 1, -12 }, // 0x52 'R'
+ { 649, 10, 13, 12, 1, -12 }, // 0x53 'S'
+ { 666, 9, 13, 11, 1, -12 }, // 0x54 'T'
+ { 681, 11, 13, 13, 1, -12 }, // 0x55 'U'
+ { 699, 11, 13, 12, 0, -12 }, // 0x56 'V'
+ { 717, 17, 13, 17, 0, -12 }, // 0x57 'W'
+ { 745, 12, 13, 12, 0, -12 }, // 0x58 'X'
+ { 765, 12, 13, 12, 0, -12 }, // 0x59 'Y'
+ { 785, 10, 13, 11, 1, -12 }, // 0x5A 'Z'
+ { 802, 3, 17, 5, 1, -12 }, // 0x5B '['
+ { 809, 5, 13, 5, 0, -12 }, // 0x5C '\'
+ { 818, 3, 17, 5, 0, -12 }, // 0x5D ']'
+ { 825, 7, 7, 8, 1, -12 }, // 0x5E '^'
+ { 832, 10, 1, 10, 0, 3 }, // 0x5F '_'
+ { 834, 4, 3, 5, 0, -12 }, // 0x60 '`'
+ { 836, 9, 10, 10, 1, -9 }, // 0x61 'a'
+ { 848, 9, 13, 10, 1, -12 }, // 0x62 'b'
+ { 863, 8, 10, 9, 1, -9 }, // 0x63 'c'
+ { 873, 8, 13, 10, 1, -12 }, // 0x64 'd'
+ { 886, 8, 10, 10, 1, -9 }, // 0x65 'e'
+ { 896, 4, 13, 5, 1, -12 }, // 0x66 'f'
+ { 903, 8, 14, 10, 1, -9 }, // 0x67 'g'
+ { 917, 8, 13, 10, 1, -12 }, // 0x68 'h'
+ { 930, 2, 13, 4, 1, -12 }, // 0x69 'i'
+ { 934, 4, 17, 4, 0, -12 }, // 0x6A 'j'
+ { 943, 9, 13, 9, 1, -12 }, // 0x6B 'k'
+ { 958, 2, 13, 4, 1, -12 }, // 0x6C 'l'
+ { 962, 13, 10, 15, 1, -9 }, // 0x6D 'm'
+ { 979, 8, 10, 10, 1, -9 }, // 0x6E 'n'
+ { 989, 8, 10, 10, 1, -9 }, // 0x6F 'o'
+ { 999, 9, 13, 10, 1, -9 }, // 0x70 'p'
+ { 1014, 8, 13, 10, 1, -9 }, // 0x71 'q'
+ { 1027, 5, 10, 6, 1, -9 }, // 0x72 'r'
+ { 1034, 8, 10, 9, 1, -9 }, // 0x73 's'
+ { 1044, 4, 12, 5, 1, -11 }, // 0x74 't'
+ { 1050, 8, 10, 10, 1, -9 }, // 0x75 'u'
+ { 1060, 9, 10, 9, 0, -9 }, // 0x76 'v'
+ { 1072, 13, 10, 13, 0, -9 }, // 0x77 'w'
+ { 1089, 8, 10, 9, 0, -9 }, // 0x78 'x'
+ { 1099, 9, 14, 9, 0, -9 }, // 0x79 'y'
+ { 1115, 7, 10, 9, 1, -9 }, // 0x7A 'z'
+ { 1124, 4, 17, 6, 1, -12 }, // 0x7B '{'
+ { 1133, 2, 17, 4, 2, -12 }, // 0x7C '|'
+ { 1138, 4, 17, 6, 1, -12 }, // 0x7D '}'
+ { 1147, 7, 3, 9, 1, -7 } }; // 0x7E '~'
+
+const GFXfont FreeSans9pt7b PROGMEM = {
+ (uint8_t *)FreeSans9pt7bBitmaps,
+ (GFXglyph *)FreeSans9pt7bGlyphs,
+ 0x20, 0x7E, 22 };
+
+// Approx. 1822 bytes
+// 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 URW_Gothic_L_Book_16Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0xFF,0xB0, // '!'
+ 0xB6,0xD0, // '"'
+ 0x11,0x08,0x84,0x82,0x4F,0xF9,0x10,0x89,0xFF,0x24,0x22,0x11,0x08,0x80, // '#'
+ 0x21,0xCC,0xA1,0x83,0x07,0x06,0x04,0x18,0x72,0x70,0x80, // '$'
+ 0x78,0x8C,0xD8,0x85,0x08,0x70,0xCE,0x07,0xA0,0x06,0x00,0x5E,0x0F,0x30,0xA1,0x0B,0x31,0x1E, // '%'
+ 0x3C,0x08,0xC1,0x08,0x21,0x03,0xC4,0xF1,0x13,0x64,0x38,0x83,0x10,0x71,0x1B,0x1E,0x30, // '&'
+ 0xF0, // '''
+ 0x13,0x64,0x88,0x88,0x8C,0x46,0x30, // '('
+ 0x8C,0x62,0x11,0x11,0x13,0x26,0xC8, // ')'
+ 0x52,0xBE,0x45,0x00, // '*'
+ 0x10,0x20,0x40,0x8F,0xE2,0x04,0x08, // '+'
+ 0x29,0x00, // ','
+ 0xF0, // '-'
+ 0xC0, // '.'
+ 0x08,0x46,0x21,0x18,0x84,0x62,0x11,0x88,0x40, // '/'
+ 0x38,0x8A,0x0C,0x18,0x30,0x60,0xC1,0x83,0x05,0x11,0xC0, // '0'
+ 0xE4,0x92,0x49,0x24,0x90, // '1'
+ 0x79,0x8A,0x0C,0x10,0x20,0x83,0x0C,0x30,0xC3,0x07,0xF0, // '2'
+ 0x3C,0x26,0x42,0x02,0x06,0x1C,0x02,0x01,0xC1,0x41,0x62,0x3C, // '3'
+ 0x06,0x06,0x0A,0x0A,0x12,0x32,0x22,0x42,0xC2,0xFF,0x02,0x02, // '4'
+ 0x3E,0x20,0x60,0x40,0x7C,0x62,0x01,0x01,0x81,0xC1,0x62,0x3C, // '5'
+ 0x08,0x18,0x10,0x20,0x7C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C, // '6'
+ 0xFE,0x0C,0x10,0x20,0x81,0x04,0x08,0x30,0x41,0x82,0x00, // '7'
+ 0x38,0x89,0x12,0x26,0x47,0x11,0x41,0x83,0x05,0x11,0xC0, // '8'
+ 0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3E,0x04,0x08,0x18,0x10, // '9'
+ 0xC3, // ':'
+ 0x50,0x07,0x80, // ';'
+ 0x01,0x06,0x38,0xE0,0xC0,0x70,0x0C,0x03, // '<'
+ 0xFF,0x00,0x00,0xFF, // '='
+ 0x80,0xE0,0x38,0x06,0x03,0x1C,0x70,0xC0, // '>'
+ 0x38,0x8A,0x0C,0x10,0x20,0x82,0x08,0x10,0x00,0x40,0x80, // '?'
+ 0x0F,0x83,0x04,0x67,0xA4,0xC9,0x88,0x99,0x09,0x91,0x19,0x12,0x53,0x64,0xDC,0x30,0x60,0xF8, // '@'
+ 0x06,0x00,0x60,0x0B,0x00,0x90,0x19,0x01,0x08,0x30,0x83,0xFC,0x20,0x46,0x06,0x40,0x2C,0x02, // 'A'
+ 0xFC,0x86,0x82,0x82,0x86,0xFC,0x82,0x81,0x81,0x81,0x82,0xFC, // 'B'
+ 0x0F,0x86,0x19,0x00,0xA0,0x08,0x01,0x00,0x20,0x04,0x00,0x40,0x08,0x04,0xC3,0x07,0xC0, // 'C'
+ 0xFC,0x20,0xC8,0x0A,0x03,0x80,0x60,0x18,0x06,0x01,0x80,0xE0,0x28,0x33,0xF0, // 'D'
+ 0xFE,0x08,0x20,0x82,0x0F,0xE0,0x82,0x08,0x3F, // 'E'
+ 0xFE,0x08,0x20,0x82,0x0F,0xE0,0x82,0x08,0x20, // 'F'
+ 0x0F,0x83,0x0C,0x40,0x24,0x00,0x80,0x08,0x00,0x80,0x08,0xFF,0x40,0x14,0x02,0x30,0x60,0xF8, // 'G'
+ 0x80,0xC0,0x60,0x30,0x18,0x0F,0xFE,0x03,0x01,0x80,0xC0,0x60,0x30,0x10, // 'H'
+ 0xFF,0xF0, // 'I'
+ 0x04,0x10,0x41,0x04,0x10,0x41,0x06,0x1C,0xDE, // 'J'
+ 0x83,0x86,0x8C,0x88,0x90,0xB0,0xF0,0xD8,0x88,0x84,0x86,0x83, // 'K'
+ 0x82,0x08,0x20,0x82,0x08,0x20,0x82,0x08,0x3F, // 'L'
+ 0xC0,0x3C,0x03,0xE0,0x7A,0x05,0xB0,0xD9,0x09,0x90,0x98,0x91,0x89,0x18,0xF1,0x86,0x18,0x61, // 'M'
+ 0xC0,0x78,0x1A,0x06,0x41,0x98,0x63,0x18,0x46,0x09,0x83,0x60,0x78,0x0E,0x01, // 'N'
+ 0x0F,0x03,0x0C,0x40,0x24,0x02,0x80,0x18,0x01,0x80,0x18,0x01,0x40,0x24,0x02,0x30,0xC0,0xF0, // 'O'
+ 0xFC,0x82,0x81,0x81,0x81,0x82,0xFC,0x80,0x80,0x80,0x80,0x80, // 'P'
+ 0x0F,0x83,0x0C,0x40,0x24,0x03,0x80,0x18,0x01,0x80,0x1F,0xC1,0x43,0x36,0x0A,0x30,0xC0,0xFB, // 'Q'
+ 0xFC,0x82,0x81,0x81,0x81,0x83,0x9E,0x98,0x88,0x84,0x86,0x82, // 'R'
+ 0x7B,0x38,0x60,0xC1,0xC1,0x81,0x06,0x1C,0xDE, // 'S'
+ 0xFE,0x20,0x40,0x81,0x02,0x04,0x08,0x10,0x20,0x40,0x80, // 'T'
+ 0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x42,0x3C, // 'U'
+ 0xC0,0x28,0x09,0x01,0x10,0x62,0x08,0x61,0x04,0x40,0x88,0x0B,0x01,0x40,0x38,0x02,0x00, // 'V'
+ 0xC1,0x02,0x83,0x05,0x0E,0x12,0x14,0x26,0x28,0x44,0x49,0x89,0x92,0x12,0x24,0x14,0x68,0x28,0x70,0x60,0xC0,0xC1,0x80, // 'W'
+ 0x40,0x98,0x42,0x30,0x48,0x1C,0x03,0x00,0xC0,0x58,0x32,0x08,0x44,0x1B,0x02, // 'X'
+ 0x80,0xA0,0x90,0x44,0x42,0x20,0xA0,0x50,0x10,0x08,0x04,0x02,0x01,0x00, // 'Y'
+ 0xFE,0x02,0x06,0x04,0x08,0x18,0x10,0x30,0x20,0x40,0x40,0xFF, // 'Z'
+ 0x2E,0x49,0x24,0x92,0x66,0x40, // '['
+ 0x41,0x06,0x08,0x20,0x41,0x06,0x08,0x20,0x41, // '\'
+ 0x99,0x92,0x49,0x24,0x9D,0x00, // ']'
+ 0x0C,0x06,0x05,0x82,0x42,0x21,0x09,0x84,0x81,0xC0,0x80, // '^'
+ 0xFF, // '_'
+ 0xC3, // '`'
+ 0x3E,0xB1,0xF0,0x70,0x18,0x0C,0x07,0x06,0xC7,0x3E,0x80, // 'a'
+ 0x80,0x40,0x20,0x17,0xCE,0x36,0x0E,0x03,0x01,0x80,0xE0,0xF8,0xD7,0xC0, // 'b'
+ 0x3E,0x31,0xB0,0x70,0x08,0x04,0x03,0x06,0xC6,0x3E,0x00, // 'c'
+ 0x00,0x80,0x40,0x27,0xD6,0x3E,0x0E,0x03,0x01,0x80,0xE0,0xD8,0xE3,0xD0, // 'd'
+ 0x3C,0x21,0xA0,0x50,0x3F,0xFC,0x02,0x04,0x86,0x3C,0x00, // 'e'
+ 0x34,0x4F,0x44,0x44,0x44,0x44, // 'f'
+ 0x3E,0xB1,0xF0,0x70,0x18,0x0C,0x07,0x06,0xC7,0x3E,0xE0,0x58,0x47,0xC0, // 'g'
+ 0x80,0x80,0x80,0xBC,0xC2,0x81,0x81,0x81,0x81,0x81,0x81,0x81, // 'h'
+ 0xDF,0xF0, // 'i'
+ 0x24,0x12,0x49,0x24,0x92,0xF0, // 'j'
+ 0x81,0x02,0x04,0x28,0xD3,0x24,0x50,0xF1,0xB2,0x34,0x20, // 'k'
+ 0xFF,0xF0, // 'l'
+ 0xB8,0xE6,0x28,0xA0,0x83,0x04,0x18,0x20,0xC1,0x06,0x08,0x30,0x41,0x82,0x08, // 'm'
+ 0xBC,0xC2,0x81,0x81,0x81,0x81,0x81,0x81,0x81, // 'n'
+ 0x3E,0x31,0xB0,0x70,0x18,0x0C,0x07,0x06,0xC6,0x3E,0x00, // 'o'
+ 0xBE,0x71,0xB0,0x70,0x18,0x0C,0x07,0x07,0xC6,0xBE,0x40,0x20,0x10,0x00, // 'p'
+ 0x3E,0xB1,0xF0,0x70,0x18,0x0C,0x07,0x06,0xC7,0x3E,0x80,0x40,0x20,0x10, // 'q'
+ 0xBA,0x49,0x24,0x80, // 'r'
+ 0x74,0x61,0x87,0x06,0x31,0x70, // 's'
+ 0x21,0x09,0xF2,0x10,0x84,0x21,0x08,0x40, // 't'
+ 0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x43,0x3D, // 'u'
+ 0xC1,0xA0,0x90,0xC4,0x42,0x21,0xA0,0x50,0x38,0x08,0x00, // 'v'
+ 0x80,0x0A,0x10,0xD0,0xC4,0xCA,0x22,0x52,0x12,0xD0,0x72,0x83,0x18,0x18,0xC0, // 'w'
+ 0xC2,0x46,0x2C,0x18,0x18,0x38,0x24,0x46,0xC2, // 'x'
+ 0xC1,0x41,0x42,0x22,0x26,0x34,0x1C,0x18,0x18,0x10,0x10,0x30, // 'y'
+ 0xFC,0x08,0x20,0xC1,0x04,0x18,0x20,0xFE, // 'z'
+ 0x69,0x24,0xB6,0x49,0x24,0x40, // '{'
+ 0xFF,0xF0, // '|'
+ 0xC9,0x24,0x8B,0x49,0x25,0x00 // '}'
+};
+const GFXglyph URW_Gothic_L_Book_16Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 5, 0, 0 }, // ' '
+ { 1, 1, 12, 6, 2, -12 }, // '!'
+ { 3, 3, 4, 6, 1, -12 }, // '"'
+ { 5, 9, 12, 10, 0, -12 }, // '#'
+ { 19, 6, 14, 10, 2, -13 }, // '$'
+ { 30, 12, 12, 13, 0, -12 }, // '%'
+ { 48, 11, 12, 13, 1, -12 }, // '&'
+ { 65, 1, 4, 4, 1, -12 }, // '''
+ { 66, 4, 14, 7, 1, -12 }, // '('
+ { 73, 4, 14, 7, 1, -12 }, // ')'
+ { 80, 5, 5, 8, 1, -12 }, // '*'
+ { 84, 7, 8, 11, 1, -9 }, // '+'
+ { 91, 3, 3, 5, 1, -2 }, // ','
+ { 93, 4, 1, 6, 1, -5 }, // '-'
+ { 94, 1, 2, 5, 2, -2 }, // '.'
+ { 95, 5, 14, 8, 1, -12 }, // '/'
+ { 104, 7, 12, 10, 1, -12 }, // '0'
+ { 115, 3, 12, 10, 3, -12 }, // '1'
+ { 120, 7, 12, 10, 1, -12 }, // '2'
+ { 131, 8, 12, 10, 0, -12 }, // '3'
+ { 143, 8, 12, 10, 0, -12 }, // '4'
+ { 155, 8, 12, 10, 0, -12 }, // '5'
+ { 167, 8, 12, 10, 0, -12 }, // '6'
+ { 179, 7, 12, 10, 1, -12 }, // '7'
+ { 190, 7, 12, 10, 1, -12 }, // '8'
+ { 201, 8, 12, 10, 0, -12 }, // '9'
+ { 213, 1, 8, 5, 2, -8 }, // ':'
+ { 214, 2, 9, 5, 1, -8 }, // ';'
+ { 217, 8, 8, 11, 1, -9 }, // '<'
+ { 225, 8, 4, 11, 1, -7 }, // '='
+ { 229, 8, 8, 11, 1, -9 }, // '>'
+ { 237, 7, 12, 10, 1, -12 }, // '?'
+ { 248, 12, 12, 15, 1, -12 }, // '@'
+ { 266, 12, 12, 13, 0, -12 }, // 'A'
+ { 284, 8, 12, 10, 1, -12 }, // 'B'
+ { 296, 11, 12, 14, 1, -12 }, // 'C'
+ { 313, 10, 12, 13, 1, -12 }, // 'D'
+ { 328, 6, 12, 10, 1, -12 }, // 'E'
+ { 337, 6, 12, 9, 1, -12 }, // 'F'
+ { 346, 12, 12, 15, 1, -12 }, // 'G'
+ { 364, 9, 12, 12, 1, -12 }, // 'H'
+ { 378, 1, 12, 5, 1, -12 }, // 'I'
+ { 380, 6, 12, 9, 0, -12 }, // 'J'
+ { 389, 8, 12, 10, 1, -12 }, // 'K'
+ { 401, 6, 12, 8, 1, -12 }, // 'L'
+ { 410, 12, 12, 16, 1, -12 }, // 'M'
+ { 428, 10, 12, 13, 1, -12 }, // 'N'
+ { 443, 12, 12, 15, 1, -12 }, // 'O'
+ { 461, 8, 12, 10, 1, -12 }, // 'P'
+ { 473, 12, 12, 15, 1, -12 }, // 'Q'
+ { 491, 8, 12, 11, 1, -12 }, // 'R'
+ { 503, 6, 12, 9, 1, -12 }, // 'S'
+ { 512, 7, 12, 8, 0, -12 }, // 'T'
+ { 523, 8, 12, 11, 1, -12 }, // 'U'
+ { 535, 11, 12, 12, 0, -12 }, // 'V'
+ { 552, 15, 12, 16, 0, -12 }, // 'W'
+ { 575, 10, 12, 11, 0, -12 }, // 'X'
+ { 590, 9, 12, 10, 0, -12 }, // 'Y'
+ { 604, 8, 12, 9, 0, -12 }, // 'Z'
+ { 616, 3, 14, 7, 2, -12 }, // '['
+ { 622, 6, 12, 11, 1, -12 }, // '\'
+ { 631, 3, 14, 7, 1, -12 }, // ']'
+ { 637, 9, 9, 11, 0, -12 }, // '^'
+ { 648, 8, 1, 9, 0, 1 }, // '_'
+ { 649, 4, 2, 7, 1, -12 }, // '`'
+ { 650, 9, 9, 12, 1, -9 }, // 'a'
+ { 661, 9, 12, 12, 1, -12 }, // 'b'
+ { 675, 9, 9, 11, 1, -9 }, // 'c'
+ { 686, 9, 12, 12, 1, -12 }, // 'd'
+ { 700, 9, 9, 11, 1, -9 }, // 'e'
+ { 711, 4, 12, 6, 1, -12 }, // 'f'
+ { 717, 9, 12, 12, 1, -9 }, // 'g'
+ { 731, 8, 12, 11, 1, -12 }, // 'h'
+ { 743, 1, 12, 4, 1, -12 }, // 'i'
+ { 745, 3, 15, 4, -1, -12 }, // 'j'
+ { 751, 7, 12, 9, 1, -12 }, // 'k'
+ { 762, 1, 12, 4, 1, -12 }, // 'l'
+ { 764, 13, 9, 16, 1, -9 }, // 'm'
+ { 779, 8, 9, 11, 1, -9 }, // 'n'
+ { 788, 9, 9, 11, 1, -9 }, // 'o'
+ { 799, 9, 12, 12, 1, -9 }, // 'p'
+ { 813, 9, 12, 12, 1, -9 }, // 'q'
+ { 827, 3, 9, 6, 1, -9 }, // 'r'
+ { 831, 5, 9, 7, 1, -9 }, // 's'
+ { 837, 5, 12, 6, 0, -12 }, // 't'
+ { 845, 8, 9, 11, 1, -9 }, // 'u'
+ { 854, 9, 9, 10, 0, -9 }, // 'v'
+ { 865, 13, 9, 14, 0, -9 }, // 'w'
+ { 880, 8, 9, 9, 0, -9 }, // 'x'
+ { 889, 8, 12, 10, 0, -9 }, // 'y'
+ { 901, 7, 9, 8, 0, -9 }, // 'z'
+ { 909, 3, 14, 7, 1, -12 }, // '{'
+ { 915, 1, 12, 12, 5, -12 }, // '|'
+ { 917, 3, 14, 7, 1, -12 } // '}'
+};
+const GFXfont URW_Gothic_L_Book_16 PROGMEM = {
+(uint8_t *)URW_Gothic_L_Book_16Bitmaps,(GFXglyph *)URW_Gothic_L_Book_16Glyphs,0x20, 0x7E, 20};
+
+// 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 Open_Sans_Condensed_Light_16Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0xAA,0xAA,0x0A, // '!'
+ 0xB6,0xD0, // '"'
+ 0x24,0x48,0x91,0x27,0xE5,0x0A,0x7E,0x48,0x91,0x22,0x40, // '#'
+ 0x22,0x7A,0xAA,0xC3,0x33,0x3E,0x22, // '$'
+ 0xC5,0x52,0xA5,0x4B,0x16,0xF6,0x8D,0x2A,0x54,0xAA,0x30, // '%'
+ 0x62,0x49,0x24,0x61,0x0A,0x29,0x9A,0x29,0xB9, // '&'
+ 0xF0, // '''
+ 0x5A,0xAA,0xAA,0x94, // '('
+ 0xA5,0x55,0x55,0x68, // ')'
+ 0x22,0xF6,0x90, // '*'
+ 0x10,0x41,0x3F,0x10,0x41,0x00, // '+'
+ 0xF0, // ','
+ 0xF0, // '-'
+ 0xC0, // '.'
+ 0x04,0x20,0x84,0x10,0x42,0x08,0x21,0x04,0x20, // '/'
+ 0x69,0x99,0x99,0x99,0x99,0x96, // '0'
+ 0x2E,0x92,0x49,0x24,0x90, // '1'
+ 0xE1,0x11,0x11,0x22,0x48,0x8F, // '2'
+ 0xE1,0x11,0x16,0x11,0x11,0x1E, // '3'
+ 0x08,0x61,0x8A,0x29,0x24,0x92,0x8B,0xF0,0x82, // '4'
+ 0xF8,0x88,0x8E,0x11,0x11,0x1E, // '5'
+ 0x74,0x88,0x8E,0x99,0x99,0x96, // '6'
+ 0xF8,0x42,0x10,0x88,0x42,0x21,0x08,0x80, // '7'
+ 0x64,0xA5,0x29,0x32,0x92,0x8C,0x64,0xC0, // '8'
+ 0x69,0x99,0x99,0xF1,0x11,0x2C, // '9'
+ 0xC1,0x80, // ':'
+ 0xC1,0xE0, // ';'
+ 0x04,0x66,0x20,0x60,0x60,0x40, // '<'
+ 0xFC,0x00,0x3F, // '='
+ 0x81,0x81,0x81,0x19,0x88,0x00, // '>'
+ 0x70,0x82,0x11,0x08,0x84,0x40,0x18,0xC0, // '?'
+ 0x3C,0x62,0x41,0x9D,0xA5,0xA5,0xA5,0xA5,0xAD,0x9E,0x80,0x40,0x38, // '@'
+ 0x20,0xC3,0x0C,0x51,0x24,0x9E,0x4A,0x18,0x61, // 'A'
+ 0xF4,0x63,0x18,0xFA,0x31,0x8C,0x63,0xE0, // 'B'
+ 0x39,0x08,0x20,0x82,0x08,0x20,0x82,0x04,0x0E, // 'C'
+ 0xF2,0x28,0x61,0x86,0x18,0x61,0x86,0x18,0xBC, // 'D'
+ 0xF8,0x88,0x8F,0x88,0x88,0x8F, // 'E'
+ 0xFC,0x21,0x08,0x43,0xF0,0x84,0x21,0x00, // 'F'
+ 0x39,0x18,0x20,0x82,0x08,0xE1,0x86,0x14,0x4F, // 'G'
+ 0x86,0x18,0x61,0x87,0xF8,0x61,0x86,0x18,0x61, // 'H'
+ 0xFF,0xF0, // 'I'
+ 0x24,0x92,0x49,0x24,0x92,0x70, // 'J'
+ 0x8C,0xA5,0x4A,0x62,0x94,0x94,0xA5,0x10, // 'K'
+ 0x84,0x21,0x08,0x42,0x10,0x84,0x21,0xF0, // 'L'
+ 0xC1,0xE0,0xF0,0x74,0x5A,0x2D,0x16,0x8B,0x29,0x94,0xCA,0x66,0x31,0x10, // 'M'
+ 0xC3,0x86,0x8D,0x1A,0x32,0x64,0xC5,0x8B,0x0E,0x1C,0x30, // 'N'
+ 0x79,0x28,0x61,0x86,0x18,0x61,0x86,0x14,0x9E, // 'O'
+ 0xF4,0x63,0x18,0xC7,0xD0,0x84,0x21,0x00, // 'P'
+ 0x79,0x28,0x61,0x86,0x18,0x61,0x86,0x14,0x9E,0x08,0x20,0x80, // 'Q'
+ 0xF2,0x28,0xA2,0x8A,0x2F,0x24,0x92,0x28,0xA1, // 'R'
+ 0x78,0x88,0x84,0x31,0x11,0x1E, // 'S'
+ 0xFC,0x82,0x08,0x20,0x82,0x08,0x20,0x82,0x08, // 'T'
+ 0x86,0x18,0x61,0x86,0x18,0x61,0x86,0x14,0x9E, // 'U'
+ 0x86,0x18,0x52,0x49,0x24,0x94,0x30,0xC3,0x0C, // 'V'
+ 0x84,0x30,0x86,0x28,0xA5,0x24,0xA4,0x94,0x92,0x92,0x8C,0x31,0x86,0x30,0xC6,0x18,0xC0, // 'W'
+ 0x45,0x24,0x8A,0x30,0x43,0x0C,0x49,0x24,0xA1, // 'X'
+ 0x8C,0x54,0xA5,0x28,0x84,0x21,0x08,0x40, // 'Y'
+ 0xF8,0x84,0x21,0x10,0x84,0x42,0x11,0xF0, // 'Z'
+ 0xF2,0x49,0x24,0x92,0x49,0x38, // '['
+ 0x81,0x04,0x08,0x20,0x81,0x04,0x10,0x20,0x81, // '\'
+ 0xE4,0x92,0x49,0x24,0x92,0x78, // ']'
+ 0x20,0xC4,0x92,0x84, // '^'
+ 0xFE, // '_'
+ 0x48,0x80, // '`'
+ 0x61,0x11,0x79,0x99,0xF0, // 'a'
+ 0x84,0x21,0x0F,0x66,0x31,0x8C,0x63,0x9B,0x00, // 'b'
+ 0x78,0x88,0x88,0x88,0x70, // 'c'
+ 0x08,0x42,0x16,0xCE,0x31,0x8C,0x63,0x36,0x80, // 'd'
+ 0x69,0x99,0xF8,0x88,0x70, // 'e'
+ 0x34,0x44,0xF4,0x44,0x44,0x44,0x40, // 'f'
+ 0x3D,0x24,0x92,0x48,0xC4,0x10,0x39,0x18,0x61,0x78, // 'g'
+ 0x84,0x21,0x0B,0x66,0x31,0x8C,0x63,0x18,0x80, // 'h'
+ 0xDF,0xF0, // 'i'
+ 0x51,0x55,0x55,0x56, // 'j'
+ 0x84,0x21,0x09,0x4A,0x94,0xE4,0xA5,0x28,0x80, // 'k'
+ 0xFF,0xF8, // 'l'
+ 0xF6,0x99,0x89,0x89,0x89,0x89,0x89,0x89,0x89, // 'm'
+ 0xB6,0x63,0x18,0xC6,0x31,0x88, // 'n'
+ 0x74,0x63,0x18,0xC6,0x31,0x70, // 'o'
+ 0xB6,0x63,0x18,0xC6,0x39,0xB4,0x21,0x08,0x00, // 'p'
+ 0x7C,0xE3,0x18,0xC6,0x33,0x68,0x42,0x10,0x80, // 'q'
+ 0xF2,0x49,0x24,0x80, // 'r'
+ 0xF2,0x44,0x49,0xE0, // 's'
+ 0x44,0xF4,0x44,0x44,0x44,0x30, // 't'
+ 0x8C,0x63,0x18,0xC6,0x33,0x68, // 'u'
+ 0x8C,0x62,0xA5,0x29,0x44,0x20, // 'v'
+ 0x88,0xC4,0x55,0x4A,0xA5,0x52,0xA9,0x54,0x44,0x22,0x00, // 'w'
+ 0x8A,0x94,0x42,0x11,0x4A,0x88, // 'x'
+ 0x8C,0x54,0xA5,0x29,0x44,0x21,0x08,0x8C,0x00, // 'y'
+ 0x72,0x22,0x44,0x44,0xF0, // 'z'
+ 0x32,0x44,0x44,0x48,0x44,0x44,0x42,0x10, // '{'
+ 0x55,0x55,0x55,0x55,0x40, // '|'
+ 0x84,0x22,0x22,0x21,0x22,0x22,0x24,0x80 // '}'
+};
+const GFXglyph Open_Sans_Condensed_Light_16Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 4, 0, 0 }, // ' '
+ { 1, 2, 12, 5, 1, -12 }, // '!'
+ { 4, 3, 4, 6, 1, -12 }, // '"'
+ { 6, 7, 12, 8, 0, -12 }, // '#'
+ { 17, 4, 14, 7, 1, -13 }, // '$'
+ { 24, 7, 12, 10, 1, -12 }, // '%'
+ { 35, 6, 12, 8, 1, -12 }, // '&'
+ { 44, 1, 4, 4, 1, -12 }, // '''
+ { 45, 2, 15, 5, 1, -12 }, // '('
+ { 49, 2, 15, 5, 1, -12 }, // ')'
+ { 53, 4, 5, 7, 1, -13 }, // '*'
+ { 56, 6, 7, 7, 0, -10 }, // '+'
+ { 62, 1, 4, 4, 1, -2 }, // ','
+ { 63, 4, 1, 5, 0, -5 }, // '-'
+ { 64, 1, 2, 4, 1, -2 }, // '.'
+ { 65, 6, 12, 7, 0, -12 }, // '/'
+ { 74, 4, 12, 7, 1, -12 }, // '0'
+ { 80, 3, 12, 7, 1, -12 }, // '1'
+ { 85, 4, 12, 7, 1, -12 }, // '2'
+ { 91, 4, 12, 7, 1, -12 }, // '3'
+ { 97, 6, 12, 7, 0, -12 }, // '4'
+ { 106, 4, 12, 7, 1, -12 }, // '5'
+ { 112, 4, 12, 7, 1, -12 }, // '6'
+ { 118, 5, 12, 7, 0, -12 }, // '7'
+ { 126, 5, 12, 7, 1, -12 }, // '8'
+ { 134, 4, 12, 7, 1, -12 }, // '9'
+ { 140, 1, 9, 4, 1, -9 }, // ':'
+ { 142, 1, 11, 4, 1, -9 }, // ';'
+ { 144, 6, 7, 7, 0, -10 }, // '<'
+ { 150, 6, 4, 7, 0, -8 }, // '='
+ { 153, 6, 7, 7, 0, -10 }, // '>'
+ { 159, 5, 12, 6, 0, -12 }, // '?'
+ { 167, 8, 13, 11, 1, -12 }, // '@'
+ { 180, 6, 12, 7, 0, -12 }, // 'A'
+ { 189, 5, 12, 8, 1, -12 }, // 'B'
+ { 197, 6, 12, 8, 1, -12 }, // 'C'
+ { 206, 6, 12, 9, 1, -12 }, // 'D'
+ { 215, 4, 12, 7, 1, -12 }, // 'E'
+ { 221, 5, 12, 7, 1, -12 }, // 'F'
+ { 229, 6, 12, 9, 1, -12 }, // 'G'
+ { 238, 6, 12, 9, 1, -12 }, // 'H'
+ { 247, 1, 12, 4, 1, -12 }, // 'I'
+ { 249, 3, 15, 4, -1, -12 }, // 'J'
+ { 255, 5, 12, 7, 1, -12 }, // 'K'
+ { 263, 5, 12, 7, 1, -12 }, // 'L'
+ { 271, 9, 12, 12, 1, -12 }, // 'M'
+ { 285, 7, 12, 10, 1, -12 }, // 'N'
+ { 296, 6, 12, 9, 1, -12 }, // 'O'
+ { 305, 5, 12, 8, 1, -12 }, // 'P'
+ { 313, 6, 15, 9, 1, -12 }, // 'Q'
+ { 325, 6, 12, 8, 1, -12 }, // 'R'
+ { 334, 4, 12, 7, 1, -12 }, // 'S'
+ { 340, 6, 12, 7, 0, -12 }, // 'T'
+ { 349, 6, 12, 9, 1, -12 }, // 'U'
+ { 358, 6, 12, 7, 0, -12 }, // 'V'
+ { 367, 11, 12, 12, 0, -12 }, // 'W'
+ { 384, 6, 12, 7, 0, -12 }, // 'X'
+ { 393, 5, 12, 6, 0, -12 }, // 'Y'
+ { 401, 5, 12, 6, 0, -12 }, // 'Z'
+ { 409, 3, 15, 6, 1, -12 }, // '['
+ { 415, 6, 12, 7, 0, -12 }, // '\'
+ { 424, 3, 15, 6, 1, -12 }, // ']'
+ { 430, 6, 5, 7, 0, -12 }, // '^'
+ { 434, 7, 1, 8, 0, 1 }, // '_'
+ { 435, 3, 3, 10, 3, -13 }, // '`'
+ { 437, 4, 9, 7, 1, -9 }, // 'a'
+ { 442, 5, 13, 8, 1, -13 }, // 'b'
+ { 451, 4, 9, 6, 1, -9 }, // 'c'
+ { 456, 5, 13, 8, 1, -13 }, // 'd'
+ { 465, 4, 9, 7, 1, -9 }, // 'e'
+ { 470, 4, 13, 5, 0, -13 }, // 'f'
+ { 477, 6, 13, 7, 0, -9 }, // 'g'
+ { 487, 5, 13, 8, 1, -13 }, // 'h'
+ { 496, 1, 12, 4, 1, -12 }, // 'i'
+ { 498, 2, 16, 4, 0, -12 }, // 'j'
+ { 502, 5, 13, 7, 1, -13 }, // 'k'
+ { 511, 1, 13, 4, 1, -13 }, // 'l'
+ { 513, 8, 9, 11, 1, -9 }, // 'm'
+ { 522, 5, 9, 8, 1, -9 }, // 'n'
+ { 528, 5, 9, 8, 1, -9 }, // 'o'
+ { 534, 5, 13, 8, 1, -9 }, // 'p'
+ { 543, 5, 13, 8, 1, -9 }, // 'q'
+ { 552, 3, 9, 5, 1, -9 }, // 'r'
+ { 556, 3, 9, 6, 1, -9 }, // 's'
+ { 560, 4, 11, 5, 0, -11 }, // 't'
+ { 566, 5, 9, 8, 1, -9 }, // 'u'
+ { 572, 5, 9, 6, 0, -9 }, // 'v'
+ { 578, 9, 9, 10, 0, -9 }, // 'w'
+ { 589, 5, 9, 6, 0, -9 }, // 'x'
+ { 595, 5, 13, 6, 0, -9 }, // 'y'
+ { 604, 4, 9, 5, 0, -9 }, // 'z'
+ { 609, 4, 15, 7, 1, -12 }, // '{'
+ { 617, 2, 17, 7, 2, -13 }, // '|'
+ { 622, 4, 15, 7, 1, -12 } // '}'
+};
+const GFXfont Open_Sans_Condensed_Light_16 PROGMEM = {
+(uint8_t *)Open_Sans_Condensed_Light_16Bitmaps,(GFXglyph *)Open_Sans_Condensed_Light_16Glyphs,0x20, 0x7E, 23};
+
+
+// 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 Open_Sans_Condensed_Light_19Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0xF5,0x55,0x50,0xF0, // '!'
+ 0x99,0x99,0x90, // '"'
+ 0x12,0x12,0x14,0x24,0x7F,0x24,0x24,0x24,0x24,0xFE,0x24,0x28,0x48,0x48, // '#'
+ 0x20,0x87,0xF9,0xA2,0x8A,0x18,0x18,0x92,0x49,0x2F,0xE2,0x08, // '$'
+ 0x62,0x51,0x25,0x12,0x89,0x44,0xDA,0x6B,0x59,0x6C,0x8A,0x45,0x22,0x92,0x29,0x18, // '%'
+ 0x70,0xA1,0x42,0x85,0x0A,0x08,0x30,0x95,0x2A,0x34,0x28,0xCE,0x40, // '&'
+ 0xAA,0x80, // '''
+ 0x25,0x29,0x24,0x92,0x48,0x92,0x20, // '('
+ 0x89,0x22,0x49,0x24,0x92,0x92,0x80, // ')'
+ 0x21,0x3E,0xA5,0x00, // '*'
+ 0x20,0x82,0x08,0xFC,0x82,0x08,0x00, // '+'
+ 0x6A, // ','
+ 0xE0, // '-'
+ 0xF0, // '.'
+ 0x08,0x20,0x84,0x10,0x42,0x08,0x21,0x04,0x20,0x82,0x00, // '/'
+ 0x31,0x28,0x61,0x86,0x18,0x61,0x86,0x18,0x61,0x49,0xC0, // '0'
+ 0x13,0xD1,0x11,0x11,0x11,0x11,0x11, // '1'
+ 0x7A,0x20,0x41,0x04,0x10,0x82,0x10,0x82,0x10,0x83,0xF0, // '2'
+ 0x7A,0x20,0x41,0x04,0x27,0x02,0x04,0x10,0x41,0x0B,0xC0, // '3'
+ 0x04,0x0C,0x0C,0x14,0x14,0x24,0x24,0x44,0x44,0x44,0xFF,0x04,0x04,0x04, // '4'
+ 0xFA,0x08,0x20,0x82,0x0F,0x83,0x04,0x10,0x41,0x0B,0xC0, // '5'
+ 0x39,0x84,0x20,0x82,0xEC,0xE1,0x86,0x18,0x61,0x48,0xE0, // '6'
+ 0xFC,0x10,0x42,0x08,0x21,0x04,0x10,0x82,0x08,0x41,0x00, // '7'
+ 0x7B,0x38,0x61,0x85,0x23,0x16,0x86,0x18,0x61,0xC5,0xE0, // '8'
+ 0x73,0x28,0x61,0x86,0x18,0x73,0x74,0x10,0x82,0x1B,0xC0, // '9'
+ 0xF0,0x00,0xF0, // ':'
+ 0xF0,0x00,0x6A, // ';'
+ 0x04,0x23,0x30,0xC0,0xC0,0x81, // '<'
+ 0xFC,0x00,0x00,0xFC, // '='
+ 0x81,0x03,0x03,0x0C,0xC4,0x20, // '>'
+ 0x70,0x82,0x11,0x08,0x84,0x22,0x00,0x06,0x30, // '?'
+ 0x1E,0x11,0x90,0x48,0x18,0xCC,0xA6,0x53,0x29,0x94,0xCA,0x65,0x33,0x68,0x02,0x01,0x80,0x78, // '@'
+ 0x18,0x18,0x18,0x18,0x24,0x24,0x24,0x24,0x7E,0x42,0x42,0x42,0x81,0x81, // 'A'
+ 0xFA,0x38,0x61,0x86,0x2F,0x23,0x86,0x18,0x61,0x87,0xE0, // 'B'
+ 0x1C,0xC1,0x04,0x08,0x10,0x20,0x40,0x81,0x02,0x02,0x06,0x03,0x80, // 'C'
+ 0xF9,0x1A,0x14,0x18,0x30,0x60,0xC1,0x83,0x06,0x0C,0x28,0xDF,0x00, // 'D'
+ 0xFC,0x21,0x08,0x43,0xF0,0x84,0x21,0x08,0x7C, // 'E'
+ 0xFC,0x21,0x08,0x42,0x1E,0x84,0x21,0x08,0x40, // 'F'
+ 0x1E,0x21,0x40,0xC0,0x80,0x80,0x80,0x87,0x81,0x81,0xC1,0x41,0x21,0x1F, // 'G'
+ 0x86,0x18,0x61,0x86,0x1F,0xE1,0x86,0x18,0x61,0x86,0x10, // 'H'
+ 0xAA,0xAA,0xAA,0xA0, // 'I'
+ 0x24,0x92,0x49,0x24,0x92,0x49,0xE0, // 'J'
+ 0x8A,0x29,0x24,0xA2,0x8C,0x28,0xA2,0x49,0x22,0x8A,0x10, // 'K'
+ 0x84,0x21,0x08,0x42,0x10,0x84,0x21,0x08,0x7C, // 'L'
+ 0xC0,0x78,0x0E,0x82,0xD0,0x5A,0x0B,0x42,0x64,0x4C,0x89,0x91,0x31,0x46,0x28,0xC5,0x18,0xA3,0x08,0x40, // 'M'
+ 0xC1,0xC1,0xA1,0xA1,0x91,0x91,0x91,0x89,0x89,0x85,0x85,0x85,0x83,0x83, // 'N'
+ 0x3C,0x66,0x42,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x42,0x66,0x3C, // 'O'
+ 0xF4,0xE3,0x18,0xC6,0x7E,0x84,0x21,0x08,0x40, // 'P'
+ 0x3C,0x66,0x42,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x42,0x66,0x3C,0x04,0x04,0x02, // 'Q'
+ 0xF9,0x1A,0x14,0x28,0x50,0xA3,0x78,0x91,0x12,0x24,0x28,0x50,0x80, // 'R'
+ 0x3F,0x18,0x20,0x83,0x06,0x06,0x04,0x10,0x41,0x0F,0xC0, // 'S'
+ 0xFE,0x20,0x40,0x81,0x02,0x04,0x08,0x10,0x20,0x40,0x81,0x02,0x00, // 'T'
+ 0x83,0x06,0x0C,0x18,0x30,0x60,0xC1,0x83,0x06,0x0A,0x24,0x47,0x00, // 'U'
+ 0x83,0x06,0x12,0x24,0x48,0x91,0x14,0x28,0x50,0xA1,0x41,0x02,0x00, // 'V'
+ 0x82,0x0C,0x10,0x51,0x44,0x8A,0x24,0x51,0x22,0x89,0x14,0x45,0x14,0x28,0xA1,0x45,0x0A,0x28,0x51,0x41,0x0C,0x08,0x20, // 'W'
+ 0x42,0x88,0x91,0x22,0x83,0x04,0x0C,0x28,0x50,0x92,0x24,0x50,0x40, // 'X'
+ 0x86,0x14,0x92,0x48,0xC3,0x0C,0x10,0x41,0x04,0x10,0x40, // 'Y'
+ 0xF8,0x84,0x22,0x10,0x88,0x42,0x21,0x08,0x7C, // 'Z'
+ 0xF2,0x49,0x24,0x92,0x49,0x24,0xE0, // '['
+ 0x82,0x08,0x10,0x41,0x02,0x08,0x10,0x41,0x02,0x08,0x20, // '\'
+ 0xE4,0x92,0x49,0x24,0x92,0x49,0xE0, // ']'
+ 0x18,0x18,0x24,0x24,0x42,0x42,0x42, // '^'
+ 0xFF, // '_'
+ 0x88,0x80, // '`'
+ 0x70,0xC2,0x17,0xC6,0x31,0x9B,0x40, // 'a'
+ 0x82,0x08,0x20,0x82,0xEC,0xE1,0x86,0x18,0x61,0x87,0x3B,0x80, // 'b'
+ 0x7A,0x21,0x08,0x42,0x10,0x43,0xC0, // 'c'
+ 0x04,0x10,0x41,0x05,0xDC,0xE1,0x86,0x18,0x61,0x87,0x37,0x40, // 'd'
+ 0x74,0x63,0x1F,0xC2,0x10,0x43,0xC0, // 'e'
+ 0x39,0x10,0x84,0x79,0x08,0x42,0x10,0x84,0x21,0x00, // 'f'
+ 0x3E,0x89,0x12,0x24,0x48,0x8E,0x10,0x40,0x79,0x0C,0x18,0x28,0x9E,0x00, // 'g'
+ 0x82,0x08,0x20,0x82,0xEC,0xA1,0x86,0x18,0x61,0x86,0x18,0x40, // 'h'
+ 0xA0,0xAA,0xAA,0xA0, // 'i'
+ 0x48,0x04,0x92,0x49,0x24,0x92,0x4B,0x00, // 'j'
+ 0x82,0x08,0x20,0x82,0x28,0xA4,0xA2,0xCD,0x24,0x8A,0x28,0x40, // 'k'
+ 0xAA,0xAA,0xAA,0xA8, // 'l'
+ 0xBB,0xB3,0x28,0x46,0x11,0x84,0x61,0x18,0x46,0x11,0x84,0x61,0x10, // 'm'
+ 0xBB,0x28,0x61,0x86,0x18,0x61,0x86,0x10, // 'n'
+ 0x79,0x28,0x61,0x86,0x18,0x61,0x49,0xE0, // 'o'
+ 0xBB,0x38,0x61,0x86,0x18,0x61,0xCE,0xE8,0x20,0x82,0x08,0x00, // 'p'
+ 0x77,0x38,0x61,0x86,0x18,0x61,0xCD,0xD0,0x41,0x04,0x10,0x40, // 'q'
+ 0xBC,0xC8,0x88,0x88,0x88, // 'r'
+ 0x78,0x88,0x43,0x11,0x1E, // 's'
+ 0x44,0xF4,0x44,0x44,0x44,0x43, // 't'
+ 0x86,0x18,0x61,0x86,0x18,0x61,0x4D,0xD0, // 'u'
+ 0x86,0x14,0x92,0x49,0x23,0x0C,0x30,0xC0, // 'v'
+ 0x8C,0x63,0x14,0xC9,0x32,0x4C,0x94,0xA5,0x28,0xCC,0x33,0x08,0x40, // 'w'
+ 0x49,0x24,0x8C,0x30,0xC3,0x12,0x4A,0x10, // 'x'
+ 0x86,0x14,0x92,0x49,0x23,0x0C,0x30,0xC2,0x08,0x20,0x8C,0x00, // 'y'
+ 0xE2,0x22,0x44,0x88,0x8F, // 'z'
+ 0x19,0x08,0x42,0x10,0x84,0xC1,0x08,0x42,0x10,0x84,0x18, // '{'
+ 0xAA,0xAA,0xAA,0xAA,0xAA, // '|'
+ 0xC1,0x08,0x42,0x10,0x84,0x19,0x08,0x42,0x10,0x84,0xC0 // '}'
+};
+const GFXglyph Open_Sans_Condensed_Light_19Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 5, 0, 0 }, // ' '
+ { 1, 2, 14, 5, 1, -14 }, // '!'
+ { 5, 4, 5, 7, 1, -14 }, // '"'
+ { 8, 8, 14, 9, 0, -14 }, // '#'
+ { 22, 6, 16, 9, 1, -15 }, // '$'
+ { 34, 9, 14, 12, 1, -14 }, // '%'
+ { 50, 7, 14, 9, 1, -14 }, // '&'
+ { 63, 2, 5, 5, 1, -14 }, // '''
+ { 65, 3, 17, 6, 1, -14 }, // '('
+ { 72, 3, 17, 6, 1, -14 }, // ')'
+ { 79, 5, 5, 8, 1, -15 }, // '*'
+ { 83, 6, 9, 9, 1, -12 }, // '+'
+ { 90, 2, 4, 5, 1, -2 }, // ','
+ { 91, 3, 1, 6, 1, -6 }, // '-'
+ { 92, 2, 2, 5, 1, -2 }, // '.'
+ { 93, 6, 14, 8, 1, -14 }, // '/'
+ { 104, 6, 14, 9, 1, -14 }, // '0'
+ { 115, 4, 14, 9, 1, -14 }, // '1'
+ { 122, 6, 14, 9, 1, -14 }, // '2'
+ { 133, 6, 14, 9, 1, -14 }, // '3'
+ { 144, 8, 14, 9, 0, -14 }, // '4'
+ { 158, 6, 14, 9, 1, -14 }, // '5'
+ { 169, 6, 14, 9, 1, -14 }, // '6'
+ { 180, 6, 14, 9, 1, -14 }, // '7'
+ { 191, 6, 14, 9, 1, -14 }, // '8'
+ { 202, 6, 14, 9, 1, -14 }, // '9'
+ { 213, 2, 10, 5, 1, -10 }, // ':'
+ { 216, 2, 12, 5, 1, -10 }, // ';'
+ { 219, 6, 8, 9, 1, -11 }, // '<'
+ { 225, 6, 5, 9, 1, -10 }, // '='
+ { 229, 6, 8, 9, 1, -11 }, // '>'
+ { 235, 5, 14, 6, 0, -14 }, // '?'
+ { 244, 9, 16, 12, 1, -14 }, // '@'
+ { 262, 8, 14, 9, 0, -14 }, // 'A'
+ { 276, 6, 14, 9, 1, -14 }, // 'B'
+ { 287, 7, 14, 9, 1, -14 }, // 'C'
+ { 300, 7, 14, 10, 1, -14 }, // 'D'
+ { 313, 5, 14, 8, 1, -14 }, // 'E'
+ { 322, 5, 14, 8, 2, -14 }, // 'F'
+ { 331, 8, 14, 11, 1, -14 }, // 'G'
+ { 345, 6, 14, 11, 2, -14 }, // 'H'
+ { 356, 2, 14, 5, 1, -14 }, // 'I'
+ { 360, 3, 17, 5, -1, -14 }, // 'J'
+ { 367, 6, 14, 9, 2, -14 }, // 'K'
+ { 378, 5, 14, 8, 2, -14 }, // 'L'
+ { 387, 11, 14, 14, 1, -14 }, // 'M'
+ { 407, 8, 14, 11, 1, -14 }, // 'N'
+ { 421, 8, 14, 11, 1, -14 }, // 'O'
+ { 435, 5, 14, 9, 2, -14 }, // 'P'
+ { 444, 8, 17, 11, 1, -14 }, // 'Q'
+ { 461, 7, 14, 9, 1, -14 }, // 'R'
+ { 474, 6, 14, 9, 1, -14 }, // 'S'
+ { 485, 7, 14, 8, 0, -14 }, // 'T'
+ { 498, 7, 14, 10, 1, -14 }, // 'U'
+ { 511, 7, 14, 8, 0, -14 }, // 'V'
+ { 524, 13, 14, 14, 0, -14 }, // 'W'
+ { 547, 7, 14, 8, 0, -14 }, // 'X'
+ { 560, 6, 14, 7, 0, -14 }, // 'Y'
+ { 571, 5, 14, 7, 1, -14 }, // 'Z'
+ { 580, 3, 17, 7, 2, -14 }, // '['
+ { 587, 6, 14, 8, 1, -14 }, // '\'
+ { 598, 3, 17, 7, 1, -14 }, // ']'
+ { 605, 8, 7, 9, 0, -14 }, // '^'
+ { 612, 8, 1, 9, 0, 2 }, // '_'
+ { 613, 3, 3, 11, 4, -15 }, // '`'
+ { 615, 5, 10, 8, 1, -10 }, // 'a'
+ { 622, 6, 15, 9, 1, -15 }, // 'b'
+ { 634, 5, 10, 7, 1, -10 }, // 'c'
+ { 641, 6, 15, 9, 1, -15 }, // 'd'
+ { 653, 5, 10, 8, 1, -10 }, // 'e'
+ { 660, 5, 15, 5, 0, -15 }, // 'f'
+ { 670, 7, 15, 8, 0, -10 }, // 'g'
+ { 684, 6, 15, 9, 1, -15 }, // 'h'
+ { 696, 2, 14, 5, 1, -14 }, // 'i'
+ { 700, 3, 19, 5, 0, -14 }, // 'j'
+ { 708, 6, 15, 8, 1, -15 }, // 'k'
+ { 720, 2, 15, 5, 1, -15 }, // 'l'
+ { 724, 10, 10, 13, 1, -10 }, // 'm'
+ { 737, 6, 10, 9, 1, -10 }, // 'n'
+ { 745, 6, 10, 9, 1, -10 }, // 'o'
+ { 753, 6, 15, 9, 1, -10 }, // 'p'
+ { 765, 6, 15, 9, 1, -10 }, // 'q'
+ { 777, 4, 10, 6, 1, -10 }, // 'r'
+ { 782, 4, 10, 7, 1, -10 }, // 's'
+ { 787, 4, 12, 5, 0, -12 }, // 't'
+ { 793, 6, 10, 9, 1, -10 }, // 'u'
+ { 801, 6, 10, 7, 0, -10 }, // 'v'
+ { 809, 10, 10, 11, 0, -10 }, // 'w'
+ { 822, 6, 10, 7, 0, -10 }, // 'x'
+ { 830, 6, 15, 7, 0, -10 }, // 'y'
+ { 842, 4, 10, 6, 1, -10 }, // 'z'
+ { 847, 5, 17, 8, 1, -14 }, // '{'
+ { 858, 2, 20, 9, 3, -15 }, // '|'
+ { 863, 5, 17, 8, 1, -14 } // '}'
+};
+const GFXfont Open_Sans_Condensed_Light_19 PROGMEM = {
+(uint8_t *)Open_Sans_Condensed_Light_19Bitmaps,(GFXglyph *)Open_Sans_Condensed_Light_19Glyphs,0x20, 0x7E, 27};
+
+// 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 Open_Sans_Condensed_Light_22Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0xFF,0xF3, // '!'
+ 0xDE,0xD6,0xA4,0xA4, // '"'
+ 0x12,0x09,0x04,0x82,0x41,0x23,0xFC,0x48,0x44,0x22,0x12,0x3F,0xC4,0x82,0x41,0x20,0x90,0x48, // '#'
+ 0x10,0x20,0xF2,0x89,0x12,0x24,0x28,0x70,0x30,0x50,0x91,0x22,0x45,0x7C,0x10,0x20,0x40, // '$'
+ 0x61,0x12,0x22,0x44,0x49,0x09,0x21,0x24,0x25,0x34,0xA9,0x95,0x2C,0xA4,0x24,0x84,0x90,0x92,0x22,0x44,0x48,0x86, // '%'
+ 0x30,0x48,0x48,0x48,0x48,0x48,0x30,0x20,0x50,0x92,0x8A,0x8A,0x86,0x86,0x8A,0x71, // '&'
+ 0xF5,0x50, // '''
+ 0x12,0x24,0x44,0xC8,0x88,0x88,0x84,0x44,0x22,0x10, // '('
+ 0x84,0x42,0x22,0x31,0x11,0x11,0x12,0x22,0x44,0x80, // ')'
+ 0x30,0x4D,0xCC,0x79,0x20, // '*'
+ 0x10,0x20,0x40,0x81,0x1F,0xC4,0x08,0x10,0x20,0x40, // '+'
+ 0x49,0x48, // ','
+ 0xF0, // '-'
+ 0xC0, // '.'
+ 0x04,0x08,0x10,0x40,0x83,0x04,0x08,0x20,0x40,0x82,0x04,0x08,0x20,0x40, // '/'
+ 0x38,0x89,0x14,0x18,0x30,0x60,0xC1,0x83,0x06,0x0C,0x18,0x28,0x91,0x1C, // '0'
+ 0x35,0x91,0x11,0x11,0x11,0x11,0x11,0x11, // '1'
+ 0x79,0x08,0x10,0x10,0x20,0x81,0x02,0x08,0x10,0x41,0x02,0x08,0x20,0x7F, // '2'
+ 0x79,0x08,0x18,0x10,0x20,0x83,0x18,0x0C,0x0C,0x08,0x10,0x20,0xC1,0x7C, // '3'
+ 0x06,0x03,0x02,0x81,0x40,0xA0,0x90,0x48,0x44,0x22,0x21,0x10,0x9F,0xF0,0x20,0x10,0x08,0x04, // '4'
+ 0x7C,0x82,0x04,0x08,0x10,0x3E,0x02,0x02,0x04,0x08,0x10,0x20,0xA3,0x7C, // '5'
+ 0x1C,0x41,0x02,0x04,0x10,0x2E,0x62,0x83,0x06,0x0C,0x18,0x28,0x51,0x1C, // '6'
+ 0xFE,0x04,0x08,0x20,0x40,0x82,0x04,0x08,0x20,0x40,0x82,0x04,0x08,0x20, // '7'
+ 0x38,0x8A,0x0C,0x18,0x28,0x99,0x1C,0x69,0x8A,0x0C,0x18,0x30,0x51,0x9C, // '8'
+ 0x38,0x8A,0x14,0x38,0x30,0x60,0xC3,0x46,0x74,0x08,0x20,0x40,0x82,0x38, // '9'
+ 0xC0,0x30, // ':'
+ 0x48,0x00,0x00,0x01,0x25,0x20, // ';'
+ 0x02,0x08,0x63,0x08,0x0C,0x06,0x03,0x02, // '<'
+ 0xFE,0x00,0x00,0x00,0x1F,0xC0, // '='
+ 0x80,0x80,0xC0,0x60,0x21,0x8C,0x60,0x80, // '>'
+ 0x70,0x20,0x83,0x08,0x20,0x84,0x10,0x82,0x08,0x00,0x02,0x08, // '?'
+ 0x0F,0x02,0x30,0x83,0x20,0x24,0x74,0x92,0x62,0x4C,0x99,0x93,0x32,0x46,0x48,0xC9,0x18,0xB4,0x9B,0x90,0x03,0x00,0x31,0x03,0xC0, // '@'
+ 0x08,0x04,0x05,0x02,0x81,0x40,0xA0,0x88,0x44,0x22,0x1F,0x10,0x48,0x24,0x12,0x0A,0x03,0x01, // 'A'
+ 0xF9,0x0A,0x0C,0x18,0x30,0xE1,0x7C,0x85,0x06,0x0C,0x18,0x30,0x61,0x7C, // 'B'
+ 0x1E,0x41,0x02,0x04,0x10,0x20,0x40,0x81,0x02,0x02,0x04,0x0C,0x08,0x0F, // 'C'
+ 0xF8,0x8C,0x86,0x82,0x82,0x81,0x81,0x81,0x81,0x81,0x81,0x82,0x82,0x86,0x8C,0xF8, // 'D'
+ 0xFC,0x21,0x08,0x42,0x1F,0x84,0x21,0x08,0x42,0x1F, // 'E'
+ 0xFE,0x08,0x20,0x82,0x08,0x20,0xFA,0x08,0x20,0x82,0x08,0x20, // 'F'
+ 0x0F,0x8C,0x26,0x01,0x00,0x40,0x30,0x08,0x02,0x00,0x83,0xE0,0x1C,0x05,0x01,0x40,0x58,0x13,0x04,0x3E, // 'G'
+ 0x83,0x06,0x0C,0x18,0x30,0x60,0xFF,0x83,0x06,0x0C,0x18,0x30,0x60,0xC1, // 'H'
+ 0xFF,0xFF, // 'I'
+ 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x32,0x2E, // 'J'
+ 0x85,0x0A,0x24,0x49,0x16,0x28,0x70,0xE1,0x22,0x44,0x48,0x90,0xA1,0x41, // 'K'
+ 0x82,0x08,0x20,0x82,0x08,0x20,0x82,0x08,0x20,0x82,0x08,0x3F, // 'L'
+ 0x80,0x38,0x0F,0x01,0xE0,0x3A,0x0B,0x41,0x68,0x2D,0x05,0x91,0x32,0x26,0x44,0xC5,0x18,0xA3,0x14,0x62,0x8C,0x21, // 'M'
+ 0x81,0xC1,0xC1,0xA1,0xA1,0xA1,0x91,0x91,0x89,0x89,0x85,0x85,0x87,0x83,0x83,0x81, // 'N'
+ 0x1C,0x11,0x10,0x48,0x2C,0x1C,0x06,0x03,0x01,0x80,0xC0,0x60,0x38,0x34,0x12,0x08,0x88,0x38, // 'O'
+ 0xF2,0x38,0x61,0x86,0x18,0x62,0xF2,0x08,0x20,0x82,0x08,0x20, // 'P'
+ 0x1C,0x11,0x10,0x48,0x2C,0x1C,0x06,0x03,0x01,0x80,0xC0,0x60,0x38,0x34,0x12,0x08,0x88,0x38,0x04,0x01,0x00,0x80,0x20, // 'Q'
+ 0xF1,0x12,0x14,0x28,0x50,0xA1,0x44,0xF1,0x22,0x44,0x48,0x91,0xA1,0x42, // 'R'
+ 0x3E,0x82,0x04,0x08,0x10,0x10,0x18,0x0C,0x08,0x08,0x10,0x20,0x41,0x7C, // 'S'
+ 0xFF,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, // 'T'
+ 0x83,0x06,0x0C,0x18,0x30,0x60,0xC1,0x83,0x06,0x0C,0x18,0x30,0x51,0x9E, // 'U'
+ 0x80,0xC0,0x50,0x48,0x24,0x12,0x08,0x88,0x44,0x22,0x11,0x05,0x02,0x81,0x40,0xA0,0x20,0x10, // 'V'
+ 0x81,0x03,0x82,0x0D,0x0A,0x12,0x14,0x24,0x28,0x48,0x50,0x98,0xA3,0x12,0x24,0x24,0x48,0x48,0x90,0x91,0x20,0xA2,0x81,0x83,0x03,0x06,0x06,0x0C,0x0C,0x18, // 'W'
+ 0x41,0x42,0x22,0x24,0x24,0x14,0x18,0x08,0x18,0x18,0x24,0x24,0x26,0x42,0x42,0x81, // 'X'
+ 0x83,0x8D,0x12,0x24,0x45,0x0A,0x14,0x10,0x20,0x40,0x81,0x02,0x04,0x08, // 'Y'
+ 0xF8,0x20,0x86,0x10,0x43,0x08,0x21,0x84,0x10,0xC2,0x08,0x3F, // 'Z'
+ 0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0xF0, // '['
+ 0x81,0x01,0x02,0x04,0x04,0x08,0x10,0x10,0x20,0x60,0x40,0x80,0x81,0x02, // '\'
+ 0xF1,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0xF0, // ']'
+ 0x08,0x0A,0x05,0x04,0x82,0x21,0x11,0x04,0x82, // '^'
+ 0xFF,0x80, // '_'
+ 0x99,0x10, // '`'
+ 0x78,0x20,0x81,0x04,0xFC,0x61,0x8E,0x38,0xDD, // 'a'
+ 0x81,0x02,0x04,0x08,0x17,0x31,0x43,0x83,0x06,0x0C,0x18,0x30,0x61,0x62,0xB8, // 'b'
+ 0x3D,0x04,0x20,0x82,0x08,0x20,0x81,0x04,0x0E, // 'c'
+ 0x02,0x04,0x08,0x10,0x27,0x51,0xA1,0x83,0x06,0x0C,0x18,0x30,0x70,0xA3,0x3A, // 'd'
+ 0x38,0x89,0x1C,0x18,0x3F,0xE0,0x40,0x80,0x81,0x89,0xE0, // 'e'
+ 0x19,0x08,0x42,0x7C,0x84,0x21,0x08,0x42,0x10,0x84,0x20, // 'f'
+ 0x3F,0x24,0x42,0x42,0x42,0x42,0x24,0x38,0x20,0x20,0x3E,0x43,0x41,0x81,0x81,0x42,0x3C, // 'g'
+ 0x82,0x08,0x20,0x82,0xE4,0xA2,0x86,0x18,0x61,0x86,0x18,0x61,0x84, // 'h'
+ 0xF0,0xFF,0xFF,0xFF, // 'i'
+ 0x6C,0x06,0xDB,0x6D,0xB6,0xDB,0x6D,0x2C, // 'j'
+ 0x82,0x08,0x20,0x82,0x28,0xA4,0xA2,0x8E,0x24,0x92,0x48,0xA2,0x84, // 'k'
+ 0xFF,0xFF,0x80, // 'l'
+ 0xF3,0xA3,0x18,0xC6,0x11,0x84,0x61,0x18,0x46,0x11,0x84,0x61,0x18,0x46,0x11, // 'm'
+ 0x39,0x28,0xA1,0x86,0x18,0x61,0x86,0x18,0x61, // 'n'
+ 0x38,0x8B,0x1C,0x18,0x30,0x60,0xC1,0x83,0x8D,0x11,0xC0, // 'o'
+ 0xB9,0x8A,0x1C,0x18,0x30,0x60,0xC1,0x83,0x0B,0x15,0xC8,0x10,0x20,0x40,0x80, // 'p'
+ 0x3A,0x8D,0x0C,0x18,0x30,0x60,0xC1,0x83,0x85,0x19,0xD0,0x20,0x40,0x81,0x02, // 'q'
+ 0xBC,0x88,0x88,0x88,0x88,0x88, // 'r'
+ 0x7C,0x21,0x08,0x30,0x41,0x08,0x43,0xE0, // 's'
+ 0x21,0x09,0xF2,0x10,0x84,0x21,0x08,0x42,0x10,0xE0, // 't'
+ 0x85,0x0A,0x14,0x28,0x50,0xA1,0x43,0x86,0x8D,0x29,0x90, // 'u'
+ 0x83,0x05,0x12,0x24,0x48,0x8A,0x14,0x28,0x50,0xC0,0x80, // 'v'
+ 0x86,0x14,0x62,0x46,0x24,0x62,0x4A,0x24,0x92,0x29,0x42,0x94,0x29,0x42,0x94,0x30,0xC1,0x08, // 'w'
+ 0x44,0x88,0xA1,0x42,0x82,0x04,0x14,0x28,0x89,0x12,0x20, // 'x'
+ 0x83,0x05,0x12,0x24,0x48,0x8A,0x14,0x28,0x50,0x40,0x81,0x02,0x08,0x10,0xC0, // 'y'
+ 0xF1,0x12,0x22,0x44,0x48,0x8F, // 'z'
+ 0x0C,0x43,0x08,0x20,0x82,0x08,0x23,0x02,0x08,0x20,0x82,0x08,0x10,0x40,0xC0, // '{'
+ 0xFF,0xFF,0xFC, // '|'
+ 0xC0,0x83,0x04,0x10,0x41,0x04,0x10,0x31,0x04,0x10,0x41,0x04,0x20,0x8C,0x00 // '}'
+};
+const GFXglyph Open_Sans_Condensed_Light_22Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 5, 0, 0 }, // ' '
+ { 1, 1, 16, 6, 2, -16 }, // '!'
+ { 3, 5, 6, 8, 1, -16 }, // '"'
+ { 7, 9, 16, 10, 0, -16 }, // '#'
+ { 25, 7, 19, 10, 1, -17 }, // '$'
+ { 42, 11, 16, 14, 1, -16 }, // '%'
+ { 64, 8, 16, 10, 1, -16 }, // '&'
+ { 80, 2, 6, 5, 1, -16 }, // '''
+ { 82, 4, 19, 7, 1, -16 }, // '('
+ { 92, 4, 19, 7, 1, -16 }, // ')'
+ { 102, 6, 6, 9, 1, -17 }, // '*'
+ { 107, 7, 11, 10, 1, -14 }, // '+'
+ { 117, 3, 5, 6, 1, -2 }, // ','
+ { 119, 4, 1, 7, 1, -6 }, // '-'
+ { 120, 1, 2, 6, 2, -2 }, // '.'
+ { 121, 7, 16, 9, 1, -16 }, // '/'
+ { 135, 7, 16, 10, 1, -16 }, // '0'
+ { 149, 4, 16, 10, 2, -16 }, // '1'
+ { 157, 7, 16, 10, 1, -16 }, // '2'
+ { 171, 7, 16, 10, 1, -16 }, // '3'
+ { 185, 9, 16, 10, 0, -16 }, // '4'
+ { 203, 7, 16, 10, 1, -16 }, // '5'
+ { 217, 7, 16, 10, 1, -16 }, // '6'
+ { 231, 7, 16, 10, 1, -16 }, // '7'
+ { 245, 7, 16, 10, 1, -16 }, // '8'
+ { 259, 7, 16, 10, 1, -16 }, // '9'
+ { 273, 1, 12, 6, 2, -12 }, // ':'
+ { 275, 3, 15, 6, 1, -12 }, // ';'
+ { 281, 7, 9, 10, 1, -13 }, // '<'
+ { 289, 7, 6, 10, 1, -11 }, // '='
+ { 295, 7, 9, 10, 1, -13 }, // '>'
+ { 303, 6, 16, 7, 0, -16 }, // '?'
+ { 315, 11, 18, 14, 1, -16 }, // '@'
+ { 340, 9, 16, 10, 0, -16 }, // 'A'
+ { 358, 7, 16, 11, 2, -16 }, // 'B'
+ { 372, 7, 16, 10, 1, -16 }, // 'C'
+ { 386, 8, 16, 12, 2, -16 }, // 'D'
+ { 402, 5, 16, 9, 2, -16 }, // 'E'
+ { 412, 6, 16, 9, 2, -16 }, // 'F'
+ { 424, 10, 16, 13, 1, -16 }, // 'G'
+ { 444, 7, 16, 12, 2, -16 }, // 'H'
+ { 458, 1, 16, 5, 2, -16 }, // 'I'
+ { 460, 4, 20, 5, -1, -16 }, // 'J'
+ { 470, 7, 16, 10, 2, -16 }, // 'K'
+ { 484, 6, 16, 9, 2, -16 }, // 'L'
+ { 496, 11, 16, 16, 2, -16 }, // 'M'
+ { 518, 8, 16, 13, 2, -16 }, // 'N'
+ { 534, 9, 16, 12, 1, -16 }, // 'O'
+ { 552, 6, 16, 10, 2, -16 }, // 'P'
+ { 564, 9, 20, 12, 1, -16 }, // 'Q'
+ { 587, 7, 16, 10, 2, -16 }, // 'R'
+ { 601, 7, 16, 10, 1, -16 }, // 'S'
+ { 615, 8, 16, 9, 0, -16 }, // 'T'
+ { 631, 7, 16, 12, 2, -16 }, // 'U'
+ { 645, 9, 16, 10, 0, -16 }, // 'V'
+ { 663, 15, 16, 16, 0, -16 }, // 'W'
+ { 693, 8, 16, 9, 0, -16 }, // 'X'
+ { 709, 7, 16, 8, 0, -16 }, // 'Y'
+ { 723, 6, 16, 8, 1, -16 }, // 'Z'
+ { 735, 4, 19, 8, 2, -16 }, // '['
+ { 745, 7, 16, 9, 1, -16 }, // '\'
+ { 759, 4, 19, 8, 1, -16 }, // ']'
+ { 769, 9, 8, 10, 0, -16 }, // '^'
+ { 778, 9, 1, 10, 0, 2 }, // '_'
+ { 780, 3, 4, 13, 5, -17 }, // '`'
+ { 782, 6, 12, 9, 1, -12 }, // 'a'
+ { 791, 7, 17, 11, 2, -17 }, // 'b'
+ { 806, 6, 12, 8, 1, -12 }, // 'c'
+ { 815, 7, 17, 11, 1, -17 }, // 'd'
+ { 830, 7, 12, 10, 1, -12 }, // 'e'
+ { 841, 5, 17, 6, 0, -17 }, // 'f'
+ { 852, 8, 17, 9, 0, -12 }, // 'g'
+ { 869, 6, 17, 10, 2, -17 }, // 'h'
+ { 882, 2, 16, 5, 1, -16 }, // 'i'
+ { 886, 3, 21, 5, 0, -16 }, // 'j'
+ { 894, 6, 17, 9, 2, -17 }, // 'k'
+ { 907, 1, 17, 5, 2, -17 }, // 'l'
+ { 910, 10, 12, 15, 2, -12 }, // 'm'
+ { 925, 6, 12, 10, 2, -12 }, // 'n'
+ { 934, 7, 12, 10, 1, -12 }, // 'o'
+ { 945, 7, 17, 11, 2, -12 }, // 'p'
+ { 960, 7, 17, 11, 1, -12 }, // 'q'
+ { 975, 4, 12, 7, 2, -12 }, // 'r'
+ { 981, 5, 12, 8, 1, -12 }, // 's'
+ { 989, 5, 15, 6, 0, -15 }, // 't'
+ { 999, 7, 12, 10, 1, -12 }, // 'u'
+ { 1010, 7, 12, 8, 0, -12 }, // 'v'
+ { 1021, 12, 12, 13, 0, -12 }, // 'w'
+ { 1039, 7, 12, 8, 0, -12 }, // 'x'
+ { 1050, 7, 17, 8, 0, -12 }, // 'y'
+ { 1065, 4, 12, 7, 1, -12 }, // 'z'
+ { 1071, 6, 19, 9, 1, -16 }, // '{'
+ { 1086, 1, 22, 10, 4, -17 }, // '|'
+ { 1089, 6, 19, 9, 1, -16 } // '}'
+};
+const GFXfont Open_Sans_Condensed_Light_22 PROGMEM = {
+(uint8_t *)Open_Sans_Condensed_Light_22Bitmaps,(GFXglyph *)Open_Sans_Condensed_Light_22Glyphs,0x20, 0x7E, 31};
+
+// 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 Roboto_Condensed_19Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0xFF,0xCC, // '!'
+ 0xDD,0x99, // '"'
+ 0x09,0x0D,0x84,0xCF,0xF1,0x20,0x90,0xC8,0x6C,0xFF,0x12,0x09,0x04,0x82,0x43,0x20, // '#'
+ 0x10,0x20,0xF3,0x2C,0x78,0xF0,0x20,0x70,0x38,0x18,0x38,0x38,0xF1,0xBE,0x10,0x20, // '$'
+ 0x70,0x26,0x08,0x92,0x24,0x9A,0x1D,0x80,0x40,0x30,0x0B,0x86,0x91,0x64,0xD9,0x22,0x40,0xE0, // '%'
+ 0x38,0x32,0x11,0x08,0x86,0xC3,0xC0,0xC0,0xF0,0xD9,0x66,0xA1,0xD8,0xCC,0x71,0xCC, // '&'
+ 0xF0, // '''
+ 0x11,0x26,0x64,0x4C,0xCC,0xCC,0x44,0x66,0x21,0x10, // '('
+ 0x82,0x08,0x43,0x08,0x43,0x18,0xC6,0x31,0x08,0xC6,0x22,0x20, // ')'
+ 0x18,0x18,0x99,0xFF,0x18,0x3C,0x26,0x64, // '*'
+ 0x18,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x18, // '+'
+ 0x6D,0xAC, // ','
+ 0xF0, // '-'
+ 0xF0, // '.'
+ 0x04,0x10,0xC2,0x08,0x61,0x04,0x30,0x82,0x18,0x41,0x0C,0x00, // '/'
+ 0x3C,0xCB,0x1E,0x1C,0x38,0x70,0xE1,0xC3,0x87,0x0A,0x36,0x47,0x80, // '0'
+ 0x09,0xF6,0x31,0x8C,0x63,0x18,0xC6,0x31,0x8C, // '1'
+ 0x3C,0x46,0xC6,0xC6,0x06,0x06,0x04,0x0C,0x18,0x18,0x30,0x60,0x40,0xFF, // '2'
+ 0x79,0x8B,0x18,0x30,0x61,0x8E,0x02,0x06,0x0C,0x1C,0x3C,0x4F,0x00, // '3'
+ 0x06,0x03,0x03,0x83,0xC1,0x61,0xB0,0x98,0xCC,0x46,0x7F,0xC1,0x80,0xC0,0x60,0x30, // '4'
+ 0x7E,0x60,0x60,0x60,0x40,0x7C,0x66,0x02,0x03,0x03,0xC3,0x42,0x66,0x3C, // '5'
+ 0x1C,0x61,0x82,0x0C,0x1F,0xB9,0xE3,0xC3,0x87,0x0E,0x36,0x47,0x00, // '6'
+ 0xFF,0x02,0x06,0x06,0x04,0x0C,0x0C,0x18,0x18,0x10,0x30,0x30,0x20,0x60, // '7'
+ 0x38,0x8B,0x1E,0x3C,0x68,0x8E,0x22,0xC7,0x8F,0x1E,0x34,0x47,0x00, // '8'
+ 0x38,0x9B,0x14,0x38,0x70,0xF1,0xE7,0x7E,0x0C,0x10,0x20,0x8E,0x00, // '9'
+ 0xF0,0x00,0xF0, // ':'
+ 0x6C,0x00,0x00,0x6D,0xAC, // ';'
+ 0x04,0x77,0x30,0xC1,0xC1,0xC1, // '<'
+ 0xFE,0x00,0x00,0x0F,0xE0, // '='
+ 0x81,0xC0,0xE0,0x70,0xE7,0x38,0x40, // '>'
+ 0x7B,0x38,0x41,0x0C,0x31,0x8C,0x30,0xC0,0x00,0x30,0xC0, // '?'
+ 0x07,0x80,0xC3,0x0C,0x0C,0x40,0x24,0x39,0x22,0x45,0x32,0x39,0x11,0xC8,0x8E,0x44,0x72,0x27,0x93,0x24,0xEE,0x20,0x00,0x80,0x06,0x10,0x0F,0x80, // '@'
+ 0x04,0x01,0xC0,0x28,0x05,0x01,0xB0,0x36,0x04,0x41,0x8C,0x31,0x87,0xF0,0x83,0x30,0x66,0x0D,0x80,0xC0, // 'A'
+ 0xFE,0xC3,0xC3,0xC3,0xC3,0xC2,0xFC,0xC3,0xC3,0xC1,0xC1,0xC3,0xC3,0xFE, // 'B'
+ 0x1E,0x11,0x98,0x68,0x3C,0x06,0x03,0x01,0x80,0xC0,0x60,0x10,0x6C,0x32,0x30,0xF0, // 'C'
+ 0xF8,0x84,0x86,0x82,0x83,0x83,0x83,0x83,0x83,0x83,0x82,0x86,0x84,0xF8, // 'D'
+ 0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0xFE,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xFF, // 'E'
+ 0xFF,0x83,0x06,0x0C,0x18,0x3F,0xE0,0xC1,0x83,0x06,0x0C,0x18,0x00, // 'F'
+ 0x3E,0x31,0x90,0x78,0x3C,0x06,0x03,0x01,0x8F,0xC1,0xE0,0xF0,0x68,0x36,0x30,0xF0, // 'G'
+ 0x81,0x81,0x81,0x81,0x81,0x81,0xFF,0x81,0x81,0x81,0x81,0x81,0x81,0x81, // 'H'
+ 0xFF,0xFC, // 'I'
+ 0x06,0x0C,0x18,0x30,0x60,0xC1,0x83,0x06,0x0E,0x1C,0x3C,0xCF,0x00, // 'J'
+ 0xC3,0xE1,0xB1,0x99,0x8C,0xC6,0xC3,0xE1,0xF0,0xEC,0x66,0x31,0x98,0x6C,0x36,0x0C, // 'K'
+ 0xC1,0x83,0x06,0x0C,0x18,0x30,0x60,0xC1,0x83,0x06,0x0C,0x1F,0xC0, // 'L'
+ 0xE0,0x3E,0x07,0xE0,0x7F,0x07,0xF0,0xFD,0x0F,0xD8,0xBD,0x9B,0xC9,0xBC,0xD3,0xCF,0x3C,0x73,0xC6,0x3C,0x63, // 'M'
+ 0xC1,0xC1,0xE1,0xE1,0xB1,0xB1,0x99,0x99,0x8D,0x8D,0x87,0x87,0x83,0x83, // 'N'
+ 0x3E,0x31,0x90,0x58,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x68,0x26,0x31,0xF0, // 'O'
+ 0xFC,0x86,0x83,0x83,0x83,0x83,0x86,0xFC,0x80,0x80,0x80,0x80,0x80,0x80, // 'P'
+ 0x3E,0x31,0xB0,0x58,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x78,0x26,0x31,0xF8,0x0E,0x03, // 'Q'
+ 0xFC,0x61,0xB0,0xD8,0x6C,0x36,0x1B,0x09,0xF8,0xC4,0x63,0x31,0x98,0x6C,0x36,0x0C, // 'R'
+ 0x3C,0x63,0xC3,0xC3,0xC0,0x60,0x38,0x1E,0x07,0x03,0xC3,0xC3,0xC3,0x3C, // 'S'
+ 0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, // 'T'
+ 0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x68,0x26,0x31,0xF0, // 'U'
+ 0xC1,0xE0,0xF0,0x68,0x26,0x33,0x18,0x8C,0x44,0x36,0x1B,0x05,0x03,0x81,0xC0,0x40, // 'V'
+ 0x82,0x1E,0x30,0xF1,0xC5,0x8E,0x24,0x51,0x26,0x99,0x34,0xCD,0x36,0x68,0xA3,0x45,0x0E,0x28,0x61,0xC3,0x0E,0x18,0x20, // 'W'
+ 0xC1,0xE1,0x98,0xCC,0xC3,0x60,0xE0,0x60,0x38,0x3C,0x1B,0x19,0x8C,0x6C,0x36,0x0C, // 'X'
+ 0xC0,0xD8,0x66,0x18,0xCC,0x33,0x04,0x81,0xE0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00, // 'Y'
+ 0xFF,0x03,0x06,0x06,0x0C,0x0C,0x18,0x18,0x30,0x30,0x60,0x40,0xC0,0xFF, // 'Z'
+ 0xFB,0x6D,0xB6,0xDB,0x6D,0xB6,0xDC, // '['
+ 0xC0,0x81,0x81,0x02,0x06,0x04,0x08,0x18,0x30,0x20,0x60,0xC0,0x81,0x80, // '\'
+ 0xE4,0x92,0x49,0x24,0x92,0x49,0x3C, // ']'
+ 0x23,0x94,0xAD,0xEE,0x20, // '^'
+ 0xFE, // '_'
+ 0xCC,0x80, // '`'
+ 0x3C,0x8B,0x18,0x33,0xF8,0xF1,0xE3,0xCE,0xEC, // 'a'
+ 0xC1,0x83,0x06,0x0F,0xD8,0xF1,0xE1,0xC3,0x87,0x0E,0x3C,0x7F,0x80, // 'b'
+ 0x3C,0x8F,0x0E,0x1C,0x18,0x30,0x61,0x46,0x78, // 'c'
+ 0x06,0x0C,0x18,0x37,0xF8,0xF1,0xC3,0x87,0x0E,0x1E,0x3C,0x6F,0xC0, // 'd'
+ 0x3C,0x8F,0x1E,0x1F,0xF8,0x30,0x60,0x66,0x78, // 'e'
+ 0x3B,0x18,0xCF,0x31,0x8C,0x63,0x18,0xC6,0x30, // 'f'
+ 0x7F,0x8F,0x1C,0x38,0x70,0xE1,0xE3,0xC6,0xFC,0x1C,0x3C,0x4F,0x00, // 'g'
+ 0xC1,0x83,0x06,0x0F,0xD8,0xF1,0xE3,0xC7,0x8F,0x1E,0x3C,0x78,0xC0, // 'h'
+ 0xF0,0xFF,0xFF,0xF0, // 'i'
+ 0x6C,0x06,0xDB,0x6D,0xB6,0xDB,0x78, // 'j'
+ 0xC0,0xC0,0xC0,0xC0,0xC6,0xCC,0xD8,0xD8,0xF0,0xF8,0xC8,0xCC,0xC6,0xC7, // 'k'
+ 0xFF,0xFF,0xFF,0xF0, // 'l'
+ 0xFD,0xEC,0x63,0xC6,0x3C,0x63,0xC6,0x3C,0x63,0xC6,0x3C,0x63,0xC6,0x3C,0x63, // 'm'
+ 0xDD,0xCF,0x1E,0x3C,0x78,0xF1,0xE3,0xC7,0x8C, // 'n'
+ 0x3C,0x66,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0x66,0x3C, // 'o'
+ 0xFD,0x8F,0x1E,0x1C,0x38,0x70,0xE3,0xC7,0xFB,0x06,0x0C,0x18,0x00, // 'p'
+ 0x3A,0xCF,0x0E,0x1C,0x38,0x70,0xE1,0x66,0x74,0x08,0x10,0x20,0x40, // 'q'
+ 0xFE,0xCC,0xCC,0xCC,0xCC, // 'r'
+ 0x3C,0x8B,0x1A,0x07,0x03,0x81,0xE3,0x46,0x78, // 's'
+ 0x31,0xBE,0x63,0x18,0xC6,0x31,0x8C,0x30, // 't'
+ 0xC7,0x8F,0x1E,0x3C,0x78,0xF1,0xE3,0xC6,0xFC, // 'u'
+ 0xC3,0x42,0x66,0x66,0x24,0x24,0x3C,0x18,0x18,0x18, // 'v'
+ 0xC6,0x34,0x62,0x46,0x26,0xF6,0x6F,0x62,0x94,0x29,0x43,0x9C,0x30,0xC1,0x08, // 'w'
+ 0x63,0x66,0x34,0x3C,0x18,0x18,0x3C,0x34,0x66,0xE3, // 'x'
+ 0xC3,0x66,0x66,0x66,0x24,0x3C,0x3C,0x18,0x18,0x18,0x18,0x10,0x30,0x60, // 'y'
+ 0xFC,0x18,0x20,0xC3,0x06,0x18,0x30,0xC1,0xFC, // 'z'
+ 0x11,0xC8,0xC6,0x31,0x8C,0xC3,0x18,0xC6,0x31,0x84,0x30,0xC0, // '{'
+ 0xFF,0xFF,0x80, // '|'
+ 0x47,0x08,0x63,0x18,0xC6,0x19,0x8C,0x63,0x18,0xC4,0x66,0x00 // '}'
+};
+const GFXglyph Roboto_Condensed_19Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 5, 0, 0 }, // ' '
+ { 1, 1, 14, 6, 2, -14 }, // '!'
+ { 3, 4, 4, 7, 1, -14 }, // '"'
+ { 5, 9, 14, 11, 1, -14 }, // '#'
+ { 21, 7, 18, 10, 1, -16 }, // '$'
+ { 37, 10, 14, 13, 1, -14 }, // '%'
+ { 55, 9, 14, 11, 1, -14 }, // '&'
+ { 71, 1, 4, 4, 1, -14 }, // '''
+ { 72, 4, 19, 7, 1, -15 }, // '('
+ { 82, 5, 19, 7, 0, -15 }, // ')'
+ { 94, 8, 8, 9, 0, -14 }, // '*'
+ { 102, 8, 9, 10, 1, -11 }, // '+'
+ { 111, 3, 5, 5, 0, -2 }, // ','
+ { 113, 4, 1, 6, 0, -6 }, // '-'
+ { 114, 2, 2, 6, 1, -2 }, // '.'
+ { 115, 6, 15, 8, 0, -14 }, // '/'
+ { 127, 7, 14, 10, 1, -14 }, // '0'
+ { 140, 5, 14, 10, 1, -14 }, // '1'
+ { 149, 8, 14, 10, 1, -14 }, // '2'
+ { 163, 7, 14, 10, 1, -14 }, // '3'
+ { 176, 9, 14, 10, 0, -14 }, // '4'
+ { 192, 8, 14, 10, 1, -14 }, // '5'
+ { 206, 7, 14, 10, 1, -14 }, // '6'
+ { 219, 8, 14, 10, 1, -14 }, // '7'
+ { 233, 7, 14, 10, 1, -14 }, // '8'
+ { 246, 7, 14, 10, 1, -14 }, // '9'
+ { 259, 2, 10, 5, 1, -10 }, // ':'
+ { 262, 3, 13, 5, 0, -10 }, // ';'
+ { 267, 6, 8, 9, 1, -10 }, // '<'
+ { 273, 7, 5, 10, 1, -9 }, // '='
+ { 278, 7, 8, 10, 1, -10 }, // '>'
+ { 285, 6, 14, 9, 1, -14 }, // '?'
+ { 296, 13, 17, 16, 1, -13 }, // '@'
+ { 324, 11, 14, 12, 0, -14 }, // 'A'
+ { 344, 8, 14, 11, 1, -14 }, // 'B'
+ { 358, 9, 14, 12, 1, -14 }, // 'C'
+ { 374, 8, 14, 12, 2, -14 }, // 'D'
+ { 388, 8, 14, 10, 1, -14 }, // 'E'
+ { 402, 7, 14, 10, 1, -14 }, // 'F'
+ { 415, 9, 14, 12, 1, -14 }, // 'G'
+ { 431, 8, 14, 13, 2, -14 }, // 'H'
+ { 445, 1, 14, 6, 2, -14 }, // 'I'
+ { 447, 7, 14, 10, 1, -14 }, // 'J'
+ { 460, 9, 14, 11, 1, -14 }, // 'K'
+ { 476, 7, 14, 10, 1, -14 }, // 'L'
+ { 489, 12, 14, 15, 1, -14 }, // 'M'
+ { 510, 8, 14, 13, 2, -14 }, // 'N'
+ { 524, 9, 14, 12, 1, -14 }, // 'O'
+ { 540, 8, 14, 12, 2, -14 }, // 'P'
+ { 554, 9, 16, 12, 1, -14 }, // 'Q'
+ { 572, 9, 14, 11, 1, -14 }, // 'R'
+ { 588, 8, 14, 11, 1, -14 }, // 'S'
+ { 602, 8, 14, 11, 1, -14 }, // 'T'
+ { 616, 9, 14, 12, 1, -14 }, // 'U'
+ { 632, 9, 14, 12, 1, -14 }, // 'V'
+ { 648, 13, 14, 15, 1, -14 }, // 'W'
+ { 671, 9, 14, 11, 1, -14 }, // 'X'
+ { 687, 10, 14, 11, 0, -14 }, // 'Y'
+ { 705, 8, 14, 11, 1, -14 }, // 'Z'
+ { 719, 3, 18, 6, 1, -15 }, // '['
+ { 726, 7, 15, 8, 0, -14 }, // '\'
+ { 740, 3, 18, 6, 0, -15 }, // ']'
+ { 747, 5, 7, 8, 1, -14 }, // '^'
+ { 752, 7, 1, 9, 0, 0 }, // '_'
+ { 753, 3, 3, 7, 1, -15 }, // '`'
+ { 755, 7, 10, 10, 1, -10 }, // 'a'
+ { 764, 7, 14, 10, 1, -14 }, // 'b'
+ { 777, 7, 10, 10, 1, -10 }, // 'c'
+ { 786, 7, 14, 10, 1, -14 }, // 'd'
+ { 799, 7, 10, 10, 1, -10 }, // 'e'
+ { 808, 5, 14, 7, 1, -14 }, // 'f'
+ { 817, 7, 14, 10, 1, -10 }, // 'g'
+ { 830, 7, 14, 10, 1, -14 }, // 'h'
+ { 843, 2, 14, 5, 1, -14 }, // 'i'
+ { 847, 3, 18, 5, 0, -14 }, // 'j'
+ { 854, 8, 14, 10, 1, -14 }, // 'k'
+ { 868, 2, 14, 5, 1, -14 }, // 'l'
+ { 872, 12, 10, 15, 1, -10 }, // 'm'
+ { 887, 7, 10, 10, 1, -10 }, // 'n'
+ { 896, 8, 10, 11, 1, -10 }, // 'o'
+ { 906, 7, 14, 10, 1, -10 }, // 'p'
+ { 919, 7, 14, 11, 1, -10 }, // 'q'
+ { 932, 4, 10, 7, 1, -10 }, // 'r'
+ { 937, 7, 10, 10, 1, -10 }, // 's'
+ { 946, 5, 12, 7, 0, -12 }, // 't'
+ { 954, 7, 10, 10, 1, -10 }, // 'u'
+ { 963, 8, 10, 9, 0, -10 }, // 'v'
+ { 973, 12, 10, 13, 0, -10 }, // 'w'
+ { 988, 8, 10, 9, 0, -10 }, // 'x'
+ { 998, 8, 14, 9, 0, -10 }, // 'y'
+ { 1012, 7, 10, 9, 1, -10 }, // 'z'
+ { 1021, 5, 18, 7, 1, -15 }, // '{'
+ { 1033, 1, 17, 6, 2, -14 }, // '|'
+ { 1036, 5, 18, 7, 0, -15 } // '}'
+};
+const GFXfont Roboto_Condensed_19 PROGMEM = {
+(uint8_t *)Roboto_Condensed_19Bitmaps,(GFXglyph *)Roboto_Condensed_19Glyphs,0x20, 0x7E, 23};
+
+
+// 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 URW_Palladio_L_Roman_18Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0x7F,0x55,0x0F, // '!'
+ 0x9C,0xA5,0x20, // '"'
+ 0x13,0x09,0x04,0x82,0x47,0xF9,0x10,0x89,0xFE,0x24,0x12,0x09,0x08,0x80, // '#'
+ 0x10,0xFA,0x54,0x89,0x1A,0x1F,0x0F,0x12,0x26,0x4C,0xA7,0x82,0x04,0x00, // '$'
+ 0x70,0x44,0x44,0x22,0x21,0x12,0x08,0x90,0x39,0x00,0x09,0xC0,0x99,0x04,0x88,0x44,0x42,0x22,0x21,0x31,0x07,0x00, // '%'
+ 0x1C,0x02,0x40,0x24,0x02,0x80,0x28,0x03,0x3F,0x50,0x89,0x88,0x8C,0x88,0x70,0xC3,0x07,0xCE, // '&'
+ 0xEA, // '''
+ 0x12,0x44,0x88,0x88,0x88,0x88,0x44,0x42,0x10, // '('
+ 0x84,0x22,0x21,0x11,0x11,0x11,0x22,0x44,0x80, // ')'
+ 0x04,0xB8,0x7E,0xD0,0x40, // '*'
+ 0x08,0x04,0x02,0x01,0x0F,0xF8,0x40,0x20,0x10,0x08,0x00, // '+'
+ 0x32,0x64,0x80, // ','
+ 0x78, // '-'
+ 0xF0, // '.'
+ 0x02,0x08,0x10,0x20,0x81,0x04,0x08,0x20,0x40,0x82,0x04,0x10,0x20,0x00, // '/'
+ 0x38,0x8A,0x1C,0x18,0x30,0x60,0xC1,0x83,0x07,0x12,0x23,0x80, // '0'
+ 0x13,0xC1,0x04,0x10,0x41,0x04,0x10,0x41,0x1F, // '1'
+ 0x3C,0x46,0x82,0x02,0x02,0x04,0x04,0x08,0x10,0x20,0x43,0xFF, // '2'
+ 0x3C,0x8D,0x08,0x10,0x43,0x81,0x81,0x03,0x05,0x13,0xC0, // '3'
+ 0x04,0x0C,0x1C,0x14,0x24,0x24,0x44,0x44,0xFF,0x04,0x04,0x1F, // '4'
+ 0x7E,0x81,0x02,0x0B,0xC8,0xC0,0x81,0x03,0x0A,0x13,0xC0, // '5'
+ 0x04,0x30,0x82,0x04,0x17,0xB1,0xC1,0x83,0x05,0x11,0xC0, // '6'
+ 0xFF,0x82,0x86,0x04,0x08,0x08,0x10,0x10,0x20,0x60,0x40,0xC0, // '7'
+ 0x3C,0x8E,0x0C,0x1C,0x4F,0x0F,0x23,0x83,0x06,0x0E,0x27,0x80, // '8'
+ 0x3C,0x42,0x81,0x81,0x81,0x81,0x43,0x3D,0x02,0x02,0x04,0x08,0x70, // '9'
+ 0xF0,0x0F, // ':'
+ 0x50,0x05,0xA8, // ';'
+ 0x01,0x83,0x06,0x0C,0x0C,0x01,0x80,0x30,0x06,0x00,0x80, // '<'
+ 0xFF,0x80,0x00,0x00,0x0F,0xF8, // '='
+ 0xC0,0x18,0x03,0x00,0x60,0x18,0x30,0x60,0xC0,0x80,0x00, // '>'
+ 0x7A,0x30,0x41,0x08,0x43,0x08,0x00,0x02,0x08, // '?'
+ 0x0F,0xC1,0x83,0x18,0x04,0x85,0x98,0xDC,0xCC,0x46,0x46,0x32,0x32,0x53,0xB3,0x66,0xCC,0x0C,0x1F,0x80, // '@'
+ 0x02,0x00,0x18,0x01,0x40,0x0B,0x00,0x88,0x04,0x60,0x43,0x03,0xFC,0x10,0x61,0x01,0x88,0x0D,0xE0,0xF0, // 'A'
+ 0xFE,0x11,0x88,0x44,0x22,0x21,0xF0,0x86,0x41,0x20,0x90,0x48,0x4F,0xC0, // 'B'
+ 0x0F,0x86,0x09,0x01,0x20,0x08,0x01,0x00,0x20,0x04,0x00,0xC0,0x08,0x00,0xC1,0x07,0xC0, // 'C'
+ 0xFF,0x82,0x06,0x20,0x22,0x01,0x20,0x12,0x01,0x20,0x12,0x01,0x20,0x22,0x02,0x20,0xC7,0xF0, // 'D'
+ 0xFF,0x90,0x48,0x24,0x02,0x11,0xF8,0x84,0x42,0x20,0x10,0x48,0x3F,0xF0, // 'E'
+ 0xFF,0x90,0x88,0x04,0x02,0x11,0xF8,0x84,0x42,0x20,0x10,0x08,0x1F,0x00, // 'F'
+ 0x0F,0xE1,0x80,0x90,0x00,0x80,0x08,0x00,0x40,0x02,0x00,0x10,0x1F,0xC0,0x13,0x00,0x8E,0x04,0x1F,0xC0, // 'G'
+ 0x70,0x38,0x80,0x42,0x01,0x08,0x04,0x20,0x10,0xFF,0xC2,0x01,0x08,0x04,0x20,0x10,0x80,0x42,0x01,0x3E,0x1F, // 'H'
+ 0xF9,0x08,0x42,0x10,0x84,0x21,0x09,0xF0, // 'I'
+ 0xF9,0x08,0x42,0x10,0x84,0x21,0x08,0x42,0x11,0x10, // 'J'
+ 0xF8,0xE2,0x08,0x21,0x02,0x20,0x24,0x03,0x80,0x2C,0x02,0x60,0x23,0x02,0x18,0x20,0xEF,0x87, // 'K'
+ 0xF8,0x08,0x02,0x00,0x80,0x20,0x08,0x02,0x00,0x80,0x20,0x08,0x22,0x09,0xFE, // 'L'
+ 0xF0,0x07,0x38,0x0C,0x38,0x0C,0x2C,0x14,0x2C,0x14,0x26,0x24,0x26,0x24,0x23,0x44,0x23,0x44,0x21,0x84,0x21,0x84,0xF9,0x0F, // 'M'
+ 0xF0,0x3E,0x70,0x10,0xF0,0x21,0x70,0x42,0x60,0x84,0x61,0x08,0x62,0x10,0x64,0x20,0x68,0x40,0xF0,0x80,0xE7,0xC0,0xC0, // 'N'
+ 0x0F,0xC1,0x83,0x10,0x05,0x00,0x38,0x00,0xC0,0x06,0x00,0x30,0x01,0xC0,0x13,0x00,0x8C,0x18,0x1F,0x00, // 'O'
+ 0xFF,0x88,0x32,0x04,0x81,0x20,0x8B,0xC2,0x00,0x80,0x20,0x08,0x02,0x03,0xE0, // 'P'
+ 0x0F,0xC1,0x83,0x10,0x05,0x00,0x38,0x00,0xC0,0x06,0x00,0x30,0x01,0xC0,0x12,0x00,0x8C,0x08,0x3F,0x80,0x70,0x04,0xFC,0x00,0xC0, // 'Q'
+ 0xFF,0x04,0x30,0x82,0x10,0x42,0x10,0x4C,0x0B,0x81,0x30,0x23,0x04,0x30,0x87,0x7C,0x70, // 'R'
+ 0x3E,0x42,0x82,0x80,0x80,0x78,0x06,0x01,0x01,0x81,0x82,0x7C, // 'S'
+ 0xFF,0xC4,0x42,0x01,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x07,0xC0, // 'T'
+ 0xF8,0x7C,0x80,0x42,0x01,0x08,0x04,0x20,0x10,0x80,0x42,0x01,0x08,0x04,0x20,0x10,0x80,0x41,0x06,0x03,0xF0, // 'U'
+ 0xF8,0x76,0x02,0x30,0x23,0x04,0x18,0x41,0x84,0x08,0x80,0xC8,0x05,0x00,0x70,0x06,0x00,0x20, // 'V'
+ 0xF8,0x43,0xB0,0x60,0x88,0x30,0x46,0x2C,0x23,0x16,0x21,0x89,0x10,0x48,0xC8,0x34,0x68,0x1C,0x14,0x0E,0x0E,0x02,0x02,0x01,0x01,0x00, // 'W'
+ 0x70,0x66,0x08,0x62,0x0C,0x80,0xD0,0x0C,0x01,0x80,0x58,0x11,0x82,0x30,0x83,0x20,0x30, // 'X'
+ 0xE0,0x44,0x18,0xC2,0x08,0x80,0xA0,0x14,0x01,0x00,0x20,0x04,0x00,0x80,0x10,0x0F,0x80, // 'Y'
+ 0x7F,0xE8,0x19,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0x60,0x18,0x06,0x05,0x80,0xFF,0xF0, // 'Z'
+ 0xF2,0x49,0x24,0x92,0x49,0x27, // '['
+ 0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x01, // '\'
+ 0xE4,0x92,0x49,0x24,0x92,0x4F, // ']'
+ 0x18,0x0A,0x09,0x04,0x44,0x32,0x0A,0x06, // '^'
+ 0xFF,0x80, // '_'
+ 0x84,0x20, // '`'
+ 0x39,0x98,0x10,0xE6,0x50,0xA3,0x3B, // 'a'
+ 0x00,0xC0,0x40,0x40,0x40,0x5E,0x63,0x41,0x41,0x41,0x42,0x42,0x3C, // 'b'
+ 0x1D,0x98,0x20,0x82,0x04,0x0F, // 'c'
+ 0x00,0x06,0x02,0x02,0x02,0x1E,0x66,0x82,0x82,0x82,0x82,0x82,0x46,0x3B, // 'd'
+ 0x1C,0x62,0x43,0x43,0xFF,0x40,0x40,0x61,0x3E, // 'e'
+ 0x1B,0x10,0x84,0x79,0x08,0x42,0x10,0x8E,0x00, // 'f'
+ 0x1C,0x33,0xD0,0x88,0x46,0x41,0xC1,0x00,0x80,0x7F,0x20,0x60,0x30,0x1C,0x31,0xE0, // 'g'
+ 0x00,0xC0,0x40,0x40,0x40,0x5C,0x66,0x42,0x42,0x42,0x42,0x42,0xE3, // 'h'
+ 0x48,0x2C,0x92,0x49,0x70, // 'i'
+ 0x22,0x03,0x51,0x11,0x11,0x11,0x11,0x12,0xC0, // 'j'
+ 0xC0,0x40,0x40,0x40,0x43,0x44,0x48,0x50,0x70,0x58,0x4C,0x46,0xE3, // 'k'
+ 0xC9,0x24,0x92,0x49,0x2E, // 'l'
+ 0xDC,0xE3,0x38,0x90,0x84,0x84,0x24,0x21,0x21,0x09,0x08,0x5D,0xF3, // 'm'
+ 0xDC,0x66,0x42,0x42,0x42,0x42,0x42,0xE3, // 'n'
+ 0x38,0x8A,0x1C,0x18,0x30,0x70,0xA2,0x38, // 'o'
+ 0xDC,0x62,0x41,0x41,0x41,0x42,0x62,0x7C,0x40,0x40,0x40,0x40,0xE0, // 'p'
+ 0x1C,0x62,0x82,0x82,0x82,0x82,0x82,0x46,0x3A,0x02,0x02,0x02,0x02,0x0F, // 'q'
+ 0x5E,0xD8,0x84,0x21,0x08,0xF0, // 'r'
+ 0x7A,0x28,0x30,0x78,0x10,0x63,0xF0, // 's'
+ 0x44,0x47,0xC4,0x44,0x44,0x70, // 't'
+ 0x42,0xC6,0x42,0x42,0x42,0x42,0x42,0x46,0x3B, // 'u'
+ 0x71,0x88,0x43,0x20,0xC8,0x12,0x07,0x00,0xC0,0x20, // 'v'
+ 0xF1,0x1D,0x84,0x22,0x38,0x88,0xE4,0x34,0x90,0x53,0x81,0x8E,0x06,0x18,0x18,0x40, // 'w'
+ 0xE1,0x19,0x0D,0x03,0x00,0x80,0xE0,0x98,0xC6,0xC3,0x80, // 'x'
+ 0xF3,0xD8,0x42,0x10,0xC8,0x12,0x07,0x01,0xC0,0x30,0x08,0x02,0x01,0x00,0x40,0x60,0x00, // 'y'
+ 0x7F,0x42,0x04,0x0C,0x18,0x30,0x61,0xFF, // 'z'
+ 0x49,0x24,0x92,0x89,0x24,0x92, // '{'
+ 0xFF,0xF8, // '|'
+ 0x89,0x24,0x92,0x29,0x24,0x92 // '}'
+};
+const GFXglyph URW_Palladio_L_Roman_18Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 6, 0, 0 }, // ' '
+ { 1, 2, 12, 6, 2, -12 }, // '!'
+ { 4, 5, 4, 8, 1, -12 }, // '"'
+ { 7, 9, 12, 10, 0, -12 }, // '#'
+ { 21, 7, 15, 10, 1, -13 }, // '$'
+ { 35, 13, 13, 16, 1, -13 }, // '%'
+ { 57, 12, 12, 15, 1, -12 }, // '&'
+ { 75, 2, 4, 5, 1, -12 }, // '''
+ { 76, 4, 17, 7, 1, -13 }, // '('
+ { 85, 4, 17, 7, 0, -13 }, // ')'
+ { 94, 5, 7, 8, 1, -13 }, // '*'
+ { 99, 9, 9, 12, 1, -9 }, // '+'
+ { 110, 4, 5, 6, 0, -2 }, // ','
+ { 113, 6, 1, 7, 0, -5 }, // '-'
+ { 114, 2, 2, 6, 1, -2 }, // '.'
+ { 115, 7, 15, 12, 2, -13 }, // '/'
+ { 129, 7, 13, 10, 1, -13 }, // '0'
+ { 141, 6, 12, 10, 1, -12 }, // '1'
+ { 150, 8, 12, 10, 0, -12 }, // '2'
+ { 162, 7, 12, 10, 0, -12 }, // '3'
+ { 173, 8, 12, 10, 0, -12 }, // '4'
+ { 185, 7, 12, 10, 1, -12 }, // '5'
+ { 196, 7, 12, 10, 1, -12 }, // '6'
+ { 207, 8, 12, 10, 1, -12 }, // '7'
+ { 219, 7, 13, 10, 1, -13 }, // '8'
+ { 231, 8, 13, 10, 0, -13 }, // '9'
+ { 244, 2, 8, 6, 1, -8 }, // ':'
+ { 246, 2, 11, 6, 1, -8 }, // ';'
+ { 249, 9, 9, 12, 1, -9 }, // '<'
+ { 260, 9, 5, 12, 1, -7 }, // '='
+ { 266, 9, 9, 12, 1, -9 }, // '>'
+ { 277, 6, 12, 9, 0, -12 }, // '?'
+ { 286, 13, 12, 14, 0, -12 }, // '@'
+ { 306, 13, 12, 15, 0, -12 }, // 'A'
+ { 326, 9, 12, 12, 0, -12 }, // 'B'
+ { 340, 11, 12, 14, 0, -12 }, // 'C'
+ { 357, 12, 12, 15, 0, -12 }, // 'D'
+ { 375, 9, 12, 12, 0, -12 }, // 'E'
+ { 389, 9, 12, 11, 0, -12 }, // 'F'
+ { 403, 13, 12, 15, 0, -12 }, // 'G'
+ { 423, 14, 12, 16, 0, -12 }, // 'H'
+ { 444, 5, 12, 7, 0, -12 }, // 'I'
+ { 452, 5, 16, 7, 0, -12 }, // 'J'
+ { 462, 12, 12, 14, 0, -12 }, // 'K'
+ { 480, 10, 12, 12, 0, -12 }, // 'L'
+ { 495, 16, 12, 18, 0, -12 }, // 'M'
+ { 519, 15, 12, 16, 0, -12 }, // 'N'
+ { 542, 13, 12, 15, 0, -12 }, // 'O'
+ { 562, 10, 12, 12, 0, -12 }, // 'P'
+ { 577, 13, 15, 15, 0, -12 }, // 'Q'
+ { 602, 11, 12, 13, 0, -12 }, // 'R'
+ { 619, 8, 12, 10, 0, -12 }, // 'S'
+ { 631, 9, 12, 12, 1, -12 }, // 'T'
+ { 645, 14, 12, 15, 0, -12 }, // 'U'
+ { 666, 12, 12, 14, 0, -12 }, // 'V'
+ { 684, 17, 12, 19, 0, -12 }, // 'W'
+ { 710, 11, 12, 13, 0, -12 }, // 'X'
+ { 727, 11, 12, 13, 0, -12 }, // 'Y'
+ { 744, 11, 12, 13, 0, -12 }, // 'Z'
+ { 761, 3, 16, 7, 2, -14 }, // '['
+ { 767, 8, 13, 12, 1, -13 }, // '\'
+ { 780, 3, 16, 7, 1, -14 }, // ']'
+ { 786, 9, 7, 12, 1, -12 }, // '^'
+ { 794, 9, 1, 10, 0, 1 }, // '_'
+ { 796, 4, 3, 7, 1, -12 }, // '`'
+ { 798, 7, 8, 10, 1, -8 }, // 'a'
+ { 805, 8, 13, 11, 0, -13 }, // 'b'
+ { 818, 6, 8, 9, 1, -8 }, // 'c'
+ { 824, 8, 14, 12, 1, -14 }, // 'd'
+ { 838, 8, 9, 10, 0, -9 }, // 'e'
+ { 847, 5, 13, 7, 1, -13 }, // 'f'
+ { 856, 9, 14, 11, 0, -9 }, // 'g'
+ { 872, 8, 13, 11, 1, -13 }, // 'h'
+ { 885, 3, 12, 6, 1, -12 }, // 'i'
+ { 890, 4, 17, 5, -2, -12 }, // 'j'
+ { 899, 8, 13, 11, 1, -13 }, // 'k'
+ { 912, 3, 13, 6, 1, -13 }, // 'l'
+ { 917, 13, 8, 17, 1, -8 }, // 'm'
+ { 930, 8, 8, 11, 1, -8 }, // 'n'
+ { 938, 7, 9, 11, 1, -9 }, // 'o'
+ { 946, 8, 13, 12, 1, -8 }, // 'p'
+ { 959, 8, 14, 11, 1, -9 }, // 'q'
+ { 973, 5, 9, 8, 1, -9 }, // 'r'
+ { 979, 6, 9, 9, 1, -9 }, // 's'
+ { 986, 4, 11, 7, 1, -11 }, // 't'
+ { 992, 8, 9, 12, 1, -9 }, // 'u'
+ { 1001, 10, 8, 11, 0, -8 }, // 'v'
+ { 1011, 14, 9, 16, 0, -9 }, // 'w'
+ { 1027, 9, 9, 10, 0, -9 }, // 'x'
+ { 1038, 10, 13, 11, 0, -8 }, // 'y'
+ { 1055, 8, 8, 10, 0, -8 }, // 'z'
+ { 1063, 3, 16, 7, 1, -13 }, // '{'
+ { 1069, 1, 13, 12, 5, -13 }, // '|'
+ { 1071, 3, 16, 7, 1, -13 } // '}'
+};
+const GFXfont URW_Palladio_L_Roman_18 PROGMEM = {
+(uint8_t *)URW_Palladio_L_Roman_18Bitmaps,(GFXglyph *)URW_Palladio_L_Roman_18Glyphs,0x20, 0x7E, 24};
+
+// 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 URW_Palladio_L_Bold_18Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0x7F,0xB4,0x92,0x0F,0xF0, // '!'
+ 0x67,0xDD,0x9A,0x24,0x48,0x80, // '"'
+ 0x13,0x09,0x84,0x82,0x47,0xF9,0x90,0xD9,0xFE,0x24,0x12,0x09,0x0C,0x80, // '#'
+ 0x10,0x7E,0xD2,0xD2,0xD0,0xF0,0xFE,0x3F,0x17,0x93,0x93,0x96,0xFC,0x10,0x10, // '$'
+ 0x78,0x43,0x31,0x0C,0xC8,0x33,0x20,0xCD,0x01,0xE4,0x00,0x27,0x81,0x33,0x04,0xCC,0x23,0x30,0x8C,0xC4,0x1E, // '%'
+ 0x0E,0x00,0x98,0x0C,0xC0,0x64,0x03,0xC0,0x1C,0x7D,0xF1,0x19,0xC8,0xC7,0x47,0x1C,0x1C,0x7E,0x7C,0xE0, // '&'
+ 0xFF,0xC0, // '''
+ 0x12,0x64,0xCC,0xCC,0xCC,0xC4,0x62,0x10, // '('
+ 0x84,0x62,0x33,0x33,0x33,0x32,0x64,0x80, // ')'
+ 0x1B,0x43,0xF4,0x18, // '*'
+ 0x0C,0x03,0x00,0xC0,0x30,0xFF,0xFF,0xF0,0xC0,0x30,0x0C,0x03,0x00, // '+'
+ 0x07,0x66,0xC8, // ','
+ 0x7F,0xE0, // '-'
+ 0xDF,0x00, // '.'
+ 0x08,0xC6,0x23,0x18,0x84,0x63,0x11,0x8C,0x00, // '/'
+ 0x38,0xDB,0x1E,0x3C,0x78,0xF1,0xE3,0xC7,0x8D,0xB1,0xC0, // '0'
+ 0x19,0xF2,0x60,0xC1,0x83,0x06,0x0C,0x18,0x30,0x63,0xF0, // '1'
+ 0x78,0x7E,0xCE,0x86,0x06,0x04,0x0C,0x18,0x10,0x20,0x7F,0xFF, // '2'
+ 0x3C,0x7E,0x46,0x86,0x04,0x3C,0x3F,0x03,0x03,0x83,0xC6,0xF8, // '3'
+ 0x02,0x07,0x03,0x82,0xC3,0x61,0x31,0x18,0x8C,0x7F,0x83,0x01,0x83,0xF0, // '4'
+ 0x7F,0x7F,0x40,0x40,0x5E,0x7F,0x47,0x03,0x03,0x82,0x46,0x78, // '5'
+ 0x04,0x31,0x82,0x0D,0xDF,0xF3,0xE3,0xC7,0x8D,0x91,0xC0, // '6'
+ 0xFF,0xFE,0x82,0x84,0x04,0x08,0x08,0x10,0x30,0x30,0x60,0x60, // '7'
+ 0x3C,0xCF,0x9F,0x3F,0x47,0x8B,0xA3,0xC7,0x8F,0x93,0xC0, // '8'
+ 0x38,0x9B,0x1E,0x3C,0x7C,0xFF,0xBB,0x0C,0x18,0x63,0x80, // '9'
+ 0xDF,0x01,0xBE, // ':'
+ 0x6D,0x80,0x1B,0x5A,0x00, // ';'
+ 0x00,0x81,0xC3,0xC7,0x8E,0x07,0x01,0xE0,0x1C,0x03,0x80,0x40, // '<'
+ 0xFF,0xFF,0xC0,0x00,0x0F,0xFF,0xFC, // '='
+ 0x00,0x70,0x1E,0x03,0xC0,0x38,0x1C,0x3C,0x70,0xE0,0x40,0x00, // '>'
+ 0x7B,0xF8,0xC3,0x08,0x42,0x08,0x00,0x86,0x18, // '?'
+ 0x0F,0x83,0x04,0x40,0x24,0x69,0x99,0x9B,0x99,0xB1,0x9B,0x32,0x75,0x65,0xDF,0x30,0x60,0xF8, // '@'
+ 0x03,0x00,0x0C,0x00,0x78,0x01,0xE0,0x09,0xC0,0x27,0x01,0x8E,0x07,0xF8,0x10,0x60,0x81,0xC2,0x07,0x3E,0x3F, // 'A'
+ 0xFF,0x0C,0x63,0x18,0xC6,0x33,0x0F,0xE3,0x1C,0xC3,0x30,0xCC,0x33,0x19,0xFC, // 'B'
+ 0x0F,0xC6,0x0D,0x80,0xE0,0x1C,0x01,0x80,0x30,0x06,0x00,0x60,0x0C,0x00,0xE0,0x87,0xE0, // 'C'
+ 0xFF,0xE0,0xC1,0xE3,0x01,0x8C,0x03,0x30,0x0C,0xC0,0x33,0x00,0xCC,0x03,0x30,0x18,0xC0,0x63,0x06,0x1F,0xE0, // 'D'
+ 0xFF,0x8C,0x23,0x00,0xC0,0x31,0x0F,0xC3,0x10,0xC0,0x30,0x0C,0x13,0x05,0xFE, // 'E'
+ 0xFF,0x98,0x4C,0x26,0x03,0x11,0xF8,0xC4,0x62,0x30,0x18,0x0C,0x1F,0x80, // 'F'
+ 0x0F,0xE1,0x81,0x98,0x05,0x80,0x2C,0x00,0x60,0x03,0x00,0x18,0x1F,0x60,0x33,0x01,0x8E,0x0C,0x1F,0x80, // 'G'
+ 0xFC,0xFC,0xC0,0xC3,0x03,0x0C,0x0C,0x30,0x30,0xFF,0xC3,0x03,0x0C,0x0C,0x30,0x30,0xC0,0xC3,0x03,0x3F,0x3F, // 'H'
+ 0xFC,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0x3F, // 'I'
+ 0xFC,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0x82,0x30, // 'J'
+ 0xFC,0x79,0x83,0x0C,0x20,0x62,0x03,0x20,0x1F,0x00,0xDC,0x06,0xF0,0x33,0xC1,0x8F,0x0C,0x3D,0xF8,0xF0, // 'K'
+ 0xFC,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x13,0x05,0xFE, // 'L'
+ 0xF8,0x07,0x9C,0x07,0x0F,0x03,0x85,0x82,0xC2,0xE1,0x61,0x31,0x30,0x9C,0x98,0x46,0x8C,0x23,0xC6,0x10,0xC3,0x08,0x61,0x9F,0x33,0xF0, // 'M'
+ 0xF8,0x3C,0xE0,0x23,0xC0,0x8B,0x82,0x27,0x08,0x9E,0x22,0x3C,0x88,0x7A,0x20,0xF8,0x81,0xE2,0x03,0xBE,0x06, // 'N'
+ 0x0F,0xC1,0x83,0x18,0x0D,0x80,0x7C,0x01,0xE0,0x0F,0x00,0x78,0x03,0xE0,0x1B,0x01,0x8C,0x18,0x3F,0x00, // 'O'
+ 0xFF,0x8C,0x73,0x0C,0xC3,0x31,0x8D,0xC3,0x00,0xC0,0x30,0x0C,0x03,0x03,0xF0, // 'P'
+ 0x0F,0xC1,0x83,0x18,0x0D,0x80,0x7C,0x01,0xE0,0x0F,0x00,0x78,0x03,0xE0,0x1B,0x01,0x8C,0x18,0x3F,0x00,0xF0,0x1F,0xF4,0x01,0xC0, // 'Q'
+ 0xFF,0x83,0x1C,0x30,0xC3,0x0C,0x30,0x83,0x30,0x37,0x03,0x38,0x33,0xC3,0x1C,0x30,0xEF,0xCF, // 'R'
+ 0x3F,0x31,0xB0,0x58,0x0F,0x03,0xF0,0x7E,0x07,0x81,0xC0,0xF0,0xCF,0xC0, // 'S'
+ 0xFF,0xE3,0x18,0xC4,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0xFC, // 'T'
+ 0xFC,0x7C,0xC0,0x43,0x01,0x0C,0x04,0x30,0x10,0xC0,0x43,0x01,0x0C,0x04,0x30,0x10,0xC0,0x41,0x82,0x03,0xF0, // 'U'
+ 0xFC,0x3C,0xE0,0x43,0x81,0x07,0x0C,0x1C,0x20,0x30,0x80,0xE4,0x01,0x90,0x07,0x80,0x1E,0x00,0x30,0x00,0xC0, // 'V'
+ 0xFC,0x43,0xDC,0x18,0x63,0x0E,0x10,0xE3,0xC4,0x39,0xF1,0x0E,0x4C,0x81,0x93,0xA0,0x78,0xE8,0x1E,0x1E,0x07,0x07,0x00,0xC0,0xC0,0x30,0x30, // 'W'
+ 0xF0,0x73,0x84,0x1C,0x81,0xD8,0x0F,0x00,0x60,0x07,0x00,0xB8,0x1B,0x81,0x1C,0x21,0xCE,0x0F, // 'X'
+ 0xF0,0x6E,0x08,0xE3,0x0C,0x40,0xD0,0x1A,0x01,0x80,0x30,0x06,0x00,0xC0,0x18,0x0F,0xC0, // 'Y'
+ 0x7F,0xE8,0x39,0x07,0x01,0xC0,0x70,0x0E,0x03,0x80,0xE0,0x1C,0x07,0x05,0xC0,0xFF,0xF0, // 'Z'
+ 0xFC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xF0, // '['
+ 0x40,0x30,0x08,0x06,0x01,0x00,0xC0,0x20,0x18,0x04,0x03,0x00,0x80,0x60,0x10, // '\'
+ 0xF3,0x33,0x33,0x33,0x33,0x33,0x33,0xF0, // ']'
+ 0x1C,0x0E,0x0D,0x86,0xC6,0x32,0x1B,0x06, // '^'
+ 0xFF,0x80, // '_'
+ 0xC3,0x0C, // '`'
+ 0x78,0x18,0x31,0xEC,0xD9,0xBF,0x37, // 'a'
+ 0xE0,0x30,0x18,0x0D,0xE7,0xF3,0x1D,0x86,0xC3,0x61,0xB0,0x98,0x8F,0x80, // 'b'
+ 0x1C,0xCB,0x16,0x0C,0x18,0x18,0x1E, // 'c'
+ 0x07,0x01,0x80,0xC0,0x61,0xF3,0x3B,0x0D,0x86,0xC3,0x71,0x9F,0xC7,0x70, // 'd'
+ 0x3C,0x8F,0x1F,0xFC,0x18,0x38,0x1F, // 'e'
+ 0x0C,0xF6,0x18,0x63,0xE6,0x18,0x61,0x86,0x18,0xF8, // 'f'
+ 0x3C,0x23,0xF1,0x98,0xCC,0x63,0xC1,0x01,0xFE,0xFF,0xA0,0xF0,0x78,0x3E,0x33,0xE0, // 'g'
+ 0xE0,0x30,0x18,0x0D,0xC7,0xF3,0x19,0x8C,0xC6,0x63,0x31,0x98,0xDE,0x70, // 'h'
+ 0x66,0x60,0x2E,0x66,0x66,0x66,0xF0, // 'i'
+ 0x33,0x30,0x17,0x33,0x33,0x33,0x33,0x33,0x2C, // 'j'
+ 0xE0,0x18,0x06,0x01,0x80,0x63,0x99,0x86,0xC1,0xF0,0x6E,0x1B,0xC6,0x7B,0xCF, // 'k'
+ 0xE6,0x66,0x66,0x66,0x66,0x6F, // 'l'
+ 0x6E,0x73,0xFF,0xE6,0x31,0x98,0xC6,0x63,0x19,0x8C,0x66,0x31,0x98,0xC6,0xF7,0x9C, // 'm'
+ 0x2E,0x7F,0x98,0xCC,0x66,0x33,0x19,0x8C,0xC6,0xF3,0x80, // 'n'
+ 0x3C,0x66,0xC3,0xC3,0xC3,0xC3,0xC3,0x66,0x3C, // 'o'
+ 0x2F,0x7F,0x98,0xEC,0x36,0x1B,0x0D,0x84,0xC4,0x7C,0x30,0x18,0x0C,0x06,0x07,0x80, // 'p'
+ 0x1F,0x33,0xB0,0xD8,0x6C,0x37,0x19,0xFC,0xF6,0x03,0x01,0x80,0xC0,0x60,0x78, // 'q'
+ 0x2F,0xF6,0x58,0x61,0x86,0x18,0xF8, // 'r'
+ 0x7B,0x2C,0x3C,0x7C,0x78,0xE3,0xF8, // 's'
+ 0x23,0x18,0xCF,0xB1,0x8C,0x63,0x1E,0x60, // 't'
+ 0x21,0x73,0x98,0xCC,0x66,0x33,0x19,0x8C,0xFE,0x3B,0x80, // 'u'
+ 0x71,0x8C,0x43,0x10,0xEC,0x1A,0x07,0x81,0xC0,0x30, // 'v'
+ 0xF9,0x9E,0x63,0x18,0xC7,0x21,0x96,0x43,0xAD,0x83,0x9E,0x07,0x1C,0x0C,0x38,0x18,0x20, // 'w'
+ 0xE1,0x99,0x0F,0x03,0x81,0xC0,0xF0,0xD8,0x4E,0xC3,0x80, // 'x'
+ 0xF3,0xB0,0x9C,0x46,0x43,0x21,0xE0,0x70,0x30,0x08,0x04,0x04,0x12,0x0E,0x00, // 'y'
+ 0x7F,0x46,0x0E,0x1C,0x18,0x30,0x71,0xFF, // 'z'
+ 0x18,0xC3,0x0C,0x30,0xC3,0x10,0x30,0xC3,0x0C,0x30,0xC1,0x80, // '{'
+ 0xFF,0xFF,0xFF,0xC0, // '|'
+ 0x60,0xC3,0x0C,0x30,0xC3,0x02,0x30,0xC3,0x0C,0x30,0xC6,0x00 // '}'
+};
+const GFXglyph URW_Palladio_L_Bold_18Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 6, 0, 0 }, // ' '
+ { 1, 3, 12, 6, 1, -12 }, // '!'
+ { 6, 7, 6, 8, 0, -12 }, // '"'
+ { 12, 9, 12, 10, 0, -12 }, // '#'
+ { 26, 8, 15, 10, 1, -13 }, // '$'
+ { 41, 14, 12, 17, 1, -12 }, // '%'
+ { 62, 13, 12, 16, 1, -12 }, // '&'
+ { 82, 2, 6, 5, 1, -12 }, // '''
+ { 84, 4, 15, 7, 1, -13 }, // '('
+ { 92, 4, 15, 7, 1, -13 }, // ')'
+ { 100, 6, 5, 9, 1, -12 }, // '*'
+ { 104, 10, 10, 12, 1, -10 }, // '+'
+ { 117, 4, 6, 6, 0, -3 }, // ','
+ { 120, 6, 2, 7, 0, -6 }, // '-'
+ { 122, 3, 3, 6, 1, -3 }, // '.'
+ { 124, 5, 13, 6, 0, -13 }, // '/'
+ { 133, 7, 12, 10, 1, -12 }, // '0'
+ { 144, 7, 12, 10, 1, -12 }, // '1'
+ { 155, 8, 12, 10, 1, -12 }, // '2'
+ { 167, 8, 12, 10, 0, -12 }, // '3'
+ { 179, 9, 12, 10, 0, -12 }, // '4'
+ { 193, 8, 12, 10, 0, -12 }, // '5'
+ { 205, 7, 12, 10, 1, -12 }, // '6'
+ { 216, 8, 12, 10, 1, -12 }, // '7'
+ { 228, 7, 12, 10, 1, -12 }, // '8'
+ { 239, 7, 12, 10, 1, -12 }, // '9'
+ { 250, 3, 8, 6, 1, -8 }, // ':'
+ { 253, 3, 11, 6, 0, -8 }, // ';'
+ { 258, 9, 10, 12, 1, -10 }, // '<'
+ { 270, 9, 6, 12, 1, -8 }, // '='
+ { 277, 9, 10, 12, 1, -10 }, // '>'
+ { 289, 6, 12, 9, 1, -12 }, // '?'
+ { 298, 12, 12, 14, 1, -12 }, // '@'
+ { 316, 14, 12, 15, 0, -12 }, // 'A'
+ { 337, 10, 12, 13, 0, -12 }, // 'B'
+ { 352, 11, 12, 14, 1, -12 }, // 'C'
+ { 369, 14, 12, 16, 0, -12 }, // 'D'
+ { 390, 10, 12, 12, 0, -12 }, // 'E'
+ { 405, 9, 12, 11, 0, -12 }, // 'F'
+ { 419, 13, 12, 16, 1, -12 }, // 'G'
+ { 439, 14, 12, 16, 0, -12 }, // 'H'
+ { 460, 6, 12, 8, 0, -12 }, // 'I'
+ { 469, 6, 16, 8, 0, -12 }, // 'J'
+ { 481, 13, 12, 15, 0, -12 }, // 'K'
+ { 501, 10, 12, 12, 0, -12 }, // 'L'
+ { 516, 17, 12, 19, 0, -12 }, // 'M'
+ { 542, 14, 12, 16, 0, -12 }, // 'N'
+ { 563, 13, 12, 16, 1, -12 }, // 'O'
+ { 583, 10, 12, 12, 0, -12 }, // 'P'
+ { 598, 13, 15, 16, 1, -12 }, // 'Q'
+ { 623, 12, 12, 14, 0, -12 }, // 'R'
+ { 641, 9, 12, 12, 1, -12 }, // 'S'
+ { 655, 10, 12, 13, 1, -12 }, // 'T'
+ { 670, 14, 12, 15, 0, -12 }, // 'U'
+ { 691, 14, 12, 15, 0, -12 }, // 'V'
+ { 712, 18, 12, 19, 0, -12 }, // 'W'
+ { 739, 12, 12, 13, 0, -12 }, // 'X'
+ { 757, 11, 12, 13, 0, -12 }, // 'Y'
+ { 774, 11, 12, 13, 0, -12 }, // 'Z'
+ { 791, 4, 15, 7, 1, -13 }, // '['
+ { 799, 9, 13, 12, 1, -13 }, // '\'
+ { 814, 4, 15, 7, 1, -13 }, // ']'
+ { 822, 9, 7, 12, 1, -12 }, // '^'
+ { 830, 9, 1, 10, 0, 1 }, // '_'
+ { 832, 5, 3, 7, 0, -12 }, // '`'
+ { 834, 7, 8, 10, 1, -8 }, // 'a'
+ { 841, 9, 12, 12, 1, -12 }, // 'b'
+ { 855, 7, 8, 9, 1, -8 }, // 'c'
+ { 862, 9, 12, 12, 1, -12 }, // 'd'
+ { 876, 7, 8, 10, 1, -8 }, // 'e'
+ { 883, 6, 13, 8, 1, -13 }, // 'f'
+ { 893, 9, 14, 11, 1, -9 }, // 'g'
+ { 909, 9, 12, 12, 1, -12 }, // 'h'
+ { 923, 4, 13, 7, 1, -13 }, // 'i'
+ { 930, 4, 18, 7, 0, -13 }, // 'j'
+ { 939, 10, 12, 12, 1, -12 }, // 'k'
+ { 954, 4, 12, 7, 1, -12 }, // 'l'
+ { 960, 14, 9, 17, 1, -9 }, // 'm'
+ { 976, 9, 9, 12, 1, -9 }, // 'n'
+ { 987, 8, 9, 11, 1, -9 }, // 'o'
+ { 996, 9, 14, 12, 1, -9 }, // 'p'
+ { 1012, 9, 13, 12, 1, -8 }, // 'q'
+ { 1027, 6, 9, 8, 1, -9 }, // 'r'
+ { 1034, 6, 9, 9, 1, -9 }, // 's'
+ { 1041, 5, 12, 7, 1, -12 }, // 't'
+ { 1049, 9, 9, 12, 1, -9 }, // 'u'
+ { 1060, 10, 8, 11, 0, -8 }, // 'v'
+ { 1070, 15, 9, 16, 0, -9 }, // 'w'
+ { 1087, 9, 9, 10, 0, -9 }, // 'x'
+ { 1098, 9, 13, 11, 0, -8 }, // 'y'
+ { 1113, 8, 8, 10, 0, -8 }, // 'z'
+ { 1121, 6, 15, 7, 0, -14 }, // '{'
+ { 1133, 2, 13, 12, 5, -13 }, // '|'
+ { 1137, 6, 15, 7, 0, -14 } // '}'
+};
+const GFXfont URW_Palladio_L_Bold_18 PROGMEM = {
+(uint8_t *)URW_Palladio_L_Bold_18Bitmaps,(GFXglyph *)URW_Palladio_L_Bold_18Glyphs,0x20, 0x7E, 24};
+
+// 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 Lato_Hairline_16Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0x55,0x55,0x07, // '!'
+ 0xB6,0xDA, // '"'
+ 0x12,0x12,0x12,0xFF,0x24,0x24,0x24,0x24,0xFF,0x48,0x48,0x48, // '#'
+ 0x08,0x08,0x1C,0x6A,0x48,0x48,0x48,0x30,0x0E,0x12,0x11,0x12,0xD2,0x3C,0x10,0x10, // '$'
+ 0x60,0x53,0x12,0x22,0x44,0x88,0xA1,0xA8,0x09,0x70,0x51,0x12,0x24,0x44,0x88,0xA0,0xE0, // '%'
+ 0x1C,0x04,0x40,0x88,0x10,0x02,0x00,0x60,0x12,0x24,0x24,0x82,0x90,0x23,0x0A,0x1E,0x30, // '&'
+ 0xF8, // '''
+ 0x25,0x29,0x24,0x92,0x24,0x88, // '('
+ 0x91,0x24,0x49,0x25,0x25,0x20, // ')'
+ 0x27,0x4D,0xD2,0x00, // '*'
+ 0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10, // '+'
+ 0x76, // ','
+ 0xF0, // '-'
+ 0x70, // '.'
+ 0x04,0x20,0x82,0x10,0x42,0x08,0x41,0x04,0x20,0x80, // '/'
+ 0x18,0x66,0x82,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x42,0x3C, // '0'
+ 0x10,0xC5,0x24,0x10,0x41,0x04,0x10,0x41,0x3F, // '1'
+ 0x18,0x66,0x42,0x81,0x02,0x02,0x04,0x08,0x10,0x20,0x40,0xFF, // '2'
+ 0x18,0x66,0x42,0x82,0x02,0x06,0x1E,0x02,0x01,0x81,0x42,0x3C, // '3'
+ 0x02,0x01,0x01,0x81,0x41,0x21,0x10,0x88,0x84,0xFF,0x81,0x00,0x80,0x40, // '4'
+ 0x3E,0x41,0x02,0x04,0x0F,0x80,0x81,0x02,0x06,0x0B,0xE0, // '5'
+ 0x04,0x08,0x08,0x10,0x20,0x7E,0x42,0x81,0x81,0x81,0x42,0x3C, // '6'
+ 0xFF,0x01,0x02,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x60, // '7'
+ 0x18,0x66,0x42,0x82,0x42,0x66,0x7E,0x82,0x81,0x81,0x42,0x3C, // '8'
+ 0x18,0x66,0x82,0x81,0x83,0x66,0x1E,0x04,0x08,0x18,0x10,0x20, // '9'
+ 0x70,0x01,0xC0, // ':'
+ 0x70,0x01,0xD8, // ';'
+ 0x06,0x30,0x86,0x03,0x01,0x80,0x80, // '<'
+ 0xFF,0x00,0xFF, // '='
+ 0xC0,0xC0,0x81,0x19,0x88,0x00, // '>'
+ 0x74,0x42,0x10,0x88,0x84,0x00,0x08,0xC0, // '?'
+ 0x1F,0x82,0x06,0x40,0x24,0x79,0x88,0x99,0x11,0x91,0x19,0x12,0x93,0x24,0xCC,0x20,0x01,0x8E,0x07,0x00, // '@'
+ 0x04,0x00,0x80,0x28,0x05,0x01,0x20,0x22,0x04,0x41,0x04,0x3F,0x88,0x09,0x01,0x40,0x30, // 'A'
+ 0xF9,0x0A,0x0C,0x18,0x30,0xBF,0x41,0x83,0x06,0x0F,0xE0, // 'B'
+ 0x0E,0x0C,0x74,0x01,0x00,0x80,0x20,0x08,0x02,0x00,0x80,0x10,0x02,0x0C,0x7C, // 'C'
+ 0xFC,0x20,0xC8,0x0A,0x02,0x80,0x60,0x18,0x06,0x01,0x80,0xA0,0x28,0x13,0xF8, // 'D'
+ 0xFF,0x02,0x04,0x08,0x10,0x3F,0x40,0x81,0x02,0x07,0xF0, // 'E'
+ 0xFF,0x02,0x04,0x08,0x10,0x3F,0x40,0x81,0x02,0x04,0x00, // 'F'
+ 0x0F,0x0C,0x34,0x01,0x00,0x80,0x20,0x08,0x02,0x07,0x80,0x50,0x12,0x04,0x7E, // 'G'
+ 0x80,0xC0,0x60,0x30,0x18,0x0C,0x07,0xFF,0x01,0x80,0xC0,0x60,0x30,0x10, // 'H'
+ 0xFF,0xF0, // 'I'
+ 0x08,0x42,0x10,0x84,0x21,0x08,0x43,0xE0, // 'J'
+ 0x81,0x41,0x21,0x11,0x09,0x05,0x03,0x81,0x20,0x88,0x42,0x20,0x90,0x30, // 'K'
+ 0x82,0x08,0x20,0x82,0x08,0x20,0x82,0x08,0x3F, // 'L'
+ 0x80,0x30,0x07,0x01,0xD0,0x5A,0x0B,0x22,0x64,0x4C,0x51,0x8A,0x30,0x86,0x00,0xC0,0x10, // 'M'
+ 0x80,0xC0,0x70,0x34,0x19,0x0C,0x86,0x23,0x09,0x84,0xC1,0x60,0x70,0x10, // 'N'
+ 0x0E,0x06,0x31,0x01,0x20,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x28,0x08,0x82,0x0F,0x80, // 'O'
+ 0xF1,0x1A,0x0C,0x18,0x30,0xA3,0x78,0x81,0x02,0x04,0x00, // 'P'
+ 0x0E,0x03,0x18,0x40,0x44,0x02,0x80,0x28,0x02,0x80,0x28,0x02,0x80,0x24,0x04,0x20,0xC1,0xF8,0x00,0x40,0x02,0x00,0x30, // 'Q'
+ 0xF8,0x84,0x82,0x82,0x82,0x8C,0xF0,0x90,0x88,0x84,0x82,0x81, // 'R'
+ 0x38,0x8E,0x04,0x04,0x06,0x03,0x01,0x02,0x06,0x1B,0xC0, // 'S'
+ 0xFF,0xC2,0x00,0x80,0x20,0x08,0x02,0x00,0x80,0x20,0x08,0x02,0x00,0x80,0x20, // 'T'
+ 0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x42,0x3C, // 'U'
+ 0x80,0x28,0x09,0x01,0x20,0x42,0x08,0x41,0x04,0x40,0x88,0x0A,0x01,0x40,0x30,0x02,0x00, // 'V'
+ 0x80,0x81,0x40,0x81,0x41,0x81,0x41,0x42,0x22,0x42,0x22,0x22,0x22,0x24,0x14,0x24,0x14,0x14,0x14,0x18,0x08,0x18,0x08,0x08, // 'W'
+ 0x80,0x50,0x22,0x10,0x44,0x12,0x03,0x00,0xC0,0x28,0x11,0x08,0x44,0x0B,0x01, // 'X'
+ 0x80,0x50,0x24,0x10,0x84,0x12,0x05,0x00,0xC0,0x20,0x08,0x02,0x00,0x80,0x20, // 'Y'
+ 0xFF,0x01,0x02,0x06,0x04,0x08,0x10,0x10,0x20,0x40,0x80,0xFF, // 'Z'
+ 0xF2,0x49,0x24,0x92,0x49,0x38, // '['
+ 0x82,0x08,0x10,0x40,0x82,0x04,0x10,0x40,0x82,0x04, // '\'
+ 0xE4,0x92,0x49,0x24,0x92,0x78, // ']'
+ 0x10,0x30,0x61,0x24,0x58,0x40, // '^'
+ 0xFE, // '_'
+ 0x89,0x80, // '`'
+ 0x33,0x20,0x41,0x7E,0x18,0x63,0x74, // 'a'
+ 0x81,0x02,0x04,0xCE,0x78,0x60,0xC1,0x83,0x07,0x0D,0xE0, // 'b'
+ 0x38,0x8A,0x04,0x08,0x10,0x20,0x23,0x3C, // 'c'
+ 0x02,0x04,0x09,0xD4,0x70,0x60,0xC1,0x83,0x05,0x19,0xD0, // 'd'
+ 0x38,0x8A,0x0C,0x1F,0xF0,0x20,0x21,0x3C, // 'e'
+ 0x1C,0x82,0x3F,0x20,0x82,0x08,0x20,0x82,0x08, // 'f'
+ 0x3E,0x8A,0x14,0x24,0xCE,0x20,0x20,0xFF,0x06,0x0B,0xE0, // 'g'
+ 0x81,0x02,0x04,0xCE,0x58,0x60,0xC1,0x83,0x06,0x0C,0x10, // 'h'
+ 0xB2,0xAA,0xAA, // 'i'
+ 0x23,0x02,0x22,0x22,0x22,0x22,0x22,0xE0, // 'j'
+ 0x81,0x02,0x04,0x38,0x92,0x28,0x70,0xB1,0x32,0x34,0x30, // 'k'
+ 0xAA,0xAA,0xAA, // 'l'
+ 0x91,0x9D,0xCA,0x10,0xC2,0x18,0x43,0x08,0x61,0x0C,0x21,0x84,0x20, // 'm'
+ 0x99,0xCB,0x0C,0x18,0x30,0x60,0xC1,0x82, // 'n'
+ 0x38,0x8A,0x0C,0x18,0x30,0x60,0xA1,0x3C, // 'o'
+ 0x99,0xCF,0x0C,0x18,0x30,0x60,0xE1,0xFD,0x02,0x04,0x00, // 'p'
+ 0x3A,0x8E,0x0C,0x18,0x30,0x60,0xA3,0x3A,0x04,0x08,0x10, // 'q'
+ 0x9F,0x31,0x08,0x42,0x10,0x80, // 'r'
+ 0x36,0x61,0x07,0x04,0x31,0x70, // 's'
+ 0x42,0x11,0xE4,0x21,0x08,0x42,0x12,0xE0, // 't'
+ 0x83,0x06,0x0C,0x18,0x30,0x60,0xA3,0x3A, // 'u'
+ 0x81,0x41,0x42,0x22,0x24,0x24,0x14,0x18,0x08, // 'v'
+ 0x82,0x14,0x21,0x46,0x14,0x52,0x25,0x22,0x92,0x28,0xC1,0x0C,0x10,0x80, // 'w'
+ 0x82,0x42,0x24,0x28,0x10,0x18,0x24,0x42,0xC3, // 'x'
+ 0x81,0x41,0x42,0x22,0x22,0x24,0x14,0x18,0x08,0x10,0x10,0x30, // 'y'
+ 0xFC,0x10,0x84,0x20,0x84,0x20,0xFC, // 'z'
+ 0x74,0x44,0x44,0x4C,0x44,0x44,0x44,0x30, // '{'
+ 0xFF,0xFF, // '|'
+ 0xC2,0x22,0x44,0x43,0x44,0x22,0x24,0x80 // '}'
+};
+const GFXglyph Lato_Hairline_16Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 7, 0, 0 }, // ' '
+ { 1, 2, 12, 6, 1, -12 }, // '!'
+ { 4, 3, 5, 7, 1, -12 }, // '"'
+ { 6, 8, 12, 11, 1, -12 }, // '#'
+ { 18, 8, 16, 11, 1, -14 }, // '$'
+ { 34, 11, 12, 14, 1, -12 }, // '%'
+ { 51, 11, 12, 13, 1, -12 }, // '&'
+ { 68, 1, 5, 5, 1, -12 }, // '''
+ { 69, 3, 15, 6, 1, -13 }, // '('
+ { 75, 3, 15, 6, 1, -13 }, // ')'
+ { 81, 5, 5, 9, 1, -12 }, // '*'
+ { 85, 8, 8, 11, 1, -10 }, // '+'
+ { 93, 2, 4, 5, 1, -2 }, // ','
+ { 94, 4, 1, 8, 1, -5 }, // '-'
+ { 95, 2, 2, 6, 1, -2 }, // '.'
+ { 96, 6, 13, 9, 1, -12 }, // '/'
+ { 106, 8, 12, 11, 1, -12 }, // '0'
+ { 118, 6, 12, 11, 2, -12 }, // '1'
+ { 127, 8, 12, 11, 1, -12 }, // '2'
+ { 139, 8, 12, 11, 1, -12 }, // '3'
+ { 151, 9, 12, 11, 0, -12 }, // '4'
+ { 165, 7, 12, 11, 1, -12 }, // '5'
+ { 176, 8, 12, 11, 1, -12 }, // '6'
+ { 188, 8, 12, 11, 1, -12 }, // '7'
+ { 200, 8, 12, 11, 1, -12 }, // '8'
+ { 212, 8, 12, 11, 1, -12 }, // '9'
+ { 224, 2, 9, 6, 1, -9 }, // ':'
+ { 227, 2, 11, 6, 1, -9 }, // ';'
+ { 230, 7, 7, 11, 1, -9 }, // '<'
+ { 237, 8, 3, 11, 1, -7 }, // '='
+ { 240, 6, 7, 11, 2, -9 }, // '>'
+ { 246, 5, 12, 9, 1, -12 }, // '?'
+ { 254, 12, 13, 15, 1, -11 }, // '@'
+ { 274, 11, 12, 12, 0, -12 }, // 'A'
+ { 291, 7, 12, 12, 2, -12 }, // 'B'
+ { 302, 10, 12, 13, 1, -12 }, // 'C'
+ { 317, 10, 12, 14, 2, -12 }, // 'D'
+ { 332, 7, 12, 11, 2, -12 }, // 'E'
+ { 343, 7, 12, 11, 2, -12 }, // 'F'
+ { 354, 10, 12, 14, 1, -12 }, // 'G'
+ { 369, 9, 12, 14, 2, -12 }, // 'H'
+ { 383, 1, 12, 6, 2, -12 }, // 'I'
+ { 385, 5, 12, 9, 0, -12 }, // 'J'
+ { 393, 9, 12, 12, 2, -12 }, // 'K'
+ { 407, 6, 12, 10, 2, -12 }, // 'L'
+ { 416, 11, 12, 16, 2, -12 }, // 'M'
+ { 433, 9, 12, 14, 2, -12 }, // 'N'
+ { 447, 11, 12, 15, 1, -12 }, // 'O'
+ { 464, 7, 12, 11, 2, -12 }, // 'P'
+ { 475, 12, 15, 15, 1, -12 }, // 'Q'
+ { 498, 8, 12, 11, 2, -12 }, // 'R'
+ { 510, 7, 12, 10, 1, -12 }, // 'S'
+ { 521, 10, 12, 11, 0, -12 }, // 'T'
+ { 536, 8, 12, 14, 2, -12 }, // 'U'
+ { 548, 11, 12, 12, 0, -12 }, // 'V'
+ { 565, 16, 12, 18, 0, -12 }, // 'W'
+ { 589, 10, 12, 12, 0, -12 }, // 'X'
+ { 604, 10, 12, 11, 0, -12 }, // 'Y'
+ { 619, 8, 12, 12, 1, -12 }, // 'Z'
+ { 631, 3, 15, 7, 2, -13 }, // '['
+ { 637, 6, 13, 9, 1, -12 }, // '\'
+ { 647, 3, 15, 7, 1, -13 }, // ']'
+ { 653, 7, 6, 11, 1, -12 }, // '^'
+ { 659, 7, 1, 9, 0, 1 }, // '_'
+ { 660, 3, 3, 8, 2, -12 }, // '`'
+ { 662, 6, 9, 10, 1, -9 }, // 'a'
+ { 669, 7, 12, 11, 1, -12 }, // 'b'
+ { 680, 7, 9, 9, 1, -9 }, // 'c'
+ { 688, 7, 12, 11, 1, -12 }, // 'd'
+ { 699, 7, 9, 10, 1, -9 }, // 'e'
+ { 707, 6, 12, 7, 0, -12 }, // 'f'
+ { 716, 7, 12, 10, 1, -9 }, // 'g'
+ { 727, 7, 12, 11, 1, -12 }, // 'h'
+ { 738, 2, 12, 5, 1, -12 }, // 'i'
+ { 741, 4, 15, 5, -1, -12 }, // 'j'
+ { 749, 7, 12, 9, 1, -12 }, // 'k'
+ { 760, 2, 12, 5, 1, -12 }, // 'l'
+ { 763, 11, 9, 15, 1, -9 }, // 'm'
+ { 776, 7, 9, 11, 1, -9 }, // 'n'
+ { 784, 7, 9, 11, 1, -9 }, // 'o'
+ { 792, 7, 12, 11, 1, -9 }, // 'p'
+ { 803, 7, 12, 11, 1, -9 }, // 'q'
+ { 814, 5, 9, 8, 1, -9 }, // 'r'
+ { 820, 5, 9, 9, 1, -9 }, // 's'
+ { 826, 5, 12, 7, 1, -12 }, // 't'
+ { 834, 7, 9, 11, 1, -9 }, // 'u'
+ { 842, 8, 9, 10, 0, -9 }, // 'v'
+ { 851, 12, 9, 14, 0, -9 }, // 'w'
+ { 865, 8, 9, 9, 0, -9 }, // 'x'
+ { 874, 8, 12, 10, 0, -9 }, // 'y'
+ { 886, 6, 9, 9, 1, -9 }, // 'z'
+ { 893, 4, 15, 7, 1, -13 }, // '{'
+ { 901, 1, 16, 6, 2, -13 }, // '|'
+ { 903, 4, 15, 7, 1, -13 } // '}'
+};
+const GFXfont Lato_Hairline_16 PROGMEM = {
+(uint8_t *)Lato_Hairline_16Bitmaps,(GFXglyph *)Lato_Hairline_16Glyphs,0x20, 0x7E, 20};
+
+
+
+const uint8_t sourcesans8pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0x60, 0x99, 0x99, 0x12, 0x12, 0x3F, 0x24, 0x24, 0x24, 0xFC,
+ 0x24, 0x48, 0x48, 0x10, 0x47, 0xB1, 0x83, 0x07, 0x06, 0x04, 0x18, 0x5E,
+ 0x10, 0x60, 0x89, 0x10, 0x91, 0x09, 0x20, 0x92, 0xE9, 0x5B, 0x69, 0x10,
+ 0x91, 0x11, 0x11, 0x11, 0x20, 0xE0, 0x30, 0x48, 0x48, 0x58, 0x70, 0x61,
+ 0xF3, 0x9A, 0x8E, 0xCE, 0x79, 0xF0, 0x09, 0x29, 0x24, 0x92, 0x24, 0x88,
+ 0x09, 0x22, 0x49, 0x24, 0xA4, 0xA0, 0x25, 0x5C, 0xE5, 0x00, 0x21, 0x09,
+ 0xF2, 0x10, 0x80, 0xD8, 0xE0, 0xC0, 0x00, 0x44, 0x21, 0x08, 0x84, 0x22,
+ 0x10, 0x84, 0x42, 0x00, 0x79, 0x28, 0x61, 0x86, 0x18, 0x61, 0x49, 0xE0,
+ 0xE1, 0x08, 0x42, 0x10, 0x84, 0x27, 0xC0, 0x79, 0x98, 0x10, 0x20, 0xC1,
+ 0x04, 0x10, 0x41, 0xFC, 0x79, 0x10, 0x43, 0x30, 0x30, 0x41, 0x8D, 0xE0,
+ 0x18, 0x62, 0x8A, 0x4A, 0x2F, 0xC2, 0x08, 0x20, 0x7E, 0x08, 0x20, 0xF8,
+ 0x30, 0x41, 0x8D, 0xE0, 0x39, 0x0C, 0x20, 0xBB, 0x18, 0x61, 0x4C, 0xE0,
+ 0xFC, 0x20, 0x84, 0x10, 0x42, 0x08, 0x20, 0x80, 0x39, 0x14, 0x51, 0x39,
+ 0x28, 0x61, 0xC5, 0xE0, 0x73, 0x28, 0x61, 0x8D, 0xD0, 0x43, 0x09, 0xC0,
+ 0xC3, 0xC1, 0xC0, 0x00, 0x37, 0x20, 0xE0, 0x70, 0x40, 0xFC, 0x00, 0x00,
+ 0xFC, 0x03, 0x03, 0x81, 0x1F, 0x88, 0x00, 0x74, 0x42, 0x11, 0x10, 0x84,
+ 0x01, 0x08, 0x0F, 0x83, 0x06, 0x60, 0x24, 0x71, 0x89, 0x19, 0x11, 0x91,
+ 0x19, 0x32, 0x8D, 0xC4, 0x00, 0x60, 0x01, 0xF0, 0x18, 0x18, 0x1C, 0x24,
+ 0x24, 0x24, 0x66, 0x7E, 0x42, 0xC3, 0x81, 0xF9, 0x1A, 0x14, 0x28, 0xDF,
+ 0x21, 0xC1, 0x83, 0x0F, 0xF0, 0x3C, 0xC7, 0x04, 0x08, 0x10, 0x20, 0x40,
+ 0xC0, 0xC4, 0xF0, 0xF8, 0x86, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82,
+ 0x86, 0xF8, 0xFE, 0x08, 0x20, 0x83, 0xE8, 0x20, 0x82, 0x0F, 0xC0, 0xFE,
+ 0x08, 0x20, 0x83, 0xE8, 0x20, 0x82, 0x08, 0x00, 0x1E, 0x61, 0x40, 0x80,
+ 0x80, 0x87, 0x81, 0x81, 0x41, 0x61, 0x1E, 0x81, 0x81, 0x81, 0x81, 0x81,
+ 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xE0, 0x08, 0x42, 0x10, 0x84,
+ 0x21, 0x0C, 0x5C, 0x87, 0x1A, 0x64, 0x8B, 0x1E, 0x36, 0x44, 0x85, 0x0E,
+ 0x08, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x3E, 0xC1, 0xE0, 0xF0, 0x74,
+ 0x5A, 0x2D, 0x16, 0x53, 0x29, 0x88, 0xC4, 0x60, 0x20, 0x81, 0xC1, 0xE1,
+ 0xA1, 0x91, 0x99, 0x89, 0x85, 0x87, 0x83, 0x81, 0x3C, 0x42, 0x42, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x42, 0x42, 0x3C, 0xFD, 0x0E, 0x0C, 0x18, 0x7F,
+ 0x20, 0x40, 0x81, 0x02, 0x00, 0x3C, 0x42, 0x42, 0x81, 0x81, 0x81, 0x81,
+ 0x81, 0xC3, 0x42, 0x3C, 0x18, 0x0C, 0x07, 0xFC, 0x86, 0x82, 0x82, 0x86,
+ 0xFC, 0x88, 0x8C, 0x84, 0x86, 0x82, 0x3E, 0x63, 0x40, 0x40, 0x30, 0x1E,
+ 0x07, 0x01, 0x01, 0xC3, 0x3C, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08,
+ 0x10, 0x20, 0x40, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+ 0x42, 0x3C, 0x81, 0x81, 0x42, 0x42, 0x42, 0x24, 0x24, 0x24, 0x38, 0x18,
+ 0x18, 0x86, 0x18, 0x61, 0x86, 0x14, 0xD2, 0x4D, 0x24, 0x92, 0x49, 0x25,
+ 0x8A, 0x38, 0xC3, 0x0C, 0x30, 0xC0, 0x43, 0x62, 0x24, 0x34, 0x18, 0x18,
+ 0x1C, 0x24, 0x26, 0x42, 0x43, 0x82, 0x89, 0x13, 0x62, 0x85, 0x04, 0x08,
+ 0x10, 0x20, 0x40, 0xFE, 0x08, 0x30, 0x41, 0x82, 0x08, 0x30, 0x41, 0x83,
+ 0xF8, 0xF2, 0x49, 0x24, 0x92, 0x49, 0xC0, 0x81, 0x04, 0x10, 0x20, 0x82,
+ 0x04, 0x10, 0x20, 0x82, 0x04, 0x00, 0xE4, 0x92, 0x49, 0x24, 0x93, 0xC0,
+ 0x30, 0xC3, 0x12, 0x4A, 0x30, 0xFF, 0xCC, 0x78, 0x10, 0x4F, 0xC6, 0x18,
+ 0xDD, 0x81, 0x02, 0x05, 0xEC, 0x50, 0x60, 0xC1, 0x83, 0x8A, 0xE0, 0x79,
+ 0x08, 0x20, 0x82, 0x04, 0x1E, 0x04, 0x10, 0x5F, 0x46, 0x18, 0x61, 0x87,
+ 0x37, 0x40, 0x39, 0x38, 0x7F, 0x82, 0x04, 0x0E, 0x34, 0x44, 0xE4, 0x44,
+ 0x44, 0x44, 0x7F, 0x9A, 0x14, 0x2C, 0xCF, 0x20, 0x3E, 0x83, 0x07, 0x13,
+ 0xC0, 0x82, 0x08, 0x2E, 0xC6, 0x18, 0x61, 0x86, 0x18, 0x40, 0xBF, 0xC0,
+ 0x20, 0x92, 0x49, 0x24, 0x9E, 0x82, 0x08, 0x22, 0x9A, 0xCA, 0x34, 0x9A,
+ 0x28, 0xC0, 0xAA, 0xAA, 0xAC, 0xB9, 0xD8, 0xC6, 0x10, 0xC2, 0x18, 0x43,
+ 0x08, 0x61, 0x0C, 0x21, 0xBB, 0x18, 0x61, 0x86, 0x18, 0x61, 0x38, 0x8A,
+ 0x0C, 0x18, 0x30, 0x51, 0x1C, 0xBD, 0x8A, 0x0C, 0x18, 0x30, 0x71, 0x5C,
+ 0x81, 0x02, 0x00, 0x7D, 0x18, 0x61, 0x86, 0x1C, 0xDD, 0x04, 0x10, 0x40,
+ 0xBC, 0x88, 0x88, 0x88, 0x74, 0x20, 0xC3, 0x86, 0x3E, 0x44, 0xF4, 0x44,
+ 0x44, 0x43, 0x86, 0x18, 0x61, 0x86, 0x18, 0xDD, 0xC2, 0x8D, 0x13, 0x22,
+ 0x45, 0x0E, 0x0C, 0x86, 0x30, 0xC5, 0x29, 0x25, 0x24, 0x94, 0x52, 0x8A,
+ 0x61, 0x8C, 0x44, 0xC8, 0xA0, 0xC3, 0x85, 0x11, 0x23, 0xC2, 0x89, 0x11,
+ 0x22, 0x87, 0x06, 0x08, 0x10, 0x61, 0x80, 0x7C, 0x30, 0x84, 0x30, 0x84,
+ 0x3F, 0x69, 0x24, 0x94, 0x49, 0x24, 0xC0, 0xFF, 0xFF, 0xC9, 0x24, 0x91,
+ 0x49, 0x25, 0x80, 0xE0, 0x70 };
+
+const GFXglyph sourcesans8pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 3, 0, 0 }, // 0x20 ' '
+ { 1, 1, 11, 5, 1, -10 }, // 0x21 '!'
+ { 3, 4, 4, 7, 1, -10 }, // 0x22 '"'
+ { 5, 8, 10, 8, 0, -9 }, // 0x23 '#'
+ { 15, 6, 13, 8, 1, -11 }, // 0x24 '$'
+ { 25, 12, 11, 13, 1, -10 }, // 0x25 '%'
+ { 42, 8, 11, 10, 1, -10 }, // 0x26 '&'
+ { 53, 1, 4, 4, 1, -10 }, // 0x27 '''
+ { 54, 3, 15, 5, 1, -11 }, // 0x28 '('
+ { 60, 3, 15, 5, 0, -11 }, // 0x29 ')'
+ { 66, 5, 5, 7, 1, -11 }, // 0x2A '*'
+ { 70, 5, 7, 8, 1, -8 }, // 0x2B '+'
+ { 75, 2, 4, 4, 1, 0 }, // 0x2C ','
+ { 76, 3, 1, 5, 1, -4 }, // 0x2D '-'
+ { 77, 1, 2, 4, 1, -1 }, // 0x2E '.'
+ { 78, 5, 15, 6, 0, -11 }, // 0x2F '/'
+ { 88, 6, 10, 8, 1, -9 }, // 0x30 '0'
+ { 96, 5, 10, 8, 2, -9 }, // 0x31 '1'
+ { 103, 7, 10, 8, 0, -9 }, // 0x32 '2'
+ { 112, 6, 10, 8, 1, -9 }, // 0x33 '3'
+ { 120, 6, 10, 8, 1, -9 }, // 0x34 '4'
+ { 128, 6, 10, 8, 1, -9 }, // 0x35 '5'
+ { 136, 6, 10, 8, 1, -9 }, // 0x36 '6'
+ { 144, 6, 10, 8, 1, -9 }, // 0x37 '7'
+ { 152, 6, 10, 8, 1, -9 }, // 0x38 '8'
+ { 160, 6, 10, 8, 1, -9 }, // 0x39 '9'
+ { 168, 1, 8, 4, 1, -7 }, // 0x3A ':'
+ { 169, 1, 11, 4, 1, -7 }, // 0x3B ';'
+ { 171, 6, 7, 8, 1, -8 }, // 0x3C '<'
+ { 177, 6, 5, 8, 1, -7 }, // 0x3D '='
+ { 181, 6, 7, 8, 1, -8 }, // 0x3E '>'
+ { 187, 5, 11, 7, 1, -10 }, // 0x3F '?'
+ { 194, 12, 12, 14, 1, -9 }, // 0x40 '@'
+ { 212, 8, 11, 9, 0, -10 }, // 0x41 'A'
+ { 223, 7, 11, 9, 1, -10 }, // 0x42 'B'
+ { 233, 7, 11, 9, 1, -10 }, // 0x43 'C'
+ { 243, 8, 11, 10, 1, -10 }, // 0x44 'D'
+ { 254, 6, 11, 8, 1, -10 }, // 0x45 'E'
+ { 263, 6, 11, 8, 1, -10 }, // 0x46 'F'
+ { 272, 8, 11, 10, 1, -10 }, // 0x47 'G'
+ { 283, 8, 11, 10, 1, -10 }, // 0x48 'H'
+ { 294, 1, 11, 4, 1, -10 }, // 0x49 'I'
+ { 296, 5, 11, 8, 1, -10 }, // 0x4A 'J'
+ { 303, 7, 11, 9, 1, -10 }, // 0x4B 'K'
+ { 313, 5, 11, 8, 1, -10 }, // 0x4C 'L'
+ { 320, 9, 11, 12, 1, -10 }, // 0x4D 'M'
+ { 333, 8, 11, 10, 1, -10 }, // 0x4E 'N'
+ { 344, 8, 11, 11, 1, -10 }, // 0x4F 'O'
+ { 355, 7, 11, 9, 1, -10 }, // 0x50 'P'
+ { 365, 8, 14, 11, 1, -10 }, // 0x51 'Q'
+ { 379, 8, 11, 9, 1, -10 }, // 0x52 'R'
+ { 390, 8, 11, 9, 0, -10 }, // 0x53 'S'
+ { 401, 7, 11, 9, 1, -10 }, // 0x54 'T'
+ { 411, 8, 11, 10, 1, -10 }, // 0x55 'U'
+ { 422, 8, 11, 8, 0, -10 }, // 0x56 'V'
+ { 433, 12, 11, 13, 0, -10 }, // 0x57 'W'
+ { 450, 8, 11, 8, 0, -10 }, // 0x58 'X'
+ { 461, 7, 11, 8, 0, -10 }, // 0x59 'Y'
+ { 471, 7, 11, 9, 1, -10 }, // 0x5A 'Z'
+ { 481, 3, 14, 5, 2, -11 }, // 0x5B '['
+ { 487, 6, 14, 6, 0, -10 }, // 0x5C '\'
+ { 498, 3, 14, 5, 1, -11 }, // 0x5D ']'
+ { 504, 6, 6, 8, 1, -10 }, // 0x5E '^'
+ { 509, 8, 1, 8, 0, 2 }, // 0x5F '_'
+ { 510, 3, 2, 9, 3, -10 }, // 0x60 '`'
+ { 511, 6, 8, 8, 1, -7 }, // 0x61 'a'
+ { 517, 7, 11, 9, 1, -10 }, // 0x62 'b'
+ { 527, 6, 8, 7, 1, -7 }, // 0x63 'c'
+ { 533, 6, 11, 9, 1, -10 }, // 0x64 'd'
+ { 542, 6, 8, 8, 1, -7 }, // 0x65 'e'
+ { 548, 4, 12, 5, 1, -11 }, // 0x66 'f'
+ { 554, 7, 12, 8, 1, -7 }, // 0x67 'g'
+ { 565, 6, 11, 9, 1, -10 }, // 0x68 'h'
+ { 574, 1, 10, 4, 1, -9 }, // 0x69 'i'
+ { 576, 3, 13, 4, -1, -9 }, // 0x6A 'j'
+ { 581, 6, 11, 8, 1, -10 }, // 0x6B 'k'
+ { 590, 2, 11, 4, 1, -10 }, // 0x6C 'l'
+ { 593, 11, 8, 13, 1, -7 }, // 0x6D 'm'
+ { 604, 6, 8, 9, 1, -7 }, // 0x6E 'n'
+ { 610, 7, 8, 9, 1, -7 }, // 0x6F 'o'
+ { 617, 7, 11, 9, 1, -7 }, // 0x70 'p'
+ { 627, 6, 11, 9, 1, -7 }, // 0x71 'q'
+ { 636, 4, 8, 6, 1, -7 }, // 0x72 'r'
+ { 640, 5, 8, 7, 1, -7 }, // 0x73 's'
+ { 645, 4, 10, 5, 1, -9 }, // 0x74 't'
+ { 650, 6, 8, 9, 1, -7 }, // 0x75 'u'
+ { 656, 7, 8, 7, 0, -7 }, // 0x76 'v'
+ { 663, 11, 8, 11, 0, -7 }, // 0x77 'w'
+ { 674, 7, 8, 7, 0, -7 }, // 0x78 'x'
+ { 681, 7, 11, 7, 0, -7 }, // 0x79 'y'
+ { 691, 6, 8, 7, 0, -7 }, // 0x7A 'z'
+ { 697, 3, 14, 5, 1, -11 }, // 0x7B '{'
+ { 703, 1, 16, 4, 1, -11 }, // 0x7C '|'
+ { 705, 3, 14, 5, 1, -11 }, // 0x7D '}'
+ { 711, 6, 2, 8, 1, -5 } }; // 0x7E '~'
+
+const GFXfont sourcesans8pt7b PROGMEM = {
+ (uint8_t *)sourcesans8pt7bBitmaps,
+ (GFXglyph *)sourcesans8pt7bGlyphs,
+ 0x20, 0x7E, 21 };
+
+
+const uint8_t sourcesans10pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xCF, 0xC0, 0xDE, 0xF7, 0xBD, 0x80, 0x22, 0x22, 0xFF,
+ 0xFF, 0x22, 0x22, 0xFF, 0xFF, 0x44, 0x44, 0x44, 0x44, 0x30, 0x61, 0xF6,
+ 0x2C, 0x18, 0x38, 0x38, 0x1C, 0x1C, 0x18, 0x38, 0xFF, 0x9E, 0x18, 0x78,
+ 0x10, 0xFC, 0x20, 0xCC, 0x20, 0xCC, 0x40, 0xCC, 0x9C, 0xCC, 0xBE, 0xCD,
+ 0x77, 0x7A, 0x63, 0x32, 0x63, 0x04, 0x63, 0x08, 0x63, 0x08, 0x7F, 0x10,
+ 0x3E, 0x1E, 0x03, 0xE0, 0xCC, 0x19, 0x83, 0x60, 0x38, 0x0E, 0x1B, 0x62,
+ 0xC6, 0xD8, 0x73, 0x8F, 0x3F, 0xB3, 0xC2, 0xFF, 0xC0, 0x11, 0x22, 0x64,
+ 0xCC, 0xCC, 0xCC, 0xC4, 0x62, 0x21, 0x00, 0x88, 0x44, 0x62, 0x33, 0x33,
+ 0x33, 0x32, 0x64, 0x48, 0x00, 0x10, 0x21, 0xF1, 0xC2, 0x88, 0x80, 0x30,
+ 0xC3, 0x3F, 0xFC, 0xC3, 0x0C, 0x33, 0x36, 0xC0, 0xFF, 0xFC, 0x00, 0x03,
+ 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30,
+ 0x60, 0x60, 0x60, 0xC0, 0x00, 0x3C, 0x7E, 0x66, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x7E, 0x3C, 0x71, 0xC3, 0x0C, 0x30, 0xC3,
+ 0x0C, 0x30, 0xC3, 0x3F, 0xFC, 0x3C, 0x3F, 0x31, 0xC0, 0x60, 0x30, 0x18,
+ 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x03, 0x03, 0xFC, 0x1E, 0x1F, 0x98,
+ 0xE0, 0x30, 0x18, 0x1C, 0x38, 0x1E, 0x03, 0x80, 0xC0, 0x60, 0x3C, 0x31,
+ 0xF0, 0x06, 0x0E, 0x16, 0x16, 0x26, 0x46, 0x86, 0xFF, 0xFF, 0x06, 0x06,
+ 0x06, 0x06, 0x3F, 0x18, 0x0C, 0x07, 0xC3, 0xF1, 0x1C, 0x06, 0x03, 0x01,
+ 0x80, 0xF0, 0xC7, 0x80, 0x1F, 0x18, 0x98, 0x18, 0x0C, 0xE6, 0xFB, 0x8F,
+ 0x83, 0xC1, 0xF0, 0xD8, 0xEF, 0xE1, 0xE0, 0xFE, 0x0C, 0x10, 0x60, 0x83,
+ 0x06, 0x08, 0x30, 0x60, 0xC1, 0x80, 0x1C, 0x3E, 0x63, 0x63, 0x63, 0x32,
+ 0x1C, 0x2E, 0xC3, 0xC3, 0xC3, 0xE3, 0x7E, 0x3C, 0x3C, 0x7E, 0xE6, 0xC3,
+ 0xC3, 0xC3, 0xE7, 0x7F, 0x3B, 0x03, 0x02, 0x06, 0x44, 0x78, 0xFC, 0x03,
+ 0xF0, 0xFC, 0x00, 0xFF, 0x80, 0x00, 0x07, 0x1C, 0xF0, 0xC0, 0x70, 0x1E,
+ 0x03, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xE0, 0x38, 0x0F, 0x03,
+ 0x0E, 0x70, 0xC0, 0x7D, 0x0C, 0x18, 0x30, 0xC3, 0x04, 0x18, 0x00, 0x00,
+ 0xC1, 0x83, 0x00, 0x03, 0xF0, 0x0F, 0xF8, 0x1C, 0x1C, 0x38, 0x06, 0x70,
+ 0x06, 0x63, 0x83, 0xE7, 0xA3, 0xC6, 0x63, 0xCC, 0x63, 0xCC, 0x63, 0xCC,
+ 0x66, 0xCF, 0xFE, 0xE7, 0x38, 0x70, 0x00, 0x38, 0x00, 0x1F, 0xE0, 0x07,
+ 0xC0, 0x0E, 0x01, 0x40, 0x28, 0x0D, 0x81, 0xB0, 0x22, 0x0C, 0x61, 0x8C,
+ 0x3F, 0x8F, 0xF9, 0x83, 0x30, 0x6C, 0x06, 0xFC, 0x7F, 0xB0, 0xD8, 0x6C,
+ 0x37, 0xE3, 0xFD, 0x87, 0xC1, 0xE0, 0xF0, 0xFF, 0xEF, 0xE0, 0x0F, 0x0F,
+ 0xE7, 0x09, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x18, 0x07, 0x0C,
+ 0xFE, 0x0F, 0x00, 0xFE, 0x3F, 0xCC, 0x3B, 0x07, 0xC0, 0xF0, 0x3C, 0x0F,
+ 0x03, 0xC0, 0xF0, 0x6C, 0x3B, 0xFC, 0xFC, 0x00, 0xFF, 0x83, 0x06, 0x0C,
+ 0x18, 0x3F, 0x60, 0xC1, 0x83, 0x06, 0x0F, 0xE0, 0xFF, 0x83, 0x06, 0x0C,
+ 0x18, 0x3F, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x00, 0x1F, 0x0F, 0xE7, 0x0B,
+ 0x80, 0xC0, 0x30, 0x0C, 0x3F, 0x03, 0xC0, 0xD8, 0x37, 0x0C, 0xFF, 0x1F,
+ 0x00, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0x03, 0xC0,
+ 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xC7, 0x7E, 0x3C, 0xC1,
+ 0xB0, 0xCC, 0x63, 0x18, 0xCC, 0x37, 0x0F, 0xC3, 0x98, 0xC2, 0x30, 0xCC,
+ 0x1B, 0x06, 0xC0, 0xC0, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1,
+ 0x83, 0x06, 0x0F, 0xE0, 0xE0, 0xFC, 0x1F, 0x83, 0xF8, 0x7D, 0x17, 0xA2,
+ 0xF4, 0x5E, 0x53, 0xCA, 0x79, 0x4F, 0x11, 0xE2, 0x3C, 0x06, 0xC0, 0xF8,
+ 0x3F, 0x0F, 0x43, 0xD8, 0xF2, 0x3C, 0xCF, 0x13, 0xC6, 0xF0, 0xBC, 0x3F,
+ 0x07, 0xC0, 0xC0, 0x1F, 0x83, 0xFC, 0x70, 0xE6, 0x06, 0xC0, 0x3C, 0x03,
+ 0xC0, 0x3C, 0x03, 0xC0, 0x36, 0x06, 0x70, 0xE3, 0xFC, 0x1F, 0x80, 0xFE,
+ 0x7F, 0xB0, 0xF8, 0x3C, 0x1E, 0x1F, 0xF9, 0x80, 0xC0, 0x60, 0x30, 0x18,
+ 0x0C, 0x00, 0x0F, 0x03, 0xFC, 0x70, 0xE6, 0x06, 0xC0, 0x3C, 0x03, 0xC0,
+ 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0x60, 0x67, 0x0E, 0x1F, 0x80, 0x60, 0x03,
+ 0x00, 0x1F, 0xFE, 0x7F, 0xB0, 0xF8, 0x3C, 0x1E, 0x1B, 0xF9, 0x98, 0xC6,
+ 0x63, 0x30, 0xD8, 0x6C, 0x18, 0x1F, 0x0F, 0xE7, 0x09, 0x80, 0x60, 0x0E,
+ 0x00, 0xF0, 0x0E, 0x00, 0xC0, 0x36, 0x1D, 0xFE, 0x1F, 0x00, 0xFF, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xC0,
+ 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x36,
+ 0x19, 0xFE, 0x3F, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x30, 0x62, 0x0C, 0x63,
+ 0x0C, 0x60, 0x8C, 0x19, 0x03, 0x60, 0x2C, 0x07, 0x00, 0xE0, 0xC1, 0x03,
+ 0xC1, 0x83, 0x43, 0x86, 0x62, 0x86, 0x62, 0x86, 0x62, 0x46, 0x66, 0x4C,
+ 0x24, 0x4C, 0x34, 0x4C, 0x34, 0x2C, 0x3C, 0x38, 0x38, 0x38, 0x18, 0x38,
+ 0x60, 0x98, 0x63, 0x10, 0x4C, 0x1A, 0x03, 0x80, 0xC0, 0x78, 0x12, 0x0C,
+ 0xC2, 0x19, 0x86, 0x40, 0xC0, 0xC0, 0xD8, 0x26, 0x18, 0x84, 0x33, 0x04,
+ 0x81, 0xE0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x00, 0x7F, 0x81,
+ 0x80, 0xC0, 0xC0, 0x60, 0x60, 0x60, 0x30, 0x30, 0x10, 0x18, 0x18, 0x0F,
+ 0xF8, 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, 0x80, 0x80, 0x40, 0x40,
+ 0x20, 0x20, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x02, 0x02,
+ 0x01, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, 0x18, 0x38, 0x24, 0x24,
+ 0x66, 0x42, 0x42, 0xFF, 0xFF, 0xF0, 0xC8, 0x80, 0x3C, 0x7E, 0x03, 0x1F,
+ 0x7F, 0xE3, 0xC3, 0xC7, 0xFF, 0x7B, 0xC0, 0xC0, 0xC0, 0xC0, 0xDC, 0xE6,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xE6, 0xFC, 0x1E, 0x3F, 0x60, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0x61, 0x1E, 0x01, 0x80, 0xC0, 0x60, 0x33, 0xFB,
+ 0x1D, 0x87, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x36, 0x39, 0xEC, 0x3E, 0x3F,
+ 0xB0, 0x7F, 0xFF, 0xFE, 0x03, 0x00, 0xC2, 0x7F, 0x0F, 0x00, 0x3D, 0xF6,
+ 0x18, 0x63, 0xCF, 0x18, 0x61, 0x86, 0x18, 0x61, 0x86, 0x00, 0x3F, 0x9F,
+ 0xEE, 0x63, 0x0C, 0xC3, 0x39, 0xC7, 0xE3, 0x70, 0xFF, 0x9F, 0xFC, 0x0F,
+ 0x07, 0xFF, 0x9F, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xF0, 0xFF, 0xFF, 0xF0, 0x33, 0x00,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3,
+ 0xC6, 0xCC, 0xD8, 0xD8, 0xFC, 0xE4, 0xC6, 0xC3, 0xC3, 0xDB, 0x6D, 0xB6,
+ 0xDB, 0x6C, 0xC0, 0xDE, 0x77, 0x3C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1,
+ 0x8F, 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x1C, 0x3F, 0x98, 0xD8, 0x3C, 0x1E,
+ 0x0F, 0x07, 0x83, 0x63, 0x1F, 0x00, 0xDC, 0xE6, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xE6, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0x3D, 0xB1, 0xD8, 0x78,
+ 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0x63, 0x9E, 0xC0, 0x60, 0x30, 0x18, 0x0C,
+ 0xDF, 0xEE, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x00, 0x79, 0xFB, 0x16, 0x07,
+ 0x03, 0x81, 0xC3, 0xFC, 0xF0, 0x61, 0x8F, 0xBE, 0x61, 0x86, 0x18, 0x61,
+ 0x87, 0xCF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B,
+ 0xC1, 0xA0, 0xD8, 0x4C, 0x62, 0x31, 0x90, 0x58, 0x2C, 0x1C, 0x06, 0x00,
+ 0xC7, 0x0F, 0x1C, 0x36, 0x78, 0x99, 0xA6, 0x66, 0x98, 0x9A, 0x43, 0x6D,
+ 0x0F, 0x14, 0x3C, 0x60, 0x71, 0x80, 0x63, 0x31, 0x8D, 0x82, 0x81, 0xC0,
+ 0xE0, 0xD0, 0x4C, 0x63, 0x20, 0x80, 0xC1, 0xE0, 0x90, 0xCC, 0x62, 0x21,
+ 0x30, 0xD8, 0x28, 0x1C, 0x0E, 0x06, 0x07, 0x0F, 0x07, 0x00, 0xFF, 0xFC,
+ 0x30, 0x41, 0x06, 0x18, 0x20, 0xFF, 0xFC, 0x19, 0x8C, 0x63, 0x18, 0xDC,
+ 0xE1, 0x8C, 0x63, 0x18, 0xC6, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3,
+ 0x18, 0xC6, 0x31, 0x87, 0x3B, 0x18, 0xC6, 0x31, 0x8C, 0xC0, 0x60, 0xF1,
+ 0x8F, 0x06 };
+
+const GFXglyph sourcesans10pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
+ { 1, 2, 13, 6, 2, -12 }, // 0x21 '!'
+ { 5, 5, 5, 9, 2, -13 }, // 0x22 '"'
+ { 9, 8, 12, 10, 1, -11 }, // 0x23 '#'
+ { 21, 7, 16, 10, 2, -14 }, // 0x24 '$'
+ { 35, 16, 13, 16, 1, -12 }, // 0x25 '%'
+ { 61, 11, 13, 12, 1, -12 }, // 0x26 '&'
+ { 79, 2, 5, 5, 2, -13 }, // 0x27 '''
+ { 81, 4, 19, 6, 2, -14 }, // 0x28 '('
+ { 91, 4, 19, 6, 1, -14 }, // 0x29 ')'
+ { 101, 7, 6, 8, 1, -13 }, // 0x2A '*'
+ { 107, 6, 8, 10, 2, -10 }, // 0x2B '+'
+ { 113, 4, 5, 5, 1, -1 }, // 0x2C ','
+ { 116, 4, 2, 6, 1, -5 }, // 0x2D '-'
+ { 117, 2, 3, 5, 1, -2 }, // 0x2E '.'
+ { 118, 8, 19, 7, 0, -14 }, // 0x2F '/'
+ { 137, 8, 14, 10, 1, -13 }, // 0x30 '0'
+ { 151, 6, 13, 10, 3, -12 }, // 0x31 '1'
+ { 161, 9, 14, 10, 1, -13 }, // 0x32 '2'
+ { 177, 9, 14, 10, 0, -13 }, // 0x33 '3'
+ { 193, 8, 13, 10, 1, -12 }, // 0x34 '4'
+ { 206, 9, 12, 10, 0, -11 }, // 0x35 '5'
+ { 220, 9, 13, 10, 1, -12 }, // 0x36 '6'
+ { 235, 7, 12, 10, 2, -11 }, // 0x37 '7'
+ { 246, 8, 14, 10, 1, -13 }, // 0x38 '8'
+ { 260, 8, 14, 10, 1, -13 }, // 0x39 '9'
+ { 274, 2, 10, 5, 1, -9 }, // 0x3A ':'
+ { 277, 2, 13, 4, 1, -9 }, // 0x3B ';'
+ { 281, 8, 8, 10, 1, -10 }, // 0x3C '<'
+ { 289, 8, 6, 10, 1, -9 }, // 0x3D '='
+ { 295, 8, 8, 10, 1, -10 }, // 0x3E '>'
+ { 303, 7, 13, 8, 1, -12 }, // 0x3F '?'
+ { 315, 16, 17, 17, 1, -13 }, // 0x40 '@'
+ { 349, 11, 13, 11, 0, -12 }, // 0x41 'A'
+ { 367, 9, 13, 12, 2, -12 }, // 0x42 'B'
+ { 382, 10, 13, 11, 1, -12 }, // 0x43 'C'
+ { 399, 10, 13, 12, 2, -12 }, // 0x44 'D'
+ { 416, 7, 13, 11, 2, -12 }, // 0x45 'E'
+ { 428, 7, 13, 10, 2, -12 }, // 0x46 'F'
+ { 440, 10, 13, 12, 1, -12 }, // 0x47 'G'
+ { 457, 10, 13, 13, 2, -12 }, // 0x48 'H'
+ { 474, 2, 13, 5, 2, -12 }, // 0x49 'I'
+ { 478, 8, 13, 10, 0, -12 }, // 0x4A 'J'
+ { 491, 10, 13, 12, 2, -12 }, // 0x4B 'K'
+ { 508, 7, 13, 10, 2, -12 }, // 0x4C 'L'
+ { 520, 11, 13, 15, 2, -12 }, // 0x4D 'M'
+ { 538, 10, 13, 13, 2, -12 }, // 0x4E 'N'
+ { 555, 12, 13, 13, 1, -12 }, // 0x4F 'O'
+ { 575, 9, 13, 12, 2, -12 }, // 0x50 'P'
+ { 590, 12, 16, 13, 1, -12 }, // 0x51 'Q'
+ { 614, 9, 13, 12, 2, -12 }, // 0x52 'R'
+ { 629, 10, 13, 11, 0, -12 }, // 0x53 'S'
+ { 646, 8, 13, 11, 2, -12 }, // 0x54 'T'
+ { 659, 10, 13, 13, 2, -12 }, // 0x55 'U'
+ { 676, 11, 13, 10, 0, -12 }, // 0x56 'V'
+ { 694, 16, 13, 16, 0, -12 }, // 0x57 'W'
+ { 720, 10, 13, 10, 0, -12 }, // 0x58 'X'
+ { 737, 10, 13, 10, 0, -12 }, // 0x59 'Y'
+ { 754, 9, 13, 11, 1, -12 }, // 0x5A 'Z'
+ { 769, 3, 17, 6, 2, -13 }, // 0x5B '['
+ { 776, 8, 17, 7, 0, -13 }, // 0x5C '\'
+ { 793, 3, 17, 6, 1, -13 }, // 0x5D ']'
+ { 800, 8, 7, 10, 1, -12 }, // 0x5E '^'
+ { 807, 10, 2, 10, 0, 2 }, // 0x5F '_'
+ { 810, 3, 3, 11, 3, -13 }, // 0x60 '`'
+ { 812, 8, 10, 10, 1, -9 }, // 0x61 'a'
+ { 822, 8, 14, 11, 2, -13 }, // 0x62 'b'
+ { 836, 8, 10, 9, 1, -9 }, // 0x63 'c'
+ { 846, 9, 14, 11, 1, -13 }, // 0x64 'd'
+ { 862, 9, 10, 10, 1, -9 }, // 0x65 'e'
+ { 874, 6, 15, 6, 1, -14 }, // 0x66 'f'
+ { 886, 10, 14, 10, 1, -9 }, // 0x67 'g'
+ { 904, 8, 14, 11, 2, -13 }, // 0x68 'h'
+ { 918, 2, 14, 5, 1, -13 }, // 0x69 'i'
+ { 922, 4, 18, 5, 0, -13 }, // 0x6A 'j'
+ { 931, 8, 14, 10, 2, -13 }, // 0x6B 'k'
+ { 945, 3, 14, 5, 2, -13 }, // 0x6C 'l'
+ { 951, 13, 10, 17, 2, -9 }, // 0x6D 'm'
+ { 968, 8, 10, 11, 2, -9 }, // 0x6E 'n'
+ { 978, 9, 10, 11, 1, -9 }, // 0x6F 'o'
+ { 990, 8, 14, 11, 2, -9 }, // 0x70 'p'
+ { 1004, 9, 14, 11, 1, -9 }, // 0x71 'q'
+ { 1020, 6, 10, 7, 2, -9 }, // 0x72 'r'
+ { 1028, 7, 10, 8, 1, -9 }, // 0x73 's'
+ { 1037, 6, 12, 7, 1, -11 }, // 0x74 't'
+ { 1046, 8, 10, 11, 2, -9 }, // 0x75 'u'
+ { 1056, 9, 10, 9, 0, -9 }, // 0x76 'v'
+ { 1068, 14, 10, 14, 0, -9 }, // 0x77 'w'
+ { 1086, 9, 10, 9, 0, -9 }, // 0x78 'x'
+ { 1098, 9, 14, 9, 1, -9 }, // 0x79 'y'
+ { 1114, 7, 10, 8, 1, -9 }, // 0x7A 'z'
+ { 1123, 5, 17, 6, 0, -13 }, // 0x7B '{'
+ { 1134, 2, 20, 5, 2, -14 }, // 0x7C '|'
+ { 1139, 5, 17, 6, 2, -13 }, // 0x7D '}'
+ { 1150, 8, 4, 10, 1, -8 } }; // 0x7E '~'
+
+const GFXfont sourcesans10pt7b PROGMEM = {
+ (uint8_t *)sourcesans10pt7bBitmaps,
+ (GFXglyph *)sourcesans10pt7bGlyphs,
+ 0x20, 0x7E, 26 };
+
+const uint8_t sourcesans9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0x0F, 0xDE, 0xF7, 0xBD, 0x80, 0x24, 0x48, 0x97, 0xF2,
+ 0x4D, 0xBF, 0xA4, 0x48, 0x91, 0x20, 0x18, 0x31, 0xF7, 0x2C, 0x18, 0x18,
+ 0x0C, 0x0E, 0x0C, 0x1C, 0x37, 0xC3, 0x00, 0x78, 0x43, 0x21, 0x0C, 0xC8,
+ 0x33, 0x20, 0xCD, 0x03, 0x35, 0xE7, 0xAC, 0xC1, 0x33, 0x04, 0xCC, 0x23,
+ 0x30, 0x84, 0x84, 0x1E, 0x1E, 0x06, 0x60, 0xCC, 0x19, 0x81, 0x60, 0x30,
+ 0x1E, 0x1F, 0x22, 0xC2, 0xD8, 0x71, 0x8F, 0x1F, 0x30, 0xFF, 0xC0, 0x12,
+ 0x26, 0x4C, 0xCC, 0xCC, 0xC4, 0x62, 0x21, 0x84, 0x46, 0x23, 0x33, 0x33,
+ 0x32, 0x64, 0x48, 0x21, 0x3E, 0xED, 0x80, 0x30, 0xC3, 0x3F, 0x30, 0xC3,
+ 0x00, 0x33, 0x64, 0xF0, 0xF0, 0x00, 0x08, 0x10, 0x20, 0x81, 0x02, 0x08,
+ 0x10, 0x40, 0x81, 0x04, 0x08, 0x20, 0x00, 0x3C, 0x66, 0x42, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, 0x71, 0x8C, 0x63, 0x18, 0xC6,
+ 0x31, 0xBE, 0x78, 0x8C, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x30,
+ 0x20, 0x7F, 0x3C, 0x66, 0x03, 0x03, 0x03, 0x06, 0x0C, 0x03, 0x03, 0x03,
+ 0xC6, 0x7C, 0x0C, 0x18, 0xF1, 0x64, 0xD1, 0xA3, 0x7F, 0x0C, 0x18, 0x30,
+ 0x7E, 0x60, 0x60, 0x40, 0xFC, 0x46, 0x03, 0x03, 0x03, 0xC6, 0x7C, 0x3E,
+ 0x62, 0x60, 0xC0, 0xDC, 0xE7, 0xC3, 0xC3, 0x43, 0x66, 0x3C, 0xFC, 0x21,
+ 0x84, 0x30, 0xC2, 0x18, 0x61, 0x86, 0x00, 0x3E, 0x63, 0x63, 0x63, 0x32,
+ 0x1C, 0x2E, 0xC3, 0xC3, 0xC3, 0x63, 0x3C, 0x3C, 0x66, 0xC6, 0xC3, 0xC3,
+ 0xC3, 0x67, 0x3B, 0x03, 0x06, 0x46, 0x7C, 0xF0, 0x0F, 0xF0, 0x03, 0xF8,
+ 0x00, 0x0C, 0xE6, 0x0C, 0x07, 0x03, 0x80, 0xFE, 0x00, 0x00, 0x0F, 0xE0,
+ 0x01, 0x80, 0xE0, 0x30, 0x67, 0x38, 0x00, 0x7B, 0x30, 0xC3, 0x08, 0x41,
+ 0x0C, 0x00, 0x03, 0x0C, 0x07, 0xC0, 0x60, 0xC3, 0x01, 0x98, 0x07, 0x67,
+ 0x0F, 0x32, 0x3D, 0x88, 0xF6, 0x23, 0xD8, 0x8B, 0x66, 0x6C, 0xEF, 0x18,
+ 0x00, 0x60, 0x00, 0xE0, 0x00, 0xF8, 0x00, 0x0C, 0x03, 0x01, 0xE0, 0x48,
+ 0x12, 0x0C, 0xC3, 0x30, 0xFC, 0x61, 0x98, 0x64, 0x0B, 0x03, 0xFC, 0xC6,
+ 0xC6, 0xC6, 0xC4, 0xF8, 0xC6, 0xC3, 0xC3, 0xC3, 0xC6, 0xFC, 0x1F, 0x18,
+ 0xD8, 0x08, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x30, 0x0C, 0x63, 0xE0,
+ 0xFC, 0x63, 0x30, 0xD8, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE1, 0xB1,
+ 0x9F, 0x80, 0xFF, 0x0C, 0x30, 0xC3, 0xEC, 0x30, 0xC3, 0x0C, 0x3F, 0xFF,
+ 0x0C, 0x30, 0xC3, 0x0F, 0xF0, 0xC3, 0x0C, 0x30, 0x1F, 0x8C, 0x26, 0x03,
+ 0x00, 0xC0, 0x30, 0x0C, 0x1F, 0x03, 0xC0, 0xD8, 0x33, 0x0C, 0x7E, 0xC1,
+ 0xE0, 0xF0, 0x78, 0x3C, 0x1F, 0xFF, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78,
+ 0x30, 0xFF, 0xFF, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06,
+ 0x0F, 0x33, 0xC0, 0xC1, 0x61, 0x31, 0x99, 0x8D, 0x87, 0xE3, 0xB1, 0xCC,
+ 0xC2, 0x61, 0xB0, 0x58, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3,
+ 0x0C, 0x3F, 0xC0, 0xF8, 0x7E, 0x1F, 0x87, 0xD2, 0xF4, 0xBD, 0x2F, 0x33,
+ 0xCC, 0xF3, 0x3C, 0x0F, 0x03, 0xC1, 0xF0, 0xF8, 0x7A, 0x3D, 0x1E, 0x4F,
+ 0x27, 0x8B, 0xC5, 0xE1, 0xF0, 0xF8, 0x30, 0x1E, 0x1C, 0xE6, 0x1B, 0x03,
+ 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xD8, 0x63, 0x30, 0x78, 0xFC, 0xC7,
+ 0xC3, 0xC3, 0xC3, 0xC6, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x1E, 0x1C,
+ 0xE6, 0x1B, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xD8, 0x66, 0x18,
+ 0xFC, 0x0C, 0x01, 0x80, 0x3C, 0xFC, 0xC7, 0xC3, 0xC3, 0xC3, 0xC6, 0xFC,
+ 0xC8, 0xCC, 0xC6, 0xC6, 0xC3, 0x3C, 0xE2, 0xC0, 0xC0, 0x60, 0x38, 0x0E,
+ 0x07, 0x03, 0x03, 0xC6, 0x7C, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F,
+ 0x07, 0x83, 0xC1, 0xE0, 0xD8, 0xC7, 0xC0, 0xC0, 0xD0, 0x36, 0x19, 0x86,
+ 0x21, 0x8C, 0xC3, 0x30, 0x4C, 0x16, 0x07, 0x80, 0xE0, 0x30, 0xC3, 0x0F,
+ 0x0C, 0x34, 0x30, 0x99, 0xC6, 0x64, 0x99, 0x92, 0x66, 0x49, 0x09, 0x24,
+ 0x38, 0x70, 0xE1, 0xC3, 0x86, 0x0E, 0x18, 0x41, 0x31, 0x88, 0x86, 0xC1,
+ 0xC0, 0x60, 0x70, 0x28, 0x36, 0x11, 0x98, 0xC8, 0x30, 0x40, 0x98, 0x62,
+ 0x10, 0xCC, 0x12, 0x07, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30,
+ 0xFF, 0x02, 0x06, 0x04, 0x0C, 0x18, 0x10, 0x30, 0x60, 0x60, 0xC0, 0xFF,
+ 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB7, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08,
+ 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x81, 0x01, 0xED, 0xB6, 0xDB, 0x6D,
+ 0xB6, 0xDF, 0x10, 0x50, 0xA3, 0x64, 0x48, 0xB1, 0x80, 0xFF, 0x80, 0xC8,
+ 0x80, 0x7C, 0x8C, 0x18, 0xF6, 0x78, 0xF1, 0xE7, 0x76, 0xC0, 0x60, 0x30,
+ 0x18, 0x0D, 0xE7, 0x1B, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0,
+ 0x1E, 0xC5, 0x06, 0x0C, 0x18, 0x30, 0x31, 0x1E, 0x03, 0x03, 0x03, 0x03,
+ 0x3F, 0x63, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x3C, 0x66, 0xC3,
+ 0xC3, 0xFF, 0xC0, 0xC0, 0x62, 0x3E, 0x39, 0x86, 0x18, 0xF1, 0x86, 0x18,
+ 0x61, 0x86, 0x18, 0x60, 0x7F, 0x62, 0x31, 0x98, 0xCE, 0xC3, 0xC3, 0x01,
+ 0x80, 0x7F, 0x60, 0xF0, 0x78, 0x67, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xDE,
+ 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0x30,
+ 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC6,
+ 0xC4, 0xC8, 0xD8, 0xF8, 0xEC, 0xC4, 0xC6, 0xC3, 0xDB, 0x6D, 0xB6, 0xDB,
+ 0x6E, 0xDE, 0x77, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F, 0x0C,
+ 0x78, 0x63, 0xC3, 0x18, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, 0xDE, 0x71,
+ 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0xC6, 0xDE, 0x60, 0x30, 0x18, 0x0C,
+ 0x00, 0x3F, 0x63, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03,
+ 0x03, 0xDF, 0x31, 0x8C, 0x63, 0x18, 0xC0, 0x7D, 0x8B, 0x07, 0x03, 0xC1,
+ 0xC1, 0xC3, 0x7C, 0x61, 0x8F, 0x18, 0x61, 0x86, 0x18, 0x61, 0x83, 0xC0,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B, 0xC1, 0x43, 0x62,
+ 0x62, 0x26, 0x34, 0x34, 0x1C, 0x18, 0xC2, 0x1E, 0x38, 0xD9, 0x4C, 0xCA,
+ 0x66, 0x53, 0x14, 0xD0, 0xE2, 0x87, 0x1C, 0x38, 0xC0, 0x42, 0x66, 0x34,
+ 0x1C, 0x18, 0x3C, 0x24, 0x66, 0x42, 0x41, 0xA0, 0x98, 0xC4, 0x62, 0x21,
+ 0xB0, 0x58, 0x28, 0x0C, 0x06, 0x06, 0x02, 0x06, 0x00, 0xFC, 0x31, 0x84,
+ 0x31, 0x84, 0x30, 0xFC, 0x19, 0x8C, 0x63, 0x18, 0xD8, 0x31, 0x8C, 0x63,
+ 0x18, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xC3, 0x18, 0xC6, 0x31, 0x83,
+ 0x63, 0x18, 0xC6, 0x31, 0x98, 0xE3, 0x3C };
+
+const GFXglyph sourcesans9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
+ { 1, 2, 12, 5, 2, -11 }, // 0x21 '!'
+ { 4, 5, 5, 8, 2, -12 }, // 0x22 '"'
+ { 8, 7, 11, 9, 1, -10 }, // 0x23 '#'
+ { 18, 7, 14, 9, 1, -12 }, // 0x24 '$'
+ { 31, 14, 12, 15, 1, -11 }, // 0x25 '%'
+ { 52, 11, 12, 11, 1, -11 }, // 0x26 '&'
+ { 69, 2, 5, 4, 2, -12 }, // 0x27 '''
+ { 71, 4, 16, 5, 1, -12 }, // 0x28 '('
+ { 79, 4, 16, 5, 1, -12 }, // 0x29 ')'
+ { 87, 5, 5, 8, 1, -12 }, // 0x2A '*'
+ { 91, 6, 7, 9, 2, -8 }, // 0x2B '+'
+ { 97, 4, 4, 4, 0, 0 }, // 0x2C ','
+ { 99, 4, 1, 6, 1, -4 }, // 0x2D '-'
+ { 100, 2, 2, 4, 1, -1 }, // 0x2E '.'
+ { 101, 7, 16, 6, 0, -12 }, // 0x2F '/'
+ { 115, 8, 12, 9, 1, -11 }, // 0x30 '0'
+ { 127, 5, 11, 9, 2, -10 }, // 0x31 '1'
+ { 134, 8, 12, 9, 1, -11 }, // 0x32 '2'
+ { 146, 8, 12, 9, 1, -11 }, // 0x33 '3'
+ { 158, 7, 11, 9, 1, -10 }, // 0x34 '4'
+ { 168, 8, 11, 9, 1, -10 }, // 0x35 '5'
+ { 179, 8, 11, 9, 1, -10 }, // 0x36 '6'
+ { 190, 6, 11, 9, 2, -10 }, // 0x37 '7'
+ { 199, 8, 12, 9, 1, -11 }, // 0x38 '8'
+ { 211, 8, 12, 9, 1, -11 }, // 0x39 '9'
+ { 223, 2, 8, 4, 1, -7 }, // 0x3A ':'
+ { 225, 2, 11, 4, 1, -7 }, // 0x3B ';'
+ { 228, 7, 8, 9, 1, -9 }, // 0x3C '<'
+ { 235, 7, 5, 9, 1, -7 }, // 0x3D '='
+ { 240, 7, 8, 9, 1, -9 }, // 0x3E '>'
+ { 247, 6, 12, 8, 1, -11 }, // 0x3F '?'
+ { 256, 14, 15, 15, 1, -11 }, // 0x40 '@'
+ { 283, 10, 12, 10, 0, -11 }, // 0x41 'A'
+ { 298, 8, 12, 11, 2, -11 }, // 0x42 'B'
+ { 310, 9, 12, 10, 1, -11 }, // 0x43 'C'
+ { 324, 9, 12, 11, 2, -11 }, // 0x44 'D'
+ { 338, 6, 12, 9, 2, -11 }, // 0x45 'E'
+ { 347, 6, 12, 9, 2, -11 }, // 0x46 'F'
+ { 356, 10, 12, 11, 1, -11 }, // 0x47 'G'
+ { 371, 9, 12, 12, 2, -11 }, // 0x48 'H'
+ { 385, 2, 12, 5, 2, -11 }, // 0x49 'I'
+ { 388, 7, 12, 9, 1, -11 }, // 0x4A 'J'
+ { 399, 9, 12, 10, 2, -11 }, // 0x4B 'K'
+ { 413, 6, 12, 9, 2, -11 }, // 0x4C 'L'
+ { 422, 10, 12, 13, 2, -11 }, // 0x4D 'M'
+ { 437, 9, 12, 12, 2, -11 }, // 0x4E 'N'
+ { 451, 10, 12, 12, 1, -11 }, // 0x4F 'O'
+ { 466, 8, 12, 10, 2, -11 }, // 0x50 'P'
+ { 478, 10, 15, 12, 1, -11 }, // 0x51 'Q'
+ { 497, 8, 12, 10, 2, -11 }, // 0x52 'R'
+ { 509, 8, 12, 10, 1, -11 }, // 0x53 'S'
+ { 521, 8, 12, 10, 1, -11 }, // 0x54 'T'
+ { 533, 9, 12, 12, 2, -11 }, // 0x55 'U'
+ { 547, 10, 12, 9, 0, -11 }, // 0x56 'V'
+ { 562, 14, 12, 14, 0, -11 }, // 0x57 'W'
+ { 583, 9, 12, 9, 0, -11 }, // 0x58 'X'
+ { 597, 10, 12, 9, 0, -11 }, // 0x59 'Y'
+ { 612, 8, 12, 10, 1, -11 }, // 0x5A 'Z'
+ { 624, 3, 16, 5, 2, -12 }, // 0x5B '['
+ { 630, 7, 16, 6, 0, -12 }, // 0x5C '\'
+ { 644, 3, 16, 5, 1, -12 }, // 0x5D ']'
+ { 650, 7, 7, 9, 1, -11 }, // 0x5E '^'
+ { 657, 9, 1, 9, 0, 2 }, // 0x5F '_'
+ { 659, 3, 3, 10, 3, -12 }, // 0x60 '`'
+ { 661, 7, 9, 9, 1, -8 }, // 0x61 'a'
+ { 669, 9, 13, 10, 1, -12 }, // 0x62 'b'
+ { 684, 7, 9, 8, 1, -8 }, // 0x63 'c'
+ { 692, 8, 13, 10, 1, -12 }, // 0x64 'd'
+ { 705, 8, 9, 9, 1, -8 }, // 0x65 'e'
+ { 714, 6, 13, 5, 1, -12 }, // 0x66 'f'
+ { 724, 9, 13, 9, 1, -8 }, // 0x67 'g'
+ { 739, 8, 13, 10, 1, -12 }, // 0x68 'h'
+ { 752, 2, 12, 4, 1, -11 }, // 0x69 'i'
+ { 755, 4, 16, 4, 0, -11 }, // 0x6A 'j'
+ { 763, 8, 13, 9, 1, -12 }, // 0x6B 'k'
+ { 776, 3, 13, 5, 1, -12 }, // 0x6C 'l'
+ { 781, 13, 9, 15, 1, -8 }, // 0x6D 'm'
+ { 796, 8, 9, 10, 1, -8 }, // 0x6E 'n'
+ { 805, 8, 9, 10, 1, -8 }, // 0x6F 'o'
+ { 814, 9, 13, 10, 1, -8 }, // 0x70 'p'
+ { 829, 8, 12, 10, 1, -8 }, // 0x71 'q'
+ { 841, 5, 9, 6, 1, -8 }, // 0x72 'r'
+ { 847, 7, 9, 8, 1, -8 }, // 0x73 's'
+ { 855, 6, 11, 6, 1, -10 }, // 0x74 't'
+ { 864, 8, 9, 10, 1, -8 }, // 0x75 'u'
+ { 873, 8, 9, 8, 0, -8 }, // 0x76 'v'
+ { 882, 13, 9, 13, 0, -8 }, // 0x77 'w'
+ { 897, 8, 9, 8, 0, -8 }, // 0x78 'x'
+ { 906, 9, 13, 8, 0, -8 }, // 0x79 'y'
+ { 921, 6, 9, 8, 1, -8 }, // 0x7A 'z'
+ { 928, 5, 16, 5, 0, -12 }, // 0x7B '{'
+ { 938, 2, 19, 4, 2, -13 }, // 0x7C '|'
+ { 943, 5, 16, 5, 1, -12 }, // 0x7D '}'
+ { 953, 7, 2, 9, 1, -6 } }; // 0x7E '~'
+
+const GFXfont sourcesans9pt7b PROGMEM = {
+ (uint8_t *)sourcesans9pt7bBitmaps,
+ (GFXglyph *)sourcesans9pt7bGlyphs,
+ 0x20, 0x7E, 24 };
+
+// Approx. 1627 bytes
+const uint8_t sourcesans_semi9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xD5, 0x3F, 0xCF, 0x3C, 0xF3, 0xCC, 0x24, 0x4B, 0xFF, 0xF2,
+ 0x5F, 0xFF, 0xA4, 0x48, 0x91, 0x20, 0x18, 0x31, 0xFE, 0x2C, 0x1C, 0x1E,
+ 0x0E, 0x0E, 0x0E, 0x1F, 0xF7, 0xC3, 0x00, 0x78, 0x43, 0xF1, 0x0C, 0xC8,
+ 0x33, 0x20, 0xCD, 0x7B, 0x35, 0xE7, 0xAC, 0xDE, 0xB3, 0x04, 0xCC, 0x13,
+ 0x30, 0x8F, 0xC2, 0x1E, 0x3C, 0x1F, 0x86, 0x61, 0x98, 0x6C, 0x0E, 0x07,
+ 0x8F, 0x76, 0xCF, 0x31, 0xE7, 0xFC, 0xF3, 0xFF, 0xC0, 0x32, 0x66, 0xCC,
+ 0xCC, 0xCC, 0xCC, 0x66, 0x23, 0xC4, 0x66, 0x33, 0x33, 0x33, 0x33, 0x66,
+ 0x4C, 0x10, 0x21, 0xF1, 0xC2, 0x85, 0x00, 0x30, 0xCF, 0xFF, 0x30, 0xC0,
+ 0x33, 0x36, 0xC0, 0xFF, 0xFC, 0x00, 0x10, 0x82, 0x18, 0x41, 0x0C, 0x30,
+ 0x82, 0x18, 0x41, 0x08, 0x00, 0x3C, 0x7E, 0x66, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0x66, 0x7E, 0x3C, 0xF3, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x33,
+ 0xFF, 0xC0, 0x78, 0xFC, 0xCE, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x70,
+ 0xFF, 0xFF, 0x3E, 0x7F, 0x23, 0x03, 0x07, 0x1E, 0x1E, 0x03, 0x03, 0x43,
+ 0xFE, 0x3C, 0x0E, 0x1E, 0x1E, 0x36, 0x66, 0x46, 0xFF, 0xFF, 0x06, 0x06,
+ 0x06, 0x3E, 0x3E, 0x30, 0x60, 0x6C, 0x7E, 0x07, 0x03, 0x03, 0x47, 0x7E,
+ 0x3C, 0x1E, 0x7F, 0x62, 0xC0, 0xDC, 0xFE, 0xE3, 0xC3, 0xC3, 0x67, 0x7E,
+ 0x3C, 0xFF, 0xFC, 0x10, 0x60, 0x83, 0x06, 0x08, 0x30, 0x60, 0xC1, 0x80,
+ 0x38, 0xFB, 0x1E, 0x3E, 0x6F, 0x9F, 0x63, 0xC7, 0x8D, 0xF1, 0xC0, 0x38,
+ 0xFB, 0x36, 0x3C, 0x79, 0xDF, 0xBB, 0x06, 0x1B, 0xF3, 0xC0, 0xFC, 0x0F,
+ 0xC0, 0xFC, 0x03, 0xFE, 0x01, 0x0F, 0x3C, 0xE0, 0xE0, 0x7C, 0x0F, 0x01,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xE0, 0x7C, 0x0F, 0x0F, 0x7C,
+ 0xE0, 0x80, 0x79, 0xFD, 0x18, 0x30, 0xE3, 0x86, 0x18, 0x30, 0x00, 0xC1,
+ 0x83, 0x00, 0x07, 0xC0, 0xFF, 0x8E, 0x0C, 0xE6, 0xB6, 0x7C, 0xE7, 0x67,
+ 0x33, 0x39, 0x91, 0xCC, 0x9E, 0x7F, 0xB9, 0x98, 0xC0, 0x07, 0x84, 0x1F,
+ 0xE0, 0x3E, 0x00, 0x0C, 0x07, 0x81, 0xE0, 0x48, 0x33, 0x0C, 0xC3, 0x31,
+ 0xFE, 0x7F, 0x98, 0x6C, 0x0F, 0x03, 0xFC, 0xFE, 0xC6, 0xC6, 0xFC, 0xFE,
+ 0xC7, 0xC3, 0xC3, 0xC7, 0xFE, 0xFC, 0x1E, 0x1F, 0xDC, 0x5C, 0x0C, 0x06,
+ 0x03, 0x01, 0x80, 0xE0, 0x30, 0x9F, 0xE3, 0xC0, 0xF8, 0xFE, 0xC6, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC6, 0xFE, 0xF8, 0xFF, 0xFF, 0x06, 0x0C,
+ 0x1F, 0xBF, 0x60, 0xC1, 0x83, 0xFF, 0xF0, 0xFF, 0xFF, 0x06, 0x0C, 0x1F,
+ 0xBF, 0x60, 0xC1, 0x83, 0x06, 0x00, 0x1E, 0x1F, 0xDC, 0x4C, 0x0C, 0x06,
+ 0x03, 0x1F, 0x8F, 0xC1, 0xB0, 0xDF, 0xE3, 0xE0, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xFF, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xFF, 0x06,
+ 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x8D, 0xF1, 0xE0, 0xC3, 0x63,
+ 0x33, 0x99, 0x8D, 0x87, 0xC3, 0xF1, 0xDC, 0xC6, 0x63, 0xB0, 0xD8, 0x30,
+ 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0F, 0xFF, 0xE0, 0xF8, 0x7E,
+ 0x1F, 0xC7, 0xF3, 0xF4, 0xBD, 0x2F, 0x7B, 0xCC, 0xF3, 0x3C, 0xCF, 0x03,
+ 0xC3, 0xE3, 0xE3, 0xF3, 0xD3, 0xDB, 0xDB, 0xCB, 0xCF, 0xC7, 0xC7, 0xC3,
+ 0x1E, 0x1F, 0xE6, 0x1B, 0x87, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xE1, 0xD8,
+ 0x67, 0xF0, 0x78, 0xFC, 0xFE, 0xC3, 0xC3, 0xC3, 0xC7, 0xFE, 0xFC, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0x1E, 0x0F, 0xF1, 0x86, 0x70, 0xEC, 0x0D, 0x81, 0xB0,
+ 0x36, 0x06, 0xC0, 0xCC, 0x30, 0xFC, 0x0F, 0x00, 0xE0, 0x0F, 0x80, 0xF8,
+ 0xFC, 0x7F, 0x31, 0xD8, 0x6C, 0x36, 0x3B, 0xF9, 0xF8, 0xCC, 0x63, 0x31,
+ 0xD8, 0x60, 0x1E, 0x1F, 0xD8, 0x4C, 0x07, 0x01, 0xF0, 0x3C, 0x07, 0x01,
+ 0xB0, 0xDF, 0xC7, 0xC0, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07,
+ 0x83, 0xC1, 0xF1, 0xDF, 0xC7, 0xC0, 0xC0, 0xF0, 0x36, 0x19, 0x86, 0x61,
+ 0x8C, 0xC3, 0x30, 0xCC, 0x1E, 0x07, 0x81, 0xE0, 0x70, 0xC3, 0x8F, 0x0E,
+ 0x3E, 0x38, 0xD8, 0xE2, 0x66, 0xD9, 0x9B, 0x66, 0x4D, 0x9D, 0x36, 0x3C,
+ 0xD0, 0xF1, 0xC3, 0xC7, 0x0E, 0x1C, 0x61, 0x98, 0xC3, 0x30, 0xD8, 0x1E,
+ 0x07, 0x01, 0xC0, 0x78, 0x37, 0x0C, 0xC6, 0x39, 0x86, 0x61, 0x98, 0x63,
+ 0x30, 0xCC, 0x1A, 0x07, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30,
+ 0xFF, 0xFF, 0x06, 0x0E, 0x0C, 0x18, 0x38, 0x30, 0x60, 0xE0, 0xFF, 0xFF,
+ 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB7, 0x01, 0x01, 0x02, 0x02, 0x04, 0x0C,
+ 0x08, 0x10, 0x30, 0x20, 0x40, 0x40, 0x81, 0x01, 0xED, 0xB6, 0xDB, 0x6D,
+ 0xB6, 0xDF, 0x18, 0x70, 0xA3, 0x66, 0x48, 0xF1, 0x80, 0xFF, 0xFF, 0xC0,
+ 0xC9, 0x80, 0x3D, 0xFC, 0x18, 0xF7, 0xFC, 0xF1, 0xFF, 0x76, 0xC0, 0xC0,
+ 0xC0, 0xDC, 0xFE, 0xC7, 0xC3, 0xC3, 0xC3, 0xC7, 0xFE, 0xDC, 0x3C, 0xFF,
+ 0x86, 0x0C, 0x18, 0x38, 0x3F, 0x3C, 0x03, 0x03, 0x03, 0x3B, 0x7F, 0xE3,
+ 0xC3, 0xC3, 0xC3, 0xE3, 0x7F, 0x3B, 0x3C, 0xFE, 0x1F, 0xFF, 0xF0, 0x30,
+ 0x3E, 0x3C, 0x3B, 0xD8, 0xCF, 0x79, 0x8C, 0x63, 0x18, 0xC6, 0x00, 0x7F,
+ 0xFF, 0xC6, 0xC6, 0x7E, 0x7C, 0xC0, 0xFE, 0x7F, 0xC3, 0xC3, 0xFE, 0x7C,
+ 0xC0, 0xC0, 0xC0, 0xDE, 0xFF, 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xF3, 0xFF, 0xFF, 0x33, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0xFE, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC6, 0xCC, 0xDC, 0xD8, 0xF8, 0xEC, 0xCC, 0xC6, 0xC7,
+ 0xDB, 0x6D, 0xB6, 0xDB, 0xB0, 0xDE, 0x77, 0xFF, 0xF8, 0xE7, 0x86, 0x3C,
+ 0x31, 0xE1, 0x8F, 0x0C, 0x78, 0x63, 0xC3, 0x18, 0xDE, 0xFF, 0xE3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xC3, 0xE7,
+ 0x7E, 0x3C, 0xDC, 0xFE, 0xC7, 0xC3, 0xC3, 0xC3, 0xC7, 0xFE, 0xDC, 0xC0,
+ 0xC0, 0xC0, 0x3B, 0x7F, 0xE3, 0xC3, 0xC3, 0xC3, 0xE3, 0x7F, 0x3B, 0x03,
+ 0x03, 0xDF, 0xF9, 0x8C, 0x63, 0x18, 0xC0, 0x7B, 0xFC, 0x38, 0x78, 0x38,
+ 0xFF, 0x78, 0x61, 0x8F, 0xBE, 0x61, 0x86, 0x18, 0x61, 0xE3, 0xC0, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0xFF, 0x7B, 0xC1, 0xB1, 0x98, 0xCC,
+ 0x63, 0x61, 0xB0, 0xD8, 0x38, 0x1C, 0x00, 0xC3, 0x1E, 0x1C, 0xD9, 0xE4,
+ 0xCB, 0x66, 0x5B, 0x3A, 0xD8, 0xF3, 0x87, 0x1C, 0x38, 0xE0, 0x63, 0x76,
+ 0x36, 0x1C, 0x1C, 0x3C, 0x36, 0x66, 0x63, 0xC3, 0xC3, 0xC6, 0x66, 0x66,
+ 0x2C, 0x3C, 0x3C, 0x18, 0x18, 0x30, 0xF0, 0xE0, 0xFD, 0xF8, 0x70, 0xC3,
+ 0x0C, 0x38, 0x7F, 0xFE, 0x19, 0x8C, 0x63, 0x18, 0xDC, 0xE1, 0x8C, 0x63,
+ 0x18, 0xC3, 0xFF, 0xFF, 0xE0, 0xC3, 0x18, 0xC6, 0x31, 0x87, 0x3B, 0x18,
+ 0xC6, 0x31, 0x98, 0x60, 0xF2, 0x9E, 0x0C };
+
+const GFXglyph sourcesans_semi9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
+ { 1, 2, 12, 6, 2, -11 }, // 0x21 '!'
+ { 4, 6, 5, 9, 1, -11 }, // 0x22 '"'
+ { 8, 7, 11, 9, 1, -10 }, // 0x23 '#'
+ { 18, 7, 14, 9, 1, -12 }, // 0x24 '$'
+ { 31, 14, 12, 15, 1, -11 }, // 0x25 '%'
+ { 52, 10, 12, 12, 1, -11 }, // 0x26 '&'
+ { 67, 2, 5, 5, 1, -11 }, // 0x27 '''
+ { 69, 4, 16, 6, 1, -12 }, // 0x28 '('
+ { 77, 4, 16, 6, 1, -12 }, // 0x29 ')'
+ { 85, 7, 6, 8, 0, -12 }, // 0x2A '*'
+ { 91, 6, 6, 9, 2, -8 }, // 0x2B '+'
+ { 96, 4, 5, 5, 1, -1 }, // 0x2C ','
+ { 99, 4, 2, 6, 1, -5 }, // 0x2D '-'
+ { 100, 2, 3, 5, 1, -2 }, // 0x2E '.'
+ { 101, 6, 16, 6, 0, -12 }, // 0x2F '/'
+ { 113, 8, 12, 9, 1, -11 }, // 0x30 '0'
+ { 125, 6, 11, 9, 2, -10 }, // 0x31 '1'
+ { 134, 8, 12, 9, 1, -11 }, // 0x32 '2'
+ { 146, 8, 12, 9, 0, -11 }, // 0x33 '3'
+ { 158, 8, 11, 9, 0, -10 }, // 0x34 '4'
+ { 169, 8, 12, 9, 0, -11 }, // 0x35 '5'
+ { 181, 8, 12, 9, 1, -11 }, // 0x36 '6'
+ { 193, 7, 12, 9, 1, -11 }, // 0x37 '7'
+ { 204, 7, 12, 9, 1, -11 }, // 0x38 '8'
+ { 215, 7, 12, 9, 1, -11 }, // 0x39 '9'
+ { 226, 2, 9, 5, 1, -8 }, // 0x3A ':'
+ { 229, 2, 12, 4, 1, -8 }, // 0x3B ';'
+ { 232, 8, 8, 9, 1, -9 }, // 0x3C '<'
+ { 240, 8, 6, 9, 1, -8 }, // 0x3D '='
+ { 246, 8, 8, 9, 1, -9 }, // 0x3E '>'
+ { 254, 7, 13, 8, 0, -12 }, // 0x3F '?'
+ { 266, 13, 15, 16, 1, -11 }, // 0x40 '@'
+ { 291, 10, 12, 10, 0, -11 }, // 0x41 'A'
+ { 306, 8, 12, 11, 2, -11 }, // 0x42 'B'
+ { 318, 9, 12, 10, 1, -11 }, // 0x43 'C'
+ { 332, 8, 12, 11, 2, -11 }, // 0x44 'D'
+ { 344, 7, 12, 10, 2, -11 }, // 0x45 'E'
+ { 355, 7, 12, 9, 2, -11 }, // 0x46 'F'
+ { 366, 9, 12, 11, 1, -11 }, // 0x47 'G'
+ { 380, 8, 12, 12, 2, -11 }, // 0x48 'H'
+ { 392, 2, 12, 5, 2, -11 }, // 0x49 'I'
+ { 395, 7, 12, 9, 0, -11 }, // 0x4A 'J'
+ { 406, 9, 12, 11, 2, -11 }, // 0x4B 'K'
+ { 420, 6, 12, 9, 2, -11 }, // 0x4C 'L'
+ { 429, 10, 12, 13, 2, -11 }, // 0x4D 'M'
+ { 444, 8, 12, 12, 2, -11 }, // 0x4E 'N'
+ { 456, 10, 12, 12, 1, -11 }, // 0x4F 'O'
+ { 471, 8, 12, 11, 2, -11 }, // 0x50 'P'
+ { 483, 11, 15, 12, 1, -11 }, // 0x51 'Q'
+ { 504, 9, 12, 11, 2, -11 }, // 0x52 'R'
+ { 518, 9, 12, 10, 0, -11 }, // 0x53 'S'
+ { 532, 8, 12, 10, 1, -11 }, // 0x54 'T'
+ { 544, 9, 12, 12, 1, -11 }, // 0x55 'U'
+ { 558, 10, 12, 10, 0, -11 }, // 0x56 'V'
+ { 573, 14, 12, 14, 0, -11 }, // 0x57 'W'
+ { 594, 10, 12, 10, 0, -11 }, // 0x58 'X'
+ { 609, 10, 12, 9, -1, -11 }, // 0x59 'Y'
+ { 624, 8, 12, 10, 1, -11 }, // 0x5A 'Z'
+ { 636, 3, 16, 6, 2, -12 }, // 0x5B '['
+ { 642, 7, 16, 6, 0, -12 }, // 0x5C '\'
+ { 656, 3, 16, 6, 1, -12 }, // 0x5D ']'
+ { 662, 7, 7, 9, 1, -11 }, // 0x5E '^'
+ { 669, 9, 2, 9, 0, 1 }, // 0x5F '_'
+ { 672, 3, 3, 10, 3, -12 }, // 0x60 '`'
+ { 674, 7, 9, 9, 1, -8 }, // 0x61 'a'
+ { 682, 8, 12, 10, 1, -11 }, // 0x62 'b'
+ { 694, 7, 9, 8, 1, -8 }, // 0x63 'c'
+ { 702, 8, 12, 10, 1, -11 }, // 0x64 'd'
+ { 714, 7, 9, 9, 2, -8 }, // 0x65 'e'
+ { 722, 5, 13, 6, 1, -12 }, // 0x66 'f'
+ { 731, 8, 13, 9, 1, -8 }, // 0x67 'g'
+ { 744, 8, 12, 10, 1, -11 }, // 0x68 'h'
+ { 756, 2, 12, 5, 1, -11 }, // 0x69 'i'
+ { 759, 4, 16, 5, -1, -11 }, // 0x6A 'j'
+ { 767, 8, 13, 9, 1, -12 }, // 0x6B 'k'
+ { 780, 3, 12, 5, 1, -11 }, // 0x6C 'l'
+ { 785, 13, 9, 15, 1, -8 }, // 0x6D 'm'
+ { 800, 8, 9, 10, 1, -8 }, // 0x6E 'n'
+ { 809, 8, 9, 10, 1, -8 }, // 0x6F 'o'
+ { 818, 8, 12, 10, 1, -8 }, // 0x70 'p'
+ { 830, 8, 11, 10, 1, -8 }, // 0x71 'q'
+ { 841, 5, 9, 7, 1, -8 }, // 0x72 'r'
+ { 847, 6, 9, 8, 1, -8 }, // 0x73 's'
+ { 854, 6, 11, 6, 1, -10 }, // 0x74 't'
+ { 863, 8, 9, 10, 1, -8 }, // 0x75 'u'
+ { 872, 9, 9, 9, 0, -8 }, // 0x76 'v'
+ { 883, 13, 9, 13, 0, -8 }, // 0x77 'w'
+ { 898, 8, 9, 9, 0, -8 }, // 0x78 'x'
+ { 907, 8, 13, 9, 1, -8 }, // 0x79 'y'
+ { 920, 7, 9, 8, 1, -8 }, // 0x7A 'z'
+ { 928, 5, 16, 6, 0, -12 }, // 0x7B '{'
+ { 938, 1, 19, 5, 2, -13 }, // 0x7C '|'
+ { 941, 5, 16, 6, 1, -12 }, // 0x7D '}'
+ { 951, 8, 4, 9, 1, -7 } }; // 0x7E '~'
+
+const GFXfont sourcesans_semi9pt7b PROGMEM = {
+ (uint8_t *)sourcesans_semi9pt7bBitmaps,
+ (GFXglyph *)sourcesans_semi9pt7bGlyphs,
+ 0x20, 0x7E, 24 };
+
+// Approx. 1627 bytes
+const uint8_t sourcesans_bold9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xFF, 0x1F, 0xF0, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x42,
+ 0x24, 0x4B, 0xFF, 0xF2, 0x4D, 0xBF, 0xFF, 0x48, 0x91, 0x20, 0x18, 0x18,
+ 0x7E, 0xFF, 0xE2, 0xE0, 0xF0, 0x7C, 0x1E, 0x0F, 0x07, 0xC7, 0xFE, 0x7C,
+ 0x18, 0x18, 0x78, 0x21, 0xF8, 0xC3, 0x31, 0x06, 0x66, 0x0C, 0xC9, 0x99,
+ 0xB7, 0x9E, 0xD9, 0x99, 0x33, 0x06, 0x66, 0x08, 0xCC, 0x31, 0xF8, 0x41,
+ 0xE0, 0x0E, 0x01, 0xF0, 0x3B, 0x03, 0xB0, 0x3E, 0x01, 0xC7, 0x7C, 0x7F,
+ 0x6E, 0xE7, 0xCE, 0x3E, 0x7F, 0xF3, 0xE3, 0xFF, 0xFE, 0x80, 0x19, 0x9C,
+ 0xE6, 0x73, 0x9C, 0xE7, 0x38, 0xC7, 0x38, 0xC3, 0xC3, 0x1C, 0xE3, 0x1C,
+ 0xE7, 0x39, 0xCE, 0x67, 0x39, 0x98, 0x10, 0x23, 0xFB, 0xE3, 0x8D, 0x80,
+ 0x00, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0xDF, 0x97, 0xA0,
+ 0xFF, 0xFF, 0x80, 0x00, 0x86, 0x31, 0x8C, 0x46, 0x31, 0x88, 0x46, 0x31,
+ 0x88, 0x46, 0x31, 0x88, 0x00, 0x3C, 0x7E, 0x66, 0xE7, 0xE7, 0xE7, 0xE7,
+ 0xE7, 0xE7, 0x66, 0x7E, 0x3C, 0x79, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x3B,
+ 0xFF, 0xC0, 0x3C, 0x7F, 0x11, 0xC0, 0xE0, 0x70, 0x38, 0x38, 0x3C, 0x1C,
+ 0x1C, 0x1F, 0xEF, 0xF0, 0x1E, 0x3F, 0x88, 0xE0, 0x70, 0x78, 0xF0, 0x7C,
+ 0x07, 0x03, 0xA1, 0xFF, 0xC7, 0xC0, 0x0E, 0x1E, 0x3E, 0x2E, 0x6E, 0xCE,
+ 0xFF, 0xFF, 0x0E, 0x0E, 0x0E, 0x3F, 0x1F, 0x9C, 0x0E, 0x07, 0xE3, 0xF8,
+ 0x0E, 0x07, 0x43, 0xFF, 0x8F, 0x80, 0x1E, 0x7F, 0x72, 0xE0, 0xE0, 0xEE,
+ 0xFF, 0xE7, 0xE7, 0xE7, 0x7E, 0x3C, 0xFF, 0xF0, 0x86, 0x18, 0xC3, 0x1C,
+ 0x71, 0xC7, 0x00, 0x3C, 0x7E, 0xE7, 0xE7, 0xF7, 0x7C, 0x7E, 0xE7, 0xE7,
+ 0xE7, 0x7E, 0x3C, 0x3C, 0x7E, 0xE6, 0xE7, 0xE7, 0xE7, 0x7F, 0x37, 0x07,
+ 0x0E, 0xFE, 0x7C, 0xFF, 0x80, 0x3F, 0xE0, 0xFF, 0x80, 0x3F, 0xE5, 0xE8,
+ 0x03, 0x0F, 0x7E, 0xF0, 0xF0, 0x7E, 0x0F, 0x03, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x80, 0xF0, 0x7C, 0x0F, 0x0F, 0x7C, 0xF0, 0x80, 0x3C, 0xFF,
+ 0x47, 0x07, 0x0E, 0x1C, 0x38, 0x38, 0x00, 0x38, 0x38, 0x38, 0x07, 0xE0,
+ 0x7F, 0xC3, 0xC1, 0x9C, 0x02, 0x63, 0xE7, 0x9F, 0x9C, 0xEC, 0x73, 0x31,
+ 0xCC, 0xCF, 0x3D, 0xEE, 0x77, 0x18, 0x00, 0x78, 0x00, 0xFF, 0x00, 0xFC,
+ 0x00, 0x0E, 0x03, 0xE0, 0x6C, 0x0D, 0x83, 0xB8, 0x77, 0x0C, 0x63, 0xFE,
+ 0x7F, 0xCE, 0x3B, 0x83, 0xF0, 0x70, 0xFE, 0x3F, 0xEE, 0x3B, 0x8E, 0xE3,
+ 0xBF, 0xCF, 0xFB, 0x87, 0xE1, 0xF8, 0x7F, 0xFB, 0xFC, 0x1F, 0x0F, 0xE7,
+ 0x11, 0xC0, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xF0, 0x1C, 0x63, 0xFC, 0x7C,
+ 0xFE, 0x3F, 0xCE, 0x3B, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE3, 0xF8,
+ 0xEF, 0xF3, 0xF8, 0xFF, 0xFF, 0x87, 0x0E, 0x1F, 0xBF, 0x70, 0xE1, 0xC3,
+ 0xFF, 0xF0, 0xFF, 0xFF, 0x87, 0x0E, 0x1F, 0xBF, 0x70, 0xE1, 0xC3, 0x87,
+ 0x00, 0x1F, 0x0F, 0xF7, 0x13, 0x80, 0xE0, 0x38, 0xFE, 0x3F, 0x87, 0xF1,
+ 0xDC, 0x73, 0xFC, 0x7E, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xFF, 0xFF,
+ 0xFF, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x47, 0xFE, 0x3C,
+ 0xE3, 0xB8, 0xCE, 0x73, 0xB8, 0xFC, 0x3F, 0x0F, 0xE3, 0xDC, 0xE7, 0x38,
+ 0xEE, 0x3B, 0x87, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3,
+ 0xFF, 0xF0, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x9F, 0xF9, 0xFF, 0x9F, 0xEF,
+ 0x7E, 0xF7, 0xE6, 0x7E, 0x67, 0xE6, 0x7E, 0x07, 0xE1, 0xFC, 0x7F, 0x1F,
+ 0xE7, 0xF9, 0xFB, 0x7E, 0xDF, 0x9F, 0xE7, 0xF8, 0xFE, 0x3F, 0x87, 0x1F,
+ 0x07, 0xF1, 0xC7, 0x70, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xEE,
+ 0x38, 0xFE, 0x0F, 0x80, 0xFF, 0x3F, 0xEE, 0x3F, 0x87, 0xE1, 0xF8, 0xFF,
+ 0xFB, 0xFC, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0x1F, 0x07, 0xF1, 0xC7, 0x70,
+ 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xEE, 0x38, 0xFE, 0x0F, 0x80,
+ 0x70, 0x0F, 0xC0, 0x78, 0xFF, 0x3F, 0xEE, 0x3F, 0x87, 0xE1, 0xF8, 0xFF,
+ 0xFB, 0xFC, 0xE7, 0x38, 0xEE, 0x3B, 0x87, 0x3E, 0x3F, 0xB8, 0xDC, 0x0F,
+ 0x83, 0xF0, 0xFC, 0x0F, 0x03, 0xA1, 0xFF, 0xCF, 0xC0, 0xFF, 0xFC, 0xE1,
+ 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC0, 0xE1, 0xF8, 0x7E, 0x1F,
+ 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xDC, 0xE7, 0xF8, 0xFC, 0xE1,
+ 0xF8, 0x77, 0x39, 0xCE, 0x73, 0x8C, 0xC3, 0x30, 0xFC, 0x1E, 0x07, 0x81,
+ 0xE0, 0x70, 0xE3, 0x8F, 0xC7, 0x1F, 0x8E, 0x33, 0x1C, 0xE7, 0x7D, 0xCE,
+ 0xDB, 0x9D, 0xB7, 0x3B, 0x6C, 0x34, 0xD8, 0x79, 0xF0, 0xF1, 0xE1, 0xE3,
+ 0xC0, 0x71, 0xDC, 0xE3, 0x38, 0xEC, 0x1F, 0x07, 0x81, 0xE0, 0x7C, 0x3F,
+ 0x0C, 0xE7, 0x3B, 0x87, 0x60, 0xCE, 0x38, 0xC6, 0x1D, 0xC1, 0xB0, 0x3E,
+ 0x07, 0xC0, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xFF, 0xFF, 0x06,
+ 0x0E, 0x1C, 0x1C, 0x38, 0x30, 0x70, 0xE0, 0xFF, 0xFF, 0xFF, 0xCC, 0xCC,
+ 0xCC, 0xCC, 0xCC, 0xCC, 0xFF, 0x08, 0x8C, 0xCC, 0x44, 0x46, 0x66, 0x62,
+ 0x22, 0x33, 0x31, 0x20, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xFF,
+ 0x38, 0x38, 0x3C, 0x6C, 0x66, 0x66, 0xC6, 0xFF, 0xFF, 0xC0, 0x63, 0x3C,
+ 0x7E, 0x47, 0x1F, 0x7F, 0xE7, 0xE7, 0xFF, 0x7F, 0xE0, 0x70, 0x38, 0x1C,
+ 0x0E, 0xE7, 0xFB, 0x8F, 0xC7, 0xE3, 0xF1, 0xF9, 0xFF, 0xED, 0xE0, 0x1E,
+ 0x7E, 0xF0, 0xE0, 0xE0, 0xE0, 0xF2, 0x7E, 0x3E, 0x07, 0x07, 0x07, 0x07,
+ 0x3F, 0x7F, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x7F, 0x3F, 0x3C, 0x7E, 0xC7,
+ 0xFF, 0xFF, 0xC0, 0xE0, 0x7E, 0x3E, 0x1D, 0xF7, 0x1C, 0xFB, 0xE7, 0x1C,
+ 0x71, 0xC7, 0x1C, 0x70, 0x3F, 0xFF, 0xF9, 0xDC, 0xE7, 0xF3, 0xE1, 0x80,
+ 0xFE, 0x7F, 0xF1, 0xF8, 0xFF, 0xE7, 0xE0, 0xE0, 0x70, 0x38, 0x1C, 0x0E,
+ 0xF7, 0xFF, 0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x38, 0xFC, 0x7F,
+ 0xFF, 0xFF, 0xF0, 0x39, 0xC0, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9F,
+ 0xFE, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x77, 0x3B, 0xB9, 0xF8, 0xFC, 0x7F,
+ 0x39, 0x9C, 0xEE, 0x38, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0x70, 0xFE,
+ 0x7B, 0xFF, 0xFE, 0x71, 0xF9, 0xC7, 0xE7, 0x1F, 0x9C, 0x7E, 0x71, 0xF9,
+ 0xC7, 0xE7, 0x1C, 0xEF, 0x7F, 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7,
+ 0xE3, 0x80, 0x3E, 0x3F, 0xB8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8E, 0xFE, 0x3E,
+ 0x00, 0xFE, 0x7F, 0xB8, 0xFC, 0x7E, 0x3F, 0x1F, 0x9F, 0xFE, 0xFE, 0x70,
+ 0x38, 0x1C, 0x00, 0x3B, 0x7F, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x7F, 0x3F,
+ 0x07, 0x07, 0x07, 0xEF, 0xFF, 0x38, 0xE3, 0x8E, 0x38, 0xE0, 0x7D, 0xFF,
+ 0x97, 0x87, 0xC3, 0xD3, 0xFF, 0x7C, 0x71, 0xCF, 0xBE, 0x71, 0xC7, 0x1C,
+ 0x71, 0xF3, 0xC0, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xFF, 0x7F,
+ 0xC3, 0xF1, 0xB9, 0xCC, 0xE6, 0x63, 0xB0, 0xF8, 0x78, 0x3C, 0x00, 0xE3,
+ 0x1F, 0x8E, 0x77, 0x79, 0x9D, 0xEE, 0x77, 0xB8, 0xD3, 0xC3, 0xCF, 0x0F,
+ 0x3C, 0x3C, 0xF0, 0x73, 0xBB, 0x8F, 0x87, 0xC1, 0xC1, 0xF0, 0xD8, 0xEE,
+ 0x63, 0x80, 0xE3, 0xB1, 0xDC, 0xC6, 0x63, 0x71, 0xF0, 0x78, 0x38, 0x0C,
+ 0x0E, 0x1E, 0x0E, 0x00, 0xFF, 0xFC, 0x71, 0xC3, 0x8E, 0x38, 0x7F, 0xFE,
+ 0x3B, 0xDC, 0xE3, 0x18, 0xDE, 0xF1, 0x8C, 0xE7, 0x39, 0xE7, 0xFF, 0xFF,
+ 0xE0, 0xE7, 0x9C, 0xE6, 0x31, 0x8F, 0x7B, 0x18, 0xC7, 0x3B, 0xDC, 0x72,
+ 0xFF, 0x8E };
+
+const GFXglyph sourcesans_bold9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
+ { 1, 3, 12, 6, 1, -11 }, // 0x21 '!'
+ { 6, 8, 6, 10, 1, -11 }, // 0x22 '"'
+ { 12, 7, 11, 10, 1, -10 }, // 0x23 '#'
+ { 22, 8, 16, 9, 1, -13 }, // 0x24 '$'
+ { 38, 15, 12, 15, 0, -11 }, // 0x25 '%'
+ { 61, 12, 12, 12, 0, -11 }, // 0x26 '&'
+ { 79, 3, 6, 5, 1, -11 }, // 0x27 '''
+ { 82, 5, 16, 6, 1, -12 }, // 0x28 '('
+ { 92, 5, 16, 6, 1, -12 }, // 0x29 ')'
+ { 102, 7, 7, 8, 0, -12 }, // 0x2A '*'
+ { 109, 8, 8, 9, 1, -9 }, // 0x2B '+'
+ { 117, 3, 7, 5, 1, -2 }, // 0x2C ','
+ { 120, 4, 2, 6, 1, -5 }, // 0x2D '-'
+ { 121, 3, 3, 5, 1, -2 }, // 0x2E '.'
+ { 123, 5, 22, 6, 0, -15 }, // 0x2F '/'
+ { 137, 8, 12, 10, 1, -11 }, // 0x30 '0'
+ { 149, 6, 11, 9, 2, -10 }, // 0x31 '1'
+ { 158, 9, 12, 9, 1, -11 }, // 0x32 '2'
+ { 172, 9, 12, 9, 0, -11 }, // 0x33 '3'
+ { 186, 8, 11, 9, 1, -10 }, // 0x34 '4'
+ { 197, 9, 11, 9, 0, -10 }, // 0x35 '5'
+ { 210, 8, 12, 10, 1, -11 }, // 0x36 '6'
+ { 222, 6, 11, 9, 2, -10 }, // 0x37 '7'
+ { 231, 8, 12, 10, 1, -11 }, // 0x38 '8'
+ { 243, 8, 12, 10, 1, -11 }, // 0x39 '9'
+ { 255, 3, 9, 5, 1, -8 }, // 0x3A ':'
+ { 259, 3, 13, 5, 1, -8 }, // 0x3B ';'
+ { 264, 8, 8, 10, 1, -9 }, // 0x3C '<'
+ { 272, 8, 6, 9, 1, -8 }, // 0x3D '='
+ { 278, 8, 8, 10, 1, -9 }, // 0x3E '>'
+ { 286, 8, 12, 8, 0, -11 }, // 0x3F '?'
+ { 298, 14, 15, 16, 1, -11 }, // 0x40 '@'
+ { 325, 11, 12, 10, 0, -11 }, // 0x41 'A'
+ { 342, 10, 12, 11, 1, -11 }, // 0x42 'B'
+ { 357, 10, 12, 10, 1, -11 }, // 0x43 'C'
+ { 372, 10, 12, 11, 1, -11 }, // 0x44 'D'
+ { 387, 7, 12, 10, 1, -11 }, // 0x45 'E'
+ { 398, 7, 12, 9, 1, -11 }, // 0x46 'F'
+ { 409, 10, 12, 11, 1, -11 }, // 0x47 'G'
+ { 424, 10, 12, 12, 1, -11 }, // 0x48 'H'
+ { 439, 3, 12, 5, 1, -11 }, // 0x49 'I'
+ { 444, 8, 12, 9, 0, -11 }, // 0x4A 'J'
+ { 456, 10, 12, 11, 1, -11 }, // 0x4B 'K'
+ { 471, 7, 12, 9, 1, -11 }, // 0x4C 'L'
+ { 482, 12, 12, 14, 1, -11 }, // 0x4D 'M'
+ { 500, 10, 12, 12, 1, -11 }, // 0x4E 'N'
+ { 515, 11, 12, 12, 1, -11 }, // 0x4F 'O'
+ { 532, 10, 12, 11, 1, -11 }, // 0x50 'P'
+ { 547, 11, 15, 12, 1, -11 }, // 0x51 'Q'
+ { 568, 10, 12, 11, 1, -11 }, // 0x52 'R'
+ { 583, 9, 12, 10, 1, -11 }, // 0x53 'S'
+ { 597, 7, 12, 10, 2, -11 }, // 0x54 'T'
+ { 608, 10, 12, 12, 1, -11 }, // 0x55 'U'
+ { 623, 10, 12, 10, 0, -11 }, // 0x56 'V'
+ { 638, 15, 12, 15, 0, -11 }, // 0x57 'W'
+ { 661, 10, 12, 10, 0, -11 }, // 0x58 'X'
+ { 676, 11, 12, 9, -1, -11 }, // 0x59 'Y'
+ { 693, 8, 12, 10, 1, -11 }, // 0x5A 'Z'
+ { 705, 4, 16, 6, 2, -12 }, // 0x5B '['
+ { 713, 4, 22, 6, 1, -15 }, // 0x5C '\'
+ { 724, 4, 16, 6, 1, -12 }, // 0x5D ']'
+ { 732, 8, 7, 10, 1, -11 }, // 0x5E '^'
+ { 739, 9, 2, 9, 0, 2 }, // 0x5F '_'
+ { 742, 4, 2, 10, 2, -11 }, // 0x60 '`'
+ { 743, 8, 9, 10, 1, -8 }, // 0x61 'a'
+ { 752, 9, 13, 10, 1, -12 }, // 0x62 'b'
+ { 767, 8, 9, 8, 1, -8 }, // 0x63 'c'
+ { 776, 8, 13, 10, 1, -12 }, // 0x64 'd'
+ { 789, 8, 9, 9, 1, -8 }, // 0x65 'e'
+ { 798, 6, 13, 6, 1, -12 }, // 0x66 'f'
+ { 808, 9, 13, 10, 1, -8 }, // 0x67 'g'
+ { 823, 9, 13, 10, 1, -12 }, // 0x68 'h'
+ { 838, 3, 12, 5, 1, -11 }, // 0x69 'i'
+ { 843, 5, 16, 5, -1, -11 }, // 0x6A 'j'
+ { 853, 9, 13, 10, 1, -12 }, // 0x6B 'k'
+ { 868, 4, 13, 5, 1, -12 }, // 0x6C 'l'
+ { 875, 14, 9, 15, 1, -8 }, // 0x6D 'm'
+ { 891, 9, 9, 10, 1, -8 }, // 0x6E 'n'
+ { 902, 9, 9, 10, 1, -8 }, // 0x6F 'o'
+ { 913, 9, 12, 10, 1, -8 }, // 0x70 'p'
+ { 927, 8, 12, 10, 1, -8 }, // 0x71 'q'
+ { 939, 6, 9, 7, 1, -8 }, // 0x72 'r'
+ { 946, 7, 9, 8, 1, -8 }, // 0x73 's'
+ { 954, 6, 11, 7, 1, -10 }, // 0x74 't'
+ { 963, 8, 9, 10, 1, -8 }, // 0x75 'u'
+ { 972, 9, 9, 9, 1, -8 }, // 0x76 'v'
+ { 983, 14, 9, 14, 0, -8 }, // 0x77 'w'
+ { 999, 9, 9, 9, 0, -8 }, // 0x78 'x'
+ { 1010, 9, 12, 9, 0, -8 }, // 0x79 'y'
+ { 1024, 7, 9, 8, 1, -8 }, // 0x7A 'z'
+ { 1032, 5, 16, 6, 1, -12 }, // 0x7B '{'
+ { 1042, 1, 19, 5, 2, -13 }, // 0x7C '|'
+ { 1045, 5, 16, 6, 1, -12 }, // 0x7D '}'
+ { 1055, 8, 3, 9, 1, -6 } }; // 0x7E '~'
+
+const GFXfont sourcesans_bold9pt7b PROGMEM = {
+ (uint8_t *)sourcesans_bold9pt7bBitmaps,
+ (GFXglyph *)sourcesans_bold9pt7bGlyphs,
+ 0x20, 0x7E, 24 };
+
+const uint8_t DINAlternateBold9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xCF, 0xFF, 0xF0, 0x32, 0x32, 0x36, 0xFF, 0x26, 0x24,
+ 0x64, 0xFF, 0x64, 0x4C, 0x4C, 0x4C, 0x08, 0x08, 0x3E, 0x7E, 0x68, 0x68,
+ 0x68, 0x3C, 0x1E, 0x0B, 0x0B, 0x4B, 0xFE, 0x3C, 0x08, 0x08, 0xE3, 0x4A,
+ 0x97, 0x40, 0x82, 0x04, 0x17, 0x2A, 0x95, 0x2C, 0x70, 0x3C, 0x0F, 0xC1,
+ 0x98, 0x33, 0x03, 0xC0, 0x70, 0x13, 0x06, 0x36, 0xC3, 0x9C, 0x71, 0xFF,
+ 0x1E, 0x60, 0xFC, 0x22, 0x64, 0xCC, 0xCC, 0xCC, 0x46, 0x22, 0x84, 0x62,
+ 0x33, 0x33, 0x33, 0x26, 0x48, 0x27, 0xC9, 0xF2, 0x00, 0x18, 0x0C, 0x06,
+ 0x03, 0x0F, 0xFF, 0xFC, 0x60, 0x30, 0x18, 0x00, 0xF8, 0xFF, 0xC0, 0xF0,
+ 0x0C, 0x21, 0x86, 0x10, 0xC2, 0x08, 0x61, 0x04, 0x30, 0x39, 0xFF, 0x1E,
+ 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0xF9, 0xC0, 0x7F, 0xB3, 0x33, 0x33,
+ 0x33, 0x33, 0x38, 0xFB, 0x1E, 0x30, 0x61, 0x86, 0x18, 0x70, 0xC3, 0xFF,
+ 0xF0, 0x79, 0xFF, 0x18, 0x33, 0xC7, 0x83, 0x83, 0x07, 0x9F, 0xF3, 0xC0,
+ 0x0C, 0x18, 0x18, 0x30, 0x30, 0x66, 0x66, 0xC6, 0xFF, 0xFF, 0x06, 0x06,
+ 0xFF, 0xFF, 0x07, 0xEF, 0xD8, 0xC1, 0x83, 0x07, 0x8F, 0xF1, 0xC0, 0x18,
+ 0x30, 0xC1, 0x86, 0x0F, 0x3F, 0x63, 0xC7, 0x8F, 0x3F, 0xE3, 0x00, 0xFF,
+ 0xFF, 0x1E, 0x60, 0xC1, 0x86, 0x0C, 0x30, 0x60, 0xC3, 0x00, 0x7D, 0xFF,
+ 0x1E, 0x37, 0xCF, 0xBB, 0xE3, 0xC7, 0xDD, 0xF1, 0xC0, 0x7D, 0xCF, 0x1E,
+ 0x3C, 0x7F, 0xDF, 0x06, 0x18, 0x30, 0xC1, 0x80, 0xF0, 0xF0, 0xF0, 0xF8,
+ 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x03, 0x80, 0x70, 0x0F, 0x00, 0x80, 0xFF,
+ 0xFF, 0xC0, 0x1F, 0xFF, 0xF8, 0x80, 0x70, 0x0F, 0x00, 0xE0, 0x18, 0x38,
+ 0x71, 0xE0, 0x80, 0x00, 0x7B, 0xFC, 0xF3, 0x0C, 0x63, 0x8C, 0x30, 0x03,
+ 0x0C, 0x0F, 0xC1, 0xFF, 0x1F, 0xDD, 0xF1, 0xFF, 0x89, 0xF8, 0x4F, 0xC6,
+ 0x7E, 0x26, 0x7F, 0xC3, 0x83, 0x8F, 0xF8, 0x1F, 0x00, 0x0C, 0x01, 0xC0,
+ 0x38, 0x0D, 0x81, 0xB0, 0x62, 0x0C, 0x61, 0xFC, 0x7F, 0x8C, 0x19, 0x83,
+ 0x60, 0x30, 0xFE, 0x7F, 0xF0, 0x78, 0x3C, 0x3F, 0xFB, 0xFD, 0x83, 0xC1,
+ 0xE0, 0xFF, 0xDF, 0xC0, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x06, 0x03, 0x01,
+ 0x80, 0xC1, 0xF1, 0xDF, 0xC7, 0xC0, 0xFE, 0x7F, 0xB0, 0xF8, 0x3C, 0x1E,
+ 0x0F, 0x07, 0x83, 0xC1, 0xE1, 0xFF, 0xDF, 0xC0, 0xFF, 0xFF, 0xC0, 0xC0,
+ 0xC0, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0,
+ 0xC0, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x3E, 0x3F, 0xB8, 0xF8,
+ 0x0C, 0x06, 0x3F, 0x1F, 0x83, 0xC1, 0xF1, 0xDF, 0xC7, 0xC0, 0xC1, 0xE0,
+ 0xF0, 0x78, 0x3C, 0x1F, 0xFF, 0xFF, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x30,
+ 0xFF, 0xFF, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x1F,
+ 0xF3, 0xC0, 0xC1, 0xB0, 0xCC, 0x63, 0x30, 0xDC, 0x37, 0x0F, 0xE3, 0x98,
+ 0xC3, 0x30, 0xCC, 0x1B, 0x07, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xC0, 0x7C, 0x1F, 0x83, 0xF0, 0xFF, 0x1F,
+ 0xE3, 0xF6, 0xDE, 0xDB, 0xCE, 0x79, 0xCF, 0x01, 0xE0, 0x30, 0xC1, 0xF0,
+ 0xF8, 0x7E, 0x3D, 0x9E, 0xCF, 0x37, 0x9B, 0xC7, 0xE1, 0xF0, 0xF8, 0x30,
+ 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xF1, 0xDF,
+ 0xC7, 0xC0, 0xFE, 0x7F, 0xB0, 0xF8, 0x3C, 0x3F, 0xFB, 0xF9, 0x80, 0xC0,
+ 0x60, 0x30, 0x18, 0x00, 0x3E, 0x1F, 0xCE, 0x3B, 0x06, 0xC1, 0xB0, 0x6C,
+ 0x1B, 0x16, 0xCF, 0xB8, 0xE7, 0xFC, 0xFB, 0xFE, 0x3F, 0xCC, 0x1B, 0x06,
+ 0xC3, 0xBF, 0xCF, 0xE3, 0x18, 0xC6, 0x30, 0xCC, 0x3B, 0x06, 0x1F, 0x0F,
+ 0xF7, 0x09, 0x80, 0x60, 0x0F, 0x80, 0xF8, 0x03, 0x00, 0xD8, 0x77, 0xF8,
+ 0x7C, 0xFF, 0xFF, 0xC6, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C,
+ 0x06, 0x03, 0x00, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83,
+ 0xC1, 0xF1, 0xDF, 0xC7, 0xC0, 0xC0, 0xD0, 0x66, 0x19, 0x86, 0x23, 0x0C,
+ 0xC3, 0x30, 0x58, 0x1E, 0x07, 0x80, 0xC0, 0x30, 0xC3, 0x0D, 0x8C, 0x36,
+ 0x38, 0xD8, 0xE3, 0x66, 0x98, 0x9B, 0x63, 0x4D, 0x8F, 0x36, 0x3C, 0x70,
+ 0x71, 0xC1, 0x87, 0x06, 0x08, 0xE1, 0x98, 0xC3, 0x30, 0xD8, 0x1E, 0x07,
+ 0x01, 0xC0, 0x78, 0x36, 0x1C, 0xC6, 0x1B, 0x06, 0xE1, 0xD8, 0x63, 0x30,
+ 0xCC, 0x1E, 0x07, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0xFF,
+ 0xFF, 0x06, 0x06, 0x0C, 0x18, 0x18, 0x30, 0x60, 0xE0, 0xFF, 0xFF, 0xFC,
+ 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, 0xC1, 0x04, 0x18, 0x20, 0x83, 0x04,
+ 0x18, 0x60, 0x83, 0xF3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x08, 0x0C,
+ 0x05, 0x06, 0x82, 0x63, 0x11, 0x0D, 0x82, 0xFF, 0x80, 0xE6, 0x30, 0x3C,
+ 0xFC, 0x1B, 0xFF, 0xF8, 0xF1, 0xFF, 0x7E, 0xC1, 0x83, 0x06, 0xEF, 0xF8,
+ 0xF1, 0xC3, 0xC7, 0x8F, 0xFE, 0xE0, 0x3C, 0xFF, 0x8E, 0x0C, 0x18, 0x38,
+ 0x3F, 0x3C, 0x06, 0x0C, 0x1B, 0xBF, 0xF8, 0xF1, 0xE3, 0xC7, 0x8F, 0xFB,
+ 0xB0, 0x38, 0xFB, 0x1F, 0xFF, 0xF8, 0x39, 0x3F, 0x3C, 0x3B, 0xD9, 0xFF,
+ 0xB1, 0x8C, 0x63, 0x18, 0xC0, 0x77, 0xFF, 0x1E, 0x3C, 0x78, 0xF1, 0xFF,
+ 0x76, 0x0D, 0x3F, 0xE7, 0x80, 0xC1, 0x83, 0x06, 0xEF, 0xF8, 0xF1, 0xE3,
+ 0xC7, 0x8F, 0x1E, 0x30, 0xF3, 0xFF, 0xFF, 0x33, 0x03, 0x33, 0x33, 0x33,
+ 0x33, 0x33, 0xFE, 0xC0, 0xC0, 0xC0, 0xC6, 0xCC, 0xD8, 0xD8, 0xF8, 0xEC,
+ 0xCC, 0xC6, 0xC3, 0xDB, 0x6D, 0xB6, 0xDB, 0xB0, 0xDD, 0xEF, 0xFF, 0xC6,
+ 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x30, 0xDD, 0xFF,
+ 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC6, 0x38, 0xFB, 0x1E, 0x3C, 0x78, 0xF1,
+ 0xBE, 0x38, 0xDD, 0xFF, 0x1E, 0x38, 0x78, 0xF1, 0xFF, 0xDD, 0x83, 0x06,
+ 0x0C, 0x00, 0x77, 0xFF, 0x1E, 0x3C, 0x78, 0xF1, 0xFF, 0x76, 0x0C, 0x18,
+ 0x30, 0x60, 0xDF, 0xFC, 0x30, 0xC3, 0x0C, 0x30, 0xC0, 0x3E, 0x7F, 0x62,
+ 0x60, 0x3E, 0x03, 0x43, 0x7F, 0x3E, 0x66, 0x6F, 0xF6, 0x66, 0x66, 0x73,
+ 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xFF, 0x76, 0xC3, 0xC2, 0x66, 0x66,
+ 0x24, 0x3C, 0x3C, 0x18, 0x18, 0xC2, 0x1A, 0x31, 0x99, 0xCC, 0xCA, 0x66,
+ 0xD2, 0x16, 0xF0, 0xE7, 0x87, 0x18, 0x18, 0xC0, 0x63, 0x66, 0x3E, 0x1C,
+ 0x18, 0x3C, 0x36, 0x66, 0xE3, 0xC3, 0xC2, 0x66, 0x66, 0x24, 0x3C, 0x3C,
+ 0x18, 0x18, 0x18, 0x30, 0x70, 0x60, 0xFF, 0xF0, 0x86, 0x31, 0x84, 0x3F,
+ 0xFC, 0x1C, 0xC3, 0x0C, 0x30, 0xCC, 0x1C, 0x30, 0xC3, 0x0C, 0x30, 0x70,
+ 0xFF, 0xFF, 0xFF, 0xE1, 0x8C, 0x63, 0x18, 0x63, 0x31, 0x8C, 0x63, 0x70,
+ 0x71, 0xFF, 0x8E };
+
+const GFXglyph DINAlternateBold9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
+ { 1, 2, 12, 4, 1, -11 }, // 0x21 '!'
+ { 4, 4, 3, 6, 1, -11 }, // 0x22 '"'
+ { 6, 8, 12, 10, 1, -11 }, // 0x23 '#'
+ { 18, 8, 16, 9, 0, -13 }, // 0x24 '$'
+ { 34, 7, 12, 9, 1, -11 }, // 0x25 '%'
+ { 45, 11, 12, 12, 1, -11 }, // 0x26 '&'
+ { 62, 2, 3, 4, 1, -11 }, // 0x27 '''
+ { 63, 4, 14, 5, 1, -11 }, // 0x28 '('
+ { 70, 4, 14, 5, 0, -11 }, // 0x29 ')'
+ { 77, 5, 5, 7, 1, -11 }, // 0x2A '*'
+ { 81, 9, 9, 11, 1, -8 }, // 0x2B '+'
+ { 92, 2, 3, 4, 1, -1 }, // 0x2C ','
+ { 93, 5, 2, 7, 1, -5 }, // 0x2D '-'
+ { 95, 2, 2, 4, 1, -1 }, // 0x2E '.'
+ { 96, 6, 12, 6, 0, -11 }, // 0x2F '/'
+ { 105, 7, 12, 8, 1, -11 }, // 0x30 '0'
+ { 116, 4, 12, 8, 2, -11 }, // 0x31 '1'
+ { 122, 7, 12, 8, 1, -11 }, // 0x32 '2'
+ { 133, 7, 12, 8, 1, -11 }, // 0x33 '3'
+ { 144, 8, 12, 8, 1, -11 }, // 0x34 '4'
+ { 156, 7, 12, 8, 1, -11 }, // 0x35 '5'
+ { 167, 7, 13, 8, 1, -11 }, // 0x36 '6'
+ { 179, 7, 12, 8, 1, -11 }, // 0x37 '7'
+ { 190, 7, 12, 8, 1, -11 }, // 0x38 '8'
+ { 201, 7, 12, 8, 1, -11 }, // 0x39 '9'
+ { 212, 2, 6, 4, 1, -5 }, // 0x3A ':'
+ { 214, 2, 7, 4, 1, -5 }, // 0x3B ';'
+ { 216, 9, 9, 11, 1, -8 }, // 0x3C '<'
+ { 227, 9, 5, 11, 1, -6 }, // 0x3D '='
+ { 233, 9, 9, 11, 1, -8 }, // 0x3E '>'
+ { 244, 6, 12, 8, 1, -11 }, // 0x3F '?'
+ { 253, 13, 12, 15, 1, -11 }, // 0x40 '@'
+ { 273, 11, 12, 11, 0, -11 }, // 0x41 'A'
+ { 290, 9, 12, 11, 1, -11 }, // 0x42 'B'
+ { 304, 9, 12, 10, 1, -11 }, // 0x43 'C'
+ { 318, 9, 12, 11, 1, -11 }, // 0x44 'D'
+ { 332, 8, 12, 10, 1, -11 }, // 0x45 'E'
+ { 344, 8, 12, 10, 1, -11 }, // 0x46 'F'
+ { 356, 9, 12, 11, 1, -11 }, // 0x47 'G'
+ { 370, 9, 12, 11, 1, -11 }, // 0x48 'H'
+ { 384, 2, 12, 4, 1, -11 }, // 0x49 'I'
+ { 387, 7, 12, 8, 0, -11 }, // 0x4A 'J'
+ { 398, 10, 12, 11, 1, -11 }, // 0x4B 'K'
+ { 413, 8, 12, 10, 1, -11 }, // 0x4C 'L'
+ { 425, 11, 12, 13, 1, -11 }, // 0x4D 'M'
+ { 442, 9, 12, 11, 1, -11 }, // 0x4E 'N'
+ { 456, 9, 12, 11, 1, -11 }, // 0x4F 'O'
+ { 470, 9, 12, 11, 1, -11 }, // 0x50 'P'
+ { 484, 10, 12, 11, 1, -11 }, // 0x51 'Q'
+ { 499, 10, 12, 11, 1, -11 }, // 0x52 'R'
+ { 514, 10, 12, 11, 0, -11 }, // 0x53 'S'
+ { 529, 9, 12, 11, 1, -11 }, // 0x54 'T'
+ { 543, 9, 12, 11, 1, -11 }, // 0x55 'U'
+ { 557, 10, 12, 10, 0, -11 }, // 0x56 'V'
+ { 572, 14, 12, 15, 0, -11 }, // 0x57 'W'
+ { 593, 10, 12, 9, 0, -11 }, // 0x58 'X'
+ { 608, 10, 12, 10, 0, -11 }, // 0x59 'Y'
+ { 623, 8, 12, 10, 1, -11 }, // 0x5A 'Z'
+ { 635, 4, 14, 5, 1, -11 }, // 0x5B '['
+ { 642, 6, 12, 6, 0, -11 }, // 0x5C '\'
+ { 651, 4, 14, 5, 0, -11 }, // 0x5D ']'
+ { 658, 9, 8, 11, 1, -12 }, // 0x5E '^'
+ { 667, 9, 1, 9, 0, 2 }, // 0x5F '_'
+ { 669, 4, 3, 4, -1, -12 }, // 0x60 '`'
+ { 671, 7, 9, 9, 1, -8 }, // 0x61 'a'
+ { 679, 7, 12, 9, 1, -11 }, // 0x62 'b'
+ { 690, 7, 9, 9, 1, -8 }, // 0x63 'c'
+ { 698, 7, 12, 9, 1, -11 }, // 0x64 'd'
+ { 709, 7, 9, 9, 1, -8 }, // 0x65 'e'
+ { 717, 5, 12, 6, 1, -11 }, // 0x66 'f'
+ { 725, 7, 13, 9, 1, -8 }, // 0x67 'g'
+ { 737, 7, 12, 9, 1, -11 }, // 0x68 'h'
+ { 748, 2, 12, 4, 1, -11 }, // 0x69 'i'
+ { 751, 4, 16, 4, -1, -11 }, // 0x6A 'j'
+ { 759, 8, 12, 9, 1, -11 }, // 0x6B 'k'
+ { 771, 3, 12, 5, 1, -11 }, // 0x6C 'l'
+ { 776, 12, 9, 14, 1, -8 }, // 0x6D 'm'
+ { 790, 7, 9, 9, 1, -8 }, // 0x6E 'n'
+ { 798, 7, 9, 9, 1, -8 }, // 0x6F 'o'
+ { 806, 7, 13, 9, 1, -8 }, // 0x70 'p'
+ { 818, 7, 13, 9, 1, -8 }, // 0x71 'q'
+ { 830, 6, 9, 7, 1, -8 }, // 0x72 'r'
+ { 837, 8, 9, 9, 0, -8 }, // 0x73 's'
+ { 846, 4, 12, 6, 1, -11 }, // 0x74 't'
+ { 852, 7, 9, 9, 1, -8 }, // 0x75 'u'
+ { 860, 8, 9, 8, 0, -8 }, // 0x76 'v'
+ { 869, 13, 9, 13, 0, -8 }, // 0x77 'w'
+ { 884, 8, 9, 8, 0, -8 }, // 0x78 'x'
+ { 893, 8, 13, 8, 0, -8 }, // 0x79 'y'
+ { 906, 6, 9, 8, 1, -8 }, // 0x7A 'z'
+ { 913, 6, 14, 6, 0, -11 }, // 0x7B '{'
+ { 924, 2, 12, 4, 1, -11 }, // 0x7C '|'
+ { 927, 5, 14, 6, 0, -11 }, // 0x7D '}'
+ { 936, 8, 3, 11, 1, -5 } }; // 0x7E '~'
+
+const GFXfont DINAlternateBold9pt7b PROGMEM = {
+ (uint8_t *)DINAlternateBold9pt7bBitmaps,
+ (GFXglyph *)DINAlternateBold9pt7bGlyphs,
+ 0x20, 0x7E, 21 };
+
+// Approx. 1611 bytes
+const uint8_t DINCondensedBold9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xCF, 0xFF, 0xF0, 0x25, 0x96, 0xFF, 0x49, 0x24, 0xBF,
+ 0xDB, 0x69, 0x24, 0x10, 0xE7, 0xF7, 0xDF, 0x4F, 0x0F, 0x1C, 0x7D, 0xF7,
+ 0x7C, 0x41, 0x00, 0xEE, 0xAE, 0x86, 0x10, 0x42, 0x08, 0x7D, 0x55, 0x77,
+ 0x78, 0xFC, 0xCC, 0xCC, 0x78, 0x30, 0x70, 0xDB, 0xCE, 0xCE, 0xFE, 0x73,
+ 0xFC, 0x2D, 0x2D, 0xB6, 0xD9, 0x26, 0x40, 0x99, 0x26, 0xDB, 0x6D, 0x2D,
+ 0x00, 0x25, 0x5C, 0xEA, 0x90, 0x18, 0x0C, 0x06, 0x03, 0x0F, 0xFF, 0xFC,
+ 0x60, 0x30, 0x18, 0x00, 0xF8, 0xFF, 0xC0, 0xF0, 0x33, 0x22, 0x26, 0x64,
+ 0x44, 0xCC, 0x77, 0xF7, 0xBD, 0xEF, 0x7B, 0xDE, 0xFE, 0xE0, 0x7F, 0xB3,
+ 0x33, 0x33, 0x33, 0x33, 0x77, 0xF7, 0xB1, 0x98, 0xCC, 0x66, 0x3F, 0xF0,
+ 0x77, 0xF6, 0x33, 0x98, 0x63, 0xDE, 0xFE, 0xE0, 0x30, 0xC6, 0x18, 0x61,
+ 0x6D, 0xB6, 0xFF, 0xF1, 0x86, 0xFF, 0xF1, 0x8F, 0x7E, 0x63, 0x1E, 0xFE,
+ 0xE0, 0x31, 0x88, 0xC6, 0x7F, 0x7B, 0xDE, 0xFE, 0xE0, 0xFF, 0xFC, 0x86,
+ 0x18, 0x63, 0x0C, 0x31, 0x86, 0x18, 0x77, 0xF7, 0xBF, 0xFF, 0x7B, 0xDE,
+ 0xFE, 0xE0, 0x77, 0xF7, 0xBD, 0xEF, 0xE6, 0x31, 0x18, 0xC0, 0xF0, 0xF0,
+ 0xF0, 0xF8, 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x03, 0x80, 0x70, 0x0E, 0x00,
+ 0x80, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xF8, 0x80, 0x70, 0x0F, 0x00, 0xE0,
+ 0x18, 0x38, 0x70, 0xE0, 0x80, 0x00, 0x77, 0xF3, 0x90, 0x8C, 0xC6, 0x30,
+ 0x0C, 0x60, 0x0F, 0x81, 0xC3, 0x1B, 0xDC, 0xFE, 0xBD, 0x89, 0xF8, 0x4F,
+ 0xC6, 0xFE, 0x26, 0x7F, 0xF3, 0xE7, 0x8E, 0x18, 0x1F, 0x00, 0x10, 0x70,
+ 0xE1, 0x42, 0x85, 0x9B, 0x3E, 0x7C, 0x8F, 0x1E, 0x30, 0xFB, 0xFC, 0xF3,
+ 0xFB, 0xEC, 0xF3, 0xCF, 0x3F, 0xFE, 0x7B, 0xFC, 0xF3, 0xC3, 0x0C, 0x30,
+ 0xCF, 0x3F, 0xDE, 0xFB, 0xFC, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3F, 0xFE,
+ 0xFF, 0xFC, 0x30, 0xC3, 0xEF, 0xB0, 0xC3, 0x0F, 0xFF, 0xFF, 0xFC, 0x30,
+ 0xC3, 0xEF, 0xB0, 0xC3, 0x0C, 0x30, 0x7B, 0xFC, 0xF0, 0xC3, 0x7D, 0xF3,
+ 0xCF, 0x3F, 0xDE, 0xCF, 0x3C, 0xF3, 0xCF, 0xFF, 0xF3, 0xCF, 0x3C, 0xF3,
+ 0xFF, 0xFF, 0xFF, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x37, 0xDE,
+ 0xCD, 0x9B, 0x66, 0xCF, 0x1E, 0x3E, 0x7C, 0xCD, 0x9B, 0x36, 0x30, 0xC3,
+ 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0F, 0xFF, 0xC3, 0xC3, 0xE7, 0xE7,
+ 0xE7, 0xFF, 0xDB, 0xDB, 0xDB, 0xDB, 0xC3, 0xC3, 0xCF, 0x3E, 0xFB, 0xEF,
+ 0xBD, 0xF7, 0xDF, 0x7C, 0xF3, 0x7B, 0xFC, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF,
+ 0x3F, 0xDE, 0xFB, 0xFC, 0xF3, 0xCF, 0xFF, 0xB0, 0xC3, 0x0C, 0x30, 0x79,
+ 0xFB, 0x36, 0x6C, 0xD9, 0xB3, 0x66, 0xDD, 0xBB, 0xF3, 0xA0, 0xFB, 0xFC,
+ 0xF3, 0xCF, 0xFF, 0x36, 0xDB, 0x2C, 0xF3, 0x7B, 0xFC, 0xF3, 0xC1, 0xC1,
+ 0xC3, 0xCF, 0x3F, 0xDE, 0xFF, 0xF3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3,
+ 0x0C, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3F, 0xDE, 0xC6, 0x8D,
+ 0x93, 0x66, 0xCD, 0x8B, 0x14, 0x38, 0x70, 0xE0, 0x80, 0xCC, 0xD3, 0x34,
+ 0xCD, 0xBB, 0x6E, 0x9F, 0xA7, 0xA9, 0xEE, 0x33, 0x8C, 0xE3, 0x38, 0xC4,
+ 0xC6, 0xD9, 0xB1, 0xC3, 0x86, 0x0E, 0x1C, 0x68, 0xD9, 0x36, 0x30, 0xCF,
+ 0x3C, 0xDE, 0x79, 0xE3, 0x0C, 0x30, 0xC3, 0x0C, 0xFF, 0xC6, 0x23, 0x19,
+ 0x8C, 0x46, 0x3F, 0xF0, 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xC0, 0xCC, 0x44,
+ 0x46, 0x62, 0x22, 0x33, 0xED, 0xB6, 0xDB, 0x6D, 0xB7, 0xC0, 0x08, 0x0C,
+ 0x07, 0x06, 0x82, 0x23, 0x11, 0x05, 0x82, 0xFF, 0x80, 0xC6, 0x20, 0x7B,
+ 0xF0, 0xDF, 0xFF, 0x3C, 0xFF, 0x6C, 0xC6, 0x31, 0xFF, 0xEF, 0x7B, 0xDE,
+ 0xFF, 0xF0, 0x73, 0xEC, 0xB0, 0xC3, 0x0C, 0xBE, 0x70, 0x18, 0xC7, 0xFF,
+ 0xEF, 0x7B, 0xDE, 0xFF, 0xF0, 0x77, 0xF7, 0xFF, 0xE3, 0x7F, 0x70, 0x37,
+ 0x6F, 0xF6, 0x66, 0x66, 0x66, 0xFF, 0xF7, 0xBD, 0xEF, 0x7F, 0xF8, 0xF7,
+ 0xF7, 0x00, 0xC6, 0x31, 0xFF, 0xEF, 0x7B, 0xDE, 0xF7, 0xB0, 0xF3, 0xFF,
+ 0xFF, 0x6C, 0x36, 0xDB, 0x6D, 0xB6, 0xFE, 0xC3, 0x0C, 0x33, 0xDB, 0x6F,
+ 0x3C, 0xFB, 0x6C, 0xF3, 0xDB, 0x6D, 0xB6, 0xDB, 0xB0, 0xF6, 0xFF, 0xDB,
+ 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xFF, 0xF7, 0xBD, 0xEF, 0x7B, 0xD8,
+ 0x77, 0xF7, 0xBD, 0xEF, 0x7F, 0x70, 0xFF, 0xF7, 0xBD, 0xEF, 0x7F, 0xFE,
+ 0x31, 0x8C, 0x00, 0xFF, 0xF7, 0xBD, 0xEF, 0x7F, 0xF8, 0xC6, 0x31, 0x80,
+ 0xDF, 0xCC, 0xCC, 0xCC, 0xC0, 0x77, 0xF7, 0x87, 0x0F, 0x7F, 0x70, 0x66,
+ 0x6F, 0xF6, 0x66, 0x66, 0x73, 0xDE, 0xF7, 0xBD, 0xEF, 0x7F, 0xF8, 0xCF,
+ 0x34, 0xDA, 0x79, 0xE3, 0x8C, 0x30, 0xCD, 0xE6, 0xD3, 0x6F, 0xB7, 0xD3,
+ 0xB8, 0xDC, 0x6E, 0x32, 0x00, 0xCD, 0x67, 0x8C, 0x31, 0xC7, 0x96, 0xCC,
+ 0xC4, 0xD9, 0xB3, 0x62, 0x85, 0x0E, 0x1C, 0x18, 0x20, 0xC3, 0x86, 0x00,
+ 0xFF, 0xC6, 0x62, 0x33, 0x1F, 0xF8, 0x36, 0x66, 0x66, 0x68, 0x66, 0x66,
+ 0x63, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC6, 0x66, 0x66, 0x61, 0x66, 0x66,
+ 0x6C, 0x71, 0xFF, 0x8E };
+
+const GFXglyph DINCondensedBold9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 3, 0, 0 }, // 0x20 ' '
+ { 1, 2, 12, 4, 1, -11 }, // 0x21 '!'
+ { 4, 4, 3, 6, 1, -11 }, // 0x22 '"'
+ { 6, 6, 12, 8, 1, -11 }, // 0x23 '#'
+ { 15, 6, 15, 8, 1, -12 }, // 0x24 '$'
+ { 27, 6, 12, 8, 1, -11 }, // 0x25 '%'
+ { 36, 8, 12, 9, 1, -11 }, // 0x26 '&'
+ { 48, 2, 3, 4, 1, -11 }, // 0x27 '''
+ { 49, 3, 14, 4, 1, -11 }, // 0x28 '('
+ { 55, 3, 14, 4, 0, -11 }, // 0x29 ')'
+ { 61, 5, 6, 7, 1, -11 }, // 0x2A '*'
+ { 65, 9, 9, 11, 1, -8 }, // 0x2B '+'
+ { 76, 2, 3, 4, 1, -1 }, // 0x2C ','
+ { 77, 5, 2, 7, 1, -5 }, // 0x2D '-'
+ { 79, 2, 2, 4, 1, -1 }, // 0x2E '.'
+ { 80, 4, 12, 4, 0, -11 }, // 0x2F '/'
+ { 86, 5, 12, 7, 1, -11 }, // 0x30 '0'
+ { 94, 4, 12, 7, 1, -11 }, // 0x31 '1'
+ { 100, 5, 12, 7, 1, -11 }, // 0x32 '2'
+ { 108, 5, 12, 7, 1, -11 }, // 0x33 '3'
+ { 116, 6, 12, 7, 1, -11 }, // 0x34 '4'
+ { 125, 5, 12, 7, 1, -11 }, // 0x35 '5'
+ { 133, 5, 12, 7, 1, -11 }, // 0x36 '6'
+ { 141, 6, 12, 7, 1, -11 }, // 0x37 '7'
+ { 150, 5, 12, 7, 1, -11 }, // 0x38 '8'
+ { 158, 5, 12, 7, 1, -11 }, // 0x39 '9'
+ { 166, 2, 6, 4, 1, -5 }, // 0x3A ':'
+ { 168, 2, 7, 4, 1, -5 }, // 0x3B ';'
+ { 170, 9, 9, 11, 1, -8 }, // 0x3C '<'
+ { 181, 9, 5, 11, 1, -6 }, // 0x3D '='
+ { 187, 9, 9, 11, 1, -8 }, // 0x3E '>'
+ { 198, 5, 12, 7, 1, -11 }, // 0x3F '?'
+ { 206, 13, 12, 15, 1, -11 }, // 0x40 '@'
+ { 226, 7, 12, 7, 0, -11 }, // 0x41 'A'
+ { 237, 6, 12, 8, 1, -11 }, // 0x42 'B'
+ { 246, 6, 12, 8, 1, -11 }, // 0x43 'C'
+ { 255, 6, 12, 8, 1, -11 }, // 0x44 'D'
+ { 264, 6, 12, 7, 1, -11 }, // 0x45 'E'
+ { 273, 6, 12, 7, 1, -11 }, // 0x46 'F'
+ { 282, 6, 12, 8, 1, -11 }, // 0x47 'G'
+ { 291, 6, 12, 8, 1, -11 }, // 0x48 'H'
+ { 300, 2, 12, 4, 1, -11 }, // 0x49 'I'
+ { 303, 6, 12, 6, -1, -11 }, // 0x4A 'J'
+ { 312, 7, 12, 8, 1, -11 }, // 0x4B 'K'
+ { 323, 6, 12, 7, 1, -11 }, // 0x4C 'L'
+ { 332, 8, 12, 10, 1, -11 }, // 0x4D 'M'
+ { 344, 6, 12, 8, 1, -11 }, // 0x4E 'N'
+ { 353, 6, 12, 8, 1, -11 }, // 0x4F 'O'
+ { 362, 6, 12, 8, 1, -11 }, // 0x50 'P'
+ { 371, 7, 12, 8, 1, -11 }, // 0x51 'Q'
+ { 382, 6, 12, 8, 1, -11 }, // 0x52 'R'
+ { 391, 6, 12, 8, 1, -11 }, // 0x53 'S'
+ { 400, 6, 12, 6, 0, -11 }, // 0x54 'T'
+ { 409, 6, 12, 8, 1, -11 }, // 0x55 'U'
+ { 418, 7, 12, 7, 0, -11 }, // 0x56 'V'
+ { 429, 10, 12, 10, 0, -11 }, // 0x57 'W'
+ { 444, 7, 12, 7, 0, -11 }, // 0x58 'X'
+ { 455, 6, 12, 8, 1, -11 }, // 0x59 'Y'
+ { 464, 5, 12, 7, 1, -11 }, // 0x5A 'Z'
+ { 472, 3, 14, 4, 1, -11 }, // 0x5B '['
+ { 478, 4, 12, 4, 0, -11 }, // 0x5C '\'
+ { 484, 3, 14, 4, 0, -11 }, // 0x5D ']'
+ { 490, 9, 8, 11, 1, -12 }, // 0x5E '^'
+ { 499, 9, 1, 9, 0, 2 }, // 0x5F '_'
+ { 501, 4, 3, 3, -1, -12 }, // 0x60 '`'
+ { 503, 6, 9, 8, 1, -8 }, // 0x61 'a'
+ { 510, 5, 12, 7, 1, -11 }, // 0x62 'b'
+ { 518, 6, 9, 7, 1, -8 }, // 0x63 'c'
+ { 525, 5, 12, 7, 1, -11 }, // 0x64 'd'
+ { 533, 5, 9, 7, 1, -8 }, // 0x65 'e'
+ { 539, 4, 12, 5, 1, -11 }, // 0x66 'f'
+ { 545, 5, 13, 7, 1, -8 }, // 0x67 'g'
+ { 554, 5, 12, 7, 1, -11 }, // 0x68 'h'
+ { 562, 2, 12, 4, 1, -11 }, // 0x69 'i'
+ { 565, 3, 16, 4, 0, -11 }, // 0x6A 'j'
+ { 571, 6, 12, 7, 1, -11 }, // 0x6B 'k'
+ { 580, 3, 12, 4, 1, -11 }, // 0x6C 'l'
+ { 585, 8, 9, 10, 1, -8 }, // 0x6D 'm'
+ { 594, 5, 9, 7, 1, -8 }, // 0x6E 'n'
+ { 600, 5, 9, 7, 1, -8 }, // 0x6F 'o'
+ { 606, 5, 13, 7, 1, -8 }, // 0x70 'p'
+ { 615, 5, 13, 7, 1, -8 }, // 0x71 'q'
+ { 624, 4, 9, 5, 1, -8 }, // 0x72 'r'
+ { 629, 5, 9, 7, 1, -8 }, // 0x73 's'
+ { 635, 4, 12, 4, 0, -11 }, // 0x74 't'
+ { 641, 5, 9, 7, 1, -8 }, // 0x75 'u'
+ { 647, 6, 9, 6, 0, -8 }, // 0x76 'v'
+ { 654, 9, 9, 9, 0, -8 }, // 0x77 'w'
+ { 665, 6, 9, 6, 0, -8 }, // 0x78 'x'
+ { 672, 7, 13, 6, 0, -8 }, // 0x79 'y'
+ { 684, 5, 9, 7, 1, -8 }, // 0x7A 'z'
+ { 690, 4, 14, 5, 1, -11 }, // 0x7B '{'
+ { 697, 2, 17, 4, 1, -12 }, // 0x7C '|'
+ { 702, 4, 14, 4, 0, -11 }, // 0x7D '}'
+ { 709, 8, 3, 11, 1, -5 } }; // 0x7E '~'
+
+const GFXfont DINCondensedBold9pt7b PROGMEM = {
+ (uint8_t *)DINCondensedBold9pt7bBitmaps,
+ (GFXglyph *)DINCondensedBold9pt7bGlyphs,
+ 0x20, 0x7E, 21 };
+
+// Approx. 1384 bytes
+const uint8_t EuphemiaCAS9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xF0, 0x40, 0xDE, 0xD2, 0x0C, 0x20, 0x20, 0x80, 0x82,
+ 0x1F, 0xFF, 0x08, 0x60, 0x21, 0x01, 0x84, 0x06, 0x10, 0x10, 0x40, 0x41,
+ 0x0F, 0xFF, 0x84, 0x30, 0x10, 0x80, 0xC2, 0x03, 0x08, 0x00, 0x08, 0x1E,
+ 0x3B, 0x4A, 0x48, 0x48, 0x68, 0x3C, 0x0E, 0x0B, 0x09, 0x09, 0x49, 0xEA,
+ 0x3E, 0x08, 0x08, 0x70, 0x14, 0x41, 0x22, 0x19, 0x10, 0x88, 0x88, 0x44,
+ 0x82, 0x2C, 0x0E, 0xDE, 0x05, 0x08, 0x48, 0x46, 0x42, 0x62, 0x12, 0x19,
+ 0xA0, 0x7B, 0x00, 0x00, 0x3C, 0x0C, 0x41, 0x08, 0x21, 0x02, 0x40, 0x70,
+ 0x1E, 0x06, 0x63, 0x84, 0x50, 0x5A, 0x06, 0x21, 0xE3, 0xE6, 0xF4, 0x12,
+ 0x44, 0xC8, 0x88, 0x88, 0x84, 0x44, 0x21, 0x84, 0x22, 0x31, 0x11, 0x11,
+ 0x12, 0x22, 0x48, 0x11, 0xAC, 0xE0, 0x83, 0x9A, 0xC4, 0x00, 0x08, 0x04,
+ 0x02, 0x01, 0x0F, 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xD6, 0xF8, 0xC0,
+ 0x00, 0x80, 0x40, 0x40, 0x60, 0x20, 0x30, 0x10, 0x10, 0x08, 0x08, 0x04,
+ 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x80, 0x00, 0x3C, 0x42, 0x42, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x42, 0x42, 0x3C, 0x33, 0xC9, 0x04,
+ 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, 0x7C, 0x3E, 0x63, 0x01, 0x01, 0x01,
+ 0x03, 0x06, 0x0C, 0x10, 0x60, 0x40, 0x80, 0xFE, 0x7C, 0x82, 0x01, 0x02,
+ 0x02, 0x1C, 0x02, 0x01, 0x01, 0x01, 0x01, 0x82, 0xFC, 0x02, 0x06, 0x0A,
+ 0x0A, 0x12, 0x22, 0x62, 0x42, 0xFF, 0x02, 0x02, 0x02, 0x02, 0xFD, 0x02,
+ 0x04, 0x0F, 0x90, 0x80, 0x81, 0x02, 0x04, 0x0C, 0x2F, 0x80, 0x1F, 0x22,
+ 0x40, 0xC0, 0xFC, 0xC2, 0x81, 0x81, 0x81, 0x81, 0xC1, 0x42, 0x3C, 0xFF,
+ 0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x08, 0x18, 0x10, 0x30, 0x20,
+ 0x3C, 0xC3, 0x81, 0x81, 0xC3, 0x3C, 0x3C, 0x42, 0x81, 0x81, 0x81, 0x42,
+ 0x3C, 0x3C, 0x42, 0x81, 0x81, 0x81, 0x81, 0x43, 0x3F, 0x03, 0x03, 0x02,
+ 0x84, 0xF8, 0xC0, 0x03, 0xC0, 0x03, 0x58, 0x04, 0x1C, 0x61, 0x82, 0x08,
+ 0x20, 0x20, 0x20, 0x60, 0x60, 0x60, 0x60, 0xFF, 0x80, 0x00, 0x1F, 0xF0,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x86, 0x18, 0x61, 0x86, 0x08, 0x00,
+ 0xFA, 0x20, 0x41, 0x04, 0x10, 0x8C, 0x21, 0x86, 0x00, 0x40, 0x07, 0xE0,
+ 0x18, 0x18, 0x30, 0x04, 0x60, 0x02, 0x40, 0x02, 0x87, 0xE1, 0x88, 0x21,
+ 0x90, 0x21, 0x90, 0x21, 0x90, 0x21, 0x90, 0x22, 0x88, 0x62, 0x47, 0xBC,
+ 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x07, 0xC0, 0x04, 0x01, 0x40, 0x28,
+ 0x05, 0x81, 0x10, 0x22, 0x04, 0x61, 0xFC, 0x20, 0x84, 0x19, 0x03, 0x20,
+ 0x2C, 0x06, 0xFD, 0x0E, 0x0C, 0x18, 0x5F, 0x21, 0x41, 0x83, 0x06, 0x0C,
+ 0x2F, 0x80, 0x1F, 0x30, 0xD0, 0x18, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80,
+ 0x60, 0x10, 0x2C, 0x31, 0xF0, 0xFC, 0x20, 0xC8, 0x0A, 0x03, 0x80, 0x60,
+ 0x18, 0x06, 0x01, 0x80, 0x60, 0x28, 0x1A, 0x0C, 0xFC, 0x00, 0xFF, 0x02,
+ 0x04, 0x08, 0x1F, 0xA0, 0x40, 0x81, 0x02, 0x04, 0x0F, 0xE0, 0xFF, 0x02,
+ 0x04, 0x08, 0x1F, 0xA0, 0x40, 0x81, 0x02, 0x04, 0x08, 0x00, 0x1F, 0x88,
+ 0x34, 0x01, 0x00, 0x80, 0x20, 0x08, 0x02, 0x01, 0x80, 0x50, 0x14, 0x04,
+ 0xC1, 0x1F, 0x80, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x1F, 0xFE,
+ 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x40, 0xFF, 0xF8, 0x02, 0x04,
+ 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x07, 0x0E, 0x37, 0xC0, 0x83, 0x43,
+ 0x23, 0x13, 0x0B, 0x07, 0x03, 0x01, 0xC0, 0xB0, 0x4C, 0x23, 0x10, 0xC8,
+ 0x38, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x04, 0x0F,
+ 0xE0, 0x80, 0x1C, 0x03, 0xC0, 0x3E, 0x07, 0xA0, 0x5A, 0x05, 0xB0, 0xD9,
+ 0x09, 0x99, 0x98, 0x91, 0x8F, 0x18, 0x61, 0x86, 0x10, 0x80, 0x70, 0x1E,
+ 0x06, 0xC1, 0x90, 0x66, 0x18, 0xC6, 0x19, 0x86, 0x60, 0xD8, 0x1E, 0x07,
+ 0x80, 0xC0, 0x0F, 0x83, 0x0C, 0x40, 0x24, 0x02, 0x80, 0x18, 0x01, 0x80,
+ 0x18, 0x01, 0x80, 0x14, 0x02, 0x40, 0x23, 0x0C, 0x1F, 0x00, 0xFC, 0x82,
+ 0x81, 0x81, 0x81, 0x86, 0xFC, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0F,
+ 0x83, 0x0C, 0x40, 0x24, 0x02, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80,
+ 0x14, 0x03, 0x40, 0x23, 0x0C, 0x1F, 0x80, 0x10, 0x01, 0x80, 0x0C, 0x00,
+ 0x60, 0xFC, 0x41, 0x20, 0x50, 0x28, 0x14, 0x33, 0xF1, 0x18, 0x84, 0x43,
+ 0x20, 0x90, 0x68, 0x18, 0x1F, 0x10, 0xD0, 0x08, 0x06, 0x01, 0xC0, 0x38,
+ 0x06, 0x00, 0x80, 0x50, 0x3C, 0x23, 0xE0, 0xFF, 0x84, 0x02, 0x01, 0x00,
+ 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x80, 0x30,
+ 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06,
+ 0x00, 0xB0, 0x63, 0xF8, 0xC0, 0x50, 0x36, 0x0D, 0x82, 0x21, 0x8C, 0x43,
+ 0x10, 0x4C, 0x1A, 0x06, 0x80, 0xE0, 0x30, 0x0C, 0x00, 0xC1, 0x06, 0x83,
+ 0x0D, 0x06, 0x13, 0x14, 0x26, 0x28, 0xC4, 0x59, 0x89, 0x92, 0x1A, 0x24,
+ 0x34, 0x68, 0x28, 0xF0, 0x70, 0xC0, 0xC1, 0x81, 0x83, 0x00, 0x60, 0xC4,
+ 0x10, 0xC6, 0x0D, 0x80, 0xA0, 0x18, 0x03, 0x80, 0x50, 0x1B, 0x02, 0x20,
+ 0x82, 0x30, 0x6C, 0x06, 0xC1, 0xA0, 0x98, 0xC4, 0x41, 0x40, 0xA0, 0x20,
+ 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x7F, 0x80, 0xC0, 0x40, 0x40,
+ 0x60, 0x20, 0x20, 0x30, 0x10, 0x18, 0x18, 0x08, 0x0F, 0xF8, 0xF2, 0x49,
+ 0x24, 0x92, 0x49, 0x24, 0xE0, 0x80, 0x40, 0x10, 0x08, 0x02, 0x01, 0x00,
+ 0x40, 0x20, 0x08, 0x04, 0x01, 0x00, 0xC0, 0x20, 0x18, 0x04, 0x03, 0x00,
+ 0x80, 0xE4, 0x92, 0x49, 0x24, 0x92, 0x49, 0xE0, 0x08, 0x05, 0x01, 0x20,
+ 0x88, 0x61, 0x10, 0x68, 0x0C, 0xFF, 0x80, 0x4C, 0x21, 0x3C, 0x31, 0x00,
+ 0x80, 0x47, 0xE6, 0x12, 0x09, 0x0C, 0x7B, 0x80, 0x80, 0x80, 0x80, 0x80,
+ 0xBC, 0xC2, 0x81, 0x81, 0x81, 0x81, 0x83, 0x86, 0xFC, 0x3E, 0x43, 0x80,
+ 0x80, 0x80, 0x80, 0xC0, 0x63, 0x3E, 0x01, 0x01, 0x01, 0x01, 0x3F, 0x41,
+ 0xC1, 0x81, 0x81, 0x81, 0xC1, 0x41, 0x3F, 0x3C, 0x8E, 0x0F, 0xF8, 0x10,
+ 0x30, 0x23, 0x3C, 0x3D, 0x04, 0x10, 0xF1, 0x04, 0x10, 0x41, 0x04, 0x10,
+ 0x40, 0x3F, 0xE3, 0x20, 0x90, 0x4C, 0x63, 0xE2, 0x01, 0x00, 0x7C, 0x43,
+ 0x20, 0x90, 0xC7, 0xC0, 0x80, 0x80, 0x80, 0x80, 0xBE, 0xC3, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0xC0, 0x55, 0x55, 0x40, 0x30, 0x00, 0x22,
+ 0x22, 0x22, 0x22, 0x22, 0x26, 0xC0, 0x81, 0x02, 0x04, 0x08, 0x73, 0x2C,
+ 0x70, 0xB1, 0x32, 0x24, 0x68, 0x60, 0x92, 0x49, 0x24, 0x92, 0x4E, 0xB9,
+ 0xD8, 0xC6, 0x10, 0xC2, 0x18, 0x43, 0x08, 0x61, 0x0C, 0x21, 0x84, 0x20,
+ 0xBE, 0xC3, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x3E, 0x30, 0xB0,
+ 0x70, 0x18, 0x0C, 0x07, 0x06, 0xC6, 0x3E, 0x00, 0xBC, 0xC2, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x82, 0xFC, 0x80, 0x80, 0x80, 0x80, 0x3F, 0x41, 0x81,
+ 0x81, 0x81, 0x81, 0xC1, 0x41, 0x3F, 0x01, 0x01, 0x01, 0x01, 0xBE, 0x21,
+ 0x08, 0x42, 0x10, 0x80, 0x7D, 0x0E, 0x06, 0x03, 0x80, 0xC0, 0xE1, 0x7C,
+ 0x42, 0x11, 0xE4, 0x21, 0x08, 0x42, 0x10, 0xF0, 0x83, 0x06, 0x0C, 0x18,
+ 0x30, 0x60, 0xC3, 0x7A, 0x81, 0x83, 0x82, 0x46, 0x46, 0x24, 0x2C, 0x2C,
+ 0x18, 0xC4, 0x34, 0x62, 0x46, 0x66, 0xA6, 0x29, 0x42, 0x94, 0x29, 0xC1,
+ 0x18, 0x10, 0x80, 0x43, 0x26, 0x24, 0x18, 0x18, 0x1C, 0x24, 0x66, 0xC3,
+ 0xC1, 0xA0, 0x98, 0xC4, 0x43, 0x20, 0xA0, 0x50, 0x38, 0x08, 0x04, 0x06,
+ 0x02, 0x0E, 0x00, 0xFE, 0x08, 0x30, 0xC3, 0x04, 0x10, 0x60, 0xFE, 0x19,
+ 0x08, 0x42, 0x10, 0x84, 0xC1, 0x08, 0x42, 0x10, 0x84, 0x18, 0xFF, 0xFF,
+ 0x80, 0xC1, 0x08, 0x42, 0x10, 0x84, 0x19, 0x08, 0x42, 0x10, 0x84, 0xC0,
+ 0x70, 0xC7, 0x80 };
+
+const GFXglyph EuphemiaCAS9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 9, 0, 0 }, // 0x20 ' '
+ { 1, 2, 13, 4, 1, -12 }, // 0x21 '!'
+ { 5, 5, 3, 7, 1, -12 }, // 0x22 '"'
+ { 7, 14, 15, 16, 1, -13 }, // 0x23 '#'
+ { 34, 8, 17, 10, 1, -14 }, // 0x24 '$'
+ { 51, 13, 15, 17, 2, -13 }, // 0x25 '%'
+ { 76, 11, 13, 13, 1, -12 }, // 0x26 '&'
+ { 94, 2, 3, 4, 1, -12 }, // 0x27 '''
+ { 95, 4, 16, 6, 1, -14 }, // 0x28 '('
+ { 103, 4, 16, 6, 1, -14 }, // 0x29 ')'
+ { 111, 7, 7, 9, 1, -14 }, // 0x2A '*'
+ { 118, 9, 9, 11, 1, -9 }, // 0x2B '+'
+ { 129, 2, 4, 4, 1, 0 }, // 0x2C ','
+ { 130, 5, 1, 7, 1, -6 }, // 0x2D '-'
+ { 131, 2, 1, 4, 1, 0 }, // 0x2E '.'
+ { 132, 9, 17, 11, 1, -14 }, // 0x2F '/'
+ { 152, 8, 13, 10, 1, -12 }, // 0x30 '0'
+ { 165, 6, 13, 10, 2, -12 }, // 0x31 '1'
+ { 175, 8, 13, 10, 1, -12 }, // 0x32 '2'
+ { 188, 8, 13, 10, 1, -12 }, // 0x33 '3'
+ { 201, 8, 13, 10, 1, -12 }, // 0x34 '4'
+ { 214, 7, 13, 10, 2, -12 }, // 0x35 '5'
+ { 226, 8, 13, 10, 1, -12 }, // 0x36 '6'
+ { 239, 8, 13, 10, 1, -12 }, // 0x37 '7'
+ { 252, 8, 13, 10, 1, -12 }, // 0x38 '8'
+ { 265, 8, 13, 10, 1, -12 }, // 0x39 '9'
+ { 278, 2, 8, 4, 1, -7 }, // 0x3A ':'
+ { 280, 2, 11, 4, 1, -7 }, // 0x3B ';'
+ { 283, 7, 13, 9, 1, -12 }, // 0x3C '<'
+ { 295, 9, 4, 11, 1, -8 }, // 0x3D '='
+ { 300, 7, 13, 9, 1, -12 }, // 0x3E '>'
+ { 312, 6, 13, 9, 1, -12 }, // 0x3F '?'
+ { 322, 16, 17, 18, 1, -12 }, // 0x40 '@'
+ { 356, 11, 13, 11, 0, -12 }, // 0x41 'A'
+ { 374, 7, 13, 11, 2, -12 }, // 0x42 'B'
+ { 386, 9, 13, 12, 1, -12 }, // 0x43 'C'
+ { 401, 10, 13, 12, 1, -12 }, // 0x44 'D'
+ { 418, 7, 13, 10, 2, -12 }, // 0x45 'E'
+ { 430, 7, 13, 9, 2, -12 }, // 0x46 'F'
+ { 442, 10, 13, 12, 1, -12 }, // 0x47 'G'
+ { 459, 10, 13, 12, 1, -12 }, // 0x48 'H'
+ { 476, 1, 13, 4, 2, -12 }, // 0x49 'I'
+ { 478, 7, 13, 9, 1, -12 }, // 0x4A 'J'
+ { 490, 9, 13, 11, 2, -12 }, // 0x4B 'K'
+ { 505, 7, 13, 9, 2, -12 }, // 0x4C 'L'
+ { 517, 12, 13, 14, 1, -12 }, // 0x4D 'M'
+ { 537, 10, 13, 12, 1, -12 }, // 0x4E 'N'
+ { 554, 12, 13, 14, 1, -12 }, // 0x4F 'O'
+ { 574, 8, 13, 10, 1, -12 }, // 0x50 'P'
+ { 587, 12, 17, 14, 1, -12 }, // 0x51 'Q'
+ { 613, 9, 13, 11, 1, -12 }, // 0x52 'R'
+ { 628, 9, 13, 11, 0, -12 }, // 0x53 'S'
+ { 643, 9, 13, 11, 1, -12 }, // 0x54 'T'
+ { 658, 11, 13, 13, 1, -12 }, // 0x55 'U'
+ { 676, 10, 13, 11, 0, -12 }, // 0x56 'V'
+ { 693, 15, 13, 16, 0, -12 }, // 0x57 'W'
+ { 718, 11, 13, 11, 0, -12 }, // 0x58 'X'
+ { 736, 9, 13, 10, 1, -12 }, // 0x59 'Y'
+ { 751, 9, 13, 10, 0, -12 }, // 0x5A 'Z'
+ { 766, 3, 17, 5, 1, -14 }, // 0x5B '['
+ { 773, 9, 17, 11, 1, -14 }, // 0x5C '\'
+ { 793, 3, 17, 5, 1, -14 }, // 0x5D ']'
+ { 800, 10, 7, 11, 1, -13 }, // 0x5E '^'
+ { 809, 9, 1, 9, 0, 3 }, // 0x5F '_'
+ { 811, 4, 4, 0, -2, -13 }, // 0x60 '`'
+ { 813, 9, 9, 10, 1, -8 }, // 0x61 'a'
+ { 824, 8, 13, 10, 1, -12 }, // 0x62 'b'
+ { 837, 8, 9, 9, 1, -8 }, // 0x63 'c'
+ { 846, 8, 13, 11, 1, -12 }, // 0x64 'd'
+ { 859, 7, 9, 10, 1, -8 }, // 0x65 'e'
+ { 867, 6, 13, 6, 1, -12 }, // 0x66 'f'
+ { 877, 9, 13, 10, 1, -8 }, // 0x67 'g'
+ { 892, 8, 13, 10, 1, -12 }, // 0x68 'h'
+ { 905, 2, 13, 4, 1, -12 }, // 0x69 'i'
+ { 909, 4, 17, 4, -1, -12 }, // 0x6A 'j'
+ { 918, 7, 13, 9, 1, -12 }, // 0x6B 'k'
+ { 930, 3, 13, 4, 1, -12 }, // 0x6C 'l'
+ { 935, 11, 9, 13, 1, -8 }, // 0x6D 'm'
+ { 948, 8, 9, 10, 1, -8 }, // 0x6E 'n'
+ { 957, 9, 9, 11, 1, -8 }, // 0x6F 'o'
+ { 968, 8, 13, 10, 1, -8 }, // 0x70 'p'
+ { 981, 8, 13, 10, 1, -8 }, // 0x71 'q'
+ { 994, 5, 9, 7, 1, -8 }, // 0x72 'r'
+ { 1000, 7, 9, 9, 1, -8 }, // 0x73 's'
+ { 1008, 5, 12, 6, 1, -11 }, // 0x74 't'
+ { 1016, 7, 9, 10, 1, -8 }, // 0x75 'u'
+ { 1024, 8, 9, 8, -1, -8 }, // 0x76 'v'
+ { 1033, 12, 9, 12, 0, -8 }, // 0x77 'w'
+ { 1047, 8, 9, 8, 0, -8 }, // 0x78 'x'
+ { 1056, 9, 13, 9, 0, -8 }, // 0x79 'y'
+ { 1071, 7, 9, 9, 1, -8 }, // 0x7A 'z'
+ { 1079, 5, 17, 6, 0, -13 }, // 0x7B '{'
+ { 1090, 1, 17, 9, 4, -12 }, // 0x7C '|'
+ { 1093, 5, 17, 6, 1, -13 }, // 0x7D '}'
+ { 1104, 9, 2, 11, 1, -5 } }; // 0x7E '~'
+
+const GFXfont EuphemiaCAS9pt7b PROGMEM = {
+ (uint8_t *)EuphemiaCAS9pt7bBitmaps,
+ (GFXglyph *)EuphemiaCAS9pt7bGlyphs,
+ 0x20, 0x7E, 24 };
+
+// Approx. 1779 bytes
+const uint8_t Futura9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xFC, 0xF0, 0xDE, 0xF7, 0xBD, 0x80, 0x11, 0x84, 0x61,
+ 0x18, 0xC6, 0xFF, 0xFF, 0xF3, 0x30, 0xCC, 0xFF, 0xFF, 0xF2, 0x31, 0x8C,
+ 0x62, 0x18, 0x80, 0x0C, 0x06, 0x0F, 0xCE, 0x76, 0x03, 0x01, 0xC0, 0x78,
+ 0x1F, 0x03, 0xC0, 0x68, 0x3C, 0x1B, 0x1D, 0xFC, 0x7C, 0x0C, 0x06, 0x00,
+ 0x38, 0x30, 0xF8, 0x43, 0x19, 0x86, 0x32, 0x0C, 0x6C, 0x0F, 0x90, 0x0E,
+ 0x40, 0x00, 0x9C, 0x02, 0x7C, 0x05, 0x8C, 0x13, 0x18, 0x66, 0x30, 0x87,
+ 0xC3, 0x07, 0x00, 0x1E, 0x03, 0xF0, 0x33, 0x03, 0x30, 0x3F, 0x01, 0xE0,
+ 0x3C, 0x07, 0xE0, 0xE7, 0x6C, 0x3C, 0xC1, 0x8E, 0x3C, 0x7E, 0xE3, 0xC6,
+ 0xFF, 0xC0, 0x76, 0x66, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xE6, 0x66, 0x20,
+ 0xC6, 0x66, 0x33, 0x33, 0x33, 0x33, 0x33, 0x76, 0x66, 0x40, 0x18, 0x18,
+ 0x7E, 0x7E, 0x3C, 0x66, 0x24, 0x0C, 0x06, 0x03, 0x1F, 0xFF, 0xF8, 0x60,
+ 0x30, 0x18, 0x0C, 0x00, 0x23, 0x26, 0x6C, 0xFF, 0xF0, 0x01, 0x80, 0xC0,
+ 0xC0, 0x60, 0x60, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x02, 0x03, 0x01,
+ 0x81, 0x80, 0xC0, 0xC0, 0x60, 0x10, 0x00, 0x1C, 0x1F, 0x18, 0xDC, 0x6C,
+ 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF8, 0xCC, 0x63, 0xE0, 0xE0, 0x7F,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x3F, 0x98, 0xEC, 0x30, 0x18,
+ 0x0C, 0x0C, 0x0E, 0x0E, 0x06, 0x06, 0x06, 0x07, 0xFF, 0xFC, 0x3C, 0x7E,
+ 0xE7, 0x03, 0x03, 0x1E, 0x1E, 0x07, 0x03, 0x03, 0xC3, 0xC7, 0x7E, 0x3C,
+ 0x00, 0x00, 0x10, 0x06, 0x00, 0xC0, 0x38, 0x0F, 0x01, 0xE0, 0x6C, 0x1D,
+ 0x83, 0x30, 0xC6, 0x3F, 0xF7, 0xFE, 0x03, 0x00, 0x60, 0x1F, 0x8F, 0xC6,
+ 0x06, 0x03, 0xE1, 0xF9, 0x8C, 0x03, 0x01, 0x80, 0xD0, 0x7C, 0x67, 0xF1,
+ 0xE0, 0x00, 0x03, 0x03, 0x81, 0x81, 0x81, 0xC0, 0xF8, 0xFE, 0xE3, 0xE0,
+ 0xF0, 0x78, 0x3E, 0x33, 0xF8, 0x78, 0xFF, 0xFF, 0xE0, 0x30, 0x0C, 0x06,
+ 0x01, 0x80, 0xC0, 0x70, 0x18, 0x0C, 0x03, 0x01, 0x80, 0xE0, 0x30, 0x00,
+ 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x7E, 0xE7, 0xC3, 0xC3, 0xE7,
+ 0x7E, 0x3C, 0x3C, 0x3F, 0xB8, 0xF8, 0x3C, 0x1E, 0x0F, 0x8E, 0xFE, 0x3E,
+ 0x07, 0x03, 0x03, 0x03, 0x81, 0x80, 0x00, 0xF0, 0x03, 0xC0, 0x33, 0x00,
+ 0x00, 0x32, 0x66, 0x44, 0x01, 0x83, 0xC7, 0x8F, 0x0E, 0x07, 0x01, 0xE0,
+ 0x3C, 0x07, 0x80, 0xC0, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xF8, 0xC0, 0x78,
+ 0x0E, 0x01, 0xC0, 0x38, 0x3C, 0x78, 0xF0, 0xE0, 0x40, 0x00, 0x38, 0xFB,
+ 0x1E, 0x30, 0xE7, 0xBC, 0x60, 0xCD, 0xF9, 0xE0, 0x03, 0x06, 0x00, 0x0F,
+ 0xC0, 0x61, 0xC3, 0x01, 0x99, 0xD6, 0xCF, 0xCF, 0x73, 0x3D, 0x84, 0xF6,
+ 0x33, 0xD8, 0xDB, 0xBD, 0xE7, 0x77, 0x0E, 0x00, 0x3F, 0xE0, 0x3F, 0x00,
+ 0x02, 0x00, 0x10, 0x01, 0xC0, 0x0E, 0x00, 0xF8, 0x06, 0xC0, 0x73, 0x03,
+ 0x18, 0x18, 0xE1, 0xFF, 0x0F, 0xF8, 0xC0, 0x66, 0x03, 0x60, 0x0C, 0xF8,
+ 0xFC, 0xCE, 0xC6, 0xC6, 0xCE, 0xFC, 0xFE, 0xC7, 0xC3, 0xC3, 0xC7, 0xFE,
+ 0xFC, 0x0F, 0x83, 0xFC, 0xE1, 0xB0, 0x0E, 0x01, 0x80, 0x30, 0x06, 0x00,
+ 0xC0, 0x1C, 0x01, 0x80, 0x9C, 0x31, 0xFE, 0x1F, 0x00, 0xFC, 0x3F, 0xCC,
+ 0x7B, 0x06, 0xC1, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x7C, 0x1B, 0x1E,
+ 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0x06, 0x0C, 0x1F, 0xFF, 0xE0, 0xC1, 0x83,
+ 0x06, 0x0F, 0xFF, 0xC0, 0xFF, 0xFF, 0x06, 0x0C, 0x1F, 0xFF, 0xE0, 0xC1,
+ 0x83, 0x06, 0x0C, 0x18, 0x00, 0x0F, 0x80, 0xFF, 0x0E, 0x1C, 0xC0, 0x4E,
+ 0x00, 0x60, 0x03, 0x07, 0xF8, 0x3F, 0xC0, 0x1F, 0x01, 0xD8, 0x0C, 0x71,
+ 0xE1, 0xFE, 0x07, 0xC0, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xFF, 0xFF,
+ 0xFF, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x30, 0xFF, 0xFF,
+ 0xFF, 0xF0, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC7, 0xFB,
+ 0xC0, 0xC1, 0xB0, 0xCC, 0x73, 0x38, 0xDC, 0x3E, 0x0F, 0x03, 0xE0, 0xDC,
+ 0x33, 0x0C, 0x63, 0x1C, 0xC3, 0xB0, 0x70, 0xC3, 0x0C, 0x30, 0xC3, 0x0C,
+ 0x30, 0xC3, 0x0C, 0x30, 0xFF, 0xF0, 0x00, 0x00, 0x20, 0x20, 0xC0, 0x61,
+ 0x80, 0xC3, 0x83, 0x87, 0x07, 0x0F, 0x1E, 0x16, 0x34, 0x6C, 0xEC, 0xCD,
+ 0x99, 0x9B, 0x33, 0x1C, 0x66, 0x38, 0xD8, 0x21, 0xB0, 0x41, 0x80, 0x80,
+ 0x00, 0x08, 0x03, 0xC0, 0x3E, 0x03, 0xF0, 0x3F, 0x83, 0xDC, 0x3C, 0xE3,
+ 0xC7, 0x3C, 0x3B, 0xC1, 0xFC, 0x0F, 0xC0, 0x7C, 0x03, 0xC0, 0x10, 0x00,
+ 0x0F, 0xC0, 0x7F, 0x83, 0x87, 0x18, 0x06, 0xE0, 0x1F, 0x00, 0x3C, 0x00,
+ 0xF0, 0x03, 0xC0, 0x0F, 0x80, 0x76, 0x01, 0x8E, 0x1C, 0x1F, 0xE0, 0x3F,
+ 0x00, 0xF9, 0xFB, 0x3E, 0x3C, 0x79, 0xFF, 0x7C, 0xC1, 0x83, 0x06, 0x0C,
+ 0x18, 0x00, 0x0F, 0xC0, 0x7F, 0x83, 0x87, 0x18, 0x06, 0xE0, 0x1F, 0x00,
+ 0x3C, 0x00, 0xF0, 0x03, 0xC3, 0x8F, 0x87, 0x76, 0x0F, 0x8E, 0x1C, 0x1F,
+ 0xF8, 0x3E, 0x70, 0xF8, 0xFC, 0xCE, 0xC6, 0xC6, 0xCE, 0xFC, 0xF8, 0xD0,
+ 0xD8, 0xCC, 0xCC, 0xC6, 0xC7, 0x1E, 0x1F, 0x9C, 0xCC, 0x06, 0x01, 0xC0,
+ 0x78, 0x0E, 0x01, 0x80, 0xF8, 0x6C, 0x77, 0xF0, 0xF0, 0xFF, 0xFF, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xC0,
+ 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C,
+ 0x0D, 0x86, 0x7F, 0x87, 0x80, 0xC0, 0x76, 0x06, 0x60, 0x67, 0x0C, 0x30,
+ 0xC3, 0x0C, 0x19, 0x81, 0x98, 0x1F, 0x00, 0xF0, 0x0F, 0x00, 0x60, 0x06,
+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x18, 0x08, 0x19, 0x81, 0x03, 0x30,
+ 0x60, 0xE7, 0x0E, 0x18, 0x63, 0xC3, 0x0C, 0x78, 0xC0, 0xCD, 0x98, 0x1B,
+ 0x37, 0x03, 0x63, 0xC0, 0x3C, 0x78, 0x07, 0x0E, 0x00, 0xE0, 0xC0, 0x0C,
+ 0x18, 0x01, 0x02, 0x00, 0x00, 0x00, 0x60, 0xC6, 0x38, 0xC6, 0x0D, 0xC1,
+ 0xB0, 0x1C, 0x03, 0x80, 0x70, 0x1F, 0x03, 0x60, 0xC6, 0x18, 0xC6, 0x0D,
+ 0xC1, 0x80, 0xC0, 0xF8, 0x76, 0x18, 0xCC, 0x33, 0x07, 0x81, 0xE0, 0x30,
+ 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0x7F, 0x9F, 0xE0, 0x30,
+ 0x0C, 0x06, 0x03, 0x80, 0xC0, 0x70, 0x18, 0x0E, 0x03, 0x01, 0x80, 0x7F,
+ 0xFF, 0xF0, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, 0xF0,
+ 0xC0, 0x20, 0x18, 0x0C, 0x03, 0x01, 0x80, 0x40, 0x30, 0x18, 0x06, 0x03,
+ 0x00, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x01, 0x80, 0xC0, 0x00, 0xFF, 0x33,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0xF0, 0x0C, 0x07, 0x81, 0xE0,
+ 0xCC, 0x33, 0x18, 0x66, 0x18, 0xFF, 0xFF, 0xF0, 0xCE, 0x62, 0x3D, 0xBF,
+ 0xF8, 0xF8, 0x3C, 0x1E, 0x0F, 0x8E, 0xFF, 0x3D, 0x80, 0xC0, 0x60, 0x30,
+ 0x18, 0x0C, 0x06, 0x03, 0x79, 0xFE, 0xE3, 0xE0, 0xF0, 0x78, 0x3E, 0x3F,
+ 0xFB, 0x78, 0x3E, 0xFF, 0x8E, 0x0C, 0x18, 0x38, 0xBF, 0x3E, 0x01, 0x80,
+ 0xC0, 0x60, 0x30, 0x18, 0x0C, 0xF6, 0xFF, 0xE3, 0xE0, 0xF0, 0x78, 0x3E,
+ 0x3B, 0xFC, 0xF6, 0x3C, 0x7E, 0xE3, 0xFF, 0xFF, 0xC0, 0xE3, 0x7E, 0x3C,
+ 0x3B, 0xD8, 0xC6, 0x33, 0xFF, 0x63, 0x18, 0xC6, 0x31, 0x80, 0x3D, 0xBF,
+ 0xF8, 0xF8, 0x3C, 0x1E, 0x0F, 0x8E, 0xFF, 0x3D, 0x80, 0xF0, 0x6C, 0x77,
+ 0xF0, 0xF0, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x37, 0x7F, 0xE7, 0x8F, 0x1E,
+ 0x3C, 0x78, 0xF1, 0x80, 0xF0, 0x3F, 0xFF, 0xF0, 0xF0, 0x3F, 0xFF, 0xFF,
+ 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xCE, 0xDC, 0xF8, 0xF0, 0xF0,
+ 0xD8, 0xDC, 0xCC, 0xC6, 0xFF, 0xFF, 0xFF, 0xFC, 0xDD, 0xEF, 0xFF, 0xE7,
+ 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x30, 0xDD, 0xFF,
+ 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC6, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x1E,
+ 0x0F, 0x8E, 0xFE, 0x3E, 0x00, 0xDE, 0x7F, 0xB8, 0xF8, 0x3C, 0x1E, 0x0F,
+ 0x8F, 0xFE, 0xDE, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x3D, 0xBF, 0xF8,
+ 0xF8, 0x3C, 0x1E, 0x0F, 0x8E, 0xFF, 0x3D, 0x80, 0xC0, 0x60, 0x30, 0x18,
+ 0x0C, 0xFB, 0xEE, 0x30, 0xC3, 0x0C, 0x30, 0xC0, 0x73, 0xEC, 0x38, 0x38,
+ 0x3C, 0xFF, 0x78, 0x66, 0x6F, 0xF6, 0x66, 0x66, 0x66, 0xC7, 0x8F, 0x1E,
+ 0x3C, 0x78, 0xF1, 0xBE, 0x38, 0xC3, 0xB1, 0x99, 0xC6, 0xC3, 0x60, 0xE0,
+ 0x70, 0x10, 0x08, 0x00, 0x00, 0x03, 0x08, 0x66, 0x31, 0x99, 0xCC, 0x37,
+ 0xB0, 0xDF, 0x81, 0xCE, 0x07, 0x38, 0x08, 0xC0, 0x21, 0x00, 0x61, 0x8C,
+ 0xC1, 0xE0, 0x78, 0x0C, 0x07, 0x83, 0x31, 0xCE, 0xE1, 0x80, 0xE1, 0xB0,
+ 0xDC, 0xC6, 0x63, 0xE0, 0xF0, 0x70, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x07,
+ 0x03, 0x00, 0x7F, 0xBF, 0x81, 0x81, 0x81, 0xC1, 0xC0, 0xC0, 0xFF, 0xFF,
+ 0x80, 0x3B, 0xD8, 0xC6, 0x31, 0x8C, 0xE6, 0x38, 0xC6, 0x31, 0x8C, 0x63,
+ 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE7, 0x8C, 0x63, 0x18, 0xC6, 0x38,
+ 0xCE, 0x63, 0x18, 0xC6, 0x37, 0xB8, 0x78, 0xFF, 0xE3, 0xC0 };
+
+const GFXglyph Futura9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 5, 0, 0 }, // 0x20 ' '
+ { 1, 2, 14, 6, 2, -13 }, // 0x21 '!'
+ { 5, 5, 5, 7, 1, -13 }, // 0x22 '"'
+ { 9, 10, 14, 12, 1, -13 }, // 0x23 '#'
+ { 27, 9, 18, 11, 1, -15 }, // 0x24 '$'
+ { 48, 15, 14, 17, 1, -13 }, // 0x25 '%'
+ { 75, 12, 14, 13, 1, -13 }, // 0x26 '&'
+ { 96, 2, 5, 4, 1, -13 }, // 0x27 '''
+ { 98, 4, 19, 7, 2, -14 }, // 0x28 '('
+ { 108, 4, 19, 7, 1, -14 }, // 0x29 ')'
+ { 118, 8, 7, 12, 2, -14 }, // 0x2A '*'
+ { 125, 9, 9, 11, 1, -11 }, // 0x2B '+'
+ { 136, 4, 6, 5, 0, -2 }, // 0x2C ','
+ { 139, 4, 2, 4, 0, -5 }, // 0x2D '-'
+ { 140, 2, 2, 6, 2, -1 }, // 0x2E '.'
+ { 141, 9, 19, 9, 0, -14 }, // 0x2F '/'
+ { 163, 9, 14, 11, 1, -13 }, // 0x30 '0'
+ { 179, 4, 14, 11, 3, -13 }, // 0x31 '1'
+ { 186, 9, 14, 11, 0, -13 }, // 0x32 '2'
+ { 202, 8, 14, 11, 1, -13 }, // 0x33 '3'
+ { 216, 11, 15, 11, 0, -14 }, // 0x34 '4'
+ { 237, 9, 14, 11, 1, -13 }, // 0x35 '5'
+ { 253, 9, 15, 11, 1, -14 }, // 0x36 '6'
+ { 270, 10, 14, 11, 1, -13 }, // 0x37 '7'
+ { 288, 8, 14, 11, 1, -13 }, // 0x38 '8'
+ { 302, 9, 15, 11, 1, -13 }, // 0x39 '9'
+ { 319, 2, 9, 6, 2, -8 }, // 0x3A ':'
+ { 322, 4, 12, 5, 0, -8 }, // 0x3B ';'
+ { 328, 9, 10, 11, 1, -11 }, // 0x3C '<'
+ { 340, 9, 5, 11, 1, -9 }, // 0x3D '='
+ { 346, 9, 10, 11, 1, -11 }, // 0x3E '>'
+ { 358, 7, 14, 9, 1, -13 }, // 0x3F '?'
+ { 371, 14, 14, 16, 1, -13 }, // 0x40 '@'
+ { 396, 13, 14, 13, 0, -13 }, // 0x41 'A'
+ { 419, 8, 14, 11, 2, -13 }, // 0x42 'B'
+ { 433, 11, 14, 12, 1, -13 }, // 0x43 'C'
+ { 453, 10, 14, 13, 2, -13 }, // 0x44 'D'
+ { 471, 7, 14, 10, 2, -13 }, // 0x45 'E'
+ { 484, 7, 14, 9, 2, -13 }, // 0x46 'F'
+ { 497, 13, 14, 15, 1, -13 }, // 0x47 'G'
+ { 520, 10, 14, 14, 2, -13 }, // 0x48 'H'
+ { 538, 2, 14, 6, 2, -13 }, // 0x49 'I'
+ { 542, 6, 14, 8, 0, -13 }, // 0x4A 'J'
+ { 553, 10, 14, 12, 2, -13 }, // 0x4B 'K'
+ { 571, 6, 14, 9, 2, -13 }, // 0x4C 'L'
+ { 582, 15, 16, 17, 1, -14 }, // 0x4D 'M'
+ { 612, 12, 16, 16, 2, -14 }, // 0x4E 'N'
+ { 636, 14, 14, 16, 1, -13 }, // 0x4F 'O'
+ { 661, 7, 14, 10, 2, -13 }, // 0x50 'P'
+ { 674, 14, 14, 16, 1, -13 }, // 0x51 'Q'
+ { 699, 8, 14, 11, 2, -13 }, // 0x52 'R'
+ { 713, 9, 14, 11, 1, -13 }, // 0x53 'S'
+ { 729, 8, 14, 10, 1, -13 }, // 0x54 'T'
+ { 743, 10, 14, 14, 2, -13 }, // 0x55 'U'
+ { 761, 12, 15, 12, 0, -13 }, // 0x56 'V'
+ { 784, 19, 16, 19, 0, -14 }, // 0x57 'W'
+ { 822, 11, 14, 11, 0, -13 }, // 0x58 'X'
+ { 842, 10, 14, 10, 0, -13 }, // 0x59 'Y'
+ { 860, 10, 14, 11, 1, -13 }, // 0x5A 'Z'
+ { 878, 4, 19, 6, 2, -14 }, // 0x5B '['
+ { 888, 9, 19, 9, 0, -14 }, // 0x5C '\'
+ { 910, 4, 19, 6, 0, -14 }, // 0x5D ']'
+ { 920, 10, 7, 10, 0, -13 }, // 0x5E '^'
+ { 929, 10, 2, 10, 0, 2 }, // 0x5F '_'
+ { 932, 4, 4, 10, 2, -13 }, // 0x60 '`'
+ { 934, 9, 9, 11, 1, -8 }, // 0x61 'a'
+ { 945, 9, 15, 11, 1, -14 }, // 0x62 'b'
+ { 962, 7, 9, 9, 1, -8 }, // 0x63 'c'
+ { 970, 9, 15, 11, 1, -14 }, // 0x64 'd'
+ { 987, 8, 9, 10, 1, -8 }, // 0x65 'e'
+ { 996, 5, 15, 6, 1, -14 }, // 0x66 'f'
+ { 1006, 9, 14, 11, 1, -8 }, // 0x67 'g'
+ { 1022, 7, 15, 9, 1, -14 }, // 0x68 'h'
+ { 1036, 2, 14, 4, 1, -13 }, // 0x69 'i'
+ { 1040, 2, 19, 4, 1, -13 }, // 0x6A 'j'
+ { 1045, 8, 15, 9, 1, -14 }, // 0x6B 'k'
+ { 1060, 2, 15, 4, 1, -14 }, // 0x6C 'l'
+ { 1064, 12, 9, 14, 1, -8 }, // 0x6D 'm'
+ { 1078, 7, 9, 9, 1, -8 }, // 0x6E 'n'
+ { 1086, 9, 9, 11, 1, -8 }, // 0x6F 'o'
+ { 1097, 9, 14, 11, 1, -8 }, // 0x70 'p'
+ { 1113, 9, 14, 11, 1, -8 }, // 0x71 'q'
+ { 1129, 6, 9, 6, 1, -8 }, // 0x72 'r'
+ { 1136, 6, 9, 8, 1, -8 }, // 0x73 's'
+ { 1143, 4, 12, 6, 1, -11 }, // 0x74 't'
+ { 1149, 7, 9, 9, 1, -8 }, // 0x75 'u'
+ { 1157, 9, 9, 9, 0, -8 }, // 0x76 'v'
+ { 1168, 14, 10, 14, 0, -9 }, // 0x77 'w'
+ { 1186, 10, 9, 10, 0, -8 }, // 0x78 'x'
+ { 1198, 9, 14, 10, 0, -8 }, // 0x79 'y'
+ { 1214, 9, 9, 9, 0, -8 }, // 0x7A 'z'
+ { 1225, 5, 19, 6, 1, -14 }, // 0x7B '{'
+ { 1237, 2, 17, 10, 4, -13 }, // 0x7C '|'
+ { 1242, 5, 19, 6, 0, -14 }, // 0x7D '}'
+ { 1254, 9, 3, 13, 2, -14 } }; // 0x7E '~'
+
+const GFXfont Futura9pt7b PROGMEM = {
+ (uint8_t *)Futura9pt7bBitmaps,
+ (GFXglyph *)Futura9pt7bGlyphs,
+ 0x20, 0x7E, 23 };
+
+// Approx. 1930 bytes
+const uint8_t GillSans9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFE, 0x0F, 0xDE, 0xF7, 0xBD, 0x80, 0x08, 0x82, 0x10, 0x42,
+ 0x7F, 0xF1, 0x08, 0x42, 0x08, 0x47, 0xFF, 0x21, 0x0C, 0x21, 0x08, 0x21,
+ 0x00, 0x18, 0x3C, 0xFE, 0xDA, 0xD8, 0xF8, 0x7C, 0x1E, 0x1B, 0x9B, 0xFF,
+ 0x7E, 0x18, 0x18, 0x70, 0x5F, 0x13, 0x64, 0x7C, 0x87, 0x20, 0x08, 0x01,
+ 0x00, 0x4E, 0x13, 0xE2, 0x6C, 0x8F, 0xA0, 0xE0, 0x1E, 0x07, 0xE0, 0xCC,
+ 0x19, 0x83, 0xE0, 0x30, 0x0F, 0x3B, 0x3E, 0xC3, 0x98, 0xF3, 0xF3, 0x3C,
+ 0x70, 0xFF, 0xC0, 0x18, 0x88, 0xC4, 0x63, 0x18, 0xC6, 0x30, 0x86, 0x10,
+ 0xC3, 0xC3, 0x08, 0x61, 0x0C, 0x63, 0x18, 0xC6, 0x23, 0x11, 0x18, 0x10,
+ 0x23, 0x5B, 0xE1, 0x0F, 0xB5, 0x88, 0x10, 0x08, 0x04, 0x02, 0x01, 0x0F,
+ 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xF6, 0xFF, 0xF0, 0x08, 0x44, 0x21,
+ 0x10, 0x88, 0x42, 0x21, 0x00, 0x38, 0xF9, 0xB6, 0x3C, 0x78, 0xF1, 0xE3,
+ 0xC6, 0xD9, 0xF1, 0xC0, 0xFF, 0xFF, 0xFF, 0x78, 0xFC, 0xCE, 0x86, 0x06,
+ 0x04, 0x0C, 0x18, 0x10, 0x20, 0x7F, 0xFF, 0x7B, 0xF8, 0xC3, 0x0C, 0xE3,
+ 0xC3, 0x0E, 0x3F, 0x9C, 0x06, 0x06, 0x0E, 0x1E, 0x36, 0x26, 0x66, 0xFF,
+ 0xFF, 0x06, 0x06, 0x06, 0x7C, 0xF9, 0x83, 0x07, 0x8F, 0x83, 0x83, 0x07,
+ 0x1F, 0xF3, 0xC0, 0x10, 0x70, 0xC3, 0x86, 0x1F, 0xBF, 0xE3, 0xC7, 0x8D,
+ 0xF1, 0xC0, 0xFF, 0xFE, 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x30,
+ 0x60, 0x60, 0x38, 0xFB, 0x1E, 0x3C, 0x67, 0x1F, 0x63, 0xC7, 0x8D, 0xF1,
+ 0xC0, 0x38, 0xFB, 0x1E, 0x3C, 0x6F, 0xCF, 0x86, 0x1C, 0x71, 0xC1, 0x00,
+ 0xF0, 0x0F, 0xF0, 0x0F, 0x60, 0x00, 0x83, 0xCF, 0xDF, 0x0C, 0x07, 0xC0,
+ 0xFC, 0x0F, 0x00, 0x80, 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x80, 0x78, 0x1F,
+ 0x81, 0xF0, 0x18, 0x7D, 0xF9, 0xE0, 0x80, 0x00, 0x6F, 0x33, 0x37, 0x66,
+ 0x20, 0x66, 0x07, 0xF0, 0x0F, 0xF8, 0x3C, 0x1C, 0x30, 0x06, 0x63, 0x9F,
+ 0x67, 0xF3, 0xC6, 0x73, 0xCC, 0x33, 0xCC, 0x33, 0xCC, 0x66, 0xCC, 0x6E,
+ 0xCF, 0xFC, 0x67, 0x78, 0x70, 0x03, 0x3C, 0x0E, 0x1F, 0xFC, 0x07, 0xF0,
+ 0x02, 0x00, 0x38, 0x01, 0xC0, 0x1B, 0x00, 0xD8, 0x0C, 0x60, 0x63, 0x07,
+ 0xFC, 0x3F, 0xE3, 0x01, 0x98, 0x0D, 0x80, 0x30, 0xFC, 0xFE, 0xC6, 0xC6,
+ 0xC6, 0xFC, 0xFE, 0xC3, 0xC3, 0xC3, 0xFE, 0xFC, 0x0F, 0xC7, 0xFD, 0xC0,
+ 0xB0, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0x60, 0x0E, 0x04, 0xFF, 0x87,
+ 0xE0, 0xFF, 0x0F, 0xFC, 0xC0, 0xEC, 0x06, 0xC0, 0x3C, 0x03, 0xC0, 0x3C,
+ 0x03, 0xC0, 0x6C, 0x0E, 0xFF, 0xCF, 0xF0, 0xFF, 0xFF, 0x06, 0x0C, 0x1F,
+ 0xFF, 0xE0, 0xC1, 0x83, 0xFF, 0xF0, 0xFF, 0xFC, 0x30, 0xC3, 0xFF, 0xF0,
+ 0xC3, 0x0C, 0x30, 0x0F, 0xC7, 0xFD, 0xC0, 0xB0, 0x0C, 0x01, 0x80, 0x30,
+ 0x7E, 0x0F, 0xE0, 0x6E, 0x0C, 0xFF, 0x87, 0xC0, 0xC0, 0x78, 0x0F, 0x01,
+ 0xE0, 0x3C, 0x07, 0xFF, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0,
+ 0x30, 0xFF, 0xFF, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xFE,
+ 0xC1, 0xB0, 0xCC, 0x63, 0x30, 0xD8, 0x3C, 0x0D, 0x83, 0x30, 0xC6, 0x30,
+ 0xCC, 0x1B, 0x03, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83,
+ 0xFF, 0xF0, 0xC0, 0xFC, 0x1F, 0xC7, 0xED, 0xBD, 0xF7, 0x9C, 0xF1, 0x1E,
+ 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x30, 0xC0, 0x3E, 0x03, 0xF0, 0x3D,
+ 0x83, 0xCC, 0x3C, 0x63, 0xC6, 0x3C, 0x33, 0xC1, 0xBC, 0x0F, 0xC0, 0x7C,
+ 0x03, 0x0F, 0x81, 0xFF, 0x1C, 0x1C, 0xC0, 0x6C, 0x01, 0xE0, 0x0F, 0x00,
+ 0x78, 0x03, 0x60, 0x33, 0x83, 0x8F, 0xF8, 0x1F, 0x00, 0xFC, 0xFE, 0xC3,
+ 0xC3, 0xC3, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, 0x81, 0xFF,
+ 0x1C, 0x1C, 0xC0, 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xE0, 0x33,
+ 0x83, 0x8F, 0xF8, 0x3F, 0x00, 0x3F, 0x80, 0x78, 0xF8, 0x7E, 0x31, 0x98,
+ 0xCC, 0x67, 0xE3, 0xE1, 0x98, 0xC6, 0x63, 0x30, 0xD8, 0x30, 0x7B, 0xFC,
+ 0x70, 0xC1, 0xC3, 0x83, 0x0E, 0x3F, 0xDE, 0xFF, 0xFF, 0xF0, 0xC0, 0x30,
+ 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0xC0, 0x78,
+ 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x7C, 0x1D,
+ 0xFF, 0x0F, 0x80, 0xC0, 0x6C, 0x19, 0x83, 0x30, 0x63, 0x18, 0x63, 0x06,
+ 0xC0, 0xD8, 0x0E, 0x01, 0xC0, 0x38, 0x02, 0x00, 0xC0, 0xE0, 0x6C, 0x1C,
+ 0x19, 0x86, 0x83, 0x38, 0xD8, 0xE3, 0x1B, 0x18, 0x66, 0x33, 0x06, 0xC6,
+ 0xC0, 0xD8, 0xD8, 0x0E, 0x0E, 0x01, 0xC1, 0xC0, 0x38, 0x38, 0x02, 0x02,
+ 0x00, 0xC0, 0x1B, 0x01, 0x8C, 0x18, 0x31, 0x80, 0xD8, 0x03, 0x80, 0x1C,
+ 0x01, 0xB0, 0x18, 0xC1, 0x83, 0x18, 0x0D, 0x80, 0x70, 0xC0, 0x6C, 0x18,
+ 0xC6, 0x0C, 0xC0, 0xF0, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18,
+ 0x03, 0x00, 0x7F, 0xEF, 0xF8, 0x06, 0x01, 0x80, 0x70, 0x0C, 0x03, 0x00,
+ 0xC0, 0x18, 0x06, 0x01, 0xFF, 0xFF, 0xF0, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC,
+ 0xCC, 0xCC, 0xFF, 0x84, 0x10, 0x84, 0x10, 0x82, 0x10, 0x82, 0x10, 0xFF,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xFF, 0x38, 0x71, 0xB3, 0x66, 0xD8,
+ 0xF1, 0x80, 0xFF, 0xC0, 0xCC, 0x80, 0x79, 0xFA, 0x30, 0xE6, 0xD9, 0xB3,
+ 0x3F, 0xC1, 0x83, 0x06, 0x0D, 0xDF, 0xB3, 0xE3, 0xC7, 0x9F, 0xF7, 0xC0,
+ 0x3D, 0xFE, 0x30, 0xC3, 0x87, 0xCF, 0x06, 0x0C, 0x18, 0x33, 0xEF, 0xF9,
+ 0xE3, 0xC7, 0x8D, 0xF9, 0xF0, 0x38, 0xFB, 0x1F, 0xFC, 0x1C, 0x1F, 0x9F,
+ 0x3B, 0xD8, 0xCF, 0x79, 0x8C, 0x63, 0x18, 0xC0, 0x7F, 0x9F, 0x36, 0x67,
+ 0x98, 0x3C, 0x3E, 0xCF, 0x0F, 0x3B, 0xE0, 0xC1, 0x83, 0x06, 0x0D, 0xDF,
+ 0xF9, 0xE3, 0xC7, 0x8F, 0x1E, 0x30, 0xF3, 0xFF, 0xFC, 0x6C, 0x36, 0xDB,
+ 0x6D, 0xB7, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC6, 0xCC, 0xD8, 0xF0, 0xD8,
+ 0xCC, 0xC6, 0xC3, 0xFF, 0xFF, 0xFF, 0xDC, 0xEF, 0xFF, 0xC6, 0x3C, 0x63,
+ 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xDD, 0xFF, 0x1E, 0x3C, 0x78, 0xF1,
+ 0xE3, 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0xF9, 0xFB, 0x3E,
+ 0x3C, 0x79, 0xFF, 0x7C, 0xC1, 0x83, 0x06, 0x00, 0x3E, 0xFF, 0x9E, 0x3C,
+ 0x7C, 0xDF, 0x9F, 0x06, 0x0C, 0x18, 0x30, 0xDB, 0xFE, 0xB0, 0xC3, 0x0C,
+ 0x30, 0x77, 0xF2, 0xC3, 0x4F, 0xEE, 0x00, 0x87, 0xFF, 0x61, 0x86, 0x18,
+ 0x7C, 0xF0, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xFF, 0xBB, 0xC7, 0x8D, 0xB3,
+ 0x66, 0xC7, 0x8E, 0x1C, 0xC7, 0x1E, 0x38, 0xD9, 0xCC, 0xDB, 0x66, 0xDB,
+ 0x1C, 0x70, 0xE3, 0x86, 0x0C, 0xC1, 0xB1, 0x8D, 0x83, 0x81, 0xC1, 0xB1,
+ 0x8D, 0x83, 0xC3, 0x66, 0x66, 0x3C, 0x3C, 0x18, 0x18, 0x30, 0x30, 0x60,
+ 0x60, 0xC0, 0xFF, 0xF8, 0x70, 0xC3, 0x0E, 0x1F, 0xFF, 0x1C, 0xF3, 0x0C,
+ 0x30, 0xC3, 0x18, 0x83, 0x87, 0x0C, 0x30, 0xC3, 0x0F, 0x1C, 0xFF, 0xFF,
+ 0xE3, 0xC3, 0x0C, 0x30, 0xC3, 0x06, 0x04, 0x73, 0x8C, 0x30, 0xC3, 0x3C,
+ 0xE0, 0xF8, 0xC7, 0xC0 };
+
+const GFXglyph GillSans9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 5, 0, 0 }, // 0x20 ' '
+ { 1, 2, 12, 5, 1, -11 }, // 0x21 '!'
+ { 4, 5, 5, 6, 1, -11 }, // 0x22 '"'
+ { 8, 11, 12, 11, 0, -11 }, // 0x23 '#'
+ { 25, 8, 14, 10, 1, -11 }, // 0x24 '$'
+ { 39, 11, 12, 12, 0, -11 }, // 0x25 '%'
+ { 56, 11, 12, 11, 1, -11 }, // 0x26 '&'
+ { 73, 2, 5, 3, 1, -11 }, // 0x27 '''
+ { 75, 5, 16, 6, 1, -11 }, // 0x28 '('
+ { 85, 5, 16, 6, 0, -11 }, // 0x29 ')'
+ { 95, 7, 9, 8, 0, -12 }, // 0x2A '*'
+ { 103, 9, 9, 11, 1, -10 }, // 0x2B '+'
+ { 114, 2, 4, 4, 1, -1 }, // 0x2C ','
+ { 115, 4, 2, 6, 1, -4 }, // 0x2D '-'
+ { 116, 2, 2, 4, 1, -1 }, // 0x2E '.'
+ { 117, 5, 12, 5, 0, -11 }, // 0x2F '/'
+ { 125, 7, 12, 9, 1, -11 }, // 0x30 '0'
+ { 136, 2, 12, 9, 3, -11 }, // 0x31 '1'
+ { 139, 8, 12, 9, 1, -11 }, // 0x32 '2'
+ { 151, 6, 12, 9, 1, -11 }, // 0x33 '3'
+ { 160, 8, 12, 9, 0, -11 }, // 0x34 '4'
+ { 172, 7, 12, 9, 1, -11 }, // 0x35 '5'
+ { 183, 7, 12, 9, 1, -11 }, // 0x36 '6'
+ { 194, 8, 12, 9, 1, -11 }, // 0x37 '7'
+ { 206, 7, 12, 9, 1, -11 }, // 0x38 '8'
+ { 217, 7, 12, 9, 1, -11 }, // 0x39 '9'
+ { 228, 2, 8, 4, 1, -7 }, // 0x3A ':'
+ { 230, 2, 10, 4, 1, -7 }, // 0x3B ';'
+ { 233, 9, 9, 11, 1, -10 }, // 0x3C '<'
+ { 244, 9, 4, 11, 1, -8 }, // 0x3D '='
+ { 249, 9, 9, 11, 1, -10 }, // 0x3E '>'
+ { 260, 4, 12, 6, 1, -11 }, // 0x3F '?'
+ { 266, 16, 17, 18, 1, -12 }, // 0x40 '@'
+ { 300, 13, 12, 12, 0, -11 }, // 0x41 'A'
+ { 320, 8, 12, 10, 1, -11 }, // 0x42 'B'
+ { 332, 11, 12, 13, 1, -11 }, // 0x43 'C'
+ { 349, 12, 12, 14, 1, -11 }, // 0x44 'D'
+ { 367, 7, 12, 9, 1, -11 }, // 0x45 'E'
+ { 378, 6, 12, 8, 1, -11 }, // 0x46 'F'
+ { 387, 11, 12, 13, 1, -11 }, // 0x47 'G'
+ { 404, 11, 12, 13, 1, -11 }, // 0x48 'H'
+ { 421, 2, 12, 5, 1, -11 }, // 0x49 'I'
+ { 424, 4, 16, 5, -1, -11 }, // 0x4A 'J'
+ { 432, 10, 12, 12, 1, -11 }, // 0x4B 'K'
+ { 447, 7, 12, 9, 1, -11 }, // 0x4C 'L'
+ { 458, 11, 12, 14, 1, -11 }, // 0x4D 'M'
+ { 475, 12, 12, 14, 1, -11 }, // 0x4E 'N'
+ { 493, 13, 12, 15, 1, -11 }, // 0x4F 'O'
+ { 513, 8, 12, 9, 1, -11 }, // 0x50 'P'
+ { 525, 13, 14, 15, 1, -11 }, // 0x51 'Q'
+ { 548, 9, 12, 11, 1, -11 }, // 0x52 'R'
+ { 562, 6, 12, 8, 1, -11 }, // 0x53 'S'
+ { 571, 10, 12, 11, 0, -11 }, // 0x54 'T'
+ { 586, 11, 12, 13, 1, -11 }, // 0x55 'U'
+ { 603, 11, 12, 11, 0, -11 }, // 0x56 'V'
+ { 620, 19, 12, 19, 0, -11 }, // 0x57 'W'
+ { 649, 13, 12, 13, 0, -11 }, // 0x58 'X'
+ { 669, 11, 12, 11, 0, -11 }, // 0x59 'Y'
+ { 686, 11, 12, 12, 0, -11 }, // 0x5A 'Z'
+ { 703, 4, 16, 6, 2, -11 }, // 0x5B '['
+ { 711, 5, 12, 5, 0, -11 }, // 0x5C '\'
+ { 719, 4, 16, 6, 0, -11 }, // 0x5D ']'
+ { 727, 7, 7, 8, 0, -11 }, // 0x5E '^'
+ { 734, 10, 1, 10, 0, 4 }, // 0x5F '_'
+ { 736, 3, 3, 6, 1, -12 }, // 0x60 '`'
+ { 738, 7, 8, 8, 1, -7 }, // 0x61 'a'
+ { 745, 7, 12, 9, 1, -11 }, // 0x62 'b'
+ { 756, 6, 8, 8, 1, -7 }, // 0x63 'c'
+ { 762, 7, 12, 9, 1, -11 }, // 0x64 'd'
+ { 773, 7, 8, 9, 1, -7 }, // 0x65 'e'
+ { 780, 5, 12, 5, 0, -11 }, // 0x66 'f'
+ { 788, 7, 12, 8, 1, -7 }, // 0x67 'g'
+ { 799, 7, 12, 9, 1, -11 }, // 0x68 'h'
+ { 810, 2, 11, 4, 1, -10 }, // 0x69 'i'
+ { 813, 3, 15, 4, 0, -10 }, // 0x6A 'j'
+ { 819, 8, 12, 9, 1, -11 }, // 0x6B 'k'
+ { 831, 2, 12, 4, 1, -11 }, // 0x6C 'l'
+ { 834, 12, 8, 14, 1, -7 }, // 0x6D 'm'
+ { 846, 7, 8, 9, 1, -7 }, // 0x6E 'n'
+ { 853, 8, 8, 10, 1, -7 }, // 0x6F 'o'
+ { 861, 7, 12, 9, 1, -7 }, // 0x70 'p'
+ { 872, 7, 12, 9, 1, -7 }, // 0x71 'q'
+ { 883, 6, 8, 7, 1, -7 }, // 0x72 'r'
+ { 889, 5, 8, 7, 1, -7 }, // 0x73 's'
+ { 894, 6, 10, 6, 0, -9 }, // 0x74 't'
+ { 902, 7, 8, 9, 1, -7 }, // 0x75 'u'
+ { 909, 7, 8, 8, 0, -7 }, // 0x76 'v'
+ { 916, 13, 8, 13, 0, -7 }, // 0x77 'w'
+ { 929, 9, 8, 9, 0, -7 }, // 0x78 'x'
+ { 938, 8, 12, 8, 0, -7 }, // 0x79 'y'
+ { 950, 7, 8, 8, 0, -7 }, // 0x7A 'z'
+ { 957, 6, 17, 6, 0, -12 }, // 0x7B '{'
+ { 970, 1, 16, 5, 2, -11 }, // 0x7C '|'
+ { 972, 6, 17, 6, 0, -12 }, // 0x7D '}'
+ { 985, 9, 2, 11, 1, -6 } }; // 0x7E '~'
+
+const GFXfont GillSans9pt7b PROGMEM = {
+ (uint8_t *)GillSans9pt7bBitmaps,
+ (GFXglyph *)GillSans9pt7bGlyphs,
+ 0x20, 0x7E, 20 };
+
+// Approx. 1660 bytes
+const uint8_t ptmono9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xCF, 0xC0, 0xCF, 0x3C, 0xF3, 0xCE, 0x20, 0x1D, 0xC6,
+ 0x61, 0x99, 0xFF, 0x7F, 0xCC, 0xC3, 0x33, 0xFE, 0xFF, 0x8C, 0xC6, 0x61,
+ 0x98, 0x18, 0x18, 0x3E, 0x7E, 0xCA, 0xC8, 0xE8, 0x78, 0x7E, 0x1F, 0x17,
+ 0x13, 0x93, 0xFE, 0xFC, 0x18, 0x18, 0x70, 0x5F, 0x0F, 0x63, 0x6C, 0xCF,
+ 0xB0, 0xEC, 0x01, 0x00, 0x6E, 0x1B, 0xE6, 0x6D, 0x8D, 0xE1, 0xF4, 0x1C,
+ 0x3C, 0x1F, 0x86, 0x61, 0x98, 0x3C, 0x0E, 0x07, 0x8F, 0x33, 0xC6, 0xF0,
+ 0xEE, 0x39, 0xFF, 0x3C, 0x40, 0xFF, 0xE0, 0x06, 0x3C, 0xE3, 0x86, 0x1C,
+ 0x30, 0x60, 0xC1, 0x83, 0x07, 0x06, 0x0E, 0x0E, 0x0F, 0x06, 0xC1, 0xE0,
+ 0xE0, 0xE0, 0xC1, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x70, 0xC3, 0x8E, 0x78,
+ 0xC0, 0x22, 0x3B, 0x85, 0x1F, 0xFF, 0xF8, 0xA1, 0xD8, 0x46, 0x18, 0x18,
+ 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x67, 0x71, 0x2C, 0xFF,
+ 0xC0, 0xFF, 0x80, 0x02, 0x03, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x18,
+ 0x30, 0x30, 0x70, 0x60, 0x60, 0xC0, 0x40, 0x3E, 0x3F, 0x98, 0xD8, 0x3C,
+ 0x7E, 0x7F, 0x77, 0xF3, 0xE1, 0xE0, 0xD8, 0xCF, 0xE3, 0xE0, 0x18, 0x38,
+ 0x78, 0xD8, 0x98, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x7C,
+ 0xFE, 0x47, 0x03, 0x03, 0x03, 0x06, 0x0C, 0x18, 0x38, 0x60, 0xFF, 0xFF,
+ 0xFE, 0xFE, 0x0C, 0x1C, 0x18, 0x3E, 0x3F, 0x07, 0x03, 0x03, 0x87, 0xFE,
+ 0xFC, 0x03, 0x01, 0xC0, 0xF0, 0x7C, 0x3B, 0x0C, 0xC6, 0x33, 0xFF, 0xFF,
+ 0xC0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0x7F, 0x7F, 0x60, 0x60, 0x60, 0x7C,
+ 0x7E, 0x07, 0x03, 0x03, 0x87, 0xFE, 0xFC, 0x06, 0x0F, 0x0E, 0x0E, 0x06,
+ 0x06, 0xF3, 0xFD, 0xC7, 0xC1, 0xE0, 0xF8, 0xEF, 0xE3, 0xE0, 0xFF, 0xFF,
+ 0x07, 0x06, 0x0E, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, 0xE0, 0x3E,
+ 0x3F, 0xF8, 0xF8, 0x3E, 0x31, 0xF0, 0xFC, 0xCF, 0xC1, 0xE0, 0xF8, 0xEF,
+ 0xE3, 0xE0, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x1F, 0x0D, 0xFE, 0x7B, 0x03,
+ 0x01, 0x83, 0x87, 0x83, 0x80, 0xFF, 0x80, 0x07, 0xFC, 0x77, 0x70, 0x00,
+ 0x06, 0x77, 0x12, 0xC0, 0x01, 0x01, 0xC3, 0xC7, 0x87, 0x07, 0x01, 0xE0,
+ 0x78, 0x0F, 0x01, 0xC0, 0x40, 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xFC,
+ 0x40, 0x70, 0x1E, 0x03, 0xC0, 0x70, 0x1C, 0x3C, 0x3C, 0x78, 0x70, 0x10,
+ 0x00, 0x3E, 0x3F, 0xF0, 0x60, 0x30, 0x38, 0x38, 0x38, 0x30, 0x18, 0x00,
+ 0x06, 0x03, 0x81, 0x80, 0x0F, 0x07, 0xF1, 0xC3, 0x30, 0x6E, 0x0D, 0x9F,
+ 0xB7, 0xF6, 0xC6, 0xD8, 0xDB, 0xFF, 0xBB, 0xB0, 0x07, 0x88, 0x7F, 0x83,
+ 0xF0, 0x0C, 0x03, 0x01, 0xE0, 0x78, 0x1E, 0x0C, 0xC3, 0x30, 0xCC, 0x7F,
+ 0x9F, 0xE6, 0x1B, 0x03, 0xC0, 0xC0, 0xFE, 0x7F, 0xF0, 0x78, 0x3C, 0x37,
+ 0xF3, 0xFD, 0x87, 0xC1, 0xE0, 0xF0, 0xFF, 0xEF, 0xE0, 0x1F, 0x9F, 0xDC,
+ 0x6C, 0x3C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x70, 0xDC, 0x67, 0xF1, 0xF0,
+ 0xFC, 0x7F, 0xB0, 0xD8, 0x7C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE1, 0xF1,
+ 0xDF, 0xCF, 0xC0, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x1F, 0x9F, 0xDC, 0x6C, 0x3C, 0x06, 0x03,
+ 0x1F, 0x8F, 0xC1, 0xB0, 0xDC, 0x67, 0xF1, 0xF0, 0xC1, 0xE0, 0xF0, 0x78,
+ 0x3C, 0x1F, 0xFF, 0xFF, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x18, 0xFF,
+ 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x87, 0xFE,
+ 0x7C, 0xC1, 0xF0, 0xEC, 0x73, 0x1C, 0xCE, 0x3F, 0x0F, 0xC3, 0x38, 0xC6,
+ 0x31, 0xCC, 0x3B, 0x0E, 0xC1, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC1, 0xF1, 0xFD, 0xFE, 0xFF,
+ 0xFE, 0xEF, 0x27, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x18, 0xC1, 0xF0,
+ 0xF8, 0x7E, 0x3F, 0x9F, 0xCF, 0x77, 0xBF, 0xCF, 0xE3, 0xF1, 0xF8, 0x7C,
+ 0x18, 0x1E, 0x1F, 0xE6, 0x1B, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0,
+ 0xF0, 0x36, 0x19, 0xFE, 0x1E, 0x00, 0xFE, 0x7F, 0xB0, 0xF8, 0x3C, 0x1E,
+ 0x0F, 0x0F, 0xFE, 0xFC, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x1E, 0x1F, 0xE6,
+ 0x1B, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x36, 0x19, 0xFE,
+ 0x1E, 0x03, 0x00, 0x7C, 0x0F, 0xFC, 0x7F, 0x31, 0xD8, 0x6C, 0x36, 0x3B,
+ 0xF9, 0xF8, 0xCE, 0x67, 0x31, 0xD8, 0xEC, 0x38, 0x3F, 0xBF, 0xF0, 0x78,
+ 0x3E, 0x03, 0xC0, 0xF8, 0x1F, 0x01, 0xE0, 0xF0, 0xFF, 0xE7, 0xE0, 0xFF,
+ 0xFF, 0xFC, 0xCF, 0x33, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00,
+ 0xC0, 0xFC, 0x3F, 0x00, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07,
+ 0x83, 0xC1, 0xE0, 0xF8, 0xEF, 0xE3, 0xE0, 0xE1, 0xF8, 0x76, 0x19, 0xC6,
+ 0x73, 0x8C, 0xC3, 0x30, 0xEC, 0x3F, 0x07, 0x81, 0xE0, 0x78, 0x0E, 0x00,
+ 0xC0, 0x78, 0x0F, 0x01, 0xF0, 0x3E, 0x66, 0xDD, 0x9B, 0xB3, 0x5E, 0x7B,
+ 0xCF, 0x79, 0xC7, 0x38, 0xE7, 0x1C, 0xE0, 0xEE, 0x38, 0xE6, 0x1D, 0xC1,
+ 0xF0, 0x3E, 0x03, 0x80, 0xF8, 0x1B, 0x07, 0x71, 0xC7, 0x38, 0xEE, 0x0E,
+ 0xE1, 0xD8, 0x67, 0x38, 0xCC, 0x3F, 0x07, 0x81, 0xE0, 0x30, 0x0C, 0x03,
+ 0x00, 0xC0, 0x30, 0x0C, 0x00, 0xFF, 0xFF, 0xC0, 0xE0, 0xE0, 0xE0, 0x60,
+ 0x70, 0x70, 0x70, 0x38, 0x38, 0x1F, 0xFF, 0xF8, 0xFF, 0xFF, 0x06, 0x0C,
+ 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x7F, 0xFE, 0x40,
+ 0xC0, 0x60, 0x60, 0x30, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x0C, 0x06,
+ 0x06, 0x03, 0x02, 0xFF, 0xFC, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C,
+ 0x18, 0x30, 0x60, 0xC1, 0xFF, 0xFE, 0x0C, 0x03, 0x81, 0xE0, 0xCC, 0x33,
+ 0x18, 0x6E, 0x1C, 0xFF, 0xFF, 0xE7, 0x30, 0x7E, 0x3F, 0x80, 0xC7, 0xEF,
+ 0xF6, 0x1B, 0x0D, 0xFF, 0x7B, 0x80, 0xE0, 0x38, 0x06, 0x01, 0x80, 0x6F,
+ 0x1F, 0xE7, 0x1D, 0x83, 0x60, 0xD8, 0x36, 0x1D, 0xFE, 0x3E, 0x00, 0x1F,
+ 0x3F, 0xF8, 0x78, 0x3C, 0x06, 0x03, 0x84, 0xFF, 0x3F, 0x00, 0x03, 0x80,
+ 0xE0, 0x18, 0x06, 0x1F, 0x9F, 0xEE, 0x1B, 0x06, 0xC1, 0xB0, 0x6E, 0x39,
+ 0xFF, 0x3C, 0xC0, 0x3E, 0x3F, 0xB0, 0x7F, 0xFF, 0xFE, 0x03, 0x84, 0xFF,
+ 0x3F, 0x00, 0x0F, 0x8F, 0xCC, 0x46, 0x0F, 0xF7, 0xF8, 0xC0, 0x60, 0x30,
+ 0x18, 0x0C, 0x1F, 0xEF, 0xF0, 0x3F, 0xBF, 0xF8, 0x78, 0x3C, 0x1E, 0x0F,
+ 0x8E, 0xFF, 0x3F, 0x80, 0xC8, 0xEF, 0xE3, 0xE0, 0xE0, 0x70, 0x18, 0x0C,
+ 0x06, 0xF3, 0xFD, 0xC6, 0xC3, 0x61, 0xB0, 0xD8, 0x6C, 0x36, 0x18, 0x1C,
+ 0x1C, 0x1C, 0x00, 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF,
+ 0x0E, 0x1C, 0x38, 0x07, 0xEF, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60,
+ 0xE3, 0xFE, 0x78, 0xE0, 0x38, 0x06, 0x01, 0x80, 0x63, 0x99, 0xC6, 0xE1,
+ 0xB0, 0x7C, 0x1B, 0x86, 0x71, 0x9F, 0x63, 0xC0, 0xF0, 0xF0, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F, 0x1E, 0xFB, 0xBF, 0xFC,
+ 0xCF, 0x33, 0xCC, 0xF3, 0x3C, 0xCF, 0x33, 0xCC, 0xC0, 0xEF, 0x7F, 0xDC,
+ 0xEC, 0x36, 0x1B, 0x0D, 0x86, 0xC3, 0x61, 0x80, 0x3F, 0x1F, 0xEE, 0x1F,
+ 0x03, 0xC0, 0xF0, 0x3E, 0x1D, 0xFE, 0x3F, 0x00, 0xEF, 0x3F, 0xE7, 0x1D,
+ 0x83, 0x60, 0xD8, 0x36, 0x1D, 0xFE, 0x7F, 0x18, 0x06, 0x01, 0x80, 0x60,
+ 0x00, 0x1F, 0xBF, 0xF8, 0x78, 0x3C, 0x1E, 0x0F, 0x8E, 0xFF, 0x3D, 0x80,
+ 0xC0, 0x60, 0x30, 0x18, 0xF7, 0x7F, 0xCE, 0x66, 0x03, 0x01, 0x80, 0xC1,
+ 0xFE, 0xFF, 0x00, 0x7E, 0xFF, 0xC2, 0xF0, 0x7E, 0x07, 0x43, 0xFF, 0x3E,
+ 0x10, 0x0C, 0x03, 0x03, 0xFE, 0xFF, 0x8C, 0x03, 0x00, 0xC0, 0x30, 0x0E,
+ 0x21, 0xFC, 0x3C, 0xE3, 0xB8, 0xE6, 0x19, 0x86, 0x61, 0x98, 0x66, 0x39,
+ 0xFF, 0x3C, 0xC0, 0xE1, 0xD8, 0x67, 0x18, 0xCE, 0x3B, 0x0E, 0xC1, 0xE0,
+ 0x78, 0x0E, 0x00, 0xC0, 0x7C, 0x0D, 0x9B, 0x37, 0x66, 0xEC, 0xDF, 0x9E,
+ 0xF1, 0xDC, 0x39, 0x80, 0xE3, 0xB9, 0x8D, 0x87, 0xC1, 0xC1, 0xF1, 0xDC,
+ 0xC6, 0xE3, 0x80, 0xE1, 0xD8, 0x76, 0x19, 0xC6, 0x33, 0x8E, 0xC1, 0xB0,
+ 0x7C, 0x0E, 0x01, 0x84, 0xE1, 0xF0, 0x38, 0x00, 0xFF, 0xFF, 0x06, 0x0C,
+ 0x18, 0x30, 0x60, 0xFF, 0xFF, 0x0F, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18,
+ 0x38, 0xF0, 0xF0, 0x38, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x0F, 0xFF, 0xFF,
+ 0xFF, 0xFC, 0xF0, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x0F, 0x0F,
+ 0x1C, 0x18, 0x18, 0x18, 0x18, 0xF8, 0xF0, 0x72, 0xFF, 0x8F };
+
+const GFXglyph ptmono9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 11, 0, 0 }, // 0x20 ' '
+ { 1, 2, 13, 11, 4, -12 }, // 0x21 '!'
+ { 5, 6, 6, 11, 2, -12 }, // 0x22 '"'
+ { 10, 10, 12, 11, 0, -11 }, // 0x23 '#'
+ { 25, 8, 17, 11, 1, -14 }, // 0x24 '$'
+ { 42, 11, 13, 11, 0, -12 }, // 0x25 '%'
+ { 60, 10, 13, 11, 0, -12 }, // 0x26 '&'
+ { 77, 2, 6, 11, 4, -12 }, // 0x27 '''
+ { 79, 7, 17, 11, 2, -12 }, // 0x28 '('
+ { 94, 7, 17, 11, 2, -12 }, // 0x29 ')'
+ { 109, 9, 8, 11, 1, -12 }, // 0x2A '*'
+ { 118, 8, 10, 11, 1, -10 }, // 0x2B '+'
+ { 128, 4, 6, 11, 3, -2 }, // 0x2C ','
+ { 131, 5, 2, 11, 3, -5 }, // 0x2D '-'
+ { 133, 3, 3, 11, 4, -2 }, // 0x2E '.'
+ { 135, 8, 16, 11, 1, -12 }, // 0x2F '/'
+ { 151, 9, 13, 11, 1, -12 }, // 0x30 '0'
+ { 166, 8, 13, 11, 2, -12 }, // 0x31 '1'
+ { 179, 8, 13, 11, 1, -12 }, // 0x32 '2'
+ { 192, 8, 13, 11, 2, -12 }, // 0x33 '3'
+ { 205, 10, 13, 11, 0, -12 }, // 0x34 '4'
+ { 222, 8, 13, 11, 1, -12 }, // 0x35 '5'
+ { 235, 9, 13, 11, 1, -12 }, // 0x36 '6'
+ { 250, 8, 13, 11, 1, -12 }, // 0x37 '7'
+ { 263, 9, 13, 11, 1, -12 }, // 0x38 '8'
+ { 278, 9, 13, 11, 1, -12 }, // 0x39 '9'
+ { 293, 3, 10, 11, 4, -9 }, // 0x3A ':'
+ { 297, 4, 13, 11, 3, -9 }, // 0x3B ';'
+ { 304, 9, 11, 11, 1, -10 }, // 0x3C '<'
+ { 317, 9, 6, 11, 1, -8 }, // 0x3D '='
+ { 324, 9, 11, 11, 1, -10 }, // 0x3E '>'
+ { 337, 9, 13, 11, 1, -12 }, // 0x3F '?'
+ { 352, 11, 15, 11, 0, -10 }, // 0x40 '@'
+ { 373, 10, 13, 11, 0, -12 }, // 0x41 'A'
+ { 390, 9, 13, 11, 1, -12 }, // 0x42 'B'
+ { 405, 9, 13, 11, 1, -12 }, // 0x43 'C'
+ { 420, 9, 13, 11, 1, -12 }, // 0x44 'D'
+ { 435, 8, 13, 11, 1, -12 }, // 0x45 'E'
+ { 448, 8, 13, 11, 2, -12 }, // 0x46 'F'
+ { 461, 9, 13, 11, 1, -12 }, // 0x47 'G'
+ { 476, 9, 13, 11, 1, -12 }, // 0x48 'H'
+ { 491, 8, 13, 11, 1, -12 }, // 0x49 'I'
+ { 504, 8, 13, 11, 1, -12 }, // 0x4A 'J'
+ { 517, 10, 13, 11, 1, -12 }, // 0x4B 'K'
+ { 534, 8, 13, 11, 2, -12 }, // 0x4C 'L'
+ { 547, 9, 13, 11, 1, -12 }, // 0x4D 'M'
+ { 562, 9, 13, 11, 1, -12 }, // 0x4E 'N'
+ { 577, 10, 13, 11, 0, -12 }, // 0x4F 'O'
+ { 594, 9, 13, 11, 1, -12 }, // 0x50 'P'
+ { 609, 10, 16, 11, 0, -12 }, // 0x51 'Q'
+ { 629, 9, 13, 11, 1, -12 }, // 0x52 'R'
+ { 644, 9, 13, 11, 1, -12 }, // 0x53 'S'
+ { 659, 10, 13, 11, 0, -12 }, // 0x54 'T'
+ { 676, 9, 13, 11, 1, -12 }, // 0x55 'U'
+ { 691, 10, 13, 11, 0, -12 }, // 0x56 'V'
+ { 708, 11, 13, 11, 0, -12 }, // 0x57 'W'
+ { 726, 11, 13, 11, 0, -12 }, // 0x58 'X'
+ { 744, 10, 13, 11, 0, -12 }, // 0x59 'Y'
+ { 761, 9, 13, 11, 1, -12 }, // 0x5A 'Z'
+ { 776, 7, 17, 11, 2, -12 }, // 0x5B '['
+ { 791, 8, 16, 11, 1, -12 }, // 0x5C '\'
+ { 807, 7, 17, 11, 2, -12 }, // 0x5D ']'
+ { 822, 10, 7, 11, 0, -12 }, // 0x5E '^'
+ { 831, 8, 2, 11, 1, 3 }, // 0x5F '_'
+ { 833, 4, 3, 11, 3, -12 }, // 0x60 '`'
+ { 835, 9, 9, 11, 1, -8 }, // 0x61 'a'
+ { 846, 10, 13, 11, 0, -12 }, // 0x62 'b'
+ { 863, 9, 9, 11, 1, -8 }, // 0x63 'c'
+ { 874, 10, 13, 11, 0, -12 }, // 0x64 'd'
+ { 891, 9, 9, 11, 1, -8 }, // 0x65 'e'
+ { 902, 9, 13, 11, 1, -12 }, // 0x66 'f'
+ { 917, 9, 13, 11, 1, -8 }, // 0x67 'g'
+ { 932, 9, 13, 11, 0, -12 }, // 0x68 'h'
+ { 947, 8, 13, 11, 1, -12 }, // 0x69 'i'
+ { 960, 7, 17, 11, 1, -12 }, // 0x6A 'j'
+ { 975, 10, 13, 11, 1, -12 }, // 0x6B 'k'
+ { 992, 8, 13, 11, 1, -12 }, // 0x6C 'l'
+ { 1005, 10, 9, 11, 0, -8 }, // 0x6D 'm'
+ { 1017, 9, 9, 11, 1, -8 }, // 0x6E 'n'
+ { 1028, 10, 9, 11, 0, -8 }, // 0x6F 'o'
+ { 1040, 10, 13, 11, 0, -8 }, // 0x70 'p'
+ { 1057, 9, 13, 11, 1, -8 }, // 0x71 'q'
+ { 1072, 9, 9, 11, 1, -8 }, // 0x72 'r'
+ { 1083, 8, 9, 11, 1, -8 }, // 0x73 's'
+ { 1092, 10, 12, 11, 0, -11 }, // 0x74 't'
+ { 1107, 10, 9, 11, 0, -8 }, // 0x75 'u'
+ { 1119, 10, 9, 11, 0, -8 }, // 0x76 'v'
+ { 1131, 11, 9, 11, 0, -8 }, // 0x77 'w'
+ { 1144, 9, 9, 11, 1, -8 }, // 0x78 'x'
+ { 1155, 10, 13, 11, 0, -8 }, // 0x79 'y'
+ { 1172, 8, 9, 11, 1, -8 }, // 0x7A 'z'
+ { 1181, 8, 17, 11, 1, -12 }, // 0x7B '{'
+ { 1198, 2, 15, 11, 4, -12 }, // 0x7C '|'
+ { 1202, 8, 17, 11, 2, -12 }, // 0x7D '}'
+ { 1219, 8, 3, 11, 1, -7 } }; // 0x7E '~'
+
+const GFXfont ptmono9pt7b PROGMEM = {
+ (uint8_t *)ptmono9pt7bBitmaps,
+ (GFXglyph *)ptmono9pt7bGlyphs,
+ 0x20, 0x7E, 20 };
+
+// Approx. 1894 bytes
+const uint8_t SourceCodePro_Regular9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0x49, 0x24, 0x90, 0x1B, 0xE0, 0xCF, 0x34, 0x51, 0x45, 0x10, 0x24,
+ 0x48, 0x97, 0xF4, 0x48, 0xBF, 0xA4, 0x48, 0x91, 0x20, 0x10, 0x21, 0xF6,
+ 0x38, 0x18, 0x1E, 0x0E, 0x06, 0x06, 0x1B, 0xE1, 0x02, 0x04, 0x00, 0x38,
+ 0x13, 0x14, 0x4D, 0x16, 0x4D, 0x0E, 0x80, 0x38, 0x13, 0x14, 0x49, 0x16,
+ 0x4F, 0x0E, 0x38, 0x32, 0x11, 0x0D, 0x83, 0x81, 0x85, 0xC3, 0xB3, 0x8D,
+ 0x43, 0x31, 0xEF, 0x10, 0xF5, 0x50, 0x11, 0xD8, 0x8C, 0x42, 0x10, 0x84,
+ 0x21, 0x84, 0x30, 0xC3, 0xC3, 0x08, 0x21, 0x0C, 0x21, 0x08, 0x46, 0x21,
+ 0x11, 0x98, 0x10, 0x22, 0x4B, 0xE3, 0x8D, 0x11, 0x00, 0x10, 0x20, 0x40,
+ 0x8F, 0xE2, 0x04, 0x08, 0x10, 0xFF, 0x97, 0xA0, 0xFC, 0xFF, 0x80, 0x02,
+ 0x08, 0x10, 0x60, 0x81, 0x06, 0x08, 0x10, 0x60, 0x83, 0x04, 0x08, 0x30,
+ 0x40, 0x3C, 0x31, 0x10, 0x58, 0x2D, 0x96, 0xEF, 0x05, 0x82, 0x41, 0x31,
+ 0x0F, 0x00, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+ 0xFF, 0x3C, 0xC2, 0x03, 0x03, 0x03, 0x06, 0x04, 0x08, 0x30, 0x60, 0xFF,
+ 0x3C, 0xC3, 0x03, 0x03, 0x06, 0x1C, 0x03, 0x01, 0x01, 0xC3, 0x7E, 0x06,
+ 0x05, 0x06, 0x82, 0x42, 0x22, 0x13, 0x09, 0xFF, 0x02, 0x01, 0x00, 0x80,
+ 0x7F, 0x60, 0x60, 0x40, 0x7E, 0x43, 0x01, 0x01, 0x01, 0xC3, 0x7C, 0x1F,
+ 0x10, 0x98, 0x08, 0x0D, 0xE7, 0x1B, 0x06, 0x83, 0x41, 0x31, 0x87, 0x80,
+ 0xFF, 0x81, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x30, 0x18, 0x0C, 0x06,
+ 0x00, 0x3E, 0x31, 0x90, 0x4C, 0x23, 0x31, 0xF1, 0x99, 0x82, 0xC1, 0xA1,
+ 0x8F, 0x80, 0x3C, 0x42, 0xC1, 0xC1, 0x41, 0x3F, 0x01, 0x01, 0x03, 0x46,
+ 0xFC, 0xFF, 0x80, 0x3F, 0xE0, 0xFF, 0x80, 0x3F, 0xE5, 0xE8, 0x02, 0x18,
+ 0x63, 0x08, 0x0C, 0x06, 0x06, 0x02, 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x80,
+ 0x80, 0xC0, 0x60, 0x61, 0x8C, 0x20, 0x80, 0x79, 0x88, 0x18, 0x20, 0x82,
+ 0x0C, 0x00, 0x00, 0x60, 0xC1, 0x80, 0x1E, 0x10, 0x90, 0x38, 0x18, 0x7C,
+ 0xC6, 0x43, 0x23, 0x8E, 0xC0, 0x30, 0x08, 0x02, 0x10, 0xF0, 0x18, 0x0A,
+ 0x05, 0x06, 0x82, 0x61, 0x11, 0x88, 0xFE, 0x41, 0x60, 0xB0, 0x70, 0x10,
+ 0xFC, 0x86, 0x82, 0x82, 0x86, 0xF8, 0x86, 0x83, 0x83, 0x83, 0x86, 0xFC,
+ 0x1F, 0x18, 0xD8, 0x08, 0x0C, 0x06, 0x03, 0x01, 0x80, 0x40, 0x30, 0x0C,
+ 0x63, 0xE0, 0xF8, 0x8C, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x86,
+ 0x8C, 0xF8, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0x1F, 0x10, 0x90, 0x18, 0x0C, 0x06, 0x03, 0x1F, 0x83, 0xC1,
+ 0xA0, 0xD8, 0x63, 0xC0, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xFF, 0xC1, 0xC1,
+ 0xC1, 0xC1, 0xC1, 0xC1, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10,
+ 0x20, 0x47, 0xF0, 0x7F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x83, 0x42, 0x3C, 0x83, 0x86, 0x8C, 0x98, 0x90, 0xB8, 0xE8, 0xCC, 0x84,
+ 0x86, 0x83, 0x83, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xFF, 0xC1, 0xE3, 0xE3, 0xE5, 0xD5, 0xD5, 0xD9, 0xC9, 0xC1,
+ 0xC1, 0xC1, 0xC1, 0xC1, 0xE1, 0xE1, 0xD1, 0xD1, 0xD9, 0xC9, 0xCD, 0xC5,
+ 0xC3, 0xC3, 0xC1, 0x3C, 0x31, 0x90, 0x58, 0x3C, 0x1C, 0x0E, 0x07, 0x83,
+ 0xC1, 0xA0, 0x98, 0xC7, 0x80, 0xFC, 0x82, 0x83, 0x83, 0x83, 0x86, 0xFC,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x3C, 0x31, 0x90, 0x58, 0x3C, 0x1C, 0x0E,
+ 0x07, 0x83, 0xC1, 0xA0, 0x98, 0xC7, 0x80, 0x80, 0x60, 0x0E, 0xFC, 0x86,
+ 0x83, 0x83, 0x82, 0x86, 0xFC, 0x88, 0x8C, 0x84, 0x86, 0x83, 0x3E, 0x30,
+ 0x90, 0x08, 0x06, 0x01, 0xE0, 0x3C, 0x06, 0x01, 0x80, 0xF0, 0xC7, 0xC0,
+ 0xFF, 0x84, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02,
+ 0x01, 0x00, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0x41,
+ 0x63, 0x3E, 0x81, 0xE0, 0xD0, 0x48, 0x26, 0x33, 0x10, 0x88, 0x4C, 0x34,
+ 0x0A, 0x05, 0x03, 0x00, 0xC0, 0x78, 0x09, 0x01, 0x20, 0x24, 0x44, 0x98,
+ 0x92, 0xB3, 0x56, 0x6A, 0x86, 0x30, 0xC6, 0x18, 0xC0, 0xC1, 0xB1, 0x88,
+ 0x86, 0xC1, 0x40, 0xE0, 0x70, 0x28, 0x26, 0x31, 0x10, 0xD8, 0x30, 0xC1,
+ 0xE0, 0x98, 0xCC, 0x43, 0x60, 0xA0, 0x70, 0x10, 0x08, 0x04, 0x02, 0x01,
+ 0x00, 0x7F, 0x81, 0x80, 0x80, 0xC0, 0x40, 0x60, 0x60, 0x20, 0x30, 0x30,
+ 0x10, 0x1F, 0xF0, 0xFC, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42,
+ 0x1F, 0x81, 0x81, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x10, 0x30, 0x20, 0x40,
+ 0xC0, 0x81, 0x01, 0xF8, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84,
+ 0x3F, 0x10, 0x70, 0xA3, 0x44, 0x48, 0xA1, 0x80, 0xFF, 0x80, 0xC6, 0x30,
+ 0x3E, 0x43, 0x01, 0x0F, 0x71, 0x41, 0xC1, 0x43, 0x3D, 0x80, 0x80, 0x80,
+ 0x80, 0xBC, 0xC6, 0x82, 0x83, 0x83, 0x83, 0x82, 0xC6, 0xBC, 0x1F, 0x10,
+ 0xD8, 0x08, 0x0C, 0x02, 0x01, 0x00, 0xC2, 0x1F, 0x80, 0x01, 0x01, 0x01,
+ 0x01, 0x3D, 0x63, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0x63, 0x3D, 0x1E, 0x31,
+ 0x90, 0x58, 0x3F, 0xFE, 0x01, 0x00, 0xC2, 0x1F, 0x00, 0x0F, 0x10, 0x30,
+ 0x30, 0xFE, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F, 0xB1,
+ 0x10, 0xC8, 0x66, 0x21, 0xE1, 0x00, 0x80, 0x3F, 0x20, 0x70, 0x28, 0x33,
+ 0xE0, 0x81, 0x02, 0x04, 0x09, 0xDC, 0xE0, 0xC1, 0x83, 0x06, 0x0C, 0x18,
+ 0x20, 0x18, 0xC0, 0x0F, 0x84, 0x21, 0x08, 0x42, 0x10, 0x80, 0x0C, 0x30,
+ 0x00, 0x7C, 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, 0x10, 0x43, 0xF8, 0x80,
+ 0x80, 0x80, 0x80, 0x83, 0x84, 0x88, 0x98, 0xB8, 0xCC, 0x84, 0x82, 0x83,
+ 0xF8, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06,
+ 0x01, 0x00, 0x78, 0xBB, 0x66, 0xF2, 0x39, 0x1C, 0x8E, 0x47, 0x23, 0x91,
+ 0xC8, 0x80, 0x9D, 0xCE, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x82, 0x3C, 0x31,
+ 0xB0, 0x58, 0x3C, 0x1E, 0x0F, 0x04, 0xC6, 0x3C, 0x00, 0xBC, 0xC6, 0x82,
+ 0x83, 0x83, 0x83, 0x82, 0xC6, 0xBC, 0x80, 0x80, 0x80, 0x80, 0x3D, 0x63,
+ 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0x63, 0x3D, 0x01, 0x01, 0x01, 0x01, 0x9F,
+ 0x43, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x3E, 0x61, 0x40, 0x70, 0x1E,
+ 0x03, 0x01, 0x43, 0xBE, 0x10, 0x08, 0x3F, 0xC2, 0x01, 0x00, 0x80, 0x40,
+ 0x20, 0x10, 0x0C, 0x03, 0xE0, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC3,
+ 0x45, 0x39, 0xC1, 0xA0, 0x90, 0xCC, 0x42, 0x21, 0xB0, 0x50, 0x28, 0x18,
+ 0x00, 0xC4, 0x78, 0x89, 0x29, 0x25, 0x26, 0xAC, 0xD5, 0x8C, 0xA1, 0x8C,
+ 0x31, 0x80, 0xC3, 0x31, 0x0D, 0x82, 0x81, 0x80, 0xE0, 0x98, 0xC6, 0xC1,
+ 0x80, 0xC1, 0xA0, 0x90, 0x4C, 0x62, 0x21, 0xB0, 0x50, 0x38, 0x0C, 0x04,
+ 0x06, 0x02, 0x0E, 0x00, 0x7F, 0x01, 0x81, 0x81, 0x81, 0x80, 0x80, 0xC0,
+ 0xC0, 0xFF, 0x80, 0x1E, 0x20, 0x40, 0x81, 0x02, 0x0C, 0x60, 0x30, 0x20,
+ 0x40, 0x81, 0x02, 0x04, 0x0F, 0xFF, 0xFF, 0xC0, 0xE0, 0x20, 0x40, 0x81,
+ 0x02, 0x04, 0x07, 0x18, 0x20, 0x40, 0x81, 0x02, 0x04, 0x70, 0x31, 0x49,
+ 0x86 };
+
+const GFXglyph SourceCodePro_Regular9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 11, 0, 0 }, // 0x20 ' '
+ { 1, 3, 12, 11, 4, -11 }, // 0x21 '!'
+ { 6, 6, 6, 11, 2, -11 }, // 0x22 '"'
+ { 11, 7, 11, 11, 2, -10 }, // 0x23 '#'
+ { 21, 7, 15, 11, 2, -12 }, // 0x24 '$'
+ { 35, 10, 12, 11, 0, -11 }, // 0x25 '%'
+ { 50, 9, 12, 11, 1, -11 }, // 0x26 '&'
+ { 64, 2, 6, 11, 4, -11 }, // 0x27 '''
+ { 66, 5, 16, 11, 4, -12 }, // 0x28 '('
+ { 76, 5, 16, 11, 2, -12 }, // 0x29 ')'
+ { 86, 7, 7, 11, 2, -12 }, // 0x2A '*'
+ { 93, 7, 9, 11, 2, -9 }, // 0x2B '+'
+ { 101, 3, 7, 11, 4, -2 }, // 0x2C ','
+ { 104, 6, 1, 11, 2, -5 }, // 0x2D '-'
+ { 105, 3, 3, 11, 4, -2 }, // 0x2E '.'
+ { 107, 7, 16, 11, 2, -12 }, // 0x2F '/'
+ { 121, 9, 11, 11, 1, -10 }, // 0x30 '0'
+ { 134, 8, 11, 11, 2, -10 }, // 0x31 '1'
+ { 145, 8, 11, 11, 1, -10 }, // 0x32 '2'
+ { 156, 8, 11, 11, 1, -10 }, // 0x33 '3'
+ { 167, 9, 11, 11, 1, -10 }, // 0x34 '4'
+ { 180, 8, 11, 11, 1, -10 }, // 0x35 '5'
+ { 191, 9, 11, 11, 1, -10 }, // 0x36 '6'
+ { 204, 9, 11, 11, 1, -10 }, // 0x37 '7'
+ { 217, 9, 11, 11, 1, -10 }, // 0x38 '8'
+ { 230, 8, 11, 11, 1, -10 }, // 0x39 '9'
+ { 241, 3, 9, 11, 4, -8 }, // 0x3A ':'
+ { 245, 3, 13, 11, 4, -8 }, // 0x3B ';'
+ { 250, 7, 9, 11, 2, -9 }, // 0x3C '<'
+ { 258, 7, 5, 11, 2, -7 }, // 0x3D '='
+ { 263, 7, 9, 11, 2, -9 }, // 0x3E '>'
+ { 271, 7, 12, 11, 2, -11 }, // 0x3F '?'
+ { 282, 9, 14, 11, 1, -10 }, // 0x40 '@'
+ { 298, 9, 12, 11, 1, -11 }, // 0x41 'A'
+ { 312, 8, 12, 11, 2, -11 }, // 0x42 'B'
+ { 324, 9, 12, 11, 1, -11 }, // 0x43 'C'
+ { 338, 8, 12, 11, 2, -11 }, // 0x44 'D'
+ { 350, 8, 12, 11, 2, -11 }, // 0x45 'E'
+ { 362, 8, 12, 11, 2, -11 }, // 0x46 'F'
+ { 374, 9, 12, 11, 1, -11 }, // 0x47 'G'
+ { 388, 8, 12, 11, 1, -11 }, // 0x48 'H'
+ { 400, 7, 12, 11, 2, -11 }, // 0x49 'I'
+ { 411, 8, 12, 11, 1, -11 }, // 0x4A 'J'
+ { 423, 8, 12, 11, 2, -11 }, // 0x4B 'K'
+ { 435, 8, 12, 11, 2, -11 }, // 0x4C 'L'
+ { 447, 8, 12, 11, 1, -11 }, // 0x4D 'M'
+ { 459, 8, 12, 11, 1, -11 }, // 0x4E 'N'
+ { 471, 9, 12, 11, 1, -11 }, // 0x4F 'O'
+ { 485, 8, 12, 11, 2, -11 }, // 0x50 'P'
+ { 497, 9, 15, 11, 1, -11 }, // 0x51 'Q'
+ { 514, 8, 12, 11, 2, -11 }, // 0x52 'R'
+ { 526, 9, 12, 11, 1, -11 }, // 0x53 'S'
+ { 540, 9, 12, 11, 1, -11 }, // 0x54 'T'
+ { 554, 8, 12, 11, 1, -11 }, // 0x55 'U'
+ { 566, 9, 12, 11, 1, -11 }, // 0x56 'V'
+ { 580, 11, 12, 11, 0, -11 }, // 0x57 'W'
+ { 597, 9, 12, 11, 1, -11 }, // 0x58 'X'
+ { 611, 9, 12, 11, 1, -11 }, // 0x59 'Y'
+ { 625, 9, 12, 11, 1, -11 }, // 0x5A 'Z'
+ { 639, 5, 16, 11, 4, -12 }, // 0x5B '['
+ { 649, 7, 16, 11, 2, -12 }, // 0x5C '\'
+ { 663, 5, 16, 11, 2, -12 }, // 0x5D ']'
+ { 673, 7, 7, 11, 2, -11 }, // 0x5E '^'
+ { 680, 9, 1, 11, 1, 2 }, // 0x5F '_'
+ { 682, 4, 3, 11, 3, -12 }, // 0x60 '`'
+ { 684, 8, 9, 11, 1, -8 }, // 0x61 'a'
+ { 693, 8, 13, 11, 2, -12 }, // 0x62 'b'
+ { 706, 9, 9, 11, 1, -8 }, // 0x63 'c'
+ { 717, 8, 13, 11, 1, -12 }, // 0x64 'd'
+ { 730, 9, 9, 11, 1, -8 }, // 0x65 'e'
+ { 741, 8, 13, 11, 2, -12 }, // 0x66 'f'
+ { 754, 9, 13, 11, 1, -8 }, // 0x67 'g'
+ { 769, 7, 13, 11, 2, -12 }, // 0x68 'h'
+ { 781, 5, 13, 11, 2, -12 }, // 0x69 'i'
+ { 790, 6, 17, 11, 1, -12 }, // 0x6A 'j'
+ { 803, 8, 13, 11, 2, -12 }, // 0x6B 'k'
+ { 816, 9, 13, 11, 1, -12 }, // 0x6C 'l'
+ { 831, 9, 9, 11, 1, -8 }, // 0x6D 'm'
+ { 842, 7, 9, 11, 2, -8 }, // 0x6E 'n'
+ { 850, 9, 9, 11, 1, -8 }, // 0x6F 'o'
+ { 861, 8, 13, 11, 2, -8 }, // 0x70 'p'
+ { 874, 8, 13, 11, 1, -8 }, // 0x71 'q'
+ { 887, 7, 9, 11, 3, -8 }, // 0x72 'r'
+ { 895, 8, 9, 11, 1, -8 }, // 0x73 's'
+ { 904, 9, 11, 11, 1, -10 }, // 0x74 't'
+ { 917, 8, 9, 11, 1, -8 }, // 0x75 'u'
+ { 926, 9, 9, 11, 1, -8 }, // 0x76 'v'
+ { 937, 11, 9, 11, 0, -8 }, // 0x77 'w'
+ { 950, 9, 9, 11, 1, -8 }, // 0x78 'x'
+ { 961, 9, 13, 11, 1, -8 }, // 0x79 'y'
+ { 976, 9, 9, 11, 1, -8 }, // 0x7A 'z'
+ { 987, 7, 16, 11, 2, -12 }, // 0x7B '{'
+ { 1001, 1, 18, 11, 5, -12 }, // 0x7C '|'
+ { 1004, 7, 16, 11, 2, -12 }, // 0x7D '}'
+ { 1018, 8, 3, 11, 1, -6 } }; // 0x7E '~'
+
+const GFXfont SourceCodePro_Regular9pt7b PROGMEM = {
+ (uint8_t *)SourceCodePro_Regular9pt7bBitmaps,
+ (GFXglyph *)SourceCodePro_Regular9pt7bGlyphs,
+ 0x20, 0x7E, 22 };
+
+// Approx. 1693 bytes
+const uint8_t SourceCodePro_SemiBold9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xDB, 0x64, 0x92, 0x1F, 0xF0, 0xEF, 0xDF, 0xBE, 0x64, 0x48, 0x80,
+ 0x12, 0x12, 0x7F, 0x7F, 0x22, 0x26, 0xFF, 0xFF, 0x24, 0x24, 0x64, 0x08,
+ 0x08, 0x3E, 0x7F, 0x62, 0x70, 0x3C, 0x0F, 0x03, 0x43, 0xFF, 0x3E, 0x08,
+ 0x08, 0x08, 0x38, 0x1F, 0x14, 0xCD, 0x36, 0x7F, 0x0E, 0x00, 0x38, 0x1F,
+ 0x14, 0xCD, 0x36, 0x7F, 0x0E, 0x38, 0x3E, 0x1B, 0x0D, 0x87, 0xC1, 0xCF,
+ 0xC7, 0xB3, 0xCF, 0x63, 0xBF, 0xEF, 0x10, 0xFF, 0xE4, 0x80, 0x08, 0x73,
+ 0x08, 0x61, 0x84, 0x30, 0xC1, 0x06, 0x18, 0x20, 0xC1, 0x83, 0x47, 0x0C,
+ 0x61, 0x8C, 0x61, 0x08, 0xC6, 0x33, 0x19, 0x98, 0x10, 0x23, 0x5F, 0xF3,
+ 0x87, 0x1B, 0x22, 0x08, 0x08, 0x08, 0xFF, 0xFF, 0x08, 0x08, 0x08, 0x77,
+ 0x71, 0x36, 0xC0, 0xFF, 0xF0, 0xFF, 0xF0, 0x06, 0x0C, 0x10, 0x60, 0xC3,
+ 0x06, 0x08, 0x30, 0x60, 0x83, 0x06, 0x18, 0x30, 0x60, 0x3C, 0x3F, 0x98,
+ 0xDB, 0x6D, 0xDE, 0xCF, 0x07, 0x86, 0x63, 0x3F, 0x8F, 0x00, 0xF8, 0xF8,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x3C, 0x3F, 0x30,
+ 0xC0, 0x60, 0x30, 0x30, 0x30, 0x30, 0x30, 0x7F, 0xFF, 0xE0, 0x3E, 0x7F,
+ 0xC3, 0x03, 0x1E, 0x1E, 0x03, 0x03, 0xC3, 0xFF, 0x3E, 0x0E, 0x07, 0x07,
+ 0x86, 0xC6, 0x66, 0x33, 0xFF, 0xFF, 0x06, 0x03, 0x01, 0x80, 0x7F, 0x7F,
+ 0x60, 0x7E, 0x7F, 0x63, 0x03, 0x03, 0xC3, 0xFF, 0x3C, 0x1E, 0x1F, 0x98,
+ 0x6C, 0x0D, 0xE7, 0xFB, 0x8F, 0x83, 0x63, 0xBF, 0x87, 0x80, 0xFF, 0xFF,
+ 0xC0, 0xC0, 0xC0, 0x40, 0x60, 0x20, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x3E,
+ 0x3F, 0x98, 0xCC, 0x63, 0xE1, 0xF1, 0x9D, 0x83, 0xC3, 0xBF, 0x8F, 0x80,
+ 0x3C, 0x3F, 0x30, 0xD8, 0x2C, 0x3B, 0xFC, 0xE4, 0x06, 0x47, 0x7F, 0x0F,
+ 0x00, 0xFF, 0xF0, 0x3F, 0xFC, 0x77, 0x77, 0x00, 0x07, 0x77, 0x13, 0x6C,
+ 0x02, 0x0C, 0x31, 0xC7, 0x18, 0x30, 0x38, 0x38, 0x18, 0x18, 0x10, 0xFF,
+ 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x81, 0x83, 0x81, 0xC1, 0xC1, 0xC3, 0x8E,
+ 0x39, 0xC3, 0x04, 0x00, 0x79, 0xF9, 0x38, 0x30, 0xC3, 0x0C, 0x18, 0x00,
+ 0x60, 0xE1, 0x80, 0x1E, 0x1F, 0x98, 0x78, 0x3C, 0x0C, 0x3E, 0x3F, 0x33,
+ 0x99, 0xCF, 0xF3, 0xB8, 0x06, 0x11, 0xF8, 0x78, 0x0E, 0x03, 0x81, 0xA0,
+ 0x6C, 0x1B, 0x0C, 0xC3, 0x18, 0xFE, 0x7F, 0x98, 0x76, 0x0F, 0x83, 0xFC,
+ 0xFE, 0xC6, 0xC6, 0xFC, 0xFE, 0xC7, 0xC3, 0xC3, 0xC7, 0xFE, 0xFC, 0x1E,
+ 0x1F, 0xDC, 0x5C, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xE0, 0x38, 0xCF, 0xE3,
+ 0xE0, 0xFC, 0x7F, 0x31, 0xD8, 0x7C, 0x1E, 0x0F, 0x07, 0x83, 0xC3, 0xE3,
+ 0xBF, 0x9F, 0x80, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0,
+ 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0x1E, 0x3F, 0x9C, 0x7C, 0x0C, 0x06, 0x3F, 0x1F, 0x83,
+ 0xE1, 0xB0, 0xDF, 0xE3, 0xC0, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3F, 0xFF,
+ 0xFF, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x70, 0xFF, 0xFC, 0xC1, 0x83, 0x06,
+ 0x0C, 0x18, 0x30, 0x63, 0xFF, 0xF0, 0x7F, 0x7F, 0x03, 0x03, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x47, 0xFE, 0x3C, 0xE3, 0xB8, 0xCE, 0x63, 0xB0, 0xFC,
+ 0x3F, 0x0F, 0xE3, 0x98, 0xE7, 0x38, 0xCE, 0x3B, 0x87, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xE3, 0xE3, 0xE3,
+ 0xE7, 0xF5, 0xD5, 0xD5, 0xD9, 0xC9, 0xC1, 0xC1, 0xC1, 0xE3, 0xE3, 0xF3,
+ 0xD3, 0xDB, 0xDB, 0xCB, 0xCD, 0xC5, 0xC7, 0xC3, 0xC3, 0x3C, 0x3F, 0xB8,
+ 0xD8, 0x7C, 0x1E, 0x0F, 0x07, 0x83, 0xC3, 0xB1, 0x9F, 0xC7, 0x80, 0xFC,
+ 0xFE, 0xC7, 0xC3, 0xC3, 0xC7, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0x3C,
+ 0x3F, 0xB8, 0xD8, 0x7C, 0x1E, 0x0F, 0x07, 0x83, 0xC3, 0xF1, 0x9F, 0xC7,
+ 0xC0, 0xC0, 0x7C, 0x1E, 0xFC, 0xFE, 0xC7, 0xC3, 0xC7, 0xFE, 0xFC, 0xCC,
+ 0xCC, 0xC6, 0xC6, 0xC3, 0x3E, 0x3F, 0x98, 0x4C, 0x07, 0x01, 0xE0, 0x7C,
+ 0x07, 0x01, 0xA1, 0xFF, 0xC7, 0xC0, 0xFF, 0xFF, 0xC6, 0x03, 0x01, 0x80,
+ 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x00, 0xC3, 0xE1, 0xF0, 0xF8,
+ 0x7C, 0x3E, 0x1F, 0x0F, 0x86, 0xE3, 0x31, 0x9F, 0xC7, 0xC0, 0xE0, 0xD8,
+ 0x36, 0x1C, 0xC6, 0x31, 0x8C, 0x63, 0x30, 0x6C, 0x1B, 0x06, 0x80, 0xE0,
+ 0x38, 0xC0, 0x78, 0x0B, 0x03, 0x32, 0x66, 0xEC, 0xD5, 0x9A, 0xB3, 0x56,
+ 0x7B, 0xCF, 0x70, 0xC6, 0x18, 0xC0, 0xC3, 0xB1, 0x99, 0xC6, 0xC3, 0x40,
+ 0xE0, 0x70, 0x7C, 0x36, 0x33, 0xB8, 0xD8, 0x30, 0xE0, 0xD8, 0x73, 0x18,
+ 0xC6, 0x1B, 0x06, 0xC0, 0xE0, 0x38, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x7F,
+ 0xBF, 0xC0, 0xC0, 0xC0, 0xE0, 0x60, 0x60, 0x60, 0x30, 0x30, 0x3F, 0xFF,
+ 0xF0, 0xFF, 0xE1, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, 0x43, 0xFF, 0xC1,
+ 0x83, 0x03, 0x06, 0x04, 0x0C, 0x18, 0x10, 0x30, 0x60, 0x60, 0xC0, 0x81,
+ 0x83, 0xFF, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8F, 0xFF, 0x30,
+ 0x70, 0xA3, 0x64, 0xD8, 0xB1, 0x80, 0xFF, 0xFF, 0xC0, 0xC6, 0x30, 0x3E,
+ 0x7F, 0x43, 0x1F, 0x7F, 0xE3, 0xC3, 0x7F, 0x79, 0xE0, 0x70, 0x38, 0x1C,
+ 0x0F, 0xE7, 0xFB, 0x8F, 0xC3, 0xE1, 0xF0, 0xF8, 0xDF, 0xED, 0xE0, 0x1E,
+ 0x3F, 0xDC, 0x5C, 0x0C, 0x07, 0x01, 0xC4, 0xFF, 0x1E, 0x00, 0x03, 0x03,
+ 0x03, 0x03, 0x3F, 0x7F, 0xE3, 0xC3, 0xC3, 0xC3, 0xE3, 0x7F, 0x39, 0x1E,
+ 0x3F, 0x98, 0x7F, 0xFF, 0xFE, 0x01, 0x84, 0xFE, 0x1E, 0x00, 0x0F, 0x1F,
+ 0x38, 0x30, 0xFF, 0xFF, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F,
+ 0xBF, 0xD8, 0x8C, 0x67, 0xE3, 0xE1, 0x00, 0xFE, 0x7F, 0xE0, 0xFF, 0xEF,
+ 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0C, 0xE7, 0xFB, 0xCD, 0xC7, 0xE3, 0xF1,
+ 0xF8, 0xFC, 0x7E, 0x38, 0x18, 0x71, 0x80, 0x03, 0xEF, 0x86, 0x18, 0x61,
+ 0x86, 0x18, 0x60, 0x0C, 0x1C, 0x30, 0x00, 0x0F, 0x9F, 0x06, 0x0C, 0x18,
+ 0x30, 0x60, 0xC1, 0x83, 0x7E, 0xF8, 0xC0, 0xC0, 0xC0, 0xC0, 0xC7, 0xCE,
+ 0xDC, 0xF8, 0xF8, 0xEC, 0xCE, 0xC6, 0xC3, 0xF8, 0x7C, 0x06, 0x03, 0x01,
+ 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0xE0, 0xF8, 0xFB, 0x7F,
+ 0xF3, 0x79, 0x3C, 0x9E, 0x4F, 0x27, 0x93, 0xC9, 0x80, 0xCE, 0x7F, 0xBC,
+ 0xDC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0x80, 0x3E, 0x3F, 0xB8, 0xD8,
+ 0x3C, 0x1E, 0x0F, 0x8C, 0xFE, 0x3E, 0x00, 0xDE, 0x7F, 0xB8, 0xFC, 0x3E,
+ 0x1F, 0x0F, 0x8D, 0xFE, 0xFE, 0x70, 0x38, 0x1C, 0x00, 0x3D, 0x7F, 0xE3,
+ 0xC3, 0xC3, 0xC3, 0xE3, 0x7F, 0x3B, 0x03, 0x03, 0x03, 0xCF, 0xDF, 0xF0,
+ 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x3E, 0x3F, 0x98, 0x4E, 0x03, 0xE0,
+ 0x39, 0x07, 0xFE, 0x3E, 0x00, 0x10, 0x08, 0x3F, 0xFF, 0xF3, 0x01, 0x80,
+ 0xC0, 0x70, 0x18, 0x0F, 0xC3, 0xE0, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xE7, 0x7F, 0x79, 0xC1, 0xE0, 0x98, 0xCC, 0x67, 0x61, 0xB0, 0xD8, 0x38,
+ 0x1C, 0x00, 0xC4, 0x79, 0xC9, 0xBB, 0x35, 0x66, 0xAC, 0xD5, 0x9E, 0xB1,
+ 0xDC, 0x31, 0x80, 0xE3, 0xB1, 0x8D, 0x83, 0x81, 0xC1, 0xE0, 0xD8, 0xC6,
+ 0xC3, 0x80, 0xC1, 0xE0, 0x98, 0xCC, 0x63, 0x21, 0xB0, 0x50, 0x38, 0x1C,
+ 0x0C, 0x3E, 0x1C, 0x00, 0x7F, 0xBF, 0x81, 0x81, 0xC1, 0xC1, 0xC1, 0xC1,
+ 0xFF, 0xFF, 0x80, 0x1E, 0x3C, 0xC1, 0x81, 0x02, 0x0C, 0x78, 0xF0, 0x60,
+ 0x40, 0x83, 0x06, 0x07, 0x8F, 0xFF, 0xFF, 0xC0, 0xF1, 0xE0, 0x40, 0x81,
+ 0x02, 0x06, 0x0F, 0x1E, 0x30, 0x40, 0x81, 0x02, 0x3C, 0x78, 0x79, 0xBF,
+ 0xB3, 0x80 };
+
+const GFXglyph SourceCodePro_SemiBold9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 11, 0, 0 }, // 0x20 ' '
+ { 1, 3, 12, 11, 4, -11 }, // 0x21 '!'
+ { 6, 7, 6, 11, 2, -11 }, // 0x22 '"'
+ { 12, 8, 11, 11, 1, -10 }, // 0x23 '#'
+ { 23, 8, 15, 11, 1, -12 }, // 0x24 '$'
+ { 38, 10, 12, 11, 0, -11 }, // 0x25 '%'
+ { 53, 9, 12, 11, 1, -11 }, // 0x26 '&'
+ { 67, 3, 6, 11, 4, -11 }, // 0x27 '''
+ { 70, 6, 16, 11, 3, -12 }, // 0x28 '('
+ { 82, 5, 16, 11, 2, -12 }, // 0x29 ')'
+ { 92, 7, 8, 11, 2, -12 }, // 0x2A '*'
+ { 99, 8, 8, 11, 1, -9 }, // 0x2B '+'
+ { 107, 4, 7, 11, 3, -2 }, // 0x2C ','
+ { 111, 6, 2, 11, 2, -5 }, // 0x2D '-'
+ { 113, 3, 4, 11, 4, -3 }, // 0x2E '.'
+ { 115, 7, 16, 11, 2, -12 }, // 0x2F '/'
+ { 129, 9, 11, 11, 1, -10 }, // 0x30 '0'
+ { 142, 8, 11, 11, 2, -10 }, // 0x31 '1'
+ { 153, 9, 11, 11, 1, -10 }, // 0x32 '2'
+ { 166, 8, 11, 11, 1, -10 }, // 0x33 '3'
+ { 177, 9, 11, 11, 1, -10 }, // 0x34 '4'
+ { 190, 8, 11, 11, 1, -10 }, // 0x35 '5'
+ { 201, 9, 11, 11, 1, -10 }, // 0x36 '6'
+ { 214, 9, 11, 11, 1, -10 }, // 0x37 '7'
+ { 227, 9, 11, 11, 1, -10 }, // 0x38 '8'
+ { 240, 9, 11, 11, 1, -10 }, // 0x39 '9'
+ { 253, 3, 10, 11, 4, -9 }, // 0x3A ':'
+ { 257, 4, 14, 11, 3, -9 }, // 0x3B ';'
+ { 264, 7, 12, 11, 2, -11 }, // 0x3C '<'
+ { 275, 8, 6, 11, 1, -8 }, // 0x3D '='
+ { 281, 7, 12, 11, 2, -11 }, // 0x3E '>'
+ { 292, 7, 12, 11, 2, -11 }, // 0x3F '?'
+ { 303, 9, 15, 11, 1, -11 }, // 0x40 '@'
+ { 320, 10, 12, 11, 0, -11 }, // 0x41 'A'
+ { 335, 8, 12, 11, 2, -11 }, // 0x42 'B'
+ { 347, 9, 12, 11, 1, -11 }, // 0x43 'C'
+ { 361, 9, 12, 11, 1, -11 }, // 0x44 'D'
+ { 375, 8, 12, 11, 2, -11 }, // 0x45 'E'
+ { 387, 8, 12, 11, 2, -11 }, // 0x46 'F'
+ { 399, 9, 12, 11, 1, -11 }, // 0x47 'G'
+ { 413, 9, 12, 11, 1, -11 }, // 0x48 'H'
+ { 427, 7, 12, 11, 2, -11 }, // 0x49 'I'
+ { 438, 8, 12, 11, 1, -11 }, // 0x4A 'J'
+ { 450, 10, 12, 11, 1, -11 }, // 0x4B 'K'
+ { 465, 8, 12, 11, 2, -11 }, // 0x4C 'L'
+ { 477, 8, 12, 11, 1, -11 }, // 0x4D 'M'
+ { 489, 8, 12, 11, 1, -11 }, // 0x4E 'N'
+ { 501, 9, 12, 11, 1, -11 }, // 0x4F 'O'
+ { 515, 8, 12, 11, 2, -11 }, // 0x50 'P'
+ { 527, 9, 15, 11, 1, -11 }, // 0x51 'Q'
+ { 544, 8, 12, 11, 2, -11 }, // 0x52 'R'
+ { 556, 9, 12, 11, 1, -11 }, // 0x53 'S'
+ { 570, 9, 12, 11, 1, -11 }, // 0x54 'T'
+ { 584, 9, 12, 11, 1, -11 }, // 0x55 'U'
+ { 598, 10, 12, 11, 0, -11 }, // 0x56 'V'
+ { 613, 11, 12, 11, 0, -11 }, // 0x57 'W'
+ { 630, 9, 12, 11, 1, -11 }, // 0x58 'X'
+ { 644, 10, 12, 11, 0, -11 }, // 0x59 'Y'
+ { 659, 9, 12, 11, 1, -11 }, // 0x5A 'Z'
+ { 673, 5, 16, 11, 4, -12 }, // 0x5B '['
+ { 683, 7, 16, 11, 2, -12 }, // 0x5C '\'
+ { 697, 5, 16, 11, 2, -12 }, // 0x5D ']'
+ { 707, 7, 7, 11, 2, -11 }, // 0x5E '^'
+ { 714, 9, 2, 11, 1, 2 }, // 0x5F '_'
+ { 717, 4, 3, 11, 3, -12 }, // 0x60 '`'
+ { 719, 8, 9, 11, 1, -8 }, // 0x61 'a'
+ { 728, 9, 13, 11, 1, -12 }, // 0x62 'b'
+ { 743, 9, 9, 11, 1, -8 }, // 0x63 'c'
+ { 754, 8, 13, 11, 1, -12 }, // 0x64 'd'
+ { 767, 9, 9, 11, 1, -8 }, // 0x65 'e'
+ { 778, 8, 13, 11, 2, -12 }, // 0x66 'f'
+ { 791, 9, 12, 11, 1, -8 }, // 0x67 'g'
+ { 805, 9, 13, 11, 1, -12 }, // 0x68 'h'
+ { 820, 6, 14, 11, 2, -13 }, // 0x69 'i'
+ { 831, 7, 17, 11, 1, -13 }, // 0x6A 'j'
+ { 846, 8, 13, 11, 2, -12 }, // 0x6B 'k'
+ { 859, 9, 13, 11, 1, -12 }, // 0x6C 'l'
+ { 874, 9, 9, 11, 1, -8 }, // 0x6D 'm'
+ { 885, 9, 9, 11, 1, -8 }, // 0x6E 'n'
+ { 896, 9, 9, 11, 1, -8 }, // 0x6F 'o'
+ { 907, 9, 12, 11, 1, -8 }, // 0x70 'p'
+ { 921, 8, 12, 11, 1, -8 }, // 0x71 'q'
+ { 933, 8, 9, 11, 2, -8 }, // 0x72 'r'
+ { 942, 9, 9, 11, 1, -8 }, // 0x73 's'
+ { 953, 9, 11, 11, 1, -10 }, // 0x74 't'
+ { 966, 8, 9, 11, 1, -8 }, // 0x75 'u'
+ { 975, 9, 9, 11, 1, -8 }, // 0x76 'v'
+ { 986, 11, 9, 11, 0, -8 }, // 0x77 'w'
+ { 999, 9, 9, 11, 1, -8 }, // 0x78 'x'
+ { 1010, 9, 12, 11, 1, -8 }, // 0x79 'y'
+ { 1024, 9, 9, 11, 1, -8 }, // 0x7A 'z'
+ { 1035, 7, 16, 11, 2, -12 }, // 0x7B '{'
+ { 1049, 1, 18, 11, 5, -12 }, // 0x7C '|'
+ { 1052, 7, 16, 11, 2, -12 }, // 0x7D '}'
+ { 1066, 9, 3, 11, 1, -6 } }; // 0x7E '~'
+
+const GFXfont SourceCodePro_SemiBold9pt7b PROGMEM = {
+ (uint8_t *)SourceCodePro_SemiBold9pt7bBitmaps,
+ (GFXglyph *)SourceCodePro_SemiBold9pt7bGlyphs,
+ 0x20, 0x7E, 22 };
+
+// Approx. 1742 bytes
+const uint8_t Shree7149pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xEA, 0x80, 0xC0, 0x99, 0x99, 0x04, 0x20, 0x21, 0x01, 0x10,
+ 0x77, 0xE0, 0x84, 0x04, 0x40, 0x42, 0x1F, 0xFE, 0x11, 0x01, 0x08, 0x08,
+ 0x40, 0x04, 0x07, 0x82, 0x59, 0x13, 0x44, 0x51, 0x06, 0x40, 0xF0, 0x07,
+ 0x01, 0x30, 0x45, 0x11, 0x44, 0x59, 0x21, 0xF0, 0x10, 0x04, 0x00, 0x00,
+ 0x09, 0xE0, 0x44, 0x42, 0x20, 0x90, 0x82, 0x41, 0x12, 0x03, 0x90, 0x00,
+ 0x80, 0x02, 0xF0, 0x12, 0x20, 0x90, 0x44, 0x42, 0x10, 0x88, 0x81, 0xC0,
+ 0x00, 0x03, 0xC0, 0x84, 0x11, 0x01, 0x20, 0x28, 0x06, 0x01, 0x20, 0x42,
+ 0x50, 0x2A, 0x05, 0x20, 0x44, 0x14, 0x7C, 0x40, 0xEA, 0x12, 0x44, 0x44,
+ 0x88, 0x88, 0x84, 0x44, 0x21, 0x04, 0x22, 0x21, 0x11, 0x11, 0x12, 0x22,
+ 0x40, 0x18, 0x18, 0xF3, 0x24, 0x24, 0x53, 0x18, 0x18, 0x08, 0x04, 0x02,
+ 0x01, 0x0F, 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xD4, 0x7E, 0xC0, 0x01,
+ 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40,
+ 0x40, 0x3E, 0x20, 0x90, 0x50, 0x28, 0x14, 0x06, 0x03, 0x01, 0x81, 0x40,
+ 0x90, 0x48, 0x43, 0xC0, 0x11, 0xF1, 0x11, 0x11, 0x11, 0x11, 0x10, 0x3E,
+ 0x41, 0x41, 0x01, 0x01, 0x01, 0x02, 0x0C, 0x30, 0x40, 0x40, 0x80, 0xFF,
+ 0x7E, 0x20, 0xA0, 0x40, 0x20, 0x10, 0x10, 0x78, 0x02, 0x01, 0x40, 0x60,
+ 0x48, 0x23, 0xE0, 0x06, 0x03, 0x02, 0x82, 0x41, 0x21, 0x11, 0x08, 0x84,
+ 0x82, 0x7F, 0xC0, 0x80, 0x40, 0x20, 0x7E, 0x20, 0x10, 0x08, 0x04, 0x03,
+ 0xF1, 0x04, 0x02, 0x00, 0x80, 0x60, 0x48, 0x23, 0xE0, 0x3E, 0x30, 0x90,
+ 0x30, 0x08, 0x05, 0xF3, 0x05, 0x82, 0x80, 0xC0, 0x50, 0x48, 0x23, 0xE0,
+ 0x7F, 0x02, 0x02, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20,
+ 0x20, 0x3E, 0x20, 0x90, 0x48, 0x24, 0x11, 0xB0, 0xB8, 0x82, 0x81, 0x40,
+ 0x60, 0x48, 0x23, 0xE0, 0x7E, 0x21, 0xA0, 0x50, 0x28, 0x14, 0x0D, 0x0A,
+ 0x79, 0x01, 0x00, 0xA0, 0x48, 0x43, 0xC0, 0xF0, 0x00, 0x30, 0xF0, 0x00,
+ 0x35, 0x00, 0x02, 0x18, 0xC2, 0x0C, 0x04, 0x06, 0x03, 0x00, 0xFF, 0x00,
+ 0x00, 0x00, 0xFF, 0x00, 0x80, 0xC0, 0x60, 0x20, 0x43, 0x18, 0x41, 0x00,
+ 0x18, 0x66, 0x41, 0x81, 0x01, 0x01, 0x02, 0x04, 0x08, 0x08, 0x00, 0x00,
+ 0x00, 0x08, 0x07, 0xF8, 0x06, 0x01, 0x82, 0x00, 0x11, 0x00, 0x02, 0x40,
+ 0x00, 0xA0, 0xFA, 0x18, 0x41, 0x86, 0x10, 0x21, 0x84, 0x08, 0x61, 0x02,
+ 0x18, 0x40, 0x86, 0x08, 0x62, 0x41, 0x6C, 0x90, 0x20, 0xC2, 0x00, 0x00,
+ 0x60, 0x08, 0x07, 0xFC, 0x00, 0x06, 0x00, 0x60, 0x09, 0x00, 0x90, 0x09,
+ 0x01, 0x08, 0x10, 0x82, 0x04, 0x3F, 0xC2, 0x04, 0x40, 0x24, 0x02, 0x80,
+ 0x10, 0xFF, 0xA0, 0x28, 0x06, 0x02, 0x80, 0xA0, 0x6F, 0xFA, 0x01, 0x80,
+ 0x60, 0x18, 0x06, 0x02, 0xFF, 0x00, 0x06, 0x07, 0x31, 0x81, 0x20, 0x18,
+ 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00, 0xA0, 0x12, 0x04,
+ 0x3F, 0x00, 0xFF, 0x10, 0x12, 0x01, 0x40, 0x28, 0x03, 0x00, 0x60, 0x0C,
+ 0x01, 0x80, 0x50, 0x0A, 0x01, 0x40, 0x4F, 0xF0, 0xFF, 0xC0, 0x20, 0x10,
+ 0x08, 0x04, 0x03, 0xFD, 0x00, 0x80, 0x40, 0x20, 0x10, 0x0F, 0xF8, 0xFF,
+ 0xC0, 0x20, 0x10, 0x08, 0x04, 0x03, 0xFD, 0x00, 0x80, 0x40, 0x20, 0x10,
+ 0x08, 0x00, 0x06, 0x03, 0x31, 0x81, 0x20, 0x18, 0x01, 0x00, 0x20, 0x04,
+ 0x1F, 0x80, 0x30, 0x06, 0x00, 0xA0, 0x32, 0x06, 0x3F, 0x40, 0x80, 0x60,
+ 0x18, 0x06, 0x01, 0x80, 0x60, 0x1F, 0xFE, 0x01, 0x80, 0x60, 0x18, 0x06,
+ 0x01, 0x80, 0x40, 0xFF, 0xF8, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81,
+ 0x03, 0x06, 0x0A, 0x13, 0xC0, 0x80, 0xE0, 0x48, 0x22, 0x10, 0x88, 0x26,
+ 0x0A, 0x83, 0x10, 0x82, 0x20, 0x48, 0x1A, 0x02, 0x80, 0x40, 0x80, 0x80,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xC0,
+ 0x1D, 0x00, 0xE8, 0x0B, 0x40, 0x59, 0x02, 0xC8, 0x26, 0x21, 0x31, 0x11,
+ 0x88, 0x8C, 0x24, 0x61, 0x43, 0x06, 0x18, 0x20, 0x80, 0xC0, 0x34, 0x06,
+ 0x80, 0xC8, 0x18, 0x83, 0x10, 0x61, 0x0C, 0x11, 0x82, 0x30, 0x26, 0x02,
+ 0xC0, 0x58, 0x06, 0x0E, 0x03, 0x18, 0x40, 0x44, 0x02, 0x80, 0x28, 0x02,
+ 0x80, 0x28, 0x01, 0x80, 0x28, 0x02, 0x80, 0x24, 0x04, 0x20, 0xC1, 0xF0,
+ 0xFF, 0x20, 0x28, 0x0A, 0x01, 0x80, 0xA0, 0x2F, 0xF2, 0x00, 0x80, 0x20,
+ 0x08, 0x02, 0x00, 0x80, 0x00, 0x06, 0x07, 0x31, 0x81, 0x20, 0x28, 0x03,
+ 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xA0, 0xB2, 0x0C, 0x37,
+ 0xC1, 0x08, 0xFF, 0xA0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x2F, 0xF2, 0x02,
+ 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x40, 0x18, 0x33, 0xA0, 0x50, 0x18,
+ 0x04, 0x01, 0x80, 0x3C, 0x01, 0x00, 0x60, 0x30, 0x1C, 0x13, 0xF0, 0xFF,
+ 0xC1, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00,
+ 0x40, 0x10, 0x04, 0x00, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18,
+ 0x06, 0x01, 0x80, 0x60, 0x14, 0x05, 0x02, 0x3F, 0x00, 0xC0, 0x48, 0x09,
+ 0x01, 0x10, 0x42, 0x08, 0x41, 0x04, 0x40, 0x88, 0x11, 0x01, 0x40, 0x28,
+ 0x05, 0x00, 0x40, 0x81, 0x81, 0x41, 0x81, 0x41, 0x41, 0x41, 0x42, 0x22,
+ 0x42, 0x22, 0x22, 0x22, 0x24, 0x24, 0x24, 0x14, 0x24, 0x14, 0x14, 0x14,
+ 0x18, 0x18, 0x18, 0x08, 0x18, 0x40, 0xC8, 0x22, 0x10, 0x44, 0x0A, 0x03,
+ 0x00, 0xC0, 0x28, 0x12, 0x0C, 0x42, 0x09, 0x02, 0x40, 0x40, 0x40, 0x6C,
+ 0x08, 0x82, 0x08, 0xC1, 0x90, 0x14, 0x01, 0x80, 0x20, 0x04, 0x00, 0x80,
+ 0x10, 0x02, 0x00, 0x40, 0x7F, 0xC0, 0x20, 0x18, 0x04, 0x02, 0x01, 0x00,
+ 0xC0, 0x20, 0x10, 0x08, 0x06, 0x01, 0x00, 0xFF, 0xC0, 0xF8, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x8F, 0x01, 0x04, 0x10, 0x20, 0x81, 0x04, 0x10,
+ 0x20, 0x82, 0x04, 0xF1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x08,
+ 0x0A, 0x09, 0x04, 0x44, 0x12, 0x08, 0xFF, 0x80, 0x49, 0x00, 0x38, 0xC6,
+ 0x82, 0x02, 0x06, 0x7A, 0x82, 0x82, 0x82, 0x7F, 0x80, 0x40, 0x20, 0x13,
+ 0x8A, 0x26, 0x0B, 0x03, 0x01, 0x80, 0xC0, 0x70, 0x58, 0x2B, 0xE0, 0x1C,
+ 0x62, 0xC1, 0x80, 0x80, 0x80, 0x80, 0x81, 0x41, 0x3E, 0x01, 0x01, 0x01,
+ 0x3D, 0x43, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x43, 0x3D, 0x3C, 0x42,
+ 0x81, 0x81, 0xFF, 0x80, 0x80, 0x81, 0x41, 0x3E, 0x32, 0x22, 0x72, 0x22,
+ 0x22, 0x22, 0x20, 0x3D, 0x43, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x43,
+ 0x3D, 0x81, 0x81, 0x7E, 0x80, 0x80, 0x80, 0x9C, 0xA2, 0xC1, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x9F, 0xF8, 0x20, 0x12, 0x49, 0x24, 0x92,
+ 0x49, 0xC0, 0x80, 0x80, 0x80, 0x83, 0x84, 0x88, 0x90, 0xB0, 0xC8, 0x84,
+ 0x84, 0x82, 0x81, 0xFF, 0xF8, 0x98, 0x65, 0x3C, 0xF0, 0x83, 0x04, 0x18,
+ 0x20, 0xC1, 0x06, 0x08, 0x30, 0x41, 0x82, 0x0C, 0x10, 0x40, 0x9C, 0xA2,
+ 0xC1, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x3C, 0x21, 0xA0, 0x50,
+ 0x18, 0x0C, 0x06, 0x03, 0x02, 0x41, 0x1F, 0x00, 0x9C, 0x51, 0xB0, 0x58,
+ 0x18, 0x0C, 0x06, 0x03, 0x82, 0xA1, 0x4B, 0x22, 0x10, 0x08, 0x04, 0x00,
+ 0x3D, 0x43, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x43, 0x25, 0x19, 0x01,
+ 0x01, 0x01, 0x9D, 0x31, 0x88, 0x42, 0x10, 0x84, 0x00, 0x79, 0x0A, 0x0C,
+ 0x06, 0x03, 0x80, 0x81, 0x82, 0xF8, 0x44, 0xF4, 0x44, 0x44, 0x44, 0x43,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x83, 0x43, 0x7D, 0x81, 0x41,
+ 0x41, 0x42, 0x22, 0x24, 0x24, 0x14, 0x18, 0x08, 0x82, 0x0C, 0x10, 0x51,
+ 0x44, 0x8A, 0x24, 0x51, 0x12, 0x90, 0xA2, 0x85, 0x14, 0x18, 0xC0, 0x82,
+ 0x00, 0x41, 0x21, 0x08, 0x82, 0x81, 0x80, 0xC0, 0x50, 0x44, 0x42, 0x20,
+ 0x80, 0x80, 0x41, 0x41, 0x42, 0x22, 0x22, 0x24, 0x14, 0x18, 0x08, 0x08,
+ 0x10, 0x30, 0x40, 0x7E, 0x02, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40,
+ 0xFF, 0x08, 0x42, 0x08, 0x20, 0x82, 0x08, 0xC0, 0x82, 0x08, 0x20, 0x82,
+ 0x04, 0x18, 0x10, 0xFF, 0xFF, 0x80, 0x40, 0x82, 0x04, 0x10, 0x41, 0x04,
+ 0x0C, 0x41, 0x04, 0x10, 0x41, 0x08, 0x62, 0x00, 0x70, 0x0F };
+
+const GFXglyph Shree7149pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 7, 0, 0 }, // 0x20 ' '
+ { 1, 2, 13, 4, 1, -12 }, // 0x21 '!'
+ { 5, 4, 4, 6, 1, -13 }, // 0x22 '"'
+ { 7, 13, 11, 15, 1, -10 }, // 0x23 '#'
+ { 25, 10, 17, 13, 1, -14 }, // 0x24 '$'
+ { 47, 14, 14, 16, 1, -13 }, // 0x25 '%'
+ { 72, 11, 14, 11, 0, -13 }, // 0x26 '&'
+ { 92, 2, 4, 4, 1, -13 }, // 0x27 '''
+ { 93, 4, 16, 6, 1, -13 }, // 0x28 '('
+ { 101, 4, 16, 6, 1, -13 }, // 0x29 ')'
+ { 109, 8, 8, 10, 1, -13 }, // 0x2A '*'
+ { 117, 9, 9, 11, 1, -8 }, // 0x2B '+'
+ { 128, 2, 4, 4, 1, 0 }, // 0x2C ','
+ { 129, 8, 1, 10, 1, -4 }, // 0x2D '-'
+ { 130, 2, 1, 4, 1, 0 }, // 0x2E '.'
+ { 131, 8, 14, 11, 1, -12 }, // 0x2F '/'
+ { 145, 9, 13, 11, 1, -12 }, // 0x30 '0'
+ { 160, 4, 13, 11, 3, -12 }, // 0x31 '1'
+ { 167, 8, 13, 11, 1, -12 }, // 0x32 '2'
+ { 180, 9, 13, 11, 1, -12 }, // 0x33 '3'
+ { 195, 9, 13, 11, 1, -12 }, // 0x34 '4'
+ { 210, 9, 13, 11, 1, -12 }, // 0x35 '5'
+ { 225, 9, 13, 11, 1, -12 }, // 0x36 '6'
+ { 240, 8, 13, 11, 1, -12 }, // 0x37 '7'
+ { 253, 9, 13, 11, 1, -12 }, // 0x38 '8'
+ { 268, 9, 13, 11, 1, -12 }, // 0x39 '9'
+ { 283, 2, 10, 4, 1, -9 }, // 0x3A ':'
+ { 286, 2, 13, 4, 1, -9 }, // 0x3B ';'
+ { 290, 7, 9, 10, 1, -8 }, // 0x3C '<'
+ { 298, 8, 5, 10, 1, -6 }, // 0x3D '='
+ { 303, 7, 10, 10, 1, -9 }, // 0x3E '>'
+ { 312, 8, 14, 11, 1, -13 }, // 0x3F '?'
+ { 326, 18, 17, 20, 1, -13 }, // 0x40 '@'
+ { 365, 12, 13, 12, 0, -12 }, // 0x41 'A'
+ { 385, 10, 13, 12, 1, -12 }, // 0x42 'B'
+ { 402, 11, 14, 12, 1, -13 }, // 0x43 'C'
+ { 422, 11, 13, 12, 1, -12 }, // 0x44 'D'
+ { 440, 9, 13, 10, 1, -12 }, // 0x45 'E'
+ { 455, 9, 13, 10, 1, -12 }, // 0x46 'F'
+ { 470, 11, 14, 13, 1, -13 }, // 0x47 'G'
+ { 490, 10, 13, 13, 1, -12 }, // 0x48 'H'
+ { 507, 1, 13, 4, 1, -12 }, // 0x49 'I'
+ { 509, 7, 13, 9, 0, -12 }, // 0x4A 'J'
+ { 521, 10, 13, 12, 1, -12 }, // 0x4B 'K'
+ { 538, 8, 13, 10, 1, -12 }, // 0x4C 'L'
+ { 551, 13, 13, 15, 1, -12 }, // 0x4D 'M'
+ { 573, 11, 13, 13, 1, -12 }, // 0x4E 'N'
+ { 591, 12, 14, 13, 1, -13 }, // 0x4F 'O'
+ { 612, 10, 13, 11, 1, -12 }, // 0x50 'P'
+ { 629, 11, 15, 13, 1, -13 }, // 0x51 'Q'
+ { 650, 10, 13, 12, 1, -12 }, // 0x52 'R'
+ { 667, 9, 14, 11, 1, -13 }, // 0x53 'S'
+ { 683, 10, 13, 10, 0, -12 }, // 0x54 'T'
+ { 700, 10, 13, 12, 1, -12 }, // 0x55 'U'
+ { 717, 11, 13, 11, 0, -12 }, // 0x56 'V'
+ { 735, 16, 13, 17, 0, -12 }, // 0x57 'W'
+ { 761, 10, 13, 11, 0, -12 }, // 0x58 'X'
+ { 778, 11, 13, 11, 0, -12 }, // 0x59 'Y'
+ { 796, 10, 13, 11, 0, -12 }, // 0x5A 'Z'
+ { 813, 4, 16, 6, 1, -13 }, // 0x5B '['
+ { 821, 6, 13, 8, 1, -11 }, // 0x5C '\'
+ { 831, 4, 16, 6, 1, -13 }, // 0x5D ']'
+ { 839, 9, 6, 11, 1, -7 }, // 0x5E '^'
+ { 846, 9, 1, 9, 0, 3 }, // 0x5F '_'
+ { 848, 3, 3, 5, 1, -13 }, // 0x60 '`'
+ { 850, 8, 10, 10, 1, -9 }, // 0x61 'a'
+ { 860, 9, 13, 11, 1, -12 }, // 0x62 'b'
+ { 875, 8, 10, 10, 1, -9 }, // 0x63 'c'
+ { 885, 8, 13, 11, 1, -12 }, // 0x64 'd'
+ { 898, 8, 10, 10, 1, -9 }, // 0x65 'e'
+ { 908, 4, 13, 4, 0, -12 }, // 0x66 'f'
+ { 915, 8, 13, 11, 1, -9 }, // 0x67 'g'
+ { 928, 8, 13, 10, 1, -12 }, // 0x68 'h'
+ { 941, 1, 13, 4, 1, -12 }, // 0x69 'i'
+ { 943, 3, 17, 4, 0, -12 }, // 0x6A 'j'
+ { 950, 8, 13, 9, 1, -12 }, // 0x6B 'k'
+ { 963, 1, 13, 4, 1, -12 }, // 0x6C 'l'
+ { 965, 13, 10, 15, 1, -9 }, // 0x6D 'm'
+ { 982, 8, 10, 10, 1, -9 }, // 0x6E 'n'
+ { 992, 9, 10, 11, 1, -9 }, // 0x6F 'o'
+ { 1004, 9, 14, 11, 1, -9 }, // 0x70 'p'
+ { 1020, 8, 14, 11, 1, -9 }, // 0x71 'q'
+ { 1034, 5, 10, 6, 1, -9 }, // 0x72 'r'
+ { 1041, 7, 10, 9, 1, -9 }, // 0x73 's'
+ { 1050, 4, 12, 4, 0, -11 }, // 0x74 't'
+ { 1056, 8, 10, 10, 1, -9 }, // 0x75 'u'
+ { 1066, 8, 10, 9, 0, -9 }, // 0x76 'v'
+ { 1076, 13, 10, 13, 0, -9 }, // 0x77 'w'
+ { 1093, 9, 10, 9, 0, -9 }, // 0x78 'x'
+ { 1105, 8, 14, 9, 0, -9 }, // 0x79 'y'
+ { 1119, 8, 10, 8, 0, -9 }, // 0x7A 'z'
+ { 1129, 6, 18, 8, 1, -13 }, // 0x7B '{'
+ { 1143, 1, 17, 4, 1, -13 }, // 0x7C '|'
+ { 1146, 6, 18, 8, 1, -13 }, // 0x7D '}'
+ { 1160, 8, 2, 11, 1, -5 } }; // 0x7E '~'
+
+const GFXfont Shree7149pt7b PROGMEM = {
+ (uint8_t *)Shree7149pt7bBitmaps,
+ (GFXglyph *)Shree7149pt7bGlyphs,
+ 0x20, 0x7E, 26 };
+
+// Approx. 1834 bytes
+
+
+// Approx. 1730 bytes
+
+// Approx. 1385 bytes
+
+const uint8_t C649pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x0F, 0xF0, 0xF0, 0x7F, 0x83,
+ 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3C, 0x3C, 0x1E, 0x0F, 0x07, 0x83,
+ 0xC1, 0xE0, 0xF0, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xC1, 0xE0, 0xF0,
+ 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E,
+ 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0x07, 0x80, 0x3C, 0x0F, 0xFE, 0x7F, 0xFF,
+ 0x00, 0x78, 0x00, 0xFF, 0x87, 0xFC, 0x00, 0x78, 0x03, 0xC0, 0x19, 0xFF,
+ 0xCF, 0xFE, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x1F, 0x01, 0xF0, 0xFF, 0x0F,
+ 0x03, 0xC0, 0x3C, 0x07, 0x80, 0x78, 0x04, 0x03, 0xC0, 0x30, 0x0F, 0x0F,
+ 0xF0, 0xFC, 0x0F, 0xC0, 0xF0, 0x3F, 0xE0, 0x7F, 0xC3, 0xC1, 0xE7, 0x83,
+ 0xC3, 0xFE, 0x07, 0xFC, 0x0F, 0xE0, 0x1F, 0xC0, 0x30, 0x81, 0xE0, 0xFF,
+ 0xC1, 0xFF, 0x83, 0xCF, 0x07, 0x87, 0xFF, 0xCF, 0xFF, 0x80, 0x07, 0x83,
+ 0xCF, 0x07, 0x8F, 0x07, 0x80, 0x07, 0x83, 0xCF, 0x07, 0x8F, 0x07, 0x83,
+ 0xC1, 0xE0, 0xF0, 0x78, 0x0F, 0x07, 0x83, 0xC0, 0x3C, 0x1E, 0xF0, 0x78,
+ 0x0F, 0x07, 0x80, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xCF, 0x07, 0x83,
+ 0xC7, 0x83, 0xC0, 0x3C, 0x1E, 0x0F, 0x07, 0x80, 0xFF, 0x80, 0x3F, 0xE0,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0x80, 0x3F, 0xE0, 0x3C, 0x1E, 0x0F,
+ 0x07, 0x80, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x7F, 0xFF,
+ 0xFF, 0xE0, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x3C, 0xF3, 0xCF, 0xF3,
+ 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0x00, 0x0F, 0x80, 0x07, 0xC0,
+ 0x1E, 0x00, 0x0F, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x06, 0x00, 0x0F, 0x00,
+ 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x00, 0x3F,
+ 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x3F, 0xF9, 0xFF, 0xF9, 0xFF, 0xCF,
+ 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF, 0x80,
+ 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x03, 0xF8, 0x1F, 0xC0, 0x1E, 0x00,
+ 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x7F, 0xFF, 0xFF,
+ 0xE0, 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xF0, 0x07, 0x80, 0x3C, 0x07,
+ 0x80, 0x3C, 0x3C, 0x01, 0xE0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x7F, 0xFF,
+ 0xFF, 0xE0, 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xF0, 0x07, 0x80, 0x3C,
+ 0x3F, 0x81, 0xFC, 0x00, 0x60, 0x03, 0xC0, 0x1F, 0xE0, 0xFF, 0x07, 0x9F,
+ 0xF0, 0xFF, 0x80, 0x00, 0x78, 0x00, 0x78, 0x03, 0xF8, 0x03, 0xF8, 0x0F,
+ 0xF8, 0x0F, 0xF8, 0xF0, 0x78, 0xF0, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0xFF, 0xFF, 0xFF,
+ 0xFC, 0x01, 0xE0, 0x0F, 0xFE, 0x7F, 0xF0, 0x01, 0x80, 0x0F, 0x00, 0x78,
+ 0x03, 0xC0, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF, 0x80, 0x3F, 0xE1,
+ 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x00, 0x78, 0x03, 0xFF, 0x9F, 0xFC, 0xF0,
+ 0x67, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF, 0x80, 0xFF,
+ 0xFF, 0xFF, 0xFC, 0x1F, 0xE0, 0xF0, 0x1E, 0x00, 0xF0, 0x1E, 0x00, 0xF0,
+ 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00,
+ 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3C, 0xFF, 0x87,
+ 0xFC, 0x30, 0x67, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF,
+ 0x80, 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3C, 0xFF,
+ 0xE7, 0xFF, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0,
+ 0xFF, 0x80, 0xFF, 0x00, 0x00, 0xFF, 0x3C, 0xF0, 0x00, 0x00, 0x00, 0x0F,
+ 0x3C, 0xF3, 0xFC, 0xF0, 0x03, 0xF8, 0x1F, 0xC1, 0xE0, 0x0F, 0x03, 0xC0,
+ 0x1E, 0x03, 0xC0, 0x1E, 0x00, 0x30, 0x01, 0xE0, 0x01, 0xE0, 0x0F, 0x00,
+ 0x78, 0x01, 0xFC, 0x0F, 0xE0, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x0F,
+ 0xFF, 0xFF, 0xFC, 0xFE, 0x07, 0xF0, 0x01, 0xE0, 0x0F, 0x00, 0x1E, 0x00,
+ 0xF0, 0x01, 0xE0, 0x0F, 0x00, 0x60, 0x0F, 0x01, 0xE0, 0x0F, 0x00, 0x78,
+ 0x7F, 0x03, 0xF8, 0x00, 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xF0, 0x07,
+ 0x80, 0x3C, 0x07, 0x80, 0x3C, 0x07, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0xC0, 0x1E, 0x00, 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF,
+ 0x3F, 0xF9, 0xFF, 0xCF, 0xFE, 0x7F, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0,
+ 0x3F, 0x01, 0x9F, 0xF0, 0xFF, 0x80, 0x07, 0x80, 0x3C, 0x0F, 0xF8, 0x7F,
+ 0xCF, 0x07, 0xF8, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0x83, 0xFC, 0x1F,
+ 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xE0, 0xFF, 0xE7, 0xFF, 0x3C, 0x1F,
+ 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xFF, 0x9F, 0xFC, 0xF0, 0x67, 0x83, 0xFC,
+ 0x1F, 0xE0, 0xFF, 0x07, 0xFF, 0xF3, 0xFF, 0x80, 0x3F, 0xE1, 0xFF, 0x3C,
+ 0x1F, 0xE0, 0xFF, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80,
+ 0x3C, 0x01, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF, 0x80, 0xFF, 0x87, 0xFC,
+ 0x3C, 0x79, 0xE3, 0xCF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F,
+ 0x83, 0xFC, 0x79, 0xE3, 0xCF, 0x1E, 0x7F, 0xC3, 0xFE, 0x00, 0xFF, 0xFF,
+ 0xFF, 0xFC, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xFE, 0x1F, 0xF0, 0xF0,
+ 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x7F, 0xFF, 0xFF, 0xE0, 0xFF,
+ 0xFF, 0xFF, 0xFC, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xFE, 0x1F, 0xF0,
+ 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x00,
+ 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x00, 0x78, 0x03, 0xCF, 0xFE,
+ 0x7F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF,
+ 0x80, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xFF,
+ 0xFF, 0xFF, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F,
+ 0xC1, 0xE0, 0xFF, 0xFF, 0xCF, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C,
+ 0x1E, 0x0F, 0x07, 0x83, 0xC7, 0xFF, 0xFE, 0x0F, 0xF8, 0x7F, 0xC0, 0x78,
+ 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00,
+ 0x79, 0xE3, 0xCF, 0x1E, 0x1F, 0xC0, 0xFE, 0x00, 0xF0, 0x7F, 0x83, 0xFC,
+ 0x79, 0xE3, 0xCF, 0xF8, 0x7F, 0xC3, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xFC,
+ 0x3C, 0x79, 0xE3, 0xCF, 0x1E, 0x78, 0x3F, 0xC1, 0xE0, 0xF0, 0x07, 0x80,
+ 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07,
+ 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x7F, 0xFF, 0xFF, 0xE0, 0xF0, 0x1F,
+ 0xE0, 0x3F, 0xF9, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x67, 0xF8,
+ 0xCF, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x03,
+ 0xFC, 0x07, 0x80, 0xF0, 0x7F, 0x83, 0xFF, 0x9F, 0xFC, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x9F, 0xFC, 0x1F, 0xE0, 0xFF, 0x07,
+ 0xF8, 0x3F, 0xC1, 0xE0, 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x07,
+ 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF,
+ 0x07, 0x9F, 0xF0, 0xFF, 0x80, 0xFF, 0xE7, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF,
+ 0x07, 0xF8, 0x3F, 0xFF, 0x9F, 0xFC, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0,
+ 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x00, 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0,
+ 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1E,
+ 0x7F, 0xC3, 0xFE, 0x01, 0xFC, 0x0F, 0xE0, 0xFF, 0xE7, 0xFF, 0x3C, 0x1F,
+ 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xFF, 0x9F, 0xFC, 0xFF, 0x87, 0xFC, 0x3C,
+ 0x79, 0xE3, 0xCF, 0x1E, 0x78, 0x3F, 0xC1, 0xE0, 0x3F, 0xE1, 0xFF, 0x3C,
+ 0x1F, 0xE0, 0xFF, 0x00, 0x78, 0x00, 0xFF, 0x87, 0xFC, 0x00, 0x60, 0x03,
+ 0xC0, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF, 0x80, 0xFF, 0xFF, 0xFF,
+ 0xC1, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80,
+ 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x7F,
+ 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0,
+ 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF, 0x80, 0xF0,
+ 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F,
+ 0xF0, 0x7F, 0x83, 0xFC, 0x1E, 0x7F, 0xC3, 0xFE, 0x03, 0xC0, 0x1E, 0x00,
+ 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC,
+ 0x67, 0xF8, 0xCF, 0xF1, 0x9F, 0xFF, 0xFF, 0xF9, 0xFF, 0xF3, 0xFF, 0xE7,
+ 0xFE, 0x03, 0xFC, 0x07, 0x80, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xF3,
+ 0xFE, 0x1F, 0xF0, 0x1E, 0x00, 0xF0, 0x3F, 0xE1, 0xFF, 0x0C, 0x19, 0xE0,
+ 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xE0, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0,
+ 0xFF, 0x07, 0xF8, 0x3C, 0xFF, 0x87, 0xFC, 0x07, 0x80, 0x3C, 0x01, 0xE0,
+ 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xC0, 0x1E,
+ 0x00, 0xF0, 0x1E, 0x00, 0xF0, 0x1E, 0x00, 0xF0, 0x3C, 0x01, 0xE0, 0x3C,
+ 0x01, 0xE0, 0x0F, 0x00, 0x7F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC, 0x1E,
+ 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0xFF,
+ 0xFE, 0xF0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00,
+ 0x3C, 0x00, 0x06, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E,
+ 0x00, 0x01, 0xF0, 0x00, 0xF8, 0xFF, 0xFF, 0xC1, 0xE0, 0xF0, 0x78, 0x3C,
+ 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7F, 0xFF, 0xFE, 0x01, 0x80,
+ 0x03, 0x00, 0x1F, 0x80, 0x3F, 0x00, 0x46, 0x07, 0x8F, 0x0E, 0x06, 0x7C,
+ 0x0F, 0xF8, 0x1F, 0x80, 0x0F, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
+ 0xC3, 0x00, 0x0C, 0x30, 0x30, 0xC0, 0x3F, 0xE1, 0xFF, 0x00, 0x1E, 0x00,
+ 0xF3, 0xFF, 0x9F, 0xFC, 0xC1, 0xFE, 0x0F, 0xF0, 0x79, 0xFF, 0xCF, 0xFE,
+ 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0xFE, 0x7F, 0xF3, 0xC1, 0x9E,
+ 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xFF, 0xCF, 0xFE, 0x00, 0x3F, 0xE7,
+ 0xFF, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0x30, 0x07, 0xFC,
+ 0xFF, 0x80, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF3, 0xFF, 0x9F, 0xFC,
+ 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1E, 0x7F, 0xF3, 0xFF, 0x80,
+ 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1E,
+ 0x00, 0x30, 0x01, 0xFF, 0x0F, 0xF8, 0x0F, 0xE1, 0xFC, 0xF0, 0x1E, 0x0F,
+ 0xFF, 0xFF, 0xCF, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0,
+ 0x3F, 0xF9, 0xFF, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3C, 0xFF, 0xE7,
+ 0xFF, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xFF, 0xCF, 0xFE, 0x00, 0xF0, 0x07,
+ 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0xFE, 0x7F, 0xF3, 0xC1, 0x9E, 0x0F, 0xF0,
+ 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0x80, 0x3C, 0x1E, 0x00, 0x00,
+ 0x0F, 0xC7, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x1F, 0xFF, 0xF8, 0x01,
+ 0xE0, 0x3C, 0x00, 0x00, 0x00, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0,
+ 0x3C, 0x07, 0x80, 0xF0, 0x1F, 0xFF, 0x3F, 0xE0, 0xF0, 0x07, 0x80, 0x3C,
+ 0x01, 0xE0, 0x0F, 0x1E, 0x78, 0xF3, 0xFE, 0x1F, 0xF0, 0xF1, 0xE7, 0x8F,
+ 0x3C, 0x79, 0xE0, 0xFF, 0x07, 0x80, 0xFC, 0x7E, 0x0F, 0x07, 0x83, 0xC1,
+ 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x1F, 0xFF, 0xF8, 0xF0, 0x79, 0xE0,
+ 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x67, 0xF8, 0xCF,
+ 0xF1, 0x9F, 0xE0, 0x3F, 0xC0, 0x78, 0xFF, 0xE7, 0xFF, 0x3C, 0x1F, 0xE0,
+ 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1E,
+ 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE,
+ 0x0F, 0x30, 0x61, 0xFF, 0x0F, 0xF8, 0xFF, 0xE7, 0xFF, 0x3C, 0x1F, 0xE0,
+ 0xFF, 0x07, 0xF8, 0x3F, 0xFF, 0x9F, 0xFC, 0xF0, 0x07, 0x80, 0x3C, 0x01,
+ 0xE0, 0x0F, 0x00, 0x00, 0x3F, 0xF9, 0xFF, 0xFC, 0x1F, 0xE0, 0xFF, 0x07,
+ 0xF8, 0x3C, 0xFF, 0xE7, 0xFF, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0,
+ 0x07, 0x80, 0xFF, 0xE7, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x00, 0x78, 0x03,
+ 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x00, 0x3F, 0xF9, 0xFF, 0xFC,
+ 0x01, 0xE0, 0x03, 0xFE, 0x1F, 0xF0, 0x01, 0x80, 0x0F, 0x00, 0x7F, 0xFF,
+ 0x3F, 0xF8, 0x07, 0x80, 0x3C, 0x3F, 0xFF, 0xFF, 0xF0, 0x78, 0x03, 0xC0,
+ 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x07, 0xF0, 0x3F, 0x80,
+ 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE,
+ 0x0F, 0xF0, 0x79, 0xFF, 0xCF, 0xFE, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0,
+ 0xFF, 0x07, 0xF8, 0x3C, 0xC1, 0x87, 0xFC, 0x3F, 0xE0, 0x3C, 0x01, 0xE0,
+ 0xF0, 0x1F, 0xE0, 0x3F, 0xC6, 0x7F, 0x8C, 0xFF, 0x19, 0xFF, 0xFF, 0xCF,
+ 0xFE, 0x1F, 0xFC, 0x3C, 0x78, 0x78, 0xF0, 0xF1, 0xE0, 0xF0, 0x7F, 0x83,
+ 0xCF, 0xF8, 0x7F, 0xC0, 0x78, 0x03, 0xC0, 0xFF, 0x87, 0xFC, 0x30, 0x67,
+ 0x83, 0xFC, 0x1E, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8,
+ 0x3C, 0xFF, 0xE7, 0xFF, 0x01, 0xE0, 0x0F, 0x00, 0x79, 0xFF, 0x0F, 0xF8,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xC0, 0x78, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0x1E,
+ 0x07, 0x80, 0x3C, 0x07, 0xFF, 0xFF, 0xFE, 0x07, 0x83, 0xCF, 0x07, 0x83,
+ 0xC1, 0xE3, 0xC1, 0xE0, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC0, 0x3C, 0x1E,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0x78, 0x0F,
+ 0x07, 0x83, 0xC1, 0xE0, 0x1E, 0x0F, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC7,
+ 0x83, 0xC0, 0x3F, 0x86, 0x7F, 0x0F, 0x0F, 0xE6, 0x1F, 0xC0 };
+
+const GFXglyph C649pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 18, 0, 0 }, // 0x20 ' '
+ { 1, 4, 15, 18, 7, -14 }, // 0x21 '!'
+ { 9, 13, 6, 18, 2, -14 }, // 0x22 '"'
+ { 19, 18, 15, 18, 0, -14 }, // 0x23 '#'
+ { 53, 13, 15, 18, 2, -14 }, // 0x24 '$'
+ { 78, 12, 15, 18, 2, -14 }, // 0x25 '%'
+ { 101, 15, 15, 18, 2, -14 }, // 0x26 '&'
+ { 130, 9, 6, 18, 7, -14 }, // 0x27 '''
+ { 137, 9, 15, 18, 4, -14 }, // 0x28 '('
+ { 154, 9, 15, 18, 4, -14 }, // 0x29 ')'
+ { 171, 18, 10, 18, 0, -12 }, // 0x2A '*'
+ { 194, 13, 11, 18, 2, -12 }, // 0x2B '+'
+ { 212, 6, 6, 18, 4, -3 }, // 0x2C ','
+ { 217, 13, 2, 18, 2, -8 }, // 0x2D '-'
+ { 221, 4, 4, 18, 7, -3 }, // 0x2E '.'
+ { 223, 17, 13, 18, 2, -12 }, // 0x2F '/'
+ { 251, 13, 15, 18, 2, -14 }, // 0x30 '0'
+ { 276, 13, 15, 18, 2, -14 }, // 0x31 '1'
+ { 301, 13, 15, 18, 2, -14 }, // 0x32 '2'
+ { 326, 13, 15, 18, 2, -14 }, // 0x33 '3'
+ { 351, 16, 15, 18, 2, -14 }, // 0x34 '4'
+ { 381, 13, 15, 18, 2, -14 }, // 0x35 '5'
+ { 406, 13, 15, 18, 2, -14 }, // 0x36 '6'
+ { 431, 13, 15, 18, 2, -14 }, // 0x37 '7'
+ { 456, 13, 15, 18, 2, -14 }, // 0x38 '8'
+ { 481, 13, 15, 18, 2, -14 }, // 0x39 '9'
+ { 506, 4, 8, 18, 7, -10 }, // 0x3A ':'
+ { 510, 6, 13, 18, 4, -10 }, // 0x3B ';'
+ { 520, 13, 15, 18, 2, -14 }, // 0x3C '<'
+ { 545, 13, 6, 18, 2, -10 }, // 0x3D '='
+ { 555, 13, 15, 18, 2, -14 }, // 0x3E '>'
+ { 580, 13, 15, 18, 2, -14 }, // 0x3F '?'
+ { 605, 13, 15, 18, 2, -14 }, // 0x40 '@'
+ { 630, 13, 15, 18, 2, -14 }, // 0x41 'A'
+ { 655, 13, 15, 18, 2, -14 }, // 0x42 'B'
+ { 680, 13, 15, 18, 2, -14 }, // 0x43 'C'
+ { 705, 13, 15, 18, 2, -14 }, // 0x44 'D'
+ { 730, 13, 15, 18, 2, -14 }, // 0x45 'E'
+ { 755, 13, 15, 18, 2, -14 }, // 0x46 'F'
+ { 780, 13, 15, 18, 2, -14 }, // 0x47 'G'
+ { 805, 13, 15, 18, 2, -14 }, // 0x48 'H'
+ { 830, 9, 15, 18, 4, -14 }, // 0x49 'I'
+ { 847, 13, 15, 18, 2, -14 }, // 0x4A 'J'
+ { 872, 13, 15, 18, 2, -14 }, // 0x4B 'K'
+ { 897, 13, 15, 18, 2, -14 }, // 0x4C 'L'
+ { 922, 15, 15, 18, 2, -14 }, // 0x4D 'M'
+ { 951, 13, 15, 18, 2, -14 }, // 0x4E 'N'
+ { 976, 13, 15, 18, 2, -14 }, // 0x4F 'O'
+ { 1001, 13, 15, 18, 2, -14 }, // 0x50 'P'
+ { 1026, 13, 15, 18, 2, -14 }, // 0x51 'Q'
+ { 1051, 13, 15, 18, 2, -14 }, // 0x52 'R'
+ { 1076, 13, 15, 18, 2, -14 }, // 0x53 'S'
+ { 1101, 13, 15, 18, 2, -14 }, // 0x54 'T'
+ { 1126, 13, 15, 18, 2, -14 }, // 0x55 'U'
+ { 1151, 13, 15, 18, 2, -14 }, // 0x56 'V'
+ { 1176, 15, 15, 18, 2, -14 }, // 0x57 'W'
+ { 1205, 13, 15, 18, 2, -14 }, // 0x58 'X'
+ { 1230, 13, 15, 18, 2, -14 }, // 0x59 'Y'
+ { 1255, 13, 15, 18, 2, -14 }, // 0x5A 'Z'
+ { 1280, 9, 15, 18, 4, -14 }, // 0x5B '['
+ { 1297, 17, 13, 18, 2, -12 }, // 0x5C '\'
+ { 1325, 9, 15, 18, 4, -14 }, // 0x5D ']'
+ { 1342, 15, 11, 18, 2, -14 }, // 0x5E '^'
+ { 1363, 18, 2, 18, 0, 1 }, // 0x5F '_'
+ { 1368, 6, 7, 18, 4, -15 }, // 0x60 '`'
+ { 1374, 13, 11, 18, 2, -10 }, // 0x61 'a'
+ { 1392, 13, 13, 18, 2, -12 }, // 0x62 'b'
+ { 1414, 11, 11, 18, 2, -10 }, // 0x63 'c'
+ { 1430, 13, 13, 18, 2, -12 }, // 0x64 'd'
+ { 1452, 13, 11, 18, 2, -10 }, // 0x65 'e'
+ { 1470, 11, 13, 18, 4, -12 }, // 0x66 'f'
+ { 1488, 13, 13, 18, 2, -10 }, // 0x67 'g'
+ { 1510, 13, 13, 18, 2, -12 }, // 0x68 'h'
+ { 1532, 9, 13, 18, 4, -12 }, // 0x69 'i'
+ { 1547, 11, 15, 18, 4, -12 }, // 0x6A 'j'
+ { 1568, 13, 13, 18, 2, -12 }, // 0x6B 'k'
+ { 1590, 9, 13, 18, 4, -12 }, // 0x6C 'l'
+ { 1605, 15, 11, 18, 2, -10 }, // 0x6D 'm'
+ { 1626, 13, 11, 18, 2, -10 }, // 0x6E 'n'
+ { 1644, 13, 11, 18, 2, -10 }, // 0x6F 'o'
+ { 1662, 13, 13, 18, 2, -10 }, // 0x70 'p'
+ { 1684, 13, 13, 18, 2, -10 }, // 0x71 'q'
+ { 1706, 13, 11, 18, 2, -10 }, // 0x72 'r'
+ { 1724, 13, 11, 18, 2, -10 }, // 0x73 's'
+ { 1742, 13, 13, 18, 2, -12 }, // 0x74 't'
+ { 1764, 13, 11, 18, 2, -10 }, // 0x75 'u'
+ { 1782, 13, 11, 18, 2, -10 }, // 0x76 'v'
+ { 1800, 15, 11, 18, 2, -10 }, // 0x77 'w'
+ { 1821, 13, 11, 18, 2, -10 }, // 0x78 'x'
+ { 1839, 13, 13, 18, 2, -10 }, // 0x79 'y'
+ { 1861, 13, 11, 18, 2, -10 }, // 0x7A 'z'
+ { 1879, 9, 15, 18, 4, -14 }, // 0x7B '{'
+ { 1896, 4, 17, 18, 7, -14 }, // 0x7C '|'
+ { 1905, 9, 15, 18, 4, -14 }, // 0x7D '}'
+ { 1922, 15, 4, 18, 2, -7 } }; // 0x7E '~'
+
+const GFXfont C649pt7b PROGMEM = {
+ (uint8_t *)C649pt7bBitmaps,
+ (GFXglyph *)C649pt7bGlyphs,
+ 0x20, 0x7E, 18 };
+
+// Approx. 2602 bytes
+const uint8_t C645pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xC3, 0xC7, 0x8F, 0x18, 0x63, 0x18, 0xCF, 0xFD, 0x8C, 0xFF,
+ 0xD8, 0xC6, 0x31, 0x8C, 0x18, 0xFF, 0x03, 0xE0, 0x60, 0xBF, 0x0C, 0xC3,
+ 0x31, 0x86, 0x21, 0x0C, 0xE3, 0x7C, 0xC6, 0x7C, 0x78, 0x48, 0xC7, 0xC6,
+ 0x7F, 0x1B, 0x30, 0x1B, 0x31, 0x8C, 0x21, 0x83, 0xC3, 0x06, 0x31, 0x91,
+ 0x98, 0x63, 0x0F, 0x8F, 0xFC, 0xF8, 0x63, 0x00, 0x18, 0x30, 0x67, 0xF1,
+ 0x83, 0x00, 0x6F, 0x00, 0xFE, 0xF0, 0x01, 0xC1, 0x80, 0xE0, 0x20, 0x30,
+ 0x18, 0x0C, 0x00, 0x7D, 0x8F, 0x7F, 0xBC, 0x78, 0xF1, 0xBE, 0x18, 0x31,
+ 0xE0, 0xC1, 0x83, 0x06, 0x7F, 0x7D, 0x8C, 0x18, 0x66, 0x08, 0x30, 0x7F,
+ 0x7D, 0x8C, 0x19, 0xE0, 0x40, 0xF1, 0xBE, 0x06, 0x1E, 0x3E, 0xC6, 0xFF,
+ 0x06, 0x06, 0x06, 0xFF, 0x83, 0xF0, 0x20, 0x60, 0xF1, 0xBE, 0x7D, 0x8F,
+ 0x07, 0xEC, 0x58, 0xF1, 0xBE, 0xFF, 0x8C, 0x30, 0xC1, 0x83, 0x06, 0x0C,
+ 0x7D, 0x8F, 0x1B, 0xE4, 0x58, 0xF1, 0xBE, 0x7D, 0x8F, 0x1B, 0xF0, 0x60,
+ 0xF1, 0xBE, 0xC3, 0x60, 0x06, 0xF0, 0x0F, 0x18, 0x60, 0xC0, 0x40, 0x20,
+ 0x18, 0x0F, 0xFE, 0x03, 0xF8, 0xF0, 0x30, 0x30, 0x30, 0x41, 0x06, 0x78,
+ 0x7D, 0x8C, 0x18, 0x61, 0x80, 0x00, 0x0C, 0x7D, 0x8F, 0x3E, 0x7C, 0x18,
+ 0x30, 0xBE, 0x18, 0xFB, 0x1F, 0xFC, 0x78, 0xF1, 0xE3, 0xFD, 0x8F, 0x1F,
+ 0xEC, 0x58, 0xF1, 0xFE, 0x7D, 0x8F, 0x06, 0x0C, 0x18, 0x31, 0xBE, 0xF9,
+ 0x9B, 0x1E, 0x3C, 0x78, 0xB3, 0x7C, 0xFF, 0x83, 0x07, 0x8C, 0x18, 0x30,
+ 0x7F, 0xFF, 0x83, 0x07, 0x8C, 0x18, 0x30, 0x60, 0x7D, 0x8F, 0x06, 0xFC,
+ 0x78, 0xF1, 0xBE, 0xC7, 0x8F, 0x1F, 0xFC, 0x78, 0xF1, 0xE3, 0xFB, 0x18,
+ 0xC6, 0x31, 0x9F, 0x3E, 0x18, 0x30, 0x60, 0xC1, 0xB3, 0x3C, 0xC7, 0x9B,
+ 0xE7, 0x8F, 0x19, 0x33, 0x63, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x7F,
+ 0xC3, 0xF7, 0xFF, 0xCB, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0xEF, 0xFF, 0xFD,
+ 0xF8, 0xF1, 0xE3, 0x7D, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xBE, 0xFD, 0x8F,
+ 0x1F, 0xEC, 0x18, 0x30, 0x60, 0x7C, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x7C,
+ 0x0F, 0xFD, 0x8F, 0x1F, 0xEF, 0x99, 0x31, 0x63, 0x7D, 0x8F, 0x03, 0xE0,
+ 0x40, 0xF1, 0xBE, 0xFE, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0xC7, 0x8F,
+ 0x1E, 0x3C, 0x78, 0xF1, 0xBE, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xDF, 0x0C,
+ 0xC3, 0xC3, 0xC3, 0xCB, 0xCB, 0xF7, 0xF7, 0xC3, 0xC7, 0x8D, 0xF0, 0xC1,
+ 0x8C, 0xB1, 0xE3, 0xC7, 0x8F, 0x1B, 0xE1, 0x83, 0x06, 0x0C, 0xFE, 0x0C,
+ 0x30, 0xC6, 0x08, 0x30, 0x7F, 0xFC, 0xCC, 0xCC, 0xCF, 0xC0, 0x18, 0x01,
+ 0x80, 0x20, 0x06, 0x01, 0x80, 0x1C, 0xF3, 0x33, 0x33, 0x3F, 0x08, 0x3C,
+ 0x24, 0x42, 0xC3, 0x81, 0xFF, 0xC0, 0x81, 0x10, 0x7C, 0x0D, 0xFA, 0x3C,
+ 0x6F, 0xC0, 0xC1, 0x83, 0xF6, 0x2C, 0x78, 0xFF, 0x00, 0x7F, 0x0C, 0x30,
+ 0x41, 0xF0, 0x06, 0x0D, 0xFA, 0x3C, 0x78, 0xDF, 0x80, 0x7D, 0x8F, 0xFE,
+ 0x04, 0x0F, 0x80, 0x3D, 0x8F, 0xD8, 0x61, 0x86, 0x00, 0x7F, 0x8F, 0x1B,
+ 0xF0, 0x60, 0xFF, 0x00, 0xC1, 0x83, 0xF6, 0x2C, 0x78, 0xF1, 0x80, 0x60,
+ 0x38, 0xC6, 0x33, 0xE0, 0x0C, 0x00, 0xC3, 0x0C, 0x30, 0xFE, 0xC1, 0x83,
+ 0x37, 0xCC, 0x99, 0xB1, 0x80, 0xE3, 0x18, 0xC6, 0x33, 0xE0, 0xC6, 0xFF,
+ 0xFF, 0xCB, 0xC3, 0xC3, 0xFD, 0x8F, 0x1E, 0x3C, 0x78, 0xC0, 0x7D, 0x8F,
+ 0x1E, 0x34, 0x4F, 0x80, 0xFD, 0x8F, 0x1F, 0xEC, 0x18, 0x30, 0x00, 0x7F,
+ 0x8F, 0x1B, 0xF0, 0x60, 0xC1, 0x80, 0xFD, 0x8F, 0x06, 0x0C, 0x18, 0x00,
+ 0x7F, 0x81, 0xF0, 0x20, 0x7F, 0x80, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18,
+ 0x0F, 0xC7, 0x8F, 0x1E, 0x3C, 0x6F, 0xC0, 0xC7, 0x8F, 0x1A, 0x23, 0x83,
+ 0x00, 0xC3, 0xCB, 0xCB, 0x7E, 0x66, 0x66, 0xC6, 0xF8, 0x60, 0xC6, 0x58,
+ 0xC0, 0xC7, 0x8F, 0x1B, 0xF0, 0xC1, 0xBE, 0x00, 0xFE, 0x18, 0x60, 0xC6,
+ 0x1F, 0xC0, 0x1B, 0x19, 0x86, 0x31, 0x83, 0xFF, 0xFF, 0xC0, 0xC3, 0x18,
+ 0x36, 0x31, 0x98, 0x79, 0x8F };
+
+const GFXglyph C645pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 10, 0, 0 }, // 0x20 ' '
+ { 1, 2, 8, 10, 4, -7 }, // 0x21 '!'
+ { 3, 7, 3, 10, 1, -7 }, // 0x22 '"'
+ { 6, 10, 8, 10, 0, -7 }, // 0x23 '#'
+ { 16, 7, 8, 10, 1, -7 }, // 0x24 '$'
+ { 23, 6, 8, 10, 1, -7 }, // 0x25 '%'
+ { 29, 8, 8, 10, 1, -7 }, // 0x26 '&'
+ { 37, 5, 3, 10, 4, -7 }, // 0x27 '''
+ { 39, 5, 8, 10, 2, -7 }, // 0x28 '('
+ { 44, 5, 8, 10, 2, -7 }, // 0x29 ')'
+ { 49, 10, 5, 10, 0, -6 }, // 0x2A '*'
+ { 56, 7, 6, 10, 1, -6 }, // 0x2B '+'
+ { 62, 3, 3, 10, 2, -1 }, // 0x2C ','
+ { 64, 7, 1, 10, 1, -4 }, // 0x2D '-'
+ { 65, 2, 2, 10, 4, -1 }, // 0x2E '.'
+ { 66, 10, 7, 10, 1, -6 }, // 0x2F '/'
+ { 75, 7, 8, 10, 1, -7 }, // 0x30 '0'
+ { 82, 7, 8, 10, 1, -7 }, // 0x31 '1'
+ { 89, 7, 8, 10, 1, -7 }, // 0x32 '2'
+ { 96, 7, 8, 10, 1, -7 }, // 0x33 '3'
+ { 103, 8, 8, 10, 1, -7 }, // 0x34 '4'
+ { 111, 7, 8, 10, 1, -7 }, // 0x35 '5'
+ { 118, 7, 8, 10, 1, -7 }, // 0x36 '6'
+ { 125, 7, 8, 10, 1, -7 }, // 0x37 '7'
+ { 132, 7, 8, 10, 1, -7 }, // 0x38 '8'
+ { 139, 7, 8, 10, 1, -7 }, // 0x39 '9'
+ { 146, 2, 4, 10, 4, -5 }, // 0x3A ':'
+ { 147, 3, 7, 10, 2, -5 }, // 0x3B ';'
+ { 150, 8, 8, 10, 1, -7 }, // 0x3C '<'
+ { 158, 7, 3, 10, 1, -5 }, // 0x3D '='
+ { 161, 7, 8, 10, 1, -7 }, // 0x3E '>'
+ { 168, 7, 8, 10, 1, -7 }, // 0x3F '?'
+ { 175, 7, 8, 10, 1, -7 }, // 0x40 '@'
+ { 182, 7, 8, 10, 1, -7 }, // 0x41 'A'
+ { 189, 7, 8, 10, 1, -7 }, // 0x42 'B'
+ { 196, 7, 8, 10, 1, -7 }, // 0x43 'C'
+ { 203, 7, 8, 10, 1, -7 }, // 0x44 'D'
+ { 210, 7, 8, 10, 1, -7 }, // 0x45 'E'
+ { 217, 7, 8, 10, 1, -7 }, // 0x46 'F'
+ { 224, 7, 8, 10, 1, -7 }, // 0x47 'G'
+ { 231, 7, 8, 10, 1, -7 }, // 0x48 'H'
+ { 238, 5, 8, 10, 2, -7 }, // 0x49 'I'
+ { 243, 7, 8, 10, 1, -7 }, // 0x4A 'J'
+ { 250, 7, 8, 10, 1, -7 }, // 0x4B 'K'
+ { 257, 7, 8, 10, 1, -7 }, // 0x4C 'L'
+ { 264, 8, 8, 10, 1, -7 }, // 0x4D 'M'
+ { 272, 7, 8, 10, 1, -7 }, // 0x4E 'N'
+ { 279, 7, 8, 10, 1, -7 }, // 0x4F 'O'
+ { 286, 7, 8, 10, 1, -7 }, // 0x50 'P'
+ { 293, 8, 8, 10, 1, -7 }, // 0x51 'Q'
+ { 301, 7, 8, 10, 1, -7 }, // 0x52 'R'
+ { 308, 7, 8, 10, 1, -7 }, // 0x53 'S'
+ { 315, 7, 8, 10, 1, -7 }, // 0x54 'T'
+ { 322, 7, 8, 10, 1, -7 }, // 0x55 'U'
+ { 329, 7, 8, 10, 1, -7 }, // 0x56 'V'
+ { 336, 8, 8, 10, 1, -7 }, // 0x57 'W'
+ { 344, 7, 8, 10, 1, -7 }, // 0x58 'X'
+ { 351, 7, 8, 10, 1, -7 }, // 0x59 'Y'
+ { 358, 7, 8, 10, 1, -7 }, // 0x5A 'Z'
+ { 365, 4, 8, 10, 2, -7 }, // 0x5B '['
+ { 369, 10, 7, 10, 1, -6 }, // 0x5C '\'
+ { 378, 4, 8, 10, 3, -7 }, // 0x5D ']'
+ { 382, 8, 6, 10, 1, -7 }, // 0x5E '^'
+ { 388, 10, 1, 10, 0, 1 }, // 0x5F '_'
+ { 390, 3, 4, 10, 2, -8 }, // 0x60 '`'
+ { 392, 7, 6, 10, 1, -5 }, // 0x61 'a'
+ { 398, 7, 7, 10, 1, -6 }, // 0x62 'b'
+ { 405, 6, 6, 10, 1, -5 }, // 0x63 'c'
+ { 410, 7, 7, 10, 1, -6 }, // 0x64 'd'
+ { 417, 7, 6, 10, 1, -5 }, // 0x65 'e'
+ { 423, 6, 7, 10, 2, -6 }, // 0x66 'f'
+ { 429, 7, 7, 10, 1, -5 }, // 0x67 'g'
+ { 436, 7, 7, 10, 1, -6 }, // 0x68 'h'
+ { 443, 5, 7, 10, 2, -6 }, // 0x69 'i'
+ { 448, 6, 8, 10, 2, -6 }, // 0x6A 'j'
+ { 454, 7, 7, 10, 1, -6 }, // 0x6B 'k'
+ { 461, 5, 7, 10, 2, -6 }, // 0x6C 'l'
+ { 466, 8, 6, 10, 1, -5 }, // 0x6D 'm'
+ { 472, 7, 6, 10, 1, -5 }, // 0x6E 'n'
+ { 478, 7, 6, 10, 1, -5 }, // 0x6F 'o'
+ { 484, 7, 7, 10, 1, -5 }, // 0x70 'p'
+ { 491, 7, 7, 10, 1, -5 }, // 0x71 'q'
+ { 498, 7, 6, 10, 1, -5 }, // 0x72 'r'
+ { 504, 7, 6, 10, 1, -5 }, // 0x73 's'
+ { 510, 8, 7, 10, 1, -6 }, // 0x74 't'
+ { 517, 7, 6, 10, 1, -5 }, // 0x75 'u'
+ { 523, 7, 6, 10, 1, -5 }, // 0x76 'v'
+ { 529, 8, 6, 10, 1, -5 }, // 0x77 'w'
+ { 535, 7, 6, 10, 1, -5 }, // 0x78 'x'
+ { 541, 7, 7, 10, 1, -5 }, // 0x79 'y'
+ { 548, 7, 6, 10, 1, -5 }, // 0x7A 'z'
+ { 554, 5, 8, 10, 2, -7 }, // 0x7B '{'
+ { 559, 2, 9, 10, 4, -7 }, // 0x7C '|'
+ { 562, 5, 8, 10, 2, -7 }, // 0x7D '}'
+ { 567, 8, 2, 10, 1, -4 } }; // 0x7E '~'
+
+const GFXfont C645pt7b PROGMEM = {
+ (uint8_t *)C645pt7bBitmaps,
+ (GFXglyph *)C645pt7bGlyphs,
+ 0x20, 0x7E, 10 };
+
+// Approx. 1241 bytes
+
+const uint8_t FUTRFW8pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xD0, 0x99, 0x99, 0x90, 0x16, 0x14, 0x14, 0x14, 0x7F, 0x28,
+ 0x28, 0xFE, 0x28, 0x50, 0x50, 0x18, 0x3C, 0x5A, 0x58, 0x58, 0x78, 0x1C,
+ 0x1F, 0x19, 0xD9, 0xDB, 0x7E, 0x18, 0x18, 0x70, 0x46, 0xC2, 0x22, 0x21,
+ 0x12, 0x08, 0x90, 0x39, 0x00, 0x18, 0x00, 0x9E, 0x09, 0x08, 0x48, 0x44,
+ 0x46, 0x61, 0xE0, 0x3C, 0x10, 0x84, 0x21, 0x08, 0x24, 0x0E, 0x06, 0x83,
+ 0x32, 0x84, 0xA0, 0xC4, 0x78, 0xF2, 0xF8, 0x29, 0x69, 0x24, 0x92, 0x24,
+ 0x88, 0x89, 0x32, 0x49, 0x24, 0xA4, 0xA0, 0x25, 0x5C, 0xEE, 0x90, 0x10,
+ 0x20, 0x47, 0xF1, 0x02, 0x04, 0x08, 0x2D, 0x20, 0xF0, 0x80, 0x04, 0x08,
+ 0x10, 0x40, 0x82, 0x04, 0x18, 0x20, 0x41, 0x02, 0x00, 0x38, 0x89, 0x14,
+ 0x18, 0x30, 0x60, 0xC1, 0x83, 0x89, 0x11, 0xC0, 0x71, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x78, 0x8E, 0x0C, 0x10, 0x20, 0x81, 0x04, 0x18, 0x61, 0x87,
+ 0xF0, 0x7C, 0x8A, 0x08, 0x10, 0x20, 0x86, 0x03, 0x03, 0x07, 0x1B, 0xE0,
+ 0x04, 0x04, 0x0C, 0x1C, 0x14, 0x24, 0x24, 0x44, 0xC4, 0xFF, 0x04, 0x04,
+ 0x3E, 0x40, 0x82, 0x04, 0x0F, 0x01, 0x81, 0x03, 0x07, 0x13, 0xC0, 0x0C,
+ 0x10, 0x41, 0x82, 0x0F, 0x11, 0xC1, 0x83, 0x05, 0x13, 0xC0, 0xFE, 0x04,
+ 0x10, 0x20, 0x81, 0x04, 0x08, 0x20, 0x41, 0x04, 0x00, 0x7D, 0x8E, 0x0C,
+ 0x14, 0x47, 0x11, 0x41, 0x83, 0x05, 0x11, 0xC0, 0x38, 0x8A, 0x0C, 0x18,
+ 0x28, 0x8F, 0x04, 0x18, 0x20, 0x80, 0xC0, 0x20, 0x20, 0x02, 0x56, 0xC0,
+ 0x03, 0x1C, 0xE0, 0xE0, 0x1C, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x38,
+ 0x07, 0x07, 0x38, 0xC0, 0x7B, 0x18, 0x43, 0x19, 0xCC, 0x22, 0x89, 0xC0,
+ 0x08, 0x1F, 0x06, 0x11, 0x01, 0x67, 0x59, 0x1B, 0x43, 0x68, 0x4D, 0x09,
+ 0xF3, 0x4B, 0xB0, 0xC0, 0x0F, 0xC0, 0x04, 0x00, 0x80, 0x28, 0x05, 0x01,
+ 0x90, 0x22, 0x04, 0x21, 0xFC, 0x20, 0x88, 0x09, 0x01, 0x20, 0x10, 0xF9,
+ 0x0A, 0x0C, 0x18, 0x30, 0xBF, 0x43, 0x83, 0x06, 0x1F, 0xE0, 0x1F, 0x18,
+ 0x50, 0x08, 0x08, 0x04, 0x02, 0x01, 0x00, 0xC0, 0x20, 0x0C, 0x23, 0xF0,
+ 0xFE, 0x20, 0xC8, 0x0A, 0x03, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0xE0,
+ 0x28, 0x13, 0xF8, 0xFE, 0x08, 0x20, 0x83, 0xF8, 0x20, 0x82, 0x08, 0x3F,
+ 0xFE, 0x08, 0x20, 0x83, 0xF8, 0x20, 0x82, 0x08, 0x20, 0x1F, 0x83, 0x0E,
+ 0x40, 0x2C, 0x00, 0x80, 0x08, 0x00, 0x81, 0xF8, 0x01, 0xC0, 0x14, 0x02,
+ 0x30, 0x40, 0xF8, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xFE, 0x03, 0x01,
+ 0x80, 0xC0, 0x60, 0x30, 0x10, 0xFF, 0xF0, 0x08, 0x42, 0x10, 0x84, 0x21,
+ 0x08, 0x42, 0xE0, 0x83, 0x43, 0x23, 0x11, 0x09, 0x07, 0x02, 0x41, 0x30,
+ 0x8C, 0x42, 0x20, 0x90, 0x20, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21,
+ 0xF0, 0x20, 0x20, 0xC0, 0xC3, 0x03, 0x0A, 0x14, 0x28, 0x50, 0xA1, 0x44,
+ 0x49, 0x91, 0x26, 0x43, 0x09, 0x0C, 0x24, 0x20, 0xA0, 0x02, 0x00, 0x60,
+ 0x1C, 0x06, 0x81, 0x90, 0x66, 0x18, 0xC6, 0x19, 0x83, 0x60, 0x78, 0x0E,
+ 0x01, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0x80, 0x28, 0x00, 0xC0, 0x06, 0x00,
+ 0x30, 0x01, 0x40, 0x13, 0x01, 0x8C, 0x18, 0x1F, 0x00, 0xF9, 0x0E, 0x0C,
+ 0x18, 0x30, 0xBE, 0x40, 0x81, 0x02, 0x04, 0x00, 0x0F, 0x81, 0x83, 0x10,
+ 0x04, 0x80, 0x28, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x41, 0x9B, 0x06,
+ 0x8C, 0x08, 0x1F, 0xE0, 0x01, 0x00, 0xFD, 0x0A, 0x0C, 0x18, 0x30, 0xFF,
+ 0x70, 0xB1, 0x32, 0x34, 0x30, 0x7D, 0x8E, 0x04, 0x04, 0x06, 0x03, 0x01,
+ 0x03, 0x07, 0x13, 0xC0, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10,
+ 0x20, 0x40, 0x80, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01,
+ 0x80, 0xC0, 0xD0, 0x47, 0xC0, 0x80, 0xB0, 0x24, 0x19, 0x04, 0x61, 0x08,
+ 0x82, 0x20, 0x48, 0x14, 0x07, 0x00, 0x80, 0x20, 0xC1, 0x02, 0x83, 0x05,
+ 0x06, 0x1B, 0x0C, 0x22, 0x2C, 0x44, 0x49, 0x8C, 0x92, 0x0A, 0x34, 0x1C,
+ 0x38, 0x38, 0x60, 0x20, 0xC0, 0x40, 0x80, 0x41, 0x31, 0x08, 0x82, 0x81,
+ 0x40, 0x40, 0x20, 0x28, 0x22, 0x11, 0x10, 0x58, 0x30, 0x80, 0xA0, 0x98,
+ 0xC4, 0x41, 0x40, 0xA0, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x7F,
+ 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0x60, 0x20, 0x20, 0x10, 0x10, 0x1F,
+ 0xF0, 0xF2, 0x49, 0x24, 0x92, 0x49, 0x38, 0x40, 0x40, 0x20, 0x10, 0x10,
+ 0x08, 0x0C, 0x04, 0x02, 0x02, 0x01, 0xE4, 0x92, 0x49, 0x24, 0x92, 0x78,
+ 0x32, 0x96, 0x7F, 0xFE, 0xC8, 0x80, 0x3D, 0x43, 0x81, 0x81, 0x81, 0x43,
+ 0x3D, 0x81, 0x02, 0x04, 0x08, 0x17, 0xB1, 0x41, 0x83, 0x07, 0x15, 0xC0,
+ 0x3D, 0x08, 0x20, 0x81, 0x03, 0xC0, 0x02, 0x04, 0x08, 0x10, 0x27, 0x51,
+ 0xC1, 0x83, 0x05, 0x19, 0xD0, 0x3C, 0x8E, 0x0F, 0xF8, 0x08, 0xCF, 0x00,
+ 0x3A, 0x10, 0x84, 0x7D, 0x08, 0x42, 0x10, 0x80, 0x3D, 0x43, 0x81, 0x81,
+ 0x81, 0x43, 0x3D, 0x01, 0x83, 0x7C, 0x82, 0x08, 0x20, 0x83, 0xEC, 0xE1,
+ 0x86, 0x18, 0x61, 0x8F, 0xF0, 0x8F, 0xFE, 0x81, 0x02, 0x04, 0x08, 0x11,
+ 0xA6, 0x58, 0xE1, 0x22, 0x24, 0x20, 0xFF, 0xF0, 0xF7, 0x46, 0x62, 0x31,
+ 0x18, 0x8C, 0x46, 0x22, 0xBB, 0x18, 0x61, 0x86, 0x18, 0x40, 0x3C, 0x42,
+ 0x81, 0x81, 0x81, 0x42, 0x3C, 0xB9, 0x8A, 0x0C, 0x18, 0x38, 0xAF, 0x40,
+ 0x81, 0x00, 0x3A, 0x8E, 0x0C, 0x18, 0x28, 0xCE, 0x81, 0x02, 0x04, 0xBC,
+ 0x88, 0x88, 0x80, 0x7A, 0x18, 0x1E, 0x04, 0x1F, 0x80, 0x49, 0x2E, 0x92,
+ 0x49, 0x00, 0x86, 0x18, 0x61, 0x87, 0x37, 0x80, 0xC2, 0x42, 0x64, 0x24,
+ 0x38, 0x18, 0x10, 0x44, 0x34, 0x62, 0x66, 0x62, 0x94, 0x29, 0x41, 0x08,
+ 0x10, 0x80, 0x42, 0x24, 0x18, 0x18, 0x3C, 0x24, 0x42, 0x42, 0x62, 0x24,
+ 0x24, 0x18, 0x18, 0x10, 0x10, 0x20, 0x20, 0xFC, 0x21, 0x08, 0x61, 0x0F,
+ 0xC0, 0x74, 0x44, 0x44, 0x48, 0x44, 0x44, 0x44, 0x70, 0xFF, 0xE0, 0xE2,
+ 0x22, 0x22, 0x21, 0x22, 0x22, 0x22, 0xE0, 0x71, 0x59, 0x86 };
+
+const GFXglyph FUTRFW8pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 16, 0, 0 }, // 0x20 ' '
+ { 1, 1, 12, 16, 7, -11 }, // 0x21 '!'
+ { 3, 4, 5, 16, 5, -11 }, // 0x22 '"'
+ { 6, 8, 11, 16, 4, -10 }, // 0x23 '#'
+ { 17, 8, 14, 16, 4, -11 }, // 0x24 '$'
+ { 31, 13, 12, 16, 1, -11 }, // 0x25 '%'
+ { 51, 10, 12, 16, 3, -11 }, // 0x26 '&'
+ { 66, 1, 5, 16, 7, -11 }, // 0x27 '''
+ { 67, 3, 15, 16, 6, -11 }, // 0x28 '('
+ { 73, 3, 15, 16, 6, -11 }, // 0x29 ')'
+ { 79, 5, 6, 16, 5, -11 }, // 0x2A '*'
+ { 83, 7, 8, 16, 4, -7 }, // 0x2B '+'
+ { 90, 3, 5, 16, 6, -1 }, // 0x2C ','
+ { 92, 4, 1, 16, 6, -3 }, // 0x2D '-'
+ { 93, 1, 1, 16, 4, 0 }, // 0x2E '.'
+ { 94, 7, 12, 16, 3, -11 }, // 0x2F '/'
+ { 105, 7, 12, 16, 3, -11 }, // 0x30 '0'
+ { 116, 4, 12, 16, 5, -11 }, // 0x31 '1'
+ { 122, 7, 12, 16, 4, -11 }, // 0x32 '2'
+ { 133, 7, 12, 16, 4, -11 }, // 0x33 '3'
+ { 144, 8, 12, 16, 3, -11 }, // 0x34 '4'
+ { 156, 7, 12, 16, 4, -11 }, // 0x35 '5'
+ { 167, 7, 12, 16, 4, -11 }, // 0x36 '6'
+ { 178, 7, 12, 16, 4, -11 }, // 0x37 '7'
+ { 189, 7, 12, 16, 4, -11 }, // 0x38 '8'
+ { 200, 7, 11, 16, 4, -11 }, // 0x39 '9'
+ { 210, 2, 6, 16, 5, -5 }, // 0x3A ':'
+ { 212, 3, 9, 16, 4, -5 }, // 0x3B ';'
+ { 216, 8, 6, 16, 3, -6 }, // 0x3C '<'
+ { 222, 8, 4, 16, 4, -5 }, // 0x3D '='
+ { 226, 8, 6, 16, 4, -6 }, // 0x3E '>'
+ { 232, 6, 12, 16, 5, -11 }, // 0x3F '?'
+ { 241, 11, 12, 16, 2, -11 }, // 0x40 '@'
+ { 258, 11, 12, 16, 2, -11 }, // 0x41 'A'
+ { 275, 7, 12, 16, 4, -11 }, // 0x42 'B'
+ { 286, 9, 12, 16, 2, -11 }, // 0x43 'C'
+ { 300, 10, 12, 16, 3, -11 }, // 0x44 'D'
+ { 315, 6, 12, 16, 4, -11 }, // 0x45 'E'
+ { 324, 6, 12, 16, 5, -11 }, // 0x46 'F'
+ { 333, 12, 12, 16, 2, -11 }, // 0x47 'G'
+ { 351, 9, 12, 16, 3, -11 }, // 0x48 'H'
+ { 365, 1, 12, 16, 7, -11 }, // 0x49 'I'
+ { 367, 5, 12, 16, 4, -11 }, // 0x4A 'J'
+ { 375, 9, 12, 16, 4, -11 }, // 0x4B 'K'
+ { 389, 5, 12, 16, 4, -11 }, // 0x4C 'L'
+ { 397, 14, 12, 16, 1, -11 }, // 0x4D 'M'
+ { 418, 10, 12, 16, 3, -11 }, // 0x4E 'N'
+ { 433, 13, 12, 16, 1, -11 }, // 0x4F 'O'
+ { 453, 7, 12, 16, 5, -11 }, // 0x50 'P'
+ { 464, 13, 13, 16, 2, -11 }, // 0x51 'Q'
+ { 486, 7, 12, 16, 4, -11 }, // 0x52 'R'
+ { 497, 7, 12, 16, 4, -11 }, // 0x53 'S'
+ { 508, 7, 12, 16, 3, -11 }, // 0x54 'T'
+ { 519, 9, 12, 16, 3, -11 }, // 0x55 'U'
+ { 533, 10, 12, 16, 2, -11 }, // 0x56 'V'
+ { 548, 15, 12, 16, 0, -11 }, // 0x57 'W'
+ { 571, 9, 12, 16, 3, -11 }, // 0x58 'X'
+ { 585, 9, 12, 16, 3, -11 }, // 0x59 'Y'
+ { 599, 9, 12, 16, 3, -11 }, // 0x5A 'Z'
+ { 613, 3, 15, 16, 6, -11 }, // 0x5B '['
+ { 619, 8, 11, 16, 4, -10 }, // 0x5C '\'
+ { 630, 3, 15, 16, 6, -11 }, // 0x5D ']'
+ { 636, 5, 3, 16, 5, -10 }, // 0x5E '^'
+ { 638, 16, 1, 16, 0, 1 }, // 0x5F '_'
+ { 640, 3, 3, 16, 5, -10 }, // 0x60 '`'
+ { 642, 8, 7, 16, 4, -6 }, // 0x61 'a'
+ { 649, 7, 12, 16, 4, -11 }, // 0x62 'b'
+ { 660, 6, 7, 16, 4, -6 }, // 0x63 'c'
+ { 666, 7, 12, 16, 3, -11 }, // 0x64 'd'
+ { 677, 7, 7, 16, 4, -6 }, // 0x65 'e'
+ { 684, 5, 12, 16, 5, -11 }, // 0x66 'f'
+ { 692, 8, 10, 16, 4, -6 }, // 0x67 'g'
+ { 702, 6, 12, 16, 5, -11 }, // 0x68 'h'
+ { 711, 1, 12, 16, 7, -11 }, // 0x69 'i'
+ { 713, 1, 15, 16, 7, -11 }, // 0x6A 'j'
+ { 715, 7, 12, 16, 5, -11 }, // 0x6B 'k'
+ { 726, 1, 12, 16, 7, -11 }, // 0x6C 'l'
+ { 728, 9, 7, 16, 3, -6 }, // 0x6D 'm'
+ { 736, 6, 7, 16, 5, -6 }, // 0x6E 'n'
+ { 742, 8, 7, 16, 4, -6 }, // 0x6F 'o'
+ { 749, 7, 10, 16, 4, -6 }, // 0x70 'p'
+ { 758, 7, 10, 16, 4, -6 }, // 0x71 'q'
+ { 767, 4, 7, 16, 6, -6 }, // 0x72 'r'
+ { 771, 6, 7, 16, 5, -6 }, // 0x73 's'
+ { 777, 3, 11, 16, 6, -10 }, // 0x74 't'
+ { 782, 6, 7, 16, 5, -6 }, // 0x75 'u'
+ { 788, 8, 7, 16, 4, -6 }, // 0x76 'v'
+ { 795, 12, 7, 16, 2, -6 }, // 0x77 'w'
+ { 806, 8, 7, 16, 4, -6 }, // 0x78 'x'
+ { 813, 8, 10, 16, 4, -6 }, // 0x79 'y'
+ { 823, 6, 7, 16, 4, -6 }, // 0x7A 'z'
+ { 829, 4, 15, 16, 5, -11 }, // 0x7B '{'
+ { 837, 1, 11, 16, 7, -10 }, // 0x7C '|'
+ { 839, 4, 15, 16, 6, -11 }, // 0x7D '}'
+ { 847, 8, 3, 16, 4, -4 } }; // 0x7E '~'
+
+const GFXfont FUTRFW8pt7b PROGMEM = {
+ (uint8_t *)FUTRFW8pt7bBitmaps,
+ (GFXglyph *)FUTRFW8pt7bGlyphs,
+ 0x20, 0x7E, 20 };
+const uint8_t nk57_monospace_cd_rg9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xDB, 0x64, 0x92, 0x48, 0x0D, 0xF0, 0x8C, 0x63, 0x18, 0xC4, 0x00,
+ 0x12, 0x09, 0x0C, 0x86, 0x43, 0x23, 0xFC, 0x88, 0x44, 0x26, 0x7F, 0xBF,
+ 0xC4, 0x82, 0x43, 0x21, 0x90, 0x08, 0x08, 0x3E, 0x7F, 0x63, 0x43, 0x40,
+ 0x60, 0x1C, 0x03, 0x01, 0xC1, 0x41, 0x63, 0x7E, 0x18, 0x08, 0x08, 0x20,
+ 0x78, 0x26, 0x11, 0x08, 0x8C, 0xCF, 0xC8, 0x48, 0x18, 0x11, 0x13, 0xD1,
+ 0x30, 0x88, 0x44, 0x26, 0x1E, 0x07, 0x00, 0x3C, 0x1F, 0x18, 0x8C, 0x46,
+ 0x21, 0x30, 0xF0, 0x30, 0x79, 0xA4, 0xB1, 0xD8, 0xCC, 0x63, 0xF8, 0xE6,
+ 0xFC, 0x0C, 0x63, 0x0C, 0x61, 0x84, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C,
+ 0x10, 0x61, 0x83, 0x0C, 0x18, 0x30, 0xC1, 0x82, 0x0C, 0x10, 0x61, 0x82,
+ 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0x86, 0x18, 0x43, 0x08, 0x63, 0x00, 0x10,
+ 0x22, 0x5B, 0xE3, 0x0F, 0xA5, 0x88, 0x10, 0x08, 0x08, 0x08, 0x08, 0xFF,
+ 0xFF, 0x08, 0x08, 0x08, 0xDF, 0xA5, 0x00, 0xFF, 0xF0, 0xDF, 0x00, 0x01,
+ 0x80, 0x80, 0x40, 0x60, 0x20, 0x30, 0x18, 0x08, 0x0C, 0x04, 0x02, 0x03,
+ 0x01, 0x01, 0x80, 0xC0, 0x40, 0x60, 0x20, 0x10, 0x18, 0x00, 0x38, 0xFB,
+ 0x16, 0x28, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1E, 0x3C, 0x4F, 0x8E, 0x00,
+ 0x10, 0x20, 0x47, 0x8F, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x1F,
+ 0xFF, 0x80, 0x79, 0xFA, 0x1C, 0x30, 0x60, 0xC1, 0x82, 0x0C, 0x10, 0x61,
+ 0x86, 0x1F, 0xFF, 0x80, 0x79, 0xFA, 0x1C, 0x30, 0x60, 0xCF, 0x1E, 0x06,
+ 0x0E, 0x0C, 0x3C, 0x7F, 0x9E, 0x00, 0x02, 0x06, 0x06, 0x0E, 0x1A, 0x12,
+ 0x32, 0x22, 0x62, 0x42, 0xFF, 0xFF, 0x02, 0x02, 0x02, 0x7E, 0xFD, 0x06,
+ 0x0C, 0x1F, 0xBF, 0x43, 0x06, 0x04, 0x0C, 0x38, 0x7F, 0x9E, 0x00, 0x3C,
+ 0xFF, 0x1E, 0x38, 0x17, 0xBF, 0xC3, 0x83, 0x06, 0x0E, 0x3C, 0x6F, 0x9E,
+ 0x00, 0xFF, 0xFC, 0x18, 0x20, 0xC1, 0x82, 0x0C, 0x18, 0x20, 0xC1, 0x83,
+ 0x04, 0x18, 0x00, 0x3C, 0x7E, 0x63, 0x41, 0x41, 0x63, 0x3E, 0x3E, 0x63,
+ 0x41, 0xC1, 0x41, 0x63, 0x7E, 0x3C, 0x3E, 0x7F, 0x63, 0x43, 0xC1, 0xC1,
+ 0x41, 0x43, 0x63, 0x3F, 0x1A, 0x06, 0x04, 0x0C, 0x18, 0xDF, 0x00, 0x37,
+ 0xC0, 0xDF, 0x00, 0x37, 0xE9, 0x40, 0x01, 0x03, 0x0E, 0x18, 0x70, 0xC0,
+ 0xE0, 0x38, 0x1C, 0x07, 0x01, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF,
+ 0xFF, 0x80, 0xE0, 0x30, 0x1C, 0x07, 0x01, 0x03, 0x0E, 0x38, 0x70, 0xC0,
+ 0x80, 0x7D, 0xFE, 0x1C, 0x10, 0x20, 0xC1, 0x86, 0x18, 0x20, 0x40, 0x03,
+ 0x07, 0x0C, 0x00, 0x3E, 0x7F, 0x41, 0x41, 0x4D, 0x4F, 0xD9, 0xD9, 0xD9,
+ 0xC9, 0x4F, 0x45, 0x40, 0x41, 0x7F, 0x3E, 0x18, 0x1C, 0x1C, 0x14, 0x14,
+ 0x34, 0x36, 0x26, 0x22, 0x22, 0x7E, 0x7F, 0x43, 0x43, 0xC1, 0xFD, 0xFE,
+ 0x1C, 0x38, 0x70, 0xFF, 0x7E, 0x87, 0x06, 0x0C, 0x18, 0x7F, 0xFF, 0x00,
+ 0x7D, 0xFF, 0x1E, 0x38, 0x10, 0x20, 0x40, 0x81, 0x02, 0x06, 0x3C, 0x7F,
+ 0x9F, 0x00, 0xF9, 0xFA, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C,
+ 0x38, 0x7F, 0xBE, 0x00, 0xFF, 0xFE, 0x04, 0x08, 0x10, 0x3F, 0xFF, 0x81,
+ 0x02, 0x04, 0x08, 0x1F, 0xFF, 0x80, 0xFF, 0xFE, 0x04, 0x08, 0x10, 0x20,
+ 0x7F, 0xFF, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x7D, 0xFF, 0x1E, 0x38,
+ 0x10, 0x20, 0x47, 0x8F, 0x0E, 0x1E, 0x3C, 0x7F, 0xDC, 0x80, 0x87, 0x0E,
+ 0x1C, 0x38, 0x70, 0xFF, 0xFF, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0x80,
+ 0xFF, 0xFC, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x1F,
+ 0xFF, 0x80, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0E, 0x1C,
+ 0x38, 0x7F, 0x9E, 0x00, 0x83, 0x86, 0x84, 0x8C, 0x98, 0x98, 0xB8, 0xAC,
+ 0xEC, 0xC4, 0xC4, 0x86, 0x86, 0x86, 0x83, 0xC1, 0x83, 0x06, 0x0C, 0x18,
+ 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x1F, 0xFF, 0x80, 0xC1, 0xC3, 0xE3,
+ 0xE3, 0xF5, 0xD5, 0xDD, 0xD9, 0xC9, 0xC9, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1,
+ 0xC3, 0x87, 0x0F, 0x1E, 0x34, 0x6C, 0xC9, 0x9B, 0x16, 0x2C, 0x78, 0x70,
+ 0xE0, 0x80, 0x7D, 0xFF, 0x1C, 0x38, 0x70, 0x60, 0xC1, 0x83, 0x06, 0x1C,
+ 0x3C, 0x7F, 0xDF, 0x00, 0xFD, 0xFE, 0x1C, 0x18, 0x30, 0x60, 0xC3, 0xFF,
+ 0xFA, 0x04, 0x08, 0x10, 0x20, 0x00, 0x7D, 0xFF, 0x1C, 0x38, 0x30, 0x60,
+ 0xC1, 0x83, 0x06, 0x0C, 0x3C, 0x7F, 0xDF, 0x04, 0x08, 0x1C, 0x18, 0xFC,
+ 0xFE, 0x86, 0x82, 0x82, 0x82, 0x86, 0xFE, 0xFC, 0x98, 0x88, 0x8C, 0x84,
+ 0x86, 0x83, 0x3E, 0x7F, 0x43, 0xC3, 0x40, 0x60, 0x7C, 0x1E, 0x03, 0x03,
+ 0x01, 0xC3, 0x43, 0x7E, 0x3C, 0xFF, 0xFF, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x87, 0x0E, 0x1C, 0x38,
+ 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x3C, 0x7F, 0xDF, 0x00, 0xC1, 0x43,
+ 0x63, 0x63, 0x62, 0x62, 0x26, 0x26, 0x36, 0x34, 0x14, 0x1C, 0x1C, 0x18,
+ 0x18, 0xC1, 0xE0, 0xF2, 0x79, 0x2D, 0x96, 0xC9, 0x74, 0xAA, 0x55, 0x2A,
+ 0x99, 0xCC, 0xE6, 0x33, 0x19, 0x8C, 0x63, 0x31, 0x8C, 0x86, 0xC1, 0x40,
+ 0xE0, 0x70, 0x38, 0x1C, 0x1A, 0x0D, 0x84, 0xC6, 0x32, 0x1B, 0x06, 0xC1,
+ 0xB1, 0x98, 0xC6, 0xC3, 0x60, 0xE0, 0x70, 0x10, 0x08, 0x04, 0x02, 0x01,
+ 0x00, 0x80, 0x40, 0x20, 0xFF, 0xFC, 0x10, 0x60, 0xC3, 0x06, 0x18, 0x30,
+ 0x41, 0x83, 0x0C, 0x1F, 0xFF, 0x80, 0xFF, 0xE1, 0x08, 0x42, 0x10, 0x84,
+ 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x0F, 0xFC, 0xC0, 0x60, 0x10, 0x0C,
+ 0x06, 0x01, 0x00, 0xC0, 0x20, 0x10, 0x0C, 0x02, 0x01, 0x80, 0xC0, 0x20,
+ 0x18, 0x04, 0x02, 0x01, 0x80, 0x40, 0x30, 0xFF, 0xF0, 0xC3, 0x0C, 0x30,
+ 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0xFF, 0xF0,
+ 0x18, 0x0E, 0x05, 0x06, 0x82, 0x63, 0x11, 0x8D, 0x83, 0xFF, 0xFF, 0xC0,
+ 0xE2, 0x10, 0x79, 0xFB, 0x18, 0x33, 0xFC, 0xE1, 0xC3, 0xFE, 0xEC, 0xC1,
+ 0x83, 0x06, 0x0C, 0x1B, 0xBF, 0x63, 0xC7, 0x8F, 0x1E, 0x3C, 0x7F, 0xF7,
+ 0x00, 0x7D, 0xFF, 0x1E, 0x38, 0x10, 0x30, 0x63, 0xFC, 0xF8, 0x06, 0x0C,
+ 0x18, 0x30, 0x6E, 0xFF, 0xE3, 0x87, 0x0E, 0x1C, 0x3C, 0x7F, 0xDD, 0x80,
+ 0x78, 0xFB, 0x1C, 0x3F, 0xFF, 0xE0, 0x63, 0xFC, 0xF8, 0x1E, 0x3F, 0x21,
+ 0x20, 0x20, 0xFF, 0xFF, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x01, 0x81, 0xC0, 0x87, 0xC7, 0xF3, 0x19, 0x0C, 0xC6, 0x7F, 0x1F, 0x18,
+ 0x0F, 0xC7, 0xF2, 0x0F, 0x07, 0xFE, 0x7F, 0x00, 0xC1, 0x83, 0x06, 0x0C,
+ 0x1B, 0xBF, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0x80, 0x31, 0xC3,
+ 0x00, 0xE3, 0x82, 0x08, 0x20, 0x82, 0x08, 0xFF, 0xF0, 0x0C, 0x30, 0xC0,
+ 0x3C, 0xF0, 0x41, 0x04, 0x10, 0x41, 0x04, 0x18, 0x61, 0xFD, 0xE0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC7, 0xCC, 0xD8, 0xD8, 0xEC, 0xEC, 0xC4, 0xC6,
+ 0xC6, 0xC3, 0xF3, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x33,
+ 0xFF, 0xC0, 0xF3, 0x7F, 0xB2, 0x79, 0x3C, 0x9E, 0x4F, 0x27, 0x93, 0xC9,
+ 0xE4, 0xC0, 0xDD, 0xFF, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8C, 0x79,
+ 0xFB, 0x1E, 0x38, 0x70, 0xF1, 0xE3, 0xFC, 0xF0, 0xFD, 0xFB, 0x1E, 0x3C,
+ 0x78, 0xF1, 0xE3, 0xFD, 0xBB, 0x06, 0x0C, 0x18, 0x00, 0x77, 0xFF, 0x1C,
+ 0x38, 0x70, 0xE1, 0xE3, 0xFE, 0xEC, 0x18, 0x30, 0x60, 0xC0, 0xDD, 0xFF,
+ 0x8E, 0x1C, 0x18, 0x30, 0x60, 0xC1, 0x80, 0x79, 0xFA, 0x14, 0x07, 0x81,
+ 0xC1, 0xC3, 0xFC, 0xF0, 0x20, 0x20, 0x20, 0xFF, 0xFF, 0x20, 0x20, 0x20,
+ 0x20, 0x21, 0x21, 0x37, 0x1E, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3,
+ 0xFE, 0xEC, 0xC1, 0x43, 0x63, 0x62, 0x26, 0x36, 0x34, 0x1C, 0x1C, 0x18,
+ 0xC1, 0xE0, 0xF2, 0x49, 0x25, 0x92, 0xA9, 0x5C, 0xCE, 0x67, 0x31, 0x00,
+ 0x63, 0x11, 0x0D, 0x83, 0x81, 0x80, 0xE0, 0xD0, 0x4C, 0x63, 0x60, 0xC0,
+ 0xC1, 0x63, 0x62, 0x26, 0x36, 0x3C, 0x1C, 0x18, 0x18, 0x10, 0x30, 0x30,
+ 0x20, 0x60, 0xFF, 0xFC, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xFF, 0xFC, 0x1E,
+ 0x3C, 0xC0, 0x81, 0x02, 0x06, 0x0C, 0x18, 0x33, 0xE7, 0x81, 0x83, 0x06,
+ 0x0C, 0x18, 0x20, 0x41, 0x81, 0xE3, 0xC0, 0xFF, 0xFF, 0xFC, 0xF8, 0xF8,
+ 0x08, 0x08, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x1F, 0x1F, 0x10, 0x10,
+ 0x10, 0x18, 0x18, 0x18, 0x08, 0x08, 0xF8, 0xF8, 0x71, 0xDF, 0x87 };
+
+const GFXglyph nk57_monospace_cd_rg9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 9, 0, 0 }, // 0x20 ' '
+ { 1, 3, 15, 9, 3, -14 }, // 0x21 '!'
+ { 7, 5, 7, 9, 2, -14 }, // 0x22 '"'
+ { 12, 9, 15, 9, 0, -14 }, // 0x23 '#'
+ { 29, 8, 18, 9, 0, -15 }, // 0x24 '$'
+ { 47, 9, 17, 9, 0, -15 }, // 0x25 '%'
+ { 67, 9, 15, 9, 0, -14 }, // 0x26 '&'
+ { 84, 1, 6, 9, 4, -14 }, // 0x27 '''
+ { 85, 6, 22, 9, 2, -17 }, // 0x28 '('
+ { 102, 6, 22, 9, 1, -17 }, // 0x29 ')'
+ { 119, 7, 9, 9, 1, -14 }, // 0x2A '*'
+ { 127, 8, 9, 9, 0, -11 }, // 0x2B '+'
+ { 136, 3, 6, 9, 3, -2 }, // 0x2C ','
+ { 139, 6, 2, 9, 1, -6 }, // 0x2D '-'
+ { 141, 3, 3, 9, 3, -2 }, // 0x2E '.'
+ { 143, 9, 20, 9, 0, -16 }, // 0x2F '/'
+ { 166, 7, 15, 9, 1, -14 }, // 0x30 '0'
+ { 180, 7, 15, 9, 1, -14 }, // 0x31 '1'
+ { 194, 7, 15, 9, 1, -14 }, // 0x32 '2'
+ { 208, 7, 15, 9, 1, -14 }, // 0x33 '3'
+ { 222, 8, 15, 9, 0, -14 }, // 0x34 '4'
+ { 237, 7, 15, 9, 1, -14 }, // 0x35 '5'
+ { 251, 7, 15, 9, 1, -14 }, // 0x36 '6'
+ { 265, 7, 15, 9, 1, -14 }, // 0x37 '7'
+ { 279, 8, 15, 9, 0, -14 }, // 0x38 '8'
+ { 294, 8, 15, 9, 0, -14 }, // 0x39 '9'
+ { 309, 3, 9, 9, 3, -8 }, // 0x3A ':'
+ { 313, 3, 12, 9, 3, -9 }, // 0x3B ';'
+ { 318, 8, 12, 9, 0, -12 }, // 0x3C '<'
+ { 330, 8, 7, 9, 0, -10 }, // 0x3D '='
+ { 337, 8, 12, 9, 0, -12 }, // 0x3E '>'
+ { 349, 7, 15, 9, 1, -14 }, // 0x3F '?'
+ { 363, 8, 16, 9, 0, -12 }, // 0x40 '@'
+ { 379, 8, 15, 9, 0, -14 }, // 0x41 'A'
+ { 394, 7, 15, 9, 1, -14 }, // 0x42 'B'
+ { 408, 7, 15, 9, 1, -14 }, // 0x43 'C'
+ { 422, 7, 15, 9, 1, -14 }, // 0x44 'D'
+ { 436, 7, 15, 9, 1, -14 }, // 0x45 'E'
+ { 450, 7, 15, 9, 1, -14 }, // 0x46 'F'
+ { 464, 7, 15, 9, 1, -14 }, // 0x47 'G'
+ { 478, 7, 15, 9, 1, -14 }, // 0x48 'H'
+ { 492, 7, 15, 9, 1, -14 }, // 0x49 'I'
+ { 506, 7, 15, 9, 1, -14 }, // 0x4A 'J'
+ { 520, 8, 15, 9, 1, -14 }, // 0x4B 'K'
+ { 535, 7, 15, 9, 1, -14 }, // 0x4C 'L'
+ { 549, 8, 15, 9, 0, -14 }, // 0x4D 'M'
+ { 564, 7, 15, 9, 1, -14 }, // 0x4E 'N'
+ { 578, 7, 15, 9, 1, -14 }, // 0x4F 'O'
+ { 592, 7, 15, 9, 1, -14 }, // 0x50 'P'
+ { 606, 7, 19, 9, 1, -14 }, // 0x51 'Q'
+ { 623, 8, 15, 9, 1, -14 }, // 0x52 'R'
+ { 638, 8, 15, 9, 0, -14 }, // 0x53 'S'
+ { 653, 8, 15, 9, 0, -14 }, // 0x54 'T'
+ { 668, 7, 15, 9, 1, -14 }, // 0x55 'U'
+ { 682, 8, 15, 9, 0, -14 }, // 0x56 'V'
+ { 697, 9, 15, 9, 0, -14 }, // 0x57 'W'
+ { 714, 9, 15, 9, 0, -14 }, // 0x58 'X'
+ { 731, 9, 15, 9, 0, -14 }, // 0x59 'Y'
+ { 748, 7, 15, 9, 1, -14 }, // 0x5A 'Z'
+ { 762, 5, 22, 9, 3, -17 }, // 0x5B '['
+ { 776, 9, 20, 9, 0, -16 }, // 0x5C '\'
+ { 799, 6, 22, 9, 0, -17 }, // 0x5D ']'
+ { 816, 9, 8, 9, 0, -14 }, // 0x5E '^'
+ { 825, 9, 2, 9, 0, 2 }, // 0x5F '_'
+ { 828, 4, 3, 9, 2, -13 }, // 0x60 '`'
+ { 830, 7, 10, 9, 1, -9 }, // 0x61 'a'
+ { 839, 7, 15, 9, 1, -14 }, // 0x62 'b'
+ { 853, 7, 10, 9, 1, -9 }, // 0x63 'c'
+ { 862, 7, 15, 9, 1, -14 }, // 0x64 'd'
+ { 876, 7, 10, 9, 1, -9 }, // 0x65 'e'
+ { 885, 8, 15, 9, 0, -14 }, // 0x66 'f'
+ { 900, 9, 17, 9, 0, -12 }, // 0x67 'g'
+ { 920, 7, 15, 9, 1, -14 }, // 0x68 'h'
+ { 934, 6, 14, 9, 2, -13 }, // 0x69 'i'
+ { 945, 6, 18, 9, 1, -13 }, // 0x6A 'j'
+ { 959, 8, 15, 9, 1, -14 }, // 0x6B 'k'
+ { 974, 6, 15, 9, 2, -14 }, // 0x6C 'l'
+ { 986, 9, 10, 9, 0, -9 }, // 0x6D 'm'
+ { 998, 7, 10, 9, 1, -9 }, // 0x6E 'n'
+ { 1007, 7, 10, 9, 1, -9 }, // 0x6F 'o'
+ { 1016, 7, 14, 9, 1, -9 }, // 0x70 'p'
+ { 1029, 7, 14, 9, 1, -9 }, // 0x71 'q'
+ { 1042, 7, 10, 9, 1, -9 }, // 0x72 'r'
+ { 1051, 7, 10, 9, 1, -9 }, // 0x73 's'
+ { 1060, 8, 13, 9, 0, -12 }, // 0x74 't'
+ { 1073, 7, 10, 9, 1, -9 }, // 0x75 'u'
+ { 1082, 8, 10, 9, 0, -9 }, // 0x76 'v'
+ { 1092, 9, 10, 9, 0, -9 }, // 0x77 'w'
+ { 1104, 9, 10, 9, 0, -9 }, // 0x78 'x'
+ { 1116, 8, 14, 9, 0, -9 }, // 0x79 'y'
+ { 1130, 7, 10, 9, 1, -9 }, // 0x7A 'z'
+ { 1139, 7, 22, 9, 1, -17 }, // 0x7B '{'
+ { 1159, 1, 22, 9, 4, -17 }, // 0x7C '|'
+ { 1162, 8, 22, 9, 0, -17 }, // 0x7D '}'
+ { 1184, 8, 3, 9, 0, -8 } }; // 0x7E '~'
+
+const GFXfont nk57_monospace_cd_rg9pt7b PROGMEM = {
+ (uint8_t *)nk57_monospace_cd_rg9pt7bBitmaps,
+ (GFXglyph *)nk57_monospace_cd_rg9pt7bGlyphs,
+ 0x20, 0x7E, 21 };
+
+// Approx. 1859 bytes
+
+const uint8_t nk57_monospace_no_rg9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xDB, 0x6D, 0xB6, 0xD8, 0x0D, 0xF0, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0x00, 0x08, 0x40, 0x84, 0x08, 0xC1, 0x8C, 0x18, 0xC7, 0xFF, 0x18,
+ 0x81, 0x08, 0x10, 0x8F, 0xFE, 0xFF, 0xE3, 0x18, 0x31, 0x83, 0x18, 0x21,
+ 0x00, 0x0C, 0x01, 0x80, 0xFE, 0x7F, 0xEC, 0x0D, 0x81, 0xB0, 0x07, 0x00,
+ 0x3F, 0x00, 0x78, 0x03, 0x00, 0x3C, 0x05, 0x81, 0xBF, 0xF1, 0xF8, 0x0C,
+ 0x01, 0x80, 0x18, 0x07, 0xE0, 0x62, 0x04, 0x20, 0x42, 0x16, 0x23, 0x7E,
+ 0xC1, 0xB0, 0x06, 0x01, 0x98, 0x67, 0xE8, 0x62, 0x04, 0x20, 0x42, 0x04,
+ 0x20, 0x7E, 0x03, 0xC0, 0x1F, 0x03, 0xFC, 0x30, 0xC2, 0x0C, 0x20, 0xC3,
+ 0x18, 0x1F, 0x00, 0xE0, 0x36, 0x36, 0x22, 0xC1, 0x6C, 0x1C, 0xE0, 0xC7,
+ 0xFE, 0x3E, 0x30, 0xFF, 0xF0, 0x07, 0x0C, 0x18, 0x30, 0x30, 0x60, 0x60,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x60, 0x60, 0x30, 0x30,
+ 0x18, 0x0C, 0x07, 0xE0, 0x30, 0x18, 0x0C, 0x0E, 0x06, 0x07, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x06, 0x0E, 0x0C, 0x18, 0x30,
+ 0xE0, 0x0C, 0x03, 0x04, 0xCB, 0xFF, 0x1E, 0x07, 0x8F, 0x7D, 0x32, 0x0C,
+ 0x03, 0x00, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x0F, 0xFF, 0xFF, 0xC3, 0x00,
+ 0x60, 0x0C, 0x00, 0xDF, 0xAD, 0x00, 0xFF, 0xFF, 0xDF, 0x00, 0x00, 0x30,
+ 0x03, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x0C, 0x01, 0x80, 0x10, 0x03, 0x00,
+ 0x20, 0x06, 0x00, 0x40, 0x0C, 0x01, 0x80, 0x18, 0x03, 0x00, 0x30, 0x06,
+ 0x00, 0x60, 0x0C, 0x00, 0x1E, 0x0F, 0xC6, 0x1B, 0x06, 0xC0, 0xF0, 0x3C,
+ 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0D, 0x06, 0x61, 0x8F, 0xC1, 0xE0, 0x04,
+ 0x03, 0x00, 0xC1, 0xF0, 0x7C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00,
+ 0xC0, 0x30, 0x0C, 0x3F, 0xFF, 0xFC, 0x3F, 0x3F, 0xEC, 0x0F, 0x03, 0x00,
+ 0xC0, 0x30, 0x0C, 0x06, 0x03, 0x81, 0xC0, 0xE0, 0x60, 0x30, 0x3F, 0xFF,
+ 0xFC, 0x3F, 0x3F, 0xEC, 0x0F, 0x03, 0x00, 0xC0, 0x31, 0xF8, 0x7E, 0x00,
+ 0xC0, 0x3C, 0x0F, 0x03, 0xC0, 0xDF, 0xE3, 0xF0, 0x01, 0x80, 0x70, 0x0E,
+ 0x03, 0xC0, 0xD8, 0x33, 0x0C, 0x61, 0x0C, 0x61, 0x98, 0x33, 0xFF, 0xFF,
+ 0xF0, 0x18, 0x03, 0x00, 0x60, 0x7F, 0xDF, 0xF6, 0x01, 0x80, 0x60, 0x17,
+ 0xC7, 0xFB, 0x03, 0x00, 0xC0, 0x30, 0x0F, 0x03, 0xC0, 0xDF, 0xE3, 0xF0,
+ 0x1F, 0x8F, 0xF6, 0x0D, 0x03, 0xC0, 0x37, 0xCF, 0xFF, 0x03, 0xC0, 0xF0,
+ 0x1C, 0x07, 0x03, 0x60, 0xDF, 0xE3, 0xF0, 0xFF, 0xFF, 0xF0, 0x0C, 0x06,
+ 0x01, 0x80, 0xC0, 0x30, 0x18, 0x06, 0x01, 0x80, 0xC0, 0x30, 0x18, 0x06,
+ 0x03, 0x00, 0x3F, 0x1F, 0xEC, 0x0F, 0x03, 0xC0, 0xF0, 0x37, 0xF9, 0xFE,
+ 0xE1, 0xF0, 0x3C, 0x07, 0x03, 0xC0, 0xDF, 0xE3, 0xF0, 0x3F, 0x1F, 0xEC,
+ 0x0F, 0x03, 0xC0, 0x70, 0x1C, 0x0F, 0x03, 0xE1, 0xDF, 0xF1, 0x98, 0x0C,
+ 0x03, 0x01, 0x81, 0xC0, 0xDF, 0x00, 0x37, 0xC0, 0xDF, 0x00, 0x37, 0xEB,
+ 0x40, 0x00, 0x60, 0x3C, 0x1E, 0x0E, 0x0F, 0x01, 0x80, 0x38, 0x01, 0xC0,
+ 0x0F, 0x00, 0x78, 0x03, 0x80, 0x10, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00,
+ 0x01, 0xFF, 0xFF, 0xF8, 0x80, 0x1C, 0x01, 0xE0, 0x07, 0x00, 0x3C, 0x01,
+ 0xC0, 0x78, 0x38, 0x3C, 0x1E, 0x03, 0x00, 0x40, 0x00, 0x3F, 0x3F, 0xFC,
+ 0x0F, 0x03, 0x00, 0xC0, 0x30, 0x1C, 0x0C, 0x06, 0x03, 0x00, 0xC0, 0x00,
+ 0x0C, 0x03, 0x80, 0xC0, 0x3F, 0x0F, 0xFB, 0x03, 0x60, 0x28, 0x75, 0x1F,
+ 0xA2, 0x14, 0x42, 0x88, 0x51, 0x8A, 0x3F, 0x43, 0x2C, 0x01, 0x80, 0x5F,
+ 0xF9, 0xFC, 0x06, 0x00, 0x70, 0x0F, 0x00, 0xF0, 0x0D, 0x81, 0x98, 0x19,
+ 0x81, 0x88, 0x30, 0xC3, 0x0C, 0x3F, 0xC3, 0xFE, 0x60, 0x66, 0x06, 0xC0,
+ 0x30, 0xFF, 0x1F, 0xFB, 0x03, 0x60, 0x6C, 0x0D, 0x81, 0xBF, 0xE7, 0xFC,
+ 0xC0, 0xD8, 0x1B, 0x01, 0xE0, 0x3C, 0x0D, 0xFF, 0xBF, 0xE0, 0x3F, 0x9F,
+ 0xFE, 0x0F, 0x03, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03,
+ 0x03, 0xE0, 0xDF, 0xE3, 0xF0, 0xFF, 0x3F, 0xEC, 0x1F, 0x03, 0xC0, 0xF0,
+ 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC1, 0xFF, 0xEF, 0xF0,
+ 0xFF, 0xFF, 0xFC, 0x03, 0x00, 0xC0, 0x30, 0x0F, 0xFF, 0xFF, 0xC0, 0x30,
+ 0x0C, 0x03, 0x00, 0xC0, 0x3F, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0x03, 0x00,
+ 0xC0, 0x30, 0x0C, 0x03, 0xFF, 0xFF, 0xF0, 0x0C, 0x03, 0x00, 0xC0, 0x30,
+ 0x0C, 0x00, 0x3F, 0x9F, 0xFE, 0x0F, 0x03, 0xC0, 0x30, 0x0C, 0x03, 0x1F,
+ 0xC7, 0xF0, 0x3C, 0x0F, 0x03, 0xE1, 0xDF, 0xD3, 0xE4, 0xC0, 0xF0, 0x3C,
+ 0x0F, 0x03, 0xC0, 0xF0, 0x3F, 0xFF, 0xFF, 0xC0, 0xF0, 0x3C, 0x0F, 0x03,
+ 0xC0, 0xF0, 0x3C, 0x0C, 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00,
+ 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x3F, 0xFF, 0xFC, 0x00,
+ 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x3C,
+ 0x0F, 0x03, 0xC1, 0xDF, 0xE3, 0xF0, 0xC0, 0xF8, 0x1B, 0x06, 0x61, 0x8C,
+ 0x61, 0x9C, 0x33, 0xC6, 0xD8, 0xF3, 0x9C, 0x33, 0x06, 0x60, 0x6C, 0x0D,
+ 0x81, 0xB0, 0x18, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03,
+ 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x3F, 0xFF, 0xFC, 0xC0, 0x78,
+ 0x1F, 0x83, 0xD0, 0xFB, 0x37, 0x26, 0xE7, 0x9C, 0x73, 0x8C, 0x70, 0x8E,
+ 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x18, 0xC0, 0xF8, 0x3E, 0x0F, 0xC3,
+ 0xF8, 0xF6, 0x3C, 0xCF, 0x33, 0xC6, 0xF1, 0xBC, 0x3F, 0x07, 0xC1, 0xF0,
+ 0x3C, 0x0C, 0x3F, 0x9F, 0xFC, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03,
+ 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xDF, 0xF3, 0xF8, 0xFF, 0x9F, 0xFB,
+ 0x03, 0x60, 0x6C, 0x07, 0x80, 0xF0, 0x36, 0x06, 0xFF, 0xDF, 0xF3, 0x00,
+ 0x60, 0x0C, 0x01, 0x80, 0x30, 0x00, 0x3F, 0x0F, 0xF3, 0x03, 0x60, 0x6C,
+ 0x0D, 0x81, 0xB0, 0x36, 0x06, 0xC0, 0xD8, 0x1B, 0x03, 0x60, 0x6C, 0x0C,
+ 0xFF, 0x8F, 0xC0, 0x10, 0x02, 0x00, 0x7C, 0x07, 0x80, 0xFF, 0x9F, 0xFB,
+ 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x37, 0xFE, 0xFF, 0x98, 0xC3, 0x0C,
+ 0x61, 0xCC, 0x19, 0x81, 0xB0, 0x38, 0x3F, 0x9F, 0xFC, 0x0F, 0x03, 0xC0,
+ 0x38, 0x07, 0xE0, 0x7E, 0x01, 0xC0, 0x30, 0x0F, 0x03, 0xC0, 0xFF, 0xE3,
+ 0xF0, 0xFF, 0xFF, 0xFC, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60,
+ 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0xC0, 0xF0,
+ 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F,
+ 0x03, 0xC0, 0xDF, 0xF3, 0xF8, 0xE0, 0x36, 0x06, 0x60, 0x63, 0x06, 0x30,
+ 0xC3, 0x0C, 0x30, 0xC1, 0x88, 0x19, 0x81, 0x98, 0x0D, 0x00, 0xF0, 0x0F,
+ 0x00, 0x70, 0x06, 0x00, 0xC0, 0x3C, 0x03, 0xC6, 0x3C, 0x63, 0x46, 0x34,
+ 0x73, 0x6F, 0x26, 0x92, 0x69, 0x66, 0x9E, 0x79, 0xE7, 0x0E, 0x30, 0xE3,
+ 0x0E, 0x30, 0xC0, 0x70, 0x73, 0x06, 0x38, 0xC1, 0x9C, 0x0D, 0x80, 0xF0,
+ 0x07, 0x00, 0x70, 0x0F, 0x01, 0xD8, 0x19, 0x83, 0x0C, 0x30, 0xE6, 0x06,
+ 0xE0, 0x70, 0xE0, 0x36, 0x06, 0x30, 0xC1, 0x8C, 0x19, 0x80, 0xF0, 0x07,
+ 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06,
+ 0x00, 0xFF, 0xFF, 0xF0, 0x18, 0x0E, 0x03, 0x01, 0x80, 0x60, 0x30, 0x1C,
+ 0x06, 0x03, 0x01, 0xC0, 0x60, 0x3F, 0xFF, 0xFC, 0xFF, 0xFF, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xC0, 0x04, 0x00, 0x60, 0x02, 0x00,
+ 0x30, 0x01, 0x00, 0x18, 0x00, 0xC0, 0x0C, 0x00, 0x60, 0x06, 0x00, 0x30,
+ 0x03, 0x00, 0x18, 0x01, 0x80, 0x0C, 0x00, 0x40, 0x06, 0x00, 0x20, 0x03,
+ 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0x06, 0x00,
+ 0xF0, 0x0D, 0x01, 0x98, 0x18, 0xC3, 0x0C, 0x60, 0x6E, 0x07, 0xFF, 0xFF,
+ 0xFF, 0xE0, 0xC0, 0xC0, 0x3F, 0x0F, 0xF1, 0x02, 0x00, 0x61, 0xFC, 0xF1,
+ 0xB0, 0x36, 0x0E, 0xFF, 0xEF, 0x9C, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0,
+ 0x33, 0xCF, 0xFB, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xE0, 0xFF, 0xEC,
+ 0xF0, 0x3F, 0x1F, 0xF6, 0x0F, 0x03, 0xC0, 0x30, 0x0C, 0x01, 0x83, 0x7F,
+ 0x8F, 0xC0, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xCF, 0x37, 0xFF, 0x87,
+ 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xE1, 0xDF, 0xF3, 0xEC, 0x3F, 0x1F, 0xE6,
+ 0x0F, 0x03, 0xFF, 0xFF, 0xFC, 0x01, 0x83, 0x7F, 0x8F, 0xC0, 0x0F, 0xC3,
+ 0xFC, 0xC1, 0x98, 0x03, 0x01, 0xFF, 0xFF, 0xF9, 0x80, 0x30, 0x06, 0x00,
+ 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x00, 0x00, 0x70, 0x0F, 0x00, 0x81,
+ 0xF8, 0x3F, 0xC6, 0x06, 0x60, 0x66, 0x06, 0x3F, 0xE1, 0xF8, 0x30, 0x07,
+ 0xFC, 0x7F, 0xF4, 0x03, 0xC0, 0x3F, 0xFF, 0x7F, 0xE0, 0xC0, 0x30, 0x0C,
+ 0x03, 0x00, 0xC0, 0x33, 0xEF, 0xFB, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x03,
+ 0xC0, 0xF0, 0x3C, 0x0C, 0x1C, 0x0E, 0x07, 0x00, 0x0F, 0x87, 0xC0, 0x60,
+ 0x30, 0x18, 0x0C, 0x06, 0x03, 0x0F, 0xFF, 0xFC, 0x01, 0x81, 0xC0, 0x60,
+ 0x01, 0xF8, 0xFC, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F,
+ 0x07, 0x83, 0x7F, 0x9F, 0x80, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01,
+ 0x81, 0xF0, 0x66, 0x38, 0xCF, 0x1B, 0x63, 0xC6, 0x60, 0xCC, 0x0D, 0x81,
+ 0xB0, 0x18, 0xFC, 0x7E, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C,
+ 0x06, 0x03, 0x01, 0x80, 0xC7, 0xFF, 0xFE, 0xDC, 0xEF, 0xFF, 0xC6, 0x3C,
+ 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xCF, 0xBF,
+ 0xEE, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x30, 0x3F,
+ 0x1F, 0xE6, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0D, 0x83, 0x7F, 0x8F, 0xC0,
+ 0xCF, 0x3F, 0xEE, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x83, 0xDF, 0xB3,
+ 0xEC, 0x03, 0x00, 0xC0, 0x30, 0x00, 0x3C, 0xDF, 0xFE, 0x1F, 0x03, 0xC0,
+ 0xF0, 0x3C, 0x0F, 0x87, 0x7F, 0xCF, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30,
+ 0xC7, 0xB7, 0xFF, 0x07, 0x81, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30,
+ 0x00, 0x3F, 0x1F, 0xEC, 0x0B, 0x00, 0x7F, 0x00, 0xE0, 0x0F, 0x03, 0x73,
+ 0x8F, 0xC0, 0x30, 0x06, 0x00, 0xC0, 0x7F, 0xFF, 0xFE, 0x60, 0x0C, 0x01,
+ 0x80, 0x30, 0x06, 0x0C, 0xC1, 0x8F, 0xF0, 0xFC, 0xC0, 0xF0, 0x3C, 0x0F,
+ 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x07, 0x7F, 0xCF, 0x30, 0xE0, 0x36, 0x06,
+ 0x30, 0x63, 0x0C, 0x10, 0xC1, 0x98, 0x19, 0x80, 0xF0, 0x0F, 0x00, 0x60,
+ 0xC0, 0x3C, 0x63, 0x46, 0x34, 0x62, 0x6F, 0x66, 0x96, 0x69, 0x63, 0x9E,
+ 0x30, 0xC3, 0x0C, 0x70, 0x73, 0x8C, 0x19, 0x80, 0xF0, 0x07, 0x00, 0xF0,
+ 0x19, 0x83, 0x8C, 0x70, 0xEE, 0x07, 0xE0, 0x76, 0x06, 0x30, 0xC3, 0x0C,
+ 0x19, 0x81, 0xB0, 0x0F, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x18, 0x01, 0x80,
+ 0x30, 0x07, 0x00, 0xFF, 0xFF, 0xF0, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81,
+ 0xC0, 0xFF, 0xFF, 0xF0, 0x07, 0xE1, 0xFC, 0x30, 0x06, 0x00, 0xC0, 0x18,
+ 0x01, 0x80, 0x30, 0x06, 0x00, 0xC3, 0xF8, 0x7F, 0x00, 0x60, 0x0C, 0x01,
+ 0x80, 0x30, 0x06, 0x01, 0x80, 0x30, 0x06, 0x00, 0xFE, 0x0F, 0xC0, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF8, 0x3F, 0x00, 0xC0, 0x30, 0x0C, 0x03,
+ 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFC, 0x3F, 0x18, 0x06, 0x01, 0x80,
+ 0x60, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0xFC, 0x3E, 0x00, 0x78, 0x3B, 0xFE,
+ 0x1E, 0x00 };
+
+const GFXglyph nk57_monospace_no_rg9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 12, 0, 0 }, // 0x20 ' '
+ { 1, 3, 15, 12, 5, -14 }, // 0x21 '!'
+ { 7, 8, 7, 12, 2, -14 }, // 0x22 '"'
+ { 14, 12, 15, 12, 0, -14 }, // 0x23 '#'
+ { 37, 11, 18, 12, 1, -15 }, // 0x24 '$'
+ { 62, 12, 17, 12, 0, -15 }, // 0x25 '%'
+ { 88, 12, 15, 12, 0, -14 }, // 0x26 '&'
+ { 111, 2, 6, 12, 5, -14 }, // 0x27 '''
+ { 113, 8, 22, 12, 3, -17 }, // 0x28 '('
+ { 135, 8, 22, 12, 1, -17 }, // 0x29 ')'
+ { 157, 10, 10, 12, 1, -14 }, // 0x2A '*'
+ { 170, 11, 9, 12, 1, -11 }, // 0x2B '+'
+ { 183, 3, 6, 12, 5, -2 }, // 0x2C ','
+ { 186, 8, 2, 12, 2, -6 }, // 0x2D '-'
+ { 188, 3, 3, 12, 5, -2 }, // 0x2E '.'
+ { 190, 12, 20, 12, 0, -16 }, // 0x2F '/'
+ { 220, 10, 15, 12, 1, -14 }, // 0x30 '0'
+ { 239, 10, 15, 12, 1, -14 }, // 0x31 '1'
+ { 258, 10, 15, 12, 1, -14 }, // 0x32 '2'
+ { 277, 10, 15, 12, 1, -14 }, // 0x33 '3'
+ { 296, 11, 15, 12, 1, -14 }, // 0x34 '4'
+ { 317, 10, 15, 12, 1, -14 }, // 0x35 '5'
+ { 336, 10, 15, 12, 1, -14 }, // 0x36 '6'
+ { 355, 10, 15, 12, 1, -14 }, // 0x37 '7'
+ { 374, 10, 15, 12, 1, -14 }, // 0x38 '8'
+ { 393, 10, 15, 12, 1, -14 }, // 0x39 '9'
+ { 412, 3, 9, 12, 5, -8 }, // 0x3A ':'
+ { 416, 3, 12, 12, 5, -9 }, // 0x3B ';'
+ { 421, 11, 12, 12, 1, -12 }, // 0x3C '<'
+ { 438, 11, 7, 12, 1, -10 }, // 0x3D '='
+ { 448, 11, 12, 12, 1, -12 }, // 0x3E '>'
+ { 465, 10, 15, 12, 1, -14 }, // 0x3F '?'
+ { 484, 11, 16, 12, 1, -12 }, // 0x40 '@'
+ { 506, 12, 15, 12, 0, -14 }, // 0x41 'A'
+ { 529, 11, 15, 12, 1, -14 }, // 0x42 'B'
+ { 550, 10, 15, 12, 1, -14 }, // 0x43 'C'
+ { 569, 10, 15, 12, 1, -14 }, // 0x44 'D'
+ { 588, 10, 15, 12, 1, -14 }, // 0x45 'E'
+ { 607, 10, 15, 12, 1, -14 }, // 0x46 'F'
+ { 626, 10, 15, 12, 1, -14 }, // 0x47 'G'
+ { 645, 10, 15, 12, 1, -14 }, // 0x48 'H'
+ { 664, 10, 15, 12, 1, -14 }, // 0x49 'I'
+ { 683, 10, 15, 12, 1, -14 }, // 0x4A 'J'
+ { 702, 11, 15, 12, 1, -14 }, // 0x4B 'K'
+ { 723, 10, 15, 12, 1, -14 }, // 0x4C 'L'
+ { 742, 11, 15, 12, 1, -14 }, // 0x4D 'M'
+ { 763, 10, 15, 12, 1, -14 }, // 0x4E 'N'
+ { 782, 10, 15, 12, 1, -14 }, // 0x4F 'O'
+ { 801, 11, 15, 12, 1, -14 }, // 0x50 'P'
+ { 822, 11, 19, 12, 1, -14 }, // 0x51 'Q'
+ { 849, 11, 15, 12, 1, -14 }, // 0x52 'R'
+ { 870, 10, 15, 12, 1, -14 }, // 0x53 'S'
+ { 889, 11, 15, 12, 1, -14 }, // 0x54 'T'
+ { 910, 10, 15, 12, 1, -14 }, // 0x55 'U'
+ { 929, 12, 15, 12, 0, -14 }, // 0x56 'V'
+ { 952, 12, 15, 12, 0, -14 }, // 0x57 'W'
+ { 975, 12, 15, 12, 0, -14 }, // 0x58 'X'
+ { 998, 12, 15, 12, 0, -14 }, // 0x59 'Y'
+ { 1021, 10, 15, 12, 1, -14 }, // 0x5A 'Z'
+ { 1040, 8, 22, 12, 4, -17 }, // 0x5B '['
+ { 1062, 12, 20, 12, 0, -16 }, // 0x5C '\'
+ { 1092, 8, 22, 12, 1, -17 }, // 0x5D ']'
+ { 1114, 12, 8, 12, 0, -14 }, // 0x5E '^'
+ { 1126, 12, 2, 12, 0, 2 }, // 0x5F '_'
+ { 1129, 6, 3, 12, 3, -13 }, // 0x60 '`'
+ { 1132, 11, 10, 12, 1, -9 }, // 0x61 'a'
+ { 1146, 10, 15, 12, 1, -14 }, // 0x62 'b'
+ { 1165, 10, 10, 12, 1, -9 }, // 0x63 'c'
+ { 1178, 10, 15, 12, 1, -14 }, // 0x64 'd'
+ { 1197, 10, 10, 12, 1, -9 }, // 0x65 'e'
+ { 1210, 11, 15, 12, 0, -14 }, // 0x66 'f'
+ { 1231, 12, 17, 12, 0, -12 }, // 0x67 'g'
+ { 1257, 10, 15, 12, 1, -14 }, // 0x68 'h'
+ { 1276, 9, 14, 12, 2, -13 }, // 0x69 'i'
+ { 1292, 9, 18, 12, 1, -13 }, // 0x6A 'j'
+ { 1313, 11, 15, 12, 1, -14 }, // 0x6B 'k'
+ { 1334, 9, 15, 12, 2, -14 }, // 0x6C 'l'
+ { 1351, 12, 10, 12, 0, -9 }, // 0x6D 'm'
+ { 1366, 10, 10, 12, 1, -9 }, // 0x6E 'n'
+ { 1379, 10, 10, 12, 1, -9 }, // 0x6F 'o'
+ { 1392, 10, 14, 12, 1, -9 }, // 0x70 'p'
+ { 1410, 10, 14, 12, 1, -9 }, // 0x71 'q'
+ { 1428, 10, 10, 12, 1, -9 }, // 0x72 'r'
+ { 1441, 10, 10, 12, 1, -9 }, // 0x73 's'
+ { 1454, 11, 13, 12, 0, -12 }, // 0x74 't'
+ { 1472, 10, 10, 12, 1, -9 }, // 0x75 'u'
+ { 1485, 12, 10, 12, 0, -9 }, // 0x76 'v'
+ { 1500, 12, 10, 12, 0, -9 }, // 0x77 'w'
+ { 1515, 12, 10, 12, 0, -9 }, // 0x78 'x'
+ { 1530, 12, 14, 12, 0, -9 }, // 0x79 'y'
+ { 1551, 10, 10, 12, 1, -9 }, // 0x7A 'z'
+ { 1564, 11, 22, 12, 1, -17 }, // 0x7B '{'
+ { 1595, 2, 22, 12, 5, -17 }, // 0x7C '|'
+ { 1601, 10, 22, 12, 1, -17 }, // 0x7D '}'
+ { 1629, 11, 3, 12, 1, -8 } }; // 0x7E '~'
+
+const GFXfont nk57_monospace_no_rg9pt7b PROGMEM = {
+ (uint8_t *)nk57_monospace_no_rg9pt7bBitmaps,
+ (GFXglyph *)nk57_monospace_no_rg9pt7bGlyphs,
+ 0x20, 0x7E, 21 };
+
+// Approx. 2306 bytes
+const uint8_t nk57_monospace_no_rg7pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xEA, 0x3F, 0xCE, 0x28, 0xA2, 0x88, 0x00, 0x11, 0x08, 0x84,
+ 0x42, 0x67, 0xF9, 0x90, 0x89, 0xFF, 0x22, 0x11, 0x09, 0x8C, 0xC0, 0x10,
+ 0x10, 0x7E, 0xC3, 0x83, 0x80, 0xE0, 0x3C, 0x03, 0x03, 0x83, 0xC3, 0x7E,
+ 0x10, 0x10, 0x78, 0x64, 0x22, 0x11, 0x17, 0x88, 0x18, 0x30, 0x20, 0x67,
+ 0x46, 0x42, 0x21, 0x10, 0xC8, 0x3C, 0x3E, 0x31, 0x98, 0xCC, 0x62, 0x60,
+ 0xC0, 0xE2, 0x9B, 0xC7, 0x61, 0x99, 0xC7, 0x90, 0xEA, 0x80, 0x0E, 0x30,
+ 0xC1, 0x06, 0x08, 0x30, 0x60, 0xC1, 0x83, 0x02, 0x06, 0x04, 0x0C, 0x0C,
+ 0x0E, 0xC0, 0x81, 0x06, 0x08, 0x30, 0xC1, 0x04, 0x10, 0xC3, 0x08, 0x61,
+ 0x08, 0xC0, 0x11, 0x27, 0x59, 0xE3, 0x9A, 0xE4, 0x88, 0x08, 0x04, 0x02,
+ 0x1F, 0xF0, 0x80, 0x40, 0x20, 0xFE, 0xFC, 0xFC, 0x00, 0x80, 0x40, 0x40,
+ 0x20, 0x20, 0x30, 0x10, 0x18, 0x08, 0x0C, 0x04, 0x06, 0x02, 0x03, 0x01,
+ 0x01, 0x80, 0x38, 0x66, 0xC6, 0x82, 0x83, 0x83, 0x83, 0x83, 0x82, 0xC6,
+ 0x66, 0x3C, 0x18, 0x30, 0x67, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x67,
+ 0xF0, 0x7C, 0xC6, 0x83, 0x03, 0x03, 0x02, 0x06, 0x0C, 0x18, 0x30, 0xC0,
+ 0xFF, 0x7C, 0xC6, 0x83, 0x03, 0x02, 0x3C, 0x02, 0x03, 0x83, 0x83, 0xC6,
+ 0x7C, 0x03, 0x03, 0x81, 0xC1, 0x61, 0xB1, 0x98, 0x8C, 0x86, 0xFF, 0x81,
+ 0x80, 0xC0, 0x60, 0x7E, 0x40, 0x40, 0xC0, 0xFC, 0xC6, 0x03, 0x03, 0x83,
+ 0x83, 0xC6, 0x7C, 0x3E, 0x63, 0xC3, 0x80, 0xBC, 0xE6, 0x83, 0x83, 0x83,
+ 0xC3, 0x66, 0x7C, 0xFF, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x10,
+ 0x30, 0x30, 0x60, 0x7C, 0xC6, 0x83, 0x83, 0xC2, 0x7C, 0xC6, 0x83, 0x83,
+ 0x83, 0xC6, 0x7C, 0x7C, 0xC6, 0x83, 0x83, 0x83, 0x83, 0xC3, 0x7E, 0x06,
+ 0x0C, 0x08, 0x30, 0xFC, 0x0F, 0xC0, 0xFC, 0x03, 0xF8, 0x01, 0x83, 0x87,
+ 0x0C, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0x80, 0xFF, 0x80, 0x00, 0x00,
+ 0x0F, 0xF8, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x18, 0x38, 0xE1, 0xC0, 0x80,
+ 0x00, 0x7E, 0xC7, 0x83, 0x03, 0x03, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x18,
+ 0x18, 0x3F, 0x30, 0x90, 0x29, 0xD4, 0x9A, 0x47, 0x22, 0x93, 0x4F, 0xA0,
+ 0x10, 0x0C, 0x13, 0xF8, 0x0C, 0x06, 0x07, 0x02, 0xC1, 0x61, 0x90, 0xCC,
+ 0x46, 0x63, 0x3F, 0x90, 0x78, 0x30, 0xFE, 0x86, 0x83, 0x83, 0x82, 0xFC,
+ 0x83, 0x83, 0x83, 0x83, 0x83, 0xFE, 0x7E, 0xC3, 0xC3, 0x80, 0x80, 0x80,
+ 0x80, 0x80, 0x83, 0xC3, 0xC6, 0x7C, 0xFC, 0x86, 0x82, 0x83, 0x83, 0x83,
+ 0x83, 0x83, 0x83, 0x82, 0x86, 0xFC, 0xFF, 0x80, 0x80, 0x80, 0x80, 0xFF,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80, 0xFF,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7E, 0xC3, 0xC3, 0x80, 0x80, 0x8F,
+ 0x83, 0x83, 0x83, 0xC3, 0xC7, 0x79, 0x83, 0x83, 0x83, 0x83, 0x83, 0xFF,
+ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0xFE, 0x30, 0x60, 0xC1, 0x83, 0x06,
+ 0x0C, 0x18, 0x30, 0x67, 0xF0, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x03, 0x83, 0x82, 0xC6, 0x7C, 0x83, 0x86, 0x84, 0x8C, 0x9C, 0xBC, 0xA4,
+ 0xC6, 0xC6, 0x82, 0x83, 0x83, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xC1, 0xF0, 0xF8, 0xFE, 0x5D, 0x6E, 0xE7,
+ 0x33, 0x91, 0xC0, 0xE0, 0x70, 0x38, 0x10, 0xC3, 0xC3, 0xE3, 0xA3, 0xB3,
+ 0x93, 0x9B, 0x8B, 0x87, 0x87, 0x83, 0x83, 0x7E, 0xC6, 0x83, 0x83, 0x83,
+ 0x83, 0x83, 0x83, 0x83, 0x83, 0xC6, 0x7E, 0xFE, 0x87, 0x83, 0x83, 0x83,
+ 0x83, 0x83, 0xFE, 0x80, 0x80, 0x80, 0x80, 0x7C, 0xC6, 0x83, 0x83, 0x83,
+ 0x83, 0x83, 0x83, 0x83, 0x83, 0xC6, 0x7E, 0x08, 0x0C, 0x07, 0xFE, 0x83,
+ 0x83, 0x83, 0x83, 0x83, 0xFE, 0x88, 0x8C, 0x86, 0x82, 0x83, 0x3F, 0x31,
+ 0xD0, 0x68, 0x06, 0x01, 0xF0, 0x1C, 0x03, 0xC1, 0xA0, 0xD8, 0xC7, 0xC0,
+ 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0xC3, 0xC6, 0x7E,
+ 0xC1, 0xA0, 0xD8, 0x4C, 0x22, 0x31, 0x10, 0xC8, 0x2C, 0x16, 0x0E, 0x03,
+ 0x01, 0x80, 0xC0, 0xE4, 0x72, 0x39, 0x94, 0xCA, 0xAD, 0x56, 0xA7, 0x53,
+ 0x31, 0x98, 0xCC, 0x20, 0x61, 0x91, 0x8C, 0xC2, 0xC1, 0xC0, 0x60, 0x70,
+ 0x2C, 0x32, 0x11, 0x98, 0x78, 0x30, 0xC1, 0xB0, 0x88, 0xC6, 0xC1, 0xC0,
+ 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xFE, 0x04, 0x18, 0x60,
+ 0xC3, 0x04, 0x18, 0x60, 0xC3, 0x07, 0xF0, 0xFE, 0x08, 0x20, 0x82, 0x08,
+ 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0xFC, 0x80, 0x20, 0x10, 0x04,
+ 0x03, 0x00, 0x80, 0x60, 0x10, 0x0C, 0x02, 0x01, 0x80, 0x40, 0x30, 0x08,
+ 0x06, 0x01, 0xFE, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18,
+ 0x30, 0x60, 0xC1, 0x83, 0xFE, 0x0C, 0x0E, 0x05, 0x86, 0x42, 0x33, 0x0B,
+ 0x06, 0xFF, 0x80, 0xC3, 0x7C, 0xC6, 0xC2, 0x1E, 0xE2, 0x82, 0xCE, 0x7B,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xDE, 0xE6, 0xC3, 0xC3, 0xC3, 0xC3, 0xE6, 0xDE,
+ 0x7D, 0x8F, 0x0C, 0x08, 0x18, 0x71, 0xBE, 0x02, 0x04, 0x08, 0x17, 0xB8,
+ 0xF0, 0xC1, 0x83, 0x87, 0x1B, 0xD0, 0x7D, 0x8E, 0x0F, 0xF8, 0x18, 0x71,
+ 0xBE, 0x1F, 0x18, 0xC8, 0x64, 0x0F, 0xF1, 0x00, 0x80, 0x40, 0x20, 0x10,
+ 0x08, 0x04, 0x00, 0x01, 0x81, 0x0F, 0x8C, 0x24, 0x1B, 0x08, 0xFC, 0x60,
+ 0x40, 0x3F, 0xF0, 0x38, 0x17, 0xF8, 0xC1, 0x83, 0x06, 0x0D, 0xFC, 0xF0,
+ 0xE1, 0xC3, 0x87, 0x0E, 0x10, 0x30, 0xC0, 0x00, 0xF0, 0xC3, 0x0C, 0x30,
+ 0xC3, 0x3F, 0x06, 0x0C, 0x00, 0x03, 0xE0, 0xC1, 0x83, 0x06, 0x0C, 0x18,
+ 0x38, 0x78, 0xDF, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0xC4, 0xDC, 0xF4,
+ 0xE6, 0xC2, 0xC3, 0xC1, 0xF0, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3,
+ 0x3F, 0xFB, 0xE6, 0x72, 0x39, 0x1C, 0x8E, 0x47, 0x23, 0x91, 0xDF, 0xCF,
+ 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0x7C, 0xC6, 0xC2, 0x83, 0x83, 0xC2, 0xC6,
+ 0x7C, 0xFE, 0xE6, 0xC3, 0xC3, 0xC3, 0xC3, 0xE6, 0xFE, 0xC0, 0xC0, 0xC0,
+ 0x7B, 0x8F, 0x0C, 0x18, 0x38, 0x71, 0xBD, 0x02, 0x04, 0x08, 0xDE, 0xF3,
+ 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7D, 0x8E, 0x03, 0xE0, 0x70, 0x71,
+ 0xBE, 0x20, 0x10, 0x3F, 0xC4, 0x02, 0x01, 0x00, 0x80, 0x43, 0x31, 0x8F,
+ 0x80, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x71, 0xBD, 0xC1, 0xB0, 0x98, 0xC4,
+ 0x63, 0x20, 0xB0, 0x70, 0x18, 0x80, 0xE4, 0x53, 0x2B, 0xB5, 0x5A, 0x99,
+ 0x8C, 0x46, 0x61, 0x99, 0x87, 0x81, 0x81, 0xC1, 0xB1, 0x8D, 0x83, 0xC1,
+ 0xB0, 0x88, 0xC6, 0xC1, 0x40, 0xE0, 0x20, 0x30, 0x30, 0x10, 0x18, 0x00,
+ 0xFE, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0x7F, 0x1F, 0x18, 0x10, 0x18, 0x18,
+ 0x08, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x08, 0x18, 0x18, 0x10, 0x18, 0x1F,
+ 0xFF, 0xFF, 0x80, 0xF8, 0x0C, 0x0C, 0x08, 0x08, 0x18, 0x18, 0x18, 0x0F,
+ 0x18, 0x10, 0x18, 0x08, 0x08, 0x0C, 0x0C, 0xF8, 0x78, 0xC7, 0xC0 };
+
+const GFXglyph nk57_monospace_no_rg7pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 9, 0, 0 }, // 0x20 ' '
+ { 1, 2, 12, 9, 4, -11 }, // 0x21 '!'
+ { 4, 6, 6, 9, 2, -11 }, // 0x22 '"'
+ { 9, 9, 12, 9, 0, -11 }, // 0x23 '#'
+ { 23, 8, 15, 9, 1, -13 }, // 0x24 '$'
+ { 38, 9, 14, 9, 0, -11 }, // 0x25 '%'
+ { 54, 9, 12, 9, 0, -11 }, // 0x26 '&'
+ { 68, 2, 5, 9, 4, -11 }, // 0x27 '''
+ { 70, 7, 17, 9, 2, -13 }, // 0x28 '('
+ { 85, 6, 17, 9, 1, -13 }, // 0x29 ')'
+ { 98, 7, 8, 9, 1, -11 }, // 0x2A '*'
+ { 105, 9, 7, 9, 0, -8 }, // 0x2B '+'
+ { 113, 2, 4, 9, 4, -1 }, // 0x2C ','
+ { 114, 6, 1, 9, 2, -5 }, // 0x2D '-'
+ { 115, 2, 3, 9, 4, -2 }, // 0x2E '.'
+ { 116, 9, 16, 9, 0, -13 }, // 0x2F '/'
+ { 134, 8, 12, 9, 1, -11 }, // 0x30 '0'
+ { 146, 7, 12, 9, 1, -11 }, // 0x31 '1'
+ { 157, 8, 12, 9, 1, -11 }, // 0x32 '2'
+ { 169, 8, 12, 9, 1, -11 }, // 0x33 '3'
+ { 181, 9, 12, 9, 0, -11 }, // 0x34 '4'
+ { 195, 8, 12, 9, 1, -11 }, // 0x35 '5'
+ { 207, 8, 12, 9, 1, -11 }, // 0x36 '6'
+ { 219, 8, 12, 9, 1, -11 }, // 0x37 '7'
+ { 231, 8, 12, 9, 1, -11 }, // 0x38 '8'
+ { 243, 8, 12, 9, 1, -11 }, // 0x39 '9'
+ { 255, 2, 9, 9, 4, -8 }, // 0x3A ':'
+ { 258, 2, 11, 9, 4, -8 }, // 0x3B ';'
+ { 261, 9, 9, 9, 0, -9 }, // 0x3C '<'
+ { 272, 9, 5, 9, 0, -7 }, // 0x3D '='
+ { 278, 9, 9, 9, 0, -9 }, // 0x3E '>'
+ { 289, 8, 12, 9, 1, -11 }, // 0x3F '?'
+ { 301, 9, 13, 9, 0, -10 }, // 0x40 '@'
+ { 316, 9, 12, 9, 0, -11 }, // 0x41 'A'
+ { 330, 8, 12, 9, 1, -11 }, // 0x42 'B'
+ { 342, 8, 12, 9, 1, -11 }, // 0x43 'C'
+ { 354, 8, 12, 9, 1, -11 }, // 0x44 'D'
+ { 366, 8, 12, 9, 1, -11 }, // 0x45 'E'
+ { 378, 8, 12, 9, 1, -11 }, // 0x46 'F'
+ { 390, 8, 12, 9, 1, -11 }, // 0x47 'G'
+ { 402, 8, 12, 9, 1, -11 }, // 0x48 'H'
+ { 414, 7, 12, 9, 1, -11 }, // 0x49 'I'
+ { 425, 8, 12, 9, 1, -11 }, // 0x4A 'J'
+ { 437, 8, 12, 9, 1, -11 }, // 0x4B 'K'
+ { 449, 8, 12, 9, 1, -11 }, // 0x4C 'L'
+ { 461, 9, 12, 9, 0, -11 }, // 0x4D 'M'
+ { 475, 8, 12, 9, 1, -11 }, // 0x4E 'N'
+ { 487, 8, 12, 9, 1, -11 }, // 0x4F 'O'
+ { 499, 8, 12, 9, 1, -11 }, // 0x50 'P'
+ { 511, 8, 15, 9, 1, -11 }, // 0x51 'Q'
+ { 526, 8, 12, 9, 1, -11 }, // 0x52 'R'
+ { 538, 9, 12, 9, 0, -11 }, // 0x53 'S'
+ { 552, 8, 12, 9, 1, -11 }, // 0x54 'T'
+ { 564, 8, 12, 9, 1, -11 }, // 0x55 'U'
+ { 576, 9, 12, 9, 0, -11 }, // 0x56 'V'
+ { 590, 9, 12, 9, 0, -11 }, // 0x57 'W'
+ { 604, 9, 12, 9, 0, -11 }, // 0x58 'X'
+ { 618, 9, 12, 9, 0, -11 }, // 0x59 'Y'
+ { 632, 7, 12, 9, 1, -11 }, // 0x5A 'Z'
+ { 643, 6, 17, 9, 3, -13 }, // 0x5B '['
+ { 656, 9, 16, 9, 0, -13 }, // 0x5C '\'
+ { 674, 7, 17, 9, 0, -13 }, // 0x5D ']'
+ { 689, 9, 7, 9, 0, -11 }, // 0x5E '^'
+ { 697, 9, 1, 9, 0, 2 }, // 0x5F '_'
+ { 699, 4, 2, 9, 3, -11 }, // 0x60 '`'
+ { 700, 8, 8, 9, 1, -7 }, // 0x61 'a'
+ { 708, 8, 12, 9, 1, -11 }, // 0x62 'b'
+ { 720, 7, 8, 9, 1, -7 }, // 0x63 'c'
+ { 727, 7, 12, 9, 1, -11 }, // 0x64 'd'
+ { 738, 7, 8, 9, 1, -7 }, // 0x65 'e'
+ { 745, 9, 12, 9, 0, -11 }, // 0x66 'f'
+ { 759, 9, 13, 9, 0, -9 }, // 0x67 'g'
+ { 774, 7, 12, 9, 1, -11 }, // 0x68 'h'
+ { 785, 6, 12, 9, 2, -11 }, // 0x69 'i'
+ { 794, 7, 15, 9, 1, -11 }, // 0x6A 'j'
+ { 808, 8, 12, 9, 1, -11 }, // 0x6B 'k'
+ { 820, 6, 12, 9, 2, -11 }, // 0x6C 'l'
+ { 829, 9, 8, 9, 0, -7 }, // 0x6D 'm'
+ { 838, 7, 8, 9, 1, -7 }, // 0x6E 'n'
+ { 845, 8, 8, 9, 1, -7 }, // 0x6F 'o'
+ { 853, 8, 11, 9, 1, -7 }, // 0x70 'p'
+ { 864, 7, 11, 9, 1, -7 }, // 0x71 'q'
+ { 874, 8, 8, 9, 1, -7 }, // 0x72 'r'
+ { 882, 7, 8, 9, 1, -7 }, // 0x73 's'
+ { 889, 9, 10, 9, 0, -9 }, // 0x74 't'
+ { 901, 7, 8, 9, 1, -7 }, // 0x75 'u'
+ { 908, 9, 8, 9, 0, -7 }, // 0x76 'v'
+ { 917, 9, 8, 9, 0, -7 }, // 0x77 'w'
+ { 926, 9, 8, 9, 0, -7 }, // 0x78 'x'
+ { 935, 9, 11, 9, 0, -7 }, // 0x79 'y'
+ { 948, 7, 8, 9, 1, -7 }, // 0x7A 'z'
+ { 955, 8, 17, 9, 1, -13 }, // 0x7B '{'
+ { 972, 1, 17, 9, 4, -13 }, // 0x7C '|'
+ { 975, 8, 17, 9, 0, -13 }, // 0x7D '}'
+ { 992, 9, 2, 9, 0, -6 } }; // 0x7E '~'
+
+const GFXfont nk57_monospace_no_rg7pt7b PROGMEM = {
+ (uint8_t *)nk57_monospace_no_rg7pt7bBitmaps,
+ (GFXglyph *)nk57_monospace_no_rg7pt7bGlyphs,
+ 0x20, 0x7E, 16 };
+
+// Approx. 1667 bytes
+const uint8_t nk57_monospace_cd_rg7pt7bBitmaps[] PROGMEM = {
+ 0x00, 0x55, 0x55, 0x1D, 0x4A, 0x52, 0x94, 0x80, 0x24, 0x48, 0x91, 0x2F,
+ 0xE5, 0x12, 0x7E, 0x48, 0x91, 0x22, 0x40, 0x10, 0x47, 0xD1, 0xC7, 0x06,
+ 0x0F, 0x04, 0x1C, 0x51, 0x78, 0x41, 0x00, 0x70, 0xA2, 0x42, 0x97, 0x41,
+ 0x04, 0x10, 0x5D, 0x28, 0x91, 0x21, 0x43, 0x80, 0x38, 0x91, 0x12, 0x47,
+ 0x86, 0x1D, 0xEA, 0x8D, 0x13, 0x33, 0xB0, 0xF8, 0x32, 0x44, 0xC8, 0x88,
+ 0x88, 0x88, 0xC4, 0x42, 0x30, 0x84, 0x62, 0x31, 0x11, 0x11, 0x11, 0x32,
+ 0x64, 0x80, 0x11, 0x5F, 0xC4, 0xFD, 0x51, 0x00, 0x10, 0x41, 0x3F, 0x10,
+ 0x41, 0x00, 0xD5, 0xF8, 0x74, 0x02, 0x08, 0x10, 0x20, 0x81, 0x06, 0x08,
+ 0x10, 0x60, 0x81, 0x04, 0x08, 0x10, 0x40, 0x39, 0xA4, 0x51, 0x47, 0x1C,
+ 0x51, 0x45, 0x16, 0x8E, 0x21, 0x09, 0xC2, 0x10, 0x84, 0x21, 0x09, 0xF0,
+ 0xF4, 0xE2, 0x10, 0x84, 0x62, 0x22, 0x21, 0xF0, 0xF4, 0xE2, 0x10, 0xB8,
+ 0x21, 0x8C, 0x66, 0xE0, 0x0C, 0x18, 0x70, 0xE2, 0xC5, 0x93, 0x26, 0xFE,
+ 0x18, 0x30, 0x60, 0xFC, 0x21, 0x0F, 0x4C, 0x21, 0x8C, 0x66, 0xE0, 0x7E,
+ 0x63, 0x0F, 0x6E, 0x31, 0x8C, 0x76, 0xE0, 0xF8, 0x42, 0x31, 0x08, 0xC4,
+ 0x23, 0x10, 0x80, 0x39, 0x34, 0x51, 0x44, 0xE4, 0xF1, 0xC7, 0x16, 0xCE,
+ 0x39, 0x3C, 0x71, 0xC7, 0x14, 0x5F, 0x0C, 0x21, 0x0C, 0x74, 0x07, 0x40,
+ 0x74, 0x03, 0x54, 0x04, 0x73, 0x30, 0xC1, 0x81, 0x83, 0x04, 0xFC, 0x00,
+ 0x00, 0xFC, 0xC1, 0x81, 0x83, 0x04, 0x63, 0x30, 0x80, 0xF4, 0xE2, 0x10,
+ 0x88, 0x84, 0x01, 0x18, 0x40, 0x79, 0x14, 0x67, 0x96, 0x59, 0x65, 0x9E,
+ 0x04, 0x11, 0x7C, 0x10, 0x60, 0xE1, 0x42, 0x85, 0x1A, 0x26, 0x4C, 0xF9,
+ 0x16, 0x30, 0xF4, 0x63, 0x18, 0xFA, 0x31, 0x8C, 0x63, 0xF0, 0x3D, 0x94,
+ 0x50, 0xC3, 0x0C, 0x30, 0x45, 0x16, 0xCE, 0xF4, 0xE3, 0x18, 0xC6, 0x31,
+ 0x8C, 0x67, 0xE0, 0xFC, 0x21, 0x08, 0x7E, 0x10, 0x84, 0x21, 0xF0, 0xFC,
+ 0x21, 0x08, 0x7E, 0x10, 0x84, 0x21, 0x00, 0x3D, 0x94, 0x50, 0xC3, 0x3C,
+ 0x71, 0x45, 0x14, 0xDD, 0x8C, 0x63, 0x18, 0xFE, 0x31, 0x8C, 0x63, 0x10,
+ 0xF9, 0x08, 0x42, 0x10, 0x84, 0x21, 0x09, 0xF0, 0x04, 0x10, 0x41, 0x04,
+ 0x10, 0x41, 0xC5, 0x14, 0xDE, 0x8E, 0x29, 0x24, 0xB2, 0xCD, 0x36, 0x8A,
+ 0x28, 0xA3, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0xF0, 0xC7, 0x8F,
+ 0x3D, 0x7A, 0xF6, 0xE5, 0xCB, 0x87, 0x0E, 0x1C, 0x30, 0x8C, 0x73, 0x9E,
+ 0xD6, 0xB3, 0x9C, 0xE3, 0x10, 0x79, 0x34, 0x71, 0xC7, 0x1C, 0x71, 0xC5,
+ 0x14, 0xDE, 0xF4, 0xE3, 0x18, 0xC6, 0x3F, 0x84, 0x21, 0x00, 0x78, 0x99,
+ 0x12, 0x2C, 0x58, 0xB1, 0x62, 0x44, 0x89, 0x33, 0xC0, 0x81, 0x03, 0x80,
+ 0xFA, 0x28, 0xA2, 0x8A, 0x2F, 0xAC, 0x92, 0x68, 0xA3, 0x3D, 0x3C, 0x70,
+ 0x41, 0xE0, 0xC1, 0xC7, 0x14, 0xDE, 0xFC, 0x41, 0x04, 0x10, 0x41, 0x04,
+ 0x10, 0x41, 0x04, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x67, 0xE0, 0xC6,
+ 0x89, 0x12, 0x24, 0xCD, 0x0A, 0x14, 0x28, 0x70, 0xC0, 0x80, 0x83, 0x06,
+ 0x5C, 0xBD, 0x5E, 0x9B, 0x36, 0x6C, 0xD9, 0x32, 0x20, 0x44, 0xC8, 0xA1,
+ 0x43, 0x82, 0x0C, 0x14, 0x68, 0x99, 0x16, 0x30, 0xC6, 0x89, 0xB1, 0x43,
+ 0x82, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xF8, 0x46, 0x23, 0x11, 0x8C,
+ 0x46, 0x21, 0xF0, 0xFC, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42,
+ 0x10, 0xF8, 0x81, 0x81, 0x02, 0x06, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20,
+ 0x40, 0xC0, 0x81, 0x03, 0xF8, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31,
+ 0x8C, 0x63, 0xF8, 0x10, 0x70, 0xA1, 0x44, 0xC8, 0xB1, 0x80, 0xFE, 0xCC,
+ 0x74, 0xE2, 0x7C, 0xC6, 0x7D, 0x84, 0x21, 0x0B, 0x6E, 0x31, 0x8C, 0x77,
+ 0x60, 0x76, 0x63, 0x08, 0x47, 0x6E, 0x08, 0x42, 0x1E, 0xCE, 0x31, 0x8C,
+ 0x67, 0xD0, 0x74, 0xE3, 0xF8, 0x47, 0x6E, 0x3D, 0x94, 0x50, 0xFD, 0x04,
+ 0x10, 0x41, 0x04, 0x10, 0x06, 0x11, 0xE2, 0x24, 0x48, 0x9F, 0x30, 0x40,
+ 0xFA, 0x0C, 0x3F, 0xC0, 0x84, 0x21, 0x0B, 0x6E, 0x31, 0x8C, 0x63, 0x10,
+ 0x21, 0x00, 0x0E, 0x10, 0x84, 0x21, 0x09, 0xF0, 0x18, 0xC0, 0x07, 0x8C,
+ 0x63, 0x18, 0xC6, 0x39, 0xCF, 0xC0, 0x82, 0x08, 0x20, 0x8E, 0x4B, 0x3C,
+ 0xD2, 0x28, 0xA3, 0xE1, 0x08, 0x42, 0x10, 0x84, 0x21, 0x09, 0xF0, 0xFD,
+ 0xAE, 0x4C, 0x99, 0x32, 0x64, 0xC9, 0xB6, 0xE3, 0x18, 0xC6, 0x31, 0x76,
+ 0xE3, 0x18, 0xC7, 0x6E, 0xB6, 0xE3, 0x18, 0xC7, 0x76, 0x84, 0x20, 0xEC,
+ 0xE3, 0x18, 0xC6, 0x7D, 0x08, 0x42, 0xBE, 0x63, 0x08, 0x42, 0x10, 0xF4,
+ 0xE1, 0xE1, 0xC6, 0x7E, 0x41, 0x0F, 0xD0, 0x41, 0x04, 0x11, 0x64, 0xF0,
+ 0x8C, 0x63, 0x18, 0xC6, 0x7D, 0xC6, 0x89, 0x13, 0x42, 0x85, 0x0C, 0x08,
+ 0x83, 0x0E, 0x56, 0xA6, 0xCD, 0x9B, 0x26, 0x44, 0xD8, 0xA0, 0x83, 0x85,
+ 0x13, 0x63, 0xC6, 0x89, 0x31, 0x43, 0x86, 0x04, 0x10, 0x20, 0xC1, 0x00,
+ 0xF8, 0xC4, 0x46, 0x22, 0x1F, 0x3C, 0x82, 0x08, 0x20, 0xC3, 0x0C, 0xE0,
+ 0xC3, 0x0C, 0x20, 0x82, 0x08, 0x3C, 0xFF, 0xFF, 0x80, 0xF0, 0x41, 0x04,
+ 0x30, 0xC2, 0x08, 0x1C, 0x82, 0x08, 0x30, 0x41, 0x04, 0xF0, 0x76, 0x70 };
+
+const GFXglyph nk57_monospace_cd_rg7pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 7, 0, 0 }, // 0x20 ' '
+ { 1, 2, 12, 7, 2, -11 }, // 0x21 '!'
+ { 4, 5, 6, 7, 1, -11 }, // 0x22 '"'
+ { 8, 7, 12, 7, 0, -11 }, // 0x23 '#'
+ { 19, 6, 15, 7, 0, -13 }, // 0x24 '$'
+ { 31, 7, 14, 7, 0, -11 }, // 0x25 '%'
+ { 44, 7, 12, 7, 0, -11 }, // 0x26 '&'
+ { 55, 1, 5, 7, 3, -11 }, // 0x27 '''
+ { 56, 4, 17, 7, 2, -13 }, // 0x28 '('
+ { 65, 4, 17, 7, 1, -13 }, // 0x29 ')'
+ { 74, 6, 7, 7, 0, -11 }, // 0x2A '*'
+ { 80, 6, 7, 7, 0, -8 }, // 0x2B '+'
+ { 86, 2, 4, 7, 2, -1 }, // 0x2C ','
+ { 87, 5, 1, 7, 1, -5 }, // 0x2D '-'
+ { 88, 2, 3, 7, 2, -2 }, // 0x2E '.'
+ { 89, 7, 16, 7, 0, -13 }, // 0x2F '/'
+ { 103, 6, 12, 7, 0, -11 }, // 0x30 '0'
+ { 112, 5, 12, 7, 1, -11 }, // 0x31 '1'
+ { 120, 5, 12, 7, 1, -11 }, // 0x32 '2'
+ { 128, 5, 12, 7, 1, -11 }, // 0x33 '3'
+ { 136, 7, 12, 7, 0, -11 }, // 0x34 '4'
+ { 147, 5, 12, 7, 1, -11 }, // 0x35 '5'
+ { 155, 5, 12, 7, 1, -11 }, // 0x36 '6'
+ { 163, 5, 12, 7, 1, -11 }, // 0x37 '7'
+ { 171, 6, 12, 7, 0, -11 }, // 0x38 '8'
+ { 180, 6, 12, 7, 0, -11 }, // 0x39 '9'
+ { 189, 2, 9, 7, 2, -8 }, // 0x3A ':'
+ { 192, 2, 11, 7, 2, -8 }, // 0x3B ';'
+ { 195, 6, 9, 7, 0, -9 }, // 0x3C '<'
+ { 202, 6, 5, 7, 0, -7 }, // 0x3D '='
+ { 206, 6, 9, 7, 0, -9 }, // 0x3E '>'
+ { 213, 5, 12, 7, 1, -11 }, // 0x3F '?'
+ { 221, 6, 13, 7, 0, -10 }, // 0x40 '@'
+ { 231, 7, 12, 7, 0, -11 }, // 0x41 'A'
+ { 242, 5, 12, 7, 1, -11 }, // 0x42 'B'
+ { 250, 6, 12, 7, 0, -11 }, // 0x43 'C'
+ { 259, 5, 12, 7, 1, -11 }, // 0x44 'D'
+ { 267, 5, 12, 7, 1, -11 }, // 0x45 'E'
+ { 275, 5, 12, 7, 1, -11 }, // 0x46 'F'
+ { 283, 6, 12, 7, 0, -11 }, // 0x47 'G'
+ { 292, 5, 12, 7, 1, -11 }, // 0x48 'H'
+ { 300, 5, 12, 7, 1, -11 }, // 0x49 'I'
+ { 308, 6, 12, 7, 0, -11 }, // 0x4A 'J'
+ { 317, 6, 12, 7, 1, -11 }, // 0x4B 'K'
+ { 326, 5, 12, 7, 1, -11 }, // 0x4C 'L'
+ { 334, 7, 12, 7, 0, -11 }, // 0x4D 'M'
+ { 345, 5, 12, 7, 1, -11 }, // 0x4E 'N'
+ { 353, 6, 12, 7, 0, -11 }, // 0x4F 'O'
+ { 362, 5, 12, 7, 1, -11 }, // 0x50 'P'
+ { 370, 7, 15, 7, 0, -11 }, // 0x51 'Q'
+ { 384, 6, 12, 7, 1, -11 }, // 0x52 'R'
+ { 393, 6, 12, 7, 0, -11 }, // 0x53 'S'
+ { 402, 6, 12, 7, 0, -11 }, // 0x54 'T'
+ { 411, 5, 12, 7, 1, -11 }, // 0x55 'U'
+ { 419, 7, 12, 7, 0, -11 }, // 0x56 'V'
+ { 430, 7, 12, 7, 0, -11 }, // 0x57 'W'
+ { 441, 7, 12, 7, 0, -11 }, // 0x58 'X'
+ { 452, 7, 12, 7, 0, -11 }, // 0x59 'Y'
+ { 463, 5, 12, 7, 1, -11 }, // 0x5A 'Z'
+ { 471, 5, 17, 7, 2, -13 }, // 0x5B '['
+ { 482, 7, 16, 7, 0, -13 }, // 0x5C '\'
+ { 496, 5, 17, 7, 0, -13 }, // 0x5D ']'
+ { 507, 7, 7, 7, 0, -11 }, // 0x5E '^'
+ { 514, 7, 1, 7, 0, 2 }, // 0x5F '_'
+ { 515, 3, 2, 7, 2, -11 }, // 0x60 '`'
+ { 516, 5, 8, 7, 1, -7 }, // 0x61 'a'
+ { 521, 5, 12, 7, 1, -11 }, // 0x62 'b'
+ { 529, 5, 8, 7, 1, -7 }, // 0x63 'c'
+ { 534, 5, 12, 7, 1, -11 }, // 0x64 'd'
+ { 542, 5, 8, 7, 1, -7 }, // 0x65 'e'
+ { 547, 6, 12, 7, 0, -11 }, // 0x66 'f'
+ { 556, 7, 13, 7, 0, -9 }, // 0x67 'g'
+ { 568, 5, 12, 7, 1, -11 }, // 0x68 'h'
+ { 576, 5, 12, 7, 1, -11 }, // 0x69 'i'
+ { 584, 5, 15, 7, 1, -11 }, // 0x6A 'j'
+ { 594, 6, 12, 7, 1, -11 }, // 0x6B 'k'
+ { 603, 5, 12, 7, 1, -11 }, // 0x6C 'l'
+ { 611, 7, 8, 7, 0, -7 }, // 0x6D 'm'
+ { 618, 5, 8, 7, 1, -7 }, // 0x6E 'n'
+ { 623, 5, 8, 7, 1, -7 }, // 0x6F 'o'
+ { 628, 5, 11, 7, 1, -7 }, // 0x70 'p'
+ { 635, 5, 11, 7, 1, -7 }, // 0x71 'q'
+ { 642, 5, 8, 7, 1, -7 }, // 0x72 'r'
+ { 647, 5, 8, 7, 1, -7 }, // 0x73 's'
+ { 652, 6, 10, 7, 0, -9 }, // 0x74 't'
+ { 660, 5, 8, 7, 1, -7 }, // 0x75 'u'
+ { 665, 7, 8, 7, 0, -7 }, // 0x76 'v'
+ { 672, 7, 8, 7, 0, -7 }, // 0x77 'w'
+ { 679, 7, 8, 7, 0, -7 }, // 0x78 'x'
+ { 686, 7, 11, 7, 0, -7 }, // 0x79 'y'
+ { 696, 5, 8, 7, 1, -7 }, // 0x7A 'z'
+ { 701, 6, 17, 7, 1, -13 }, // 0x7B '{'
+ { 714, 1, 17, 7, 3, -13 }, // 0x7C '|'
+ { 717, 6, 17, 7, 0, -13 }, // 0x7D '}'
+ { 730, 6, 2, 7, 0, -6 } }; // 0x7E '~'
+
+const GFXfont nk57_monospace_cd_rg7pt7b PROGMEM = {
+ (uint8_t *)nk57_monospace_cd_rg7pt7bBitmaps,
+ (GFXglyph *)nk57_monospace_cd_rg7pt7bGlyphs,
+ 0x20, 0x7E, 16 };
+
+// Approx. 1404 bytes
+const uint8_t nk57_monospace_no_bd7pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFD, 0xB6, 0xD8, 0xFF, 0x80, 0xCF, 0x3C, 0xF3, 0xCC, 0x13, 0x09,
+ 0x8C, 0xCF, 0xF7, 0xF9, 0x93, 0xFF, 0xFF, 0x26, 0x33, 0x19, 0x80, 0x18,
+ 0x18, 0x7E, 0xC3, 0xC0, 0xE0, 0xFC, 0x1F, 0x07, 0xC3, 0xC7, 0xFE, 0x18,
+ 0x18, 0x78, 0x64, 0x32, 0x19, 0x17, 0x98, 0x18, 0x30, 0x60, 0xC7, 0xC6,
+ 0x43, 0x21, 0x90, 0x78, 0x3E, 0x3F, 0x98, 0xC6, 0xC3, 0xC3, 0xCD, 0xB7,
+ 0x8E, 0xE3, 0x3F, 0x8F, 0x60, 0xFF, 0xC0, 0x0E, 0x30, 0xC3, 0x86, 0x0C,
+ 0x38, 0x70, 0xE1, 0xC3, 0x83, 0x06, 0x0E, 0x0C, 0x0C, 0x0E, 0xE1, 0xC3,
+ 0x06, 0x1C, 0x70, 0xC3, 0x0C, 0x30, 0xC7, 0x1C, 0x63, 0x1C, 0xE0, 0x19,
+ 0x27, 0x5B, 0xE3, 0xDE, 0xE4, 0x8C, 0x0C, 0x06, 0x03, 0x1F, 0xFF, 0xF8,
+ 0x60, 0x30, 0x7F, 0xB6, 0xFF, 0xF0, 0xFF, 0x80, 0x01, 0x80, 0xC0, 0xC0,
+ 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x06, 0x03, 0x03,
+ 0x00, 0x3C, 0x7E, 0xC6, 0xC6, 0xC7, 0xC7, 0xC7, 0xC6, 0xC6, 0x7E, 0x3C,
+ 0x18, 0x33, 0xE6, 0xC1, 0x83, 0x06, 0x0C, 0x19, 0xFF, 0xF8, 0x7C, 0xFE,
+ 0xC7, 0x07, 0x06, 0x06, 0x0C, 0x18, 0x70, 0xFF, 0xFF, 0x7C, 0xFE, 0xC7,
+ 0x07, 0x3E, 0x3E, 0x07, 0x03, 0xC7, 0xFE, 0x7C, 0x03, 0x03, 0x83, 0xC3,
+ 0x63, 0x31, 0x99, 0x8D, 0xFF, 0xFF, 0x81, 0x80, 0xC0, 0x7E, 0x7E, 0x60,
+ 0xFC, 0xFE, 0x47, 0x03, 0x03, 0xC7, 0xFE, 0x7C, 0x3E, 0x7F, 0xC3, 0xDC,
+ 0xFE, 0xC7, 0xC3, 0xC3, 0xC7, 0xFE, 0x7C, 0xFF, 0xFF, 0x06, 0x06, 0x0C,
+ 0x0C, 0x18, 0x18, 0x38, 0x30, 0x70, 0x7C, 0xFE, 0xC3, 0xC3, 0xFE, 0xFE,
+ 0xC7, 0xC3, 0xC3, 0xFE, 0x7C, 0x7C, 0xFE, 0xC7, 0xC3, 0xC3, 0xC3, 0xFE,
+ 0x36, 0x0C, 0x1C, 0x38, 0xFF, 0x80, 0x3F, 0xE0, 0xFF, 0x80, 0x1F, 0xED,
+ 0x80, 0x00, 0x83, 0xC7, 0x8F, 0x0E, 0x03, 0xC0, 0x7C, 0x07, 0x00, 0x80,
+ 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xFC, 0xC0, 0x78, 0x0F, 0x00, 0xF0,
+ 0x18, 0x7C, 0xF1, 0xE0, 0x80, 0x00, 0x7E, 0xFF, 0xC3, 0x03, 0x06, 0x0C,
+ 0x18, 0x00, 0x38, 0x38, 0x38, 0x1E, 0x3F, 0x98, 0x68, 0x34, 0xFA, 0x4F,
+ 0x26, 0x93, 0x4F, 0xA0, 0x18, 0x2F, 0xF3, 0xF0, 0x0C, 0x0E, 0x07, 0x83,
+ 0xC3, 0x61, 0xB8, 0xCC, 0xFE, 0x7F, 0x30, 0xF8, 0x60, 0xFE, 0xFE, 0xC7,
+ 0xC7, 0xFE, 0xFE, 0xC7, 0xC3, 0xC3, 0xFF, 0xFE, 0x7E, 0xFF, 0xC7, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC7, 0xFE, 0x7C, 0xFC, 0xFE, 0xC6, 0xC7, 0xC7,
+ 0xC7, 0xC7, 0xC7, 0xC6, 0xFE, 0xFC, 0xFF, 0xFF, 0xC0, 0xC0, 0xFF, 0xFF,
+ 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xFF, 0xFF, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0xFF, 0xC7, 0xC0, 0xCF, 0xCF, 0xC3, 0xC3,
+ 0xC3, 0xFF, 0x7B, 0xC7, 0xC7, 0xC7, 0xC7, 0xFF, 0xFF, 0xC7, 0xC7, 0xC7,
+ 0xC7, 0xC7, 0xFF, 0xFC, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x19, 0xFF, 0xF8,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xC6, 0xFE, 0x7C, 0xC7,
+ 0xC6, 0xCC, 0xDC, 0xFC, 0xFC, 0xEE, 0xC6, 0xC6, 0xC7, 0xC3, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xE1, 0xF1, 0xFC,
+ 0xFE, 0xFF, 0xDF, 0x6F, 0xA7, 0xC3, 0xE1, 0xF0, 0xF8, 0x60, 0xC3, 0xE3,
+ 0xE3, 0xF3, 0xF3, 0xDB, 0xDF, 0xCF, 0xC7, 0xC7, 0xC3, 0x7E, 0xFE, 0xC7,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0xFE, 0x7E, 0xFE, 0xFF, 0xC3, 0xC3,
+ 0xC3, 0xC7, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0, 0x7E, 0xFE, 0xC7, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC7, 0xFE, 0x7E, 0x08, 0x0F, 0x07, 0xFE, 0xFF, 0xC3,
+ 0xC3, 0xC3, 0xFF, 0xFC, 0xCC, 0xCE, 0xC6, 0xC7, 0x3F, 0x3F, 0xD8, 0xEC,
+ 0x07, 0xC1, 0xF8, 0x0F, 0x03, 0x63, 0xBF, 0x8F, 0x80, 0xFF, 0xFF, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xC7, 0xC7, 0xC7, 0xC7,
+ 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xFE, 0x7E, 0xE1, 0xB1, 0xD8, 0xCE, 0x63,
+ 0x31, 0xB0, 0xD8, 0x3C, 0x1E, 0x0E, 0x07, 0x00, 0xC1, 0xE4, 0xF3, 0x79,
+ 0xBD, 0xDB, 0xED, 0xDE, 0xEF, 0x73, 0xB1, 0xD8, 0xC0, 0x73, 0x99, 0x8F,
+ 0xC3, 0xC1, 0xE0, 0xE0, 0x78, 0x6C, 0x77, 0x31, 0xF8, 0xE0, 0xE1, 0xB9,
+ 0x8D, 0xC7, 0xC1, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x00, 0xFF,
+ 0xFC, 0x38, 0x61, 0xC7, 0x0C, 0x38, 0x61, 0xFF, 0xF8, 0xFF, 0xFC, 0x30,
+ 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x3F, 0xFC, 0xC0, 0x30,
+ 0x18, 0x06, 0x03, 0x00, 0xC0, 0x60, 0x18, 0x0C, 0x03, 0x01, 0x80, 0x60,
+ 0x30, 0x0C, 0x06, 0xFF, 0xFC, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C,
+ 0x38, 0x70, 0xE1, 0xC3, 0xFF, 0xFE, 0x1C, 0x0F, 0x0D, 0x86, 0x66, 0x37,
+ 0x0C, 0xFF, 0xFF, 0xC0, 0xE0, 0xC0, 0x7C, 0xFE, 0xC6, 0x3E, 0xF6, 0xC6,
+ 0xFF, 0x7F, 0xC0, 0xC0, 0xC0, 0xDE, 0xFE, 0xC7, 0xC7, 0xC7, 0xC7, 0xFE,
+ 0xDE, 0x7D, 0xFF, 0x1E, 0x0C, 0x18, 0xFF, 0xBE, 0x06, 0x0C, 0x1B, 0xFF,
+ 0xF8, 0xF1, 0xE3, 0xC7, 0xFD, 0xF8, 0x7D, 0xFF, 0x1F, 0xFF, 0xF8, 0x3F,
+ 0xBE, 0x1F, 0x1F, 0xCC, 0x1F, 0xEF, 0xF1, 0x80, 0xC0, 0x60, 0x30, 0x18,
+ 0x0C, 0x00, 0x03, 0x81, 0xCF, 0x8F, 0xE6, 0x3B, 0x1D, 0xFC, 0x3C, 0x7F,
+ 0x3F, 0xF0, 0x7F, 0xF7, 0xF8, 0xC1, 0x83, 0x06, 0xFF, 0xF8, 0xF1, 0xE3,
+ 0xC7, 0x8F, 0x18, 0x30, 0xC3, 0x3C, 0xF0, 0xC3, 0x0C, 0x33, 0xFF, 0xC0,
+ 0x0E, 0x1C, 0x19, 0xF3, 0xE0, 0xC1, 0x83, 0x06, 0x0C, 0x1E, 0x3F, 0xEF,
+ 0x80, 0xC0, 0xC0, 0xC0, 0xC7, 0xCE, 0xDC, 0xFC, 0xE6, 0xC6, 0xC7, 0xC3,
+ 0xF3, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x33, 0xFF, 0xC0, 0xFB, 0xFF, 0xF3,
+ 0x79, 0xBC, 0xDE, 0x6F, 0x37, 0x9B, 0xDF, 0xFF, 0x1E, 0x3C, 0x78, 0xF1,
+ 0xE3, 0x7C, 0xFE, 0xC6, 0xC7, 0xC7, 0xC6, 0xFE, 0x7C, 0xDE, 0xFE, 0xC7,
+ 0xC7, 0xC7, 0xC7, 0xFE, 0xDE, 0xC0, 0xC0, 0xC0, 0x7F, 0xFF, 0x1E, 0x3C,
+ 0x78, 0xFF, 0xBF, 0x06, 0x0C, 0x18, 0xDE, 0xFF, 0xC3, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0x7D, 0xFF, 0x1B, 0xC0, 0xF8, 0xFF, 0xBE, 0x30, 0x18, 0x3F,
+ 0xDF, 0xE3, 0x01, 0x80, 0xC0, 0x63, 0x3F, 0x8F, 0x80, 0xC7, 0x8F, 0x1E,
+ 0x3C, 0x78, 0xFF, 0xBF, 0xE1, 0xB1, 0xDC, 0xC6, 0x63, 0x60, 0xF0, 0x70,
+ 0x38, 0xC1, 0xE4, 0xF3, 0x6F, 0xB7, 0x5B, 0xBD, 0xCC, 0xC6, 0x73, 0x99,
+ 0x87, 0x83, 0x81, 0xE1, 0xB1, 0xCD, 0xC3, 0xE1, 0xB1, 0x8C, 0xC6, 0xC1,
+ 0xE0, 0xE0, 0x70, 0x30, 0x38, 0x18, 0x18, 0x00, 0xFF, 0xFC, 0x30, 0xC3,
+ 0x0C, 0x3F, 0xFF, 0x1F, 0x1F, 0x18, 0x18, 0x18, 0x1C, 0x1C, 0x1C, 0xF8,
+ 0xF8, 0x0C, 0x1C, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xC0, 0xF8, 0xFC, 0x0C, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x18,
+ 0x18, 0x18, 0x1C, 0x0C, 0xFC, 0xF8, 0x78, 0xFF, 0xE1, 0xC0 };
+
+const GFXglyph nk57_monospace_no_bd7pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 9, 0, 0 }, // 0x20 ' '
+ { 1, 3, 11, 9, 3, -10 }, // 0x21 '!'
+ { 6, 6, 5, 9, 2, -10 }, // 0x22 '"'
+ { 10, 9, 11, 9, 0, -10 }, // 0x23 '#'
+ { 23, 8, 14, 9, 1, -12 }, // 0x24 '$'
+ { 37, 9, 13, 9, 0, -11 }, // 0x25 '%'
+ { 52, 9, 11, 9, 0, -10 }, // 0x26 '&'
+ { 65, 2, 5, 9, 4, -10 }, // 0x27 '''
+ { 67, 7, 17, 9, 2, -13 }, // 0x28 '('
+ { 82, 6, 17, 9, 1, -13 }, // 0x29 ')'
+ { 95, 7, 8, 9, 1, -10 }, // 0x2A '*'
+ { 102, 9, 7, 9, 0, -8 }, // 0x2B '+'
+ { 110, 3, 5, 9, 3, -2 }, // 0x2C ','
+ { 112, 6, 2, 9, 2, -5 }, // 0x2D '-'
+ { 114, 3, 3, 9, 3, -2 }, // 0x2E '.'
+ { 116, 9, 15, 9, 0, -12 }, // 0x2F '/'
+ { 133, 8, 11, 9, 1, -10 }, // 0x30 '0'
+ { 144, 7, 11, 9, 1, -10 }, // 0x31 '1'
+ { 154, 8, 11, 9, 1, -10 }, // 0x32 '2'
+ { 165, 8, 11, 9, 1, -10 }, // 0x33 '3'
+ { 176, 9, 11, 9, 0, -10 }, // 0x34 '4'
+ { 189, 8, 11, 9, 1, -10 }, // 0x35 '5'
+ { 200, 8, 11, 9, 1, -10 }, // 0x36 '6'
+ { 211, 8, 11, 9, 1, -10 }, // 0x37 '7'
+ { 222, 8, 11, 9, 1, -10 }, // 0x38 '8'
+ { 233, 8, 11, 9, 1, -10 }, // 0x39 '9'
+ { 244, 3, 9, 9, 3, -8 }, // 0x3A ':'
+ { 248, 3, 11, 9, 3, -8 }, // 0x3B ';'
+ { 253, 9, 9, 9, 0, -9 }, // 0x3C '<'
+ { 264, 9, 6, 9, 0, -8 }, // 0x3D '='
+ { 271, 9, 9, 9, 0, -9 }, // 0x3E '>'
+ { 282, 8, 11, 9, 1, -10 }, // 0x3F '?'
+ { 293, 9, 13, 9, 0, -10 }, // 0x40 '@'
+ { 308, 9, 11, 9, 0, -10 }, // 0x41 'A'
+ { 321, 8, 11, 9, 1, -10 }, // 0x42 'B'
+ { 332, 8, 11, 9, 1, -10 }, // 0x43 'C'
+ { 343, 8, 11, 9, 1, -10 }, // 0x44 'D'
+ { 354, 8, 11, 9, 1, -10 }, // 0x45 'E'
+ { 365, 8, 11, 9, 1, -10 }, // 0x46 'F'
+ { 376, 8, 11, 9, 1, -10 }, // 0x47 'G'
+ { 387, 8, 11, 9, 1, -10 }, // 0x48 'H'
+ { 398, 7, 11, 9, 1, -10 }, // 0x49 'I'
+ { 408, 8, 11, 9, 1, -10 }, // 0x4A 'J'
+ { 419, 8, 11, 9, 1, -10 }, // 0x4B 'K'
+ { 430, 8, 11, 9, 1, -10 }, // 0x4C 'L'
+ { 441, 9, 11, 9, 0, -10 }, // 0x4D 'M'
+ { 454, 8, 11, 9, 1, -10 }, // 0x4E 'N'
+ { 465, 8, 11, 9, 1, -10 }, // 0x4F 'O'
+ { 476, 8, 11, 9, 1, -10 }, // 0x50 'P'
+ { 487, 8, 14, 9, 1, -10 }, // 0x51 'Q'
+ { 501, 8, 11, 9, 1, -10 }, // 0x52 'R'
+ { 512, 9, 11, 9, 0, -10 }, // 0x53 'S'
+ { 525, 8, 11, 9, 1, -10 }, // 0x54 'T'
+ { 536, 8, 11, 9, 1, -10 }, // 0x55 'U'
+ { 547, 9, 11, 9, 0, -10 }, // 0x56 'V'
+ { 560, 9, 11, 9, 0, -10 }, // 0x57 'W'
+ { 573, 9, 11, 9, 0, -10 }, // 0x58 'X'
+ { 586, 9, 11, 9, 0, -10 }, // 0x59 'Y'
+ { 599, 7, 11, 9, 1, -10 }, // 0x5A 'Z'
+ { 609, 6, 17, 9, 3, -13 }, // 0x5B '['
+ { 622, 9, 15, 9, 0, -12 }, // 0x5C '\'
+ { 639, 7, 17, 9, 0, -13 }, // 0x5D ']'
+ { 654, 9, 6, 9, 0, -10 }, // 0x5E '^'
+ { 661, 9, 2, 9, 0, 2 }, // 0x5F '_'
+ { 664, 5, 2, 9, 2, -10 }, // 0x60 '`'
+ { 666, 8, 8, 9, 1, -7 }, // 0x61 'a'
+ { 674, 8, 11, 9, 1, -10 }, // 0x62 'b'
+ { 685, 7, 8, 9, 1, -7 }, // 0x63 'c'
+ { 692, 7, 11, 9, 1, -10 }, // 0x64 'd'
+ { 702, 7, 8, 9, 1, -7 }, // 0x65 'e'
+ { 709, 9, 11, 9, 0, -10 }, // 0x66 'f'
+ { 722, 9, 13, 9, 0, -9 }, // 0x67 'g'
+ { 737, 7, 11, 9, 1, -10 }, // 0x68 'h'
+ { 747, 6, 11, 9, 2, -10 }, // 0x69 'i'
+ { 756, 7, 14, 9, 1, -10 }, // 0x6A 'j'
+ { 769, 8, 11, 9, 1, -10 }, // 0x6B 'k'
+ { 780, 6, 11, 9, 2, -10 }, // 0x6C 'l'
+ { 789, 9, 8, 9, 0, -7 }, // 0x6D 'm'
+ { 798, 7, 8, 9, 1, -7 }, // 0x6E 'n'
+ { 805, 8, 8, 9, 1, -7 }, // 0x6F 'o'
+ { 813, 8, 11, 9, 1, -7 }, // 0x70 'p'
+ { 824, 7, 11, 9, 1, -7 }, // 0x71 'q'
+ { 834, 8, 8, 9, 1, -7 }, // 0x72 'r'
+ { 842, 7, 8, 9, 1, -7 }, // 0x73 's'
+ { 849, 9, 10, 9, 0, -9 }, // 0x74 't'
+ { 861, 7, 8, 9, 1, -7 }, // 0x75 'u'
+ { 868, 9, 8, 9, 0, -7 }, // 0x76 'v'
+ { 877, 9, 8, 9, 0, -7 }, // 0x77 'w'
+ { 886, 9, 8, 9, 0, -7 }, // 0x78 'x'
+ { 895, 9, 11, 9, 0, -7 }, // 0x79 'y'
+ { 908, 7, 8, 9, 1, -7 }, // 0x7A 'z'
+ { 915, 8, 17, 9, 1, -13 }, // 0x7B '{'
+ { 932, 2, 17, 9, 4, -13 }, // 0x7C '|'
+ { 937, 8, 17, 9, 0, -13 }, // 0x7D '}'
+ { 954, 9, 3, 9, 0, -6 } }; // 0x7E '~'
+
+const GFXfont nk57_monospace_no_bd7pt7b PROGMEM = {
+ (uint8_t *)nk57_monospace_no_bd7pt7bBitmaps,
+ (GFXglyph *)nk57_monospace_no_bd7pt7bGlyphs,
+ 0x20, 0x7E, 16 };
+
+// Approx. 1630 bytes
+const uint8_t EuphemiaCAS7pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0x40, 0xB4, 0x11, 0x84, 0x41, 0x13, 0xFF, 0x11, 0x08, 0x42,
+ 0x10, 0x88, 0xFF, 0xC8, 0x82, 0x21, 0x88, 0x10, 0x79, 0x52, 0x85, 0x06,
+ 0x07, 0x0B, 0x12, 0x27, 0x5B, 0xE1, 0x00, 0x70, 0x51, 0x12, 0x24, 0x44,
+ 0x88, 0xA0, 0xEB, 0x82, 0x88, 0x51, 0x12, 0x24, 0x45, 0x87, 0x20, 0x00,
+ 0x30, 0x48, 0x48, 0x50, 0x20, 0xD0, 0x89, 0x8A, 0xC6, 0x7B, 0xC0, 0x29,
+ 0x49, 0x24, 0x89, 0x22, 0x91, 0x12, 0x49, 0x29, 0x48, 0xAB, 0x88, 0xEA,
+ 0x80, 0x10, 0x20, 0x47, 0xF1, 0x02, 0x04, 0x00, 0x58, 0xE0, 0x80, 0x01,
+ 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40,
+ 0x80, 0x79, 0x28, 0x61, 0x86, 0x18, 0x61, 0x49, 0xE0, 0x65, 0x08, 0x42,
+ 0x10, 0x84, 0x27, 0xC0, 0x7A, 0x10, 0x41, 0x08, 0x42, 0x10, 0x83, 0xF0,
+ 0x7A, 0x20, 0x42, 0x30, 0x30, 0x41, 0x8F, 0xE0, 0x04, 0x18, 0x51, 0x22,
+ 0x48, 0xBF, 0x82, 0x04, 0x08, 0xFA, 0x08, 0x3E, 0x8C, 0x10, 0x41, 0x8B,
+ 0xE0, 0x3D, 0x08, 0x3E, 0x8E, 0x18, 0x61, 0xCD, 0xE0, 0xFC, 0x10, 0x82,
+ 0x08, 0x41, 0x08, 0x21, 0x00, 0x7A, 0x18, 0x73, 0x31, 0x28, 0x61, 0xCD,
+ 0xE0, 0x7B, 0x38, 0x61, 0xC5, 0xF0, 0x43, 0x0B, 0xC0, 0x82, 0x40, 0x05,
+ 0x80, 0x08, 0x88, 0x88, 0x41, 0x04, 0x10, 0x40, 0xFE, 0x03, 0xF8, 0x86,
+ 0x18, 0x61, 0x8C, 0xCC, 0xC4, 0x00, 0xF4, 0xC2, 0x11, 0x91, 0x08, 0x02,
+ 0x00, 0x0F, 0x83, 0x04, 0x40, 0x24, 0x01, 0x8F, 0x99, 0x09, 0x90, 0x99,
+ 0x09, 0x99, 0xA4, 0xFE, 0x60, 0x03, 0x00, 0x0F, 0x00, 0x08, 0x18, 0x14,
+ 0x14, 0x24, 0x22, 0x7E, 0x43, 0x41, 0xC1, 0xFA, 0x18, 0x63, 0xF2, 0x38,
+ 0x61, 0x8F, 0xE0, 0x3C, 0x42, 0xC0, 0x80, 0x80, 0x80, 0x80, 0xC0, 0x63,
+ 0x3C, 0xF9, 0x1A, 0x1C, 0x18, 0x30, 0x60, 0xC2, 0x8D, 0xF0, 0xFA, 0x08,
+ 0x20, 0xFA, 0x08, 0x20, 0x83, 0xF0, 0xFC, 0x21, 0x0F, 0xC2, 0x10, 0x84,
+ 0x00, 0x3C, 0x8F, 0x04, 0x08, 0x10, 0x60, 0xE1, 0x42, 0x7C, 0x83, 0x06,
+ 0x0C, 0x1F, 0xF0, 0x60, 0xC1, 0x83, 0x04, 0xFF, 0xC0, 0x04, 0x10, 0x41,
+ 0x04, 0x10, 0x61, 0x45, 0xE0, 0x87, 0x12, 0x45, 0x0C, 0x18, 0x28, 0x48,
+ 0x89, 0x0C, 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0x83, 0xF0, 0x80, 0xE0,
+ 0xF0, 0x78, 0x3A, 0x2D, 0x16, 0x53, 0x29, 0x94, 0xC4, 0x40, 0x81, 0xC1,
+ 0xA1, 0xB1, 0x91, 0x89, 0x8D, 0x85, 0x83, 0x83, 0x3E, 0x31, 0x90, 0x70,
+ 0x18, 0x0C, 0x06, 0x03, 0x82, 0x63, 0x1F, 0x00, 0xFA, 0x38, 0x61, 0x8F,
+ 0xC8, 0x20, 0x82, 0x00, 0x3E, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06, 0x03,
+ 0x83, 0x63, 0x1F, 0x01, 0x00, 0x40, 0x10, 0xF9, 0x1A, 0x14, 0x28, 0xDE,
+ 0x24, 0x44, 0x8D, 0x0C, 0x3C, 0x8D, 0x02, 0x03, 0x01, 0x80, 0x81, 0xC6,
+ 0xF8, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xC3, 0x7C, 0xC1, 0x43, 0x42, 0x62,
+ 0x26, 0x24, 0x34, 0x18, 0x18, 0x18, 0xC6, 0x34, 0x62, 0x46, 0x24, 0x62,
+ 0x69, 0x62, 0x94, 0x29, 0x42, 0x94, 0x30, 0xC1, 0x08, 0x43, 0x22, 0x24,
+ 0x1C, 0x08, 0x18, 0x34, 0x26, 0x42, 0xC1, 0x82, 0x89, 0x11, 0x43, 0x02,
+ 0x04, 0x08, 0x10, 0x20, 0x7E, 0x08, 0x10, 0x41, 0x02, 0x08, 0x30, 0x41,
+ 0xFC, 0xEA, 0xAA, 0xAA, 0xC0, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10,
+ 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0xD5, 0x55, 0x55, 0xC0, 0x08,
+ 0x18, 0x14, 0x22, 0x62, 0xC1, 0xFE, 0x5C, 0x80, 0x72, 0x20, 0x9E, 0x8A,
+ 0x2F, 0xC0, 0x82, 0x08, 0x3E, 0x8E, 0x18, 0x61, 0x8F, 0xE0, 0x39, 0x18,
+ 0x20, 0x81, 0x17, 0x80, 0x04, 0x10, 0x5F, 0x46, 0x18, 0x61, 0xC5, 0xF0,
+ 0x7A, 0x1F, 0xE0, 0x83, 0x17, 0x80, 0x3A, 0x11, 0xE4, 0x21, 0x08, 0x42,
+ 0x00, 0x7E, 0x28, 0xA2, 0x72, 0x07, 0xA2, 0x8B, 0xC0, 0x82, 0x08, 0x2E,
+ 0xC6, 0x18, 0x61, 0x86, 0x10, 0x9F, 0xC0, 0x20, 0x12, 0x49, 0x24, 0x9C,
+ 0x84, 0x21, 0x3B, 0x72, 0x94, 0x94, 0x40, 0xAA, 0xAA, 0xB0, 0xF7, 0x44,
+ 0x62, 0x31, 0x18, 0x8C, 0x46, 0x22, 0xBB, 0x18, 0x61, 0x86, 0x18, 0x40,
+ 0x7B, 0x38, 0x61, 0x87, 0x37, 0x80, 0xFA, 0x38, 0x61, 0x86, 0x3F, 0xA0,
+ 0x82, 0x00, 0x7F, 0x18, 0x61, 0x87, 0x17, 0xC1, 0x04, 0x10, 0xBC, 0x88,
+ 0x88, 0x80, 0x74, 0x60, 0xE0, 0xC5, 0xC0, 0x44, 0xF4, 0x44, 0x44, 0x70,
+ 0x86, 0x18, 0x61, 0x86, 0x17, 0xC0, 0x82, 0x89, 0x12, 0x22, 0x85, 0x04,
+ 0x00, 0x88, 0xA4, 0xD5, 0x4A, 0xA3, 0x51, 0x90, 0x88, 0xC5, 0x23, 0x04,
+ 0x31, 0x2C, 0x40, 0xC6, 0x89, 0x11, 0x42, 0x83, 0x04, 0x08, 0x21, 0xC0,
+ 0x7C, 0x31, 0x84, 0x21, 0x0F, 0xC0, 0x19, 0x08, 0x42, 0x33, 0x0C, 0x21,
+ 0x08, 0x41, 0x80, 0xFF, 0xF8, 0xC2, 0x22, 0x22, 0x12, 0x22, 0x22, 0xC0,
+ 0x71, 0xCE };
+
+const GFXglyph EuphemiaCAS7pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 7, 0, 0 }, // 0x20 ' '
+ { 1, 1, 10, 3, 1, -9 }, // 0x21 '!'
+ { 3, 3, 2, 5, 1, -9 }, // 0x22 '"'
+ { 4, 10, 12, 12, 1, -10 }, // 0x23 '#'
+ { 19, 7, 13, 8, 0, -11 }, // 0x24 '$'
+ { 31, 11, 12, 13, 1, -10 }, // 0x25 '%'
+ { 48, 8, 10, 10, 1, -9 }, // 0x26 '&'
+ { 58, 1, 2, 3, 1, -9 }, // 0x27 '''
+ { 59, 3, 13, 4, 1, -11 }, // 0x28 '('
+ { 64, 3, 13, 4, 1, -11 }, // 0x29 ')'
+ { 69, 5, 5, 7, 1, -10 }, // 0x2A '*'
+ { 73, 7, 7, 8, 1, -7 }, // 0x2B '+'
+ { 80, 2, 3, 3, 0, 0 }, // 0x2C ','
+ { 81, 3, 1, 5, 1, -4 }, // 0x2D '-'
+ { 82, 1, 1, 3, 1, 0 }, // 0x2E '.'
+ { 83, 8, 14, 8, 0, -11 }, // 0x2F '/'
+ { 97, 6, 10, 8, 1, -9 }, // 0x30 '0'
+ { 105, 5, 10, 8, 2, -9 }, // 0x31 '1'
+ { 112, 6, 10, 8, 1, -9 }, // 0x32 '2'
+ { 120, 6, 10, 8, 1, -9 }, // 0x33 '3'
+ { 128, 7, 10, 8, 0, -9 }, // 0x34 '4'
+ { 137, 6, 10, 8, 1, -9 }, // 0x35 '5'
+ { 145, 6, 10, 8, 1, -9 }, // 0x36 '6'
+ { 153, 6, 10, 8, 1, -9 }, // 0x37 '7'
+ { 161, 6, 10, 8, 1, -9 }, // 0x38 '8'
+ { 169, 6, 10, 8, 1, -9 }, // 0x39 '9'
+ { 177, 1, 7, 3, 1, -6 }, // 0x3A ':'
+ { 178, 2, 9, 3, 0, -6 }, // 0x3B ';'
+ { 181, 5, 10, 7, 1, -9 }, // 0x3C '<'
+ { 188, 7, 3, 9, 1, -6 }, // 0x3D '='
+ { 191, 5, 10, 7, 1, -9 }, // 0x3E '>'
+ { 198, 5, 10, 7, 1, -9 }, // 0x3F '?'
+ { 205, 12, 13, 15, 1, -9 }, // 0x40 '@'
+ { 225, 8, 10, 9, 0, -9 }, // 0x41 'A'
+ { 235, 6, 10, 9, 1, -9 }, // 0x42 'B'
+ { 243, 8, 10, 9, 1, -9 }, // 0x43 'C'
+ { 253, 7, 10, 9, 1, -9 }, // 0x44 'D'
+ { 262, 6, 10, 8, 1, -9 }, // 0x45 'E'
+ { 270, 5, 10, 7, 1, -9 }, // 0x46 'F'
+ { 277, 7, 10, 9, 1, -9 }, // 0x47 'G'
+ { 286, 7, 10, 10, 1, -9 }, // 0x48 'H'
+ { 295, 1, 10, 3, 1, -9 }, // 0x49 'I'
+ { 297, 6, 10, 7, 0, -9 }, // 0x4A 'J'
+ { 305, 7, 10, 9, 1, -9 }, // 0x4B 'K'
+ { 314, 6, 10, 7, 1, -9 }, // 0x4C 'L'
+ { 322, 9, 10, 11, 1, -9 }, // 0x4D 'M'
+ { 334, 8, 10, 10, 1, -9 }, // 0x4E 'N'
+ { 344, 9, 10, 11, 1, -9 }, // 0x4F 'O'
+ { 356, 6, 10, 8, 1, -9 }, // 0x50 'P'
+ { 364, 9, 13, 11, 1, -9 }, // 0x51 'Q'
+ { 379, 7, 10, 8, 1, -9 }, // 0x52 'R'
+ { 388, 7, 10, 8, 0, -9 }, // 0x53 'S'
+ { 397, 7, 10, 8, 1, -9 }, // 0x54 'T'
+ { 406, 8, 10, 10, 1, -9 }, // 0x55 'U'
+ { 416, 8, 10, 8, 0, -9 }, // 0x56 'V'
+ { 426, 12, 10, 12, 0, -9 }, // 0x57 'W'
+ { 441, 8, 10, 9, 0, -9 }, // 0x58 'X'
+ { 451, 7, 10, 8, 0, -9 }, // 0x59 'Y'
+ { 460, 7, 10, 8, 0, -9 }, // 0x5A 'Z'
+ { 469, 2, 13, 4, 1, -11 }, // 0x5B '['
+ { 473, 8, 14, 9, 0, -11 }, // 0x5C '\'
+ { 487, 2, 13, 4, 1, -11 }, // 0x5D ']'
+ { 491, 8, 6, 9, 0, -10 }, // 0x5E '^'
+ { 497, 7, 1, 7, 0, 3 }, // 0x5F '_'
+ { 498, 3, 3, 0, -2, -10 }, // 0x60 '`'
+ { 500, 6, 7, 8, 1, -6 }, // 0x61 'a'
+ { 506, 6, 10, 8, 1, -9 }, // 0x62 'b'
+ { 514, 6, 7, 7, 1, -6 }, // 0x63 'c'
+ { 520, 6, 10, 8, 1, -9 }, // 0x64 'd'
+ { 528, 6, 7, 8, 1, -6 }, // 0x65 'e'
+ { 534, 5, 10, 4, 0, -9 }, // 0x66 'f'
+ { 541, 6, 10, 8, 1, -6 }, // 0x67 'g'
+ { 549, 6, 10, 8, 1, -9 }, // 0x68 'h'
+ { 557, 1, 10, 3, 1, -9 }, // 0x69 'i'
+ { 559, 3, 13, 3, -1, -9 }, // 0x6A 'j'
+ { 564, 5, 10, 7, 1, -9 }, // 0x6B 'k'
+ { 571, 2, 10, 3, 1, -9 }, // 0x6C 'l'
+ { 574, 9, 7, 11, 1, -6 }, // 0x6D 'm'
+ { 582, 6, 7, 8, 1, -6 }, // 0x6E 'n'
+ { 588, 6, 7, 8, 1, -6 }, // 0x6F 'o'
+ { 594, 6, 10, 8, 1, -6 }, // 0x70 'p'
+ { 602, 6, 10, 8, 1, -6 }, // 0x71 'q'
+ { 610, 4, 7, 5, 1, -6 }, // 0x72 'r'
+ { 614, 5, 7, 7, 1, -6 }, // 0x73 's'
+ { 619, 4, 9, 5, 0, -8 }, // 0x74 't'
+ { 624, 6, 7, 8, 1, -6 }, // 0x75 'u'
+ { 630, 7, 7, 7, 0, -6 }, // 0x76 'v'
+ { 637, 9, 7, 9, 0, -6 }, // 0x77 'w'
+ { 645, 6, 7, 6, 0, -6 }, // 0x78 'x'
+ { 651, 7, 10, 7, 0, -6 }, // 0x79 'y'
+ { 660, 6, 7, 7, 0, -6 }, // 0x7A 'z'
+ { 666, 5, 13, 5, 0, -10 }, // 0x7B '{'
+ { 675, 1, 13, 7, 3, -9 }, // 0x7C '|'
+ { 677, 4, 13, 5, 0, -10 }, // 0x7D '}'
+ { 684, 8, 2, 9, 0, -4 } }; // 0x7E '~'
+
+const GFXfont EuphemiaCAS7pt7b PROGMEM = {
+ (uint8_t *)EuphemiaCAS7pt7bBitmaps,
+ (GFXglyph *)EuphemiaCAS7pt7bGlyphs,
+ 0x20, 0x7E, 19 };
+
+// Approx. 1358 bytes
+
+
+// Approx. 1522 bytes
+
+#endif /* CUSTOM_FONTS_H_ */
--- /dev/null
+++ b/LEAF/Inc/debug.h
@@ -1,0 +1,56 @@
+/**
+ ******************************************************************************
+ * File Name : DEBUG.h
+ * Description : This file provides code for the configuration
+ * of the DEBUG instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __debug_H
+#define __debug_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_DEBUG_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ debug_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/dma.h
@@ -1,0 +1,56 @@
+/**
+ ******************************************************************************
+ * File Name : dma.h
+ * Description : This file contains all the function prototypes for
+ * the dma.c file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __dma_H
+#define __dma_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* DMA memory to memory transfer handles -------------------------------------*/
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_DMA_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __dma_H */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/eeprom.h
@@ -1,0 +1,125 @@
+
+
+/**
+ ******************************************************************************
+ * @file EEPROM_Emulation/inc/eeprom.h
+ * @author MCD Application Team
+ * @brief This file contains all the functions prototypes for the EEPROM
+ * emulation firmware library.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2017 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __EEPROM_H
+#define __EEPROM_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_hal.h"
+#include "main.h"
+
+/* Exported constants --------------------------------------------------------*/
+/* EEPROM emulation firmware error codes */
+#define EE_OK (uint32_t)HAL_OK
+#define EE_ERROR (uint32_t)HAL_ERROR
+#define EE_BUSY (uint32_t)HAL_BUSY
+#define EE_TIMEOUT (uint32_t)HAL_TIMEOUT
+
+
+#define FLASH_BASE_ADDR (uint32_t)(FLASH_BASE)
+#define FLASH_END_ADDR (uint32_t)(0x081FFFFF)
+
+/* Base address of the Flash sectors Bank 1 */
+#define ADDR_FLASH_SECTOR_0_BANK1 ((uint32_t)0x08000000) /* Base @ of Sector 0, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_1_BANK1 ((uint32_t)0x08020000) /* Base @ of Sector 1, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_2_BANK1 ((uint32_t)0x08040000) /* Base @ of Sector 2, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_3_BANK1 ((uint32_t)0x08060000) /* Base @ of Sector 3, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_4_BANK1 ((uint32_t)0x08080000) /* Base @ of Sector 4, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_5_BANK1 ((uint32_t)0x080A0000) /* Base @ of Sector 5, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_6_BANK1 ((uint32_t)0x080C0000) /* Base @ of Sector 6, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_7_BANK1 ((uint32_t)0x080E0000) /* Base @ of Sector 7, 128 Kbytes */
+
+/* Base address of the Flash sectors Bank 2 */
+#define ADDR_FLASH_SECTOR_0_BANK2 ((uint32_t)0x08100000) /* Base @ of Sector 0, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_1_BANK2 ((uint32_t)0x08120000) /* Base @ of Sector 1, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_2_BANK2 ((uint32_t)0x08140000) /* Base @ of Sector 2, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_3_BANK2 ((uint32_t)0x08160000) /* Base @ of Sector 3, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_4_BANK2 ((uint32_t)0x08180000) /* Base @ of Sector 4, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_5_BANK2 ((uint32_t)0x081A0000) /* Base @ of Sector 5, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_6_BANK2 ((uint32_t)0x081C0000) /* Base @ of Sector 6, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_7_BANK2 ((uint32_t)0x081E0000) /* Base @ of Sector 7, 128 Kbytes */
+
+
+/* Define the size of the sectors to be used */
+
+ #define PAGE_SIZE (uint32_t)0x20000 /* Page size = 128KByte */
+
+
+/* Device voltage range supposed to be [2.7V to 3.6V], the operation will
+ be done by word */
+#define VOLTAGE_RANGE (uint8_t)VOLTAGE_RANGE_3
+
+/* EEPROM emulation start address in Flash */
+
+ #define EEPROM_START_ADDRESS ADDR_FLASH_SECTOR_6_BANK2 /* sector6 of bank 2 */
+
+
+/* Pages 0 and 1 base and end addresses */
+#define PAGE0_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x0000))
+#define PAGE0_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (PAGE_SIZE - 1)))
+
+ #define PAGE0_ID FLASH_SECTOR_6
+
+
+#define PAGE1_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + PAGE_SIZE))
+#define PAGE1_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (2 * PAGE_SIZE - 1)))
+
+ #define PAGE1_ID FLASH_SECTOR_7
+
+
+/* Used Flash pages for EEPROM emulation */
+#define PAGE0 ((uint16_t)0x0000)
+#define PAGE1 ((uint16_t)0x0001) /* Page nb between PAGE0_BASE_ADDRESS & PAGE1_BASE_ADDRESS*/
+
+/* No valid page define */
+#define NO_VALID_PAGE ((uint16_t)0x00AB)
+
+/* Page status definitions */
+#define ERASED ((uint16_t)0xFFFF) /* Page is empty */
+#define RECEIVE_DATA ((uint16_t)0xEEEE) /* Page is marked to receive data */
+#define VALID_PAGE ((uint16_t)0x0000) /* Page containing valid data */
+
+/* Valid pages in read and write defines */
+#define READ_FROM_VALID_PAGE ((uint8_t)0x00)
+#define WRITE_IN_VALID_PAGE ((uint8_t)0x01)
+
+/* Page full define */
+#define PAGE_FULL ((uint8_t)0x80)
+
+/* Variables' number */
+#define NB_OF_VAR ((uint8_t)0x03)
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+/* Virtual address defined by the user: 0xFFFF value is prohibited */
+extern uint16_t VirtAddVarTab[NB_OF_VAR];
+uint16_t EE_Init(void);
+uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data);
+uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data);
+
+#endif /* __EEPROM_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
--- /dev/null
+++ b/LEAF/Inc/fatfs.h
@@ -1,0 +1,49 @@
+/**
+ ******************************************************************************
+ * @file fatfs.h
+ * @brief Header for fatfs applications
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __fatfs_H
+#define __fatfs_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ff.h"
+#include "ff_gen_drv.h"
+#include "sd_diskio.h" /* defines SD_Driver as external */
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern uint8_t retSD; /* Return value for SD */
+extern char SDPath[4]; /* SD logical drive path */
+extern FATFS SDFatFS; /* File system object for SD logical drive */
+extern FIL SDFile; /* File object for SD */
+
+void MX_FATFS_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+#ifdef __cplusplus
+}
+#endif
+#endif /*__fatfs_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/fatfs_platform.h
@@ -1,0 +1,26 @@
+/**
+ ******************************************************************************
+ * @file : fatfs_platform.h
+ * @brief : fatfs_platform header file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+*/
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_hal.h"
+/* Defines ------------------------------------------------------------------*/
+#define SD_PRESENT ((uint8_t)0x01) /* also in bsp_driver_sd.h */
+#define SD_NOT_PRESENT ((uint8_t)0x00) /* also in bsp_driver_sd.h */
+#define SD_DETECT_PIN GPIO_PIN_13
+#define SD_DETECT_GPIO_PORT GPIOC
+/* Prototypes ---------------------------------------------------------------*/
+uint8_t BSP_PlatformIsDetected(void);
--- /dev/null
+++ b/LEAF/Inc/ffconf.h
@@ -1,0 +1,269 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * FatFs - Generic FAT file system module R0.12c (C)ChaN, 2017
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+#ifndef _FFCONF
+#define _FFCONF 68300 /* Revision ID */
+
+/*-----------------------------------------------------------------------------/
+/ Additional user header to be used
+/-----------------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32h7xx_hal.h"
+#include "bsp_driver_sd.h"
+
+/*-----------------------------------------------------------------------------/
+/ Function Configurations
+/-----------------------------------------------------------------------------*/
+
+#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */
+/* This option switches read-only configuration. (0:Read/Write or 1:Read-only)
+/ Read-only configuration removes writing API functions, f_write(), f_sync(),
+/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree()
+/ and optional writing functions as well. */
+
+#define _FS_MINIMIZE 0 /* 0 to 3 */
+/* This option defines minimization level to remove some basic API functions.
+/
+/ 0: All basic functions are enabled.
+/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename()
+/ are removed.
+/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1.
+/ 3: f_lseek() function is removed in addition to 2. */
+
+#define _USE_STRFUNC 2 /* 0:Disable or 1-2:Enable */
+/* This option switches string functions, f_gets(), f_putc(), f_puts() and
+/ f_printf().
+/
+/ 0: Disable string functions.
+/ 1: Enable without LF-CRLF conversion.
+/ 2: Enable with LF-CRLF conversion. */
+
+#define _USE_FIND 0
+/* This option switches filtered directory read functions, f_findfirst() and
+/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */
+
+#define _USE_MKFS 1
+/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */
+
+#define _USE_FASTSEEK 1
+/* This option switches fast seek feature. (0:Disable or 1:Enable) */
+
+#define _USE_EXPAND 0
+/* This option switches f_expand function. (0:Disable or 1:Enable) */
+
+#define _USE_CHMOD 0
+/* This option switches attribute manipulation functions, f_chmod() and f_utime().
+/ (0:Disable or 1:Enable) Also _FS_READONLY needs to be 0 to enable this option. */
+
+#define _USE_LABEL 0
+/* This option switches volume label functions, f_getlabel() and f_setlabel().
+/ (0:Disable or 1:Enable) */
+
+#define _USE_FORWARD 0
+/* This option switches f_forward() function. (0:Disable or 1:Enable) */
+
+/*-----------------------------------------------------------------------------/
+/ Locale and Namespace Configurations
+/-----------------------------------------------------------------------------*/
+
+#define _CODE_PAGE 850
+/* This option specifies the OEM code page to be used on the target system.
+/ Incorrect setting of the code page can cause a file open failure.
+/
+/ 1 - ASCII (No extended character. Non-LFN cfg. only)
+/ 437 - U.S.
+/ 720 - Arabic
+/ 737 - Greek
+/ 771 - KBL
+/ 775 - Baltic
+/ 850 - Latin 1
+/ 852 - Latin 2
+/ 855 - Cyrillic
+/ 857 - Turkish
+/ 860 - Portuguese
+/ 861 - Icelandic
+/ 862 - Hebrew
+/ 863 - Canadian French
+/ 864 - Arabic
+/ 865 - Nordic
+/ 866 - Russian
+/ 869 - Greek 2
+/ 932 - Japanese (DBCS)
+/ 936 - Simplified Chinese (DBCS)
+/ 949 - Korean (DBCS)
+/ 950 - Traditional Chinese (DBCS)
+*/
+
+#define _USE_LFN 0 /* 0 to 3 */
+#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */
+/* The _USE_LFN switches the support of long file name (LFN).
+/
+/ 0: Disable support of LFN. _MAX_LFN has no effect.
+/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe.
+/ 2: Enable LFN with dynamic working buffer on the STACK.
+/ 3: Enable LFN with dynamic working buffer on the HEAP.
+/
+/ To enable the LFN, Unicode handling functions (option/unicode.c) must be added
+/ to the project. The working buffer occupies (_MAX_LFN + 1) * 2 bytes and
+/ additional 608 bytes at exFAT enabled. _MAX_LFN can be in range from 12 to 255.
+/ It should be set 255 to support full featured LFN operations.
+/ When use stack for the working buffer, take care on stack overflow. When use heap
+/ memory for the working buffer, memory management functions, ff_memalloc() and
+/ ff_memfree(), must be added to the project. */
+
+#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */
+/* This option switches character encoding on the API. (0:ANSI/OEM or 1:UTF-16)
+/ To use Unicode string for the path name, enable LFN and set _LFN_UNICODE = 1.
+/ This option also affects behavior of string I/O functions. */
+
+#define _STRF_ENCODE 3
+/* When _LFN_UNICODE == 1, this option selects the character encoding ON THE FILE to
+/ be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf().
+/
+/ 0: ANSI/OEM
+/ 1: UTF-16LE
+/ 2: UTF-16BE
+/ 3: UTF-8
+/
+/ This option has no effect when _LFN_UNICODE == 0. */
+
+#define _FS_RPATH 0 /* 0 to 2 */
+/* This option configures support of relative path.
+/
+/ 0: Disable relative path and remove related functions.
+/ 1: Enable relative path. f_chdir() and f_chdrive() are available.
+/ 2: f_getcwd() function is available in addition to 1.
+*/
+
+/*---------------------------------------------------------------------------/
+/ Drive/Volume Configurations
+/----------------------------------------------------------------------------*/
+
+#define _VOLUMES 1
+/* Number of volumes (logical drives) to be used. */
+
+/* USER CODE BEGIN Volumes */
+#define _STR_VOLUME_ID 0 /* 0:Use only 0-9 for drive ID, 1:Use strings for drive ID */
+#define _VOLUME_STRS "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3"
+/* _STR_VOLUME_ID switches string support of volume ID.
+/ When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive
+/ number in the path name. _VOLUME_STRS defines the drive ID strings for each
+/ logical drives. Number of items must be equal to _VOLUMES. Valid characters for
+/ the drive ID strings are: A-Z and 0-9. */
+/* USER CODE END Volumes */
+
+#define _MULTI_PARTITION 0 /* 0:Single partition, 1:Multiple partition */
+/* This option switches support of multi-partition on a physical drive.
+/ By default (0), each logical drive number is bound to the same physical drive
+/ number and only an FAT volume found on the physical drive will be mounted.
+/ When multi-partition is enabled (1), each logical drive number can be bound to
+/ arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk()
+/ funciton will be available. */
+#define _MIN_SS 512 /* 512, 1024, 2048 or 4096 */
+#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */
+/* These options configure the range of sector size to be supported. (512, 1024,
+/ 2048 or 4096) Always set both 512 for most systems, all type of memory cards and
+/ harddisk. But a larger value may be required for on-board flash memory and some
+/ type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured
+/ to variable sector size and GET_SECTOR_SIZE command must be implemented to the
+/ disk_ioctl() function. */
+
+#define _USE_TRIM 0
+/* This option switches support of ATA-TRIM. (0:Disable or 1:Enable)
+/ To enable Trim function, also CTRL_TRIM command should be implemented to the
+/ disk_ioctl() function. */
+
+#define _FS_NOFSINFO 0 /* 0,1,2 or 3 */
+/* If you need to know correct free space on the FAT32 volume, set bit 0 of this
+/ option, and f_getfree() function at first time after volume mount will force
+/ a full FAT scan. Bit 1 controls the use of last allocated cluster number.
+/
+/ bit0=0: Use free cluster count in the FSINFO if available.
+/ bit0=1: Do not trust free cluster count in the FSINFO.
+/ bit1=0: Use last allocated cluster number in the FSINFO if available.
+/ bit1=1: Do not trust last allocated cluster number in the FSINFO.
+*/
+
+/*---------------------------------------------------------------------------/
+/ System Configurations
+/----------------------------------------------------------------------------*/
+
+#define _FS_TINY 0 /* 0:Normal or 1:Tiny */
+/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
+/ At the tiny configuration, size of file object (FIL) is reduced _MAX_SS bytes.
+/ Instead of private sector buffer eliminated from the file object, common sector
+/ buffer in the file system object (FATFS) is used for the file data transfer. */
+
+#define _FS_EXFAT 0
+/* This option switches support of exFAT file system. (0:Disable or 1:Enable)
+/ When enable exFAT, also LFN needs to be enabled. (_USE_LFN >= 1)
+/ Note that enabling exFAT discards C89 compatibility. */
+
+#define _FS_NORTC 0
+#define _NORTC_MON 6
+#define _NORTC_MDAY 4
+#define _NORTC_YEAR 2015
+/* The option _FS_NORTC switches timestamp functiton. If the system does not have
+/ any RTC function or valid timestamp is not needed, set _FS_NORTC = 1 to disable
+/ the timestamp function. All objects modified by FatFs will have a fixed timestamp
+/ defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR in local time.
+/ To enable timestamp function (_FS_NORTC = 0), get_fattime() function need to be
+/ added to the project to get current time form real-time clock. _NORTC_MON,
+/ _NORTC_MDAY and _NORTC_YEAR have no effect.
+/ These options have no effect at read-only configuration (_FS_READONLY = 1). */
+
+#define _FS_LOCK 2 /* 0:Disable or >=1:Enable */
+/* The option _FS_LOCK switches file lock function to control duplicated file open
+/ and illegal operation to open objects. This option must be 0 when _FS_READONLY
+/ is 1.
+/
+/ 0: Disable file lock function. To avoid volume corruption, application program
+/ should avoid illegal open, remove and rename to the open objects.
+/ >0: Enable file lock function. The value defines how many files/sub-directories
+/ can be opened simultaneously under file lock control. Note that the file
+/ lock control is independent of re-entrancy. */
+
+#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */
+#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */
+#define _SYNC_t NULL
+/* The option _FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs
+/ module itself. Note that regardless of this option, file access to different
+/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs()
+/ and f_fdisk() function, are always not re-entrant. Only file/directory access
+/ to the same volume is under control of this function.
+/
+/ 0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect.
+/ 1: Enable re-entrancy. Also user provided synchronization handlers,
+/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj()
+/ function, must be added to the project. Samples are available in
+/ option/syscall.c.
+/
+/ The _FS_TIMEOUT defines timeout period in unit of time tick.
+/ The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*,
+/ SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be
+/ included somewhere in the scope of ff.h. */
+
+/* define the ff_malloc ff_free macros as standard malloc free */
+#if !defined(ff_malloc) && !defined(ff_free)
+#include <stdlib.h>
+#define ff_malloc malloc
+#define ff_free free
+#endif
+
+#endif /* _FFCONF */
--- /dev/null
+++ b/LEAF/Inc/fmc.h
@@ -1,0 +1,60 @@
+/**
+ ******************************************************************************
+ * File Name : FMC.h
+ * Description : This file provides code for the configuration
+ * of the FMC peripheral.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __FMC_H
+#define __FMC_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern SDRAM_HandleTypeDef hsdram1;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_FMC_Init(void);
+void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef* hsdram);
+void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef* hsdram);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__FMC_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/gfx.h
@@ -1,0 +1,120 @@
+/*
+ * gfx.h
+ *
+ * Created on: Jul 8, 2018
+ * Author: jeffsnyder
+ */
+
+#ifndef GFX_H_
+#define GFX_H_
+
+
+#include "gfx_font.h"
+#include "ssd1306.h"
+
+typedef struct _GFX
+{
+ int16_t WIDTH;
+ int16_t HEIGHT;
+ uint16_t _width;
+ uint16_t _height;
+ uint16_t rotation;
+ uint16_t cursor_y;
+ uint16_t cursor_x;
+ uint16_t textsize;
+ uint16_t textcolor;
+ uint16_t textbgcolor;
+ uint16_t wrap;
+ uint16_t _cp437;
+ GFXfont *gfxFont;
+} GFX;
+
+void GFXinit(GFX* myGfx, int16_t w, int16_t h); // Constructor
+
+ // This MUST be defined by the subclass:
+void GFXdrawPixel(GFX* myGfx, int16_t x, int16_t y, uint16_t color);
+
+ // TRANSACTION API / CORE DRAW API
+ // These MAY be overridden by the subclass to provide device-specific
+ // optimized code. Otherwise 'generic' versions are used.
+void GFXstartWrite(GFX* myGfx);
+void GFXwritePixel(GFX* myGfx, int16_t x, int16_t y, uint16_t color);
+void GFXwriteFillRect(GFX* myGfx, int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
+void GFXwriteFastVLine(GFX* myGfx, int16_t x, int16_t y, int16_t h, uint16_t color);
+void GFXwriteFastHLine(GFX* myGfx, int16_t x, int16_t y, int16_t w, uint16_t color);
+void GFXwriteLine(GFX* myGfx, int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
+void GFXendWrite(GFX* myGfx);
+
+ // CONTROL API
+ // These MAY be overridden by the subclass to provide device-specific
+ // optimized code. Otherwise 'generic' versions are used.
+void GFXsetRotation(GFX* myGfx, uint8_t r);
+void GFXinvertDisplay(GFX* myGfx, uint8_t i);
+
+ // BASIC DRAW API
+ // These MAY be overridden by the subclass to provide device-specific
+ // optimized code. Otherwise 'generic' versions are used.
+
+ // It's good to implement those, even if using transaction API
+void GFXdrawFastVLine(GFX* myGfx, int16_t x, int16_t y, int16_t h, uint16_t color);
+void GFXdrawFastHLine(GFX* myGfx, int16_t x, int16_t y, int16_t w, uint16_t color);
+void GFXfillRect(GFX* myGfx, int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
+void GFXfillScreen(GFX* myGfx, uint16_t color);
+ // Optional and probably not necessary to change
+void GFXdrawLine(GFX* myGfx, int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
+void GFXdrawRect(GFX* myGfx, int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
+
+ // These exist only with Adafruit_GFX (no subclass overrides)
+
+void GFXdrawCircle(GFX* myGfx, int16_t x0, int16_t y0, int16_t r, uint16_t color);
+void GFXdrawCircleHelper(GFX* myGfx, int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
+ uint16_t color);
+void GFXfillCircle(GFX* myGfx, int16_t x0, int16_t y0, int16_t r, uint16_t color);
+void GFXfillCircleHelper(GFX* myGfx, int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
+ int16_t delta, uint16_t color);
+void GFXdrawTriangle(GFX* myGfx, int16_t x0, int16_t y0, int16_t x1, int16_t y1,
+ int16_t x2, int16_t y2, uint16_t color);
+void GFXfillTriangle(GFX* myGfx, int16_t x0, int16_t y0, int16_t x1, int16_t y1,
+ int16_t x2, int16_t y2, uint16_t color);
+void GFXdrawRoundRect(GFX* myGfx, int16_t x0, int16_t y0, int16_t w, int16_t h,
+ int16_t radius, uint16_t color);
+void GFXfillRoundRect(GFX* myGfx, int16_t x0, int16_t y0, int16_t w, int16_t h,
+ int16_t radius, uint16_t color);
+void GFXdrawBitmap(GFX* myGfx, int16_t x, int16_t y, uint8_t *bitmap,
+ int16_t w, int16_t h, uint16_t color, uint16_t bg);
+void GFXdrawChar(GFX* myGfx, int16_t x, int16_t y, unsigned char c, uint16_t color,
+ uint16_t bg, uint8_t size);
+void GFXsetCursor(GFX* myGfx, int16_t x, int16_t y);
+void GFXsetTextColor(GFX* myGfx, uint16_t c, uint16_t bg);
+void GFXsetTextSize(GFX* myGfx, uint8_t s);
+void GFXsetTextWrap(GFX* myGfx, uint8_t w);
+void GFXcp437(GFX* myGfx, uint8_t x);
+void GFXsetFont(GFX* myGfx, const GFXfont *f);
+void GFXgetTextBounds(GFX* myGfx, char *string, int16_t x, int16_t y,
+ int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h);
+
+
+void GFXwrite(GFX* myGfx, uint8_t);
+
+
+ int16_t GFXheight(GFX* myGfx );
+ int16_t GFXwidth(GFX* myGfx );
+
+ uint8_t GFXgetRotation(GFX* myGfx );
+
+ // get current cursor position (get rotation safe maximum values, using: width() for x, height() for y)
+ int16_t GFXgetCursorX(GFX* myGfx);
+ int16_t GFXgetCursorY(GFX* myGfx );
+
+ void GFXcharBounds(GFX* myGfx, char c, int16_t *x, int16_t *y,
+ int16_t *minx, int16_t *miny, int16_t *maxx, int16_t *maxy);
+
+int OLEDparseInt(char* buffer, uint32_t myNumber, uint8_t numDigits);
+
+int OLEDparsePitch(char* buffer, float midi);
+
+int OLEDparsePitchClass(char* buffer, float midi);
+
+int OLEDparseFixedFloat(char* buffer, float input, uint8_t numDigits, uint8_t numDecimal);
+
+#endif /* GFX_H_ */
--- /dev/null
+++ b/LEAF/Inc/gfx_font.h
@@ -1,0 +1,24 @@
+// Font structures for newer Adafruit_GFX (1.1 and later).
+// Example fonts are included in 'Fonts' directory.
+// To use a font in your Arduino sketch, #include the corresponding .h
+// file and pass address of GFXfont struct to setFont(). Pass NULL to
+// revert to 'classic' fixed-space bitmap font.
+
+#ifndef _GFXFONT_H_
+#define _GFXFONT_H_
+
+typedef struct { // Data stored PER GLYPH
+ uint16_t bitmapOffset; // Pointer into GFXfont->bitmap
+ uint8_t width, height; // Bitmap dimensions in pixels
+ uint8_t xAdvance; // Distance to advance cursor (x axis)
+ int8_t xOffset, yOffset; // Dist from cursor pos to UL corner
+} GFXglyph;
+
+typedef struct { // Data stored for FONT AS A WHOLE:
+ uint8_t *bitmap; // Glyph bitmaps, concatenated
+ GFXglyph *glyph; // Glyph array
+ uint8_t first, last; // ASCII extents
+ uint8_t yAdvance; // Newline distance (y axis)
+} GFXfont;
+
+#endif // _GFXFONT_H_
--- /dev/null
+++ b/LEAF/Inc/gpio.h
@@ -1,0 +1,57 @@
+/**
+ ******************************************************************************
+ * File Name : gpio.h
+ * Description : This file contains all the functions prototypes for
+ * the gpio
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __gpio_H
+#define __gpio_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_GPIO_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ pinoutConfig_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/i2c.h
@@ -1,0 +1,60 @@
+/**
+ ******************************************************************************
+ * File Name : I2C.h
+ * Description : This file provides code for the configuration
+ * of the I2C instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __i2c_H
+#define __i2c_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern I2C_HandleTypeDef hi2c2;
+extern I2C_HandleTypeDef hi2c4;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_I2C2_Init(void);
+void MX_I2C4_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ i2c_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- a/LEAF/Inc/leaf-analysis.h
+++ /dev/null
@@ -1,258 +1,0 @@
-/*==============================================================================
-
- leaf-analysis.h
- Created: 25 Oct 2019 10:30:52am
- Author: Matthew Wang
-
- ==============================================================================*/
-
-#ifndef LEAF_ANALYSIS_H_INCLUDED
-#define LEAF_ANALYSIS_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-mempool.h"
-#include "leaf-math.h"
-#include "leaf-filters.h"
-#include "leaf-envelopes.h"
-
- //==============================================================================
-
- /* Envelope Follower */
- typedef struct _tEnvelopeFollower
- {
- float y;
- float a_thresh;
- float d_coeff;
-
- } _tEnvelopeFollower;
-
- typedef _tEnvelopeFollower* tEnvelopeFollower;
-
- void tEnvelopeFollower_init (tEnvelopeFollower* const, float attackThreshold, float decayCoeff);
- void tEnvelopeFollower_free (tEnvelopeFollower* const);
- void tEnvelopeFollower_initToPool (tEnvelopeFollower* const, float attackThreshold, float decayCoeff, tMempool* const);
- void tEnvelopeFollower_freeFromPool (tEnvelopeFollower* const, tMempool* const);
-
- float tEnvelopeFollower_tick (tEnvelopeFollower* const, float x);
- int tEnvelopeFollower_decayCoeff (tEnvelopeFollower* const, float decayCoeff);
- int tEnvelopeFollower_attackThresh (tEnvelopeFollower* const, float attackThresh);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* PowerEnvelopeFollower */
- typedef struct _tPowerFollower {
- float factor, oneminusfactor;
- float curr;
-
- } _tPowerFollower;
-
- typedef _tPowerFollower* tPowerFollower;
-
- void tPowerFollower_init (tPowerFollower* const, float factor);
- void tPowerFollower_free (tPowerFollower* const);
- void tPowerFollower_initToPool (tPowerFollower* const, float factor, tMempool* const);
- void tPowerFollower_freeFromPool (tPowerFollower* const, tMempool* const);
-
- float tPowerFollower_tick (tPowerFollower* const, float input);
- float tPowerFollower_sample (tPowerFollower* const);
- int tPowerFollower_setFactor (tPowerFollower* const, float factor);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- // ENV~ from PD, modified for LEAF
-#define MAXOVERLAP 32
-#define INITVSTAKEN 64
-#define ENV_WINDOW_SIZE 1024
-#define ENV_HOP_SIZE 256
-
- typedef struct _tEnvPD
- {
- float buf[ENV_WINDOW_SIZE + INITVSTAKEN];
- uint16_t x_phase; /* number of points since last output */
- uint16_t x_period; /* requested period of output */
- uint16_t x_realperiod; /* period rounded up to vecsize multiple */
- uint16_t x_npoints; /* analysis window size in samples */
- float x_result; /* result to output */
- float x_sumbuf[MAXOVERLAP]; /* summing buffer */
- float x_f;
- uint16_t windowSize, hopSize, blockSize;
- uint16_t x_allocforvs; /* extra buffer for DSP vector size */
- } _tEnvPD;
-
- typedef _tEnvPD* tEnvPD;
-
- void tEnvPD_init (tEnvPD* const, int windowSize, int hopSize, int blockSize);
- void tEnvPD_free (tEnvPD* const);
- void tEnvPD_initToPool (tEnvPD* const, int windowSize, int hopSize, int blockSize, tMempool* const);
- void tEnvPD_freeFromPool (tEnvPD* const, tMempool* const);
-
- float tEnvPD_tick (tEnvPD* const);
- void tEnvPD_processBlock (tEnvPD* const, float* in);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* tAttackDetection */
-#define DEFBLOCKSIZE 1024
-#define DEFTHRESHOLD 6
-#define DEFATTACK 10
-#define DEFRELEASE 10
-
- typedef struct _tAttackDetection
- {
- float env;
-
- //Attack & Release times in msec
- int atk;
- int rel;
-
- //Attack & Release coefficients based on times
- float atk_coeff;
- float rel_coeff;
-
- int blocksize;
- int samplerate;
-
- //RMS amplitude of previous block - used to decide if attack is present
- float prevAmp;
-
- float threshold;
- } _tAttackDetection;
-
- typedef _tAttackDetection* tAttackDetection;
-
- void tAttackDetection_init (tAttackDetection* const, int blocksize, int atk, int rel);
- void tAttackDetection_free (tAttackDetection* const);
- void tAttackDetection_initToPool (tAttackDetection* const, int blocksize, int atk, int rel, tMempool* const);
- void tAttackDetection_freeFromPool (tAttackDetection* const, tMempool* const);
-
- // set expected input blocksize
- void tAttackDetection_setBlocksize (tAttackDetection* const, int size);
-
- // change atkDetector sample rate
- void tAttackDetection_setSamplerate (tAttackDetection* const, int inRate);
-
- // set attack time and coeff
- void tAttackDetection_setAttack (tAttackDetection* const, int inAtk);
-
- // set release time and coeff
- void tAttackDetection_setRelease (tAttackDetection* const, int inRel);
-
- // set level above which values are identified as attacks
- void tAttackDetection_setThreshold (tAttackDetection* const, float thres);
-
- // find largest transient in input block, return index of attack
- int tAttackDetection_detect (tAttackDetection* const, float *in);
-
- //==============================================================================
-
- // tSNAC: period detector
- // from Katja Vetters http://www.katjaas.nl/helmholtz/helmholtz.html
-#define SNAC_FRAME_SIZE 1024 // default analysis framesize // should be the same as (or smaller than?) PS_FRAME_SIZE
-#define DEFOVERLAP 1 // default overlap
-#define DEFBIAS 0.2f // default bias
-#define DEFMINRMS 0.003f // default minimum RMS
-#define SEEK 0.85f // seek-length as ratio of framesize
-
- typedef struct _tSNAC
- {
- float* inputbuf;
- float* processbuf;
- float* spectrumbuf;
- float* biasbuf;
- uint16_t timeindex;
- uint16_t framesize;
- uint16_t overlap;
- uint16_t periodindex;
-
- float periodlength;
- float fidelity;
- float biasfactor;
- float minrms;
-
- } _tSNAC;
-
- typedef _tSNAC* tSNAC;
-
- void tSNAC_init (tSNAC* const, int overlaparg);
- void tSNAC_free (tSNAC* const);
- void tSNAC_initToPool (tSNAC* const, int overlaparg, tMempool* const);
- void tSNAC_freeFromPool (tSNAC* const, tMempool* const);
-
- void tSNAC_ioSamples (tSNAC *s, float *in, float *out, int size);
- void tSNAC_setOverlap (tSNAC *s, int lap);
- void tSNAC_setBias (tSNAC *s, float bias);
- void tSNAC_setMinRMS (tSNAC *s, float rms);
-
- /*To get freq, perform SAMPLE_RATE/snac_getperiod() */
- float tSNAC_getPeriod (tSNAC *s);
- float tSNAC_getFidelity (tSNAC *s);
-
-#define DEFPITCHRATIO 2.0f
-#define DEFTIMECONSTANT 100.0f
-#define DEFHOPSIZE 64
-#define DEFWINDOWSIZE 64
-#define FBA 20
-#define HPFREQ 40.0f
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
- // Period detection
- typedef struct _tPeriodDetection
- {
- tEnvPD env;
- tSNAC snac;
- float* inBuffer;
- float* outBuffer;
- int frameSize;
- int bufSize;
- int framesPerBuffer;
- int curBlock;
- int lastBlock;
- int i;
- int indexstore;
- int iLast;
- int index;
- float period;
-
- uint16_t hopSize;
- uint16_t windowSize;
- uint8_t fba;
-
- float timeConstant;
- float radius;
- float max;
- float lastmax;
- float deltamax;
-
- float fidelityThreshold;
-
- } _tPeriodDetection;
-
- typedef _tPeriodDetection* tPeriodDetection;
-
- void tPeriodDetection_init (tPeriodDetection* const, float* in, float* out, int bufSize, int frameSize);
- void tPeriodDetection_free (tPeriodDetection* const);
- void tPeriodDetection_initToPool (tPeriodDetection* const, float* in, float* out, int bufSize, int frameSize, tMempool* const);
- void tPeriodDetection_freeFromPool (tPeriodDetection* const, tMempool* const);
-
- float tPeriodDetection_tick (tPeriodDetection* const, float sample);
- float tPeriodDetection_getPeriod (tPeriodDetection* const);
- void tPeriodDetection_setHopSize (tPeriodDetection* const, int hs);
- void tPeriodDetection_setWindowSize (tPeriodDetection* const, int ws);
- void tPeriodDetection_setFidelityThreshold(tPeriodDetection* const, float threshold);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_ANALYSIS_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-delay.h
+++ /dev/null
@@ -1,221 +1,0 @@
-/*==============================================================================
-
- leaf-delay.h
- Created: 20 Jan 2017 12:01:24pm
- Author: Michael R Mulshine
-
- ==============================================================================*/
-
-#ifndef LEAF_DELAY_H_INCLUDED
-#define LEAF_DELAY_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-
- //==============================================================================
-
- /* Non-interpolating delay, reimplemented from STK (Cook and Scavone). */
- typedef struct _tDelay
- {
- float gain;
- float* buff;
-
- float lastOut, lastIn;
-
- uint32_t inPoint, outPoint;
-
- uint32_t delay, maxDelay;
-
- } _tDelay;
-
- typedef _tDelay* tDelay;
-
- void tDelay_init (tDelay* const, uint32_t delay, uint32_t maxDelay);
- void tDelay_free (tDelay* const);
- void tDelay_initToPool (tDelay* const, uint32_t delay, uint32_t maxDelay, tMempool* const);
- void tDelay_freeFromPool (tDelay* const, tMempool* const);
-
- void tDelay_clear (tDelay* const);
- int tDelay_setDelay (tDelay* const, uint32_t delay);
- uint32_t tDelay_getDelay (tDelay* const);
- void tDelay_tapIn (tDelay* const, float in, uint32_t tapDelay);
- float tDelay_tapOut (tDelay* const, uint32_t tapDelay);
- float tDelay_addTo (tDelay* const, float value, uint32_t tapDelay);
- float tDelay_tick (tDelay* const, float sample);
- float tDelay_getLastOut (tDelay* const);
- float tDelay_getLastIn (tDelay* const);
-
- //==============================================================================
-
- /* Linearly-interpolating delay, reimplemented from STK (Cook and Scavone). */
- typedef struct _tLinearDelay
- {
- float gain;
- float* buff;
-
- float lastOut, lastIn;
-
- uint32_t inPoint, outPoint;
-
- uint32_t maxDelay;
-
- float delay;
-
- float alpha, omAlpha;
-
- } _tLinearDelay;
-
- typedef _tLinearDelay* tLinearDelay;
-
- void tLinearDelay_init (tLinearDelay* const, float delay, uint32_t maxDelay);
- void tLinearDelay_free (tLinearDelay* const);
- void tLinearDelay_initToPool (tLinearDelay* const, float delay, uint32_t maxDelay, tMempool* const);
- void tLinearDelay_freeFromPool(tLinearDelay* const, tMempool* const);
- void tLinearDelay_clear (tLinearDelay* const dl);
- int tLinearDelay_setDelay (tLinearDelay* const, float delay);
- float tLinearDelay_getDelay (tLinearDelay* const);
- void tLinearDelay_tapIn (tLinearDelay* const, float in, uint32_t tapDelay);
- float tLinearDelay_tapOut (tLinearDelay* const, uint32_t tapDelay);
- float tLinearDelay_addTo (tLinearDelay* const, float value, uint32_t tapDelay);
- float tLinearDelay_tick (tLinearDelay* const, float sample);
- void tLinearDelay_tickIn (tLinearDelay* const, float input);
- float tLinearDelay_tickOut (tLinearDelay* const);
- float tLinearDelay_getLastOut (tLinearDelay* const);
- float tLinearDelay_getLastIn (tLinearDelay* const);
-
-
-
- //==============================================================================
-
- /* Hermite-interpolating delay, created by adapting STK linear delay with Hermite interpolation */
- typedef struct _tHermiteDelay
- {
- float gain;
- float* buff;
-
- float lastOut, lastIn;
-
- uint32_t inPoint, outPoint;
-
- uint32_t maxDelay;
-
- float delay;
-
- float alpha, omAlpha;
-
- } _tHermiteDelay;
-
- typedef _tHermiteDelay* tHermiteDelay;
-
- void tHermiteDelay_init (tHermiteDelay* const dl, float delay, uint32_t maxDelay);
- void tHermiteDelay_free (tHermiteDelay* const dl);
- void tHermiteDelay_initToPool (tHermiteDelay* const dl, float delay, uint32_t maxDelay, tMempool* const mp);
- void tHermiteDelay_freeFromPool (tHermiteDelay* const dl, tMempool* const mp);
- void tHermiteDelay_clear (tHermiteDelay* const dl);
- float tHermiteDelay_tick (tHermiteDelay* const dl, float input);
- void tHermiteDelay_tickIn (tHermiteDelay* const dl, float input);
- float tHermiteDelay_tickOut (tHermiteDelay* const dl);
- int tHermiteDelay_setDelay (tHermiteDelay* const dl, float delay);
- float tHermiteDelay_tapOut (tHermiteDelay* const dl, uint32_t tapDelay);
- void tHermiteDelay_tapIn (tHermiteDelay* const dl, float value, uint32_t tapDelay);
- float tHermiteDelay_addTo (tHermiteDelay* const dl, float value, uint32_t tapDelay);
- float tHermiteDelay_getDelay (tHermiteDelay* const dl);
- float tHermiteDelay_getLastOut (tHermiteDelay* const dl);
- float tHermiteDelay_getLastIn (tHermiteDelay* const dl);
- void tHermiteDelay_setGain (tHermiteDelay* const dl, float gain);
- float tHermiteDelay_getGain (tHermiteDelay* const dl);
-
-
- //==============================================================================
-
- /* Allpass-interpolating delay, reimplemented from STK (Cook and Scavone). */
- typedef struct _tAllpassDelay
- {
- float gain;
- float* buff;
-
- float lastOut, lastIn;
-
- uint32_t inPoint, outPoint;
-
- uint32_t maxDelay;
-
- float delay;
-
- float alpha, omAlpha, coeff;
-
- float apInput;
-
- } _tAllpassDelay;
-
- typedef _tAllpassDelay* tAllpassDelay;
-
- void tAllpassDelay_init (tAllpassDelay* const, float delay, uint32_t maxDelay);
- void tAllpassDelay_free (tAllpassDelay* const);
- void tAllpassDelay_initToPool (tAllpassDelay* const, float delay, uint32_t maxDelay, tMempool* const);
- void tAllpassDelay_freeFromPool(tAllpassDelay* const, tMempool* const);
-
- void tAllpassDelay_clear (tAllpassDelay* const);
- int tAllpassDelay_setDelay (tAllpassDelay* const, float delay);
- float tAllpassDelay_getDelay (tAllpassDelay* const);
- void tAllpassDelay_tapIn (tAllpassDelay* const, float in, uint32_t tapDelay);
- float tAllpassDelay_tapOut (tAllpassDelay* const, uint32_t tapDelay);
- float tAllpassDelay_addTo (tAllpassDelay* const, float value, uint32_t tapDelay);
- float tAllpassDelay_tick (tAllpassDelay* const, float sample);
- float tAllpassDelay_getLastOut (tAllpassDelay* const);
- float tAllpassDelay_getLastIn (tAllpassDelay* const);
-
- //==============================================================================
-
- /* Linear interpolating delay with fixed read and write pointers, variable rate. */
- typedef struct _tTapeDelay
- {
- float gain;
- float* buff;
-
- float lastOut, lastIn;
-
- uint32_t inPoint;
-
- uint32_t maxDelay;
-
- float delay, inc, idx;
-
- float apInput;
-
- } _tTapeDelay;
-
- typedef _tTapeDelay* tTapeDelay;
-
- void tTapeDelay_init (tTapeDelay* const, float delay, uint32_t maxDelay);
- void tTapeDelay_free (tTapeDelay* const);
- void tTapeDelay_initToPool (tTapeDelay* const, float delay, uint32_t maxDelay, tMempool* const);
- void tTapeDelay_freeFromPool(tTapeDelay* const, tMempool* const);
-
- void tTapeDelay_clear (tTapeDelay* const);
- void tTapeDelay_setDelay (tTapeDelay* const, float delay);
- float tTapeDelay_getDelay (tTapeDelay* const);
- void tTapeDelay_tapIn (tTapeDelay* const, float in, uint32_t tapDelay);
- float tTapeDelay_tapOut (tTapeDelay* const d, float tapDelay);
- float tTapeDelay_addTo (tTapeDelay* const, float value, uint32_t tapDelay);
- float tTapeDelay_tick (tTapeDelay* const, float sample);
- void tTapeDelay_incrementInPoint(tTapeDelay* const dl);
- float tTapeDelay_getLastOut (tTapeDelay* const);
- float tTapeDelay_getLastIn (tTapeDelay* const);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_DELAY_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-distortion.h
+++ /dev/null
@@ -1,148 +1,0 @@
-/*==============================================================================
-
- leaf-distortion.h
- Created: 25 Oct 2019 10:23:28am
- Author: Matthew Wang
-
- ==============================================================================*/
-
-#ifndef LEAF_DISTORTION_H_INCLUDED
-#define LEAF_DISTORTION_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-mempool.h"
-#include "leaf-math.h"
-
- //==============================================================================
-
- typedef struct _tSampleReducer
- {
- float invRatio;
- float hold;
- uint32_t count;
- } _tSampleReducer;
-
- typedef _tSampleReducer* tSampleReducer;
-
- void tSampleReducer_init (tSampleReducer* const);
- void tSampleReducer_free (tSampleReducer* const);
- void tSampleReducer_initToPool (tSampleReducer* const, tMempool* const);
- void tSampleReducer_freeFromPool (tSampleReducer* const, tMempool* const);
-
- float tSampleReducer_tick (tSampleReducer* const, float input);
-
- // sampling ratio
- void tSampleReducer_setRatio (tSampleReducer* const, float ratio);
-
- //==============================================================================
-
- typedef struct _tOversampler
- {
- int ratio;
- float* pCoeffs;
- float* upState;
- float* downState;
- int numTaps;
- int phaseLength;
- } _tOversampler;
-
- typedef _tOversampler* tOversampler;
-
- void tOversampler_init (tOversampler* const, int order, oBool extraQuality);
- void tOversampler_free (tOversampler* const);
- void tOversampler_initToPool (tOversampler* const, int order, oBool extraQuality, tMempool* const);
- void tOversampler_freeFromPool (tOversampler* const, tMempool* const);
-
- void tOversampler_upsample (tOversampler* const, float input, float* output);
- float tOversampler_downsample (tOversampler* const os, float* input);
- float tOversampler_tick (tOversampler* const, float input, float (*effectTick)(float));
- int tOversampler_getLatency (tOversampler* const os);
-
- //==============================================================================
-
- /* tLockhartWavefolder */
-
- typedef struct _tLockhartWavefolder
- {
- double Ln1;
- double Fn1;
- float xn1;
-
- double RL;
- double R;
- double VT;
- double Is;
-
- double a;
- double b;
- double d;
-
- // Antialiasing error threshold
- double thresh;
- double half_a;
- double longthing;
-
- } _tLockhartWavefolder;
-
- typedef _tLockhartWavefolder* tLockhartWavefolder;
-
- void tLockhartWavefolder_init (tLockhartWavefolder* const);
- void tLockhartWavefolder_free (tLockhartWavefolder* const);
- void tLockhartWavefolder_initToPool (tLockhartWavefolder* const, tMempool* const);
- void tLockhartWavefolder_freeFromPool (tLockhartWavefolder* const, tMempool* const);
-
- float tLockhartWavefolder_tick (tLockhartWavefolder* const, float samp);
-
- //==============================================================================
-
- typedef struct _tCrusher
- {
- float srr;
- float mult, div;
- float rnd;
-
- uint32_t op; //which bitwise operation (0-7)
-
- float gain;
- tSampleReducer sReducer;
-
- } _tCrusher;
-
- typedef _tCrusher* tCrusher;
-
- void tCrusher_init (tCrusher* const);
- void tCrusher_free (tCrusher* const);
- void tCrusher_initToPool (tCrusher* const, tMempool* const);
- void tCrusher_freeFromPool (tCrusher* const, tMempool* const);
-
- float tCrusher_tick (tCrusher* const, float input);
-
- // 0.0 - 1.0
- void tCrusher_setOperation (tCrusher* const, float op);
-
- // 0.0 - 1.0
- void tCrusher_setQuality (tCrusher* const, float val);
-
- // what division to round to
- void tCrusher_setRound (tCrusher* const, float rnd);
-
- // sampling ratio
- void tCrusher_setSamplingRatio (tCrusher* const, float ratio);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_DISTORTION_H_INCLUDED
-
-//==============================================================================
-
-
--- a/LEAF/Inc/leaf-dynamics.h
+++ /dev/null
@@ -1,90 +1,0 @@
-/*==============================================================================
-
- leaf-dynamics.h
- Created: 30 Nov 2018 11:57:05am
- Author: airship
-
- ==============================================================================*/
-
-#ifndef LEAF_DYNAMICS_H_INCLUDED
-#define LEAF_DYNAMICS_H_INCLUDED
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-analysis.h"
-
- //==============================================================================
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* Compressor */
- typedef struct _tCompressor
- {
- float tauAttack, tauRelease;
- float T, R, W, M; // Threshold, compression Ratio, decibel Width of knee transition, decibel Make-up gain
-
- float x_G[2], y_G[2], x_T[2], y_T[2];
-
- oBool isActive;
-
- } _tCompressor;
-
- typedef _tCompressor* tCompressor;
-
- void tCompressor_init (tCompressor* const);
- void tCompressor_free (tCompressor* const);
- void tCompressor_initToPool (tCompressor* const, tMempool* const);
- void tCompressor_freeFromPool(tCompressor* const, tMempool* const);
-
- float tCompressor_tick (tCompressor* const, float input);
-
- ///
- /* Feedback leveller */
- // An auto VCA that you put into a feedback circuit to make it stay at the same level.
- // It can enforce level bidirectionally (amplifying and attenuating as needed) or
- // just attenutating. The former option allows for infinite sustain strings, for example, while
- // The latter option allows for decaying strings, which can never exceed
- // a specific level.
-
- typedef struct _tFeedbackLeveler {
- float targetLevel; // target power level
- float strength; // how strongly level difference affects the VCA
- int mode; // 0 for upwards limiting only, 1 for biderctional limiting
- float curr;
- tPowerFollower pwrFlw; // internal power follower needed for level tracking
-
- } _tFeedbackLeveler;
-
- typedef _tFeedbackLeveler* tFeedbackLeveler;
-
- void tFeedbackLeveler_init (tFeedbackLeveler* const, float targetLevel, float factor, float strength, int mode);
- void tFeedbackLeveler_free (tFeedbackLeveler* const);
- void tFeedbackLeveler_initToPool (tFeedbackLeveler* const, float targetLevel, float factor, float strength, int mode, tMempool* const);
- void tFeedbackLeveler_freeFromPool (tFeedbackLeveler* const, tMempool* const);
-
- float tFeedbackLeveler_tick (tFeedbackLeveler* const, float input);
- float tFeedbackLeveler_sample (tFeedbackLeveler* const);
- void tFeedbackLeveler_setTargetLevel (tFeedbackLeveler* const, float TargetLevel);
- void tFeedbackLeveler_setFactor (tFeedbackLeveler* const, float factor);
- void tFeedbackLeveler_setMode (tFeedbackLeveler* const, int mode); // 0 for upwards limiting only, 1 for biderctional limiting
- void tFeedbackLeveler_setStrength (tFeedbackLeveler* const, float strength);
-
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_DYNAMICS_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-effects.h
+++ /dev/null
@@ -1,316 +1,0 @@
-/*==============================================================================
-
- leaf-effects.h
- Created: 20 Jan 2017 12:01:54pm
- Author: Michael R Mulshine
-
- ==============================================================================*/
-
-#ifndef LEAF_EFFECTS_H_INCLUDED
-#define LEAF_EFFECTS_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-#include "leaf-global.h"
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-dynamics.h"
-#include "leaf-analysis.h"
-#include "leaf-envelopes.h"
-
- //==============================================================================
-
- /* tTalkbox */
-#define NUM_TALKBOX_PARAM 4
-
- typedef struct _tTalkbox
- {
- float param[NUM_TALKBOX_PARAM];
-
- int bufsize;
- float* car0;
- float* car1;
- float* window;
- float* buf0;
- float* buf1;
-
- float emphasis;
- int32_t K, N, O, pos;
- float wet, dry, FX;
- float d0, d1, d2, d3, d4;
- float u0, u1, u2, u3, u4;
-
- } _tTalkbox;
-
- typedef _tTalkbox* tTalkbox;
-
- void tTalkbox_init (tTalkbox* const, int bufsize);
- void tTalkbox_free (tTalkbox* const);
- void tTalkbox_initToPool (tTalkbox* const, int bufsize, tMempool* const);
- void tTalkbox_freeFromPool (tTalkbox* const, tMempool* const);
-
- float tTalkbox_tick (tTalkbox* const, float synth, float voice);
- void tTalkbox_update (tTalkbox* const);
- void tTalkbox_suspend (tTalkbox* const);
- void tTalkbox_lpcDurbin (float *r, int p, float *k, float *g);
- void tTalkbox_lpc (float *buf, float *car, int32_t n, int32_t o);
- void tTalkbox_setQuality (tTalkbox* const, float quality);
-
- //==============================================================================
-
- /* tVocoder */
-#define NUM_VOCODER_PARAM 8
-#define NBANDS 16
-
- typedef struct _tVocoder
- {
- float param[NUM_VOCODER_PARAM];
-
- float gain; //output level
- float thru, high; //hf thru
- float kout; //downsampled output
- int32_t kval; //downsample counter
- int32_t nbnd; //number of bands
-
- //filter coeffs and buffers - seems it's faster to leave this global than make local copy
- float f[NBANDS][13]; //[0-8][0 1 2 | 0 1 2 3 | 0 1 2 3 | val rate]
-
- } _tVocoder;
-
- typedef _tVocoder* tVocoder;
-
- void tVocoder_init (tVocoder* const);
- void tVocoder_free (tVocoder* const);
- void tVocoder_initToPool (tVocoder* const, tMempool* const);
- void tVocoder_freeFromPool (tVocoder* const, tMempool* const);
-
- float tVocoder_tick (tVocoder* const, float synth, float voice);
- void tVocoder_update (tVocoder* const);
- void tVocoder_suspend (tVocoder* const);
-
- //==============================================================================
-
-
- //==============================================================================
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* tSOLAD : pitch shifting algorithm that underlies tRetune etc */
- // from Katja Vetters http://www.katjaas.nl/pitchshiftlowlatency/pitchshiftlowlatency.html
-#define LOOPSIZE (2048*2) // (4096*2) // loop size must be power of two
-#define LOOPMASK (LOOPSIZE - 1)
-#define PITCHFACTORDEFAULT 1.0f
-#define INITPERIOD 64.0f
-#define MAXPERIOD (float)((LOOPSIZE - w->blocksize) * 0.8f)
-#define MINPERIOD 8.0f
-
- typedef struct _tSOLAD
- {
- uint16_t timeindex; // current reference time, write index
- uint16_t blocksize; // signal input / output block size
- float pitchfactor; // pitch factor between 0.25 and 4
- float readlag; // read pointer's lag behind write pointer
- float period; // period length in input signal
- float jump; // read pointer jump length and direction
- float xfadelength; // crossfade length expressed at input sample rate
- float xfadevalue; // crossfade phase and value
-
- float* delaybuf;
-
- } _tSOLAD;
-
- typedef _tSOLAD* tSOLAD;
-
- void tSOLAD_init (tSOLAD* const);
- void tSOLAD_free (tSOLAD* const);
- void tSOLAD_initToPool (tSOLAD* const, tMempool* const);
- void tSOLAD_freeFromPool (tSOLAD* const, tMempool* const);
-
- // send one block of input samples, receive one block of output samples
- void tSOLAD_ioSamples (tSOLAD *w, float* in, float* out, int blocksize);
- // set periodicity analysis data
- void tSOLAD_setPeriod (tSOLAD *w, float period);
- // set pitch factor between 0.25 and 4
- void tSOLAD_setPitchFactor (tSOLAD *w, float pitchfactor);
- // force readpointer lag
- void tSOLAD_setReadLag (tSOLAD *w, float readlag);
- // reset state variables
- void tSOLAD_resetState (tSOLAD *w);
-
- // Pitch shift
- typedef struct _tPitchShift
- {
- tSOLAD sola;
- tHighpass hp;
- tPeriodDetection* p;
-
- float* outBuffer;
- int frameSize;
- int bufSize;
-
- int framesPerBuffer;
- int curBlock;
- int lastBlock;
- int index;
-
- float pitchFactor;
- float timeConstant;
- float radius;
- } _tPitchShift;
-
- typedef _tPitchShift* tPitchShift;
-
- void tPitchShift_init (tPitchShift* const, tPeriodDetection* const, float* out, int bufSize);
- void tPitchShift_free (tPitchShift* const);
- void tPitchShift_initToPool (tPitchShift* const, tPeriodDetection* const, float* out, int bufSize, tMempool* const);
- void tPitchShift_freeFromPool (tPitchShift* const, tMempool* const);
-
- float tPitchShift_shift (tPitchShift* const);
- float tPitchShift_shiftToFunc (tPitchShift* const, float (*fun)(float));
- float tPitchShift_shiftToFreq (tPitchShift* const, float freq);
- void tPitchShift_setPitchFactor (tPitchShift* const, float pf);
-
- // Retune
- typedef struct _tRetune
- {
- tPeriodDetection pd;
- tPitchShift* ps;
-
- float* inBuffer;
- float** outBuffers;
- float* tickOutput;
- int frameSize;
- int bufSize;
-
- uint16_t hopSize;
- uint16_t windowSize;
- uint8_t fba;
-
- float* pitchFactor;
- float timeConstant;
- float radius;
-
- float inputPeriod;
-
- int numVoices;
- } _tRetune;
-
- typedef _tRetune* tRetune;
-
- void tRetune_init (tRetune* const, int numVoices, int bufSize, int frameSize);
- void tRetune_free (tRetune* const);
- void tRetune_initToPool (tRetune* const, int numVoices, int bufSize, int frameSize, tMempool* const);
- void tRetune_freeFromPool (tRetune* const, tMempool* const);
-
- float* tRetune_tick (tRetune* const, float sample);
- void tRetune_setNumVoices (tRetune* const, int numVoices);
- void tRetune_setPitchFactors (tRetune* const, float pf);
- void tRetune_setPitchFactor (tRetune* const, float pf, int voice);
- void tRetune_setTimeConstant (tRetune* const, float tc);
- void tRetune_setHopSize (tRetune* const, int hs);
- void tRetune_setWindowSize (tRetune* const, int ws);
- void tRetune_setFidelityThreshold(tRetune* const, float threshold);
- float tRetune_getInputPeriod (tRetune* const);
- float tRetune_getInputFreq (tRetune* const);
-
- // Autotune
- typedef struct _tAutotune
- {
- tPeriodDetection pd;
- tPitchShift* ps;
-
- float* inBuffer;
- float** outBuffers;
- float* tickOutput;
- int frameSize;
- int bufSize;
-
- uint16_t hopSize;
- uint16_t windowSize;
- uint8_t fba;
-
- float* freq;
- float timeConstant;
- float radius;
-
- float inputPeriod;
-
- int numVoices;
- } _tAutotune;
-
- typedef _tAutotune* tAutotune;
-
- void tAutotune_init (tAutotune* const, int numVoices, int bufSize, int frameSize);
- void tAutotune_free (tAutotune* const);
- void tAutotune_initToPool (tAutotune* const, int numVoices, int bufSize, int frameSize, tMempool* const);
- void tAutotune_freeFromPool (tAutotune* const, tMempool* const);
-
- float* tAutotune_tick (tAutotune* const, float sample);
- void tAutotune_setNumVoices (tAutotune* const, int numVoices);
- void tAutotune_setFreqs (tAutotune* const, float f);
- void tAutotune_setFreq (tAutotune* const, float f, int voice);
- void tAutotune_setTimeConstant (tAutotune* const, float tc);
- void tAutotune_setHopSize (tAutotune* const, int hs);
- void tAutotune_setWindowSize (tAutotune* const, int ws);
- void tAutotune_setFidelityThreshold (tAutotune* const, float threshold);
- float tAutotune_getInputPeriod (tAutotune* const);
- float tAutotune_getInputFreq (tAutotune* const);
-
- //==============================================================================
-
-
- typedef struct _tFormantShifter
- {
- int ford;
- float falph;
- float flamb;
- float* fk;
- float* fb;
- float* fc;
- float* frb;
- float* frc;
- float* fsig;
- float* fsmooth;
- float fhp;
- float flp;
- float flpa;
- float* fbuff;
- float* ftvec;
- float fmute;
- float fmutealph;
- unsigned int cbi;
- float shiftFactor;
- float intensity, invIntensity;
- tHighpass hp;
- tHighpass hp2;
- tFeedbackLeveler fbl1;
- tFeedbackLeveler fbl2;
-
- } _tFormantShifter;
-
- typedef _tFormantShifter* tFormantShifter;
-
- void tFormantShifter_init (tFormantShifter* const, int order);
- void tFormantShifter_free (tFormantShifter* const);
- void tFormantShifter_initToPool (tFormantShifter* const, int order, tMempool* const);
- void tFormantShifter_freeFromPool (tFormantShifter* const, tMempool* const);
-
- float tFormantShifter_tick (tFormantShifter* const, float input);
- float tFormantShifter_remove (tFormantShifter* const, float input);
- float tFormantShifter_add (tFormantShifter* const, float input);
- void tFormantShifter_ioSamples (tFormantShifter* const, float* in, float* out, int size, float fwarp);
- void tFormantShifter_setShiftFactor (tFormantShifter* const, float shiftFactor);
- void tFormantShifter_setIntensity (tFormantShifter* const, float intensity);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_EFFECTS_H_INCLUDED
-
-//==============================================================================
--- a/LEAF/Inc/leaf-electrical.h
+++ /dev/null
@@ -1,95 +1,0 @@
-/*
- * leaf-electrical.h
- *
- * Created on: Sep 25, 2019
- * Author: jeffsnyder
- */
-
-#ifndef LEAF_INC_LEAF_ELECTRICAL_H_
-#define LEAF_INC_LEAF_ELECTRICAL_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-
- //==============================================================================
-
- typedef enum WDFComponentType
- {
- SeriesAdaptor = 0,
- ParallelAdaptor,
- Resistor,
- Capacitor,
- Inductor,
- Inverter,
- ResistiveSource,
- IdealSource,
- Diode,
- DiodePair,
- RootNil,
- WDFComponentNil
- } WDFComponentType;
-
- typedef struct _tWDF _tWDF; // needed to allow tWDF pointers in struct
- typedef _tWDF* tWDF;
- struct _tWDF
- {
- WDFComponentType type;
- float port_resistance_up;
- float port_resistance_left;
- float port_resistance_right;
- float port_conductance_up;
- float port_conductance_left;
- float port_conductance_right;
- float incident_wave_up;
- float incident_wave_left;
- float incident_wave_right;
- float reflected_wave_up;
- float reflected_wave_left;
- float reflected_wave_right;
- float gamma_zero;
- float sample_rate;
- float value;
- tWDF* child_left;
- tWDF* child_right;
- float (*get_port_resistance)(tWDF* const);
- float (*get_reflected_wave_up)(tWDF* const, float);
- float (*get_reflected_wave_down)(tWDF* const, float, float);
- void (*set_incident_wave)(tWDF* const, float, float);
- };
-
- //WDF Linear Components
- void tWDF_init (tWDF* const, WDFComponentType type, float value, tWDF* const rL, tWDF* const rR);
- void tWDF_free (tWDF* const);
- void tWDF_initToPool (tWDF* const, WDFComponentType type, float value, tWDF* const rL, tWDF* const rR, tMempool* const);
- void tWDF_freeFromPool (tWDF* const, tMempool* const);
-
- float tWDF_tick (tWDF* const, float sample, tWDF* const outputPoint, uint8_t paramsChanged);
-
- void tWDF_setValue (tWDF* const, float value);
- void tWDF_setSampleRate (tWDF* const, float sample_rate);
- uint8_t tWDF_isLeaf (tWDF* const);
-
- float tWDF_getPortResistance (tWDF* const);
- float tWDF_getReflectedWaveUp (tWDF* const, float input); //for tree, only uses input for resistive source
- float tWDF_getReflectedWaveDown (tWDF* const, float input, float incident_wave); //for roots
- void tWDF_setIncidentWave (tWDF* const, float incident_wave, float input);
-
- float tWDF_getVoltage (tWDF* const);
- float tWDF_getCurrent (tWDF* const);
-
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LEAF_INC_LEAF_ELECTRICAL_H_ */
-
--- a/LEAF/Inc/leaf-envelopes.h
+++ /dev/null
@@ -1,154 +1,0 @@
-/*
- ==============================================================================
-
- leaf-envelopes.h
- Created: 20 Jan 2017 12:02:17pm
- Author: Michael R Mulshine
-
- ==============================================================================
- */
-
-#ifndef LEAF_ENVELOPES_H_INCLUDED
-#define LEAF_ENVELOPES_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-filters.h"
-#include "leaf-delay.h"
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* Attack-Decay envelope */
- typedef struct _tEnvelope {
-
- const float *exp_buff;
- const float *inc_buff;
- uint32_t buff_size;
-
- float next;
-
- float attackInc, decayInc, rampInc;
-
- oBool inAttack, inDecay, inRamp;
-
- oBool loop;
-
- float gain, rampPeak;
-
- float attackPhase, decayPhase, rampPhase;
-
- } _tEnvelope;
-
- typedef _tEnvelope* tEnvelope;
-
- void tEnvelope_init (tEnvelope* const, float attack, float decay, oBool loop);
- void tEnvelope_free (tEnvelope* const);
- void tEnvelope_initToPool (tEnvelope* const, float attack, float decay, oBool loop, tMempool* const);
- void tEnvelope_freeFromPool (tEnvelope* const, tMempool* const);
-
- float tEnvelope_tick (tEnvelope* const);
- void tEnvelope_setAttack (tEnvelope* const, float attack);
- void tEnvelope_setDecay (tEnvelope* const, float decay);
- void tEnvelope_loop (tEnvelope* const, oBool loop);
- void tEnvelope_on (tEnvelope* const, float velocity);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* ADSR */
- typedef struct _tADSR
- {
- const float *exp_buff;
- const float *inc_buff;
- uint32_t buff_size;
-
- float next;
-
- float attackInc, decayInc, releaseInc, rampInc;
-
- oBool inAttack, inDecay, inSustain, inRelease, inRamp;
-
- float sustain, gain, rampPeak, releasePeak;
-
- float attackPhase, decayPhase, releasePhase, rampPhase;
-
- } _tADSR;
-
- typedef _tADSR* tADSR;
-
- void tADSR_init (tADSR* const, float attack, float decay, float sustain, float release);
- void tADSR_free (tADSR* const);
- void tADSR_initToPool (tADSR* const, float attack, float decay, float sustain, float release, tMempool* const);
- void tADSR_freeFromPool (tADSR* const, tMempool* const);
-
- float tADSR_tick (tADSR* const);
- void tADSR_setAttack (tADSR* const, float attack);
- void tADSR_setDecay (tADSR* const, float decay);
- void tADSR_setSustain (tADSR* const, float sustain);
- void tADSR_setRelease (tADSR* const, float release);
- void tADSR_on (tADSR* const, float velocity);
- void tADSR_off (tADSR* const);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* Ramp */
- typedef struct _tRamp {
- float inc;
- float inv_sr_ms;
- float minimum_time;
- float curr,dest;
- float time;
- int samples_per_tick;
-
- } _tRamp;
-
- typedef _tRamp* tRamp;
-
- void tRamp_init (tRamp* const, float time, int samplesPerTick);
- void tRamp_free (tRamp* const);
- void tRamp_initToPool (tRamp* const, float time, int samplesPerTick, tMempool* const);
- void tRamp_freeFromPool (tRamp* const, tMempool* const);
-
- float tRamp_tick (tRamp* const);
- float tRamp_sample (tRamp* const);
- void tRamp_setTime (tRamp* const, float time);
- void tRamp_setDest (tRamp* const, float dest);
- void tRamp_setVal (tRamp* const, float val);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* Exponential Smoother */
- typedef struct _tExpSmooth {
- float factor, oneminusfactor;
- float curr,dest;
-
- } _tExpSmooth;
-
- typedef _tExpSmooth* tExpSmooth;
-
- void tExpSmooth_init (tExpSmooth* const, float val, float factor);
- void tExpSmooth_free (tExpSmooth* const);
- void tExpSmooth_initToPool (tExpSmooth* const, float val, float factor, tMempool* const);
- void tExpSmooth_freeFromPool (tExpSmooth* const, tMempool* const);
-
- float tExpSmooth_tick (tExpSmooth* const);
- float tExpSmooth_sample (tExpSmooth* const);
- void tExpSmooth_setFactor (tExpSmooth* const, float factor);
- void tExpSmooth_setDest (tExpSmooth* const, float dest);
- void tExpSmooth_setVal (tExpSmooth* const, float val);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_ENVELOPES_H_INCLUDED
-
-
-
--- a/LEAF/Inc/leaf-filters.h
+++ /dev/null
@@ -1,358 +1,0 @@
-/*==============================================================================
-
- leaf-filters.h
- Created: 20 Jan 2017 12:01:10pm
- Author: Michael R Mulshine
-
- ==============================================================================*/
-
-#ifndef LEAF_FILTERS_H_INCLUDED
-#define LEAF_FILTERS_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-delay.h"
-#include "leaf-tables.h"
-
- //==============================================================================
-
- /* tAllpass: Schroeder allpass. Comb-filter with feedforward and feedback. */
- typedef struct _tAllpass
- {
- float gain;
-
- tLinearDelay delay;
-
- float lastOut;
-
- } _tAllpass;
-
- typedef _tAllpass* tAllpass;
-
- void tAllpass_init (tAllpass* const, float initDelay, uint32_t maxDelay);
- void tAllpass_free (tAllpass* const);
- void tAllpass_initToPool (tAllpass* const, float initDelay, uint32_t maxDelay, tMempool* const);
- void tAllpass_freeFromPool (tAllpass* const, tMempool* const);
-
- float tAllpass_tick (tAllpass* const, float input);
- void tAllpass_setGain (tAllpass* const, float gain);
- void tAllpass_setDelay (tAllpass* const, float delay);
-
-
- //==============================================================================
-
- /* tOnePole: OnePole filter, reimplemented from STK (Cook and Scavone). */
- typedef struct _tOnePole
- {
- float gain;
- float a0,a1;
- float b0,b1;
- float lastIn, lastOut;
-
-
- } _tOnePole;
-
- typedef _tOnePole* tOnePole;
-
- void tOnePole_init (tOnePole* const, float thePole);
- void tOnePole_free (tOnePole* const);
- void tOnePole_initToPool (tOnePole* const, float thePole, tMempool* const);
- void tOnePole_freeFromPool (tOnePole* const, tMempool* const);
-
- float tOnePole_tick (tOnePole* const, float input);
- void tOnePole_setB0 (tOnePole* const, float b0);
- void tOnePole_setA1 (tOnePole* const, float a1);
- void tOnePole_setPole (tOnePole* const, float thePole);
- void tOnePole_setFreq (tOnePole* const, float freq);
- void tOnePole_setCoefficients(tOnePole* const, float b0, float a1);
- void tOnePole_setGain (tOnePole* const, float gain);
-
- //==============================================================================
-
- /* TwoPole filter, reimplemented from STK (Cook and Scavone). */
- typedef struct _tTwoPole
- {
- float gain;
- float a0, a1, a2;
- float b0;
-
- float radius, frequency;
- oBool normalize;
-
- float lastOut[2];
-
- } _tTwoPole;
-
- typedef _tTwoPole* tTwoPole;
-
- void tTwoPole_init (tTwoPole* const);
- void tTwoPole_free (tTwoPole* const);
- void tTwoPole_initToPool (tTwoPole* const, tMempool* const);
- void tTwoPole_freeFromPool (tTwoPole* const, tMempool* const);
-
- float tTwoPole_tick (tTwoPole* const, float input);
- void tTwoPole_setB0 (tTwoPole* const, float b0);
- void tTwoPole_setA1 (tTwoPole* const, float a1);
- void tTwoPole_setA2 (tTwoPole* const, float a2);
- void tTwoPole_setResonance (tTwoPole* const, float freq, float radius, oBool normalize);
- void tTwoPole_setCoefficients(tTwoPole* const, float b0, float a1, float a2);
- void tTwoPole_setGain (tTwoPole* const, float gain);
-
- //==============================================================================
-
- /* OneZero filter, reimplemented from STK (Cook and Scavone). */
- typedef struct _tOneZero
- {
- float gain;
- float b0,b1;
- float lastIn, lastOut, frequency;
-
- } _tOneZero;
-
- typedef _tOneZero* tOneZero;
-
- void tOneZero_init (tOneZero* const, float theZero);
- void tOneZero_free (tOneZero* const);
- void tOneZero_initToPool (tOneZero* const, float theZero, tMempool* const);
- void tOneZero_freeFromPool (tOneZero* const, tMempool* const);
-
- float tOneZero_tick (tOneZero* const, float input);
- void tOneZero_setB0 (tOneZero* const, float b0);
- void tOneZero_setB1 (tOneZero* const, float b1);
- void tOneZero_setZero (tOneZero* const, float theZero);
- void tOneZero_setCoefficients(tOneZero* const, float b0, float b1);
- void tOneZero_setGain (tOneZero* const, float gain);
- float tOneZero_getPhaseDelay (tOneZero *f, float frequency );
-
- //==============================================================================
-
- /* TwoZero filter, reimplemented from STK (Cook and Scavone). */
- typedef struct _tTwoZero
- {
- float gain;
- float b0, b1, b2;
-
- float frequency, radius;
-
- float lastIn[2];
-
- } _tTwoZero;
-
- typedef _tTwoZero* tTwoZero;
-
- void tTwoZero_init (tTwoZero* const);
- void tTwoZero_free (tTwoZero* const);
- void tTwoZero_initToPool (tTwoZero* const, tMempool* const);
- void tTwoZero_freeFromPool (tTwoZero* const, tMempool* const);
-
- float tTwoZero_tick (tTwoZero* const, float input);
- void tTwoZero_setB0 (tTwoZero* const, float b0);
- void tTwoZero_setB1 (tTwoZero* const, float b1);
- void tTwoZero_setB2 (tTwoZero* const, float b2);
- void tTwoZero_setNotch (tTwoZero* const, float frequency, float radius);
- void tTwoZero_setCoefficients(tTwoZero* const, float b0, float b1, float b2);
- void tTwoZero_setGain (tTwoZero* const, float gain);
-
- //==============================================================================
-
- /* PoleZero filter, reimplemented from STK (Cook and Scavone). */
- typedef struct _tPoleZero
- {
- float gain;
- float a0,a1;
- float b0,b1;
-
- float lastIn, lastOut;
-
- } _tPoleZero;
-
- typedef _tPoleZero* tPoleZero;
-
- void tPoleZero_init (tPoleZero* const);
- void tPoleZero_free (tPoleZero* const);
- void tPoleZero_initToPool (tPoleZero* const, tMempool* const);
- void tPoleZero_freeFromPool (tPoleZero* const, tMempool* const);
-
- float tPoleZero_tick (tPoleZero* const, float input);
- void tPoleZero_setB0 (tPoleZero* const, float b0);
- void tPoleZero_setB1 (tPoleZero* const, float b1);
- void tPoleZero_setA1 (tPoleZero* const, float a1);
- void tPoleZero_setCoefficients (tPoleZero* const, float b0, float b1, float a1);
- void tPoleZero_setAllpass (tPoleZero* const, float coeff);
- void tPoleZero_setBlockZero (tPoleZero* const, float thePole);
- void tPoleZero_setGain (tPoleZero* const, float gain);
-
- //==============================================================================
-
- /* BiQuad filter, reimplemented from STK (Cook and Scavone). */
- typedef struct _tBiQuad
- {
- float gain;
- float a0, a1, a2;
- float b0, b1, b2;
-
- float lastIn[2];
- float lastOut[2];
-
- float frequency, radius;
- oBool normalize;
- } _tBiQuad;
-
- typedef _tBiQuad* tBiQuad;
-
- void tBiQuad_init (tBiQuad* const);
- void tBiQuad_free (tBiQuad* const);
- void tBiQuad_initToPool (tBiQuad* const, tMempool* const);
- void tBiQuad_freeFromPool (tBiQuad* const, tMempool* const);
-
- float tBiQuad_tick (tBiQuad* const, float input);
- void tBiQuad_setB0 (tBiQuad* const, float b0);
- void tBiQuad_setB1 (tBiQuad* const, float b1);
- void tBiQuad_setB2 (tBiQuad* const, float b2);
- void tBiQuad_setA1 (tBiQuad* const, float a1);
- void tBiQuad_setA2 (tBiQuad* const, float a2);
- void tBiQuad_setNotch (tBiQuad* const, float freq, float radius);
- void tBiQuad_setResonance (tBiQuad* const, float freq, float radius, oBool normalize);
- void tBiQuad_setCoefficients(tBiQuad* const, float b0, float b1, float b2, float a1, float a2);
- void tBiQuad_setGain (tBiQuad* const, float gain);
-
- //==============================================================================
-
- /* State Variable Filter, algorithm from Andy Simper. */
- typedef enum SVFType
- {
- SVFTypeHighpass = 0,
- SVFTypeLowpass,
- SVFTypeBandpass,
- SVFTypeNotch,
- SVFTypePeak,
- } SVFType;
-
- typedef struct _tSVF
- {
- SVFType type;
- float cutoff, Q;
- float ic1eq,ic2eq;
- float g,k,a1,a2,a3;
-
- } _tSVF;
-
- typedef _tSVF* tSVF;
-
- void tSVF_init (tSVF* const, SVFType type, float freq, float Q);
- void tSVF_free (tSVF* const);
- void tSVF_initToPool (tSVF* const, SVFType type, float freq, float Q, tMempool* const);
- void tSVF_freeFromPool (tSVF* const, tMempool* const);
-
- float tSVF_tick (tSVF* const, float v0);
- void tSVF_setFreq (tSVF* const, float freq);
- void tSVF_setQ (tSVF* const, float Q);
-
- //==============================================================================
-
- /* Efficient State Variable Filter for 14-bit control input, [0, 4096). */
- typedef struct _tEfficientSVF
- {
- SVFType type;
- float cutoff, Q;
- float ic1eq,ic2eq;
- float g,k,a1,a2,a3;
-
- } _tEfficientSVF;
-
- typedef _tEfficientSVF* tEfficientSVF;
-
- void tEfficientSVF_init (tEfficientSVF* const, SVFType type, uint16_t input, float Q);
- void tEfficientSVF_free (tEfficientSVF* const);
- void tEfficientSVF_initToPool (tEfficientSVF* const, SVFType type, uint16_t input, float Q, tMempool* const);
- void tEfficientSVF_freeFromPool (tEfficientSVF* const, tMempool* const);
-
- float tEfficientSVF_tick (tEfficientSVF* const, float v0);
- void tEfficientSVF_setFreq (tEfficientSVF* const, uint16_t controlFreq);
- void tEfficientSVF_setQ (tEfficientSVF* const, float Q);
-
- //==============================================================================
-
- /* Simple Highpass filter. */
- typedef struct _tHighpass
- {
- float xs, ys, R;
- float frequency;
-
- } _tHighpass;
-
- typedef _tHighpass* tHighpass;
-
- void tHighpass_init (tHighpass* const, float freq);
- void tHighpass_free (tHighpass* const);
- void tHighpass_initToPool (tHighpass* const, float freq, tMempool* const);
- void tHighpass_freeFromPool (tHighpass* const, tMempool* const);
-
- float tHighpass_tick (tHighpass* const, float x);
- void tHighpass_setFreq (tHighpass* const, float freq);
- float tHighpass_getFreq (tHighpass* const);
-
- //==============================================================================
-
- // Butterworth Filter
-#define NUM_SVF_BW 16
- typedef struct _tButterworth
- {
- float gain;
-
- int N;
-
- tSVF low[NUM_SVF_BW];
- tSVF high[NUM_SVF_BW];
-
- float f1,f2;
-
- } _tButterworth;
-
- typedef _tButterworth* tButterworth;
-
- void tButterworth_init (tButterworth* const, int N, float f1, float f2);
- void tButterworth_free (tButterworth* const);
- void tButterworth_initToPool (tButterworth* const, int N, float f1, float f2, tMempool* const);
- void tButterworth_freeFromPool (tButterworth* const, tMempool* const);
-
- float tButterworth_tick (tButterworth* const, float input);
- void tButterworth_setF1 (tButterworth* const, float in);
- void tButterworth_setF2 (tButterworth* const, float in);
- void tButterworth_setFreqs (tButterworth* const, float f1, float f2);
-
- //==============================================================================
-
- typedef struct _tFIR
- {
- float* past;
- float* coeff;
- int numTaps;
- } _tFIR;
-
- typedef _tFIR* tFIR;
-
- void tFIR_init (tFIR* const, float* coeffs, int numTaps);
- void tFIR_free (tFIR* const);
- void tFIR_initToPool (tFIR* const, float* coeffs, int numTaps, tMempool* const);
- void tFIR_freeFromPool (tFIR* const, tMempool* const);
-
- float tFIR_tick (tFIR* const, float input);
- void tFIR_coeffs (tFIR* const, float in);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_FILTERS_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-global.h
+++ /dev/null
@@ -1,39 +1,0 @@
-/*
- ==============================================================================
-
- leaf-global.h
- Created: 24 Oct 2019 2:24:38pm
- Author: Matthew Wang
-
- ==============================================================================
- */
-
-#ifndef LEAF_GLOBAL_H_INCLUDED
-#define LEAF_GLOBAL_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- typedef struct _LEAF
- {
- float sampleRate;
- float invSampleRate;
- int blockSize;
- float twoPiTimesInvSampleRate;
- float (*random)(void);
- int clearOnAllocation;
- } LEAF;
-
- extern LEAF leaf; // The global instance of LEAF.
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_GLOBAL_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-instruments.h
+++ /dev/null
@@ -1,201 +1,0 @@
-/*==============================================================================
-
- leaf-instruments.h
- Created: 30 Nov 2018 10:24:44am
- Author: airship
-
- ==============================================================================*/
-
-#ifndef LEAF_INSTRUMENTS_H_INCLUDED
-#define LEAF_INSTRUMENTS_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-oscillators.h"
-#include "leaf-filters.h"
-#include "leaf-envelopes.h"
-
- //==============================================================================
-
- // 808 Cowbell
- typedef struct _t808Cowbell {
-
- tSquare p[2];
- tNoise stick;
- tSVF bandpassOsc;
- tSVF bandpassStick;
- tEnvelope envGain;
- tEnvelope envStick;
- tEnvelope envFilter;
- tHighpass highpass;
- float oscMix;
- float filterCutoff;
- oBool useStick;
-
- } _t808Cowbell;
-
- typedef _t808Cowbell* t808Cowbell;
-
- void t808Cowbell_init (t808Cowbell* const, int useStick);
- void t808Cowbell_free (t808Cowbell* const);
- void t808Cowbell_initToPool (t808Cowbell* const, int useStick, tMempool* const);
- void t808Cowbell_freeFromPool (t808Cowbell* const, tMempool* const);
-
- float t808Cowbell_tick (t808Cowbell* const);
- void t808Cowbell_on (t808Cowbell* const, float vel);
- void t808Cowbell_setDecay (t808Cowbell* const, float decay);
- void t808Cowbell_setHighpassFreq (t808Cowbell* const, float freq);
- void t808Cowbell_setBandpassFreq (t808Cowbell* const, float freq);
- void t808Cowbell_setFreq (t808Cowbell* const, float freq);
- void t808Cowbell_setOscMix (t808Cowbell* const, float oscMix);
- void t808Cowbell_setStick (t808Cowbell* const, int useStick);
-
- //==============================================================================
-
- // 808 Hihat
- typedef struct _t808Hihat {
-
- // 6 Square waves
- tSquare p[6];
- tNoise n;
- tSVF bandpassOsc;
- tSVF bandpassStick;
- tEnvelope envGain;
- tEnvelope envStick;
- tEnvelope noiseFMGain;
- tHighpass highpass;
- tNoise stick;
-
- float freq;
- float stretch;
- float FM_amount;
- float oscNoiseMix;
-
- } _t808Hihat;
-
- typedef _t808Hihat* t808Hihat;
-
- void t808Hihat_init (t808Hihat* const);
- void t808Hihat_free (t808Hihat* const);
- void t808Hihat_initToPool (t808Hihat* const, tMempool* const);
- void t808Hihat_freeFromPool (t808Hihat* const, tMempool* const);
-
- float t808Hihat_tick (t808Hihat* const);
- void t808Hihat_on (t808Hihat* const, float vel);
- void t808Hihat_setOscNoiseMix (t808Hihat* const, float oscNoiseMix);
- void t808Hihat_setDecay (t808Hihat* const, float decay);
- void t808Hihat_setHighpassFreq (t808Hihat* const, float freq);
- void t808Hihat_setOscBandpassFreq (t808Hihat* const, float freq);
- void t808Hihat_setOscBandpassQ (t808Hihat* const hihat, float Q);
- void t808Hihat_setStickBandPassFreq (t808Hihat* const, float freq);
- void t808Hihat_setStickBandPassQ (t808Hihat* const hihat, float Q);
- void t808Hihat_setOscFreq (t808Hihat* const, float freq);
- void t808Hihat_setStretch (t808Hihat* const hihat, float stretch);
- void t808Hihat_setFM (t808Hihat* const hihat, float FM_amount);
-
- //==============================================================================
-
- // 808 Snare
- typedef struct _t808Snare {
-
- // Tone 1, Tone 2, Noise
- tTriangle tone[2]; // Tri (not yet antialiased or wavetabled)
- tNoise noiseOsc;
- tSVF toneLowpass[2];
- tSVF noiseLowpass; // Lowpass from SVF filter
- tEnvelope toneEnvOsc[2];
- tEnvelope toneEnvGain[2];
- tEnvelope noiseEnvGain;
- tEnvelope toneEnvFilter[2];
- tEnvelope noiseEnvFilter;
-
- float toneGain[2];
- float noiseGain;
-
- float toneNoiseMix;
-
- float tone1Freq, tone2Freq;
-
- float noiseFilterFreq;
-
- } _t808Snare;
-
- typedef _t808Snare* t808Snare;
-
- void t808Snare_init (t808Snare* const);
- void t808Snare_free (t808Snare* const);
- void t808Snare_initToPool (t808Snare* const, tMempool* const);
- void t808Snare_freeFromPool (t808Snare* const, tMempool* const);
-
- float t808Snare_tick (t808Snare* const);
- void t808Snare_on (t808Snare* const, float vel);
- void t808Snare_setTone1Freq (t808Snare* const, float freq);
- void t808Snare_setTone2Freq (t808Snare* const, float freq);
- void t808Snare_setTone1Decay (t808Snare* const, float decay);
- void t808Snare_setTone2Decay (t808Snare* const, float decay);
- void t808Snare_setNoiseDecay (t808Snare* const, float decay);
- void t808Snare_setToneNoiseMix (t808Snare* const, float toneNoiseMix);
- void t808Snare_setNoiseFilterFreq (t808Snare* const, float noiseFilterFreq);
- void t808Snare_setNoiseFilterQ (t808Snare* const, float noiseFilterQ);
-
- //==============================================================================
-
- // 808 Kick
- typedef struct _t808Kick {
-
-
- tCycle tone; // Tri
- tNoise noiseOsc;
- tSVF toneLowpass;
- tEnvelope toneEnvOscChirp;
- tEnvelope toneEnvOscSigh;
- tEnvelope toneEnvGain;
- tEnvelope noiseEnvGain;
- tEnvelope toneEnvFilter;
-
- float toneGain;
- float noiseGain;
-
- float toneInitialFreq;
- float sighAmountInHz;
- float chirpRatioMinusOne;
- float noiseFilterFreq;
-
- } _t808Kick;
-
- typedef _t808Kick* t808Kick;
-
- void t808Kick_init (t808Kick* const);
- void t808Kick_free (t808Kick* const);
- void t808Kick_initToPool (t808Kick* const, tMempool* const);
- void t808Kick_freeFromPool (t808Kick* const, tMempool* const);
-
- float t808Kick_tick (t808Kick* const);
- void t808Kick_on (t808Kick* const, float vel);
- void t808Kick_setToneFreq (t808Kick* const, float freq);
- void t808Kick_setToneDecay (t808Kick* const, float decay);
- void t808Kick_setNoiseDecay (t808Kick* const, float decay);
- void t808Kick_setSighAmount (t808Kick* const, float sigh);
- void t808Kick_setChirpAmount (t808Kick* const, float chirp);
- void t808Kick_setToneNoiseMix (t808Kick* const, float toneNoiseMix);
- void t808Kick_setNoiseFilterFreq (t808Kick* const, float noiseFilterFreq);
- void t808Kick_setNoiseFilterQ (t808Kick* const, float noiseFilterQ);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_INSTRUMENTS_H_INCLUDED
-
-//==============================================================================
-
-
-
--- a/LEAF/Inc/leaf-math.h
+++ /dev/null
@@ -1,179 +1,0 @@
-/*==============================================================================
-
- leaf-math.h
- Created: 22 Jan 2017 7:02:56pm
- Author: Michael R Mulshine
-
- ==============================================================================*/
-
-#ifndef LEAF_MATH_H_INCLUDED
-#define LEAF_MATH_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "leaf-global.h"
-#include "math.h"
-#include "stdint.h"
-#include "stdlib.h"
-
- //==============================================================================
-
- //==============================================================================
-
- typedef enum oBool
- {
- OTRUE = 1,
- OFALSE = 0
- }oBool;
-
- // Allows for bitwise operations on floats
- union unholy_t { /* a union between a float and an integer */
- float f;
- int i;
- };
-
-#define SQRT8 2.82842712475f
-#define WSCALE 1.30612244898f
-#define PI (3.14159265358979f)
-#define TWO_PI (2 * PI)
-
-#define VSF 1.0e-38f
-
-#define MAX_DELAY 8192
-#define INV_128 0.0078125f
-
-#define INV_20 0.05f
-#define INV_40 0.025f
-#define INV_80 0.0125f
-#define INV_160 0.00625f
-#define INV_320 0.003125f
-#define INV_640 0.0015625f
-#define INV_1280 0.00078125f
-#define INV_2560 0.000390625f
-#define INV_5120 0.0001953125f
-#define INV_10240 0.00009765625f
-#define INV_20480 0.000048828125f
-
-
-#define INV_TWELVE 0.0833333333f
-#define INV_440 0.0022727273f
-
-#define LOG2 0.3010299957f
-#define INV_LOG2 3.321928095f
-
-#define SOS_M 343.0f
-#define TWO_TO_5 32.0f
-#define INV_TWO_TO_5 0.03125f
-#define TWO_TO_7 128.f
-#define INV_TWO_TO_7 0.0078125f
-#define TWO_TO_8 256.f
-#define INV_TWO_TO_8 0.00390625f
-#define TWO_TO_9 512.f
-#define INV_TWO_TO_9 0.001953125f
-#define TWO_TO_10 1024.f
-#define INV_TWO_TO_10 0.0009765625f
-#define TWO_TO_11 2048.f
-#define INV_TWO_TO_11 0.00048828125f
-#define TWO_TO_12 4096.f
-#define INV_TWO_TO_12 0.00024414062f
-#define TWO_TO_15 32768.f
-#define TWO_TO_16 65536.f
-#define INV_TWO_TO_15 0.00003051757f
-#define INV_TWO_TO_16 0.00001525878f
-#define TWO_TO_16_MINUS_ONE 65535.0f
-#define TWO_TO_23 8388608.0f
-#define INV_TWO_TO_23 0.00000011920929f
-#define TWO_TO_31 2147483648.0f
-#define INV_TWO_TO_31 0.000000000465661f
-#define TWO_TO_32 4294967296.0f
-#define INV_TWO_TO_32 0.000000000232831f
-
-
-#define LOGTEN 2.302585092994
-
- // Jones shaper
- float LEAF_shaper (float input, float m_drive);
- float LEAF_reedTable (float input, float offset, float slope);
-
- float LEAF_reduct (float input, float ratio);
- float LEAF_round (float input, float rnd);
- float LEAF_bitwise_xor(float input, uint32_t op);
-
- float LEAF_reduct (float input, float ratio);
- float LEAF_round (float input, float rnd);
- float LEAF_bitwise_xor(float input, uint32_t op);
-
- float LEAF_clip (float min, float val, float max);
- int LEAF_clipInt (int min, int val, int max);
- float LEAF_softClip (float val, float thresh);
- oBool LEAF_isPrime (uint64_t number );
-
- float LEAF_midiToFrequency (float f);
- float LEAF_frequencyToMidi(float f);
-
- void LEAF_generate_sine (float* buffer, int size);
- void LEAF_generate_sawtooth (float* buffer, float basefreq, int size);
- void LEAF_generate_triangle (float* buffer, float basefreq, int size);
- void LEAF_generate_square (float* buffer, float basefreq, int size);
-
- // dope af
- float LEAF_chebyshevT(float in, int n);
- float LEAF_CompoundChebyshevT(float in, int n, float* amps);
-
- // Hermite interpolation
- float LEAF_interpolate_hermite (float A, float B, float C, float D, float t);
- float LEAF_interpolate_hermite_x(float yy0, float yy1, float yy2, float yy3, float xx);
- float LEAF_interpolation_linear (float A, float B, float t);
-
- float interpolate3max(float *buf, const int peakindex);
- float interpolate3phase(float *buf, const int peakindex);
-
- // alternative implementation for abs()
- // REQUIRES: 32 bit integers
- int fastabs_int(int in);
-
- // alternative implementation for abs()
- // REQUIRES: 32 bit floats
- float fastabsf(float f);
-
- float fastexp2f(float f);
-
-
- void LEAF_crossfade(float fade, float* volumes);
-
-
-
- float fast_mtof(float f);
-
- float fastexpf(float x);
-
- float fasterexpf(float x);
-
- float mtof(float f);
-
- float fast_mtof(float f);
-
- float faster_mtof(float f);
-
- float ftom(float f);
-
- float powtodb(float f);
-
- float rmstodb(float f);
-
- float dbtopow(float f);
-
- float dbtorms(float f);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_MATH_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-mempool.h
+++ /dev/null
@@ -1,127 +1,0 @@
-/*==============================================================================
-
- In short, mpool is distributed under so called "BSD license",
-
- Copyright (c) 2009-2010 Tatsuhiko Kubo <cubicdaiya@gmail.com>
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- * Neither the name of the authors nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- written by C99 style
- ==============================================================================*/
-
-#ifndef LEAF_MPOOL_H_INCLUDED
-#define LEAF_MPOOL_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdbool.h>
-
- //==============================================================================
-
-#define MPOOL_ALIGN_SIZE (8)
-
- //#define size_t unsigned long
-
- /**
- * memory pool structure
- */
-
- // node of free list
- typedef struct mpool_node_t {
- void *pool; // memory pool field
- struct mpool_node_t *next; // next node pointer
- struct mpool_node_t *prev; // prev node pointer
- size_t size;
- } mpool_node_t;
-
- typedef struct mpool_t {
- void* mpool; // start of the mpool
- size_t usize; // used size of the pool
- size_t msize; // max size of the pool
- mpool_node_t* head; // first node of memory pool free list
- } mpool_t;
-
- void mpool_create (char* memory, size_t size, mpool_t* pool);
-
- void* mpool_alloc(size_t size, mpool_t* pool);
- void* mpool_calloc(size_t asize, mpool_t* pool);
-
- void mpool_free(void* ptr, mpool_t* pool);
-
- size_t mpool_get_size(mpool_t* pool);
- size_t mpool_get_used(mpool_t* pool);
-
- void leaf_pool_init(char* memory, size_t size);
-
- void* leaf_alloc(size_t size);
- void* leaf_calloc(size_t size);
-
- void leaf_free(void* ptr);
-
- size_t leaf_pool_get_size(void);
- size_t leaf_pool_get_used(void);
-
- void* leaf_pool_get_pool(void);
-
- void leaf_mempool_overrun(void);
-
- // User object for creating additional mempools
-
- typedef struct _tMempool
- {
- mpool_t pool;
- } _tMempool;
-
- typedef _tMempool* tMempool;
-
- void tMempool_init (tMempool* const, char* memory, size_t size);
- void tMempool_free (tMempool* const);
- void tMempool_initToPool (tMempool* const, char* memory, size_t size, tMempool* const);
- void tMempool_freeFromPool (tMempool* const, tMempool* const);
-
- //==============================================================================
-
- extern tMempool leaf_mempool;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_MPOOL_H
-
-//==============================================================================
-
-
-
--- a/LEAF/Inc/leaf-midi.h
+++ /dev/null
@@ -1,133 +1,0 @@
-/*==============================================================================
-
- leaf-midi.h
- Created: 30 Nov 2018 11:29:26am
- Author: airship
-
- ==============================================================================*/
-
-#ifndef LEAF_MIDI_H_INCLUDED
-#define LEAF_MIDI_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-mempool.h"
-#include "leaf-math.h"
-#include "leaf-envelopes.h"
-
- //==============================================================================
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- // STACK implementation (fixed size)
-#define STACK_SIZE 128
- typedef struct _tStack
- {
- int data[STACK_SIZE];
- uint16_t pos;
- uint16_t size;
- uint16_t capacity;
- oBool ordered;
-
- } _tStack;
-
- typedef _tStack* tStack;
-
- void tStack_init (tStack* const);
- void tStack_free (tStack* const);
- void tStack_initToPool (tStack* const, tMempool* const);
- void tStack_freeFromPool (tStack* const, tMempool* const);
-
- void tStack_setCapacity (tStack* const, uint16_t cap);
- int tStack_addIfNotAlreadyThere (tStack* const, uint16_t item);
- void tStack_add (tStack* const, uint16_t item);
- int tStack_remove (tStack* const, uint16_t item);
- void tStack_clear (tStack* const);
- int tStack_first (tStack* const);
- int tStack_getSize (tStack* const);
- int tStack_contains (tStack* const, uint16_t item);
- int tStack_next (tStack* const);
- int tStack_get (tStack* const, int which);
-
- /* tPoly */
- typedef struct _tPoly
- {
- tStack stack;
- tStack orderStack;
-
- tRamp* ramps;
- float* rampVals;
- oBool* firstReceived;
- float glideTime;
- oBool pitchGlideIsActive;
-
- int numVoices;
- int maxNumVoices;
-
- //int voices[POLY_NUM_MAX_VOICES][2];
- int** voices;
-
- int notes[128][2];
-
- int CCs[128];
-
- uint8_t CCsRaw[128];
-
- int lastVoiceToChange;
-
- float pitchBend;
- tRamp pitchBendRamp;
-
- int currentNote;
- int currentVoice;
- int currentVelocity;
- int maxLength;
-
- } _tPoly;
-
- typedef _tPoly* tPoly;
-
- /* MPoly*/
- void tPoly_init (tPoly* const, int maxNumVoices);
- void tPoly_free (tPoly* const);
- void tPoly_initToPool (tPoly* const, int maxNumVoices, tMempool* const);
- void tPoly_freeFromPool (tPoly* const, tMempool* const);
-
- //ADDING A NOTE
- int tPoly_noteOn (tPoly* const, int note, uint8_t vel);
- int tPoly_noteOff (tPoly* const, uint8_t note);
- void tPoly_orderedAddToStack (tPoly* const, uint8_t noteVal);
- void tPoly_setNumVoices (tPoly* const, uint8_t numVoices);
-
- void tPoly_setPitchBend (tPoly* const, float pitchBend);
- void tPoly_setPitchGlideActive (tPoly* const, oBool isActive);
- void tPoly_setPitchGlideTime (tPoly* const, float t);
- void tPoly_setBendGlideTime (tPoly* const polyh, float t);
- void tPoly_setBendSamplesPerTick (tPoly* const polyh, float t);
- void tPoly_tickPitch (tPoly* const);
- void tPoly_tickPitchGlide (tPoly* const);
- void tPoly_tickPitchBend (tPoly* const);
-
- int tPoly_getNumVoices (tPoly* const);
- int tPoly_getNumActiveVoices (tPoly* const);
- float tPoly_getPitch (tPoly* const, uint8_t voice);
- int tPoly_getKey (tPoly* const, uint8_t voice);
- int tPoly_getVelocity (tPoly* const, uint8_t voice);
- int tPoly_isOn (tPoly* const, uint8_t voice);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_MIDI_H_INCLUDED
-
-//==============================================================================
-
-
--- a/LEAF/Inc/leaf-oscillators.h
+++ /dev/null
@@ -1,208 +1,0 @@
-/*==============================================================================
- leaf-oscillators.h
- Created: 20 Jan 2017 12:00:58pm
- Author: Michael R Mulshine
- ==============================================================================*/
-
-#ifndef LEAF_OSCILLATORS_H_INCLUDED
-#define LEAF_OSCILLATORS_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-filters.h"
-
- //==============================================================================
-
- /* tCycle: Cycle/Sine waveform. Wavetable synthesis.*/
- typedef struct _tCycle
- {
- // Underlying phasor
- float phase;
- float inc,freq;
-
- } _tCycle;
-
- typedef _tCycle* tCycle;
-
- void tCycle_init (tCycle* const);
- void tCycle_free (tCycle* const);
- void tCycle_initToPool (tCycle* const, tMempool* const);
- void tCycle_freeFromPool (tCycle* const, tMempool* const);
-
- float tCycle_tick (tCycle* const);
- int tCycle_setFreq (tCycle* const, float freq);
-
- //==============================================================================
-
- /* tTriangle: Anti-aliased Triangle waveform using wavetable interpolation. Wavetables constructed from sine components. */
- typedef struct _tTriangle
- {
- // Underlying phasor
- float phase;
- float inc,freq;
-
- } _tTriangle;
-
- typedef _tTriangle* tTriangle;
-
- void tTriangle_init (tTriangle* const);
- void tTriangle_free (tTriangle* const);
- void tTriangle_initToPool (tTriangle* const, tMempool* const);
- void tTriangle_freeFromPool (tTriangle* const, tMempool* const);
-
- float tTriangle_tick (tTriangle* const);
- int tTriangle_setFreq (tTriangle* const, float freq);
-
- //==============================================================================
-
- /* tSquare: Anti-aliased Square waveform using wavetable interpolation. Wavetables constructed from sine components. */
- typedef struct _tSquare
- {
- // Underlying phasor
- float phase;
- float inc,freq;
-
- } _tSquare;
-
- typedef _tSquare* tSquare;
-
- void tSquare_init (tSquare* const);
- void tSquare_free (tSquare* const);
- void tSquare_initToPool (tSquare* const, tMempool* const);
- void tSquare_freeFromPool(tSquare* const, tMempool* const);
-
- float tSquare_tick (tSquare* const);
- int tSquare_setFreq (tSquare* const, float freq);
-
- //==============================================================================
-
- /* tSawtooth: Anti-aliased Sawtooth waveform using wavetable interpolation. Wavetables constructed from sine components. */
- typedef struct _tSawtooth
- {
- // Underlying phasor
- float phase;
- float inc,freq;
-
- } _tSawtooth;
-
- typedef _tSawtooth* tSawtooth;
-
- void tSawtooth_init (tSawtooth* const);
- void tSawtooth_free (tSawtooth* const);
- void tSawtooth_initToPool (tSawtooth* const, tMempool* const);
- void tSawtooth_freeFromPool (tSawtooth* const, tMempool* const);
-
- float tSawtooth_tick (tSawtooth* const);
- int tSawtooth_setFreq (tSawtooth* const, float freq);
-
- //==============================================================================
-
- /* tPhasor: Aliasing phasor [0.0, 1.0) */
- typedef struct _tPhasor
- {
- float phase;
- float inc,freq;
-
- } _tPhasor;
-
- typedef _tPhasor* tPhasor;
-
- void tPhasor_init (tPhasor* const);
- void tPhasor_free (tPhasor* const);
- void tPhasor_initToPool (tPhasor* const, tMempool* const);
- void tPhasor_freeFromPool(tPhasor* const, tMempool* const);
-
- float tPhasor_tick (tPhasor* const);
- int tPhasor_setFreq (tPhasor* const, float freq);
-
- //==============================================================================
-
- /* tNoise. WhiteNoise, PinkNoise. */
- typedef enum NoiseType
- {
- WhiteNoise=0,
- PinkNoise,
- NoiseTypeNil,
- } NoiseType;
-
- typedef struct _tNoise
- {
- NoiseType type;
- float pinkb0, pinkb1, pinkb2;
- float(*rand)(void);
-
- } _tNoise;
-
- typedef _tNoise* tNoise;
-
- void tNoise_init (tNoise* const, NoiseType type);
- void tNoise_free (tNoise* const);
- void tNoise_initToPool (tNoise* const, NoiseType type, tMempool* const);
- void tNoise_freeFromPool (tNoise* const, tMempool* const);
-
- float tNoise_tick (tNoise* const);
-
- //==============================================================================
-
- /* tNeuron */
- typedef enum NeuronMode
- {
- NeuronNormal = 0,
- NeuronTanh,
- NeuronAaltoShaper,
- NeuronModeNil
- } NeuronMode;
-
- typedef struct _tNeuron
- {
- tPoleZero f;
-
- NeuronMode mode;
-
- float voltage, current;
- float timeStep;
-
- float alpha[3];
- float beta[3];
- float rate[3];
- float V[3];
- float P[3];
- float gK, gN, gL, C;
- } _tNeuron;
-
- typedef _tNeuron* tNeuron;
-
- void tNeuron_init (tNeuron* const);
- void tNeuron_free (tNeuron* const);
- void tNeuron_initToPool (tNeuron* const, tMempool* const);
- void tNeuron_freeFromPool(tNeuron* const, tMempool* const);
-
- void tNeuron_reset (tNeuron* const);
- float tNeuron_tick (tNeuron* const);
- void tNeuron_setMode (tNeuron* const, NeuronMode mode);
- void tNeuron_setCurrent (tNeuron* const, float current);
- void tNeuron_setK (tNeuron* const, float K);
- void tNeuron_setL (tNeuron* const, float L);
- void tNeuron_setN (tNeuron* const, float N);
- void tNeuron_setC (tNeuron* const, float C);
- void tNeuron_setV1 (tNeuron* const, float V1);
- void tNeuron_setV2 (tNeuron* const, float V2);
- void tNeuron_setV3 (tNeuron* const, float V3);
- void tNeuron_setTimeStep (tNeuron* const, float timestep);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_OSCILLATORS_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-physical.h
+++ /dev/null
@@ -1,251 +1,0 @@
-/*
- ==============================================================================
-
- leaf-physical.h
- Created: 30 Nov 2018 10:41:55am
- Author: airship
-
- ==============================================================================
- */
-
-#ifndef LEAF_PHYSICAL_H_INCLUDED
-#define LEAF_PHYSICAL_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-delay.h"
-#include "leaf-filters.h"
-#include "leaf-oscillators.h"
-#include "leaf-envelopes.h"
-#include "leaf-dynamics.h"
-
- //==============================================================================
-
- /* Karplus Strong model */
- typedef struct _tPluck
- {
- tAllpassDelay delayLine; // Allpass or Linear?? big difference...
- tOneZero loopFilter;
- tOnePole pickFilter;
- tNoise noise;
-
- float lastOut;
- float loopGain;
- float lastFreq;
-
- float sr;
-
- } _tPluck;
-
- typedef _tPluck* tPluck;
-
- void tPluck_init (tPluck* const, float lowestFrequency); //float delayBuff[DELAY_LENGTH]);
- void tPluck_free (tPluck* const);
- void tPluck_initToPool (tPluck* const, float lowestFrequency, tMempool* const);
- void tPluck_freeFromPool (tPluck* const, tMempool* const);
-
- float tPluck_tick (tPluck* const);
-
- // Pluck the string.
- void tPluck_pluck (tPluck* const, float amplitude);
-
- // Start a note with the given frequency and amplitude.;
- void tPluck_noteOn (tPluck* const, float frequency, float amplitude );
-
- // Stop a note with the given amplitude (speed of decay).
- void tPluck_noteOff (tPluck* const, float amplitude );
-
- // Set instrument parameters for a particular frequency.
- void tPluck_setFrequency (tPluck* const, float frequency );
-
- // Perform the control change specified by \e number and \e value (0.0 - 128.0).
- void tPluck_controlChange (tPluck* const, int number, float value);
-
- // tPluck Utilities.
- float tPluck_getLastOut (tPluck* const);
-
- //==============================================================================
-
- typedef enum SKControlType
- {
- SKPickPosition = 0,
- SKStringDamping,
- SKDetune,
- SKControlTypeNil
- } SKControlType;
-
- /* Stif Karplus Strong model */
- typedef struct _tKarplusStrong
- {
- tAllpassDelay delayLine;
- tLinearDelay combDelay;
- tOneZero filter;
- tNoise noise;
- tBiQuad biquad[4];
-
- uint32_t length;
- float loopGain;
- float baseLoopGain;
- float lastFrequency;
- float lastLength;
- float stretching;
- float pluckAmplitude;
- float pickupPosition;
-
- float lastOut;
-
- } _tKarplusStrong;
-
- typedef _tKarplusStrong* tKarplusStrong;
-
- void tKarplusStrong_init (tKarplusStrong* const, float lowestFrequency); // float delayBuff[2][DELAY_LENGTH]);
- void tKarplusStrong_free (tKarplusStrong* const);
- void tKarplusStrong_initToPool (tKarplusStrong* const, float lowestFrequency, tMempool* const);
- void tKarplusStrong_freeFromPool (tKarplusStrong* const, tMempool* const);
-
- float tKarplusStrong_tick (tKarplusStrong* const);
-
- // Pluck the string.
- void tKarplusStrong_pluck (tKarplusStrong* const, float amplitude);
-
- // Start a note with the given frequency and amplitude.;
- void tKarplusStrong_noteOn (tKarplusStrong* const, float frequency, float amplitude );
-
- // Stop a note with the given amplitude (speed of decay).
- void tKarplusStrong_noteOff (tKarplusStrong* const, float amplitude );
-
- // Set instrument parameters for a particular frequency.
- void tKarplusStrong_setFrequency (tKarplusStrong* const, float frequency );
-
- // Perform the control change specified by \e number and \e value (0.0 - 128.0).
- // Use SKPickPosition, SKStringDamping, or SKDetune for type.
- void tKarplusStrong_controlChange (tKarplusStrong* const, SKControlType type, float value);
-
- // Set the stretch "factor" of the string (0.0 - 1.0).
- void tKarplusStrong_setStretch (tKarplusStrong* const, float stretch );
-
- // Set the pluck or "excitation" position along the string (0.0 - 1.0).
- void tKarplusStrong_setPickupPosition (tKarplusStrong* const, float position );
-
- // Set the base loop gain.
- void tKarplusStrong_setBaseLoopGain (tKarplusStrong* const, float aGain );
-
- // tKarplusStrong utilities.
- float tKarplusStrong_getLastOut (tKarplusStrong* const);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* Simple Living String */
- typedef struct _tSimpleLivingString {
- float freq, waveLengthInSamples; // the frequency of the string, determining delay length
- float dampFreq; // frequency for the bridge LP filter, in Hz
- float decay; // amplitude damping factor for the string (only active in mode 0)
- float levMode;
- float curr;
- tLinearDelay delayLine;
- tOnePole bridgeFilter;
- tHighpass DCblocker;
- tFeedbackLeveler fbLev;
- tExpSmooth wlSmooth;
- } _tSimpleLivingString;
-
- typedef _tSimpleLivingString* tSimpleLivingString;
-
- void tSimpleLivingString_init (tSimpleLivingString* const, float freq, float dampFreq,
- float decay, float targetLev, float levSmoothFactor,
- float levStrength, int levMode);
- void tSimpleLivingString_free (tSimpleLivingString* const);
- void tSimpleLivingString_initToPool (tSimpleLivingString* const, float freq, float dampFreq,
- float decay, float targetLev, float levSmoothFactor,
- float levStrength, int levMode, tMempool* const);
- void tSimpleLivingString_freeFromPool (tSimpleLivingString* const, tMempool* const);
-
- float tSimpleLivingString_tick (tSimpleLivingString* const, float input);
- float tSimpleLivingString_sample (tSimpleLivingString* const);
- void tSimpleLivingString_setFreq (tSimpleLivingString* const, float freq);
- void tSimpleLivingString_setWaveLength (tSimpleLivingString* const, float waveLength); // in samples
- void tSimpleLivingString_setDampFreq (tSimpleLivingString* const, float dampFreq);
- void tSimpleLivingString_setDecay (tSimpleLivingString* const, float decay); // should be near 1.0
- void tSimpleLivingString_setTargetLev (tSimpleLivingString* const, float targetLev);
- void tSimpleLivingString_setLevSmoothFactor (tSimpleLivingString* const, float levSmoothFactor);
- void tSimpleLivingString_setLevStrength (tSimpleLivingString* const, float levStrength);
- void tSimpleLivingString_setLevMode (tSimpleLivingString* const, int levMode);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* Living String */
- typedef struct _tLivingString {
- float freq, waveLengthInSamples; // the frequency of the whole string, determining delay length
- float pickPos; // the pick position, dividing the string in two, in ratio
- float prepIndex; // the amount of pressure on the pickpoint of the string (near 0=soft obj, near 1=hard obj)
- float dampFreq; // frequency for the bridge LP filter, in Hz
- float decay; // amplitude damping factor for the string (only active in mode 0)
- float levMode;
- float curr;
- tLinearDelay delLF,delUF,delUB,delLB; // delay for lower/upper/forward/backward part of the waveguide model
- tOnePole bridgeFilter, nutFilter, prepFilterU, prepFilterL;
- tHighpass DCblockerL, DCblockerU;
- tFeedbackLeveler fbLevU, fbLevL;
- tExpSmooth wlSmooth, ppSmooth;
- } _tLivingString;
-
- typedef _tLivingString* tLivingString;
-
- void tLivingString_init (tLivingString* const, float freq, float pickPos, float prepIndex,
- float dampFreq, float decay, float targetLev, float levSmoothFactor,
- float levStrength, int levMode);
- void tLivingString_free (tLivingString* const);
- void tLivingString_initToPool (tLivingString* const, float freq, float pickPos, float prepIndex,
- float dampFreq, float decay, float targetLev, float levSmoothFactor,
- float levStrength, int levMode, tMempool* const);
- void tLivingString_freeFromPool (tLivingString* const, tMempool* const);
-
- float tLivingString_tick (tLivingString* const, float input);
- float tLivingString_sample (tLivingString* const);
- void tLivingString_setFreq (tLivingString* const, float freq);
- void tLivingString_setWaveLength (tLivingString* const, float waveLength); // in samples
- void tLivingString_setPickPos (tLivingString* const, float pickPos);
- void tLivingString_setPrepIndex (tLivingString* const, float prepIndex);
- void tLivingString_setDampFreq (tLivingString* const, float dampFreq);
- void tLivingString_setDecay (tLivingString* const, float decay); // should be near 1.0
- void tLivingString_setTargetLev (tLivingString* const, float targetLev);
- void tLivingString_setLevSmoothFactor (tLivingString* const, float levSmoothFactor);
- void tLivingString_setLevStrength (tLivingString* const, float levStrength);
- void tLivingString_setLevMode (tLivingString* const, int levMode);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- //Reed Table - borrowed from STK
- typedef struct _tReedTable {
- float offset, slope;
- } _tReedTable;
-
- typedef _tReedTable* tReedTable;
-
- void tReedTable_init (tReedTable* const, float offset, float slope);
- void tReedTable_free (tReedTable* const);
- void tReedTable_initToPool (tReedTable* const, float offset, float slope, tMempool* const);
- void tReedTable_freeFromPool (tReedTable* const, tMempool* const);
-
- float tReedTable_tick (tReedTable* const, float input);
- float tReedTable_tanh_tick (tReedTable* const, float input); //tanh softclip version of reed table - replacing the hard clip in original stk code
- void tReedTable_setOffset (tReedTable* const, float offset);
- void tReedTable_setSlope (tReedTable* const, float slope);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_PHYSICAL_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-reverb.h
+++ /dev/null
@@ -1,167 +1,0 @@
-/*==============================================================================
-
- leaf-reverb.h
- Created: 20 Jan 2017 12:02:04pm
- Author: Michael R Mulshine
-
- ==============================================================================*/
-
-#ifndef LEAF_REVERB_H_INCLUDED
-#define LEAF_REVERB_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-delay.h"
-#include "leaf-filters.h"
-#include "leaf-oscillators.h"
-
- //==============================================================================
-
- /* PRCReverb: Reverb, reimplemented from STK (Cook and Scavone). */
- typedef struct _tPRCReverb
- {
- float mix, t60;
-
- float inv_441;
-
- tDelay allpassDelays[2];
- tDelay combDelay;
- float allpassCoeff;
- float combCoeff;
-
- float lastIn, lastOut;
-
- } _tPRCReverb;
-
- typedef _tPRCReverb* tPRCReverb;
-
- void tPRCReverb_init (tPRCReverb* const, float t60);
- void tPRCReverb_free (tPRCReverb* const);
- void tPRCReverb_initToPool (tPRCReverb* const, float t60, tMempool* const);
- void tPRCReverb_freeFromPool (tPRCReverb* const, tMempool* const);
-
- void tPRCReverb_clear (tPRCReverb* const);
- float tPRCReverb_tick (tPRCReverb* const, float input);
-
- // Set reverb time in seconds.
- void tPRCReverb_setT60 (tPRCReverb* const, float t60);
-
- // Set mix between dry input and wet output signal.
- void tPRCReverb_setMix (tPRCReverb* const, float mix);
-
- //==============================================================================
-
- /* NReverb: Reverb, reimplemented from STK (Cook and Scavone). */
- typedef struct _tNReverb
- {
- float mix, t60;
-
- float inv_sr, inv_441;
-
- tLinearDelay allpassDelays[8];
- tLinearDelay combDelays[6];
- float allpassCoeff;
- float combCoeffs[6];
- float lowpassState;
-
- float lastIn, lastOut;
-
- } _tNReverb;
-
- typedef _tNReverb* tNReverb;
-
- void tNReverb_init (tNReverb* const, float t60);
- void tNReverb_free (tNReverb* const);
- void tNReverb_initToPool (tNReverb* const, float t60, tMempool* const);
- void tNReverb_freeFromPool (tNReverb* const, tMempool* const);
-
- void tNReverb_clear (tNReverb* const);
- float tNReverb_tick (tNReverb* const, float input);
- void tNReverb_tickStereo (tNReverb* const rev, float input, float* output);
-
- // Set reverb time in seconds.
- void tNReverb_setT60 (tNReverb* const, float t60);
-
- // Set mix between dry input and wet output signal.
- void tNReverb_setMix (tNReverb* const, float mix);
-
- //==============================================================================
-
- typedef struct _tDattorroReverb
- {
- float predelay;
- float input_filter;
- float feedback_filter;
- float feedback_gain;
- float mix;
- uint32_t frozen;
-
- float size, size_max, t;
-
- float f1_delay_2_last,
- f2_delay_2_last;
-
- float f1_last,
- f2_last;
-
- // INPUT
- tTapeDelay in_delay;
- tOnePole in_filter;
- tAllpass in_allpass[4];
-
- // FEEDBACK 1
- tAllpass f1_allpass;
- tTapeDelay f1_delay_1;
- tOnePole f1_filter;
- tTapeDelay f1_delay_2;
- tTapeDelay f1_delay_3;
- tHighpass f1_hp;
-
- tCycle f1_lfo;
-
- // FEEDBACK 2
- tAllpass f2_allpass;
- tTapeDelay f2_delay_1;
- tOnePole f2_filter;
- tTapeDelay f2_delay_2;
- tTapeDelay f2_delay_3;
- tHighpass f2_hp;
-
- tCycle f2_lfo;
-
- } _tDattorroReverb;
-
- typedef _tDattorroReverb* tDattorroReverb;
-
- void tDattorroReverb_init (tDattorroReverb* const);
- void tDattorroReverb_free (tDattorroReverb* const);
- void tDattorroReverb_initToPool (tDattorroReverb* const, tMempool* const);
- void tDattorroReverb_freeFromPool (tDattorroReverb* const, tMempool* const);
-
- void tDattorroReverb_clear (tDattorroReverb* const);
- float tDattorroReverb_tick (tDattorroReverb* const, float input);
- void tDattorroReverb_tickStereo (tDattorroReverb* const rev, float input, float* output);
- void tDattorroReverb_setMix (tDattorroReverb* const, float mix);
- void tDattorroReverb_setFreeze (tDattorroReverb* const rev, uint32_t freeze);
- void tDattorroReverb_setHP (tDattorroReverb* const, float freq);
- void tDattorroReverb_setSize (tDattorroReverb* const, float size);
- void tDattorroReverb_setInputDelay (tDattorroReverb* const, float preDelay);
- void tDattorroReverb_setInputFilter (tDattorroReverb* const, float freq);
- void tDattorroReverb_setFeedbackFilter (tDattorroReverb* const, float freq);
- void tDattorroReverb_setFeedbackGain (tDattorroReverb* const, float gain);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_REVERB_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-sampling.h
+++ /dev/null
@@ -1,176 +1,0 @@
-/*==============================================================================
-
- leaf-sampling.h
- Created: 23 Jan 2019 11:22:09am
- Author: Mike Mulshine
-
- ==============================================================================*/
-
-
-#ifndef LEAF_SAMPLING_H_INCLUDED
-#define LEAF_SAMPLING_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-envelopes.h"
-#include "leaf-mempool.h"
-#include "leaf-analysis.h"
-
- //==============================================================================
-
- typedef enum RecordMode
- {
- RecordOneShot = 0,
- RecordLoop,
- RecordModeNil
- } RecordMode;
-
- typedef struct _tBuffer
- {
- float* buff;
-
- uint32_t idx;
- uint32_t bufferLength;
- uint32_t recordedLength;
- RecordMode mode;
-
- int active;
-
- } _tBuffer;
-
- typedef _tBuffer* tBuffer;
-
- void tBuffer_init (tBuffer* const, uint32_t length);
- void tBuffer_free (tBuffer* const);
- void tBuffer_initToPool (tBuffer* const, uint32_t length, tMempool* const);
- void tBuffer_freeFromPool (tBuffer* const, tMempool* const);
-
- void tBuffer_tick (tBuffer* const, float sample);
-
- void tBuffer_read (tBuffer* const, float* buff, uint32_t len);
-
- float tBuffer_get (tBuffer* const, int idx);
-
- void tBuffer_record (tBuffer* const);
- void tBuffer_stop (tBuffer* const);
- int tBuffer_getRecordPosition (tBuffer* const);
-
- void tBuffer_setRecordMode (tBuffer* const, RecordMode mode);
-
- void tBuffer_clear (tBuffer* const);
-
- uint32_t tBuffer_getBufferLength (tBuffer* const);
- uint32_t tBuffer_getRecordedLength (tBuffer* const sb);
-
- //==============================================================================
-
- typedef enum PlayMode
- {
- PlayNormal,
- PlayLoop,
- PlayBackAndForth,
- PlayModeNil
- } PlayMode;
-
- typedef struct _tSampler
- {
- tBuffer samp;
-
- tRamp gain;
-
- float idx;
- float inc;
- float last;
- float iinc;
- int8_t dir;
- int8_t flip;
- int8_t bnf;
-
- int32_t start, targetstart;
- int32_t end, targetend;
-
- uint32_t len;
- uint32_t cfxlen;
- float numticks;
- PlayMode mode;
- int retrigger;
-
- int active;
-
- } _tSampler;
-
- typedef _tSampler* tSampler;
-
- void tSampler_init (tSampler* const, tBuffer* const);
- void tSampler_free (tSampler* const);
- void tSampler_initToPool (tSampler* const, tBuffer* const, tMempool* const);
- void tSampler_freeFromPool (tSampler* const, tMempool* const);
-
- float tSampler_tick (tSampler* const);
-
- void tSampler_setSample (tSampler* const, tBuffer* const);
-
- void tSampler_setMode (tSampler* const, PlayMode mode);
-
- void tSampler_play (tSampler* const);
- void tSampler_stop (tSampler* const);
-
- void tSampler_setStart (tSampler* const, int32_t start);
- void tSampler_setEnd (tSampler* const, int32_t end);
-
- static void handleStartEndChange (tSampler* const sp);
-
- void tSampler_setCrossfadeLength (tSampler* const sp, uint32_t length);
-
- void tSampler_setRate (tSampler* const, float rate);
-
- //==============================================================================
-
- typedef struct _tAutoSampler
- {
- tSampler sampler;
- tEnvelopeFollower ef;
- uint32_t windowSize;
- float threshold;
- float previousPower;
- uint32_t sampleCounter;
- uint32_t powerCounter;
- uint8_t sampleTriggered;
- } _tAutoSampler;
-
- typedef _tAutoSampler* tAutoSampler;
-
- void tAutoSampler_init (tAutoSampler* const, tBuffer* const);
- void tAutoSampler_free (tAutoSampler* const);
- void tAutoSampler_initToPool (tAutoSampler* const, tBuffer* const, tMempool* const);
- void tAutoSampler_freeFromPool (tAutoSampler* const, tMempool* const);
-
- float tAutoSampler_tick (tAutoSampler* const, float input);
-
- void tAutoSampler_setBuffer (tAutoSampler* const, tBuffer* const);
-
- void tAutoSampler_setMode (tAutoSampler* const, PlayMode mode);
-
- void tAutoSampler_play (tAutoSampler* const);
- void tAutoSampler_stop (tAutoSampler* const);
-
- void tAutoSampler_setThreshold (tAutoSampler* const, float thresh);
- void tAutoSampler_setWindowSize (tAutoSampler* const, uint32_t size);
- void tAutoSampler_setCrossfadeLength (tAutoSampler* const, uint32_t length);
-
- void tAutoSampler_setRate (tAutoSampler* const, float rate);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_SAMPLING_H_INCLUDED
-
-//==============================================================================
--- a/LEAF/Inc/leaf-tables.h
+++ /dev/null
@@ -1,100 +1,0 @@
-/*==============================================================================
-
- leaf-tables.h
- Created: 4 Dec 2016 9:42:41pm
- Author: Michael R Mulshine
-
-==============================================================================*/
-
-#ifndef LEAF_TABLES_H_INCLUDED
-#define LEAF_TABLES_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-//==============================================================================
-
-#include "leaf-math.h"
-
-//==============================================================================
-
-
-#define SINE_TABLE_SIZE 2048
-#define SAW_TABLE_SIZE 2048
-#define SQR_TABLE_SIZE 2048
-#define TRI_TABLE_SIZE 2048
-#define EXP_DECAY_TABLE_SIZE 65536
-#define ATTACK_DECAY_INC_TABLE_SIZE 65536
-#define TANH1_TABLE_SIZE 65536
-#define DECAY_COEFF_TABLE_SIZE 4096
-#define MTOF1_TABLE_SIZE 4096
-#define FILTERTAN_TABLE_SIZE 4096
-
-#define SHAPER1_TABLE_SIZE 65536
-extern const float shaper1[SHAPER1_TABLE_SIZE];
-
-#define COEFFS_SIZE 32
-extern const float* firCoeffs[COEFFS_SIZE];
-extern const float firNumTaps[COEFFS_SIZE];
-extern const float fir2XLow[32];
-extern const float fir4XLow[64];
-extern const float fir8XLow[64];
-extern const float fir16XLow[128];
-extern const float fir32XLow[256];
-extern const float fir64XLow[256];
-extern const float fir2XHigh[128];
-extern const float fir4XHigh[256];
-extern const float fir8XHigh[256];
-extern const float fir16XHigh[512];
-extern const float fir32XHigh[512];
-extern const float fir64XHigh[1024];
-
-typedef enum TableName
-{
- T20 = 0,
- T40,
- T80,
- T160,
- T320,
- T640,
- T1280,
- T2560,
- T5120,
- T10240,
- T20480,
- TableNameNil
-} TableName;
-
-// mtof lookup table based on input range [0.0,1.0) in 4096 increments - midi frequency values scaled between m25 and m134 (from the Snyderphonics DrumBox code)
-
-extern const float exp_decay[EXP_DECAY_TABLE_SIZE];
-extern const float attack_decay_inc[ATTACK_DECAY_INC_TABLE_SIZE];
-
-extern const float filtertan[FILTERTAN_TABLE_SIZE];
-
-extern const float mtof1[MTOF1_TABLE_SIZE];
-extern const float decayCoeffTable[DECAY_COEFF_TABLE_SIZE];
-
-extern const float tanh1[TANH1_TABLE_SIZE];
-
-//==============================================================================
-
-/* Sine wave table ripped from http://aquaticus.info/pwm-sine-wave. */
-extern const float sinewave[SINE_TABLE_SIZE];
-
-extern const float sawtooth[11][SAW_TABLE_SIZE];
-
-extern const float triangle[11][TRI_TABLE_SIZE];
-
-extern const float squarewave[11][SQR_TABLE_SIZE];
-
-//==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_TABLES_H_INCLUDED
-
-//==============================================================================
--- /dev/null
+++ b/LEAF/Inc/main.h
@@ -1,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_hal.h"
+#include "stm32h7xx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+#define __ATTR_RAM_D1 __attribute__ ((section(".RAM_D1"))) __attribute__ ((aligned (32)))
+#define __ATTR_RAM_D2 __attribute__ ((section(".RAM_D2"))) __attribute__ ((aligned (32)))
+#define __ATTR_RAM_D3 __attribute__ ((section(".RAM_D3"))) __attribute__ ((aligned (32)))
+#define __ATTR_SDRAM __attribute__ ((section(".SDRAM"))) __attribute__ ((aligned (32)))
+
+#define STM32 // define this so that LEAF knows you are building for STM32
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+float randomNumber(void);
+static void HardFault_Handler(void) __attribute__ ((naked));
+void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress );
+void writeIntToFlash(uint32_t data, uint32_t location);
+uint32_t readIntFromFlash (uint32_t location);
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/oled.h
@@ -1,0 +1,90 @@
+/*
+ * oled.h
+ *
+ * Created on: Feb 05, 2020
+ * Author: Matthew Wang
+ */
+
+#ifndef OLED_H_
+#define OLED_H_
+
+extern char oled_buffer[32];
+
+typedef enum _OLEDLine
+{
+ FirstLine = 0,
+ SecondLine,
+ BothLines,
+ NilLine
+} OLEDLine;
+
+void OLED_init(I2C_HandleTypeDef* hi2c);
+
+void initUIFunctionPointers(void);
+
+void setLED_Edit(uint8_t onOff);
+
+void setLED_USB(uint8_t onOff);
+
+void setLED_1(uint8_t onOff);
+
+void setLED_2(uint8_t onOff);
+
+void setLED_A(uint8_t onOff);
+
+void setLED_B(uint8_t onOff);
+
+void setLED_C(uint8_t onOff);
+
+void setLED_leftout_clip(uint8_t onOff);
+
+void setLED_rightout_clip(uint8_t onOff);
+
+void setLED_leftin_clip(uint8_t onOff);
+
+void setLED_rightin_clip(uint8_t onOff);
+
+int getCursorX(void);
+
+void OLED_process(void);
+
+void OLED_writePreset(void);
+
+void OLED_writeEditScreen(void);
+
+void OLED_writeKnobParameter(uint8_t whichParam);
+
+void OLED_writeButtonAction(uint8_t whichButton, uint8_t whichAction);
+
+void OLED_writeTuning(void);
+
+void OLED_draw(void);
+
+void OLEDclear(void);
+
+void OLEDclearLine(OLEDLine line);
+
+void OLEDwriteString(char* myCharArray, uint8_t arrayLength, uint8_t startCursor, OLEDLine line);
+
+void OLEDwriteLine(char* myCharArray, uint8_t arrayLength, OLEDLine line);
+
+void OLEDwriteInt(uint32_t myNumber, uint8_t numDigits, uint8_t startCursor, OLEDLine line);
+
+void OLEDwriteIntLine(uint32_t myNumber, uint8_t numDigits, OLEDLine line);
+
+void OLEDwritePitch(float midi, uint8_t startCursor, OLEDLine line);
+
+void OLEDwritePitchClass(float midi, uint8_t startCursor, OLEDLine line);
+
+void OLEDwritePitchLine(float midi, OLEDLine line);
+
+void OLEDwriteFixedFloat(float input, uint8_t numDigits, uint8_t numDecimal, uint8_t startCursor, OLEDLine line);
+
+void OLEDwriteFixedFloatLine(float input, uint8_t numDigits, uint8_t numDecimal, OLEDLine line);
+
+void OLEDwriteFloat(float input, uint8_t startCursor, OLEDLine line);
+
+void OLEDdrawFloatArray(float* input, float min, float max, uint8_t size, uint8_t offset, uint8_t startCursor, OLEDLine line);
+
+#endif /* OLED_H_ */
+
--- /dev/null
+++ b/LEAF/Inc/rng.h
@@ -1,0 +1,58 @@
+/**
+ ******************************************************************************
+ * File Name : RNG.h
+ * Description : This file provides code for the configuration
+ * of the RNG instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __rng_H
+#define __rng_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern RNG_HandleTypeDef hrng;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_RNG_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ rng_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/sai.h
@@ -1,0 +1,59 @@
+/**
+ ******************************************************************************
+ * File Name : SAI.h
+ * Description : This file provides code for the configuration
+ * of the SAI instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __sai_H
+#define __sai_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern SAI_HandleTypeDef hsai_BlockA1;
+extern SAI_HandleTypeDef hsai_BlockB1;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_SAI1_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ sai_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/sd_diskio.h
@@ -1,0 +1,45 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file sd_diskio.h
+ * @brief Header for sd_diskio.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Note: code generation based on sd_diskio_template.h */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __SD_DISKIO_H
+#define __SD_DISKIO_H
+
+/* USER CODE BEGIN firstSection */
+/* can be used to modify / undefine following code or add new definitions */
+/* USER CODE END firstSection */
+
+/* Includes ------------------------------------------------------------------*/
+#include "bsp_driver_sd.h"
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+extern const Diskio_drvTypeDef SD_Driver;
+
+/* USER CODE BEGIN lastSection */
+/* can be used to modify / undefine previous code or add new definitions */
+/* USER CODE END lastSection */
+
+#endif /* __SD_DISKIO_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
--- /dev/null
+++ b/LEAF/Inc/sdmmc.h
@@ -1,0 +1,58 @@
+/**
+ ******************************************************************************
+ * File Name : SDMMC.h
+ * Description : This file provides code for the configuration
+ * of the SDMMC instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __sdmmc_H
+#define __sdmmc_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern SD_HandleTypeDef hsd1;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_SDMMC1_SD_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ sdmmc_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/sfx.h
@@ -1,0 +1,177 @@
+/*
+ * sfx.h
+ *
+ * Created on: Dec 23, 2019
+ * Author: josnyder
+ */
+#ifndef SFX_H_
+#define SFX_H_
+
+#include "audiostream.h"
+#include "ui.h"
+
+#define NUM_VOC_VOICES 8
+#define NUM_OSC_PER_VOICE 3
+#define NUM_VOC_OSC 1
+#define INV_NUM_VOC_VOICES 0.125
+#define INV_NUM_VOC_OSC 1
+#define NUM_AUTOTUNE 2
+#define NUM_RETUNE 1
+#define OVERSAMPLER_RATIO 8
+#define OVERSAMPLER_HQ FALSE
+
+extern float presetKnobValues[PresetNil][NUM_ADC_CHANNELS];
+extern uint8_t knobActive[NUM_ADC_CHANNELS];
+
+extern tPoly poly;
+extern tRamp polyRamp[NUM_VOC_VOICES];
+extern tSawtooth osc[NUM_VOC_VOICES * NUM_OSC_PER_VOICE];
+
+extern PlayMode samplerMode;
+extern float sampleLength;
+
+extern uint32_t freeze;
+
+void initGlobalSFXObjects();
+
+//1 vocoder internal poly
+extern uint8_t numVoices;
+extern uint8_t internalExternal;
+
+void SFXVocoderAlloc();
+void SFXVocoderFrame();
+void SFXVocoderTick(float audioIn);
+void SFXVocoderFree(void);
+
+//4 pitch shift
+void SFXPitchShiftAlloc();
+void SFXPitchShiftFrame();
+void SFXPitchShiftTick(float audioIn);
+void SFXPitchShiftFree(void);
+
+//5 neartune
+extern uint8_t autotuneChromatic;
+
+void SFXNeartuneAlloc();
+void SFXNeartuneFrame();
+void SFXNeartuneTick(float audioIn);
+void SFXNeartuneFree(void);
+
+//6 autotune
+void SFXAutotuneAlloc();
+void SFXAutotuneFrame();
+void SFXAutotuneTick(float audioIn);
+void SFXAutotuneFree(void);
+
+//7 sampler - button press
+extern uint8_t samplePlaying;
+
+void SFXSamplerBPAlloc();
+void SFXSamplerBPFrame();
+void SFXSamplerBPTick(float audioIn);
+void SFXSamplerBPFree(void);
+
+
+//8 sampler - auto ch1
+extern uint8_t triggerChannel;
+
+void SFXSamplerAutoAlloc();
+void SFXSamplerAutoFrame();
+void SFXSamplerAutoTick(float audioIn);
+void SFXSamplerAutoFree(void);
+
+//10 distortion tanh
+extern uint8_t distortionMode;
+
+void SFXDistortionAlloc();
+void SFXDistortionFrame();
+void SFXDistortionTick(float audioIn);
+void SFXDistortionFree(void);
+
+//12 distortion wave folder
+void SFXWaveFolderAlloc();
+void SFXWaveFolderFrame();
+void SFXWaveFolderTick(float audioIn);
+void SFXWaveFolderFree(void);
+
+
+//13 bitcrusher
+void SFXBitcrusherAlloc();
+void SFXBitcrusherFrame();
+void SFXBitcrusherTick(float audioIn);
+void SFXBitcrusherFree(void);
+
+
+//14 delay
+extern int delayShaper;
+
+void SFXDelayAlloc();
+void SFXDelayFrame();
+void SFXDelayTick(float audioIn);
+void SFXDelayFree(void);
+
+
+//15 reverb
+void SFXReverbAlloc();
+void SFXReverbFrame();
+void SFXReverbTick(float audioIn);
+void SFXReverbFree(void);
+
+//16 reverb2
+void SFXReverb2Alloc();
+void SFXReverb2Frame();
+void SFXReverb2Tick(float audioIn);
+void SFXReverb2Free(void);
+
+//17 living string
+void SFXLivingStringAlloc();
+void SFXLivingStringFrame();
+void SFXLivingStringTick(float audioIn);
+void SFXLivingStringFree(void);
+
+//17 living string
+void SFXLivingStringSynthAlloc();
+void SFXLivingStringSynthFrame();
+void SFXLivingStringSynthTick(float audioIn);
+void SFXLivingStringSynthFree(void);
+
+
+//17 living string
+void SFXClassicSynthAlloc();
+void SFXClassicSynthFrame();
+void SFXClassicSynthTick(float audioIn);
+void SFXClassicSynthFree(void);
+
+
+//17 living string
+void SFXRhodesAlloc();
+void SFXRhodesFrame();
+void SFXRhodesTick(float audioIn);
+void SFXRhodesFree(void);
+
+
+// MIDI FUNCTIONS
+void noteOn(int key, int velocity);
+void noteOff(int key, int velocity);
+void pitchBend(int data);
+void sustainOn(void);
+void sustainOff(void);
+void toggleBypass(void);
+void toggleSustain(void);
+
+void calculateFreq(int voice);
+
+float calculateTunedMidiNote(float tempNote);
+
+
+void calculateNoteArray(void);
+//void calculatePeriodArray(void);
+float nearestNote(float period);
+//float nearestPeriod(float period);
+
+void clearNotes(void);
+
+void ctrlInput(int ctrl, int value);
+
+
+#endif /* SFX_H_ */
--- /dev/null
+++ b/LEAF/Inc/ssd1306.h
@@ -1,0 +1,127 @@
+
+/*
+ * ssd1306.h
+ *
+ * Created on: Jul 6, 2018
+ * Author: jeffsnyder
+ */
+#include "stm32h7xx_hal.h"
+#include "main.h"
+
+#ifndef SSD1306_H_
+#define SSD1306_H_
+
+#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
+
+#define BLACK 0
+#define WHITE 1
+#define INVERSE 2
+
+#define SSD1306_I2C_ADDRESS (0x3C<<1) // 011110+SA0+RW - 0x3C or 0x3D
+// Address for 128x32 is 0x3C
+// Address for 128x64 is 0x3D (default) or 0x3C (if SA0 is grounded)
+
+/*=========================================================================
+ SSD1306 Displays
+ -----------------------------------------------------------------------
+ The driver is used in multiple displays (128x64, 128x32, etc.).
+ Select the appropriate display below to create an appropriately
+ sized framebuffer, etc.
+
+ SSD1306_128_64 128x64 pixel display
+
+ SSD1306_128_32 128x32 pixel display
+
+ SSD1306_96_16
+
+ -----------------------------------------------------------------------*/
+// #define SSD1306_128_64
+ #define SSD1306_128_32
+// #define SSD1306_96_16
+/*=========================================================================*/
+
+#if defined SSD1306_128_64 && defined SSD1306_128_32
+ #error "Only one SSD1306 display can be specified at once in SSD1306.h"
+#endif
+#if !defined SSD1306_128_64 && !defined SSD1306_128_32 && !defined SSD1306_96_16
+ #error "At least one SSD1306 display must be specified in SSD1306.h"
+#endif
+
+#if defined SSD1306_128_64
+ #define SSD1306_LCDWIDTH 128
+ #define SSD1306_LCDHEIGHT 64
+#endif
+#if defined SSD1306_128_32
+ #define SSD1306_LCDWIDTH 128
+ #define SSD1306_LCDHEIGHT 32
+#endif
+#if defined SSD1306_96_16
+ #define SSD1306_LCDWIDTH 96
+ #define SSD1306_LCDHEIGHT 16
+#endif
+
+#define SSD1306_SETCONTRAST 0x81
+#define SSD1306_DISPLAYALLON_RESUME 0xA4
+#define SSD1306_DISPLAYALLON 0xA5
+#define SSD1306_NORMALDISPLAY 0xA6
+#define SSD1306_INVERTDISPLAY 0xA7
+#define SSD1306_DISPLAYOFF 0xAE
+#define SSD1306_DISPLAYON 0xAF
+
+#define SSD1306_SETDISPLAYOFFSET 0xD3
+#define SSD1306_SETCOMPINS 0xDA
+
+#define SSD1306_SETVCOMDETECT 0xDB
+
+#define SSD1306_SETDISPLAYCLOCKDIV 0xD5
+#define SSD1306_SETPRECHARGE 0xD9
+
+#define SSD1306_SETMULTIPLEX 0xA8
+
+#define SSD1306_SETLOWCOLUMN 0x00
+#define SSD1306_SETHIGHCOLUMN 0x10
+
+#define SSD1306_SETSTARTLINE 0x40
+
+#define SSD1306_MEMORYMODE 0x20
+#define SSD1306_COLUMNADDR 0x21
+#define SSD1306_PAGEADDR 0x22
+
+#define SSD1306_COMSCANINC 0xC0
+#define SSD1306_COMSCANDEC 0xC8
+
+#define SSD1306_SEGREMAP 0xA0
+
+#define SSD1306_CHARGEPUMP 0x8D
+
+#define SSD1306_EXTERNALVCC 0x1
+#define SSD1306_SWITCHCAPVCC 0x2
+
+// Scrolling #defines
+#define SSD1306_ACTIVATE_SCROLL 0x2F
+#define SSD1306_DEACTIVATE_SCROLL 0x2E
+#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3
+#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
+#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
+#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
+#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
+
+extern unsigned char buffer [];
+
+void ssd1306_begin(I2C_HandleTypeDef* hi2c, uint8_t vccstate, uint8_t i2caddr);
+void ssd1306_drawPixel(int16_t x, int16_t y, uint16_t color);
+void sdd1306_invertDisplay(uint8_t i);
+void ssd1306_command(uint8_t c);
+void ssd1306_dim(uint8_t dim);
+void ssd1306_display_full_buffer(void);
+void ssd1306_display(void);
+void ssd1306_write(uint8_t* data, uint16_t numBytes);
+void ssd1306_move(uint8_t row, uint8_t column);
+void ssd1306_move_raw(uint8_t row, uint8_t column);
+void ssd1306_home(void);
+
+
+
+
+
+#endif /* SSD1306_H_ */
--- /dev/null
+++ b/LEAF/Inc/stm32h7xx_hal_conf.h
@@ -1,0 +1,493 @@
+/**
+ ******************************************************************************
+ * @file stm32h7xx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2017 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32H7xx_HAL_CONF_H
+#define __STM32H7xx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+
+ #define HAL_ADC_MODULE_ENABLED
+/* #define HAL_FDCAN_MODULE_ENABLED */
+/* #define HAL_CEC_MODULE_ENABLED */
+/* #define HAL_COMP_MODULE_ENABLED */
+/* #define HAL_CRC_MODULE_ENABLED */
+/* #define HAL_CRYP_MODULE_ENABLED */
+/* #define HAL_DAC_MODULE_ENABLED */
+/* #define HAL_DCMI_MODULE_ENABLED */
+/* #define HAL_DMA2D_MODULE_ENABLED */
+/* #define HAL_ETH_MODULE_ENABLED */
+/* #define HAL_NAND_MODULE_ENABLED */
+/* #define HAL_NOR_MODULE_ENABLED */
+/* #define HAL_OTFDEC_MODULE_ENABLED */
+/* #define HAL_SRAM_MODULE_ENABLED */
+#define HAL_SDRAM_MODULE_ENABLED
+/* #define HAL_HASH_MODULE_ENABLED */
+/* #define HAL_HRTIM_MODULE_ENABLED */
+/* #define HAL_HSEM_MODULE_ENABLED */
+/* #define HAL_GFXMMU_MODULE_ENABLED */
+/* #define HAL_JPEG_MODULE_ENABLED */
+/* #define HAL_OPAMP_MODULE_ENABLED */
+/* #define HAL_OSPI_MODULE_ENABLED */
+/* #define HAL_OSPI_MODULE_ENABLED */
+/* #define HAL_I2S_MODULE_ENABLED */
+/* #define HAL_SMBUS_MODULE_ENABLED */
+/* #define HAL_IWDG_MODULE_ENABLED */
+/* #define HAL_LPTIM_MODULE_ENABLED */
+/* #define HAL_LTDC_MODULE_ENABLED */
+/* #define HAL_QSPI_MODULE_ENABLED */
+#define HAL_RNG_MODULE_ENABLED
+/* #define HAL_RTC_MODULE_ENABLED */
+#define HAL_SAI_MODULE_ENABLED
+#define HAL_SD_MODULE_ENABLED
+/* #define HAL_MMC_MODULE_ENABLED */
+/* #define HAL_SPDIFRX_MODULE_ENABLED */
+/* #define HAL_SPI_MODULE_ENABLED */
+/* #define HAL_SWPMI_MODULE_ENABLED */
+#define HAL_TIM_MODULE_ENABLED
+/* #define HAL_UART_MODULE_ENABLED */
+/* #define HAL_USART_MODULE_ENABLED */
+/* #define HAL_IRDA_MODULE_ENABLED */
+/* #define HAL_SMARTCARD_MODULE_ENABLED */
+/* #define HAL_WWDG_MODULE_ENABLED */
+/* #define HAL_PCD_MODULE_ENABLED */
+#define HAL_HCD_MODULE_ENABLED
+/* #define HAL_DFSDM_MODULE_ENABLED */
+/* #define HAL_DSI_MODULE_ENABLED */
+/* #define HAL_JPEG_MODULE_ENABLED */
+/* #define HAL_MDIOS_MODULE_ENABLED */
+/* #define HAL_PSSI_MODULE_ENABLED */
+/* #define HAL_DTS_MODULE_ENABLED */
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_MDMA_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_I2C_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_HSEM_MODULE_ENABLED
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz : FPGA case fixed to 60MHZ */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal oscillator (CSI) default value.
+ * This value is the default CSI value after Reset.
+ */
+#if !defined (CSI_VALUE)
+ #define CSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* CSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE ((uint32_t)64000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+ #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
+#endif /* LSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for I2S peripheral
+ * This value is used by the I2S HAL module to compute the I2S clock source
+ * frequency, this source is inserted directly through I2S_CKIN pad.
+ */
+#if !defined (EXTERNAL_CLOCK_VALUE)
+ #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External clock in Hz*/
+#endif /* EXTERNAL_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define USE_SD_TRANSCEIVER 1U /*!< use uSD Transceiver */
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */
+#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0U /* COMP register callback disabled */
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */
+#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */
+#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */
+#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */
+#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */
+#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */
+#define USE_HAL_DTS_REGISTER_CALLBACKS 0U /* DTS register callback disabled */
+#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */
+#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U /* FDCAN register callback disabled */
+#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */
+#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */
+#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */
+#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */
+#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */
+#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */
+#define USE_HAL_GFXMMU_REGISTER_CALLBACKS 0U /* GFXMMU register callback disabled */
+#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U /* HRTIM register callback disabled */
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */
+#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */
+#define USE_HAL_JPEG_REGISTER_CALLBACKS 0U /* JPEG register callback disabled */
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */
+#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */
+#define USE_HAL_MDIOS_REGISTER_CALLBACKS 0U /* MDIO register callback disabled */
+#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */
+#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U /* MDIO register callback disabled */
+#define USE_HAL_OSPI_REGISTER_CALLBACKS 0U /* OSPI register callback disabled */
+#define USE_HAL_OTFDEC_REGISTER_CALLBACKS 0U /* OTFDEC register callback disabled */
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */
+#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */
+#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */
+#define USE_HAL_SWPMI_REGISTER_CALLBACKS 0U /* SWPMI register callback disabled */
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */
+#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */
+#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */
+
+/* ########################### Ethernet Configuration ######################### */
+#define ETH_TX_DESC_CNT 4 /* number of Ethernet Tx DMA descriptors */
+#define ETH_RX_DESC_CNT 4 /* number of Ethernet Rx DMA descriptors */
+
+#define ETH_MAC_ADDR0 ((uint8_t)0x02)
+#define ETH_MAC_ADDR1 ((uint8_t)0x00)
+#define ETH_MAC_ADDR2 ((uint8_t)0x00)
+#define ETH_MAC_ADDR3 ((uint8_t)0x00)
+#define ETH_MAC_ADDR4 ((uint8_t)0x00)
+#define ETH_MAC_ADDR5 ((uint8_t)0x00)
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32h7xx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32h7xx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32h7xx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_MDMA_MODULE_ENABLED
+ #include "stm32h7xx_hal_mdma.h"
+#endif /* HAL_MDMA_MODULE_ENABLED */
+
+#ifdef HAL_HASH_MODULE_ENABLED
+ #include "stm32h7xx_hal_hash.h"
+#endif /* HAL_HASH_MODULE_ENABLED */
+
+#ifdef HAL_DCMI_MODULE_ENABLED
+ #include "stm32h7xx_hal_dcmi.h"
+#endif /* HAL_DCMI_MODULE_ENABLED */
+
+#ifdef HAL_DMA2D_MODULE_ENABLED
+ #include "stm32h7xx_hal_dma2d.h"
+#endif /* HAL_DMA2D_MODULE_ENABLED */
+
+#ifdef HAL_DSI_MODULE_ENABLED
+ #include "stm32h7xx_hal_dsi.h"
+#endif /* HAL_DSI_MODULE_ENABLED */
+
+#ifdef HAL_DFSDM_MODULE_ENABLED
+ #include "stm32h7xx_hal_dfsdm.h"
+#endif /* HAL_DFSDM_MODULE_ENABLED */
+
+#ifdef HAL_ETH_MODULE_ENABLED
+ #include "stm32h7xx_hal_eth.h"
+#endif /* HAL_ETH_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32h7xx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32h7xx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32h7xx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_FDCAN_MODULE_ENABLED
+ #include "stm32h7xx_hal_fdcan.h"
+#endif /* HAL_FDCAN_MODULE_ENABLED */
+
+#ifdef HAL_CEC_MODULE_ENABLED
+ #include "stm32h7xx_hal_cec.h"
+#endif /* HAL_CEC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32h7xx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32h7xx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32h7xx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_DAC_MODULE_ENABLED
+ #include "stm32h7xx_hal_dac.h"
+#endif /* HAL_DAC_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32h7xx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GFXMMU_MODULE_ENABLED
+ #include "stm32h7xx_hal_gfxmmu.h"
+#endif /* HAL_GFXMMU_MODULE_ENABLED */
+
+#ifdef HAL_HRTIM_MODULE_ENABLED
+ #include "stm32h7xx_hal_hrtim.h"
+#endif /* HAL_HRTIM_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32h7xx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_SRAM_MODULE_ENABLED
+ #include "stm32h7xx_hal_sram.h"
+#endif /* HAL_SRAM_MODULE_ENABLED */
+
+#ifdef HAL_NOR_MODULE_ENABLED
+ #include "stm32h7xx_hal_nor.h"
+#endif /* HAL_NOR_MODULE_ENABLED */
+
+#ifdef HAL_NAND_MODULE_ENABLED
+ #include "stm32h7xx_hal_nand.h"
+#endif /* HAL_NAND_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32h7xx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_I2S_MODULE_ENABLED
+ #include "stm32h7xx_hal_i2s.h"
+#endif /* HAL_I2S_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32h7xx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_JPEG_MODULE_ENABLED
+ #include "stm32h7xx_hal_jpeg.h"
+#endif /* HAL_JPEG_MODULE_ENABLED */
+
+#ifdef HAL_MDIOS_MODULE_ENABLED
+ #include "stm32h7xx_hal_mdios.h"
+#endif /* HAL_MDIOS_MODULE_ENABLED */
+
+#ifdef HAL_MMC_MODULE_ENABLED
+ #include "stm32h7xx_hal_mmc.h"
+#endif /* HAL_MMC_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+#include "stm32h7xx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_LTDC_MODULE_ENABLED
+#include "stm32h7xx_hal_ltdc.h"
+#endif /* HAL_LTDC_MODULE_ENABLED */
+
+#ifdef HAL_OPAMP_MODULE_ENABLED
+#include "stm32h7xx_hal_opamp.h"
+#endif /* HAL_OPAMP_MODULE_ENABLED */
+
+#ifdef HAL_OSPI_MODULE_ENABLED
+ #include "stm32h7xx_hal_ospi.h"
+#endif /* HAL_OSPI_MODULE_ENABLED */
+
+#ifdef HAL_OTFDEC_MODULE_ENABLED
+#include "stm32h7xx_hal_otfdec.h"
+#endif /* HAL_OTFDEC_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32h7xx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32h7xx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RAMECC_MODULE_ENABLED
+ #include "stm32h7xx_hal_ramecc.h"
+#endif /* HAL_HCD_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32h7xx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32h7xx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32h7xx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SD_MODULE_ENABLED
+ #include "stm32h7xx_hal_sd.h"
+#endif /* HAL_SD_MODULE_ENABLED */
+
+#ifdef HAL_SDRAM_MODULE_ENABLED
+ #include "stm32h7xx_hal_sdram.h"
+#endif /* HAL_SDRAM_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32h7xx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_SPDIFRX_MODULE_ENABLED
+ #include "stm32h7xx_hal_spdifrx.h"
+#endif /* HAL_SPDIFRX_MODULE_ENABLED */
+
+#ifdef HAL_SWPMI_MODULE_ENABLED
+ #include "stm32h7xx_hal_swpmi.h"
+#endif /* HAL_SWPMI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32h7xx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32h7xx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32h7xx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32h7xx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32h7xx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32h7xx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32h7xx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32h7xx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_HCD_MODULE_ENABLED
+ #include "stm32h7xx_hal_hcd.h"
+#endif /* HAL_HCD_MODULE_ENABLED */
+
+#ifdef HAL_PSSI_MODULE_ENABLED
+ #include "stm32h7xx_hal_pssi.h"
+#endif /* HAL_PSSI_MODULE_ENABLED */
+
+#ifdef HAL_DTS_MODULE_ENABLED
+ #include "stm32h7xx_hal_dts.h"
+#endif /* HAL_DTS_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr: If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32H7xx_HAL_CONF_H */
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/stm32h7xx_it.h
@@ -1,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32h7xx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32H7xx_IT_H
+#define __STM32H7xx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void DMA1_Stream0_IRQHandler(void);
+void DMA1_Stream1_IRQHandler(void);
+void DMA1_Stream2_IRQHandler(void);
+void ADC_IRQHandler(void);
+void I2C4_EV_IRQHandler(void);
+void I2C4_ER_IRQHandler(void);
+void OTG_FS_EP1_OUT_IRQHandler(void);
+void OTG_FS_EP1_IN_IRQHandler(void);
+void OTG_FS_IRQHandler(void);
+void DMAMUX1_OVR_IRQHandler(void);
+void BDMA_Channel0_IRQHandler(void);
+void BDMA_Channel1_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32H7xx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/sys.h
@@ -1,0 +1,56 @@
+/**
+ ******************************************************************************
+ * File Name : SYS.h
+ * Description : This file provides code for the configuration
+ * of the SYS instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __sys_H
+#define __sys_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_SYS_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ sys_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/tim.h
@@ -1,0 +1,62 @@
+/**
+ ******************************************************************************
+ * File Name : TIM.h
+ * Description : This file provides code for the configuration
+ * of the TIM instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __tim_H
+#define __tim_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern TIM_HandleTypeDef htim3;
+extern TIM_HandleTypeDef htim4;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_TIM3_Init(void);
+void MX_TIM4_Init(void);
+
+void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ tim_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/tunings.h
@@ -1,0 +1,20 @@
+/*
+ * tunings.h
+ *
+ * Created on: Dec 18, 2019
+ * Author: josnyder
+ */
+
+#ifndef TUNINGS_H_
+#define TUNINGS_H_
+
+#define NUM_TUNINGS 66
+
+extern float centsDeviation[12];
+extern float tuningPresets[NUM_TUNINGS][12];
+extern uint32_t currentTuning;
+extern uint8_t keyCenter;
+extern char tuningNames[NUM_TUNINGS][6];
+
+
+#endif /* TUNINGS_H_ */
--- /dev/null
+++ b/LEAF/Inc/ui.h
@@ -1,0 +1,116 @@
+/*
+ * ui.h
+ *
+ * Created on: Aug 30, 2019
+ * Author: jeffsnyder
+ */
+#ifndef UI_H_
+#define UI_H_
+
+#define NUM_ADC_CHANNELS 6
+#define NUM_BUTTONS 10
+
+//PresetNil is used as a counter for the size of the enum
+typedef enum _VocodecPresetType
+{
+ Vocoder = 0,
+ Pitchshift,
+ AutotuneMono,
+ AutotunePoly,
+ SamplerButtonPress,
+ SamplerAutoGrab,
+ Distortion,
+ Wavefolder,
+ BitCrusher,
+ Delay,
+ Reverb,
+ Reverb2,
+ LivingString,
+ LivingStringSynth,
+ ClassicSynth,
+ Rhodes,
+ PresetNil
+} VocodecPresetType;
+
+typedef enum _VocodecButton
+{
+ ButtonEdit = 0,
+ ButtonLeft,
+ ButtonRight,
+ ButtonDown,
+ ButtonUp,
+ ButtonA,
+ ButtonB,
+ ButtonC,
+ ButtonD,
+ ButtonE,
+ ButtonNil
+} VocodecButton;
+
+typedef enum _ButtonAction
+{
+ ActionPress = 0,
+ ActionRelease,
+ ActionHoldInstant,
+ ActionHoldContinuous,
+ ActionNil
+} ButtonAction;
+
+extern uint16_t ADC_values[NUM_ADC_CHANNELS];
+
+extern uint8_t buttonValues[NUM_BUTTONS];
+//extern uint8_t buttonPressed[NUM_BUTTONS];
+//extern uint8_t buttonReleased[NUM_BUTTONS];
+
+extern int8_t writeKnobFlag;
+extern int8_t writeButtonFlag;
+extern int8_t writeActionFlag;
+
+extern float floatADCUI[NUM_ADC_CHANNELS];
+
+extern uint8_t currentPreset;
+extern uint8_t previousPreset;
+extern uint8_t loadingPreset;
+// Display values
+extern char* modeNames[PresetNil];
+extern char* modeNamesDetails[PresetNil];
+extern char* shortModeNames[PresetNil];
+extern char* paramNames[PresetNil][NUM_ADC_CHANNELS + NUM_BUTTONS];
+extern float knobParams[NUM_ADC_CHANNELS];
+extern int8_t cvAddParam;
+extern uint8_t buttonActionsSFX[NUM_BUTTONS][ActionNil];
+extern char* (*buttonActionFunctions[PresetNil])(VocodecButton, ButtonAction);
+
+void initModeNames(void);
+
+void buttonCheck(void);
+
+void adcCheck(void);
+
+void clearButtonActions(void);
+
+void changeTuning(void);
+
+void writeCurrentPresetToFlash(void);
+
+char* UIVocoderButtons(VocodecButton button, ButtonAction action);
+char* UIPitchShiftButtons(VocodecButton button, ButtonAction action);
+char* UINeartuneButtons(VocodecButton button, ButtonAction action);
+char* UIAutotuneButtons(VocodecButton button, ButtonAction action);
+char* UISamplerBPButtons(VocodecButton button, ButtonAction action);
+char* UISamplerAutoButtons(VocodecButton button, ButtonAction action);
+char* UIDistortionButtons(VocodecButton button, ButtonAction action);
+char* UIWaveFolderButtons(VocodecButton button, ButtonAction action);
+char* UIBitcrusherButtons(VocodecButton button, ButtonAction action);
+char* UIDelayButtons(VocodecButton button, ButtonAction action);
+char* UIReverbButtons(VocodecButton button, ButtonAction action);
+char* UIReverb2Buttons(VocodecButton button, ButtonAction action);
+char* UILivingStringButtons(VocodecButton button, ButtonAction action);
+char* UILivingStringSynthButtons(VocodecButton button, ButtonAction action);
+char* UIClassicSynthButtons(VocodecButton button, ButtonAction action);
+char* UIRhodesButtons(VocodecButton button, ButtonAction action);
+
+
+
+#endif /* UI_H_ */
+
--- /dev/null
+++ b/LEAF/Inc/usb_host.h
@@ -1,0 +1,94 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : usb_host.h
+ * @version : v1.0_Cube
+ * @brief : Header for usb_host.c file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __USB_HOST__H__
+#define __USB_HOST__H__
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx.h"
+#include "stm32h7xx_hal.h"
+
+/* USER CODE BEGIN INCLUDE */
+
+/* USER CODE END INCLUDE */
+
+/** @addtogroup USBH_OTG_DRIVER
+ * @{
+ */
+
+/** @defgroup USBH_HOST USBH_HOST
+ * @brief Host file for Usb otg low level driver.
+ * @{
+ */
+
+/** @defgroup USBH_HOST_Exported_Variables USBH_HOST_Exported_Variables
+ * @brief Public variables.
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** Status of the application. */
+typedef enum {
+ APPLICATION_IDLE = 0,
+ APPLICATION_START,
+ APPLICATION_READY,
+ APPLICATION_DISCONNECT
+}ApplicationTypeDef;
+
+/** @defgroup USBH_HOST_Exported_FunctionsPrototype USBH_HOST_Exported_FunctionsPrototype
+ * @brief Declaration of public functions for Usb host.
+ * @{
+ */
+
+/* Exported functions -------------------------------------------------------*/
+
+/** @brief USB Host initialization function. */
+void MX_USB_HOST_Init(void);
+
+void MX_USB_HOST_Process(void);
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __USB_HOST__H__ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/usbh_MIDI.h
@@ -1,0 +1,211 @@
+/**
+ ******************************************************************************
+ * @file usbh_MIDI.h
+ * @author Xavier Halgand
+ * @version
+ * @date
+ * @brief This file contains all the prototypes for the usbh_MIDI.c
+ ******************************************************************************
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/* Define to prevent recursive ----------------------------------------------*/
+#ifndef __USBH_MIDI_CORE_H
+#define __USBH_MIDI_CORE_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "usbh_core.h"
+//#include "stm32f7xx_nucleo_144.h"
+
+/*-------------------------------------------------------------------------------*/
+// buffer size (should be at least >= MIOS32_USB_MIDI_DESC_DATA_*_SIZE/4)
+#define USB_MIDI_RX_BUFFER_SIZE 64 // packages
+#define USB_MIDI_TX_BUFFER_SIZE 64 // packages
+
+// size of IN/OUT pipe
+#define USB_MIDI_DATA_IN_SIZE 64
+#define USB_MIDI_DATA_OUT_SIZE 64
+
+// endpoint assignments (don't change!)
+#define USB_MIDI_DATA_OUT_EP 0x02
+#define USB_MIDI_DATA_IN_EP 0x81
+/** @defgroup USBH_MIDI_CORE_Exported_Defines
+ * @{
+ */
+#define USB_AUDIO_CLASS 0x01
+#define USB_MIDISTREAMING_SubCLASS 0x03
+#define USB_MIDI_DESC_SIZE 9
+#define USBH_MIDI_CLASS &MIDI_Class
+
+/*-------------------------------------------------------------------------------*/
+
+extern USBH_ClassTypeDef MIDI_Class;
+
+/* -------------------- Exported_Types ------------------------------------------*/
+
+typedef enum {
+ NoteOff = 0x8,
+ NoteOn = 0x9,
+ PolyPressure = 0xa,
+ CC = 0xb,
+ ProgramChange = 0xc,
+ Aftertouch = 0xd,
+ PitchBend = 0xe
+} midi_event_t;
+
+
+typedef enum {
+ Chn1,
+ Chn2,
+ Chn3,
+ Chn4,
+ Chn5,
+ Chn6,
+ Chn7,
+ Chn8,
+ Chn9,
+ Chn10,
+ Chn11,
+ Chn12,
+ Chn13,
+ Chn14,
+ Chn15,
+ Chn16
+} midi_chn_t;
+
+#pragma anon_unions
+
+typedef union {
+ struct {
+ uint32_t ALL;
+ };
+ struct {
+ uint8_t cin_cable;
+ uint8_t evnt0;
+ uint8_t evnt1;
+ uint8_t evnt2;
+ };
+ struct {
+ uint8_t type:4;
+ uint8_t cable:4;
+ uint8_t chn:4; // mios32_midi_chn_t
+ uint8_t event:4; // mios32_midi_event_t
+ uint8_t value1;
+ uint8_t value2;
+ };
+
+ // C++ doesn't allow to redefine names in anonymous unions
+ // as a simple workaround, we rename these redundant names
+ struct {
+ uint8_t cin:4;
+ uint8_t dummy1_cable:4;
+ uint8_t dummy1_chn:4; // mios32_midi_chn_t
+ uint8_t dummy1_event:4; // mios32_midi_event_t
+ uint8_t note:8;
+ uint8_t velocity:8;
+ };
+ struct {
+ uint8_t dummy2_cin:4;
+ uint8_t dummy2_cable:4;
+ uint8_t dummy2_chn:4; // mios32_midi_chn_t
+ uint8_t dummy2_event:4; // mios32_midi_event_t
+ uint8_t cc_number:8;
+ uint8_t value:8;
+ };
+ struct {
+ uint8_t dummy3_cin:4;
+ uint8_t dummy3_cable:4;
+ uint8_t dummy3_chn:4; // mios32_midi_chn_t
+ uint8_t dummy3_event:4; // mios32_midi_event_t
+ uint8_t program_change:8;
+ uint8_t dummy3:8;
+ };
+} midi_package_t;
+
+/* States for MIDI State Machine */
+typedef enum
+{
+ MIDI_IDLE= 0,
+ MIDI_SEND_DATA,
+ MIDI_SEND_DATA_WAIT,
+ MIDI_RECEIVE_DATA,
+ MIDI_RECEIVE_DATA_WAIT,
+}
+MIDI_DataStateTypeDef;
+
+typedef enum
+{
+ MIDI_IDLE_STATE= 0,
+ MIDI_TRANSFER_DATA,
+ MIDI_ERROR_STATE,
+}
+MIDI_StateTypeDef;
+
+/* Structure for MIDI process */
+typedef struct _MIDI_Process
+{
+ MIDI_StateTypeDef state;
+ uint8_t InPipe;
+ uint8_t OutPipe;
+ uint8_t OutEp;
+ uint8_t InEp;
+ uint16_t OutEpSize;
+ uint16_t InEpSize;
+
+ uint8_t *pTxData;
+ uint8_t *pRxData;
+ uint16_t TxDataLength;
+ uint16_t RxDataLength;
+ MIDI_DataStateTypeDef data_tx_state;
+ MIDI_DataStateTypeDef data_rx_state;
+ uint8_t Rx_Poll;
+ //uint8_t buff[8];
+ //MIDI_DataItfTypedef DataItf;
+ //CDC_InterfaceDesc_Typedef CDC_Desc;
+}
+MIDI_HandleTypeDef;
+
+/*---------------------------Exported_FunctionsPrototype-------------------------------------*/
+
+USBH_StatusTypeDef USBH_MIDI_Transmit(USBH_HandleTypeDef *phost,
+ uint8_t *pbuff,
+ uint16_t length);
+
+USBH_StatusTypeDef USBH_MIDI_Receive(USBH_HandleTypeDef *phost,
+ uint8_t *pbuff,
+ uint16_t length);
+
+
+uint32_t USBH_MIDI_GetLastReceivedDataSize(USBH_HandleTypeDef *phost);
+
+USBH_StatusTypeDef USBH_MIDI_Stop(USBH_HandleTypeDef *phost);
+
+void USBH_MIDI_TransmitCallback(USBH_HandleTypeDef *phost);
+
+void USBH_MIDI_ReceiveCallback(USBH_HandleTypeDef *phost, uint32_t myLength);
+
+/*-------------------------------------------------------------------------------------------*/
+#endif /* __USBH_MIDI_CORE_H */
+
+
+/*****************************END OF FILE*************************************************************/
+
--- /dev/null
+++ b/LEAF/Inc/usbh_conf.h
@@ -1,0 +1,199 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : usbh_conf.h
+ * @version : v1.0_Cube
+ * @brief : Header for usbh_conf.c file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __USBH_CONF__H__
+#define __USBH_CONF__H__
+#ifdef __cplusplus
+ extern "C" {
+#endif
+/* Includes ------------------------------------------------------------------*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "main.h"
+
+#include "stm32h7xx.h"
+#include "stm32h7xx_hal.h"
+
+/* USER CODE BEGIN INCLUDE */
+
+/* USER CODE END INCLUDE */
+
+/** @addtogroup STM32_USB_HOST_LIBRARY
+ * @{
+ */
+
+/** @defgroup USBH_CONF
+ * @brief usb host low level driver configuration file
+ * @{
+ */
+
+/** @defgroup USBH_CONF_Exported_Variables USBH_CONF_Exported_Variables
+ * @brief Public variables.
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup USBH_CONF_Exported_Defines USBH_CONF_Exported_Defines
+ * @brief Defines for configuration of the Usb host.
+ * @{
+ */
+
+/*---------- -----------*/
+#define USBH_MAX_NUM_ENDPOINTS 2U
+
+/*---------- -----------*/
+#define USBH_MAX_NUM_INTERFACES 10U
+
+/*---------- -----------*/
+#define USBH_MAX_NUM_CONFIGURATION 10U
+
+/*---------- -----------*/
+#define USBH_KEEP_CFG_DESCRIPTOR 1U
+
+/*---------- -----------*/
+#define USBH_MAX_NUM_SUPPORTED_CLASS 1U
+
+/*---------- -----------*/
+#define USBH_MAX_SIZE_CONFIGURATION 256U
+
+/*---------- -----------*/
+#define USBH_MAX_DATA_BUFFER 512U
+
+/*---------- -----------*/
+#define USBH_DEBUG_LEVEL 0U
+
+/*---------- -----------*/
+#define USBH_USE_OS 0U
+
+
+
+
+/****************************************/
+/* #define for FS and HS identification */
+#define HOST_HS 0
+#define HOST_FS 1
+
+#if (USBH_USE_OS == 1)
+ #include "cmsis_os.h"
+ #define USBH_PROCESS_PRIO osPriorityNormal
+ #define USBH_PROCESS_STACK_SIZE ((uint16_t)0)
+#endif /* (USBH_USE_OS == 1) */
+
+/**
+ * @}
+ */
+
+/** @defgroup USBH_CONF_Exported_Macros USBH_CONF_Exported_Macros
+ * @brief Aliases.
+ * @{
+ */
+
+/* Memory management macros */
+
+/** Alias for memory allocation. */
+#define USBH_malloc malloc
+
+/** Alias for memory release. */
+#define USBH_free free
+
+/** Alias for memory set. */
+#define USBH_memset memset
+
+/** Alias for memory copy. */
+#define USBH_memcpy memcpy
+
+/* DEBUG macros */
+
+#if (USBH_DEBUG_LEVEL > 0U)
+#define USBH_UsrLog(...) do { \
+ printf(__VA_ARGS__); \
+ printf("\n"); \
+} while (0)
+#else
+#define USBH_UsrLog(...) do {} while (0)
+#endif
+
+#if (USBH_DEBUG_LEVEL > 1U)
+
+#define USBH_ErrLog(...) do { \
+ printf("ERROR: ") ; \
+ printf(__VA_ARGS__); \
+ printf("\n"); \
+} while (0)
+#else
+#define USBH_ErrLog(...) do {} while (0)
+#endif
+
+#if (USBH_DEBUG_LEVEL > 2U)
+#define USBH_DbgLog(...) do { \
+ printf("DEBUG : ") ; \
+ printf(__VA_ARGS__); \
+ printf("\n"); \
+} while (0)
+#else
+#define USBH_DbgLog(...) do {} while (0)
+#endif
+
+/**
+ * @}
+ */
+
+/** @defgroup USBH_CONF_Exported_Types USBH_CONF_Exported_Types
+ * @brief Types.
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup USBH_CONF_Exported_FunctionsPrototype USBH_CONF_Exported_FunctionsPrototype
+ * @brief Declaration of public functions for Usb host.
+ * @{
+ */
+
+/* Exported functions -------------------------------------------------------*/
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __USBH_CONF__H__ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/usbh_platform.h
@@ -1,0 +1,44 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : usbh_platform.h
+ * @brief : Header for usbh_platform.c file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __USBH_PLATFORM_H__
+#define __USBH_PLATFORM_H__
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "usb_host.h"
+
+/* USER CODE BEGIN INCLUDE */
+
+/* USER CODE END INCLUDE */
+
+void MX_DriverVbusFS(uint8_t state);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __USBH_PLATFORM_H__ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
binary files a/LEAF/Src/.DS_Store /dev/null differ
--- /dev/null
+++ b/LEAF/Src/MIDI_application.c
@@ -1,0 +1,192 @@
+/*
+ * MIDI_application.c
+ *
+ * Created on: 6 d�c. 2014
+ * Author: Xavier Halgand
+ *
+ * Modified on: 9/12/16 by C.P. to handle the MIDI_IDLE state properly, and
+ * added required code to be compatible with "NucleoSynth"
+ *
+ * 11/8/17 by C.P.: Version 0.7.7 - Use for Casio CTK-6200 Keyboard
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "audiostream.h"
+#include "MIDI_application.h"
+#include "usbh_core.h"
+#include "usbh_MIDI.h"
+#include "usb_host.h"
+#include "sfx.h"
+
+MIDI_ApplicationTypeDef MIDI_Appli_state = MIDI_APPLICATION_READY;
+extern ApplicationTypeDef Appli_state;
+extern USBH_HandleTypeDef hUsbHostFS;
+uint8_t MIDI_RX_Buffer[RX_BUFF_SIZE]__ATTR_RAM_D2; // MIDI reception buffer
+
+uint8_t key, velocity, ctrl, data, sustainInverted;
+
+uint8_t CCs[128];
+/* Private define ------------------------------------------------------------*/
+
+/* Private function prototypes -----------------------------------------------*/
+
+
+
+
+/*-----------------------------------------------------------------------------*/
+/**
+ * @brief Main routine for MIDI application, looped in main.c
+ * @param None
+ * @retval none
+ */
+void MIDI_Application(void)
+{
+ if(Appli_state == APPLICATION_READY)
+ {
+ if(MIDI_Appli_state == MIDI_APPLICATION_READY)
+ {
+
+ USBH_MIDI_Receive(&hUsbHostFS, MIDI_RX_Buffer, RX_BUFF_SIZE); // just once at the beginning, start the first reception
+ MIDI_Appli_state = MIDI_APPLICATION_RUNNING;
+ }
+ }
+ if(Appli_state == APPLICATION_DISCONNECT)
+ {
+ MIDI_Appli_state = MIDI_APPLICATION_READY;
+ USBH_MIDI_Stop(&hUsbHostFS);
+ }
+}
+
+/*-----------------------------------------------------------------------------*/
+void ProcessReceivedMidiDatas(uint32_t myLength)
+{
+ uint16_t numberOfPackets;
+ uint8_t *ptr = MIDI_RX_Buffer;
+ midi_package_t pack;
+
+ numberOfPackets = myLength >> 2; //each USB midi package is 4 bytes long
+
+ if (numberOfPackets != 0)
+ {
+ while(numberOfPackets--)
+ {
+ pack.cin_cable = *ptr ; ptr++ ;
+ pack.evnt0 = *ptr ; ptr++ ;
+ pack.evnt1 = *ptr ; ptr++ ;
+ pack.evnt2 = *ptr ; ptr++ ;
+
+ // Handle MIDI messages
+ switch(pack.evnt0)
+ {
+ case (0x80): // Note Off
+ key = pack.evnt1;
+ velocity = pack.evnt2;
+
+ noteOff(key, velocity);
+
+ break;
+ case (0x90): // Note On
+ key = pack.evnt1;
+ velocity = pack.evnt2;
+
+ noteOn(key, velocity);
+
+ break;
+ case (0xA0):
+ break;
+ case (0xB0):
+ ctrl = pack.evnt1;
+ data = pack.evnt2;
+ CCs[ctrl] = data;
+ switch(ctrl)
+ {
+ case (0x01):
+ break;
+ case (0x02):
+ break;
+ case (0x03):
+ break;
+ case (0x04):
+ break;
+ case (0x0D):
+ break;
+ case (0x4B):
+ break;
+ case (0x4C):
+ break;
+ case (0x5C):
+ break;
+ case (0x5F):
+ break;
+ case (0x49):
+ break;
+ case (0x48):
+ break;
+ case (0x5B):
+ break;
+ case (0x5D):
+ break;
+ case (0x4A):
+ break;
+ case (0x47):
+ break;
+ case (0x05):
+ break;
+ case (0x54):
+ break;
+ case (0x10):
+ break;
+ case (0x11):
+ break;
+ case (0x12):
+ break;
+ case (0x07):
+ break;
+ case (0x13):
+ break;
+ case (0x14):
+ break;
+ case (64): // sustain
+ if (data)
+ {
+ if (sustainInverted) sustainOff();
+ else sustainOn();
+ }
+ else
+ {
+ if (sustainInverted) sustainOn();
+ else sustainOff();
+ }
+ break;
+ }
+
+
+ break;
+ case (0xC0): // Program Change
+ break;
+ case (0xD0): // Mono Aftertouch
+ break;
+ case (0xE0): // Pitch Bend
+ pitchBend((pack.evnt1) + (pack.evnt2 << 7));
+ break;
+ case (0xF0):
+ break;
+ }
+ }
+ }
+}
+
+
+
+/*-----------------------------------------------------------------------------*/
+/**
+ * @brief MIDI data receive callback.
+ * @param phost: Host handle
+ * @retval None
+ */
+void USBH_MIDI_ReceiveCallback(USBH_HandleTypeDef *phost, uint32_t myLength)
+{
+ ProcessReceivedMidiDatas(myLength);
+ USBH_MIDI_Receive(&hUsbHostFS, MIDI_RX_Buffer, RX_BUFF_SIZE); // start a new reception
+}
+
--- /dev/null
+++ b/LEAF/Src/adc.c
@@ -1,0 +1,239 @@
+/**
+ ******************************************************************************
+ * File Name : ADC.c
+ * Description : This file provides code for the configuration
+ * of the ADC instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "adc.h"
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+ADC_HandleTypeDef hadc1;
+DMA_HandleTypeDef hdma_adc1;
+
+/* ADC1 init function */
+void MX_ADC1_Init(void)
+{
+ ADC_MultiModeTypeDef multimode = {0};
+ ADC_ChannelConfTypeDef sConfig = {0};
+
+ /** Common config
+ */
+ hadc1.Instance = ADC1;
+ hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;
+ hadc1.Init.Resolution = ADC_RESOLUTION_16B;
+ hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
+ hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
+ hadc1.Init.LowPowerAutoWait = DISABLE;
+ hadc1.Init.ContinuousConvMode = ENABLE;
+ hadc1.Init.NbrOfConversion = 6;
+ hadc1.Init.DiscontinuousConvMode = DISABLE;
+ hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
+ hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
+ hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
+ hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
+ hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
+ hadc1.Init.OversamplingMode = ENABLE;
+ hadc1.Init.Oversampling.Ratio = 64;
+ hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_6;
+ hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
+ hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE;
+ if (HAL_ADC_Init(&hadc1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the ADC multi-mode
+ */
+ multimode.Mode = ADC_MODE_INDEPENDENT;
+ if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Regular Channel
+ */
+ sConfig.Channel = ADC_CHANNEL_7;
+ sConfig.Rank = ADC_REGULAR_RANK_1;
+ sConfig.SamplingTime = ADC_SAMPLETIME_64CYCLES_5;
+ sConfig.SingleDiff = ADC_SINGLE_ENDED;
+ sConfig.OffsetNumber = ADC_OFFSET_NONE;
+ sConfig.Offset = 0;
+ if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Regular Channel
+ */
+ sConfig.Channel = ADC_CHANNEL_19;
+ sConfig.Rank = ADC_REGULAR_RANK_2;
+ if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Regular Channel
+ */
+ sConfig.Channel = ADC_CHANNEL_14;
+ sConfig.Rank = ADC_REGULAR_RANK_3;
+ if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Regular Channel
+ */
+ sConfig.Channel = ADC_CHANNEL_16;
+ sConfig.Rank = ADC_REGULAR_RANK_4;
+ if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Regular Channel
+ */
+ sConfig.Channel = ADC_CHANNEL_15;
+ sConfig.Rank = ADC_REGULAR_RANK_5;
+ if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Regular Channel
+ */
+ sConfig.Channel = ADC_CHANNEL_8;
+ sConfig.Rank = ADC_REGULAR_RANK_6;
+ if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+}
+
+void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
+{
+
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ HAL_DMA_MuxSyncConfigTypeDef pSyncConfig= {0};
+ if(adcHandle->Instance==ADC1)
+ {
+ /* USER CODE BEGIN ADC1_MspInit 0 */
+
+ /* USER CODE END ADC1_MspInit 0 */
+ /* ADC1 clock enable */
+ __HAL_RCC_ADC12_CLK_ENABLE();
+
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**ADC1 GPIO Configuration
+ PC1 ------> ADC1_INP11
+ PA0 ------> ADC1_INP16
+ PA2 ------> ADC1_INP14
+ PA3 ------> ADC1_INP15
+ PA5 ------> ADC1_INP19
+ PA7 ------> ADC1_INP7
+ PC5 ------> ADC1_INP8
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_5;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5
+ |GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* ADC1 DMA Init */
+ /* ADC1 Init */
+ hdma_adc1.Instance = DMA1_Stream0;
+ hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
+ hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
+ hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
+ hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
+ hdma_adc1.Init.Mode = DMA_CIRCULAR;
+ hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
+ hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
+ hdma_adc1.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_1QUARTERFULL;
+ hdma_adc1.Init.MemBurst = DMA_MBURST_SINGLE;
+ hdma_adc1.Init.PeriphBurst = DMA_PBURST_SINGLE;
+ if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ pSyncConfig.SyncSignalID = HAL_DMAMUX1_SYNC_EXTI0;
+ pSyncConfig.SyncPolarity = HAL_DMAMUX_SYNC_RISING;
+ pSyncConfig.SyncEnable = DISABLE;
+ pSyncConfig.EventEnable = ENABLE;
+ pSyncConfig.RequestNumber = 1;
+ if (HAL_DMAEx_ConfigMuxSync(&hdma_adc1, &pSyncConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
+
+ /* ADC1 interrupt Init */
+ HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(ADC_IRQn);
+ /* USER CODE BEGIN ADC1_MspInit 1 */
+
+ /* USER CODE END ADC1_MspInit 1 */
+ }
+}
+
+void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
+{
+
+ if(adcHandle->Instance==ADC1)
+ {
+ /* USER CODE BEGIN ADC1_MspDeInit 0 */
+
+ /* USER CODE END ADC1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_ADC12_CLK_DISABLE();
+
+ /**ADC1 GPIO Configuration
+ PC1 ------> ADC1_INP11
+ PA0 ------> ADC1_INP16
+ PA2 ------> ADC1_INP14
+ PA3 ------> ADC1_INP15
+ PA5 ------> ADC1_INP19
+ PA7 ------> ADC1_INP7
+ PC5 ------> ADC1_INP8
+ */
+ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_1|GPIO_PIN_5);
+
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5
+ |GPIO_PIN_7);
+
+ /* ADC1 DMA DeInit */
+ HAL_DMA_DeInit(adcHandle->DMA_Handle);
+
+ /* ADC1 interrupt Deinit */
+ HAL_NVIC_DisableIRQ(ADC_IRQn);
+ /* USER CODE BEGIN ADC1_MspDeInit 1 */
+
+ /* USER CODE END ADC1_MspDeInit 1 */
+ }
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/audiostream.c
@@ -1,0 +1,518 @@
+/*
+ * audiostream.c
+ *
+ * Created on: Aug 30, 2019
+ * Author: jeffsnyder
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "audiostream.h"
+#include "main.h"
+#include "leaf.h"
+#include "codec.h"
+#include "ui.h"
+#include "oled.h"
+#include "tunings.h"
+#include "i2c.h"
+#include "gpio.h"
+#include "sfx.h"
+#include "tim.h"
+
+//the audio buffers are put in the D2 RAM area because that is a memory location that the DMA has access to.
+int32_t audioOutBuffer[AUDIO_BUFFER_SIZE] __ATTR_RAM_D2;
+int32_t audioInBuffer[AUDIO_BUFFER_SIZE] __ATTR_RAM_D2;
+
+#define SMALL_MEM_SIZE 8192
+#define MED_MEM_SIZE 500000
+#define LARGE_MEM_SIZE 33554432 //32 MBytes - size of SDRAM IC
+char small_memory[SMALL_MEM_SIZE];
+char medium_memory[MED_MEM_SIZE]__ATTR_RAM_D1;
+char large_memory[LARGE_MEM_SIZE] __ATTR_SDRAM;
+
+#define DISPLAY_BLOCK_SIZE 512
+float audioDisplayBuffer[128];
+uint8_t displayBufferIndex = 0;
+float displayBlockVal = 0.0f;
+uint32_t displayBlockCount = 0;
+
+
+void audioFrame(uint16_t buffer_offset);
+float audioTickL(float audioIn);
+float audioTickR(float audioIn);
+void buttonCheck(void);
+
+HAL_StatusTypeDef transmit_status;
+HAL_StatusTypeDef receive_status;
+
+uint8_t codecReady = 0;
+
+uint16_t frameCounter = 0;
+
+tMempool smallPool;
+tMempool largePool;
+
+tRamp adc[6];
+
+tNoise myNoise;
+tCycle mySine[2];
+float smoothedADC[6];
+tEnvelopeFollower LED_envelope[4];
+
+uint32_t clipCounter[4] = {0,0,0,0};
+uint8_t clipped[4] = {0,0,0,0};
+
+
+float rightIn = 0.0f;
+float rightOut = 0.0f;
+float sample = 0.0f;
+
+
+
+// Vocoder
+float glideTimeVoc = 5.0f;
+
+// Formant
+float formantShiftFactor = -1.0f;
+float formantKnob = 0.0f;
+
+// PitchShift
+float pitchFactor = 2.0f;
+float formantWarp = 1.0f;
+float formantIntensity = 1.0f;
+
+// Autotune1
+
+// Autotune2
+float glideTimeAuto = 5.0f;
+
+// Sampler Button Press
+
+
+// Sampler Auto Grab
+
+
+
+
+
+
+BOOL frameCompleted = TRUE;
+
+BOOL bufferCleared = TRUE;
+
+int numBuffersToClearOnLoad = 2;
+int numBuffersCleared = 0;
+
+/**********************************************/
+
+void (*allocFunctions[PresetNil])(void);
+void (*frameFunctions[PresetNil])(void);
+void (*tickFunctions[PresetNil])(float);
+void (*freeFunctions[PresetNil])(void);
+
+void audioInit(I2C_HandleTypeDef* hi2c, SAI_HandleTypeDef* hsaiOut, SAI_HandleTypeDef* hsaiIn)
+{
+ // Initialize LEAF.
+
+ LEAF_init(SAMPLE_RATE, AUDIO_FRAME_SIZE, medium_memory, MED_MEM_SIZE, &randomNumber);
+
+ tMempool_init (&smallPool, small_memory, SMALL_MEM_SIZE);
+ tMempool_init (&largePool, large_memory, LARGE_MEM_SIZE);
+
+ initFunctionPointers();
+
+ //ramps to smooth the knobs
+ for (int i = 0; i < 6; i++)
+ {
+ tRamp_init(&adc[i],19.0f, 1); //set all ramps for knobs to be 9ms ramp time and let the init function know they will be ticked every sample
+ }
+
+ for (int i = 0; i < 4; i++)
+ {
+ tEnvelopeFollower_init(&LED_envelope[i], 0.02f, .9995f);
+ }
+
+ initGlobalSFXObjects();
+
+// allocFunctions[currentPreset]();
+
+ loadingPreset = 1;
+ previousPreset = PresetNil;
+
+ HAL_Delay(10);
+
+ for (int i = 0; i < AUDIO_BUFFER_SIZE; i++)
+ {
+ audioOutBuffer[i] = 0;
+ }
+
+ HAL_Delay(1);
+
+ // set up the I2S driver to send audio data to the codec (and retrieve input as well)
+ transmit_status = HAL_SAI_Transmit_DMA(hsaiOut, (uint8_t *)&audioOutBuffer[0], AUDIO_BUFFER_SIZE);
+ receive_status = HAL_SAI_Receive_DMA(hsaiIn, (uint8_t *)&audioInBuffer[0], AUDIO_BUFFER_SIZE);
+
+ // with the CS4271 codec IC, the SAI Transmit and Receive must be happening before the chip will respond to
+ // I2C setup messages (it seems to use the masterclock input as it's own internal clock for i2c data, etc)
+ // so while we used to set up codec before starting SAI, now we need to set up codec afterwards, and set a flag to make sure it's ready
+
+ //now to send all the necessary messages to the codec
+ AudioCodec_init(hi2c);
+ HAL_Delay(1);
+
+ //now reconfigue so buttons C and E can be used (they were also connected to I2C for codec setup)
+ HAL_I2C_MspDeInit(hi2c);
+
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+
+ //PB10, PB11 ------> buttons C and E
+ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+}
+
+void audioFrame(uint16_t buffer_offset)
+{
+ frameCompleted = FALSE;
+
+ int i;
+ int32_t current_sample;
+
+ buttonCheck();
+ adcCheck();
+
+ if (!loadingPreset)
+ {
+ frameFunctions[currentPreset]();
+ }
+
+ //if the codec isn't ready, keep the buffer as all zeros
+ //otherwise, start computing audio!
+
+ bufferCleared = TRUE;
+
+ if (codecReady)
+ {
+ for (i = 0; i < (HALF_BUFFER_SIZE); i++)
+ {
+ if ((i & 1) == 0)
+ {
+ current_sample = (int32_t)(audioTickR((float) (audioInBuffer[buffer_offset + i] << 8) * INV_TWO_TO_31) * TWO_TO_23);
+ }
+ else
+ {
+ current_sample = (int32_t)(audioTickL((float) (audioInBuffer[buffer_offset + i] << 8) * INV_TWO_TO_31) * TWO_TO_23);
+ }
+
+ audioOutBuffer[buffer_offset + i] = current_sample;
+ }
+
+ }
+
+ if (bufferCleared)
+ {
+ numBuffersCleared++;
+ if (numBuffersCleared >= numBuffersToClearOnLoad)
+ {
+ numBuffersCleared = numBuffersToClearOnLoad;
+ if (loadingPreset)
+ {
+ if (previousPreset != PresetNil)
+ {
+ // do this if you want to save knob values when changing off a preset
+// for (int i = 0; i < NUM_ADC_CHANNELS; i++)
+// {
+// presetKnobValues[previousPreset][i] = smoothedADC[i];
+// }
+ freeFunctions[previousPreset]();
+ }
+ else
+ {
+ leaf.clearOnAllocation = 1;
+ }
+ setLED_A(0);
+ setLED_B(0);
+ setLED_1(0);
+ allocFunctions[currentPreset]();
+ for (int i = 0; i < NUM_ADC_CHANNELS; i++)
+ {
+ knobActive[i] = 0;
+ floatADCUI[i] = -1.0f;
+ tRamp_setVal(&adc[i], presetKnobValues[currentPreset][i]);
+ tRamp_setDest(&adc[i], presetKnobValues[currentPreset][i]);
+ smoothedADC[i] = presetKnobValues[currentPreset][i];
+ }
+ leaf.clearOnAllocation = 0;
+ loadingPreset = 0;
+ }
+ }
+ }
+ else numBuffersCleared = 0;
+
+ frameCompleted = TRUE;
+
+ OLED_process(); // process what to write to the screen but don't actually draw
+}
+
+
+
+
+float audioTickL(float audioIn)
+{
+ sample = 0.0f;
+
+ for (int i = 0; i < NUM_ADC_CHANNELS; i++)
+ {
+ smoothedADC[i] = tRamp_tick(&adc[i]);
+ }
+
+ if (loadingPreset) return sample;
+
+ bufferCleared = FALSE;
+
+ tickFunctions[currentPreset](audioIn);
+/*
+ displayBlockVal += fabsf(sample);
+ displayBlockCount++;
+ if (displayBlockCount >= DISPLAY_BLOCK_SIZE)
+ {
+ displayBlockVal *= INV_TWO_TO_9;
+ audioDisplayBuffer[displayBufferIndex] = displayBlockVal;
+ displayBlockVal = 0.0f;
+ displayBlockCount = 0;
+ displayBufferIndex++;
+ if (displayBufferIndex >= 128) displayBufferIndex = 0;
+ }
+ */
+
+ if ((audioIn >= 0.999999f) || (audioIn <= -0.999999f))
+ {
+ setLED_leftin_clip(1);
+ clipCounter[0] = 10000;
+ clipped[0] = 1;
+ }
+ if ((clipCounter[0] > 0) && (clipped[0] == 1))
+ {
+ clipCounter[0]--;
+ }
+ else if ((clipCounter[0] == 0) && (clipped[0] == 1))
+ {
+ setLED_leftin_clip(0);
+ clipped[0] = 0;
+ }
+
+ float current_env = tEnvelopeFollower_tick(&LED_envelope[0], audioIn);
+ uint16_t audioLEDLevel = LEAF_clip(0, (current_env * 32.0f), 16);
+ __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, audioLEDLevel);
+
+
+ current_env = tEnvelopeFollower_tick(&LED_envelope[1], sample);
+ audioLEDLevel = LEAF_clip(0, (current_env * 32.0f), 15);
+ __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, audioLEDLevel);
+
+
+
+ if ((sample >= 0.999999f) || (sample <= -0.999999f))
+ {
+ setLED_leftout_clip(1);
+ clipCounter[2] = 10000;
+ clipped[2] = 1;
+ }
+ if ((clipCounter[2] > 0) && (clipped[2] == 1))
+ {
+ clipCounter[2]--;
+ }
+ else if ((clipCounter[2] == 0) && (clipped[2] == 1))
+ {
+ setLED_leftout_clip(0);
+ clipped[2] = 0;
+ }
+
+ return sample;
+}
+
+
+
+float audioTickR(float audioIn)
+{
+ rightIn = audioIn;
+
+
+ if ((rightIn >= 0.999999f) || (rightIn <= -0.999999f))
+ {
+ setLED_rightin_clip(1);
+ clipCounter[1] = 10000;
+ clipped[1] = 1;
+ }
+ if ((clipCounter[1] > 0) && (clipped[1] == 1))
+ {
+ clipCounter[1]--;
+ }
+ else if ((clipCounter[1] == 0) && (clipped[1] == 1))
+ {
+ setLED_rightin_clip(0);
+ clipped[1] = 0;
+ }
+
+
+
+ if ((rightOut >= 0.999999f) || (rightOut <= -0.999999f))
+ {
+ setLED_rightout_clip(1);
+ clipCounter[3] = 10000;
+ clipped[3] = 1;
+ }
+ if ((clipCounter[3] > 0) && (clipped[3] == 1))
+ {
+ clipCounter[3]--;
+ }
+ else if ((clipCounter[3] == 0) && (clipped[3] == 1))
+ {
+ setLED_rightout_clip(0);
+ clipped[3] = 0;
+ }
+
+
+ float current_env = tEnvelopeFollower_tick(&LED_envelope[2], rightIn);
+ uint16_t audioLEDLevel = LEAF_clip(0, (current_env * 32.0f), 16);
+ __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, audioLEDLevel);
+
+
+ current_env = tEnvelopeFollower_tick(&LED_envelope[3], rightOut);
+ audioLEDLevel = LEAF_clip(0, (current_env * 32.0f), 16);
+ __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, audioLEDLevel);
+
+
+ return rightOut;
+}
+
+void initFunctionPointers(void)
+{
+ allocFunctions[Vocoder] = SFXVocoderAlloc;
+ frameFunctions[Vocoder] = SFXVocoderFrame;
+ tickFunctions[Vocoder] = SFXVocoderTick;
+ freeFunctions[Vocoder] = SFXVocoderFree;
+
+ allocFunctions[Pitchshift] = SFXPitchShiftAlloc;
+ frameFunctions[Pitchshift] = SFXPitchShiftFrame;
+ tickFunctions[Pitchshift] = SFXPitchShiftTick;
+ freeFunctions[Pitchshift] = SFXPitchShiftFree;
+
+ allocFunctions[AutotuneMono] = SFXNeartuneAlloc;
+ frameFunctions[AutotuneMono] = SFXNeartuneFrame;
+ tickFunctions[AutotuneMono] = SFXNeartuneTick;
+ freeFunctions[AutotuneMono] = SFXNeartuneFree;
+
+ allocFunctions[AutotunePoly] = SFXAutotuneAlloc;
+ frameFunctions[AutotunePoly] = SFXAutotuneFrame;
+ tickFunctions[AutotunePoly] = SFXAutotuneTick;
+ freeFunctions[AutotunePoly] = SFXAutotuneFree;
+
+ allocFunctions[SamplerButtonPress] = SFXSamplerBPAlloc;
+ frameFunctions[SamplerButtonPress] = SFXSamplerBPFrame;
+ tickFunctions[SamplerButtonPress] = SFXSamplerBPTick;
+ freeFunctions[SamplerButtonPress] = SFXSamplerBPFree;
+
+ allocFunctions[SamplerAutoGrab] = SFXSamplerAutoAlloc;
+ frameFunctions[SamplerAutoGrab] = SFXSamplerAutoFrame;
+ tickFunctions[SamplerAutoGrab] = SFXSamplerAutoTick;
+ freeFunctions[SamplerAutoGrab] = SFXSamplerAutoFree;
+
+ allocFunctions[Distortion] = SFXDistortionAlloc;
+ frameFunctions[Distortion] = SFXDistortionFrame;
+ tickFunctions[Distortion] = SFXDistortionTick;
+ freeFunctions[Distortion] = SFXDistortionFree;
+
+ allocFunctions[Wavefolder] = SFXWaveFolderAlloc;
+ frameFunctions[Wavefolder] = SFXWaveFolderFrame;
+ tickFunctions[Wavefolder] = SFXWaveFolderTick;
+ freeFunctions[Wavefolder] = SFXWaveFolderFree;
+
+ allocFunctions[BitCrusher] = SFXBitcrusherAlloc;
+ frameFunctions[BitCrusher] = SFXBitcrusherFrame;
+ tickFunctions[BitCrusher] = SFXBitcrusherTick;
+ freeFunctions[BitCrusher] = SFXBitcrusherFree;
+
+ allocFunctions[Delay] = SFXDelayAlloc;
+ frameFunctions[Delay] = SFXDelayFrame;
+ tickFunctions[Delay] = SFXDelayTick;
+ freeFunctions[Delay] = SFXDelayFree;
+
+ allocFunctions[Reverb] = SFXReverbAlloc;
+ frameFunctions[Reverb] = SFXReverbFrame;
+ tickFunctions[Reverb] = SFXReverbTick;
+ freeFunctions[Reverb] = SFXReverbFree;
+
+ allocFunctions[Reverb2] = SFXReverb2Alloc;
+ frameFunctions[Reverb2] = SFXReverb2Frame;
+ tickFunctions[Reverb2] = SFXReverb2Tick;
+ freeFunctions[Reverb2] = SFXReverb2Free;
+
+ allocFunctions[LivingString] = SFXLivingStringAlloc;
+ frameFunctions[LivingString] = SFXLivingStringFrame;
+ tickFunctions[LivingString] = SFXLivingStringTick;
+ freeFunctions[LivingString] = SFXLivingStringFree;
+
+ allocFunctions[LivingStringSynth] = SFXLivingStringSynthAlloc;
+ frameFunctions[LivingStringSynth] = SFXLivingStringSynthFrame;
+ tickFunctions[LivingStringSynth] = SFXLivingStringSynthTick;
+ freeFunctions[LivingStringSynth] = SFXLivingStringSynthFree;
+
+ allocFunctions[ClassicSynth] = SFXClassicSynthAlloc;
+ frameFunctions[ClassicSynth] = SFXClassicSynthFrame;
+ tickFunctions[ClassicSynth] = SFXClassicSynthTick;
+ freeFunctions[ClassicSynth] = SFXClassicSynthFree;
+
+ allocFunctions[Rhodes] = SFXRhodesAlloc;
+ frameFunctions[Rhodes] = SFXRhodesFrame;
+ tickFunctions[Rhodes] = SFXRhodesTick;
+ freeFunctions[Rhodes] = SFXRhodesFree;
+}
+
+
+
+void HAL_SAI_ErrorCallback(SAI_HandleTypeDef *hsai)
+{
+ if (!frameCompleted)
+ {
+ setLED_C(1);
+ }
+}
+
+void HAL_SAI_TxCpltCallback(SAI_HandleTypeDef *hsai)
+{
+ if (!frameCompleted)
+ {
+ setLED_C(1);
+ }
+}
+
+void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai)
+{
+ if (!frameCompleted)
+ {
+ setLED_C(1);
+ }
+}
+
+
+void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
+{
+ if (!frameCompleted)
+ {
+ setLED_C(1);
+ }
+
+ audioFrame(HALF_BUFFER_SIZE);
+}
+
+void HAL_SAI_RxHalfCpltCallback(SAI_HandleTypeDef *hsai)
+{
+ if (!frameCompleted)
+ {
+ setLED_C(1);
+ }
+
+ audioFrame(0);
+}
--- /dev/null
+++ b/LEAF/Src/bdma.c
@@ -1,0 +1,66 @@
+/**
+ ******************************************************************************
+ * File Name : dma.c
+ * Description : This file provides code for the configuration
+ * of all the requested memory to memory DMA transfers.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "bdma.h"
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/*----------------------------------------------------------------------------*/
+/* Configure DMA */
+/*----------------------------------------------------------------------------*/
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/**
+ * Enable DMA controller clock
+ */
+void MX_BDMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_BDMA_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* BDMA_Channel0_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(BDMA_Channel0_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(BDMA_Channel0_IRQn);
+ /* BDMA_Channel1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(BDMA_Channel1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(BDMA_Channel1_IRQn);
+
+}
+
+/* USER CODE BEGIN 2 */
+
+/* USER CODE END 2 */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/bsp_driver_sd.c
@@ -1,0 +1,307 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file bsp_driver_sd.c for H7 (based on stm32h743i_eval_sd.c)
+ * @brief This file includes a generic uSD card driver.
+ * To be completed by the user according to the board used for the project.
+ * @note Functions generated as weak: they can be overriden by
+ * - code in user files
+ * - or BSP code from the FW pack files
+ * if such files are added to the generated project (by the user).
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* USER CODE BEGIN FirstSection */
+/* can be used to modify / undefine following code or add new definitions */
+/* USER CODE END FirstSection */
+/* Includes ------------------------------------------------------------------*/
+#include "bsp_driver_sd.h"
+
+/* Extern variables ---------------------------------------------------------*/
+
+extern SD_HandleTypeDef hsd1;
+
+/* USER CODE BEGIN BeforeInitSection */
+/* can be used to modify / undefine following code or add code */
+/* USER CODE END BeforeInitSection */
+/**
+ * @brief Initializes the SD card device.
+ * @retval SD status
+ */
+__weak uint8_t BSP_SD_Init(void)
+{
+ uint8_t sd_state = MSD_OK;
+ /* Check if the SD card is plugged in the slot */
+ if (BSP_SD_IsDetected() != SD_PRESENT)
+ {
+ return MSD_ERROR_SD_NOT_PRESENT;
+ }
+ /* HAL SD initialization */
+ sd_state = HAL_SD_Init(&hsd1);
+ /* Configure SD Bus width (4 bits mode selected) */
+ if (sd_state == MSD_OK)
+ {
+ /* Enable wide operation */
+ if (HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B) != HAL_OK)
+ {
+ sd_state = MSD_ERROR;
+ }
+ }
+
+ return sd_state;
+}
+/* USER CODE BEGIN AfterInitSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END AfterInitSection */
+
+/* USER CODE BEGIN InterruptMode */
+/**
+ * @brief Configures Interrupt mode for SD detection pin.
+ * @retval Returns 0
+ */
+__weak uint8_t BSP_SD_ITConfig(void)
+{
+ /* Code to be updated by the user or replaced by one from the FW pack (in a stmxxxx_sd.c file) */
+
+ return (uint8_t)0;
+}
+
+/* USER CODE END InterruptMode */
+
+/* USER CODE BEGIN BeforeReadBlocksSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END BeforeReadBlocksSection */
+/**
+ * @brief Reads block(s) from a specified address in an SD card, in polling mode.
+ * @param pData: Pointer to the buffer that will contain the data to transmit
+ * @param ReadAddr: Address from where data is to be read
+ * @param NumOfBlocks: Number of SD blocks to read
+ * @param Timeout: Timeout for read operation
+ * @retval SD status
+ */
+__weak uint8_t BSP_SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout)
+{
+ uint8_t sd_state = MSD_OK;
+
+ if (HAL_SD_ReadBlocks(&hsd1, (uint8_t *)pData, ReadAddr, NumOfBlocks, Timeout) != HAL_OK)
+ {
+ sd_state = MSD_ERROR;
+ }
+
+ return sd_state;
+}
+
+/* USER CODE BEGIN BeforeWriteBlocksSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END BeforeWriteBlocksSection */
+/**
+ * @brief Writes block(s) to a specified address in an SD card, in polling mode.
+ * @param pData: Pointer to the buffer that will contain the data to transmit
+ * @param WriteAddr: Address from where data is to be written
+ * @param NumOfBlocks: Number of SD blocks to write
+ * @param Timeout: Timeout for write operation
+ * @retval SD status
+ */
+__weak uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout)
+{
+ uint8_t sd_state = MSD_OK;
+
+ if (HAL_SD_WriteBlocks(&hsd1, (uint8_t *)pData, WriteAddr, NumOfBlocks, Timeout) != HAL_OK)
+ {
+ sd_state = MSD_ERROR;
+ }
+
+ return sd_state;
+}
+
+/* USER CODE BEGIN BeforeReadDMABlocksSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END BeforeReadDMABlocksSection */
+/**
+ * @brief Reads block(s) from a specified address in an SD card, in DMA mode.
+ * @param pData: Pointer to the buffer that will contain the data to transmit
+ * @param ReadAddr: Address from where data is to be read
+ * @param NumOfBlocks: Number of SD blocks to read
+ * @retval SD status
+ */
+__weak uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks)
+{
+ uint8_t sd_state = MSD_OK;
+
+ /* Read block(s) in DMA transfer mode */
+ if (HAL_SD_ReadBlocks_DMA(&hsd1, (uint8_t *)pData, ReadAddr, NumOfBlocks) != HAL_OK)
+ {
+ sd_state = MSD_ERROR;
+ }
+
+ return sd_state;
+}
+
+/* USER CODE BEGIN BeforeWriteDMABlocksSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END BeforeWriteDMABlocksSection */
+/**
+ * @brief Writes block(s) to a specified address in an SD card, in DMA mode.
+ * @param pData: Pointer to the buffer that will contain the data to transmit
+ * @param WriteAddr: Address from where data is to be written
+ * @param NumOfBlocks: Number of SD blocks to write
+ * @retval SD status
+ */
+__weak uint8_t BSP_SD_WriteBlocks_DMA(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks)
+{
+ uint8_t sd_state = MSD_OK;
+
+ /* Write block(s) in DMA transfer mode */
+ if (HAL_SD_WriteBlocks_DMA(&hsd1, (uint8_t *)pData, WriteAddr, NumOfBlocks) != HAL_OK)
+ {
+ sd_state = MSD_ERROR;
+ }
+
+ return sd_state;
+}
+
+/* USER CODE BEGIN BeforeEraseSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END BeforeEraseSection */
+/**
+ * @brief Erases the specified memory area of the given SD card.
+ * @param StartAddr: Start byte address
+ * @param EndAddr: End byte address
+ * @retval SD status
+ */
+__weak uint8_t BSP_SD_Erase(uint32_t StartAddr, uint32_t EndAddr)
+{
+ uint8_t sd_state = MSD_OK;
+
+ if (HAL_SD_Erase(&hsd1, StartAddr, EndAddr) != HAL_OK)
+ {
+ sd_state = MSD_ERROR;
+ }
+
+ return sd_state;
+}
+
+/* USER CODE BEGIN BeforeGetCardStateSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END BeforeGetCardStateSection */
+
+/**
+ * @brief Gets the current SD card data status.
+ * @param None
+ * @retval Data transfer state.
+ * This value can be one of the following values:
+ * @arg SD_TRANSFER_OK: No data transfer is acting
+ * @arg SD_TRANSFER_BUSY: Data transfer is acting
+ */
+__weak uint8_t BSP_SD_GetCardState(void)
+{
+ return ((HAL_SD_GetCardState(&hsd1) == HAL_SD_CARD_TRANSFER ) ? SD_TRANSFER_OK : SD_TRANSFER_BUSY);
+}
+
+/**
+ * @brief Get SD information about specific SD card.
+ * @param CardInfo: Pointer to HAL_SD_CardInfoTypedef structure
+ * @retval None
+ */
+__weak void BSP_SD_GetCardInfo(HAL_SD_CardInfoTypeDef *CardInfo)
+{
+ /* Get SD card Information */
+ HAL_SD_GetCardInfo(&hsd1, CardInfo);
+}
+
+/* USER CODE BEGIN BeforeCallBacksSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END BeforeCallBacksSection */
+/**
+ * @brief SD Abort callbacks
+ * @param hsd: SD handle
+ * @retval None
+ */
+__weak void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd)
+{
+ BSP_SD_AbortCallback();
+}
+
+/**
+ * @brief Tx Transfer completed callback
+ * @param hsd: SD handle
+ * @retval None
+ */
+__weak void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
+{
+ BSP_SD_WriteCpltCallback();
+}
+
+/**
+ * @brief Rx Transfer completed callback
+ * @param hsd: SD handle
+ * @retval None
+ */
+__weak void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
+{
+ BSP_SD_ReadCpltCallback();
+}
+
+/* USER CODE BEGIN CallBacksSection_C */
+/**
+ * @brief BSP SD Abort callback
+ * @retval None
+ */
+__weak void BSP_SD_AbortCallback(void)
+{
+
+}
+
+/**
+ * @brief BSP Tx Transfer completed callback
+ * @retval None
+ */
+__weak void BSP_SD_WriteCpltCallback(void)
+{
+
+}
+
+/**
+ * @brief BSP Rx Transfer completed callback
+ * @retval None
+ */
+__weak void BSP_SD_ReadCpltCallback(void)
+{
+
+}
+/* USER CODE END CallBacksSection_C */
+
+/**
+ * @brief Detects if SD card is correctly plugged in the memory slot or not.
+ * @param None
+ * @retval Returns if SD is detected or not
+ */
+__weak uint8_t BSP_SD_IsDetected(void)
+{
+ __IO uint8_t status = SD_PRESENT;
+
+ if (BSP_PlatformIsDetected() == 0x0)
+ {
+ status = SD_NOT_PRESENT;
+ }
+
+ return status;
+}
+
+/* USER CODE BEGIN AdditionalCode */
+/* user code can be inserted here */
+/* USER CODE END AdditionalCode */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/codec.c
@@ -1,0 +1,125 @@
+#include "codec.h"
+#include "main.h"
+#include "gpio.h"
+#include "audiostream.h"
+
+uint16_t i2cDataSize = 2;
+uint8_t myI2cData[2] = {0,0};
+uint32_t I2Ctimeout = 2000;
+
+//Settings for CS4271
+// translated from the datasheet by JS
+
+// 01h mode control 1
+//
+// M1 M0 ratio1 ratio0 m/s dac_dif2 dac_dif1 dac_dif0 // unsure if setting bit selects master means 1
+// for 48k == 0 1 0 0 0 0 0 1 ( ratio bit chosen as 0 0 based on assumption of 256X master clock)
+// == 0x41
+// for 96k == 1 0 0 0 0 0 0 1 ( ratio bit chosen as 0 0 based on assumption of <= 256X master clock)
+// == 0x81
+// for 192k == 1 1 1 0 0 0 0 1 ( ratio bit chosen as 1 0 based on assumption of 256X master clock, choose 0 0 (full word would be 0xc1 instead of 0xe1) instead if using something like 64X)
+// == 0xe1
+
+// 02h DAC control
+// AMUTE, FILT_SEL, DEM1, DEM0, RMP_UP, RMP_DN, INV_A, INV_B
+// 0 0 0 0 1 1 0 0
+// == 0x0c if you want a slow ramp up when the part turns on
+// == 0x00 if you want quick start up (which may click)
+
+// 03h dac volume and mixing
+// (NA) B=A soft zerocross ATAPI3 ATAPI2 ATAPI1 ATAPI0 (B=A makes channel volumes not independent)
+// 0 1 1 1 1 0 0 1 (the last four bits set channel L to go to output A and channel R to go to output B, but this is easily changed with mixing or reversal)
+// == 0x79
+//or without soft ramp for any programmed volume changes // == 0x39
+
+// 04h Volume A
+// MUTE vol6 vol5 vol4 vol3 vol2 vol1 vol0
+// 0 0 0 0 0 0 0 0
+// == 0x00
+//or 0x14 for -20db
+
+// 05h Volume B
+// MUTE vol6 vol5 vol4 vol3 vol2 vol1 vol0
+// 0 0 0 0 0 0 0 0
+// == 0x00
+//or 0x14 for -20db
+
+// 06h ADC control
+// (NA) (NA) Dither16 ADC_DIF MUTEA MUTEB HPFDisableA HPFDisableB
+// 0 0 0 1 0 0 0 0
+// ==0x10
+
+// 07h mode control 2
+// (NA) (NA) (NA) LOOP MUTECA=B FREEZE CPEN PDN
+// for power down version == 0 0 0 0 0 0 1 1
+// == 0x03
+// to send dry ADC input into DAC (it seems this will mute the normal DAC output) == 0 0 0 1 0 0 1 0
+// == 0x12
+// for normal operation == 0 0 0 0 0 0 1 0
+// == 0x02
+
+HAL_StatusTypeDef testVal;
+
+
+volatile int blankCount = 0;
+uint16_t addressCounter = 0;
+
+
+void AudioCodec_init(I2C_HandleTypeDef* hi2c) {
+
+ //pull codec reset pin high to start codec working
+ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET);
+
+ HAL_Delay(2);
+ //enable control port and put part in power-down mode while loading registers
+ myI2cData[0] = 0x07;
+ myI2cData[1] = 0x03;
+ testVal = HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+ //HAL_Delay(2);
+
+ myI2cData[0] = 0x01;
+ myI2cData[1] = 0x41;
+ testVal = HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+
+ //HAL_Delay(1); // might not be necessary
+
+ myI2cData[0] = 0x02;
+ myI2cData[1] = 0x00;
+ testVal = HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+
+ //HAL_Delay(1); // might not be necessary
+
+ myI2cData[0] = 0x03;
+ myI2cData[1] = 0x79;
+ testVal = HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+
+ //HAL_Delay(1); // might not be necessary
+
+ myI2cData[0] = 0x04;
+ myI2cData[1] = 0x01;
+ testVal = HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+
+ //HAL_Delay(1); // might not be necessary
+
+ myI2cData[0] = 0x05;
+ myI2cData[1] = 0x01;
+ testVal = HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+
+ //HAL_Delay(1); // might not be necessary
+
+ myI2cData[0] = 0x06;
+ myI2cData[1] = 0x10;
+ testVal = HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+
+ //HAL_Delay(1); // might not be necessary
+
+ //turn off power down bit to start things cookin'
+ myI2cData[0] = 0x07;
+ myI2cData[1] = 0x02;
+ HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+
+
+ //HAL_Delay(1); // might not be necessary
+ codecReady = 1;
+
+}
--- /dev/null
+++ b/LEAF/Src/debug.c
@@ -1,0 +1,37 @@
+/**
+ ******************************************************************************
+ * File Name : DEBUG.c
+ * Description : This file provides code for the configuration
+ * of the DEBUG instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "debug.h"
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* DEBUG init function */
+void MX_DEBUG_Init(void)
+{
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/dma.c
@@ -1,0 +1,72 @@
+/**
+ ******************************************************************************
+ * File Name : dma.c
+ * Description : This file provides code for the configuration
+ * of all the requested memory to memory DMA transfers.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "dma.h"
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/*----------------------------------------------------------------------------*/
+/* Configure DMA */
+/*----------------------------------------------------------------------------*/
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/**
+ * Enable DMA controller clock
+ */
+void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Stream0_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 5, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
+ /* DMA1_Stream1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 2, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
+ /* DMA1_Stream2_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 2, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn);
+ /* DMAMUX1_OVR_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMAMUX1_OVR_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMAMUX1_OVR_IRQn);
+
+}
+
+/* USER CODE BEGIN 2 */
+
+/* USER CODE END 2 */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/eeprom.c
@@ -1,0 +1,718 @@
+
+
+/** @addtogroup EEPROM_Emulation
+ * @{
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "eeprom.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/* Global variable used to store variable value in read sequence */
+uint16_t DataVar = 0;
+
+/* Virtual address defined by the user: 0xFFFF value is prohibited */
+
+uint16_t VirtAddVarTab[NB_OF_VAR] = {0x5555, 0x6666, 0x7777};
+uint32_t Address = 0;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+static HAL_StatusTypeDef EE_Format(void);
+static uint16_t EE_FindValidPage(uint8_t Operation);
+static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data);
+static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data);
+static uint16_t EE_VerifyPageFullyErased(uint32_t Address);
+
+/**
+ * @brief Restore the pages to a known good state in case of page's status
+ * corruption after a power loss.
+ * @param None.
+ * @retval - Flash error code: on write Flash error
+ * - FLASH_COMPLETE: on success
+ */
+
+uint16_t EE_Init(void)
+{
+ uint16_t PageStatus0 = 6, PageStatus1 = 6;
+ uint16_t VarIdx = 0;
+ uint16_t EepromStatus = 0, ReadStatus = 0;
+ int16_t x = -1;
+ HAL_StatusTypeDef FlashStatus;
+ uint32_t SectorError = 0;
+ FLASH_EraseInitTypeDef pEraseInit;
+ uint32_t valid[8] = {0x0000};
+
+ /* Get Page0 status */
+ PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS);
+ /* Get Page1 status */
+ PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS);
+
+ pEraseInit.TypeErase = TYPEERASE_SECTORS;
+ pEraseInit.Banks = FLASH_BANK_2 ;
+ pEraseInit.Sector = PAGE0_ID;
+ pEraseInit.NbSectors = 1;
+ pEraseInit.VoltageRange = VOLTAGE_RANGE;
+
+ /* Check for invalid header states and repair if necessary */
+ switch (PageStatus0)
+ {
+ case ERASED:
+ if (PageStatus1 == VALID_PAGE) /* Page0 erased, Page1 valid */
+ {
+ /* Erase Page0 */
+ if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ }
+ else if (PageStatus1 == RECEIVE_DATA) /* Page0 erased, Page1 receive */
+ {
+ /* Erase Page0 */
+ if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ /* Mark Page1 as valid */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, PAGE1_BASE_ADDRESS, ((uint32_t)valid));
+
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ else /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */
+ {
+ /* Erase both Page0 and Page1 and set Page0 as valid page */
+ FlashStatus = EE_Format();
+ /* If erase/program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ break;
+
+ case RECEIVE_DATA:
+ if (PageStatus1 == VALID_PAGE) /* Page0 receive, Page1 valid */
+ {
+ /* Transfer data from Page1 to Page0 */
+ for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++)
+ {
+ if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx])
+ {
+ x = VarIdx;
+ }
+ if (VarIdx != x)
+ {
+ /* Read the last variables' updates */
+ ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar);
+ /* In case variable corresponding to the virtual address was found */
+ if (ReadStatus != 0x1)
+ {
+ /* Transfer the variable to the Page0 */
+ EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
+ /* If program operation was failed, a Flash error code is returned */
+ if (EepromStatus != HAL_OK)
+ {
+ return EepromStatus;
+ }
+ }
+ }
+ }
+ /* Mark Page0 as valid */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, PAGE0_BASE_ADDRESS, ((uint32_t)valid));
+
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ pEraseInit.Sector = PAGE1_ID;
+ pEraseInit.Banks = FLASH_BANK_2 ;
+ pEraseInit.NbSectors = 1;
+ pEraseInit.VoltageRange = VOLTAGE_RANGE;
+ /* Erase Page1 */
+ if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ }
+ else if (PageStatus1 == ERASED) /* Page0 receive, Page1 erased */
+ {
+ pEraseInit.Sector = PAGE1_ID;
+ pEraseInit.Banks = FLASH_BANK_1 ;
+ pEraseInit.NbSectors = 1;
+ pEraseInit.VoltageRange = VOLTAGE_RANGE;
+ /* Erase Page1 */
+ if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ /* Mark Page0 as valid */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, PAGE0_BASE_ADDRESS, ((uint32_t)valid));
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ else /* Invalid state -> format eeprom */
+ {
+ /* Erase both Page0 and Page1 and set Page0 as valid page */
+ FlashStatus = EE_Format();
+ /* If erase/program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ break;
+
+ case VALID_PAGE:
+ if (PageStatus1 == VALID_PAGE) /* Invalid state -> format eeprom */
+ {
+ /* Erase both Page0 and Page1 and set Page0 as valid page */
+ FlashStatus = EE_Format();
+ /* If erase/program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ else if (PageStatus1 == ERASED) /* Page0 valid, Page1 erased */
+ {
+ pEraseInit.Sector = PAGE1_ID;
+ pEraseInit.Banks = FLASH_BANK_2 ;
+ pEraseInit.NbSectors = 1;
+ pEraseInit.VoltageRange = VOLTAGE_RANGE;
+ /* Erase Page1 */
+ if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ }
+ else /* Page0 valid, Page1 receive */
+ {
+ /* Transfer data from Page0 to Page1 */
+ for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++)
+ {
+ if ((*(__IO uint16_t*)(PAGE1_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx])
+ {
+ x = VarIdx;
+ }
+ if (VarIdx != x)
+ {
+ /* Read the last variables' updates */
+ ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar);
+ /* In case variable corresponding to the virtual address was found */
+ if (ReadStatus != 0x1)
+ {
+ /* Transfer the variable to the Page1 */
+ EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
+ /* If program operation was failed, a Flash error code is returned */
+ if (EepromStatus != HAL_OK)
+ {
+ return EepromStatus;
+ }
+ }
+ }
+ }
+ /* Mark Page1 as valid */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, PAGE1_BASE_ADDRESS, ((uint32_t)valid));
+
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ pEraseInit.Sector = PAGE0_ID;
+ pEraseInit.Banks = FLASH_BANK_2 ;
+ pEraseInit.NbSectors = 1;
+ pEraseInit.VoltageRange = VOLTAGE_RANGE;
+ /* Erase Page0 */
+ if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ }
+ break;
+
+ default: /* Any other state -> format eeprom */
+ /* Erase both Page0 and Page1 and set Page0 as valid page */
+ FlashStatus = EE_Format();
+ /* If erase/program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ break;
+ }
+
+ return HAL_OK;
+}
+
+/**
+ * @brief Verify if specified page is fully erased.
+ * @param Address: page address
+ * This parameter can be one of the following values:
+ * @arg PAGE0_BASE_ADDRESS: Page0 base address
+ * @arg PAGE1_BASE_ADDRESS: Page1 base address
+ * @retval page fully erased status:
+ * - 0: if Page not erased
+ * - 1: if Page erased
+ */
+uint16_t EE_VerifyPageFullyErased(uint32_t Address)
+{
+ uint32_t ReadStatus = 1;
+ uint16_t AddressValue = 0x5555;
+
+ /* Check each active page address starting from end */
+ while (Address <= PAGE0_END_ADDRESS)
+ {
+ /* Get the current location content to be compared with virtual address */
+ AddressValue = (*(__IO uint16_t*)Address);
+
+ /* Compare the read address with the virtual address */
+ if (AddressValue != ERASED)
+ {
+
+ /* In case variable value is read, reset ReadStatus flag */
+ ReadStatus = 0;
+
+ break;
+ }
+ /* Next address location */
+ Address = Address + 4;
+ }
+
+ /* Return ReadStatus value: (0: Page not erased, 1: Sector erased) */
+ return ReadStatus;
+}
+
+/**
+ * @brief Returns the last stored variable data, if found, which correspond to
+ * the passed virtual address
+ * @param VirtAddress: Variable virtual address
+ * @param Data: Global variable contains the read variable value
+ * @retval Success or error status:
+ * - 0: if variable was found
+ * - 1: if the variable was not found
+ * - NO_VALID_PAGE: if no valid page was found.
+ */
+uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
+{
+ uint16_t ValidPage = PAGE0;
+ uint16_t AddressValue = 0x5555, ReadStatus = 1;
+ uint32_t Address = EEPROM_START_ADDRESS, PageStartAddress = EEPROM_START_ADDRESS;
+
+ /* Get active Page for read operation */
+ ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE);
+
+ /* Check if there is no valid page */
+ if (ValidPage == NO_VALID_PAGE)
+ {
+ return NO_VALID_PAGE;
+ }
+
+ /* Get the valid Page start Address */
+ PageStartAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
+
+ /* Get the valid Page end Address */
+ Address = (uint32_t)((EEPROM_START_ADDRESS - 32) + (uint32_t)((1 + ValidPage) * PAGE_SIZE));
+
+ /* Check each active page address starting from end */
+ while (Address > (PageStartAddress + 32))
+ {
+ /* Get the current location content to be compared with virtual address */
+ AddressValue = (*(__IO uint16_t*)Address);
+
+ /* Compare the read address with the virtual address */
+ if (AddressValue == VirtAddress)
+ {
+ /* Get content of Address-2 which is variable value */
+ *Data = (*(__IO uint16_t*)(Address - 32));
+
+ /* In case variable value is read, reset ReadStatus flag */
+ ReadStatus = 0;
+
+ break;
+ }
+ else
+ {
+ /* Next address location */
+ Address = Address - 32;
+ }
+ }
+
+ /* Return ReadStatus value: (0: variable exist, 1: variable doesn't exist) */
+ return ReadStatus;
+}
+
+/**
+ * @brief Writes/upadtes variable data in EEPROM.
+ * @param VirtAddress: Variable virtual address
+ * @param Data: 16 bit data to be written
+ * @retval Success or error status:
+ * - FLASH_COMPLETE: on success
+ * - PAGE_FULL: if valid page is full
+ * - NO_VALID_PAGE: if no valid page was found
+ * - Flash error code: on write Flash error
+ */
+uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
+{
+ uint16_t Status = 0;
+
+ /* Write the variable virtual address and value in the EEPROM */
+ Status = EE_VerifyPageFullWriteVariable(VirtAddress, Data);
+
+ /* In case the EEPROM active page is full */
+ if (Status == PAGE_FULL)
+ {
+ /* Perform Page transfer */
+ Status = EE_PageTransfer(VirtAddress, Data);
+ }
+
+ /* Return last operation status */
+ return Status;
+}
+
+/**
+ * @brief Erases PAGE and PAGE1 and writes VALID_PAGE header to PAGE
+ * @param None
+ * @retval Status of the last operation (Flash write or erase) done during
+ * EEPROM formating
+ */
+static HAL_StatusTypeDef EE_Format(void)
+{
+ HAL_StatusTypeDef FlashStatus = HAL_OK;
+ uint32_t SectorError = 0;
+ FLASH_EraseInitTypeDef pEraseInit;
+ uint32_t valid[8] = {0x0000};
+
+ pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
+ pEraseInit.Banks = FLASH_BANK_2 ;
+ pEraseInit.Sector = PAGE0_ID;
+ pEraseInit.NbSectors = 1;
+ pEraseInit.VoltageRange = VOLTAGE_RANGE;
+
+ /* Erase Page0 */
+ if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+
+ /* Set Page0 as valid page: Write VALID_PAGE at Page0 base address */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, PAGE0_BASE_ADDRESS,((uint32_t)valid));
+
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+
+ pEraseInit.Sector = PAGE1_ID;
+ /* Erase Page1 */
+ if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+
+ return HAL_OK;
+}
+
+/**
+ * @brief Find valid Page for write or read operation
+ * @param Operation: operation to achieve on the valid page.
+ * This parameter can be one of the following values:
+ * @arg READ_FROM_VALID_PAGE: read operation from valid page
+ * @arg WRITE_IN_VALID_PAGE: write operation from valid page
+ * @retval Valid page number (PAGE or PAGE1) or NO_VALID_PAGE in case
+ * of no valid page was found
+ */
+static uint16_t EE_FindValidPage(uint8_t Operation)
+{
+ uint16_t PageStatus0 = 6, PageStatus1 = 6;
+
+ /* Get Page0 actual status */
+ PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS);
+
+ /* Get Page1 actual status */
+ PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS);
+
+ /* Write or read operation */
+ switch (Operation)
+ {
+ case WRITE_IN_VALID_PAGE: /* ---- Write operation ---- */
+ if (PageStatus1 == VALID_PAGE)
+ {
+ /* Page0 receiving data */
+ if (PageStatus0 == RECEIVE_DATA)
+ {
+ return PAGE0; /* Page0 valid */
+ }
+ else
+ {
+ return PAGE1; /* Page1 valid */
+ }
+ }
+ else if (PageStatus0 == VALID_PAGE)
+ {
+ /* Page1 receiving data */
+ if (PageStatus1 == RECEIVE_DATA)
+ {
+ return PAGE1; /* Page1 valid */
+ }
+ else
+ {
+ return PAGE0; /* Page0 valid */
+ }
+ }
+ else
+ {
+ return NO_VALID_PAGE; /* No valid Page */
+ }
+
+ case READ_FROM_VALID_PAGE: /* ---- Read operation ---- */
+ if (PageStatus0 == VALID_PAGE)
+ {
+ return PAGE0; /* Page0 valid */
+ }
+ else if (PageStatus1 == VALID_PAGE)
+ {
+ return PAGE1; /* Page1 valid */
+ }
+ else
+ {
+ return NO_VALID_PAGE ; /* No valid Page */
+ }
+
+ default:
+ return PAGE0; /* Page0 valid */
+ }
+}
+
+/**
+ * @brief Verify if active page is full and Writes variable in EEPROM.
+ * @param VirtAddress: 16 bit virtual address of the variable
+ * @param Data: 16 bit data to be written as variable value
+ * @retval Success or error status:
+ * - FLASH_COMPLETE: on success
+ * - PAGE_FULL: if valid page is full
+ * - NO_VALID_PAGE: if no valid page was found
+ * - Flash error code: on write Flash error
+ */
+static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data)
+{
+ HAL_StatusTypeDef FlashStatus = HAL_OK;
+ uint16_t ValidPage = PAGE0;
+ uint32_t Address = EEPROM_START_ADDRESS, PageEndAddress = EEPROM_START_ADDRESS+PAGE_SIZE;
+
+ uint32_t data32[8] = {Data};
+ uint32_t VirtAddress1[8] = {VirtAddress};
+ /* Get valid Page for write operation */
+ ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE);
+
+ /* Check if there is no valid page */
+ if (ValidPage == NO_VALID_PAGE)
+ {
+ return NO_VALID_PAGE;
+ }
+
+ /* Get the valid Page start Address */
+ Address = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
+
+ /* Get the valid Page end Address */
+ PageEndAddress = (uint32_t)((EEPROM_START_ADDRESS - 1) + (uint32_t)((ValidPage + 1) * PAGE_SIZE));
+
+ /* Check each active page address starting from begining */
+ while (Address < PageEndAddress)
+ {
+ /* Verify if Address and Address+2 contents are 0xFFFFFFFF */
+ if ((*(__IO uint32_t*)Address) == 0xFFFFFFFF)
+ {
+ /* Set variable data */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, Address, ((uint32_t)data32));
+
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ /* Set variable virtual address */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, Address + 32, ((uint32_t)VirtAddress1));
+
+ /* Return program operation status */
+ return FlashStatus;
+ }
+ else
+ {
+ /* Next address location */
+ Address = Address + 64;
+ }
+ }
+
+ /* Return PAGE_FULL in case the valid page is full */
+ return PAGE_FULL;
+}
+
+/**
+ * @brief Transfers last updated variables data from the full Page to
+ * an empty one.
+ * @param VirtAddress: 16 bit virtual address of the variable
+ * @param Data: 16 bit data to be written as variable value
+ * @retval Success or error status:
+ * - FLASH_COMPLETE: on success
+ * - PAGE_FULL: if valid page is full
+ * - NO_VALID_PAGE: if no valid page was found
+ * - Flash error code: on write Flash error
+ */
+static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data)
+{
+ HAL_StatusTypeDef FlashStatus = HAL_OK;
+ uint32_t NewPageAddress = EEPROM_START_ADDRESS;
+ uint16_t OldPageId=0;
+ uint16_t ValidPage = PAGE0, VarIdx = 0;
+ uint16_t EepromStatus = 0, ReadStatus = 0;
+ uint32_t SectorError = 0;
+ FLASH_EraseInitTypeDef pEraseInit;
+ uint32_t valid[8] = {0x0000};
+ uint32_t receive[8] = {0xEEEE};
+ /* Get active Page for read operation */
+ ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE);
+
+ if (ValidPage == PAGE1) /* Page1 valid */
+ {
+ /* New page address where variable will be moved to */
+ NewPageAddress = PAGE0_BASE_ADDRESS;
+
+ /* Old page ID where variable will be taken from */
+ OldPageId = PAGE1_ID;
+ }
+ else if (ValidPage == PAGE0) /* Page0 valid */
+ {
+ /* New page address where variable will be moved to */
+ NewPageAddress = PAGE1_BASE_ADDRESS;
+
+ /* Old page ID where variable will be taken from */
+ OldPageId = PAGE0_ID;
+ }
+ else
+ {
+ return NO_VALID_PAGE; /* No valid Page */
+ }
+
+ /* Set the new Page status to RECEIVE_DATA status */
+
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, NewPageAddress, ((uint32_t)receive));
+
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+
+ /* Write the variable passed as parameter in the new active page */
+ EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddress, Data);
+ /* If program operation was failed, a Flash error code is returned */
+ if (EepromStatus != HAL_OK)
+ {
+ return EepromStatus;
+ }
+
+ /* Transfer process: transfer variables from old to the new active page */
+ for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++)
+ {
+ if (VirtAddVarTab[VarIdx] != VirtAddress) /* Check each variable except the one passed as parameter */
+ {
+ /* Read the other last variable updates */
+ ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar);
+ /* In case variable corresponding to the virtual address was found */
+ if (ReadStatus != 0x1)
+ {
+ /* Transfer the variable to the new active page */
+ EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
+ /* If program operation was failed, a Flash error code is returned */
+ if (EepromStatus != HAL_OK)
+ {
+ return EepromStatus;
+ }
+ }
+ }
+ }
+
+ HAL_FLASH_Unlock();
+
+ /* Clear pending flags (if any) */
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
+ FLASH_FLAG_PGSERR | FLASH_FLAG_WRPERR);
+
+ pEraseInit.TypeErase = TYPEERASE_SECTORS;
+ pEraseInit.Banks = FLASH_BANK_2 ;
+ pEraseInit.Sector = OldPageId;
+ pEraseInit.NbSectors = 1;
+ pEraseInit.VoltageRange = VOLTAGE_RANGE;
+
+ /* Erase the old Page: Set old Page status to ERASED status */
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+
+ /* Set new Page status to VALID_PAGE status */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, NewPageAddress, ((uint32_t)valid));
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+
+ /* Return last operation flash status */
+ return FlashStatus;
+}
--- /dev/null
+++ b/LEAF/Src/fatfs.c
@@ -1,0 +1,56 @@
+/**
+ ******************************************************************************
+ * @file fatfs.c
+ * @brief Code for fatfs applications
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#include "fatfs.h"
+
+uint8_t retSD; /* Return value for SD */
+char SDPath[4]; /* SD logical drive path */
+FATFS SDFatFS; /* File system object for SD logical drive */
+FIL SDFile; /* File object for SD */
+
+/* USER CODE BEGIN Variables */
+
+/* USER CODE END Variables */
+
+void MX_FATFS_Init(void)
+{
+ /*## FatFS: Link the SD driver ###########################*/
+ retSD = FATFS_LinkDriver(&SD_Driver, SDPath);
+
+ /* USER CODE BEGIN Init */
+ /* additional user code for init */
+ /* USER CODE END Init */
+}
+
+/**
+ * @brief Gets Time from RTC
+ * @param None
+ * @retval Time in DWORD
+ */
+DWORD get_fattime(void)
+{
+ /* USER CODE BEGIN get_fattime */
+ return 0;
+ /* USER CODE END get_fattime */
+}
+
+/* USER CODE BEGIN Application */
+
+/* USER CODE END Application */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/fatfs_platform.c
@@ -1,0 +1,31 @@
+/**
+ ******************************************************************************
+ * @file : fatfs_platform.c
+ * @brief : fatfs_platform source file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+*/
+#include "fatfs_platform.h"
+
+uint8_t BSP_PlatformIsDetected(void) {
+ uint8_t status = SD_PRESENT;
+ /* Check SD card detect pin */
+ if(HAL_GPIO_ReadPin(SD_DETECT_GPIO_PORT, SD_DETECT_PIN) != GPIO_PIN_RESET)
+ {
+ status = SD_NOT_PRESENT;
+ }
+ /* USER CODE BEGIN 1 */
+ /* user code can be inserted here */
+ /* USER CODE END 1 */
+ return status;
+}
--- /dev/null
+++ b/LEAF/Src/fmc.c
@@ -1,0 +1,281 @@
+/**
+ ******************************************************************************
+ * File Name : FMC.c
+ * Description : This file provides code for the configuration
+ * of the FMC peripheral.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "fmc.h"
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+SDRAM_HandleTypeDef hsdram1;
+
+/* FMC initialization function */
+void MX_FMC_Init(void)
+{
+ FMC_SDRAM_TimingTypeDef SdramTiming = {0};
+
+ /** Perform the SDRAM1 memory initialization sequence
+ */
+ hsdram1.Instance = FMC_SDRAM_DEVICE;
+ /* hsdram1.Init */
+ hsdram1.Init.SDBank = FMC_SDRAM_BANK1;
+ hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;
+ hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13;
+ hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
+ hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
+ hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2;
+ hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
+ hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_3;
+ hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
+ hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;
+ /* SdramTiming */
+ SdramTiming.LoadToActiveDelay = 2;
+ SdramTiming.ExitSelfRefreshDelay = 6;
+ SdramTiming.SelfRefreshTime = 4;
+ SdramTiming.RowCycleDelay = 6;
+ SdramTiming.WriteRecoveryTime = 2;
+ SdramTiming.RPDelay = 2;
+ SdramTiming.RCDDelay = 2;
+
+ if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
+ {
+ Error_Handler( );
+ }
+
+ HAL_SetFMCMemorySwappingConfig(FMC_SWAPBMAP_SDRAM_SRAM);
+
+}
+
+static uint32_t FMC_Initialized = 0;
+
+static void HAL_FMC_MspInit(void){
+ /* USER CODE BEGIN FMC_MspInit 0 */
+
+ /* USER CODE END FMC_MspInit 0 */
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if (FMC_Initialized) {
+ return;
+ }
+ FMC_Initialized = 1;
+
+ /* Peripheral clock enable */
+ __HAL_RCC_FMC_CLK_ENABLE();
+
+ /** FMC GPIO Configuration
+ PF0 ------> FMC_A0
+ PF1 ------> FMC_A1
+ PF2 ------> FMC_A2
+ PF3 ------> FMC_A3
+ PF4 ------> FMC_A4
+ PF5 ------> FMC_A5
+ PC0 ------> FMC_SDNWE
+ PC2_C ------> FMC_SDNE0
+ PC3_C ------> FMC_SDCKE0
+ PF11 ------> FMC_SDNRAS
+ PF12 ------> FMC_A6
+ PF13 ------> FMC_A7
+ PF14 ------> FMC_A8
+ PF15 ------> FMC_A9
+ PG0 ------> FMC_A10
+ PG1 ------> FMC_A11
+ PE7 ------> FMC_D4
+ PE8 ------> FMC_D5
+ PE9 ------> FMC_D6
+ PE10 ------> FMC_D7
+ PE11 ------> FMC_D8
+ PE12 ------> FMC_D9
+ PE13 ------> FMC_D10
+ PE14 ------> FMC_D11
+ PE15 ------> FMC_D12
+ PD8 ------> FMC_D13
+ PD9 ------> FMC_D14
+ PD10 ------> FMC_D15
+ PD14 ------> FMC_D0
+ PD15 ------> FMC_D1
+ PG2 ------> FMC_A12
+ PG4 ------> FMC_BA0
+ PG5 ------> FMC_BA1
+ PG8 ------> FMC_SDCLK
+ PD0 ------> FMC_D2
+ PD1 ------> FMC_D3
+ PG15 ------> FMC_SDNCAS
+ PE0 ------> FMC_NBL0
+ PE1 ------> FMC_NBL1
+ */
+ /* GPIO_InitStruct */
+ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
+ |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12
+ |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+
+ HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
+
+ /* GPIO_InitStruct */
+ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ /* GPIO_InitStruct */
+ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_4
+ |GPIO_PIN_5|GPIO_PIN_8|GPIO_PIN_15;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+
+ HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+
+ /* GPIO_InitStruct */
+ GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
+ |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
+ |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+
+ HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
+
+ /* GPIO_InitStruct */
+ GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
+ |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+
+ /* USER CODE BEGIN FMC_MspInit 1 */
+
+ /* USER CODE END FMC_MspInit 1 */
+}
+
+void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef* sdramHandle){
+ /* USER CODE BEGIN SDRAM_MspInit 0 */
+
+ /* USER CODE END SDRAM_MspInit 0 */
+ HAL_FMC_MspInit();
+ /* USER CODE BEGIN SDRAM_MspInit 1 */
+
+ /* USER CODE END SDRAM_MspInit 1 */
+}
+
+static uint32_t FMC_DeInitialized = 0;
+
+static void HAL_FMC_MspDeInit(void){
+ /* USER CODE BEGIN FMC_MspDeInit 0 */
+
+ /* USER CODE END FMC_MspDeInit 0 */
+ if (FMC_DeInitialized) {
+ return;
+ }
+ FMC_DeInitialized = 1;
+ /* Peripheral clock enable */
+ __HAL_RCC_FMC_CLK_DISABLE();
+
+ /** FMC GPIO Configuration
+ PF0 ------> FMC_A0
+ PF1 ------> FMC_A1
+ PF2 ------> FMC_A2
+ PF3 ------> FMC_A3
+ PF4 ------> FMC_A4
+ PF5 ------> FMC_A5
+ PC0 ------> FMC_SDNWE
+ PC2_C ------> FMC_SDNE0
+ PC3_C ------> FMC_SDCKE0
+ PF11 ------> FMC_SDNRAS
+ PF12 ------> FMC_A6
+ PF13 ------> FMC_A7
+ PF14 ------> FMC_A8
+ PF15 ------> FMC_A9
+ PG0 ------> FMC_A10
+ PG1 ------> FMC_A11
+ PE7 ------> FMC_D4
+ PE8 ------> FMC_D5
+ PE9 ------> FMC_D6
+ PE10 ------> FMC_D7
+ PE11 ------> FMC_D8
+ PE12 ------> FMC_D9
+ PE13 ------> FMC_D10
+ PE14 ------> FMC_D11
+ PE15 ------> FMC_D12
+ PD8 ------> FMC_D13
+ PD9 ------> FMC_D14
+ PD10 ------> FMC_D15
+ PD14 ------> FMC_D0
+ PD15 ------> FMC_D1
+ PG2 ------> FMC_A12
+ PG4 ------> FMC_BA0
+ PG5 ------> FMC_BA1
+ PG8 ------> FMC_SDCLK
+ PD0 ------> FMC_D2
+ PD1 ------> FMC_D3
+ PG15 ------> FMC_SDNCAS
+ PE0 ------> FMC_NBL0
+ PE1 ------> FMC_NBL1
+ */
+
+ HAL_GPIO_DeInit(GPIOF, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
+ |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12
+ |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
+
+ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3);
+
+ HAL_GPIO_DeInit(GPIOG, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_4
+ |GPIO_PIN_5|GPIO_PIN_8|GPIO_PIN_15);
+
+ HAL_GPIO_DeInit(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
+ |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
+ |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1);
+
+ HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
+ |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1);
+
+ /* USER CODE BEGIN FMC_MspDeInit 1 */
+
+ /* USER CODE END FMC_MspDeInit 1 */
+}
+
+void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef* sdramHandle){
+ /* USER CODE BEGIN SDRAM_MspDeInit 0 */
+
+ /* USER CODE END SDRAM_MspDeInit 0 */
+ HAL_FMC_MspDeInit();
+ /* USER CODE BEGIN SDRAM_MspDeInit 1 */
+
+ /* USER CODE END SDRAM_MspDeInit 1 */
+}
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/gfx.c
@@ -1,0 +1,983 @@
+/*
+ * gfx.c
+ * a C port of the Adafruit GFX library
+ * Created on: Jul 8, 2018
+ * Author: jeffsnyder
+ */
+
+
+/*
+This is the core graphics library for all our displays, providing a common
+set of graphics primitives (points, lines, circles, etc.). It needs to be
+paired with a hardware-specific library for each display device we carry
+(to handle the lower-level functions).
+
+Adafruit invests time and resources providing this open source code, please
+support Adafruit & open-source hardware by purchasing products from Adafruit!
+
+Copyright (c) 2013 Adafruit Industries. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+- Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "stm32h7xx_hal.h"
+#include "gfx.h"
+#include "gfx_font.c"
+#include "main.h"
+
+// Many (but maybe not all) non-AVR board installs define macros
+// for compatibility with existing PROGMEM-reading AVR code.
+// Do our own checks and defines here for good measure...
+
+#ifndef pgm_read_byte
+ #define pgm_read_byte(addr) (*(const unsigned char *)(addr))
+#endif
+#ifndef pgm_read_word
+ #define pgm_read_word(addr) (*(const unsigned short *)(addr))
+#endif
+#ifndef pgm_read_dword
+ #define pgm_read_dword(addr) (*(const unsigned long *)(addr))
+#endif
+
+// Pointers are a peculiar case...typically 16-bit on AVR boards,
+// 32 bits elsewhere. Try to accommodate both...
+
+
+ #define pgm_read_pointer(addr) ((void *)pgm_read_dword(addr))
+
+
+#ifndef min
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+#ifndef _swap_int16_t
+#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; }
+#endif
+
+void GFXinit(GFX* myGfx, int16_t w, int16_t h)
+{
+ myGfx->WIDTH = w;
+ myGfx->HEIGHT = h;
+ myGfx->_width = w;
+ myGfx->_height = h;
+ myGfx->rotation = 0;
+ myGfx->cursor_y = 0;
+ myGfx->cursor_x = 0;
+ myGfx->textsize = 1;
+ myGfx->textcolor = 0xFFFF;
+ myGfx->textbgcolor = 0xFFFF;
+ myGfx->wrap = 1;
+ myGfx->_cp437 = 0;
+ myGfx->gfxFont = NULL;
+}
+
+// Bresenham's algorithm - thx wikpedia
+void GFXwriteLine(GFX* myGFX, int16_t x0, int16_t y0, int16_t x1, int16_t y1,
+ uint16_t color) {
+ int16_t steep = abs(y1 - y0) > abs(x1 - x0);
+ if (steep) {
+ _swap_int16_t(x0, y0);
+ _swap_int16_t(x1, y1);
+ }
+
+ if (x0 > x1) {
+ _swap_int16_t(x0, x1);
+ _swap_int16_t(y0, y1);
+ }
+
+ int16_t dx, dy;
+ dx = x1 - x0;
+ dy = abs(y1 - y0);
+
+ int16_t err = dx / 2;
+ int16_t ystep;
+
+ if (y0 < y1) {
+ ystep = 1;
+ } else {
+ ystep = -1;
+ }
+
+ for (; x0<=x1; x0++) {
+ if (steep) {
+ GFXwritePixel(myGFX, y0, x0, color);
+ } else {
+ GFXwritePixel(myGFX, x0, y0, color);
+ }
+ err -= dy;
+ if (err < 0) {
+ y0 += ystep;
+ err += dx;
+ }
+ }
+}
+
+void GFXstartWrite(GFX* myGFX){
+ // Overwrite in subclasses if desired!
+}
+
+// the most basic function, set a single pixel
+void GFXdrawPixel(GFX* myGFX, int16_t x, int16_t y, uint16_t color) {
+ if ((x < 0) || (x >= myGFX->_width) || (y < 0) || (y >= myGFX->_height))
+ return;
+
+ // check rotation, move pixel around if necessary
+ switch (GFXgetRotation(myGFX)) {
+ case 1:
+ _swap_int16_t(x, y);
+ x = myGFX->WIDTH - x - 1;
+ break;
+ case 2:
+ x = myGFX->WIDTH - x - 1;
+ y = myGFX->HEIGHT - y - 1;
+ break;
+ case 3:
+ _swap_int16_t(x, y);
+ y = myGFX->HEIGHT - y - 1;
+ break;
+ }
+
+ // x is which column
+ switch (color)
+ {
+ case WHITE: buffer[x+ (y/8)*myGFX->WIDTH] |= (1 << (y&7)); break;
+ case BLACK: buffer[x+ (y/8)*myGFX->WIDTH] &= ~(1 << (y&7)); break;
+ case INVERSE: buffer[x+ (y/8)*myGFX->WIDTH] ^= (1 << (y&7)); break;
+ }
+
+}
+
+void GFXwritePixel(GFX* myGFX,int16_t x, int16_t y, uint16_t color){
+ // Overwrite in subclasses if startWrite is defined!
+ GFXdrawPixel(myGFX, x, y, color);
+}
+
+// (x,y) is topmost point; if unsure, calling function
+// should sort endpoints or call writeLine() instead
+void GFXwriteFastVLine(GFX* myGFX,int16_t x, int16_t y,
+ int16_t h, uint16_t color) {
+ // Overwrite in subclasses if startWrite is defined!
+ // Can be just writeLine(x, y, x, y+h-1, color);
+ // or writeFillRect(x, y, 1, h, color);
+ GFXdrawFastVLine(myGFX, x, y, h, color);
+}
+
+// (x,y) is leftmost point; if unsure, calling function
+// should sort endpoints or call writeLine() instead
+void GFXwriteFastHLine(GFX* myGFX, int16_t x, int16_t y,
+ int16_t w, uint16_t color) {
+ // Overwrite in subclasses if startWrite is defined!
+ // Example: writeLine(x, y, x+w-1, y, color);
+ // or writeFillRect(x, y, w, 1, color);
+ GFXdrawFastHLine(myGFX,x, y, w, color);
+}
+
+void GFXwriteFillRect(GFX* myGFX,int16_t x, int16_t y, int16_t w, int16_t h,
+ uint16_t color) {
+ // Overwrite in subclasses if desired!
+ GFXfillRect(myGFX,x,y,w,h,color);
+}
+
+void GFXendWrite(GFX* myGFX){
+ // Overwrite in subclasses if startWrite is defined!
+}
+
+// (x,y) is topmost point; if unsure, calling function
+// should sort endpoints or call drawLine() instead
+void GFXdrawFastVLine(GFX* myGFX,int16_t x, int16_t y,
+ int16_t h, uint16_t color) {
+ // Update in subclasses if desired!
+ GFXwriteLine(myGFX,x, y, x, y+h-1, color);
+}
+
+// (x,y) is leftmost point; if unsure, calling function
+// should sort endpoints or call drawLine() instead
+void GFXdrawFastHLine(GFX* myGFX,int16_t x, int16_t y,
+ int16_t w, uint16_t color) {
+ // Update in subclasses if desired!
+ GFXwriteLine(myGFX,x, y, x+w-1, y, color);
+}
+
+void GFXfillRect(GFX* myGFX,int16_t x, int16_t y, int16_t w, int16_t h,
+ uint16_t color) {
+ // Update in subclasses if desired!
+ for (int16_t i=x; i<x+w; i++) {
+ GFXwriteFastVLine(myGFX,i, y, h, color);
+ }
+}
+
+void GFXfillScreen(GFX* myGFX,uint16_t color) {
+ // Update in subclasses if desired!
+ GFXfillRect(myGFX,0, 0, myGFX->_width, myGFX->_height, color);
+}
+
+void GFXdrawLine(GFX* myGFX,int16_t x0, int16_t y0, int16_t x1, int16_t y1,
+ uint16_t color) {
+ // Update in subclasses if desired!
+ if(x0 == x1){
+ if(y0 > y1) _swap_int16_t(y0, y1);
+ GFXdrawFastVLine(myGFX,x0, y0, y1 - y0 + 1, color);
+ } else if(y0 == y1){
+ if(x0 > x1) _swap_int16_t(x0, x1);
+ GFXdrawFastHLine(myGFX,x0, y0, x1 - x0 + 1, color);
+ } else {
+ GFXwriteLine(myGFX,x0, y0, x1, y1, color);
+ }
+}
+
+// Draw a circle outline
+void GFXdrawCircle(GFX* myGFX,int16_t x0, int16_t y0, int16_t r,
+ uint16_t color) {
+ int16_t f = 1 - r;
+ int16_t ddF_x = 1;
+ int16_t ddF_y = -2 * r;
+ int16_t x = 0;
+ int16_t y = r;
+
+ GFXwritePixel(myGFX,x0 , y0+r, color);
+ GFXwritePixel(myGFX,x0 , y0-r, color);
+ GFXwritePixel(myGFX,x0+r, y0 , color);
+ GFXwritePixel(myGFX,x0-r, y0 , color);
+
+ while (x<y) {
+ if (f >= 0) {
+ y--;
+ ddF_y += 2;
+ f += ddF_y;
+ }
+ x++;
+ ddF_x += 2;
+ f += ddF_x;
+
+ GFXwritePixel(myGFX,x0 + x, y0 + y, color);
+ GFXwritePixel(myGFX,x0 - x, y0 + y, color);
+ GFXwritePixel(myGFX,x0 + x, y0 - y, color);
+ GFXwritePixel(myGFX,x0 - x, y0 - y, color);
+ GFXwritePixel(myGFX,x0 + y, y0 + x, color);
+ GFXwritePixel(myGFX,x0 - y, y0 + x, color);
+ GFXwritePixel(myGFX,x0 + y, y0 - x, color);
+ GFXwritePixel(myGFX,x0 - y, y0 - x, color);
+ }
+
+}
+
+void GFXdrawCircleHelper(GFX* myGFX,int16_t x0, int16_t y0,
+ int16_t r, uint8_t cornername, uint16_t color) {
+ int16_t f = 1 - r;
+ int16_t ddF_x = 1;
+ int16_t ddF_y = -2 * r;
+ int16_t x = 0;
+ int16_t y = r;
+
+ while (x<y) {
+ if (f >= 0) {
+ y--;
+ ddF_y += 2;
+ f += ddF_y;
+ }
+ x++;
+ ddF_x += 2;
+ f += ddF_x;
+ if (cornername & 0x4) {
+ GFXwritePixel(myGFX, x0 + x, y0 + y, color);
+ GFXwritePixel(myGFX, x0 + y, y0 + x, color);
+ }
+ if (cornername & 0x2) {
+ GFXwritePixel(myGFX, x0 + x, y0 - y, color);
+ GFXwritePixel(myGFX, x0 + y, y0 - x, color);
+ }
+ if (cornername & 0x8) {
+ GFXwritePixel(myGFX, x0 - y, y0 + x, color);
+ GFXwritePixel(myGFX, x0 - x, y0 + y, color);
+ }
+ if (cornername & 0x1) {
+ GFXwritePixel(myGFX, x0 - y, y0 - x, color);
+ GFXwritePixel(myGFX, x0 - x, y0 - y, color);
+ }
+ }
+}
+
+void GFXfillCircle(GFX* myGFX, int16_t x0, int16_t y0, int16_t r,
+ uint16_t color) {
+
+ GFXwriteFastVLine(myGFX, x0, y0-r, 2*r+1, color);
+ GFXfillCircleHelper(myGFX, x0, y0, r, 3, 0, color);
+
+}
+
+// Used to do circles and roundrects
+void GFXfillCircleHelper(GFX* myGFX, int16_t x0, int16_t y0, int16_t r,
+ uint8_t cornername, int16_t delta, uint16_t color) {
+
+ int16_t f = 1 - r;
+ int16_t ddF_x = 1;
+ int16_t ddF_y = -2 * r;
+ int16_t x = 0;
+ int16_t y = r;
+
+ while (x<y) {
+ if (f >= 0) {
+ y--;
+ ddF_y += 2;
+ f += ddF_y;
+ }
+ x++;
+ ddF_x += 2;
+ f += ddF_x;
+
+ if (cornername & 0x1) {
+ GFXwriteFastVLine(myGFX, x0+x, y0-y, 2*y+1+delta, color);
+ GFXwriteFastVLine(myGFX, x0+y, y0-x, 2*x+1+delta, color);
+ }
+ if (cornername & 0x2) {
+ GFXwriteFastVLine(myGFX, x0-x, y0-y, 2*y+1+delta, color);
+ GFXwriteFastVLine(myGFX, x0-y, y0-x, 2*x+1+delta, color);
+ }
+ }
+}
+
+// Draw a rectangle
+void GFXdrawRect(GFX* myGFX, int16_t x, int16_t y, int16_t w, int16_t h,
+ uint16_t color) {
+
+ GFXwriteFastHLine(myGFX, x, y, w, color);
+ GFXwriteFastHLine(myGFX, x, y+h-1, w, color);
+ GFXwriteFastVLine(myGFX, x, y, h, color);
+ GFXwriteFastVLine(myGFX, x+w-1, y, h, color);
+
+}
+
+// Draw a rounded rectangle
+void GFXdrawRoundRect(GFX* myGFX, int16_t x, int16_t y, int16_t w,
+ int16_t h, int16_t r, uint16_t color) {
+ // smarter version
+ GFXwriteFastHLine(myGFX, x+r , y , w-2*r, color); // Top
+ GFXwriteFastHLine(myGFX, x+r , y+h-1, w-2*r, color); // Bottom
+ GFXwriteFastVLine(myGFX, x , y+r , h-2*r, color); // Left
+ GFXwriteFastVLine(myGFX, x+w-1, y+r , h-2*r, color); // Right
+ // draw four corners
+ GFXdrawCircleHelper(myGFX, x+r , y+r , r, 1, color);
+ GFXdrawCircleHelper(myGFX, x+w-r-1, y+r , r, 2, color);
+ GFXdrawCircleHelper(myGFX, x+w-r-1, y+h-r-1, r, 4, color);
+ GFXdrawCircleHelper(myGFX, x+r , y+h-r-1, r, 8, color);
+
+}
+
+// Fill a rounded rectangle
+void GFXfillRoundRect(GFX* myGFX, int16_t x, int16_t y, int16_t w,
+ int16_t h, int16_t r, uint16_t color) {
+ // smarter version
+ GFXwriteFillRect(myGFX, x+r, y, w-2*r, h, color);
+ // draw four corners
+ GFXfillCircleHelper(myGFX, x+w-r-1, y+r, r, 1, h-2*r-1, color);
+ GFXfillCircleHelper(myGFX, x+r , y+r, r, 2, h-2*r-1, color);
+
+}
+
+// Draw a triangle
+void GFXdrawTriangle(GFX* myGFX, int16_t x0, int16_t y0,
+ int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) {
+ GFXdrawLine(myGFX, x0, y0, x1, y1, color);
+ GFXdrawLine(myGFX, x1, y1, x2, y2, color);
+ GFXdrawLine(myGFX, x2, y2, x0, y0, color);
+}
+
+// Fill a triangle
+void GFXfillTriangle(GFX* myGFX, int16_t x0, int16_t y0,
+ int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) {
+
+ int16_t a, b, y, last;
+
+ // Sort coordinates by Y order (y2 >= y1 >= y0)
+ if (y0 > y1) {
+ _swap_int16_t(y0, y1); _swap_int16_t(x0, x1);
+ }
+ if (y1 > y2) {
+ _swap_int16_t(y2, y1); _swap_int16_t(x2, x1);
+ }
+ if (y0 > y1) {
+ _swap_int16_t(y0, y1); _swap_int16_t(x0, x1);
+ }
+
+
+ if(y0 == y2) { // Handle awkward all-on-same-line case as its own thing
+ a = b = x0;
+ if(x1 < a) a = x1;
+ else if(x1 > b) b = x1;
+ if(x2 < a) a = x2;
+ else if(x2 > b) b = x2;
+ GFXwriteFastHLine(myGFX, a, y0, b-a+1, color);
+
+ return;
+ }
+
+ int16_t
+ dx01 = x1 - x0,
+ dy01 = y1 - y0,
+ dx02 = x2 - x0,
+ dy02 = y2 - y0,
+ dx12 = x2 - x1,
+ dy12 = y2 - y1;
+ int32_t
+ sa = 0,
+ sb = 0;
+
+ // For upper part of triangle, find scanline crossings for segments
+ // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1
+ // is included here (and second loop will be skipped, avoiding a /0
+ // error there), otherwise scanline y1 is skipped here and handled
+ // in the second loop...which also avoids a /0 error here if y0=y1
+ // (flat-topped triangle).
+ if(y1 == y2) last = y1; // Include y1 scanline
+ else last = y1-1; // Skip it
+
+ for(y=y0; y<=last; y++) {
+ a = x0 + sa / dy01;
+ b = x0 + sb / dy02;
+ sa += dx01;
+ sb += dx02;
+ /* longhand:
+ a = x0 + (x1 - x0) * (y - y0) / (y1 - y0);
+ b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
+ */
+ if(a > b) _swap_int16_t(a,b);
+ GFXwriteFastHLine(myGFX,a, y, b-a+1, color);
+ }
+
+ // For lower part of triangle, find scanline crossings for segments
+ // 0-2 and 1-2. This loop is skipped if y1=y2.
+ sa = dx12 * (y - y1);
+ sb = dx02 * (y - y0);
+ for(; y<=y2; y++) {
+ a = x1 + sa / dy12;
+ b = x0 + sb / dy02;
+ sa += dx12;
+ sb += dx02;
+ /* longhand:
+ a = x1 + (x2 - x1) * (y - y1) / (y2 - y1);
+ b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
+ */
+ if(a > b) _swap_int16_t(a,b);
+ GFXwriteFastHLine(myGFX, a, y, b-a+1, color);
+ }
+
+}
+
+// BITMAP / XBITMAP / GRAYSCALE / RGB BITMAP FUNCTIONS ---------------------
+
+
+
+// Draw a RAM-resident 1-bit image at the specified (x,y) position,
+// using the specified foreground (for set bits) and background (unset
+// bits) colors.
+void GFXdrawBitmap(GFX* myGFX, int16_t x, int16_t y,
+ uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg) {
+
+ int16_t byteWidth = (w + 7) / 8; // Bitmap scanline pad = whole byte
+ uint8_t byte = 0;
+
+ startWrite();
+ for(int16_t j=0; j<h; j++, y++) {
+ for(int16_t i=0; i<w; i++ ) {
+ if(i & 7) byte <<= 1;
+ else byte = bitmap[j * byteWidth + i / 8];
+ GFXwritePixel(myGFX, x+i, y, (byte & 0x80) ? color : bg);
+ }
+ }
+ endWrite();
+}
+
+
+
+// TEXT- AND CHARACTER-HANDLING FUNCTIONS ----------------------------------
+
+// Draw a character
+void GFXdrawChar(GFX* myGFX, int16_t x, int16_t y, unsigned char c,
+ uint16_t color, uint16_t bg, uint8_t size) {
+
+ if(!myGFX->gfxFont) { // 'Classic' built-in font
+
+ if((x >= myGFX->_width) || // Clip right
+ (y >= myGFX->_height) || // Clip bottom
+ ((x + 6 * size - 1) < 0) || // Clip left
+ ((y + 8 * size - 1) < 0)) // Clip top
+ return;
+
+ if(!myGFX->_cp437 && (c >= 176)) c++; // Handle 'classic' charset behavior
+
+
+ for(int8_t i=0; i<5; i++ ) { // Char bitmap = 5 columns
+ uint8_t line = pgm_read_byte(&standardGFXfont[c * 5 + i]);
+ for(int8_t j=0; j<8; j++, line >>= 1) {
+ if(line & 1) {
+ if(size == 1)
+ GFXwritePixel(myGFX, x+i, y+j, color);
+ else
+ GFXwriteFillRect(myGFX, x+i*size, y+j*size, size, size, color);
+ } else if(bg != color) {
+ if(size == 1)
+ GFXwritePixel(myGFX, x+i, y+j, bg);
+ else
+ GFXwriteFillRect(myGFX, x+i*size, y+j*size, size, size, bg);
+ }
+ }
+ }
+ if(bg != color) { // If opaque, draw vertical line for last column
+ if(size == 1) GFXwriteFastVLine(myGFX, x+5, y, 8, bg);
+ else GFXwriteFillRect(myGFX, x+5*size, y, size, 8*size, bg);
+ }
+
+
+ } else { // Custom font
+
+ // Character is assumed previously filtered by write() to eliminate
+ // newlines, returns, non-printable characters, etc. Calling
+ // drawChar() directly with 'bad' characters of font may cause mayhem!
+
+ c -= (uint8_t)pgm_read_byte(&myGFX->gfxFont->first);
+ GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(&myGFX->gfxFont->glyph))[c]);
+ uint8_t *bitmap = (uint8_t *)pgm_read_pointer(&myGFX->gfxFont->bitmap);
+
+ uint16_t bo = pgm_read_word(&glyph->bitmapOffset);
+ uint8_t w = pgm_read_byte(&glyph->width),
+ h = pgm_read_byte(&glyph->height);
+ int8_t xo = pgm_read_byte(&glyph->xOffset),
+ yo = pgm_read_byte(&glyph->yOffset);
+ uint8_t xx, yy, bits = 0, bit = 0;
+ int16_t xo16 = 0, yo16 = 0;
+
+ if(size > 1) {
+ xo16 = xo;
+ yo16 = yo;
+ }
+
+ // Todo: Add character clipping here
+
+ // NOTE: THERE IS NO 'BACKGROUND' COLOR OPTION ON CUSTOM FONTS.
+ // THIS IS ON PURPOSE AND BY DESIGN. The background color feature
+ // has typically been used with the 'classic' font to overwrite old
+ // screen contents with new data. This ONLY works because the
+ // characters are a uniform size; it's not a sensible thing to do with
+ // proportionally-spaced fonts with glyphs of varying sizes (and that
+ // may overlap). To replace previously-drawn text when using a custom
+ // font, use the getTextBounds() function to determine the smallest
+ // rectangle encompassing a string, erase the area with fillRect(),
+ // then draw new text. This WILL infortunately 'blink' the text, but
+ // is unavoidable. Drawing 'background' pixels will NOT fix this,
+ // only creates a new set of problems. Have an idea to work around
+ // this (a canvas object type for MCUs that can afford the RAM and
+ // displays supporting setAddrWindow() and pushColors()), but haven't
+ // implemented this yet.
+
+
+ for(yy=0; yy<h; yy++) {
+ for(xx=0; xx<w; xx++) {
+ if(!(bit++ & 7)) {
+ bits = pgm_read_byte(&bitmap[bo++]);
+ }
+ if(bits & 0x80) {
+ if(size == 1) {
+ GFXwritePixel(myGFX, x+xo+xx, y+yo+yy, color);
+ } else {
+ GFXwriteFillRect(myGFX, x+(xo16+xx)*size, y+(yo16+yy)*size,
+ size, size, color);
+ }
+ }
+ bits <<= 1;
+ }
+ }
+
+
+ } // End classic vs custom font
+}
+
+
+void GFXwrite(GFX* myGFX, uint8_t c) {
+
+ if(!myGFX->gfxFont) { // 'Classic' built-in font
+
+ if(c == '\n') { // Newline?
+ myGFX->cursor_x = 0; // Reset x to zero,
+ myGFX->cursor_y += myGFX->textsize * 8; // advance y one line
+ } else if(c != '\r') { // Ignore carriage returns
+ if(myGFX->wrap && ((myGFX->cursor_x + myGFX->textsize * 6) > myGFX->_width)) { // Off right?
+ myGFX->cursor_x = 0; // Reset x to zero,
+ myGFX->cursor_y += myGFX->textsize * 8; // advance y one line
+ }
+ GFXdrawChar(myGFX, myGFX->cursor_x, myGFX->cursor_y, c, myGFX->textcolor, myGFX->textbgcolor, myGFX->textsize);
+ myGFX->cursor_x += myGFX->textsize * 6; // Advance x one char
+ }
+
+ } else { // Custom font
+
+ if(c == '\n') {
+ myGFX->cursor_x = 0;
+ myGFX->cursor_y += (int16_t)myGFX->textsize *
+ (uint8_t)pgm_read_byte(&myGFX->gfxFont->yAdvance);
+ } else if(c != '\r') {
+ uint8_t first = pgm_read_byte(&myGFX->gfxFont->first);
+ if((c >= first) && (c <= (uint8_t)pgm_read_byte(&myGFX->gfxFont->last))) {
+ GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(
+ &myGFX->gfxFont->glyph))[c - first]);
+ uint8_t w = pgm_read_byte(&glyph->width),
+ h = pgm_read_byte(&glyph->height);
+ if((w > 0) && (h > 0)) { // Is there an associated bitmap?
+ int16_t xo = (int8_t)pgm_read_byte(&glyph->xOffset); // sic
+ if(myGFX->wrap && ((myGFX->cursor_x + myGFX->textsize * (xo + w)) > myGFX->_width)) {
+ myGFX->cursor_x = 0;
+ myGFX->cursor_y += (int16_t)myGFX->textsize *
+ (uint8_t)pgm_read_byte(&myGFX->gfxFont->yAdvance);
+ }
+ GFXdrawChar(myGFX, myGFX->cursor_x, myGFX->cursor_y, c, myGFX->textcolor, myGFX->textbgcolor, myGFX->textsize);
+ }
+ myGFX->cursor_x += (uint8_t)pgm_read_byte(&glyph->xAdvance) * (int16_t)myGFX->textsize;
+ }
+ }
+
+ }
+
+}
+
+void GFXsetCursor(GFX* myGFX, int16_t x, int16_t y) {
+ myGFX->cursor_x = x;
+ myGFX->cursor_y = y;
+}
+
+int16_t GFXgetCursorX(GFX* myGFX)
+{
+ return myGFX->cursor_x;
+}
+
+int16_t GFXgetCursorY(GFX* myGFX)
+{
+ return myGFX->cursor_y;
+}
+
+void GFXsetTextSize(GFX* myGFX, uint8_t s) {
+ myGFX->textsize = (s > 0) ? s : 1;
+}
+
+void GFXsetTextColor(GFX* myGFX, uint16_t c, uint16_t b) {
+ myGFX->textcolor = c;
+ myGFX->textbgcolor = b;
+}
+
+void GFXsetTextWrap(GFX* myGFX, uint8_t w) {
+ myGFX->wrap = w;
+}
+
+uint8_t GFXgetRotation(GFX* myGFX) {
+ return myGFX->rotation;
+}
+
+void GFXsetRotation(GFX* myGFX, uint8_t x) {
+ myGFX->rotation = (x & 3);
+ switch(myGFX->rotation) {
+ case 0:
+ case 2:
+ myGFX->_width = myGFX->WIDTH;
+ myGFX->_height = myGFX->HEIGHT;
+ break;
+ case 1:
+ case 3:
+ myGFX->_width = myGFX->HEIGHT;
+ myGFX->_height = myGFX->WIDTH;
+ break;
+ }
+}
+
+// Enable (or disable) Code Page 437-compatible charset.
+// There was an error in glcdfont.c for the longest time -- one character
+// (#176, the 'light shade' block) was missing -- this threw off the index
+// of every character that followed it. But a TON of code has been written
+// with the erroneous character indices. By default, the library uses the
+// original 'wrong' behavior and old sketches will still work. Pass 'true'
+// to this function to use correct CP437 character values in your code.
+void GFXcp437(GFX* myGFX, uint8_t x) {
+ myGFX->_cp437 = x;
+}
+
+void GFXsetFont(GFX* myGFX, const GFXfont *f) {
+ if(f) { // Font struct pointer passed in?
+ if(!myGFX->gfxFont) { // And no current font struct?
+ // Switching from classic to new font behavior.
+ // Move cursor pos down 6 pixels so it's on baseline.
+ myGFX->cursor_y += 6;
+ }
+ } else if(myGFX->gfxFont) { // NULL passed. Current font struct defined?
+ // Switching from new to classic font behavior.
+ // Move cursor pos up 6 pixels so it's at top-left of char.
+ myGFX->cursor_y -= 6;
+ }
+ myGFX->gfxFont = (GFXfont *)f;
+}
+
+// Broke this out as it's used by both the PROGMEM- and RAM-resident
+// getTextBounds() functions.
+void GFXcharBounds(GFX* myGFX, char c, int16_t *x, int16_t *y,
+ int16_t *minx, int16_t *miny, int16_t *maxx, int16_t *maxy) {
+
+ if(myGFX->gfxFont) {
+
+ if(c == '\n') { // Newline?
+ *x = 0; // Reset x to zero, advance y by one line
+ *y += myGFX->textsize * (uint8_t)pgm_read_byte(&myGFX->gfxFont->yAdvance);
+ } else if(c != '\r') { // Not a carriage return; is normal char
+ uint8_t first = pgm_read_byte(&myGFX->gfxFont->first),
+ last = pgm_read_byte(&myGFX->gfxFont->last);
+ if((c >= first) && (c <= last)) { // Char present in this font?
+ GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(
+ &myGFX->gfxFont->glyph))[c - first]);
+ uint8_t gw = pgm_read_byte(&glyph->width),
+ gh = pgm_read_byte(&glyph->height),
+ xa = pgm_read_byte(&glyph->xAdvance);
+ int8_t xo = pgm_read_byte(&glyph->xOffset),
+ yo = pgm_read_byte(&glyph->yOffset);
+ if(myGFX->wrap && ((*x+(((int16_t)xo+gw)*myGFX->textsize)) > myGFX->_width)) {
+ *x = 0; // Reset x to zero, advance y by one line
+ *y += myGFX->textsize * (uint8_t)pgm_read_byte(&myGFX->gfxFont->yAdvance);
+ }
+ int16_t ts = (int16_t)myGFX->textsize,
+ x1 = *x + xo * ts,
+ y1 = *y + yo * ts,
+ x2 = x1 + gw * ts - 1,
+ y2 = y1 + gh * ts - 1;
+ if(x1 < *minx) *minx = x1;
+ if(y1 < *miny) *miny = y1;
+ if(x2 > *maxx) *maxx = x2;
+ if(y2 > *maxy) *maxy = y2;
+ *x += xa * ts;
+ }
+ }
+
+ } else { // Default font
+
+ if(c == '\n') { // Newline?
+ *x = 0; // Reset x to zero,
+ *y += myGFX->textsize * 8; // advance y one line
+ // min/max x/y unchaged -- that waits for next 'normal' character
+ } else if(c != '\r') { // Normal char; ignore carriage returns
+ if(myGFX->wrap && ((*x + myGFX->textsize * 6) > myGFX->_width)) { // Off right?
+ *x = 0; // Reset x to zero,
+ *y += myGFX->textsize * 8; // advance y one line
+ }
+ int x2 = *x + myGFX->textsize * 6 - 1, // Lower-right pixel of char
+ y2 = *y + myGFX->textsize * 8 - 1;
+ if(x2 > *maxx) *maxx = x2; // Track max x, y
+ if(y2 > *maxy) *maxy = y2;
+ if(*x < *minx) *minx = *x; // Track min x, y
+ if(*y < *miny) *miny = *y;
+ *x += myGFX->textsize * 6; // Advance x one char
+ }
+ }
+}
+
+// Pass string and a cursor position, returns UL corner and W,H.
+void GFXgetTextBounds(GFX* myGFX, char *str, int16_t x, int16_t y,
+ int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h) {
+ uint8_t c; // Current character
+
+ *x1 = x;
+ *y1 = y;
+ *w = *h = 0;
+
+ int16_t minx = myGFX->_width, miny = myGFX->_height, maxx = -1, maxy = -1;
+
+ while((c = *str++))
+ GFXcharBounds(myGFX, c, &x, &y, &minx, &miny, &maxx, &maxy);
+
+ if(maxx >= minx) {
+ *x1 = minx;
+ *w = maxx - minx + 1;
+ }
+ if(maxy >= miny) {
+ *y1 = miny;
+ *h = maxy - miny + 1;
+ }
+}
+
+
+
+// Return the size of the display (per current rotation)
+int16_t GFXwidth(GFX* myGFX ) {
+ return myGFX->_width;
+}
+
+int16_t GFXheight(GFX* myGFX) {
+ return myGFX->_height;
+}
+
+void GFXinvertDisplay(GFX* myGFX, uint8_t i) {
+ // Do nothing, must be subclassed if supported by hardware
+}
+
+uint8_t pitches[24] =
+{
+ 'C', ' ',
+ 'C', '#',
+ 'D', ' ',
+ 'D', '#',
+ 'E', ' ',
+ 'F', ' ',
+ 'F', '#',
+ 'G', ' ',
+ 'G', '#',
+ 'A', ' ',
+ 'A', '#',
+ 'B', ' '
+};
+
+int OLEDparseInt(char* buffer, uint32_t myNumber, uint8_t numDigits)
+{
+ for (int i = 0; i < numDigits; i++)
+ {
+ int whichPlace = (uint32_t)(powf(10.0f,(numDigits - 1) - i));
+ int thisDigit = (myNumber / whichPlace);
+ buffer[i] = thisDigit + 48;
+ myNumber -= thisDigit * whichPlace;
+ }
+
+ return numDigits;
+}
+
+int OLEDparsePitch(char* buffer, float midi)
+{
+ int pclass, octave, note, neg = 0; float offset;
+
+ note = (int)midi;
+ offset = midi - note;
+
+ if ((midi + 0.5f) > (note+1))
+ {
+ note += 1;
+ offset = (1.0f - offset) + 0.01f;
+ neg = 1;
+ }
+
+ pclass = (note % 12);
+ octave = (int)(note / 12) - 1;
+
+ int idx = 0;
+
+ buffer[idx++] = pitches[pclass*2];
+ buffer[idx++] = pitches[pclass*2+1];
+
+ OLEDparseInt(&buffer[idx++], octave, 1);
+
+ buffer[idx++] = ' ';
+
+ if (neg == 1)
+ buffer[idx++] = '-';
+ else
+ buffer[idx++] = '+';
+
+ OLEDparseInt(&buffer[idx], (uint32_t) (offset * 100.0f), 2);
+
+ return idx+2;
+}
+
+int OLEDparsePitchClass(char* buffer, float midi)
+{
+ int pclass, note;
+ float offset;
+
+ note = (int)midi;
+ offset = midi - note;
+
+ if ((midi + 0.5f) > (note+1))
+ {
+ note += 1;
+ offset = (1.0f - offset) + 0.01f;
+ }
+
+ pclass = (note % 12);
+
+ int idx = 0;
+
+ buffer[idx++] = pitches[pclass*2];
+ buffer[idx++] = pitches[pclass*2+1];
+
+ return idx;
+}
+
+int OLEDparseFixedFloat(char* buffer, float input, uint8_t numDigits, uint8_t numDecimal)
+{
+ float power = powf(10.0f, numDecimal);
+ float f = ((float)(int)(input * power + 0.5f)) / power;
+
+ int nonzeroHasHappened = 0, decimalHasHappened = 0;
+
+ int myNumber = (int)(f * power);
+
+ int idx = 0, i = 0;
+
+ if (myNumber < 0)
+ {
+ myNumber *= -1;
+ buffer[idx++] = '-';
+ i++;
+ }
+
+ while (i < numDigits)
+ {
+ if ((decimalHasHappened == 0) && ((numDigits-i) == numDecimal))
+ {
+ if (nonzeroHasHappened == 0)
+ {
+ idx++; //get past the negative if there is one - this is hacky should figure out how to do it right
+ buffer[idx-1] = '0';
+ nonzeroHasHappened = 1;
+ }
+
+ buffer[idx++] = '.';
+ decimalHasHappened = 1;
+ }
+ else
+ {
+
+ int whichPlace = (uint32_t) powf(10.0f,(numDigits - 1 - i));
+ int thisDigit = (myNumber / whichPlace);
+
+ if (nonzeroHasHappened == 0)
+ {
+ if (thisDigit > 0)
+ {
+ buffer[idx++] = thisDigit + 48;
+ nonzeroHasHappened = 1;
+ }
+ else
+ {
+ buffer[idx++] = ' ';
+ }
+ }
+ else
+ {
+ buffer[idx++] = thisDigit + 48;
+ }
+
+ myNumber -= thisDigit * whichPlace;
+
+ i++;
+ }
+ }
+
+ return idx;
+}
--- /dev/null
+++ b/LEAF/Src/gfx_font.c
@@ -1,0 +1,281 @@
+/*
+ * gfx_font.c
+ *
+ * Created on: Jul 8, 2018
+ * Author: jeffsnyder
+ */
+
+
+// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0.
+// See gfxfont.h for newer custom bitmap font info.
+
+#ifndef FONT5X7_H
+#define FONT5X7_H
+
+
+ #define PROGMEM
+
+
+// Standard ASCII 5x7 font
+
+static const unsigned char standardGFXfont[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3E, 0x5B, 0x4F, 0x5B, 0x3E,
+ 0x3E, 0x6B, 0x4F, 0x6B, 0x3E,
+ 0x1C, 0x3E, 0x7C, 0x3E, 0x1C,
+ 0x18, 0x3C, 0x7E, 0x3C, 0x18,
+ 0x1C, 0x57, 0x7D, 0x57, 0x1C,
+ 0x1C, 0x5E, 0x7F, 0x5E, 0x1C,
+ 0x00, 0x18, 0x3C, 0x18, 0x00,
+ 0xFF, 0xE7, 0xC3, 0xE7, 0xFF,
+ 0x00, 0x18, 0x24, 0x18, 0x00,
+ 0xFF, 0xE7, 0xDB, 0xE7, 0xFF,
+ 0x30, 0x48, 0x3A, 0x06, 0x0E,
+ 0x26, 0x29, 0x79, 0x29, 0x26,
+ 0x40, 0x7F, 0x05, 0x05, 0x07,
+ 0x40, 0x7F, 0x05, 0x25, 0x3F,
+ 0x5A, 0x3C, 0xE7, 0x3C, 0x5A,
+ 0x7F, 0x3E, 0x1C, 0x1C, 0x08,
+ 0x08, 0x1C, 0x1C, 0x3E, 0x7F,
+ 0x14, 0x22, 0x7F, 0x22, 0x14,
+ 0x5F, 0x5F, 0x00, 0x5F, 0x5F,
+ 0x06, 0x09, 0x7F, 0x01, 0x7F,
+ 0x00, 0x66, 0x89, 0x95, 0x6A,
+ 0x60, 0x60, 0x60, 0x60, 0x60,
+ 0x94, 0xA2, 0xFF, 0xA2, 0x94,
+ 0x08, 0x04, 0x7E, 0x04, 0x08,
+ 0x10, 0x20, 0x7E, 0x20, 0x10,
+ 0x08, 0x08, 0x2A, 0x1C, 0x08,
+ 0x08, 0x1C, 0x2A, 0x08, 0x08,
+ 0x1E, 0x10, 0x10, 0x10, 0x10,
+ 0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
+ 0x30, 0x38, 0x3E, 0x38, 0x30,
+ 0x06, 0x0E, 0x3E, 0x0E, 0x06,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5F, 0x00, 0x00,
+ 0x00, 0x07, 0x00, 0x07, 0x00,
+ 0x14, 0x7F, 0x14, 0x7F, 0x14,
+ 0x24, 0x2A, 0x7F, 0x2A, 0x12,
+ 0x23, 0x13, 0x08, 0x64, 0x62,
+ 0x36, 0x49, 0x56, 0x20, 0x50,
+ 0x00, 0x08, 0x07, 0x03, 0x00,
+ 0x00, 0x1C, 0x22, 0x41, 0x00,
+ 0x00, 0x41, 0x22, 0x1C, 0x00,
+ 0x2A, 0x1C, 0x7F, 0x1C, 0x2A,
+ 0x08, 0x08, 0x3E, 0x08, 0x08,
+ 0x00, 0x80, 0x70, 0x30, 0x00,
+ 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x00, 0x00, 0x60, 0x60, 0x00,
+ 0x20, 0x10, 0x08, 0x04, 0x02,
+ 0x3E, 0x51, 0x49, 0x45, 0x3E,
+ 0x00, 0x42, 0x7F, 0x40, 0x00,
+ 0x72, 0x49, 0x49, 0x49, 0x46,
+ 0x21, 0x41, 0x49, 0x4D, 0x33,
+ 0x18, 0x14, 0x12, 0x7F, 0x10,
+ 0x27, 0x45, 0x45, 0x45, 0x39,
+ 0x3C, 0x4A, 0x49, 0x49, 0x31,
+ 0x41, 0x21, 0x11, 0x09, 0x07,
+ 0x36, 0x49, 0x49, 0x49, 0x36,
+ 0x46, 0x49, 0x49, 0x29, 0x1E,
+ 0x00, 0x00, 0x14, 0x00, 0x00,
+ 0x00, 0x40, 0x34, 0x00, 0x00,
+ 0x00, 0x08, 0x14, 0x22, 0x41,
+ 0x14, 0x14, 0x14, 0x14, 0x14,
+ 0x00, 0x41, 0x22, 0x14, 0x08,
+ 0x02, 0x01, 0x59, 0x09, 0x06,
+ 0x3E, 0x41, 0x5D, 0x59, 0x4E,
+ 0x7C, 0x12, 0x11, 0x12, 0x7C,
+ 0x7F, 0x49, 0x49, 0x49, 0x36,
+ 0x3E, 0x41, 0x41, 0x41, 0x22,
+ 0x7F, 0x41, 0x41, 0x41, 0x3E,
+ 0x7F, 0x49, 0x49, 0x49, 0x41,
+ 0x7F, 0x09, 0x09, 0x09, 0x01,
+ 0x3E, 0x41, 0x41, 0x51, 0x73,
+ 0x7F, 0x08, 0x08, 0x08, 0x7F,
+ 0x00, 0x41, 0x7F, 0x41, 0x00,
+ 0x20, 0x40, 0x41, 0x3F, 0x01,
+ 0x7F, 0x08, 0x14, 0x22, 0x41,
+ 0x7F, 0x40, 0x40, 0x40, 0x40,
+ 0x7F, 0x02, 0x1C, 0x02, 0x7F,
+ 0x7F, 0x04, 0x08, 0x10, 0x7F,
+ 0x3E, 0x41, 0x41, 0x41, 0x3E,
+ 0x7F, 0x09, 0x09, 0x09, 0x06,
+ 0x3E, 0x41, 0x51, 0x21, 0x5E,
+ 0x7F, 0x09, 0x19, 0x29, 0x46,
+ 0x26, 0x49, 0x49, 0x49, 0x32,
+ 0x03, 0x01, 0x7F, 0x01, 0x03,
+ 0x3F, 0x40, 0x40, 0x40, 0x3F,
+ 0x1F, 0x20, 0x40, 0x20, 0x1F,
+ 0x3F, 0x40, 0x38, 0x40, 0x3F,
+ 0x63, 0x14, 0x08, 0x14, 0x63,
+ 0x03, 0x04, 0x78, 0x04, 0x03,
+ 0x61, 0x59, 0x49, 0x4D, 0x43,
+ 0x00, 0x7F, 0x41, 0x41, 0x41,
+ 0x02, 0x04, 0x08, 0x10, 0x20,
+ 0x00, 0x41, 0x41, 0x41, 0x7F,
+ 0x04, 0x02, 0x01, 0x02, 0x04,
+ 0x40, 0x40, 0x40, 0x40, 0x40,
+ 0x00, 0x03, 0x07, 0x08, 0x00,
+ 0x20, 0x54, 0x54, 0x78, 0x40,
+ 0x7F, 0x28, 0x44, 0x44, 0x38,
+ 0x38, 0x44, 0x44, 0x44, 0x28,
+ 0x38, 0x44, 0x44, 0x28, 0x7F,
+ 0x38, 0x54, 0x54, 0x54, 0x18,
+ 0x00, 0x08, 0x7E, 0x09, 0x02,
+ 0x18, 0xA4, 0xA4, 0x9C, 0x78,
+ 0x7F, 0x08, 0x04, 0x04, 0x78,
+ 0x00, 0x44, 0x7D, 0x40, 0x00,
+ 0x20, 0x40, 0x40, 0x3D, 0x00,
+ 0x7F, 0x10, 0x28, 0x44, 0x00,
+ 0x00, 0x41, 0x7F, 0x40, 0x00,
+ 0x7C, 0x04, 0x78, 0x04, 0x78,
+ 0x7C, 0x08, 0x04, 0x04, 0x78,
+ 0x38, 0x44, 0x44, 0x44, 0x38,
+ 0xFC, 0x18, 0x24, 0x24, 0x18,
+ 0x18, 0x24, 0x24, 0x18, 0xFC,
+ 0x7C, 0x08, 0x04, 0x04, 0x08,
+ 0x48, 0x54, 0x54, 0x54, 0x24,
+ 0x04, 0x04, 0x3F, 0x44, 0x24,
+ 0x3C, 0x40, 0x40, 0x20, 0x7C,
+ 0x1C, 0x20, 0x40, 0x20, 0x1C,
+ 0x3C, 0x40, 0x30, 0x40, 0x3C,
+ 0x44, 0x28, 0x10, 0x28, 0x44,
+ 0x4C, 0x90, 0x90, 0x90, 0x7C,
+ 0x44, 0x64, 0x54, 0x4C, 0x44,
+ 0x00, 0x08, 0x36, 0x41, 0x00,
+ 0x00, 0x00, 0x77, 0x00, 0x00,
+ 0x00, 0x41, 0x36, 0x08, 0x00,
+ 0x02, 0x01, 0x02, 0x04, 0x02,
+ 0x3C, 0x26, 0x23, 0x26, 0x3C,
+ 0x1E, 0xA1, 0xA1, 0x61, 0x12,
+ 0x3A, 0x40, 0x40, 0x20, 0x7A,
+ 0x38, 0x54, 0x54, 0x55, 0x59,
+ 0x21, 0x55, 0x55, 0x79, 0x41,
+ 0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut
+ 0x21, 0x55, 0x54, 0x78, 0x40,
+ 0x20, 0x54, 0x55, 0x79, 0x40,
+ 0x0C, 0x1E, 0x52, 0x72, 0x12,
+ 0x39, 0x55, 0x55, 0x55, 0x59,
+ 0x39, 0x54, 0x54, 0x54, 0x59,
+ 0x39, 0x55, 0x54, 0x54, 0x58,
+ 0x00, 0x00, 0x45, 0x7C, 0x41,
+ 0x00, 0x02, 0x45, 0x7D, 0x42,
+ 0x00, 0x01, 0x45, 0x7C, 0x40,
+ 0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut
+ 0xF0, 0x28, 0x25, 0x28, 0xF0,
+ 0x7C, 0x54, 0x55, 0x45, 0x00,
+ 0x20, 0x54, 0x54, 0x7C, 0x54,
+ 0x7C, 0x0A, 0x09, 0x7F, 0x49,
+ 0x32, 0x49, 0x49, 0x49, 0x32,
+ 0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut
+ 0x32, 0x4A, 0x48, 0x48, 0x30,
+ 0x3A, 0x41, 0x41, 0x21, 0x7A,
+ 0x3A, 0x42, 0x40, 0x20, 0x78,
+ 0x00, 0x9D, 0xA0, 0xA0, 0x7D,
+ 0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut
+ 0x3D, 0x40, 0x40, 0x40, 0x3D,
+ 0x3C, 0x24, 0xFF, 0x24, 0x24,
+ 0x48, 0x7E, 0x49, 0x43, 0x66,
+ 0x2B, 0x2F, 0xFC, 0x2F, 0x2B,
+ 0xFF, 0x09, 0x29, 0xF6, 0x20,
+ 0xC0, 0x88, 0x7E, 0x09, 0x03,
+ 0x20, 0x54, 0x54, 0x79, 0x41,
+ 0x00, 0x00, 0x44, 0x7D, 0x41,
+ 0x30, 0x48, 0x48, 0x4A, 0x32,
+ 0x38, 0x40, 0x40, 0x22, 0x7A,
+ 0x00, 0x7A, 0x0A, 0x0A, 0x72,
+ 0x7D, 0x0D, 0x19, 0x31, 0x7D,
+ 0x26, 0x29, 0x29, 0x2F, 0x28,
+ 0x26, 0x29, 0x29, 0x29, 0x26,
+ 0x30, 0x48, 0x4D, 0x40, 0x20,
+ 0x38, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x38,
+ 0x2F, 0x10, 0xC8, 0xAC, 0xBA,
+ 0x2F, 0x10, 0x28, 0x34, 0xFA,
+ 0x00, 0x00, 0x7B, 0x00, 0x00,
+ 0x08, 0x14, 0x2A, 0x14, 0x22,
+ 0x22, 0x14, 0x2A, 0x14, 0x08,
+ 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code
+ 0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block
+ 0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block
+ 0x00, 0x00, 0x00, 0xFF, 0x00,
+ 0x10, 0x10, 0x10, 0xFF, 0x00,
+ 0x14, 0x14, 0x14, 0xFF, 0x00,
+ 0x10, 0x10, 0xFF, 0x00, 0xFF,
+ 0x10, 0x10, 0xF0, 0x10, 0xF0,
+ 0x14, 0x14, 0x14, 0xFC, 0x00,
+ 0x14, 0x14, 0xF7, 0x00, 0xFF,
+ 0x00, 0x00, 0xFF, 0x00, 0xFF,
+ 0x14, 0x14, 0xF4, 0x04, 0xFC,
+ 0x14, 0x14, 0x17, 0x10, 0x1F,
+ 0x10, 0x10, 0x1F, 0x10, 0x1F,
+ 0x14, 0x14, 0x14, 0x1F, 0x00,
+ 0x10, 0x10, 0x10, 0xF0, 0x00,
+ 0x00, 0x00, 0x00, 0x1F, 0x10,
+ 0x10, 0x10, 0x10, 0x1F, 0x10,
+ 0x10, 0x10, 0x10, 0xF0, 0x10,
+ 0x00, 0x00, 0x00, 0xFF, 0x10,
+ 0x10, 0x10, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0xFF, 0x10,
+ 0x00, 0x00, 0x00, 0xFF, 0x14,
+ 0x00, 0x00, 0xFF, 0x00, 0xFF,
+ 0x00, 0x00, 0x1F, 0x10, 0x17,
+ 0x00, 0x00, 0xFC, 0x04, 0xF4,
+ 0x14, 0x14, 0x17, 0x10, 0x17,
+ 0x14, 0x14, 0xF4, 0x04, 0xF4,
+ 0x00, 0x00, 0xFF, 0x00, 0xF7,
+ 0x14, 0x14, 0x14, 0x14, 0x14,
+ 0x14, 0x14, 0xF7, 0x00, 0xF7,
+ 0x14, 0x14, 0x14, 0x17, 0x14,
+ 0x10, 0x10, 0x1F, 0x10, 0x1F,
+ 0x14, 0x14, 0x14, 0xF4, 0x14,
+ 0x10, 0x10, 0xF0, 0x10, 0xF0,
+ 0x00, 0x00, 0x1F, 0x10, 0x1F,
+ 0x00, 0x00, 0x00, 0x1F, 0x14,
+ 0x00, 0x00, 0x00, 0xFC, 0x14,
+ 0x00, 0x00, 0xF0, 0x10, 0xF0,
+ 0x10, 0x10, 0xFF, 0x10, 0xFF,
+ 0x14, 0x14, 0x14, 0xFF, 0x14,
+ 0x10, 0x10, 0x10, 0x1F, 0x00,
+ 0x00, 0x00, 0x00, 0xF0, 0x10,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xFF, 0xFF,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0x38, 0x44, 0x44, 0x38, 0x44,
+ 0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta
+ 0x7E, 0x02, 0x02, 0x06, 0x06,
+ 0x02, 0x7E, 0x02, 0x7E, 0x02,
+ 0x63, 0x55, 0x49, 0x41, 0x63,
+ 0x38, 0x44, 0x44, 0x3C, 0x04,
+ 0x40, 0x7E, 0x20, 0x1E, 0x20,
+ 0x06, 0x02, 0x7E, 0x02, 0x02,
+ 0x99, 0xA5, 0xE7, 0xA5, 0x99,
+ 0x1C, 0x2A, 0x49, 0x2A, 0x1C,
+ 0x4C, 0x72, 0x01, 0x72, 0x4C,
+ 0x30, 0x4A, 0x4D, 0x4D, 0x30,
+ 0x30, 0x48, 0x78, 0x48, 0x30,
+ 0xBC, 0x62, 0x5A, 0x46, 0x3D,
+ 0x3E, 0x49, 0x49, 0x49, 0x00,
+ 0x7E, 0x01, 0x01, 0x01, 0x7E,
+ 0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
+ 0x44, 0x44, 0x5F, 0x44, 0x44,
+ 0x40, 0x51, 0x4A, 0x44, 0x40,
+ 0x40, 0x44, 0x4A, 0x51, 0x40,
+ 0x00, 0x00, 0xFF, 0x01, 0x03,
+ 0xE0, 0x80, 0xFF, 0x00, 0x00,
+ 0x08, 0x08, 0x6B, 0x6B, 0x08,
+ 0x36, 0x12, 0x36, 0x24, 0x36,
+ 0x06, 0x0F, 0x09, 0x0F, 0x06,
+ 0x00, 0x00, 0x18, 0x18, 0x00,
+ 0x00, 0x00, 0x10, 0x10, 0x00,
+ 0x30, 0x40, 0xFF, 0x01, 0x01,
+ 0x00, 0x1F, 0x01, 0x01, 0x1E,
+ 0x00, 0x19, 0x1D, 0x17, 0x12,
+ 0x00, 0x3C, 0x3C, 0x3C, 0x3C,
+ 0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP
+};
+
+
+#endif // FONT5X7_H
--- /dev/null
+++ b/LEAF/Src/gpio.c
@@ -1,0 +1,176 @@
+/**
+ ******************************************************************************
+ * File Name : gpio.c
+ * Description : This file provides code for the configuration
+ * of all used GPIO pins.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "gpio.h"
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/*----------------------------------------------------------------------------*/
+/* Configure GPIO */
+/*----------------------------------------------------------------------------*/
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/** Configure pins
+ PH0-OSC_IN (PH0) ------> RCC_OSC_IN
+ PH1-OSC_OUT (PH1) ------> RCC_OSC_OUT
+ PA13 (JTMS/SWDIO) ------> DEBUG_JTMS-SWDIO
+ PA14 (JTCK/SWCLK) ------> DEBUG_JTCK-SWCLK
+ PB3 (JTDO/TRACESWO) ------> DEBUG_JTDO-SWO
+*/
+void MX_GPIO_Init(void)
+{
+
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOE_CLK_ENABLE();
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOF_CLK_ENABLE();
+ __HAL_RCC_GPIOH_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_GPIOG_CLK_ENABLE();
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14|GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_8|GPIO_PIN_9
+ |GPIO_PIN_10, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_4, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_10, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin : PC13 */
+ GPIO_InitStruct.Pin = GPIO_PIN_13;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PC14 PC4 PC6 PC7 */
+ GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : PC15 */
+ GPIO_InitStruct.Pin = GPIO_PIN_15;
+ GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : PF6 */
+ GPIO_InitStruct.Pin = GPIO_PIN_6;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PF7 PF8 PF9 PF10 */
+ GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PA1 PA15 */
+ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_15;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PA4 PA6 PA8 PA9
+ PA10 */
+ GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_8|GPIO_PIN_9
+ |GPIO_PIN_10;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PB0 PB4 */
+ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_4;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PB1 PB12 PB13 PB14
+ PB15 */
+ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
+ |GPIO_PIN_15;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PB2 PB9 */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_9;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PD11 PD7 */
+ GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PG3 PG9 PG13 PG14 */
+ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_9|GPIO_PIN_13|GPIO_PIN_14;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PG6 PG7 PG10 */
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_10;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PD3 PD4 PD5 PD6 */
+ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PG11 PG12 */
+ GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+
+}
+
+/* USER CODE BEGIN 2 */
+
+/* USER CODE END 2 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/i2c.c
@@ -1,0 +1,242 @@
+/**
+ ******************************************************************************
+ * File Name : I2C.c
+ * Description : This file provides code for the configuration
+ * of the I2C instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "i2c.h"
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+I2C_HandleTypeDef hi2c2;
+I2C_HandleTypeDef hi2c4;
+DMA_HandleTypeDef hdma_i2c4_rx;
+DMA_HandleTypeDef hdma_i2c4_tx;
+
+/* I2C2 init function */
+void MX_I2C2_Init(void)
+{
+
+ hi2c2.Instance = I2C2;
+ hi2c2.Init.Timing = 0x505097F4;
+ hi2c2.Init.OwnAddress1 = 0;
+ hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
+ hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
+ hi2c2.Init.OwnAddress2 = 0;
+ hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
+ hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
+ hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
+ if (HAL_I2C_Init(&hi2c2) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Analogue filter
+ */
+ if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Digital filter
+ */
+ if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+}
+/* I2C4 init function */
+void MX_I2C4_Init(void)
+{
+
+ hi2c4.Instance = I2C4;
+ hi2c4.Init.Timing = 0x307075B1;
+ hi2c4.Init.OwnAddress1 = 0;
+ hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
+ hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
+ hi2c4.Init.OwnAddress2 = 0;
+ hi2c4.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
+ hi2c4.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
+ hi2c4.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
+ if (HAL_I2C_Init(&hi2c4) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Analogue filter
+ */
+ if (HAL_I2CEx_ConfigAnalogFilter(&hi2c4, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Digital filter
+ */
+ if (HAL_I2CEx_ConfigDigitalFilter(&hi2c4, 0) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+}
+
+void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
+{
+
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(i2cHandle->Instance==I2C2)
+ {
+ /* USER CODE BEGIN I2C2_MspInit 0 */
+
+ /* USER CODE END I2C2_MspInit 0 */
+
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**I2C2 GPIO Configuration
+ PB10 ------> I2C2_SCL
+ PB11 ------> I2C2_SDA
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* I2C2 clock enable */
+ __HAL_RCC_I2C2_CLK_ENABLE();
+ /* USER CODE BEGIN I2C2_MspInit 1 */
+
+ /* USER CODE END I2C2_MspInit 1 */
+ }
+ else if(i2cHandle->Instance==I2C4)
+ {
+ /* USER CODE BEGIN I2C4_MspInit 0 */
+
+ /* USER CODE END I2C4_MspInit 0 */
+
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+ /**I2C4 GPIO Configuration
+ PD12 ------> I2C4_SCL
+ PD13 ------> I2C4_SDA
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
+ GPIO_InitStruct.Alternate = GPIO_AF4_I2C4;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+
+ /* I2C4 clock enable */
+ __HAL_RCC_I2C4_CLK_ENABLE();
+
+ /* I2C4 DMA Init */
+ /* I2C4_RX Init */
+ hdma_i2c4_rx.Instance = BDMA_Channel0;
+ hdma_i2c4_rx.Init.Request = BDMA_REQUEST_I2C4_RX;
+ hdma_i2c4_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
+ hdma_i2c4_rx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_i2c4_rx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_i2c4_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_i2c4_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_i2c4_rx.Init.Mode = DMA_NORMAL;
+ hdma_i2c4_rx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_i2c4_rx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(i2cHandle,hdmarx,hdma_i2c4_rx);
+
+ /* I2C4_TX Init */
+ hdma_i2c4_tx.Instance = BDMA_Channel1;
+ hdma_i2c4_tx.Init.Request = BDMA_REQUEST_I2C4_TX;
+ hdma_i2c4_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_i2c4_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_i2c4_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_i2c4_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_i2c4_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_i2c4_tx.Init.Mode = DMA_NORMAL;
+ hdma_i2c4_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_i2c4_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(i2cHandle,hdmatx,hdma_i2c4_tx);
+
+ /* I2C4 interrupt Init */
+ HAL_NVIC_SetPriority(I2C4_EV_IRQn, 6, 0);
+ HAL_NVIC_EnableIRQ(I2C4_EV_IRQn);
+ HAL_NVIC_SetPriority(I2C4_ER_IRQn, 6, 0);
+ HAL_NVIC_EnableIRQ(I2C4_ER_IRQn);
+ /* USER CODE BEGIN I2C4_MspInit 1 */
+
+ /* USER CODE END I2C4_MspInit 1 */
+ }
+}
+
+void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
+{
+
+ if(i2cHandle->Instance==I2C2)
+ {
+ /* USER CODE BEGIN I2C2_MspDeInit 0 */
+
+ /* USER CODE END I2C2_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_I2C2_CLK_DISABLE();
+
+ /**I2C2 GPIO Configuration
+ PB10 ------> I2C2_SCL
+ PB11 ------> I2C2_SDA
+ */
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11);
+
+ /* USER CODE BEGIN I2C2_MspDeInit 1 */
+
+ /* USER CODE END I2C2_MspDeInit 1 */
+ }
+ else if(i2cHandle->Instance==I2C4)
+ {
+ /* USER CODE BEGIN I2C4_MspDeInit 0 */
+
+ /* USER CODE END I2C4_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_I2C4_CLK_DISABLE();
+
+ /**I2C4 GPIO Configuration
+ PD12 ------> I2C4_SCL
+ PD13 ------> I2C4_SDA
+ */
+ HAL_GPIO_DeInit(GPIOD, GPIO_PIN_12|GPIO_PIN_13);
+
+ /* I2C4 DMA DeInit */
+ HAL_DMA_DeInit(i2cHandle->hdmarx);
+ HAL_DMA_DeInit(i2cHandle->hdmatx);
+
+ /* I2C4 interrupt Deinit */
+ HAL_NVIC_DisableIRQ(I2C4_EV_IRQn);
+ HAL_NVIC_DisableIRQ(I2C4_ER_IRQn);
+ /* USER CODE BEGIN I2C4_MspDeInit 1 */
+
+ /* USER CODE END I2C4_MspDeInit 1 */
+ }
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- a/LEAF/Src/leaf-analysis.c
+++ /dev/null
@@ -1,946 +1,0 @@
-/*==============================================================================
-
- leaf-analysis.c
- Created: 30 Nov 2018 11:56:49am
- Author: airship
-
-==============================================================================*/
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-analysis.h"
-#include "..\Externals\d_fft_mayer.h"
-
-#else
-
-#include "../Inc/leaf-analysis.h"
-#include "../Externals/d_fft_mayer.h"
-
-#endif
-
-//===========================================================================
-/* Envelope Follower */
-//===========================================================================
-
-void tEnvelopeFollower_init(tEnvelopeFollower* const ef, float attackThreshold, float decayCoeff)
-{
- _tEnvelopeFollower* e = *ef = (_tEnvelopeFollower*) leaf_alloc(sizeof(_tEnvelopeFollower));
-
- e->y = 0.0f;
- e->a_thresh = attackThreshold;
- e->d_coeff = decayCoeff;
-}
-
-void tEnvelopeFollower_free(tEnvelopeFollower* const ef)
-{
- _tEnvelopeFollower* e = *ef;
-
- leaf_free(e);
-}
-
-void tEnvelopeFollower_initToPool (tEnvelopeFollower* const ef, float attackThreshold, float decayCoeff, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tEnvelopeFollower* e = *ef = (_tEnvelopeFollower*) mpool_alloc(sizeof(_tEnvelopeFollower), &m->pool);
-
- e->y = 0.0f;
- e->a_thresh = attackThreshold;
- e->d_coeff = decayCoeff;
-}
-
-void tEnvelopeFollower_freeFromPool (tEnvelopeFollower* const ef, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tEnvelopeFollower* e = *ef;
-
- mpool_free(e, &m->pool);
-}
-
-float tEnvelopeFollower_tick(tEnvelopeFollower* const ef, float x)
-{
- _tEnvelopeFollower* e = *ef;
-
- if (x < 0.0f ) x = -x; /* Absolute value. */
-
- if ((x >= e->y) && (x > e->a_thresh)) e->y = x; /* If we hit a peak, ride the peak to the top. */
- else e->y = e->y * e->d_coeff; /* Else, exponential decay of output. */
-
- //ef->y = envelope_pow[(uint16_t)(ef->y * (float)UINT16_MAX)] * ef->d_coeff; //not quite the right behavior - too much loss of precision?
- //ef->y = powf(ef->y, 1.000009f) * ef->d_coeff; // too expensive
-
- if( e->y < VSF) e->y = 0.0f;
-
- return e->y;
-}
-
-int tEnvelopeFollower_decayCoeff(tEnvelopeFollower* const ef, float decayCoeff)
-{
- _tEnvelopeFollower* e = *ef;
- return e->d_coeff = decayCoeff;
-}
-
-int tEnvelopeFollower_attackThresh(tEnvelopeFollower* const ef, float attackThresh)
-{
- _tEnvelopeFollower* e = *ef;
- return e->a_thresh = attackThresh;
-}
-
-
-//===========================================================================
-/* Power Follower */
-//===========================================================================
-void tPowerFollower_init(tPowerFollower* const pf, float factor)
-{
- _tPowerFollower* p = *pf = (_tPowerFollower*) leaf_alloc(sizeof(_tPowerFollower));
-
- p->curr=0.0f;
- p->factor=factor;
- p->oneminusfactor=1.0f-factor;
-}
-
-void tPowerFollower_free(tPowerFollower* const pf)
-{
- _tPowerFollower* p = *pf;
-
- leaf_free(p);
-}
-
-void tPowerFollower_initToPool (tPowerFollower* const pf, float factor, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPowerFollower* p = *pf = (_tPowerFollower*) mpool_alloc(sizeof(_tPowerFollower), &m->pool);
-
- p->curr=0.0f;
- p->factor=factor;
- p->oneminusfactor=1.0f-factor;
-}
-
-void tPowerFollower_freeFromPool (tPowerFollower* const pf, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPowerFollower* p = *pf;
-
- mpool_free(p, &m->pool);
-}
-
-int tPowerFollower_setFactor(tPowerFollower* const pf, float factor)
-{
- _tPowerFollower* p = *pf;
-
- if (factor<0) factor=0;
- if (factor>1) factor=1;
- p->factor=factor;
- p->oneminusfactor=1.0f-factor;
- return 0;
-}
-
-float tPowerFollower_tick(tPowerFollower* const pf, float input)
-{
- _tPowerFollower* p = *pf;
- p->curr = p->factor*input*input+p->oneminusfactor*p->curr;
- return p->curr;
-}
-
-float tPowerFollower_sample(tPowerFollower* const pf)
-{
- _tPowerFollower* p = *pf;
- return p->curr;
-}
-
-
-
-
-//===========================================================================
-/* ---------------- env~ - simple envelope follower. ----------------- */
-//===========================================================================
-
-void tEnvPD_init(tEnvPD* const xpd, int ws, int hs, int bs)
-{
- _tEnvPD* x = *xpd = (_tEnvPD*) leaf_calloc(sizeof(_tEnvPD));
-
- int period = hs, npoints = ws;
-
- int i;
-
- if (npoints < 1) npoints = 1024;
- if (period < 1) period = npoints/2;
- if (period < npoints / MAXOVERLAP + 1)
- period = npoints / MAXOVERLAP + 1;
-
- x->x_npoints = npoints;
- x->x_phase = 0;
- x->x_period = period;
-
- x->windowSize = npoints;
- x->hopSize = period;
- x->blockSize = bs;
-
- for (i = 0; i < MAXOVERLAP; i++) x->x_sumbuf[i] = 0.0f;
- for (i = 0; i < npoints; i++)
- x->buf[i] = (1.0f - cosf((TWO_PI * i) / npoints))/npoints;
- for (; i < npoints+INITVSTAKEN; i++) x->buf[i] = 0.0f;
-
- x->x_f = 0.0f;
-
- x->x_allocforvs = INITVSTAKEN;
-
- // ~ ~ ~ dsp ~ ~ ~
- if (x->x_period % x->blockSize)
- {
- x->x_realperiod = x->x_period + x->blockSize - (x->x_period % x->blockSize);
- }
- else
- {
- x->x_realperiod = x->x_period;
- }
- // ~ ~ ~ ~ ~ ~ ~ ~
-}
-
-void tEnvPD_free (tEnvPD* const xpd)
-{
- _tEnvPD* x = *xpd;
-
- leaf_free(x);
-}
-
-void tEnvPD_initToPool (tEnvPD* const xpd, int ws, int hs, int bs, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tEnvPD* x = *xpd = (_tEnvPD*) mpool_calloc(sizeof(_tEnvPD), &m->pool);
-
- int period = hs, npoints = ws;
-
- int i;
-
- if (npoints < 1) npoints = 1024;
- if (period < 1) period = npoints/2;
- if (period < npoints / MAXOVERLAP + 1)
- period = npoints / MAXOVERLAP + 1;
-
- x->x_npoints = npoints;
- x->x_phase = 0;
- x->x_period = period;
-
- x->windowSize = npoints;
- x->hopSize = period;
- x->blockSize = bs;
-
- for (i = 0; i < MAXOVERLAP; i++) x->x_sumbuf[i] = 0;
- for (i = 0; i < npoints; i++)
- x->buf[i] = (1.0f - cosf((2 * PI * i) / npoints))/npoints;
- for (; i < npoints+INITVSTAKEN; i++) x->buf[i] = 0;
-
- x->x_f = 0;
-
- x->x_allocforvs = INITVSTAKEN;
-
- // ~ ~ ~ dsp ~ ~ ~
- if (x->x_period % x->blockSize)
- {
- x->x_realperiod = x->x_period + x->blockSize - (x->x_period % x->blockSize);
- }
- else
- {
- x->x_realperiod = x->x_period;
- }
- // ~ ~ ~ ~ ~ ~ ~ ~
-}
-
-void tEnvPD_freeFromPool (tEnvPD* const xpd, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tEnvPD* x = *xpd;
-
- mpool_free(x, &m->pool);
-}
-
-float tEnvPD_tick (tEnvPD* const xpd)
-{
- _tEnvPD* x = *xpd;
- return powtodb(x->x_result);
-}
-
-void tEnvPD_processBlock(tEnvPD* const xpd, float* in)
-{
- _tEnvPD* x = *xpd;
-
- int n = x->blockSize;
-
- int count;
- t_sample *sump;
- in += n;
- for (count = x->x_phase, sump = x->x_sumbuf;
- count < x->x_npoints; count += x->x_realperiod, sump++)
- {
- t_sample *hp = x->buf + count;
- t_sample *fp = in;
- t_sample sum = *sump;
- int i;
-
- for (i = 0; i < n; i++)
- {
- fp--;
- sum += *hp++ * (*fp * *fp);
- }
- *sump = sum;
- }
- sump[0] = 0;
- x->x_phase -= n;
- if (x->x_phase < 0)
- {
- x->x_result = x->x_sumbuf[0];
- for (count = x->x_realperiod, sump = x->x_sumbuf;
- count < x->x_npoints; count += x->x_realperiod, sump++)
- sump[0] = sump[1];
- sump[0] = 0;
- x->x_phase = x->x_realperiod - n;
- }
-}
-
-//===========================================================================
-// ATTACKDETECTION
-//===========================================================================
-/********Private function prototypes**********/
-static void atkdtk_init(tAttackDetection* const a, int blocksize, int atk, int rel);
-static void atkdtk_envelope(tAttackDetection* const a, float *in);
-
-/********Constructor/Destructor***************/
-
-void tAttackDetection_init(tAttackDetection* const ad, int blocksize, int atk, int rel)
-{
- *ad = (_tAttackDetection*) leaf_alloc(sizeof(_tAttackDetection));
-
- atkdtk_init(ad, blocksize, atk, rel);
-}
-
-void tAttackDetection_free(tAttackDetection* const ad)
-{
- _tAttackDetection* a = *ad;
-
- leaf_free(a);
-}
-
-void tAttackDetection_initToPool (tAttackDetection* const ad, int blocksize, int atk, int rel, tMempool* const mp)
-{
- _tMempool* m = *mp;
- *ad = (_tAttackDetection*) mpool_alloc(sizeof(_tAttackDetection), &m->pool);
-
- atkdtk_init(ad, blocksize, atk, rel);
-}
-
-void tAttackDetection_freeFromPool (tAttackDetection* const ad, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tAttackDetection* a = *ad;
-
- mpool_free(a, &m->pool);
-}
-
-/*******Public Functions***********/
-
-
-void tAttackDetection_setBlocksize(tAttackDetection* const ad, int size)
-{
- _tAttackDetection* a = *ad;
-
- if(!((size==64)|(size==128)|(size==256)|(size==512)|(size==1024)|(size==2048)))
- size = DEFBLOCKSIZE;
- a->blocksize = size;
-
- return;
-
-}
-
-void tAttackDetection_setSamplerate(tAttackDetection* const ad, int inRate)
-{
- _tAttackDetection* a = *ad;
-
- a->samplerate = inRate;
-
- //Reset atk and rel to recalculate coeff
- tAttackDetection_setAttack(ad, a->atk);
- tAttackDetection_setRelease(ad, a->rel);
-}
-
-void tAttackDetection_setThreshold(tAttackDetection* const ad, float thres)
-{
- _tAttackDetection* a = *ad;
- a->threshold = thres;
-}
-
-void tAttackDetection_setAttack(tAttackDetection* const ad, int inAtk)
-{
- _tAttackDetection* a = *ad;
- a->atk = inAtk;
- a->atk_coeff = pow(0.01, 1.0/(a->atk * a->samplerate * 0.001));
-}
-
-void tAttackDetection_setRelease(tAttackDetection* const ad, int inRel)
-{
- _tAttackDetection* a = *ad;
- a->rel = inRel;
- a->rel_coeff = pow(0.01, 1.0/(a->rel * a->samplerate * 0.001));
-}
-
-
-int tAttackDetection_detect(tAttackDetection* const ad, float *in)
-{
- _tAttackDetection* a = *ad;
-
- int result;
-
- atkdtk_envelope(ad, in);
-
- if(a->env >= a->prevAmp*2) //2 times greater = 6dB increase
- result = 1;
- else
- result = 0;
-
- a->prevAmp = a->env;
-
- return result;
-}
-
-/*******Private Functions**********/
-
-static void atkdtk_init(tAttackDetection* const ad, int blocksize, int atk, int rel)
-{
- _tAttackDetection* a = *ad;
-
- a->env = 0;
- a->blocksize = blocksize;
- a->threshold = DEFTHRESHOLD;
- a->samplerate = leaf.sampleRate;
- a->prevAmp = 0;
-
- a->env = 0;
-
- tAttackDetection_setAttack(ad, atk);
- tAttackDetection_setRelease(ad, rel);
-}
-
-static void atkdtk_envelope(tAttackDetection* const ad, float *in)
-{
- _tAttackDetection* a = *ad;
-
- int i = 0;
- float tmp;
- for(i = 0; i < a->blocksize; ++i){
- tmp = fastabsf(in[i]);
-
- if(tmp > a->env)
- a->env = a->atk_coeff * (a->env - tmp) + tmp;
- else
- a->env = a->rel_coeff * (a->env - tmp) + tmp;
- }
-
-}
-
-//===========================================================================
-// SNAC
-//===========================================================================
-/******************************************************************************/
-/***************************** private procedures *****************************/
-/******************************************************************************/
-
-#define REALFFT mayer_realfft
-#define REALIFFT mayer_realifft
-
-static void snac_analyzeframe(tSNAC* const s);
-static void snac_autocorrelation(tSNAC* const s);
-static void snac_normalize(tSNAC* const s);
-static void snac_pickpeak(tSNAC* const s);
-static void snac_periodandfidelity(tSNAC* const s);
-static void snac_biasbuf(tSNAC* const s);
-static float snac_spectralpeak(tSNAC* const s, float periodlength);
-
-
-/******************************************************************************/
-/******************************** constructor, destructor *********************/
-/******************************************************************************/
-
-
-void tSNAC_init(tSNAC* const snac, int overlaparg)
-{
- _tSNAC* s = *snac = (_tSNAC*) leaf_calloc(sizeof(_tSNAC));
-
- s->biasfactor = DEFBIAS;
- s->timeindex = 0;
- s->periodindex = 0;
- s->periodlength = 0.;
- s->fidelity = 0.;
- s->minrms = DEFMINRMS;
- s->framesize = SNAC_FRAME_SIZE;
-
- s->inputbuf = (float*) leaf_calloc(sizeof(float) * SNAC_FRAME_SIZE);
- s->processbuf = (float*) leaf_calloc(sizeof(float) * (SNAC_FRAME_SIZE * 2));
- s->spectrumbuf = (float*) leaf_calloc(sizeof(float) * (SNAC_FRAME_SIZE / 2));
- s->biasbuf = (float*) leaf_calloc(sizeof(float) * SNAC_FRAME_SIZE);
-
- snac_biasbuf(snac);
- tSNAC_setOverlap(snac, overlaparg);
-}
-
-void tSNAC_free(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
-
- leaf_free(s->inputbuf);
- leaf_free(s->processbuf);
- leaf_free(s->spectrumbuf);
- leaf_free(s->biasbuf);
- leaf_free(s);
-}
-
-void tSNAC_initToPool (tSNAC* const snac, int overlaparg, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSNAC* s = *snac = (_tSNAC*) mpool_alloc(sizeof(_tSNAC), &m->pool);
-
- s->biasfactor = DEFBIAS;
- s->timeindex = 0;
- s->periodindex = 0;
- s->periodlength = 0.;
- s->fidelity = 0.;
- s->minrms = DEFMINRMS;
- s->framesize = SNAC_FRAME_SIZE;
-
- s->inputbuf = (float*) mpool_calloc(sizeof(float) * SNAC_FRAME_SIZE, &m->pool);
- s->processbuf = (float*) mpool_calloc(sizeof(float) * (SNAC_FRAME_SIZE * 2), &m->pool);
- s->spectrumbuf = (float*) mpool_calloc(sizeof(float) * (SNAC_FRAME_SIZE / 2), &m->pool);
- s->biasbuf = (float*) mpool_calloc(sizeof(float) * SNAC_FRAME_SIZE, &m->pool);
-
- snac_biasbuf(snac);
- tSNAC_setOverlap(snac, overlaparg);
-}
-
-void tSNAC_freeFromPool (tSNAC* const snac, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSNAC* s = *snac;
-
- mpool_free(s->inputbuf, &m->pool);
- mpool_free(s->processbuf, &m->pool);
- mpool_free(s->spectrumbuf, &m->pool);
- mpool_free(s->biasbuf, &m->pool);
- mpool_free(s, &m->pool);
-}
-
-/******************************************************************************/
-/************************** public access functions****************************/
-/******************************************************************************/
-
-
-void tSNAC_ioSamples(tSNAC* const snac, float *in, float *out, int size)
-{
- _tSNAC* s = *snac;
-
- int timeindex = s->timeindex;
- int mask = s->framesize - 1;
- int outindex = 0;
- float *inputbuf = s->inputbuf;
- float *processbuf = s->processbuf;
-
- // call analysis function when it is time
- if(!(timeindex & (s->framesize / s->overlap - 1))) snac_analyzeframe(snac);
-
- while(size--)
- {
- inputbuf[timeindex] = *in++;
- out[outindex++] = processbuf[timeindex++];
- timeindex &= mask;
- }
- s->timeindex = timeindex;
-}
-
-void tSNAC_setOverlap(tSNAC* const snac, int lap)
-{
- _tSNAC* s = *snac;
- if(!((lap==1)|(lap==2)|(lap==4)|(lap==8))) lap = DEFOVERLAP;
- s->overlap = lap;
-}
-
-
-void tSNAC_setBias(tSNAC* const snac, float bias)
-{
- _tSNAC* s = *snac;
- if(bias > 1.) bias = 1.;
- if(bias < 0.) bias = 0.;
- s->biasfactor = bias;
- snac_biasbuf(snac);
- return;
-}
-
-
-void tSNAC_setMinRMS(tSNAC* const snac, float rms)
-{
- _tSNAC* s = *snac;
- if(rms > 1.) rms = 1.;
- if(rms < 0.) rms = 0.;
- s->minrms = rms;
- return;
-}
-
-
-float tSNAC_getPeriod(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
- return(s->periodlength);
-}
-
-
-float tSNAC_getFidelity(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
- return(s->fidelity);
-}
-
-
-/******************************************************************************/
-/***************************** private procedures *****************************/
-/******************************************************************************/
-
-
-// main analysis function
-static void snac_analyzeframe(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
-
- int n, tindex = s->timeindex;
- int framesize = s->framesize;
- int mask = framesize - 1;
- float norm = 1. / sqrt((float)(framesize * 2));
-
- float *inputbuf = s->inputbuf;
- float *processbuf = s->processbuf;
-
- // copy input to processing buffers
- for(n=0; n<framesize; n++)
- {
- processbuf[n] = inputbuf[tindex] * norm;
- tindex++;
- tindex &= mask;
- }
-
- // zeropadding
- for(n=framesize; n<(framesize<<1); n++) processbuf[n] = 0.;
-
- // call analysis procedures
- snac_autocorrelation(snac);
- snac_normalize(snac);
- snac_pickpeak(snac);
- snac_periodandfidelity(snac);
-}
-
-
-static void snac_autocorrelation(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
-
- int n, m;
- int framesize = s->framesize;
- int fftsize = framesize * 2;
- float *processbuf = s->processbuf;
- float *spectrumbuf = s->spectrumbuf;
-
- REALFFT(fftsize, processbuf);
-
- // compute power spectrum
- processbuf[0] *= processbuf[0]; // DC
- processbuf[framesize] *= processbuf[framesize]; // Nyquist
-
- for(n=1; n<framesize; n++)
- {
- processbuf[n] = processbuf[n] * processbuf[n]
- + processbuf[fftsize-n] * processbuf[fftsize-n]; // imag coefficients appear reversed
- processbuf[fftsize-n] = 0.;
- }
-
- // store power spectrum up to SR/4 for possible later use
- for(m=0; m<(framesize>>1); m++)
- {
- spectrumbuf[m] = processbuf[m];
- }
-
- // transform power spectrum to autocorrelation function
- REALIFFT(fftsize, processbuf);
- return;
-}
-
-
-static void snac_normalize(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
-
- int framesize = s->framesize;
- int framesizeplustimeindex = s->framesize + s->timeindex;
- int timeindexminusone = s->timeindex - 1;
- int n, m;
- int mask = framesize - 1;
- int seek = framesize * SEEK;
- float *inputbuf = s->inputbuf;
- float *processbuf= s->processbuf;
- float signal1, signal2;
-
- // minimum RMS implemented as minimum autocorrelation at index 0
- // functionally equivalent to white noise floor
- float rms = s->minrms / sqrt(1.0f / (float)framesize);
- float minrzero = rms * rms;
- float rzero = processbuf[0];
- if(rzero < minrzero) rzero = minrzero;
- double normintegral = (double)rzero * 2.;
-
- // normalize biased autocorrelation function
- // inputbuf is circular buffer: timeindex may be non-zero when overlap > 1
- processbuf[0] = 1;
- for(n=1, m=s->timeindex+1; n<seek; n++, m++)
- {
- signal1 = inputbuf[(n + timeindexminusone)&mask];
- signal2 = inputbuf[(framesizeplustimeindex - n)&mask];
- normintegral -= (double)(signal1 * signal1 + signal2 * signal2);
- processbuf[n] /= (float)normintegral * 0.5f;
- }<