From 279a8cb5cce9d9e07d0570cb42af3cb1442feb22 Mon Sep 17 00:00:00 2001 From: ezratl Date: Mon, 4 Jun 2018 17:35:22 -0400 Subject: [PATCH] initial commit --- .cproject | 152 ++ .gitattributes | 63 + .gitignore | 243 ++ .project | 26 + .../org.eclipse.cdt.managedbuilder.core.prefs | 21 + Test profile 1.sp | Bin 0 -> 12 bytes profiles/Test profile 1.sp | Bin 0 -> 12 bytes profiles/Test profile 1/Analog system 1.scn | Bin 0 -> 21 bytes profiles/Test profile 1/Analog system 1/.scn | Bin 0 -> 21 bytes src/PiScan.vcproj | 0 src/display/graphic_lcd/drv_MatrixOrbitalGX.c | 576 +++++ src/display/graphic_lcd/font_12x16.c | 2280 +++++++++++++++++ src/display/graphic_lcd/font_12x16.h | 5 + src/display/graphic_lcd/font_6x8.c | 1341 ++++++++++ src/display/graphic_lcd/font_6x8.h | 5 + src/display/graphic_lcd/graphic_lcd.c | 8 + src/piscan.c | 34 + src/scan_tree.c | 151 ++ src/scan_tree.h | 69 + src/scanner.c | 66 + src/scanner.h | 15 + src/tuner.c | 8 + src/tuner.h | 27 + tests/test_scan_tree.c | 102 + tests/test_tuner_thread.c | 33 + 25 files changed, 5225 insertions(+) create mode 100644 .cproject create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .project create mode 100644 .settings/org.eclipse.cdt.managedbuilder.core.prefs create mode 100644 Test profile 1.sp create mode 100644 profiles/Test profile 1.sp create mode 100644 profiles/Test profile 1/Analog system 1.scn create mode 100644 profiles/Test profile 1/Analog system 1/.scn create mode 100644 src/PiScan.vcproj create mode 100644 src/display/graphic_lcd/drv_MatrixOrbitalGX.c create mode 100644 src/display/graphic_lcd/font_12x16.c create mode 100644 src/display/graphic_lcd/font_12x16.h create mode 100644 src/display/graphic_lcd/font_6x8.c create mode 100644 src/display/graphic_lcd/font_6x8.h create mode 100644 src/display/graphic_lcd/graphic_lcd.c create mode 100644 src/piscan.c create mode 100644 src/scan_tree.c create mode 100644 src/scan_tree.h create mode 100644 src/scanner.c create mode 100644 src/scanner.h create mode 100644 src/tuner.c create mode 100644 src/tuner.h create mode 100644 tests/test_scan_tree.c create mode 100644 tests/test_tuner_thread.c 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 0000000000000000000000000000000000000000..0389beca36f450cc1420609d2012cac1b916f5ef GIT binary patch literal 12 TcmY#NbYLiuyT-uCz`y_i5vc+x literal 0 HcmV?d00001 diff --git a/profiles/Test profile 1.sp b/profiles/Test profile 1.sp new file mode 100644 index 0000000000000000000000000000000000000000..28489496a04339f99df48289a81c5474d2001f14 GIT binary patch literal 12 TcmYdFbYOTeQIdg?fq?-47T^Mp literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f96ba3d0499d62cf3644fc55b87f32588a853d63 GIT binary patch literal 21 YcmXp{bYK7hUM?WP6N03qE3LI3~& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..030103bbaabcaba0aa77b80a56ce2f72235d6fe5 GIT binary patch literal 21 YcmXp{bYK7hUM?WP6N03@3Pw*UYD literal 0 HcmV?d00001 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; +} +