diff --git a/.cproject b/.cproject
new file mode 100644
index 0000000..d5a8b16
--- /dev/null
+++ b/.cproject
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..1ff0c42
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,63 @@
+###############################################################################
+# Set default behavior to automatically normalize line endings.
+###############################################################################
+* text=auto
+
+###############################################################################
+# Set default behavior for command prompt diff.
+#
+# This is need for earlier builds of msysgit that does not have it on by
+# default for csharp files.
+# Note: This is only used by command line
+###############################################################################
+#*.cs diff=csharp
+
+###############################################################################
+# Set the merge driver for project and solution files
+#
+# Merging from the command prompt will add diff markers to the files if there
+# are conflicts (Merging from VS is not affected by the settings below, in VS
+# the diff markers are never inserted). Diff markers may cause the following
+# file extensions to fail to load in VS. An alternative would be to treat
+# these files as binary and thus will always conflict and require user
+# intervention with every merge. To do so, just uncomment the entries below
+###############################################################################
+#*.sln merge=binary
+#*.csproj merge=binary
+#*.vbproj merge=binary
+#*.vcxproj merge=binary
+#*.vcproj merge=binary
+#*.dbproj merge=binary
+#*.fsproj merge=binary
+#*.lsproj merge=binary
+#*.wixproj merge=binary
+#*.modelproj merge=binary
+#*.sqlproj merge=binary
+#*.wwaproj merge=binary
+
+###############################################################################
+# behavior for image files
+#
+# image files are treated as binary by default.
+###############################################################################
+#*.jpg binary
+#*.png binary
+#*.gif binary
+
+###############################################################################
+# diff behavior for common document formats
+#
+# Convert binary document formats to text before diffing them. This feature
+# is only available from the command line. Turn it on by uncommenting the
+# entries below.
+###############################################################################
+#*.doc diff=astextplain
+#*.DOC diff=astextplain
+#*.docx diff=astextplain
+#*.DOCX diff=astextplain
+#*.dot diff=astextplain
+#*.DOT diff=astextplain
+#*.pdf diff=astextplain
+#*.PDF diff=astextplain
+#*.rtf diff=astextplain
+#*.RTF diff=astextplain
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0e7e9ab
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,243 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# User-specific files
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+[Xx]64/
+[Xx]86/
+[Bb]uild/
+bld/
+[Bb]in/
+[Oo]bj/
+
+# Visual Studio 2015 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUNIT
+*.VisualState.xml
+TestResult.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# DNX
+project.lock.json
+artifacts/
+
+*_i.c
+*_p.c
+*_i.h
+*.ilk
+*.meta
+*.obj
+*.pch
+*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# JustCode is a .NET coding add-in
+.JustCode
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+
+# TODO: Un-comment the next line if you do not want to checkin
+# your web deploy settings because they may include unencrypted
+# passwords
+#*.pubxml
+*.publishproj
+
+# NuGet Packages
+*.nupkg
+# The packages folder can be ignored because of Package Restore
+**/packages/*
+# except build/, which is used as an MSBuild target.
+!**/packages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/packages/repositories.config
+# NuGet v3's project.json files produces more ignoreable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directory
+AppPackages/
+BundleArtifacts/
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!*.[Cc]ache/
+
+# Others
+ClientBin/
+[Ss]tyle[Cc]op.*
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.pfx
+*.publishsettings
+node_modules/
+orleans.codegen.cs
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+
+# SQL Server files
+*.mdf
+*.ldf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# LightSwitch generated files
+GeneratedArtifacts/
+ModelManifest.xml
+
+# Paket dependency manager
+.paket/paket.exe
+
+# FAKE - F# Make
+.fake/
+/Unit Test/
diff --git a/.project b/.project
new file mode 100644
index 0000000..57b07d8
--- /dev/null
+++ b/.project
@@ -0,0 +1,26 @@
+
+
+ PiScan
+
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+ clean,full,incremental,
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+
+ org.eclipse.cdt.core.cnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+
+
diff --git a/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/.settings/org.eclipse.cdt.managedbuilder.core.prefs
new file mode 100644
index 0000000..c5b8b6f
--- /dev/null
+++ b/.settings/org.eclipse.cdt.managedbuilder.core.prefs
@@ -0,0 +1,21 @@
+eclipse.preferences.version=1
+environment/buildEnvironmentInclude/org.eclipse.cdt.msvc.exe.debug.1269692248.1652501512/CPATH/delimiter=;
+environment/buildEnvironmentInclude/org.eclipse.cdt.msvc.exe.debug.1269692248.1652501512/CPATH/operation=remove
+environment/buildEnvironmentInclude/org.eclipse.cdt.msvc.exe.debug.1269692248.1652501512/C_INCLUDE_PATH/delimiter=;
+environment/buildEnvironmentInclude/org.eclipse.cdt.msvc.exe.debug.1269692248.1652501512/C_INCLUDE_PATH/operation=remove
+environment/buildEnvironmentInclude/org.eclipse.cdt.msvc.exe.debug.1269692248.1652501512/append=true
+environment/buildEnvironmentInclude/org.eclipse.cdt.msvc.exe.debug.1269692248.1652501512/appendContributed=true
+environment/buildEnvironmentInclude/org.eclipse.cdt.msvc.exe.debug.1269692248/CPATH/delimiter=;
+environment/buildEnvironmentInclude/org.eclipse.cdt.msvc.exe.debug.1269692248/CPATH/operation=remove
+environment/buildEnvironmentInclude/org.eclipse.cdt.msvc.exe.debug.1269692248/C_INCLUDE_PATH/delimiter=;
+environment/buildEnvironmentInclude/org.eclipse.cdt.msvc.exe.debug.1269692248/C_INCLUDE_PATH/operation=remove
+environment/buildEnvironmentInclude/org.eclipse.cdt.msvc.exe.debug.1269692248/append=true
+environment/buildEnvironmentInclude/org.eclipse.cdt.msvc.exe.debug.1269692248/appendContributed=true
+environment/buildEnvironmentLibrary/org.eclipse.cdt.msvc.exe.debug.1269692248.1652501512/LIBRARY_PATH/delimiter=;
+environment/buildEnvironmentLibrary/org.eclipse.cdt.msvc.exe.debug.1269692248.1652501512/LIBRARY_PATH/operation=remove
+environment/buildEnvironmentLibrary/org.eclipse.cdt.msvc.exe.debug.1269692248.1652501512/append=true
+environment/buildEnvironmentLibrary/org.eclipse.cdt.msvc.exe.debug.1269692248.1652501512/appendContributed=true
+environment/buildEnvironmentLibrary/org.eclipse.cdt.msvc.exe.debug.1269692248/LIBRARY_PATH/delimiter=;
+environment/buildEnvironmentLibrary/org.eclipse.cdt.msvc.exe.debug.1269692248/LIBRARY_PATH/operation=remove
+environment/buildEnvironmentLibrary/org.eclipse.cdt.msvc.exe.debug.1269692248/append=true
+environment/buildEnvironmentLibrary/org.eclipse.cdt.msvc.exe.debug.1269692248/appendContributed=true
diff --git a/Test profile 1.sp b/Test profile 1.sp
new file mode 100644
index 0000000..0389bec
Binary files /dev/null and b/Test profile 1.sp differ
diff --git a/profiles/Test profile 1.sp b/profiles/Test profile 1.sp
new file mode 100644
index 0000000..2848949
Binary files /dev/null and b/profiles/Test profile 1.sp differ
diff --git a/profiles/Test profile 1/Analog system 1.scn b/profiles/Test profile 1/Analog system 1.scn
new file mode 100644
index 0000000..f96ba3d
Binary files /dev/null and b/profiles/Test profile 1/Analog system 1.scn differ
diff --git a/profiles/Test profile 1/Analog system 1/.scn b/profiles/Test profile 1/Analog system 1/.scn
new file mode 100644
index 0000000..030103b
Binary files /dev/null and b/profiles/Test profile 1/Analog system 1/.scn differ
diff --git a/src/PiScan.vcproj b/src/PiScan.vcproj
new file mode 100644
index 0000000..e69de29
diff --git a/src/display/graphic_lcd/drv_MatrixOrbitalGX.c b/src/display/graphic_lcd/drv_MatrixOrbitalGX.c
new file mode 100644
index 0000000..95c68ac
--- /dev/null
+++ b/src/display/graphic_lcd/drv_MatrixOrbitalGX.c
@@ -0,0 +1,576 @@
+/* $Id: drv_MatrixOrbitalGX.c 975 2009-02-27 18:50:20Z abbas $
+ * $URL: https://ssl.bulix.org/svn/lcd4linux/trunk/drv_MatrixOrbitalGX.c $
+ *
+ * driver for Matrix Orbital GX Series Graphic(240x64) displays from matrixorbital.com
+ *
+ * Copyright (C) 2009 Abbas Kosan
+ * Copyright (C) 2005, 2006, 2007 The LCD4Linux Team
+ *
+ *
+ * This file is part of LCD4Linux.
+ *
+ * LCD4Linux 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, or (at your option)
+ * any later version.
+ *
+ * LCD4Linux 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/*
+ * MODIFIED for use in PiScan
+ */
+
+/*
+ *
+ * exported fuctions:
+ *
+ * struct DRIVER drv_MatrixOrbitalGX
+ *
+ */
+
+//#include "config.h"
+
+#include
+#include
+#include
+#include
+#include
+//#include
+//#include
+//#include
+//#include
+
+#include
+/*
+#include "debug.h"
+#include "cfg.h"
+#include "qprintf.h"
+#include "udelay.h"
+#include "plugin.h"
+#include "widget.h"
+#include "widget_text.h"
+#include "widget_icon.h"
+#include "widget_bar.h"
+#include "drv.h"
+
+#include "drv_generic_graphic.h"
+*/
+#define MatrixOrbitalGX_VENDOR 0x1b3d
+#define MatrixOrbitalGX_DEVICE_1 0x000a
+#define MatrixOrbitalGX_DEVICE_2 0x000b
+#define MatrixOrbitalGX_DEVICE_3 0x000c
+
+/********Matrix Orbital GX Series*********/
+#define INTERFACE_ 0
+#define BULK_OUT_ENDPOINT 0x05
+#define BULK_IN_ENDPOINT 0x82
+
+#define SCREEN_H 64
+#define SCREEN_W 240
+#define SCREEN_SIZE (SCREEN_H * SCREEN_W)
+/*****************************************/
+
+#if 1
+#define DEBUG(x) debug("%s(): %s", __FUNCTION__, x);
+#else
+#define DEBUG(x)
+#endif
+
+
+static char Name[] = "MatrixOrbitalGX";
+static unsigned char *MOGX_framebuffer;
+
+/* used to display white text on blue background or inverse */
+static unsigned char invert = 0x00;
+static unsigned char backlight_RGB = 0;
+
+static usb_dev_handle *lcd_dev;
+
+/*
+int mygetch(void)
+{
+ struct termios oldt, newt;
+ int ch;
+ tcgetattr( STDIN_FILENO, &oldt );
+ newt = oldt;
+ newt.c_lflag &= ~( ICANON | ECHO );
+ tcsetattr( STDIN_FILENO, TCSANOW, &newt );
+ ch = getchar();
+ tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
+ return ch;
+}
+*/
+
+/****************************************/
+/*** hardware dependant functions ***/
+/****************************************/
+
+static int drv_MOGX_open(void)
+{
+ struct usb_bus *busses, *bus;
+ struct usb_device *dev;
+ char driver[1024];
+ char product[1024];
+ char manufacturer[1024];
+ char serialnumber[1024];
+ int ret;
+
+ lcd_dev = NULL;
+
+ info("%s: scanning for Matrix Orbital GX Series LCD...", Name);
+
+ usb_set_debug(0);
+
+ usb_init();
+ usb_find_busses();
+ usb_find_devices();
+ busses = usb_get_busses();
+
+ for (bus = busses; bus; bus = bus->next) {
+ for (dev = bus->devices; dev; dev = dev->next) {
+ if ((dev->descriptor.idVendor == MatrixOrbitalGX_VENDOR) &&
+ ((dev->descriptor.idProduct == MatrixOrbitalGX_DEVICE_1) ||
+ (dev->descriptor.idProduct == MatrixOrbitalGX_DEVICE_2) ||
+ (dev->descriptor.idProduct == MatrixOrbitalGX_DEVICE_3))) {
+
+ /* At the moment, I have information for only this LCD */
+ if (dev->descriptor.idProduct == MatrixOrbitalGX_DEVICE_2)
+ backlight_RGB = 0;
+
+ info("%s: found Matrix Orbital GX Series LCD on bus %s device %s", Name, bus->dirname, dev->filename);
+
+ lcd_dev = usb_open(dev);
+
+ ret = usb_get_driver_np(lcd_dev, 0, driver, sizeof(driver));
+
+ if (ret == 0) {
+ info("%s: interface 0 already claimed by '%s'", Name, driver);
+ info("%s: attempting to detach driver...", Name);
+ if (usb_detach_kernel_driver_np(lcd_dev, 0) < 0) {
+ error("%s: usb_detach_kernel_driver_np() failed!", Name);
+ return -1;
+ }
+ }
+
+ usb_set_configuration(lcd_dev, 1);
+ usleep(100);
+
+ if (usb_claim_interface(lcd_dev, 0) < 0) {
+ error("%s: usb_claim_interface() failed!", Name);
+ return -1;
+ }
+
+ usb_set_altinterface(lcd_dev, 0);
+
+ usb_get_string_simple(lcd_dev, dev->descriptor.iProduct, product, sizeof(product));
+ usb_get_string_simple(lcd_dev, dev->descriptor.iManufacturer, manufacturer, sizeof(manufacturer));
+ usb_get_string_simple(lcd_dev, dev->descriptor.iSerialNumber, serialnumber, sizeof(serialnumber));
+
+ info("%s: Manufacturer='%s' Product='%s' SerialNumber='%s'", Name, manufacturer, product, serialnumber);
+
+ return 0;
+ }
+ }
+ }
+ error("%s: could not find a Matrix Orbital GX Series LCD", Name);
+ return -1;
+}
+
+static void drv_MOGX_send(const unsigned char *data, const unsigned int size)
+{
+ int __attribute__ ((unused)) ret;
+
+ //unsigned char rcv_buffer[64] = "";
+
+ ret = usb_bulk_write(lcd_dev, BULK_OUT_ENDPOINT, (char *) data, size, 1000);
+
+ //info("%s written %d bytes\n", __FUNCTION__, ret);
+
+ //ret = usb_bulk_read(lcd_dev, BULK_IN_ENDPOINT, (char *) rcv_buffer,64,1000);
+
+ //printf("\nReply : ");
+ //for (i=0;i= 0; bit--) {
+ if (MOGX_framebuffer[x] ^ invert)
+ pixel_byte |= (1 << bit);
+ else
+ pixel_byte &= ~(1 << bit);
+ x++;
+ }
+
+ if (pixel_byte == 0xc0) {
+ cmd[11 + cmd_length] = 0xdb;
+ cmd_length++;
+ cmd[11 + cmd_length] = 0xdc;
+ cmd_length++;
+ } else if (pixel_byte == 0xdb) {
+ cmd[11 + cmd_length] = 0xdb;
+ cmd_length++;
+ cmd[11 + cmd_length] = 0xdd;
+ cmd_length++;
+ } else {
+ cmd[11 + cmd_length] = pixel_byte;
+ cmd_length++;
+ }
+ }
+ /* finish command */
+ cmd[11 + cmd_length] = 0xc0;
+
+ //info("In %s - %s \n", __FUNCTION__, cmd_img);
+ /* send command which includes framebuffer */
+ drv_MOGX_send(cmd, cmd_length + 12);
+}
+
+static void drv_MOGX_blit(const int row, const int col, const int height, const int width)
+{
+ int r, c;
+
+ for (r = row; r < row + height; r++) {
+ for (c = col; c < col + width; c++)
+ MOGX_framebuffer[r * SCREEN_W + c] = drv_generic_graphic_black(r, c);
+ }
+ drv_MOGX_update_lcd();
+}
+
+void drv_MOGX_clear(void)
+{
+ //info("In %s\n", __FUNCTION__);
+ memset(MOGX_framebuffer, 0x00, SCREEN_SIZE);
+ /* clear the screen */
+ drv_MOGX_update_lcd();
+}
+
+/* TODO : I am not sure for contrast function (command)
+ Don't try to adjust contrast until contrast function is checked and fixed
+*/
+/*
+static int drv_MOGX_contrast(int contrast)
+{
+ unsigned char cmd[11] = {0x18,0x4c,0x43,0x53,0x43,0x00,0x00,0x00,0x01,0x00,0xc0};
+
+ // adjust limits according to the display
+ if (contrast < 0)
+ contrast = 0;
+ if (contrast > 255)
+ contrast = 255;
+
+ // send contrast command
+ cmd[9] = contrast;
+ drv_MOGX_send(cmd, 11);
+
+ return contrast;
+}
+*/
+
+/* backlight function used in plugin */
+static int drv_MOGX_backlight(int backlight)
+{
+ unsigned char cmd[13] = { 0x18, 0x4c, 0x43, 0x53, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xc0 };
+
+ if (backlight < 0)
+ backlight = 0;
+ if (backlight >= 255)
+ backlight = 255;
+
+ cmd[10] = backlight;
+ drv_MOGX_send(cmd, 13);
+
+ return backlight;
+}
+
+/* backlightRGB function used in plugin */
+static int drv_MOGX_backlightRGB(int backlight_R, int backlight_G, int backlight_B)
+{
+ /*
+ TODO : Function should be tested for three color LCD
+ */
+ //unsigned char cmd1[11] = {0x18,0x4c,0x43,0x53,0x42,0x00,0x00,0x00,0x01,0xff,0xc0};
+ unsigned char cmd2[13] = { 0x18, 0x4c, 0x43, 0x53, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xc0 };
+
+ if (backlight_R < 0)
+ backlight_R = 0;
+ if (backlight_R >= 255)
+ backlight_R = 255;
+
+ if (backlight_G < 0)
+ backlight_G = 0;
+ if (backlight_G >= 255)
+ backlight_G = 255;
+
+ if (backlight_B < 0)
+ backlight_B = 0;
+ if (backlight_B >= 255)
+ backlight_B = 255;
+
+ //cmd1[9] = backlight;
+ cmd2[9] = backlight_R;
+ cmd2[10] = backlight_G;
+ cmd2[11] = backlight_B;
+ //drv_MOGX_send(cmd1, 11);
+ drv_MOGX_send(cmd2, 13);
+
+ return backlight_R + backlight_G + backlight_B;
+}
+
+/* start graphic display */
+static int drv_MOGX_start(const char *section, const __attribute__ ((unused))
+ int quiet)
+{
+ char *s;
+ int value1, value2, value3;
+
+ /* read display size from config */
+ s = cfg_get(section, "Size", NULL);
+ if (s == NULL || *s == '\0') {
+ error("%s: no '%s.Size' entry from %s", Name, section, cfg_source());
+ return -1;
+ }
+
+ DROWS = -1;
+ DCOLS = -1;
+ if (sscanf(s, "%dx%d", &DCOLS, &DROWS) != 2 || DCOLS < 1 || DROWS < 1) {
+ error("%s: bad %s.Size '%s' from %s", Name, section, s, cfg_source());
+ return -1;
+ }
+
+ s = cfg_get(section, "Font", "6x8");
+ if (s == NULL || *s == '\0') {
+ error("%s: no '%s.Font' entry from %s", Name, section, cfg_source());
+ return -1;
+ }
+
+ XRES = -1;
+ YRES = -1;
+ if (sscanf(s, "%dx%d", &XRES, &YRES) != 2 || XRES < 1 || YRES < 1) {
+ error("%s: bad %s.Font '%s' from %s", Name, section, s, cfg_source());
+ return -1;
+ }
+
+ /* Fixme: provider other fonts someday... */
+ if (XRES != 6 && YRES != 8) {
+ error("%s: bad Font '%s' from %s (only 6x8 at the moment)", Name, s, cfg_source());
+ return -1;
+ }
+
+ if (cfg_number(section, "Invert", 0, 0, 1, &value1) > 0)
+ if (value1 > 0) {
+ info("%s: Display is inverted", Name);
+ invert = 0x01;
+ }
+
+ /* open communication with the display */
+ if (drv_MOGX_open() < 0) {
+ return -1;
+ }
+
+ /* Init framebuffer buffer */
+ MOGX_framebuffer = (unsigned char *) malloc(SCREEN_SIZE * sizeof(unsigned char));
+ if (!MOGX_framebuffer) {
+ error("%s: framebuffer could not be allocated: malloc() failed", Name);
+ return -1;
+ }
+
+ memset(MOGX_framebuffer, 0x00, SCREEN_SIZE);
+ //info("%s framebuffer zeroed", __FUNCTION__);
+
+/* TODO : I am not sure for contrast function (command)
+ Don't try to adjust contrast until contrast function is checked and fixed
+*/
+/*
+ if (cfg_number(section, "Contrast", 0, 0, 255, &value1) > 0) {
+ info("%s: Setting contrast to %d", Name, value1);
+ drv_MOGX_contrast(value1);
+ }
+*/
+ /* if lcd has three color backlight call the backlightRGB function */
+ if (backlight_RGB) {
+ if ((cfg_number(section, "Backlight_R", 0, 0, 255, &value1) > 0) &&
+ (cfg_number(section, "Backlight_G", 0, 0, 255, &value2) > 0) &&
+ (cfg_number(section, "Backlight_B", 0, 0, 255, &value3) > 0)) {
+ info("%s: Setting backlight to %d,%d,%d (RGB)", Name, value1, value2, value3);
+ drv_MOGX_backlightRGB(value1, value2, value3);
+ }
+ } else {
+ if ((cfg_number(section, "Backlight", 0, 0, 255, &value1) > 0)) {
+ info("%s: Setting backlight to %d", Name, value1);
+ drv_MOGX_backlight(value1);
+ }
+ }
+
+ //info("In %s\n", __FUNCTION__);
+
+ return 0;
+}
+
+
+/****************************************/
+/*** plugins ***/
+/****************************************/
+/* TODO : I am not sure for contrast function (command)
+ Don't try to adjust contrast until contrast function is checked and fixed
+*/
+/*
+static void plugin_contrast(RESULT * result, RESULT * arg1)
+{
+ double contrast;
+
+ contrast = drv_MOGX_contrast(R2N(arg1));
+ SetResult(&result, R_NUMBER, &contrast);
+}
+*/
+/*
+static void plugin_backlight(RESULT * result, RESULT * arg1)
+{
+ double backlight;
+
+ backlight = drv_MOGX_backlight(R2N(arg1));
+ SetResult(&result, R_NUMBER, &backlight);
+}
+
+static void plugin_backlightRGB(RESULT * result, RESULT * arg1, RESULT * arg2, RESULT * arg3)
+{
+ double backlight;
+
+ backlight = drv_MOGX_backlightRGB(R2N(arg1), R2N(arg2), R2N(arg3));
+ SetResult(&result, R_NUMBER, &backlight);
+}
+*/
+/****************************************/
+/*** widget callbacks ***/
+/****************************************/
+
+
+/* using drv_generic_text_draw(W) */
+/* using drv_generic_text_icon_draw(W) */
+/* using drv_generic_text_bar_draw(W) */
+/* using drv_generic_gpio_draw(W) */
+
+
+/****************************************/
+/*** exported functions ***/
+/****************************************/
+
+
+/* list models */
+int drv_MOGX_list(void)
+{
+ printf("Matrix Orbital GX Series driver");
+ return 0;
+}
+
+/* initialize driver & display */
+int drv_MOGX_init(const char *section, const int quiet)
+{
+ int ret;
+
+ //info("%s: %s", Name, "$Rev: 2$");
+ //info("Matrix Orbital GX Series LCD initialization\n");
+
+ /* real worker functions */
+// drv_generic_graphic_real_blit = drv_MOGX_blit;
+
+ /* start display */
+ if ((ret = drv_MOGX_start(section, quiet)) != 0)
+ return ret;
+
+ /* initialize generic graphic driver */
+/* if ((ret = drv_generic_graphic_init(section, Name)) != 0)
+ return ret;
+*/
+/* if (!quiet) {
+ char buffer[40];
+ qprintf(buffer, sizeof(buffer), "%s %dx%d", Name, DCOLS, DROWS);
+ if (drv_generic_graphic_greet(buffer, "http://www.matrixorbital.com")) {
+ sleep(3);
+ drv_generic_graphic_clear();
+ }
+ }
+*/
+ /* register plugins */
+ /* TODO : I am not sure for contrast function (command)
+ Don't try to adjust contrast until contrast function is checked and fixed
+ */
+ //AddFunction("LCD::contrast", 1, plugin_contrast);
+/* if (backlight_RGB)
+ AddFunction("LCD::backlightRGB", 3, plugin_backlightRGB);
+ else
+ AddFunction("LCD::backlight", 1, plugin_backlight);
+*/
+ //info("In %s\n", __FUNCTION__);
+
+ memset(MOGX_framebuffer, 0x00, SCREEN_SIZE);
+ //DEBUG("zeroed");
+
+ return 0;
+}
+
+
+
+/* close driver & display */
+int drv_MOGX_quit(const __attribute__ ((unused))
+ int quiet)
+{
+ info("%s: shutting down.", Name);
+
+ /* clear display */
+ drv_MOGX_clear();
+
+ drv_generic_graphic_quit();
+
+ //debug("closing connection");
+ drv_MOGX_close();
+
+ if (MOGX_framebuffer) {
+ free(MOGX_framebuffer);
+ }
+
+ return (0);
+}
+
+/* use this one for a graphic display */
+/*DRIVER drv_MatrixOrbitalGX = {
+ .name = Name,
+ .list = drv_MOGX_list,
+ .init = drv_MOGX_init,
+ .quit = drv_MOGX_quit,
+};
+*/
diff --git a/src/display/graphic_lcd/font_12x16.c b/src/display/graphic_lcd/font_12x16.c
new file mode 100644
index 0000000..d0000ba
--- /dev/null
+++ b/src/display/graphic_lcd/font_12x16.c
@@ -0,0 +1,2280 @@
+//
+// Font data for Lucida Console 16pt
+//
+
+// Character bitmaps for Lucida Console 16pt
+const uint_8 lucidaConsole_16ptBitmaps[] =
+{
+ // @0 '!' (2 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0x00, //
+ 0x00, //
+ 0xC0, // ##
+ 0xC0, // ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @21 '"' (7 pixels wide)
+ 0x00, //
+ 0xC6, // ## ##
+ 0xC6, // ## ##
+ 0xC6, // ## ##
+ 0xC6, // ## ##
+ 0xC6, // ## ##
+ 0xC6, // ## ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @42 '#' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0C, 0xC0, // ## ##
+ 0x0C, 0xC0, // ## ##
+ 0x19, 0x80, // ## ##
+ 0x19, 0x80, // ## ##
+ 0xFF, 0xE0, // ###########
+ 0xFF, 0xE0, // ###########
+ 0x33, 0x00, // ## ##
+ 0x33, 0x00, // ## ##
+ 0xFF, 0xC0, // ##########
+ 0xFF, 0xC0, // ##########
+ 0x66, 0x00, // ## ##
+ 0x66, 0x00, // ## ##
+ 0x66, 0x00, // ## ##
+ 0xCC, 0x00, // ## ##
+ 0xCC, 0x00, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @84 '$' (9 pixels wide)
+ 0x00, 0x00, //
+ 0x08, 0x00, // #
+ 0x3F, 0x00, // ######
+ 0x7F, 0x80, // ########
+ 0xE8, 0x80, // ### # #
+ 0xC8, 0x00, // ## #
+ 0xC8, 0x00, // ## #
+ 0x68, 0x00, // ## #
+ 0x38, 0x00, // ###
+ 0x1C, 0x00, // ###
+ 0x0F, 0x00, // ####
+ 0x0B, 0x80, // # ###
+ 0x09, 0x80, // # ##
+ 0x09, 0x80, // # ##
+ 0x8B, 0x80, // # # ###
+ 0xFF, 0x00, // ########
+ 0x7E, 0x00, // ######
+ 0x08, 0x00, // #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @126 '%' (13 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x38, 0x18, // ### ##
+ 0x6C, 0x30, // ## ## ##
+ 0xC6, 0x60, // ## ## ##
+ 0xC6, 0xC0, // ## ## ##
+ 0xC6, 0xC0, // ## ## ##
+ 0x6D, 0x80, // ## ## ##
+ 0x3B, 0x00, // ### ##
+ 0x07, 0x00, // ###
+ 0x06, 0xE0, // ## ###
+ 0x0D, 0xB0, // ## ## ##
+ 0x1B, 0x18, // ## ## ##
+ 0x1B, 0x18, // ## ## ##
+ 0x33, 0x18, // ## ## ##
+ 0x61, 0xB0, // ## ## ##
+ 0xC0, 0xE0, // ## ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @168 '&' (13 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0x80, // ####
+ 0x1F, 0xC0, // #######
+ 0x18, 0xC0, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x19, 0x80, // ## ##
+ 0x0F, 0x00, // ####
+ 0x1E, 0x00, // ####
+ 0x76, 0x18, // ### ## ##
+ 0x66, 0x18, // ## ## ##
+ 0xC3, 0x18, // ## ## ##
+ 0xC3, 0x90, // ## ### #
+ 0xC1, 0xF0, // ## #####
+ 0xF0, 0xE0, // #### ###
+ 0x7F, 0xF0, // ###########
+ 0x1F, 0x30, // ##### ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @210 ''' (2 pixels wide)
+ 0x00, //
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @231 '(' (8 pixels wide)
+ 0x00, //
+ 0x03, // ##
+ 0x0F, // ####
+ 0x1C, // ###
+ 0x30, // ##
+ 0x70, // ###
+ 0x60, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0x60, // ##
+ 0x70, // ###
+ 0x38, // ###
+ 0x1C, // ###
+ 0x0F, // ####
+ 0x03, // ##
+ 0x00, //
+
+ // @252 ')' (8 pixels wide)
+ 0x00, //
+ 0xC0, // ##
+ 0xF0, // ####
+ 0x38, // ###
+ 0x0C, // ##
+ 0x06, // ##
+ 0x06, // ##
+ 0x03, // ##
+ 0x03, // ##
+ 0x03, // ##
+ 0x03, // ##
+ 0x03, // ##
+ 0x03, // ##
+ 0x03, // ##
+ 0x06, // ##
+ 0x06, // ##
+ 0x0C, // ##
+ 0x38, // ###
+ 0xF0, // ####
+ 0xC0, // ##
+ 0x00, //
+
+ // @273 '*' (9 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0xE3, 0x80, // ### ###
+ 0x63, 0x00, // ## ##
+ 0x14, 0x00, // # #
+ 0x36, 0x00, // ## ##
+ 0x63, 0x00, // ## ##
+ 0x22, 0x00, // # #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @315 '+' (12 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0xFF, 0xF0, // ############
+ 0xFF, 0xF0, // ############
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @357 ',' (3 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xE0, // ###
+ 0xE0, // ###
+ 0xE0, // ###
+ 0x60, // ##
+ 0x40, // #
+ 0xC0, // ##
+ 0x00, //
+
+ // @378 '-' (9 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFF, 0x80, // #########
+ 0xFF, 0x80, // #########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @420 '.' (3 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xE0, // ###
+ 0xE0, // ###
+ 0xE0, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @441 '/' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x60, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0E, 0x00, // ###
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x60, 0x00, // ##
+ 0x60, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0x00, 0x00, //
+
+ // @483 '0' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1E, 0x00, // ####
+ 0x3F, 0x00, // ######
+ 0x61, 0x80, // ## ##
+ 0x61, 0x80, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0x61, 0x80, // ## ##
+ 0x61, 0x80, // ## ##
+ 0x3F, 0x00, // ######
+ 0x1E, 0x00, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @525 '1' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0C, 0x00, // ##
+ 0x7C, 0x00, // #####
+ 0xEC, 0x00, // ### ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0xFF, 0xC0, // ##########
+ 0xFF, 0xC0, // ##########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @567 '2' (9 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7E, 0x00, // ######
+ 0xFF, 0x00, // ########
+ 0x83, 0x80, // # ###
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x60, 0x00, // ##
+ 0xE0, 0x00, // ###
+ 0xFF, 0x80, // #########
+ 0xFF, 0x80, // #########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @609 '3' (8 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x7C, // #####
+ 0xFE, // #######
+ 0x87, // # ###
+ 0x03, // ##
+ 0x03, // ##
+ 0x06, // ##
+ 0x7C, // #####
+ 0x7E, // ######
+ 0x06, // ##
+ 0x03, // ##
+ 0x03, // ##
+ 0x03, // ##
+ 0x87, // # ###
+ 0xFE, // #######
+ 0xFC, // ######
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @630 '4' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x03, 0x00, // ##
+ 0x07, 0x00, // ###
+ 0x0F, 0x00, // ####
+ 0x0B, 0x00, // # ##
+ 0x1B, 0x00, // ## ##
+ 0x33, 0x00, // ## ##
+ 0x23, 0x00, // # ##
+ 0x63, 0x00, // ## ##
+ 0x43, 0x00, // # ##
+ 0xFF, 0xC0, // ##########
+ 0xFF, 0xC0, // ##########
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @672 '5' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xFE, // #######
+ 0xFE, // #######
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xF8, // #####
+ 0xFC, // ######
+ 0x0E, // ###
+ 0x06, // ##
+ 0x06, // ##
+ 0x06, // ##
+ 0x0E, // ###
+ 0xFC, // ######
+ 0xF8, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @693 '6' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0F, 0x00, // ####
+ 0x3F, 0x80, // #######
+ 0x70, 0x80, // ### #
+ 0x60, 0x00, // ##
+ 0xE0, 0x00, // ###
+ 0xC0, 0x00, // ##
+ 0xCF, 0x00, // ## ####
+ 0xDF, 0x80, // ## ######
+ 0xE1, 0xC0, // ### ###
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x61, 0x80, // ## ##
+ 0x3F, 0x80, // #######
+ 0x1E, 0x00, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @735 '7' (9 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFF, 0x80, // #########
+ 0xFF, 0x80, // #########
+ 0x01, 0x80, // ##
+ 0x03, 0x00, // ##
+ 0x02, 0x00, // #
+ 0x06, 0x00, // ##
+ 0x04, 0x00, // #
+ 0x0C, 0x00, // ##
+ 0x08, 0x00, // #
+ 0x18, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x60, 0x00, // ##
+ 0x60, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @777 '8' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x00, // #####
+ 0x3F, 0x80, // #######
+ 0x63, 0x80, // ## ###
+ 0x61, 0x80, // ## ##
+ 0x61, 0x80, // ## ##
+ 0x3B, 0x00, // ### ##
+ 0x1E, 0x00, // ####
+ 0x3F, 0x00, // ######
+ 0x63, 0x80, // ## ###
+ 0xC1, 0xC0, // ## ###
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xE1, 0xC0, // ### ###
+ 0x7F, 0x80, // ########
+ 0x3E, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @819 '9' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1E, 0x00, // ####
+ 0x7F, 0x00, // #######
+ 0x61, 0x80, // ## ##
+ 0xC0, 0x80, // ## #
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xE1, 0xC0, // ### ###
+ 0x7E, 0xC0, // ###### ##
+ 0x3C, 0xC0, // #### ##
+ 0x00, 0xC0, // ##
+ 0x01, 0xC0, // ###
+ 0x01, 0x80, // ##
+ 0x43, 0x80, // # ###
+ 0x7F, 0x00, // #######
+ 0x3C, 0x00, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @861 ':' (3 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xE0, // ###
+ 0xE0, // ###
+ 0xE0, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xE0, // ###
+ 0xE0, // ###
+ 0xE0, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @882 ';' (3 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xE0, // ###
+ 0xE0, // ###
+ 0xE0, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xE0, // ###
+ 0xE0, // ###
+ 0xE0, // ###
+ 0x60, // ##
+ 0x40, // #
+ 0xC0, // ##
+ 0x00, //
+
+ // @903 '<' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x20, // #
+ 0x00, 0xE0, // ###
+ 0x03, 0xC0, // ####
+ 0x0F, 0x00, // ####
+ 0x3C, 0x00, // ####
+ 0xE0, 0x00, // ###
+ 0x3C, 0x00, // ####
+ 0x0F, 0x00, // ####
+ 0x03, 0xC0, // ####
+ 0x00, 0xE0, // ###
+ 0x00, 0x20, // #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @945 '=' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFF, 0xE0, // ###########
+ 0xFF, 0xE0, // ###########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFF, 0xE0, // ###########
+ 0xFF, 0xE0, // ###########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @987 '>' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x80, 0x00, // #
+ 0xE0, 0x00, // ###
+ 0x78, 0x00, // ####
+ 0x1E, 0x00, // ####
+ 0x07, 0x80, // ####
+ 0x00, 0xE0, // ###
+ 0x07, 0x80, // ####
+ 0x1E, 0x00, // ####
+ 0x78, 0x00, // ####
+ 0xE0, 0x00, // ###
+ 0x80, 0x00, // #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1029 '?' (9 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7E, 0x00, // ######
+ 0xFF, 0x00, // ########
+ 0xC3, 0x80, // ## ###
+ 0xC1, 0x80, // ## ##
+ 0x01, 0x80, // ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x08, 0x00, // #
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1071 '@' (12 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0F, 0x80, // #####
+ 0x18, 0xC0, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x63, 0xE0, // ## #####
+ 0x66, 0x60, // ## ## ##
+ 0xC4, 0x60, // ## # ##
+ 0xCC, 0x60, // ## ## ##
+ 0xCC, 0xE0, // ## ## ###
+ 0xCC, 0xE0, // ## ## ###
+ 0xCD, 0xE0, // ## ## ####
+ 0xCF, 0x60, // ## #### ##
+ 0x66, 0x70, // ## ## ###
+ 0x60, 0x00, // ##
+ 0x38, 0x40, // ### #
+ 0x0F, 0x80, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1113 'A' (13 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x0F, 0x80, // #####
+ 0x0D, 0x80, // ## ##
+ 0x09, 0x80, // # ##
+ 0x18, 0xC0, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x3F, 0xE0, // #########
+ 0x7F, 0xF0, // ###########
+ 0x60, 0x30, // ## ##
+ 0x60, 0x30, // ## ##
+ 0xC0, 0x18, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1155 'B' (9 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFE, 0x00, // #######
+ 0xFF, 0x00, // ########
+ 0xC3, 0x00, // ## ##
+ 0xC3, 0x00, // ## ##
+ 0xC6, 0x00, // ## ##
+ 0xFC, 0x00, // ######
+ 0xFE, 0x00, // #######
+ 0xC3, 0x00, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xFF, 0x00, // ########
+ 0xFE, 0x00, // #######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1197 'C' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0F, 0xC0, // ######
+ 0x3F, 0xE0, // #########
+ 0x78, 0x20, // #### #
+ 0x60, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0x60, 0x00, // ##
+ 0x78, 0x20, // #### #
+ 0x3F, 0xE0, // #########
+ 0x0F, 0xC0, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1239 'D' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFE, 0x00, // #######
+ 0xFF, 0x00, // ########
+ 0xC3, 0x80, // ## ###
+ 0xC1, 0xC0, // ## ###
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC3, 0x80, // ## ###
+ 0xFF, 0x00, // ########
+ 0xFE, 0x00, // #######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1281 'E' (9 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFF, 0x80, // #########
+ 0xFF, 0x80, // #########
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xFE, 0x00, // #######
+ 0xFE, 0x00, // #######
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xFF, 0x80, // #########
+ 0xFF, 0x80, // #########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1323 'F' (9 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFF, 0x80, // #########
+ 0xFF, 0x80, // #########
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xFF, 0x00, // ########
+ 0xFF, 0x00, // ########
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1365 'G' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0F, 0xC0, // ######
+ 0x3F, 0xE0, // #########
+ 0x78, 0x20, // #### #
+ 0x60, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC1, 0xE0, // ## ####
+ 0xC1, 0xE0, // ## ####
+ 0xE0, 0x60, // ### ##
+ 0x60, 0x60, // ## ##
+ 0x78, 0x60, // #### ##
+ 0x3F, 0xE0, // #########
+ 0x0F, 0xC0, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1407 'H' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xFF, 0xC0, // ##########
+ 0xFF, 0xC0, // ##########
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1449 'I' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFF, 0xC0, // ##########
+ 0xFF, 0xC0, // ##########
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0xFF, 0xC0, // ##########
+ 0xFF, 0xC0, // ##########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1491 'J' (8 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x7F, // #######
+ 0x7F, // #######
+ 0x03, // ##
+ 0x03, // ##
+ 0x03, // ##
+ 0x03, // ##
+ 0x03, // ##
+ 0x03, // ##
+ 0x03, // ##
+ 0x03, // ##
+ 0x07, // ###
+ 0xFE, // #######
+ 0xFC, // ######
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @1512 'K' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xC0, 0xE0, // ## ###
+ 0xC1, 0xC0, // ## ###
+ 0xC3, 0x80, // ## ###
+ 0xC7, 0x00, // ## ###
+ 0xCC, 0x00, // ## ##
+ 0xD8, 0x00, // ## ##
+ 0xF8, 0x00, // #####
+ 0xDC, 0x00, // ## ###
+ 0xCE, 0x00, // ## ###
+ 0xC7, 0x00, // ## ###
+ 0xC3, 0x80, // ## ###
+ 0xC1, 0xC0, // ## ###
+ 0xC0, 0x60, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1554 'L' (9 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xFF, 0x80, // #########
+ 0xFF, 0x80, // #########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1596 'M' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xE0, 0xE0, // ### ###
+ 0xE0, 0xE0, // ### ###
+ 0xF1, 0xE0, // #### ####
+ 0xD1, 0x60, // ## # # ##
+ 0xD1, 0x60, // ## # # ##
+ 0xDB, 0x60, // ## ## ## ##
+ 0xCA, 0x60, // ## # # ##
+ 0xCA, 0x60, // ## # # ##
+ 0xCE, 0x60, // ## ### ##
+ 0xC4, 0x60, // ## # ##
+ 0xC0, 0x60, // ## ##
+ 0xC0, 0x60, // ## ##
+ 0xC0, 0x60, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1638 'N' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xE0, 0xC0, // ### ##
+ 0xE0, 0xC0, // ### ##
+ 0xF0, 0xC0, // #### ##
+ 0xF0, 0xC0, // #### ##
+ 0xD8, 0xC0, // ## ## ##
+ 0xDC, 0xC0, // ## ### ##
+ 0xCC, 0xC0, // ## ## ##
+ 0xCE, 0xC0, // ## ### ##
+ 0xC6, 0xC0, // ## ## ##
+ 0xC3, 0xC0, // ## ####
+ 0xC3, 0xC0, // ## ####
+ 0xC1, 0xC0, // ## ###
+ 0xC1, 0xC0, // ## ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1680 'O' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x00, // #####
+ 0x3F, 0x80, // #######
+ 0x71, 0xC0, // ### ###
+ 0xE0, 0xE0, // ### ###
+ 0xC0, 0x60, // ## ##
+ 0xC0, 0x60, // ## ##
+ 0xC0, 0x60, // ## ##
+ 0xC0, 0x60, // ## ##
+ 0xC0, 0x60, // ## ##
+ 0xE0, 0xE0, // ### ###
+ 0x71, 0xC0, // ### ###
+ 0x3F, 0x80, // #######
+ 0x1F, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1722 'P' (9 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFE, 0x00, // #######
+ 0xFF, 0x00, // ########
+ 0xC3, 0x80, // ## ###
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC3, 0x80, // ## ###
+ 0xFF, 0x00, // ########
+ 0xFC, 0x00, // ######
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1764 'Q' (12 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x00, // #####
+ 0x3F, 0x80, // #######
+ 0x71, 0xC0, // ### ###
+ 0xE0, 0xE0, // ### ###
+ 0xC0, 0x60, // ## ##
+ 0xC0, 0x60, // ## ##
+ 0xC0, 0x60, // ## ##
+ 0xC0, 0x60, // ## ##
+ 0xC0, 0x60, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x71, 0xC0, // ### ###
+ 0x3F, 0x80, // #######
+ 0x1F, 0x00, // #####
+ 0x01, 0xC0, // ###
+ 0x00, 0xF0, // ####
+ 0x00, 0x20, // #
+ 0x00, 0x00, //
+
+ // @1806 'R' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFE, 0x00, // #######
+ 0xFF, 0x00, // ########
+ 0xC3, 0x80, // ## ###
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC3, 0x80, // ## ###
+ 0xFF, 0x00, // ########
+ 0xFE, 0x00, // #######
+ 0xC7, 0x00, // ## ###
+ 0xC3, 0x80, // ## ###
+ 0xC1, 0xC0, // ## ###
+ 0xC0, 0xE0, // ## ###
+ 0xC0, 0x60, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1848 'S' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0x00, // ######
+ 0x7F, 0x80, // ########
+ 0xC0, 0x80, // ## #
+ 0xC0, 0x00, // ##
+ 0xE0, 0x00, // ###
+ 0x78, 0x00, // ####
+ 0x1F, 0x00, // #####
+ 0x07, 0x80, // ####
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0xC1, 0xC0, // ## ###
+ 0xFF, 0x80, // #########
+ 0x7F, 0x00, // #######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1890 'T' (12 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFF, 0xF0, // ############
+ 0xFF, 0xF0, // ############
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1932 'U' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xE1, 0xC0, // ### ###
+ 0x7F, 0x80, // ########
+ 0x3F, 0x00, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1974 'V' (13 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xC0, 0x18, // ## ##
+ 0x60, 0x30, // ## ##
+ 0x60, 0x30, // ## ##
+ 0x60, 0x60, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x30, 0xC0, // ## ##
+ 0x38, 0xC0, // ### ##
+ 0x19, 0xC0, // ## ###
+ 0x19, 0x80, // ## ##
+ 0x0D, 0x80, // ## ##
+ 0x0F, 0x00, // ####
+ 0x0F, 0x00, // ####
+ 0x06, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2016 'W' (13 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xC0, 0x18, // ## ##
+ 0xC0, 0x18, // ## ##
+ 0xC0, 0x18, // ## ##
+ 0x47, 0x10, // # ### #
+ 0x67, 0x10, // ## ### #
+ 0x67, 0x30, // ## ### ##
+ 0x65, 0x30, // ## # # ##
+ 0x6D, 0xB0, // ## ## ## ##
+ 0x6D, 0xB0, // ## ## ## ##
+ 0x28, 0xA0, // # # # #
+ 0x28, 0xE0, // # # ###
+ 0x38, 0xE0, // ### ###
+ 0x38, 0xE0, // ### ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2058 'X' (13 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xE0, 0x38, // ### ###
+ 0x70, 0x70, // ### ###
+ 0x38, 0x60, // ### ##
+ 0x18, 0xC0, // ## ##
+ 0x0D, 0x80, // ## ##
+ 0x0F, 0x00, // ####
+ 0x07, 0x00, // ###
+ 0x0F, 0x80, // #####
+ 0x0D, 0x80, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x30, 0xE0, // ## ###
+ 0x60, 0x70, // ## ###
+ 0xC0, 0x38, // ## ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2100 'Y' (13 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xE0, 0x18, // ### ##
+ 0x60, 0x30, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x38, 0xC0, // ### ##
+ 0x19, 0x80, // ## ##
+ 0x0D, 0x80, // ## ##
+ 0x0F, 0x00, // ####
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2142 'Z' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7F, 0xE0, // ##########
+ 0x7F, 0xE0, // ##########
+ 0x00, 0xE0, // ###
+ 0x01, 0xC0, // ###
+ 0x03, 0x80, // ###
+ 0x07, 0x00, // ###
+ 0x0E, 0x00, // ###
+ 0x1C, 0x00, // ###
+ 0x38, 0x00, // ###
+ 0x70, 0x00, // ###
+ 0xE0, 0x00, // ###
+ 0xFF, 0xE0, // ###########
+ 0xFF, 0xE0, // ###########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2184 '[' (6 pixels wide)
+ 0x00, //
+ 0xFC, // ######
+ 0xFC, // ######
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xFC, // ######
+ 0xFC, // ######
+ 0x00, //
+
+ // @2205 '\' (11 pixels wide)
+ 0x00, 0x00, //
+ 0xC0, 0x00, // ##
+ 0x60, 0x00, // ##
+ 0x60, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0E, 0x00, // ###
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0x60, // ##
+ 0x00, 0x00, //
+
+ // @2247 ']' (6 pixels wide)
+ 0x00, //
+ 0xFC, // ######
+ 0xFC, // ######
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0xFC, // ######
+ 0xFC, // ######
+ 0x00, //
+
+ // @2268 '^' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x04, 0x00, // #
+ 0x04, 0x00, // #
+ 0x0E, 0x00, // ###
+ 0x0E, 0x00, // ###
+ 0x1B, 0x00, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x11, 0x00, // # #
+ 0x31, 0x80, // ## ##
+ 0x20, 0x80, // # #
+ 0x60, 0xC0, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0xC0, 0x60, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2310 '_' (13 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFF, 0xF8, // #############
+ 0xFF, 0xF8, // #############
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2352 '`' (3 pixels wide)
+ 0xC0, // ##
+ 0x60, // ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @2373 'a' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0x00, // ######
+ 0x7F, 0x80, // ########
+ 0x41, 0x80, // # ##
+ 0x01, 0x80, // ##
+ 0x1F, 0x80, // ######
+ 0x7F, 0x80, // ########
+ 0xE1, 0x80, // ### ##
+ 0xC1, 0x80, // ## ##
+ 0xC3, 0x80, // ## ###
+ 0xFF, 0xE0, // ###########
+ 0x3C, 0xE0, // #### ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2415 'b' (10 pixels wide)
+ 0x00, 0x00, //
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xCF, 0x00, // ## ####
+ 0xDF, 0x80, // ## ######
+ 0xF1, 0xC0, // #### ###
+ 0xE0, 0xC0, // ### ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xE1, 0x80, // ### ##
+ 0xFF, 0x80, // #########
+ 0xDE, 0x00, // ## ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2457 'c' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x80, // ######
+ 0x3F, 0xC0, // ########
+ 0x70, 0x40, // ### #
+ 0xE0, 0x00, // ###
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xE0, 0x00, // ###
+ 0x70, 0x40, // ### #
+ 0x3F, 0xC0, // ########
+ 0x1F, 0x80, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2499 'd' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x1E, 0xC0, // #### ##
+ 0x7F, 0xC0, // #########
+ 0x61, 0xC0, // ## ###
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xE1, 0xC0, // ### ###
+ 0x7F, 0xC0, // #########
+ 0x3C, 0xC0, // #### ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2541 'e' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x00, // #####
+ 0x3F, 0x80, // #######
+ 0x61, 0xC0, // ## ###
+ 0xC0, 0xC0, // ## ##
+ 0xFF, 0xC0, // ##########
+ 0xFF, 0xC0, // ##########
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0x70, 0x40, // ### #
+ 0x7F, 0xC0, // #########
+ 0x1F, 0x80, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2583 'f' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x07, 0xC0, // #####
+ 0x0F, 0xC0, // ######
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0xFF, 0xC0, // ##########
+ 0xFF, 0xC0, // ##########
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2625 'g' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1E, 0xC0, // #### ##
+ 0x7F, 0xC0, // #########
+ 0x61, 0xC0, // ## ###
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xE3, 0xC0, // ### ####
+ 0x7E, 0xC0, // ###### ##
+ 0x3C, 0xC0, // #### ##
+ 0x00, 0xC0, // ##
+ 0x41, 0x80, // # ##
+ 0x7F, 0x80, // ########
+ 0x3E, 0x00, // #####
+
+ // @2667 'h' (9 pixels wide)
+ 0x00, 0x00, //
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xCF, 0x00, // ## ####
+ 0xDF, 0x80, // ## ######
+ 0xF1, 0x80, // #### ##
+ 0xE1, 0x80, // ### ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2709 'i' (6 pixels wide)
+ 0x1C, // ###
+ 0x1C, // ###
+ 0x1C, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xFC, // ######
+ 0xFC, // ######
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @2730 'j' (7 pixels wide)
+ 0x0E, // ###
+ 0x0E, // ###
+ 0x0E, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xFE, // #######
+ 0xFE, // #######
+ 0x06, // ##
+ 0x06, // ##
+ 0x06, // ##
+ 0x06, // ##
+ 0x06, // ##
+ 0x06, // ##
+ 0x06, // ##
+ 0x06, // ##
+ 0x06, // ##
+ 0x06, // ##
+ 0x0E, // ###
+ 0xFC, // ######
+ 0xF8, // #####
+
+ // @2751 'k' (10 pixels wide)
+ 0x00, 0x00, //
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC3, 0x80, // ## ###
+ 0xC7, 0x00, // ## ###
+ 0xCE, 0x00, // ## ###
+ 0xDC, 0x00, // ## ###
+ 0xD8, 0x00, // ## ##
+ 0xF8, 0x00, // #####
+ 0xDC, 0x00, // ## ###
+ 0xCE, 0x00, // ## ###
+ 0xC7, 0x00, // ## ###
+ 0xC3, 0x80, // ## ###
+ 0xC1, 0xC0, // ## ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2793 'l' (6 pixels wide)
+ 0x00, //
+ 0xFC, // ######
+ 0xFC, // ######
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x0C, // ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @2814 'm' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xD9, 0xC0, // ## ## ###
+ 0xFF, 0xE0, // ###########
+ 0xEE, 0x60, // ### ### ##
+ 0xCC, 0x60, // ## ## ##
+ 0xCC, 0x60, // ## ## ##
+ 0xCC, 0x60, // ## ## ##
+ 0xCC, 0x60, // ## ## ##
+ 0xCC, 0x60, // ## ## ##
+ 0xCC, 0x60, // ## ## ##
+ 0xCC, 0x60, // ## ## ##
+ 0xCC, 0x60, // ## ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2856 'n' (9 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xCF, 0x00, // ## ####
+ 0xDF, 0x80, // ## ######
+ 0xF1, 0x80, // #### ##
+ 0xE1, 0x80, // ### ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2898 'o' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1E, 0x00, // ####
+ 0x7F, 0x80, // ########
+ 0x61, 0x80, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0x61, 0x80, // ## ##
+ 0x7F, 0x80, // ########
+ 0x1E, 0x00, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2940 'p' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xCF, 0x00, // ## ####
+ 0xFF, 0x80, // #########
+ 0xF1, 0xC0, // #### ###
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xE1, 0x80, // ### ##
+ 0xFF, 0x80, // #########
+ 0xDE, 0x00, // ## ####
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+
+ // @2982 'q' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1E, 0xC0, // #### ##
+ 0x7F, 0xC0, // #########
+ 0x61, 0xC0, // ## ###
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xC0, 0xC0, // ## ##
+ 0xE3, 0xC0, // ### ####
+ 0x7E, 0xC0, // ###### ##
+ 0x3C, 0xC0, // #### ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+
+ // @3024 'r' (8 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xCF, // ## ####
+ 0xDF, // ## #####
+ 0xF3, // #### ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @3045 's' (9 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0x00, // ######
+ 0xFF, 0x00, // ########
+ 0xC0, 0x00, // ##
+ 0xC0, 0x00, // ##
+ 0x78, 0x00, // ####
+ 0x3F, 0x00, // ######
+ 0x07, 0x80, // ####
+ 0x01, 0x80, // ##
+ 0x81, 0x80, // # ##
+ 0xFF, 0x00, // ########
+ 0x7E, 0x00, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3087 't' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0xFF, 0xC0, // ##########
+ 0xFF, 0xC0, // ##########
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x1F, 0xC0, // #######
+ 0x0F, 0xC0, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3129 'u' (9 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC1, 0x80, // ## ##
+ 0xC3, 0x80, // ## ###
+ 0xC7, 0x80, // ## ####
+ 0xFD, 0x80, // ###### ##
+ 0x79, 0x80, // #### ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3171 'v' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xC0, 0x60, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x61, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x33, 0x80, // ## ###
+ 0x33, 0x00, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x1E, 0x00, // ####
+ 0x1E, 0x00, // ####
+ 0x0C, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3213 'w' (13 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xC0, 0x18, // ## ##
+ 0xC7, 0x18, // ## ### ##
+ 0xC7, 0x10, // ## ### #
+ 0x65, 0x10, // ## # # #
+ 0x65, 0x90, // ## # ## #
+ 0x6D, 0xB0, // ## ## ## ##
+ 0x69, 0xB0, // ## # ## ##
+ 0x68, 0xA0, // ## # # #
+ 0x28, 0xE0, // # # ###
+ 0x38, 0xE0, // ### ###
+ 0x30, 0xE0, // ## ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3255 'x' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xE0, 0xE0, // ### ###
+ 0x71, 0xC0, // ### ###
+ 0x31, 0x80, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x1E, 0x00, // ####
+ 0x0E, 0x00, // ###
+ 0x1F, 0x00, // #####
+ 0x1B, 0x00, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x61, 0xC0, // ## ###
+ 0xC0, 0xE0, // ## ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3297 'y' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xC0, 0x60, // ## ##
+ 0x60, 0x40, // ## #
+ 0x60, 0xC0, // ## ##
+ 0x30, 0x80, // ## #
+ 0x31, 0x80, // ## ##
+ 0x39, 0x80, // ### ##
+ 0x1B, 0x00, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x0E, 0x00, // ###
+ 0x0E, 0x00, // ###
+ 0x04, 0x00, // #
+ 0x0C, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x78, 0x00, // ####
+ 0x70, 0x00, // ###
+
+ // @3339 'z' (10 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFF, 0xC0, // ##########
+ 0xFF, 0xC0, // ##########
+ 0x01, 0x80, // ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x60, 0x00, // ##
+ 0xFF, 0xC0, // ##########
+ 0xFF, 0xC0, // ##########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3381 '{' (8 pixels wide)
+ 0x00, //
+ 0x0F, // ####
+ 0x1F, // #####
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0xF0, // ####
+ 0xF0, // ####
+ 0x38, // ###
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x1F, // #####
+ 0x0F, // ####
+ 0x00, //
+
+ // @3402 '|' (2 pixels wide)
+ 0x00, //
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0x00, //
+
+ // @3423 '}' (8 pixels wide)
+ 0x00, //
+ 0xF0, // ####
+ 0xF8, // #####
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x0F, // ####
+ 0x0F, // ####
+ 0x1C, // ###
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0xF8, // #####
+ 0xF0, // ####
+ 0x00, //
+
+ // @3444 '~' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x78, 0x20, // #### #
+ 0x7E, 0x20, // ###### #
+ 0x8F, 0xC0, // # ######
+ 0x83, 0xC0, // # ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+};
+
+// Character descriptors for Lucida Console 16pt
+// { [Char width in bits], [Offset into lucidaConsole_16ptCharBitmaps in bytes] }
+const FONT_CHAR_INFO lucidaConsole_16ptDescriptors[] =
+{
+ {2, 0}, // !
+ {7, 21}, // "
+ {11, 42}, // #
+ {9, 84}, // $
+ {13, 126}, // %
+ {13, 168}, // &
+ {2, 210}, // '
+ {8, 231}, // (
+ {8, 252}, // )
+ {9, 273}, // *
+ {12, 315}, // +
+ {3, 357}, // ,
+ {9, 378}, // -
+ {3, 420}, // .
+ {11, 441}, // /
+ {10, 483}, // 0
+ {10, 525}, // 1
+ {9, 567}, // 2
+ {8, 609}, // 3
+ {10, 630}, // 4
+ {7, 672}, // 5
+ {10, 693}, // 6
+ {9, 735}, // 7
+ {10, 777}, // 8
+ {10, 819}, // 9
+ {3, 861}, // :
+ {3, 882}, // ;
+ {11, 903}, // <
+ {11, 945}, // =
+ {11, 987}, // >
+ {9, 1029}, // ?
+ {12, 1071}, // @
+ {13, 1113}, // A
+ {9, 1155}, // B
+ {11, 1197}, // C
+ {10, 1239}, // D
+ {9, 1281}, // E
+ {9, 1323}, // F
+ {11, 1365}, // G
+ {10, 1407}, // H
+ {10, 1449}, // I
+ {8, 1491}, // J
+ {11, 1512}, // K
+ {9, 1554}, // L
+ {11, 1596}, // M
+ {10, 1638}, // N
+ {11, 1680}, // O
+ {9, 1722}, // P
+ {12, 1764}, // Q
+ {11, 1806}, // R
+ {10, 1848}, // S
+ {12, 1890}, // T
+ {10, 1932}, // U
+ {13, 1974}, // V
+ {13, 2016}, // W
+ {13, 2058}, // X
+ {13, 2100}, // Y
+ {11, 2142}, // Z
+ {6, 2184}, // [
+ {11, 2205}, // \
+ {6, 2247}, // ]
+ {11, 2268}, // ^
+ {13, 2310}, // _
+ {3, 2352}, // `
+ {11, 2373}, // a
+ {10, 2415}, // b
+ {10, 2457}, // c
+ {10, 2499}, // d
+ {10, 2541}, // e
+ {10, 2583}, // f
+ {10, 2625}, // g
+ {9, 2667}, // h
+ {6, 2709}, // i
+ {7, 2730}, // j
+ {10, 2751}, // k
+ {6, 2793}, // l
+ {11, 2814}, // m
+ {9, 2856}, // n
+ {10, 2898}, // o
+ {10, 2940}, // p
+ {10, 2982}, // q
+ {8, 3024}, // r
+ {9, 3045}, // s
+ {10, 3087}, // t
+ {9, 3129}, // u
+ {11, 3171}, // v
+ {13, 3213}, // w
+ {11, 3255}, // x
+ {11, 3297}, // y
+ {10, 3339}, // z
+ {8, 3381}, // {
+ {2, 3402}, // |
+ {8, 3423}, // }
+ {11, 3444}, // ~
+};
+
+// Font information for Lucida Console 16pt
+const FONT_INFO lucidaConsole_16ptFontInfo =
+{
+ 3, // Character height
+ '!', // Start character
+ '~', // End character
+ 2, // Width, in pixels, of space character
+ lucidaConsole_16ptDescriptors, // Character descriptor array
+ lucidaConsole_16ptBitmaps, // Character bitmap array
+};
diff --git a/src/display/graphic_lcd/font_12x16.h b/src/display/graphic_lcd/font_12x16.h
new file mode 100644
index 0000000..050f940
--- /dev/null
+++ b/src/display/graphic_lcd/font_12x16.h
@@ -0,0 +1,5 @@
+// Font data for Lucida Console 16pt
+extern const uint_8 lucidaConsole_16ptBitmaps[];
+extern const FONT_INFO lucidaConsole_16ptFontInfo;
+extern const FONT_CHAR_INFO lucidaConsole_16ptDescriptors[];
+
diff --git a/src/display/graphic_lcd/font_6x8.c b/src/display/graphic_lcd/font_6x8.c
new file mode 100644
index 0000000..595b205
--- /dev/null
+++ b/src/display/graphic_lcd/font_6x8.c
@@ -0,0 +1,1341 @@
+//
+// Font data for Lucida Console 8pt
+//
+
+// Character bitmaps for Lucida Console 8pt
+const uint_8 lucidaConsole_8ptBitmaps[] =
+{
+ // @0 '!' (1 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x00, //
+ 0x80, // #
+ 0x00, //
+ 0x00, //
+
+ // @11 '"' (4 pixels wide)
+ 0x00, //
+ 0x90, // # #
+ 0x90, // # #
+ 0x90, // # #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @22 '#' (6 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x14, // # #
+ 0x14, // # #
+ 0x7C, // #####
+ 0x28, // # #
+ 0xFC, // ######
+ 0x50, // # #
+ 0x50, // # #
+ 0x00, //
+ 0x00, //
+
+ // @33 '$' (5 pixels wide)
+ 0x00, //
+ 0x20, // #
+ 0x78, // ####
+ 0xA0, // # #
+ 0xE0, // ###
+ 0x30, // ##
+ 0x28, // # #
+ 0x28, // # #
+ 0xF0, // ####
+ 0x20, // #
+ 0x00, //
+
+ // @44 '%' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x42, // # #
+ 0xA4, // # # #
+ 0xA8, // # # #
+ 0x54, // # # #
+ 0x2A, // # # #
+ 0x4A, // # # #
+ 0x84, // # #
+ 0x00, //
+ 0x00, //
+
+ // @55 '&' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x20, // #
+ 0x50, // # #
+ 0x50, // # #
+ 0x62, // ## #
+ 0x92, // # # #
+ 0x8C, // # ##
+ 0x7C, // #####
+ 0x00, //
+ 0x00, //
+
+ // @66 ''' (1 pixels wide)
+ 0x00, //
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @77 '(' (4 pixels wide)
+ 0x00, //
+ 0x30, // ##
+ 0x40, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x40, // #
+ 0x30, // ##
+
+ // @88 ')' (4 pixels wide)
+ 0x00, //
+ 0xC0, // ##
+ 0x20, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x20, // #
+ 0xC0, // ##
+
+ // @99 '*' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x20, // #
+ 0xD8, // ## ##
+ 0x60, // ##
+ 0x50, // # #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @110 '+' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x20, // #
+ 0x20, // #
+ 0xF8, // #####
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @121 ',' (2 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xC0, // ##
+ 0xC0, // ##
+ 0x40, // #
+ 0x80, // #
+
+ // @132 '-' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xF8, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @143 '.' (2 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xC0, // ##
+ 0xC0, // ##
+ 0x00, //
+ 0x00, //
+
+ // @154 '/' (7 pixels wide)
+ 0x00, //
+ 0x02, // #
+ 0x04, // #
+ 0x0C, // ##
+ 0x08, // #
+ 0x10, // #
+ 0x10, // #
+ 0x20, // #
+ 0x60, // ##
+ 0x40, // #
+ 0x80, // #
+
+ // @165 '0' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x70, // ###
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @176 '1' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x60, // ##
+ 0xA0, // # #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0xF8, // #####
+ 0x00, //
+ 0x00, //
+
+ // @187 '2' (4 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xE0, // ###
+ 0x10, // #
+ 0x10, // #
+ 0x20, // #
+ 0x40, // #
+ 0x80, // #
+ 0xF0, // ####
+ 0x00, //
+ 0x00, //
+
+ // @198 '3' (4 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xF0, // ####
+ 0x10, // #
+ 0x10, // #
+ 0x60, // ##
+ 0x10, // #
+ 0x10, // #
+ 0xE0, // ###
+ 0x00, //
+ 0x00, //
+
+ // @209 '4' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x10, // #
+ 0x30, // ##
+ 0x50, // # #
+ 0x90, // # #
+ 0xF8, // #####
+ 0x10, // #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+
+ // @220 '5' (4 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xF0, // ####
+ 0x80, // #
+ 0x80, // #
+ 0xE0, // ###
+ 0x10, // #
+ 0x10, // #
+ 0xE0, // ###
+ 0x00, //
+ 0x00, //
+
+ // @231 '6' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x38, // ###
+ 0x40, // #
+ 0x80, // #
+ 0xB0, // # ##
+ 0xC8, // ## #
+ 0x88, // # #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @242 '7' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xF8, // #####
+ 0x10, // #
+ 0x10, // #
+ 0x20, // #
+ 0x40, // #
+ 0x40, // #
+ 0x80, // #
+ 0x00, //
+ 0x00, //
+
+ // @253 '8' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x70, // ###
+ 0x88, // # #
+ 0x90, // # #
+ 0x70, // ###
+ 0x88, // # #
+ 0x88, // # #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @264 '9' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x70, // ###
+ 0x88, // # #
+ 0x88, // # #
+ 0x78, // ####
+ 0x08, // #
+ 0x10, // #
+ 0xE0, // ###
+ 0x00, //
+ 0x00, //
+
+ // @275 ':' (2 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xC0, // ##
+ 0xC0, // ##
+ 0x00, //
+ 0x00, //
+ 0xC0, // ##
+ 0xC0, // ##
+ 0x00, //
+ 0x00, //
+
+ // @286 ';' (2 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xC0, // ##
+ 0xC0, // ##
+ 0x00, //
+ 0x00, //
+ 0xC0, // ##
+ 0xC0, // ##
+ 0x40, // #
+ 0x80, // #
+
+ // @297 '<' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x08, // #
+ 0x30, // ##
+ 0xC0, // ##
+ 0xC0, // ##
+ 0x30, // ##
+ 0x08, // #
+ 0x00, //
+ 0x00, //
+
+ // @308 '=' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xFE, // #######
+ 0x00, //
+ 0xFE, // #######
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @319 '>' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x80, // #
+ 0x60, // ##
+ 0x18, // ##
+ 0x18, // ##
+ 0x60, // ##
+ 0x80, // #
+ 0x00, //
+ 0x00, //
+
+ // @330 '?' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xF0, // ####
+ 0x88, // # #
+ 0x08, // #
+ 0x10, // #
+ 0x20, // #
+ 0x00, //
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @341 '@' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x3C, // ####
+ 0x44, // # #
+ 0x9C, // # ###
+ 0xA4, // # # #
+ 0xBE, // # #####
+ 0x40, // #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+
+ // @352 'A' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x10, // #
+ 0x28, // # #
+ 0x28, // # #
+ 0x44, // # #
+ 0x7C, // #####
+ 0x44, // # #
+ 0x82, // # #
+ 0x00, //
+ 0x00, //
+
+ // @363 'B' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xF0, // ####
+ 0x88, // # #
+ 0x88, // # #
+ 0xF0, // ####
+ 0x88, // # #
+ 0x88, // # #
+ 0xF0, // ####
+ 0x00, //
+ 0x00, //
+
+ // @374 'C' (6 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x3C, // ####
+ 0x40, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x40, // #
+ 0x3C, // ####
+ 0x00, //
+ 0x00, //
+
+ // @385 'D' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xF0, // ####
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0xF0, // ####
+ 0x00, //
+ 0x00, //
+
+ // @396 'E' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xF8, // #####
+ 0x80, // #
+ 0x80, // #
+ 0xF0, // ####
+ 0x80, // #
+ 0x80, // #
+ 0xF8, // #####
+ 0x00, //
+ 0x00, //
+
+ // @407 'F' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xF8, // #####
+ 0x80, // #
+ 0x80, // #
+ 0xF0, // ####
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x00, //
+ 0x00, //
+
+ // @418 'G' (6 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x3C, // ####
+ 0x40, // #
+ 0x80, // #
+ 0x8C, // # ##
+ 0x84, // # #
+ 0x44, // # #
+ 0x3C, // ####
+ 0x00, //
+ 0x00, //
+
+ // @429 'H' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0xF8, // #####
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x00, //
+ 0x00, //
+
+ // @440 'I' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xF8, // #####
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0xF8, // #####
+ 0x00, //
+ 0x00, //
+
+ // @451 'J' (4 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x70, // ###
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0xE0, // ###
+ 0x00, //
+ 0x00, //
+
+ // @462 'K' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x88, // # #
+ 0x90, // # #
+ 0xA0, // # #
+ 0xC0, // ##
+ 0xA0, // # #
+ 0x90, // # #
+ 0x88, // # #
+ 0x00, //
+ 0x00, //
+
+ // @473 'L' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0xF8, // #####
+ 0x00, //
+ 0x00, //
+
+ // @484 'M' (6 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xCC, // ## ##
+ 0xCC, // ## ##
+ 0xD4, // ## # #
+ 0xB4, // # ## #
+ 0xB4, // # ## #
+ 0xA4, // # # #
+ 0x84, // # #
+ 0x00, //
+ 0x00, //
+
+ // @495 'N' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x88, // # #
+ 0xC8, // ## #
+ 0xE8, // ### #
+ 0xA8, // # # #
+ 0x98, // # ##
+ 0x98, // # ##
+ 0x88, // # #
+ 0x00, //
+ 0x00, //
+
+ // @506 'O' (6 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x78, // ####
+ 0x84, // # #
+ 0x84, // # #
+ 0x84, // # #
+ 0x84, // # #
+ 0x84, // # #
+ 0x78, // ####
+ 0x00, //
+ 0x00, //
+
+ // @517 'P' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xF0, // ####
+ 0x88, // # #
+ 0x88, // # #
+ 0xF0, // ####
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x00, //
+ 0x00, //
+
+ // @528 'Q' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x78, // ####
+ 0x84, // # #
+ 0x84, // # #
+ 0x84, // # #
+ 0x84, // # #
+ 0x84, // # #
+ 0x78, // ####
+ 0x0C, // ##
+ 0x06, // ##
+
+ // @539 'R' (6 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xF0, // ####
+ 0x88, // # #
+ 0x88, // # #
+ 0xF0, // ####
+ 0x90, // # #
+ 0x88, // # #
+ 0x84, // # #
+ 0x00, //
+ 0x00, //
+
+ // @550 'S' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x78, // ####
+ 0x80, // #
+ 0x80, // #
+ 0x70, // ###
+ 0x08, // #
+ 0x08, // #
+ 0xF0, // ####
+ 0x00, //
+ 0x00, //
+
+ // @561 'T' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xFE, // #######
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+
+ // @572 'U' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @583 'V' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x82, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x28, // # #
+ 0x28, // # #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+
+ // @594 'W' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x82, // # #
+ 0x92, // # # #
+ 0x92, // # # #
+ 0x6A, // ## # #
+ 0x6C, // ## ##
+ 0x4C, // # ##
+ 0x44, // # #
+ 0x00, //
+ 0x00, //
+
+ // @605 'X' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x82, // # #
+ 0x44, // # #
+ 0x28, // # #
+ 0x10, // #
+ 0x28, // # #
+ 0x44, // # #
+ 0x82, // # #
+ 0x00, //
+ 0x00, //
+
+ // @616 'Y' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x82, // # #
+ 0x44, // # #
+ 0x28, // # #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+
+ // @627 'Z' (6 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xFC, // ######
+ 0x04, // #
+ 0x08, // #
+ 0x10, // #
+ 0x20, // #
+ 0x40, // #
+ 0xFC, // ######
+ 0x00, //
+ 0x00, //
+
+ // @638 '[' (3 pixels wide)
+ 0x00, //
+ 0xE0, // ###
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0xE0, // ###
+
+ // @649 '\' (7 pixels wide)
+ 0x00, //
+ 0x80, // #
+ 0x40, // #
+ 0x40, // #
+ 0x20, // #
+ 0x10, // #
+ 0x10, // #
+ 0x08, // #
+ 0x08, // #
+ 0x04, // #
+ 0x02, // #
+
+ // @660 ']' (3 pixels wide)
+ 0x00, //
+ 0xE0, // ###
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0xE0, // ###
+
+ // @671 '^' (7 pixels wide)
+ 0x00, //
+ 0x10, // #
+ 0x10, // #
+ 0x28, // # #
+ 0x6C, // ## ##
+ 0x44, // # #
+ 0x82, // # #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @682 '_' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xFE, // #######
+ 0x00, //
+
+ // @693 '`' (2 pixels wide)
+ 0x80, // #
+ 0x40, // #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @704 'a' (6 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x70, // ###
+ 0x08, // #
+ 0x78, // ####
+ 0x88, // # #
+ 0x88, // # #
+ 0x7C, // #####
+ 0x00, //
+ 0x00, //
+
+ // @715 'b' (5 pixels wide)
+ 0x00, //
+ 0x80, // #
+ 0x80, // #
+ 0xB0, // # ##
+ 0xC8, // ## #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0xF0, // ####
+ 0x00, //
+ 0x00, //
+
+ // @726 'c' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x78, // ####
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x78, // ####
+ 0x00, //
+ 0x00, //
+
+ // @737 'd' (5 pixels wide)
+ 0x00, //
+ 0x08, // #
+ 0x08, // #
+ 0x78, // ####
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x78, // ####
+ 0x00, //
+ 0x00, //
+
+ // @748 'e' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x70, // ###
+ 0x88, // # #
+ 0xF8, // #####
+ 0x80, // #
+ 0x80, // #
+ 0x78, // ####
+ 0x00, //
+ 0x00, //
+
+ // @759 'f' (6 pixels wide)
+ 0x00, //
+ 0x1C, // ###
+ 0x20, // #
+ 0xFC, // ######
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @770 'g' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x78, // ####
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x78, // ####
+ 0x08, // #
+ 0x70, // ###
+
+ // @781 'h' (5 pixels wide)
+ 0x00, //
+ 0x80, // #
+ 0x80, // #
+ 0xB8, // # ###
+ 0xC8, // ## #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x00, //
+ 0x00, //
+
+ // @792 'i' (3 pixels wide)
+ 0x00, //
+ 0x20, // #
+ 0x00, //
+ 0xE0, // ###
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @803 'j' (4 pixels wide)
+ 0x00, //
+ 0x10, // #
+ 0x00, //
+ 0x70, // ###
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0xE0, // ###
+
+ // @814 'k' (5 pixels wide)
+ 0x00, //
+ 0x80, // #
+ 0x80, // #
+ 0x88, // # #
+ 0x90, // # #
+ 0xE0, // ###
+ 0xA0, // # #
+ 0x90, // # #
+ 0x88, // # #
+ 0x00, //
+ 0x00, //
+
+ // @825 'l' (3 pixels wide)
+ 0x00, //
+ 0xE0, // ###
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @836 'm' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xB6, // # ## ##
+ 0xDA, // ## ## #
+ 0x92, // # # #
+ 0x92, // # # #
+ 0x92, // # # #
+ 0x92, // # # #
+ 0x00, //
+ 0x00, //
+
+ // @847 'n' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xB8, // # ###
+ 0xC8, // ## #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x00, //
+ 0x00, //
+
+ // @858 'o' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x70, // ###
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @869 'p' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xB0, // # ##
+ 0xC8, // ## #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0xF0, // ####
+ 0x80, // #
+ 0x80, // #
+
+ // @880 'q' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x78, // ####
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x78, // ####
+ 0x08, // #
+ 0x08, // #
+
+ // @891 'r' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xB8, // # ###
+ 0xC8, // ## #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x00, //
+ 0x00, //
+
+ // @902 's' (4 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xF0, // ####
+ 0x80, // #
+ 0xC0, // ##
+ 0x30, // ##
+ 0x10, // #
+ 0xE0, // ###
+ 0x00, //
+ 0x00, //
+
+ // @913 't' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x40, // #
+ 0xF8, // #####
+ 0x40, // #
+ 0x40, // #
+ 0x40, // #
+ 0x40, // #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+
+ // @924 'u' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x88, // # #
+ 0x98, // # ##
+ 0xE8, // ### #
+ 0x00, //
+ 0x00, //
+
+ // @935 'v' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x82, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x28, // # #
+ 0x28, // # #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+
+ // @946 'w' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x82, // # #
+ 0x92, // # # #
+ 0xAA, // # # # #
+ 0xAA, // # # # #
+ 0x6C, // ## ##
+ 0x44, // # #
+ 0x00, //
+ 0x00, //
+
+ // @957 'x' (6 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x84, // # #
+ 0x48, // # #
+ 0x30, // ##
+ 0x30, // ##
+ 0x48, // # #
+ 0x84, // # #
+ 0x00, //
+ 0x00, //
+
+ // @968 'y' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x82, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x28, // # #
+ 0x28, // # #
+ 0x10, // #
+ 0x30, // ##
+ 0xE0, // ###
+
+ // @979 'z' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xF8, // #####
+ 0x08, // #
+ 0x10, // #
+ 0x20, // #
+ 0x40, // #
+ 0xF8, // #####
+ 0x00, //
+ 0x00, //
+
+ // @990 '{' (4 pixels wide)
+ 0x00, //
+ 0x30, // ##
+ 0x40, // #
+ 0x40, // #
+ 0x40, // #
+ 0xC0, // ##
+ 0x40, // #
+ 0x40, // #
+ 0x40, // #
+ 0x40, // #
+ 0x30, // ##
+
+ // @1001 '|' (1 pixels wide)
+ 0x00, //
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+ 0x80, // #
+
+ // @1012 '}' (4 pixels wide)
+ 0x00, //
+ 0xC0, // ##
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x30, // ##
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0xE0, // ###
+
+ // @1023 '~' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x72, // ### #
+ 0x9C, // # ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+};
+
+// Character descriptors for Lucida Console 8pt
+// { [Char width in bits], [Offset into lucidaConsole_8ptCharBitmaps in bytes] }
+const FONT_CHAR_INFO lucidaConsole_8ptDescriptors[] =
+{
+ {1, 0}, // !
+ {4, 11}, // "
+ {6, 22}, // #
+ {5, 33}, // $
+ {7, 44}, // %
+ {7, 55}, // &
+ {1, 66}, // '
+ {4, 77}, // (
+ {4, 88}, // )
+ {5, 99}, // *
+ {5, 110}, // +
+ {2, 121}, // ,
+ {5, 132}, // -
+ {2, 143}, // .
+ {7, 154}, // /
+ {5, 165}, // 0
+ {5, 176}, // 1
+ {4, 187}, // 2
+ {4, 198}, // 3
+ {5, 209}, // 4
+ {4, 220}, // 5
+ {5, 231}, // 6
+ {5, 242}, // 7
+ {5, 253}, // 8
+ {5, 264}, // 9
+ {2, 275}, // :
+ {2, 286}, // ;
+ {5, 297}, // <
+ {7, 308}, // =
+ {5, 319}, // >
+ {5, 330}, // ?
+ {7, 341}, // @
+ {7, 352}, // A
+ {5, 363}, // B
+ {6, 374}, // C
+ {5, 385}, // D
+ {5, 396}, // E
+ {5, 407}, // F
+ {6, 418}, // G
+ {5, 429}, // H
+ {5, 440}, // I
+ {4, 451}, // J
+ {5, 462}, // K
+ {5, 473}, // L
+ {6, 484}, // M
+ {5, 495}, // N
+ {6, 506}, // O
+ {5, 517}, // P
+ {7, 528}, // Q
+ {6, 539}, // R
+ {5, 550}, // S
+ {7, 561}, // T
+ {5, 572}, // U
+ {7, 583}, // V
+ {7, 594}, // W
+ {7, 605}, // X
+ {7, 616}, // Y
+ {6, 627}, // Z
+ {3, 638}, // [
+ {7, 649}, // \
+ {3, 660}, // ]
+ {7, 671}, // ^
+ {7, 682}, // _
+ {2, 693}, // `
+ {6, 704}, // a
+ {5, 715}, // b
+ {5, 726}, // c
+ {5, 737}, // d
+ {5, 748}, // e
+ {6, 759}, // f
+ {5, 770}, // g
+ {5, 781}, // h
+ {3, 792}, // i
+ {4, 803}, // j
+ {5, 814}, // k
+ {3, 825}, // l
+ {7, 836}, // m
+ {5, 847}, // n
+ {5, 858}, // o
+ {5, 869}, // p
+ {5, 880}, // q
+ {5, 891}, // r
+ {4, 902}, // s
+ {5, 913}, // t
+ {5, 924}, // u
+ {7, 935}, // v
+ {7, 946}, // w
+ {6, 957}, // x
+ {7, 968}, // y
+ {5, 979}, // z
+ {4, 990}, // {
+ {1, 1001}, // |
+ {4, 1012}, // }
+ {7, 1023}, // ~
+};
+
+// Font information for Lucida Console 8pt
+const FONT_INFO lucidaConsole_8ptFontInfo =
+{
+ 2, // Character height
+ '!', // Start character
+ '~', // End character
+ 2, // Width, in pixels, of space character
+ lucidaConsole_8ptDescriptors, // Character descriptor array
+ lucidaConsole_8ptBitmaps, // Character bitmap array
+};
+
diff --git a/src/display/graphic_lcd/font_6x8.h b/src/display/graphic_lcd/font_6x8.h
new file mode 100644
index 0000000..03b4b73
--- /dev/null
+++ b/src/display/graphic_lcd/font_6x8.h
@@ -0,0 +1,5 @@
+// Font data for Lucida Console 8pt
+extern const uint_8 lucidaConsole_8ptBitmaps[];
+extern const FONT_INFO lucidaConsole_8ptFontInfo;
+extern const FONT_CHAR_INFO lucidaConsole_8ptDescriptors[];
+
diff --git a/src/display/graphic_lcd/graphic_lcd.c b/src/display/graphic_lcd/graphic_lcd.c
new file mode 100644
index 0000000..41ff267
--- /dev/null
+++ b/src/display/graphic_lcd/graphic_lcd.c
@@ -0,0 +1,8 @@
+/*
+ * graphic_lcd.c
+ *
+ * Created on: Jun 3, 2018
+ * Author: kidsr
+ */
+
+
diff --git a/src/piscan.c b/src/piscan.c
new file mode 100644
index 0000000..aee40a5
--- /dev/null
+++ b/src/piscan.c
@@ -0,0 +1,34 @@
+/*
+ * piscan.c
+ *
+ * Created on: May 30, 2018
+ * Author: Ezra Taimuty-Loomis
+ */
+
+/* includes */
+#include
+#include
+
+#include
+
+//#include
+//TODO revise or replace this dependency
+#include "../../rtl-sdr/src/rtl_fm.c"
+
+#include "scanner.h"
+#include "scan_tree.h"
+#include "tuner.h"
+
+/* defines */
+
+
+/* global variable declarations */
+
+
+/* function declarations */
+
+
+/* main function */
+int main(void){
+ return 0;
+}
diff --git a/src/scan_tree.c b/src/scan_tree.c
new file mode 100644
index 0000000..95a624f
--- /dev/null
+++ b/src/scan_tree.c
@@ -0,0 +1,151 @@
+/*
+ * scan_tree.c
+ *
+ * Created on: May 31, 2018
+ * Author: Ezra Taimuty-Loomis
+ */
+
+/*
+ * Definitions for the scan tree data structure
+ */
+
+/* Includes */
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+//#include "../../rtl-sdr/src/rtl_fm.c"
+#include "scan_tree.h"
+
+/* Definitions */
+
+
+const char *getSysType(enum system_type type){
+ switch(type){
+ case ANALOG: return "Analog";
+ case P25: return "P25";
+ case DMR: return "DMR";
+ default: return "";
+ }
+}
+
+
+
+const char *getMode(enum modulation mode){
+ switch(mode){
+ case FM: return "FM";
+ case NFM: return "NFM";
+ case AM: return "AM";
+ case USB: return "USB";
+ case LSB: return "LSB";
+ case RAW: return "RAW";
+ default: return "";
+ }
+}
+
+
+
+//typedef struct channel_fm {
+// char mode[] = "FM";
+// struct channel chan;
+// void (*mode_demod)(struct demod_state*) = &fm_demod;
+// //chan.mode_demod = &fm_demod;
+//};
+//
+//typedef struct channel_nfm {
+// char mode[] = "FM";
+// struct channel chan;
+// void (*mode_demod)(struct demod_state*) = &fm_demod;
+//};
+//
+//typedef struct channel_am {
+// char mode[] = "AM";
+// struct channel chan;
+// void (*mode_demod)(struct demod_state*) = &am_demod;
+//};
+
+
+
+/* Methods */
+int system_save(struct system *sys, char prf_dir[]){
+ char *sys_path = malloc(sizeof(*prf_dir) + MAX_TAG_LENGTH + 2);
+ memset(sys_path, 0, sizeof(*prf_dir) + MAX_TAG_LENGTH + 2);
+ strcat(sys_path, prf_dir);
+ strcat(sys_path, "/");
+ strcat(sys_path, sys->tag);
+
+ mkdir(sys_path);
+
+ char *sys_filename = malloc(sizeof(*sys_path) + sizeof(SYS_FILE_EXT) + 1);
+ memset(sys_filename, 0, sizeof(*sys_path) + sizeof(SYS_FILE_EXT) + 1);
+ strcat(sys_filename, sys_path);
+ strcat(sys_filename, SYS_FILE_EXT);
+
+ fprintf(stdout, "\tOpening \"%s\"", sys_filename);
+ FILE *outfile = fopen(sys_filename, "w");
+ if (outfile == NULL) {
+ fprintf(stderr, "File open error\n");
+ return 0;
+ }
+
+ fwrite(sys, sizeof(struct system), 1, outfile);
+
+ fclose(outfile);
+ free(sys_path);
+ free(sys_filename);
+ return 0;
+}
+
+int scan_profile_load(struct scan_profile *sp, char dir[]){
+ return 0;
+}
+
+int scan_profile_save(struct scan_profile *sp, char dir[]) {
+ int err = mkdir(dir);
+ if (err != 0) {
+ fprintf(stderr, "Could not make directory \"%s\": code %i\n", dir, err);
+ if (err == EEXIST)
+ fprintf(stderr, "\tDirectory already exists\n");
+ //else return 0;
+ }
+
+ char *sp_path = malloc(sizeof(*dir) + MAX_TAG_LENGTH + 1);
+ memset(sp_path, 0, sizeof(*dir) + MAX_TAG_LENGTH + 1);
+ strcat(sp_path, dir);
+ strcat(sp_path, sp->name);
+
+ err = mkdir(sp_path);
+ if (err != 0) {
+ fprintf(stderr, "Could not make directory \"%s\": code %i\n", sp_path, err);
+ if (err == EEXIST)
+ fprintf(stderr, "\tDirectory already exists\n");
+ //else return 0;
+ }
+
+ char *sp_filename = malloc(sizeof(*sp_path) + sizeof(SP_FILE_EXT) + 1);
+ memset(sp_filename, 0, sizeof(*sp_path) + sizeof(SP_FILE_EXT) + 1);
+ strcat(sp_filename, sp_path);
+
+ strcat(sp_filename, SP_FILE_EXT);
+ fprintf(stdout, "Opening file \"%s\"\n", sp_filename);
+ FILE *outfile = fopen(sp_filename, "w");
+ if (outfile == NULL) {
+ fprintf(stderr, "File open error\n");
+ return 0;
+ }
+
+ err = fwrite(sp, sizeof(struct scan_profile), 1, outfile);
+
+ for(int i = 0; i < sp->num_systems; i++)
+ system_save(&sp->systems[i], sp_path);
+
+ fclose(outfile);
+ free(sp_path);
+ free(sp_filename);
+ return err;
+}
+
diff --git a/src/scan_tree.h b/src/scan_tree.h
new file mode 100644
index 0000000..fbd8254
--- /dev/null
+++ b/src/scan_tree.h
@@ -0,0 +1,69 @@
+/*
+ * scan_tree.h
+ *
+ * Created on: Jun 2, 2018
+ * Author: kidsr
+ */
+
+#ifndef SCAN_TREE_H_
+#define SCAN_TREE_H_
+
+#include
+
+//#include "scan_tree.c"
+#define MAX_TAG_LENGTH 32
+#define MAX_FILENAME_LENGTH MAX_TAG_LENGTH + 4
+#define SP_FILE_EXT ".sp"
+#define SYS_FILE_EXT ".scn"
+#define CHAN_FILE_EXT ".chan"
+
+enum system_type {
+ ANALOG = 0,
+ P25,
+ DMR
+};
+
+const char *getSysType(enum system_type type);
+
+enum modulation {
+ FM = 0,
+ NFM,
+ AM,
+ USB,
+ LSB,
+ RAW
+};
+
+const char *getMode(enum modulation mode);
+
+typedef struct channel {
+ char *tag;
+ uint32_t freq;
+ enum modulation mode;
+ int delay_enabled;
+ time_t sigloss_start_time;
+ //void (*mode_demod)(struct demod_state*);
+} channel_t;
+
+typedef struct entry {
+ char *tag;
+} entry_t;
+
+typedef struct system {
+ char *tag;
+ enum system_type type;
+ int channel_count;
+ channel_t **channels;
+ void (*scan)(struct system*);
+} system_t;
+
+struct scan_profile {
+ char *name;
+ struct system *systems;
+ int num_systems;
+};
+
+int scan_profile_load(struct scan_profile *sp, char dir[]);
+int scan_profile_save(struct scan_profile *sp, char dir[]);
+
+#endif /* SCAN_TREE_H_ */
diff --git a/src/scanner.c b/src/scanner.c
new file mode 100644
index 0000000..c4e083a
--- /dev/null
+++ b/src/scanner.c
@@ -0,0 +1,66 @@
+/*
+ * scanner.c
+ *
+ * Created on: May 31, 2018
+ * Author: Ezra Taimuty-Loomis
+ */
+
+/*
+ * Implementation of scanning procedures for each system type
+ */
+
+/* Includes */
+#include
+#include
+#include
+#include
+
+#include "../../rtl-sdr/src/rtl_fm.c"
+#include "../../rtl-sdr/include/rtl-sdr.h"
+
+#include "scan_tree.h"
+#include "scanner.h"
+
+/* Constants */
+#define SCAN_DELAY_TIMEOUT 2000 //2000ms timeout
+
+/* Global variables */
+
+
+/* Methods */
+
+void analog_scan(const struct system *sys, struct tuning_interface *tuner){
+ for(int cur = 0; cur < sys->channel_count; cur++) {
+ // TODO code for updating interface
+ fprintf(stderr, "Scanning %s\n", sys->tag);
+
+ // TODO thread sync
+ tuner->dongle->freq = sys->channels[cur].freq;
+
+ switch(sys->channels[cur].mode){
+ case AM:
+ tuner->demod->mode_demod = &am_demod;
+ break;
+ case NFM:
+ case FM:
+ default:
+ tuner->demod->mode_demod = &fm_demod;
+ break;
+ }
+
+ while(!tuner->tuned);
+
+ //if(tuner->demod->)
+
+ }
+}
+
+void p25_scan(struct system *sys){
+ // TODO for future implementation
+}
+
+void dmr_scan(struct system *sys){
+ // TODO for future implementation
+ //struct tuning_interface ti;
+}
+
diff --git a/src/scanner.h b/src/scanner.h
new file mode 100644
index 0000000..239db0c
--- /dev/null
+++ b/src/scanner.h
@@ -0,0 +1,15 @@
+/*
+ * scanner.h
+ *
+ * Created on: Jun 3, 2018
+ * Author: kidsr
+ */
+
+#ifndef SRC_SCANNER_H_
+#define SRC_SCANNER_H_
+
+void analog_scan(const struct system *sys, struct tuning_interface *tuner);
+void p25_scan(struct system *sys);
+void dmr_scan(struct system *sys);
+
+#endif /* SRC_SCANNER_H_ */
diff --git a/src/tuner.c b/src/tuner.c
new file mode 100644
index 0000000..578eb68
--- /dev/null
+++ b/src/tuner.c
@@ -0,0 +1,8 @@
+/*
+ * tuner.c
+ *
+ * Created on: Jun 2, 2018
+ * Author: kidsr
+ */
+
+#include "tuner.h"
diff --git a/src/tuner.h b/src/tuner.h
new file mode 100644
index 0000000..5567b3c
--- /dev/null
+++ b/src/tuner.h
@@ -0,0 +1,27 @@
+/*
+ * tuner.h
+ *
+ * Created on: Jun 3, 2018
+ * Author: kidsr
+ */
+
+#ifndef SRC_TUNER_H_
+#define SRC_TUNER_H_
+
+#include
+
+#include "../../rtl-sdr/src/rtl_fm.c"
+#include "../../rtl-sdr/include/rtl-sdr.h"
+
+typedef struct tuning_interface {
+ int ready = 0;
+ int tuned = 0;
+ struct dongle_state *dongle;
+ struct demod_state *demod;
+ //struct agc_state *agc;
+ struct controller_state *controller;
+ struct output_state *output;
+ pthread_t thread;
+}tuner_t;
+
+#endif /* SRC_TUNER_H_ */
diff --git a/tests/test_scan_tree.c b/tests/test_scan_tree.c
new file mode 100644
index 0000000..15b5499
--- /dev/null
+++ b/tests/test_scan_tree.c
@@ -0,0 +1,102 @@
+/*
+ * test_scan_tree.c
+ *
+ * Created on: Jun 2, 2018
+ * Author: Ezra Taimuty-Loomis
+ */
+
+/*
+ * Program to test scan tree implementation
+ */
+
+#include
+#include
+#include
+#include
+
+#include "../src/scan_tree.h"
+
+
+struct scan_profile generated_profile;
+struct scan_profile loaded_profile;
+
+char test_directory[] = "./profiles/";
+
+void init_test_sys_1(struct system *sys){
+ fprintf(stdout, "Initializing system 1\n");
+ sys->tag = "Analog system 1";
+ sys->type = ANALOG;
+ sys->channel_count = 0;
+ sys->channels = malloc(10 * sizeof(struct channel*));
+ uint32_t freq = 470000000;
+ for(int i = 0; i < 10; i++){
+ sys->channels[i] = malloc(sizeof(struct channel));
+ char num[3];
+ sys->channels[i]->tag = malloc(16 * sizeof(char) + 1);
+ memset(sys->channels[i]->tag, 0, 16 * sizeof(char) + 1);
+ itoa(i, num, 10);
+ strcat(sys->channels[i]->tag, "Channel ");
+ strcat(sys->channels[i]->tag, num);
+ //sys->channels[i]->tag = out;
+ sys->channels[i]->freq = freq;
+ sys->channels[i]->delay_enabled = i % 2;
+ sys->channels[i]->mode = i % 3;
+ sys->channel_count++;
+ freq += 12500;
+ }
+}
+
+void init_test_prf(struct scan_profile *sp){
+ fprintf(stdout, "Initializing test profile\n");
+ sp->name = "Test profile 1";
+ struct system sys1;
+ init_test_sys_1(&sys1);
+ fprintf(stdout, "System 1 initialized\n");
+
+
+ sp->num_systems = 1;
+ sp->systems = malloc(1 * sizeof(struct system));
+ sp->systems[0] = sys1;
+
+}
+
+void print_analog_sys(struct system *sys){
+ fprintf(stdout, "System: %s\n\tType: %s\n\tChannels:\n", sys->tag, getSysType(sys->type));
+ for(int i = 0; i < sys->channel_count; i++){
+ fprintf(stdout, "\t\t%i: %s\n", i, sys->channels[i]->tag);
+ fprintf(stdout, "\t\t\t%lfMHz\n\t\t\tMode: %s\n\t\t\tDelay: %i\n",
+ (sys->channels[i]->freq/1000000.0),
+ getMode(sys->channels[i]->mode),
+ sys->channels[i]->delay_enabled);
+ }
+}
+
+int main(void){
+
+
+ init_test_prf(&generated_profile);
+ fprintf(stdout, "Profile initialized\nPrinting systems\n");
+
+ for(int i = 0; i < generated_profile.num_systems; i++){
+ switch(generated_profile.systems[i].type){
+ case P25:
+ break;
+ case DMR:
+ break;
+ case ANALOG:
+ default:
+ print_analog_sys(&generated_profile.systems[i]);
+ }
+ }
+
+ fprintf(stdout, "Saving file\n");
+ if(scan_profile_save(&generated_profile, test_directory))
+ fprintf(stdout, "Saved successfully\n");
+
+ fprintf(stdout, "Loading scan file\n");
+ scan_profile_load(&loaded_profile, test_directory);
+
+ system("pause");
+ return 0;
+}
+
diff --git a/tests/test_tuner_thread.c b/tests/test_tuner_thread.c
new file mode 100644
index 0000000..9dfb747
--- /dev/null
+++ b/tests/test_tuner_thread.c
@@ -0,0 +1,33 @@
+/*
+ * test_tuner_thread.c
+ *
+ * Created on: May 30, 2018
+ * Author: Ezra Taimuty-Loomis
+ */
+
+/*
+ * program to test tuner + demod control implementation
+ * will be mirrored in main source after designing here
+ */
+
+/* includes */
+#include
+#include
+
+//TODO revise or replace this dependency
+#include "../../rtl-sdr/src/rtl_fm.c"
+
+/* defines */
+
+
+/* global variable declarations */
+
+
+//struct tuning_interface tuner;
+
+/* function declarations */
+
+int main(void){
+ return 0;
+}
+