diff --git a/firmware/platformio.ini b/firmware/platformio.ini index d807cc1..46e3108 100644 --- a/firmware/platformio.ini +++ b/firmware/platformio.ini @@ -18,19 +18,19 @@ monitor_flags = --echo --filter=esp32_exception_decoder lib_deps = - TFT_eSPI@2.3.59 + TFT_eSPI@2.3.70 fastled/FastLED @ ^3.4.0 askuric/Simple FOC @ ^2.2 infineon/TLV493D-Magnetic-Sensor @ ^1.0.3 bxparks/AceButton @ ^1.9.1 build_flags = - -Os -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG + -DUSER_SETUP_LOADED=1 - -DST7789_DRIVER=1 + -DGC9A01_DRIVER=1 -DCGRAM_OFFSET=1 - -DTFT_WIDTH=135 + -DTFT_WIDTH=240 -DTFT_HEIGHT=240 -DTFT_MISO=-1 -DTFT_MOSI=19 @@ -41,4 +41,4 @@ build_flags = -DTFT_BL=4 -DLOAD_GLCD=1 -DLOAD_GFXFF=1 - -DSPI_FREQUENCY=40000000 + -DSPI_FREQUENCY=50000000 diff --git a/firmware/src/display_task.cpp b/firmware/src/display_task.cpp index 258c850..026b83e 100644 --- a/firmware/src/display_task.cpp +++ b/firmware/src/display_task.cpp @@ -1,6 +1,8 @@ #include "display_task.h" #include "semaphore_guard.h" +#include "font/roboto_light_60.h" + DisplayTask::DisplayTask(const uint8_t task_core) : Task{"Display", 8192, 1, task_core} { semaphore_ = xSemaphoreCreateMutex(); assert(semaphore_ != NULL); @@ -77,51 +79,70 @@ void DisplayTask::run() { spr_.setColorDepth(16); spr_.createSprite(TFT_WIDTH, TFT_HEIGHT); - spr_.setFreeFont(&Roboto_Thin_24); + spr_.setFreeFont(&Roboto_Light_60); spr_.setTextColor(0xFFFF, TFT_BLACK); - float angle; + KnobState state; + + const int RADIUS = TFT_WIDTH / 2; int32_t pointer_center_x = TFT_WIDTH / 2; - int32_t pointer_center_y = TFT_HEIGHT * 2 / 3; + int32_t pointer_center_y = TFT_HEIGHT / 2; int32_t pointer_length_short = 10; - int32_t pointer_length_long = TFT_WIDTH / 2; + int32_t pointer_length_long = TFT_WIDTH / 2 - 5; + + spr_.setTextDatum(CC_DATUM); + spr_.setTextColor(TFT_WHITE); while(1) { { SemaphoreGuard lock(semaphore_); - angle = angle_;// < 0 ? angle_ + 2 * PI : angle_; + state = state_; } - float degrees = angle * 360 / 2 / PI; + // float degrees = angle * 360 / 2 / PI; - uint8_t r, g, b; - HSV_to_RGB(degrees, 80, 80, &r, &g, &b); + // uint8_t r, g, b; + // HSV_to_RGB(degrees, 80, 80, &r, &g, &b); - spr_.fillSprite(tft_.color565(r, g, b)); - spr_.setCursor(40, 40); + // spr_.fillSprite(tft_.color565(r, g, b)); + spr_.fillSprite(TFT_BLACK); - spr_.printf("%.1f", degrees); + spr_.drawString(String() + state.current_position, TFT_WIDTH / 2, TFT_HEIGHT / 2, 1); + // spr_.setCursor(60, 40); + // spr_.printf("%.1f", degrees); - float pointer_angle = - angle; - spr_.fillTriangle( - pointer_center_x + pointer_length_short * cos(pointer_angle - PI * 3 /4), - pointer_center_y + pointer_length_short * sin(pointer_angle - PI * 3 /4), - pointer_center_x + pointer_length_short * cos(pointer_angle + PI * 3 /4), - pointer_center_y + pointer_length_short * sin(pointer_angle + PI * 3 /4), - pointer_center_x + pointer_length_long * cos(pointer_angle), - pointer_center_y + pointer_length_long * sin(pointer_angle), - TFT_WHITE - ); + // float pointer_angle = - angle; + // spr_.fillTriangle( + // pointer_center_x + pointer_length_short * cos(pointer_angle - PI * 3 /4), + // pointer_center_y + pointer_length_short * sin(pointer_angle - PI * 3 /4), + // pointer_center_x + pointer_length_short * cos(pointer_angle + PI * 3 /4), + // pointer_center_y + pointer_length_short * sin(pointer_angle + PI * 3 /4), + // pointer_center_x + pointer_length_long * cos(pointer_angle), + // pointer_center_y + pointer_length_long * sin(pointer_angle), + // TFT_WHITE + // ); - spr_.fillCircle(pointer_center_x, pointer_center_y, 3, TFT_RED); + // spr_.fillCircle(pointer_center_x, pointer_center_y, 3, TFT_RED); + float left_bound = PI / 2; + + if (state.num_positions > 0) { + float range_radians = (state.num_positions - 1) * state.position_width_radians; + left_bound = PI / 2 + range_radians / 2; + float right_bound = PI / 2 - range_radians / 2; + spr_.drawLine(TFT_WIDTH/2 + RADIUS * cosf(left_bound), TFT_HEIGHT/2 - RADIUS * sinf(left_bound), TFT_WIDTH/2 + (RADIUS - 10) * cosf(left_bound), TFT_HEIGHT/2 - (RADIUS - 10) * sinf(left_bound), TFT_WHITE); + spr_.drawLine(TFT_WIDTH/2 + RADIUS * cosf(right_bound), TFT_HEIGHT/2 - RADIUS * sinf(right_bound), TFT_WIDTH/2 + (RADIUS - 10) * cosf(right_bound), TFT_HEIGHT/2 - (RADIUS - 10) * sinf(right_bound), TFT_WHITE); + } + + float angle = left_bound - (state.sub_position_unit + state.current_position) * state.position_width_radians; + spr_.fillCircle(TFT_WIDTH/2 + (RADIUS - 10) * cosf(angle), TFT_HEIGHT/2 - (RADIUS - 10) * sinf(angle), 5, TFT_BLUE); spr_.pushSprite(0, 0); - delay(10); + delay(2); } } -void DisplayTask::set_angle(float angle) { +void DisplayTask::setData(KnobState state) { SemaphoreGuard lock(semaphore_); - angle_ = angle; + state_ = state; } diff --git a/firmware/src/display_task.h b/firmware/src/display_task.h index f665180..8e19ca0 100644 --- a/firmware/src/display_task.h +++ b/firmware/src/display_task.h @@ -3,6 +3,7 @@ #include #include +#include "knob_data.h" #include "task.h" class DisplayTask : public Task { @@ -12,7 +13,7 @@ class DisplayTask : public Task { DisplayTask(const uint8_t task_core); ~DisplayTask(); - void set_angle(float angle); + void setData(KnobState state); protected: void run(); @@ -25,5 +26,5 @@ class DisplayTask : public Task { SemaphoreHandle_t semaphore_; - float angle_ = 0; + KnobState state_; }; diff --git a/firmware/src/font/roboto_light_60.h b/firmware/src/font/roboto_light_60.h new file mode 100644 index 0000000..e852b38 --- /dev/null +++ b/firmware/src/font/roboto_light_60.h @@ -0,0 +1,199 @@ +// Created by http://oleddisplay.squix.ch/ Consider a donation +// In case of problems make sure that you are using the font file with the correct version! +const uint8_t Roboto_Light_60Bitmaps[] PROGMEM = { + + // Bitmap Data: + 0x00, // ' ' + 0xF3,0xCF,0x3C,0xF3,0xCF,0x3C,0xF3,0xCF,0x3C,0xF3,0xCF,0x3C,0xF3,0xCF,0x3C,0xF3,0xCF,0x3C,0xF3,0xCF,0x3C,0xF3,0xCF,0x00,0x00,0x00,0x00,0x00,0x07,0x3C,0xFB,0xC7,0x00, // '!' + 0xE1,0xDC,0x3B,0x87,0x70,0xEE,0x1D,0xC3,0xB8,0x77,0x0E,0xE1,0xDC,0x3B,0x87,0x70,0xEE,0x1C, // '"' + 0x00,0x03,0x80,0x38,0x00,0x01,0xC0,0x0E,0x00,0x00,0x70,0x07,0x00,0x00,0x1C,0x01,0xC0,0x00,0x07,0x00,0x70,0x00,0x01,0xC0,0x1C,0x00,0x00,0xE0,0x07,0x00,0x00,0x38,0x03,0x80,0x00,0x0E,0x00,0xE0,0x00,0x03,0x80,0x38,0x00,0x00,0xE0,0x0E,0x00,0x00,0x30,0x03,0x80,0x1F,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xFF,0xE1,0xFF,0xFF,0xFF,0xF8,0x00,0x70,0x07,0x00,0x00,0x1C,0x01,0xC0,0x00,0x0E,0x00,0x60,0x00,0x03,0x80,0x38,0x00,0x00,0xE0,0x0E,0x00,0x00,0x38,0x03,0x80,0x00,0x0E,0x00,0xE0,0x00,0x07,0x00,0x38,0x00,0x01,0xC0,0x1C,0x00,0x00,0x70,0x07,0x00,0x00,0x1C,0x01,0xC0,0x00,0x07,0x00,0x70,0x00,0x01,0x80,0x1C,0x00,0xFF,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xFF,0x8F,0xFF,0xFF,0xFF,0xE0,0x03,0x80,0x38,0x00,0x00,0xE0,0x0E,0x00,0x00,0x70,0x03,0x80,0x00,0x1C,0x01,0xC0,0x00,0x07,0x00,0x70,0x00,0x01,0xC0,0x1C,0x00,0x00,0x70,0x07,0x00,0x00,0x18,0x01,0xC0,0x00,0x0E,0x00,0xE0,0x00,0x03,0x80,0x38,0x00,0x00,0xE0,0x0E,0x00,0x00,0x38,0x03,0x80,0x00, // '#' + 0x00,0x07,0x00,0x00,0x00,0x70,0x00,0x00,0x07,0x00,0x00,0x00,0x70,0x00,0x00,0x07,0x00,0x00,0x00,0x70,0x00,0x00,0x3F,0xC0,0x00,0x1F,0xFF,0x80,0x03,0xFF,0xFC,0x00,0x7E,0x07,0xE0,0x0F,0x80,0x1F,0x01,0xE0,0x00,0xF8,0x1E,0x00,0x07,0x83,0xC0,0x00,0x3C,0x3C,0x00,0x03,0xC3,0x80,0x00,0x1C,0x38,0x00,0x01,0xC3,0x80,0x00,0x1C,0x38,0x00,0x01,0xC3,0x80,0x00,0x00,0x3C,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0x00,0x00,0x01,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x7F,0x00,0x00,0x01,0xFC,0x00,0x00,0x0F,0xF8,0x00,0x00,0x1F,0xE0,0x00,0x00,0x7F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0x80,0x00,0x00,0x78,0x00,0x00,0x03,0xC0,0x00,0x00,0x1C,0x00,0x00,0x01,0xEF,0x00,0x00,0x1E,0xF0,0x00,0x01,0xEF,0x00,0x00,0x1E,0x70,0x00,0x01,0xE7,0x00,0x00,0x1E,0x78,0x00,0x03,0xC7,0xC0,0x00,0x3C,0x3E,0x00,0x07,0x81,0xF0,0x00,0xF8,0x0F,0xC0,0x7F,0x00,0x7F,0xFF,0xE0,0x03,0xFF,0xF8,0x00,0x07,0xFE,0x00,0x00,0x07,0x00,0x00,0x00,0x70,0x00,0x00,0x07,0x00,0x00,0x00,0x70,0x00,0x00,0x07,0x00,0x00, // '$' + 0x03,0xE0,0x00,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x7F,0xF0,0x00,0x00,0x01,0xE0,0xF0,0x00,0x00,0x07,0x80,0xF0,0x00,0x00,0x0E,0x00,0xE0,0x01,0x00,0x38,0x00,0xE0,0x07,0x80,0x70,0x01,0xC0,0x0E,0x00,0xE0,0x03,0x80,0x38,0x01,0xC0,0x07,0x00,0xF0,0x03,0x80,0x0E,0x01,0xC0,0x07,0x00,0x1C,0x07,0x00,0x0E,0x00,0x38,0x0E,0x00,0x1C,0x00,0x70,0x38,0x00,0x1C,0x01,0xC0,0xE0,0x00,0x3C,0x07,0x81,0xC0,0x00,0x3C,0x1E,0x07,0x00,0x00,0x3F,0xFC,0x1C,0x00,0x00,0x3F,0xE0,0x38,0x00,0x00,0x1F,0x80,0xE0,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0xE0,0x1F,0x80,0x00,0x03,0x80,0xFF,0xC0,0x00,0x07,0x03,0xFF,0xC0,0x00,0x1C,0x0F,0x87,0xC0,0x00,0x70,0x1C,0x03,0x80,0x00,0xE0,0x70,0x03,0x80,0x03,0x80,0xE0,0x07,0x00,0x0F,0x01,0xC0,0x0E,0x00,0x1C,0x03,0x80,0x0C,0x00,0x70,0x06,0x00,0x18,0x01,0xE0,0x0C,0x00,0x30,0x03,0x80,0x18,0x00,0xE0,0x0E,0x00,0x38,0x01,0xC0,0x1C,0x00,0x70,0x03,0x80,0x10,0x00,0xE0,0x07,0x00,0x00,0x00,0xE0,0x1C,0x00,0x00,0x01,0xF0,0xF8,0x00,0x00,0x01,0xFF,0xE0,0x00,0x00,0x01,0xFF,0x80,0x00,0x00,0x00,0xFC,0x00, // '%' + 0x00,0x3F,0x80,0x00,0x00,0x3F,0xF8,0x00,0x00,0x1F,0xFF,0x80,0x00,0x0F,0x83,0xE0,0x00,0x07,0xC0,0x3C,0x00,0x01,0xE0,0x07,0x00,0x00,0xF0,0x01,0xE0,0x00,0x3C,0x00,0x38,0x00,0x0F,0x00,0x0E,0x00,0x03,0xC0,0x07,0x80,0x00,0xF0,0x01,0xE0,0x00,0x3C,0x00,0x70,0x00,0x0F,0x00,0x3C,0x00,0x01,0xE0,0x1E,0x00,0x00,0x78,0x0F,0x00,0x00,0x0F,0x07,0x80,0x00,0x03,0xC7,0xC0,0x00,0x00,0x7B,0xE0,0x00,0x00,0x0F,0xF0,0x00,0x00,0x01,0xF0,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x3D,0xE0,0x00,0x00,0x1E,0x3C,0x00,0x00,0x0F,0x07,0x80,0x0E,0x07,0x80,0xF0,0x03,0x83,0xC0,0x1E,0x00,0xE1,0xE0,0x07,0xC0,0x78,0x78,0x00,0xF8,0x1E,0x1C,0x00,0x1E,0x07,0x0F,0x00,0x03,0xC1,0xC3,0xC0,0x00,0x78,0xF0,0xF0,0x00,0x0F,0x38,0x3C,0x00,0x03,0xFE,0x0F,0x00,0x00,0x7F,0x01,0xC0,0x00,0x0F,0xC0,0x78,0x00,0x01,0xF0,0x1E,0x00,0x00,0xFC,0x03,0xC0,0x00,0x7F,0x80,0xF8,0x00,0x7C,0xF0,0x1F,0xC0,0x7E,0x1E,0x01,0xFF,0xFF,0x03,0xC0,0x3F,0xFF,0x00,0xF8,0x01,0xFE,0x00,0x00, // '&' + 0x73,0x9C,0xE7,0x39,0xCC,0x63,0x19,0xCE,0x00, // ''' + 0x00,0x08,0x00,0x38,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x1C,0x00,0x70,0x01,0xE0,0x03,0x80,0x0E,0x00,0x1C,0x00,0x70,0x00,0xE0,0x03,0xC0,0x07,0x00,0x0E,0x00,0x3C,0x00,0x70,0x00,0xE0,0x03,0xC0,0x07,0x80,0x0E,0x00,0x1C,0x00,0x38,0x00,0xF0,0x01,0xE0,0x03,0xC0,0x07,0x80,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x78,0x00,0xF0,0x01,0xE0,0x03,0xC0,0x07,0x80,0x0F,0x00,0x1E,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xF0,0x01,0xE0,0x01,0xC0,0x03,0x80,0x07,0x80,0x0F,0x00,0x0E,0x00,0x1E,0x00,0x1C,0x00,0x38,0x00,0x38,0x00,0x70,0x00,0x70,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x01,0xE0,0x01,0xE0,0x01,0xE0,0x01,0xC0,0x01,0x00, // '(' + 0x40,0x01,0xC0,0x03,0xC0,0x01,0xC0,0x01,0xC0,0x03,0xC0,0x03,0x80,0x03,0x80,0x07,0x80,0x07,0x00,0x0F,0x00,0x0E,0x00,0x1E,0x00,0x1C,0x00,0x38,0x00,0x78,0x00,0x70,0x00,0xE0,0x01,0xE0,0x03,0xC0,0x03,0x80,0x07,0x00,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x78,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xE0,0x03,0xC0,0x07,0x80,0x0F,0x00,0x1E,0x00,0x38,0x00,0x70,0x01,0xE0,0x03,0xC0,0x07,0x00,0x0E,0x00,0x3C,0x00,0x70,0x00,0xE0,0x03,0xC0,0x07,0x00,0x1E,0x00,0x38,0x00,0xF0,0x01,0xC0,0x07,0x00,0x1E,0x00,0x38,0x00,0xE0,0x07,0x80,0x0E,0x00,0x08,0x00,0x00, // ')' + 0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x0E,0x00,0x00,0x07,0x00,0x00,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x01,0x00,0x70,0x04,0xF0,0x38,0x1E,0x7F,0x0C,0x3F,0x3F,0xE6,0xFF,0xC1,0xFF,0xFE,0x00,0x1F,0xF8,0x00,0x01,0xE0,0x00,0x01,0xF8,0x00,0x01,0xDC,0x00,0x01,0xE7,0x00,0x00,0xE3,0xC0,0x00,0xE0,0xF0,0x00,0xF0,0x38,0x00,0xF0,0x0E,0x00,0x70,0x07,0x80,0x78,0x01,0xC0,0x08,0x00,0x40, // '*' + 0x00,0x07,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x70,0x00,0x00,0x01,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x70,0x00,0x00,0x01,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x70,0x00,0x00,0x01,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x1C,0x00,0x0F,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xF8,0x00,0x1C,0x00,0x00,0x00,0x70,0x00,0x00,0x01,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x70,0x00,0x00,0x01,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x70,0x00,0x00,0x01,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x70,0x00,0x00, // '+' + 0x1C,0x38,0x70,0xE1,0xC7,0x8F,0x1C,0x38,0xF1,0xC7,0x8E,0x00, // ',' + 0xFF,0xFD,0xFF,0xFB,0xFF,0xF0, // '-' + 0x73,0xEF,0xBE,0x70, // '.' + 0x00,0x00,0x78,0x00,0x01,0xC0,0x00,0x07,0x00,0x00,0x3C,0x00,0x00,0xE0,0x00,0x03,0x80,0x00,0x1C,0x00,0x00,0x70,0x00,0x03,0xC0,0x00,0x0E,0x00,0x00,0x38,0x00,0x01,0xE0,0x00,0x07,0x00,0x00,0x1C,0x00,0x00,0xE0,0x00,0x03,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x38,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x1C,0x00,0x00,0xF0,0x00,0x03,0x80,0x00,0x0E,0x00,0x00,0x70,0x00,0x01,0xC0,0x00,0x0F,0x00,0x00,0x38,0x00,0x00,0xE0,0x00,0x07,0x80,0x00,0x1C,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x0E,0x00,0x00,0x78,0x00,0x01,0xC0,0x00,0x07,0x00,0x00,0x3C,0x00,0x00,0xE0,0x00,0x03,0x80,0x00,0x1C,0x00,0x00,0x70,0x00,0x03,0xC0,0x00,0x0E,0x00,0x00,0x00, // '/' + 0x00,0x3F,0x80,0x00,0x1F,0xFF,0x00,0x03,0xFF,0xF8,0x00,0x7C,0x07,0xC0,0x0F,0x00,0x1E,0x01,0xE0,0x00,0xF0,0x1C,0x00,0x07,0x03,0xC0,0x00,0x78,0x38,0x00,0x03,0x87,0x80,0x00,0x3C,0x78,0x00,0x03,0xC7,0x00,0x00,0x3C,0x70,0x00,0x01,0xC7,0x00,0x00,0x1C,0x70,0x00,0x01,0xCF,0x00,0x00,0x1E,0xF0,0x00,0x01,0xEF,0x00,0x00,0x1E,0xF0,0x00,0x01,0xEF,0x00,0x00,0x1E,0xF0,0x00,0x01,0xEF,0x00,0x00,0x1E,0xF0,0x00,0x01,0xEF,0x00,0x00,0x1E,0xF0,0x00,0x01,0xEF,0x00,0x00,0x1E,0xF0,0x00,0x01,0xEF,0x00,0x00,0x1E,0xF0,0x00,0x01,0xC7,0x00,0x00,0x1C,0x70,0x00,0x01,0xC7,0x00,0x00,0x1C,0x78,0x00,0x03,0xC7,0x80,0x00,0x3C,0x78,0x00,0x03,0xC3,0x80,0x00,0x38,0x3C,0x00,0x07,0x81,0xE0,0x00,0xF0,0x1E,0x00,0x0F,0x00,0xF8,0x01,0xE0,0x07,0xC0,0x7C,0x00,0x3F,0xFF,0x80,0x01,0xFF,0xF0,0x00,0x03,0xF8,0x00, // '0' + 0x00,0x06,0x00,0x3E,0x01,0xFE,0x07,0xFE,0x3F,0xCE,0xFF,0x0E,0xF8,0x0E,0xC0,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E, // '1' + 0x00,0x7F,0x80,0x00,0x0F,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x1F,0x81,0xFC,0x01,0xF0,0x01,0xE0,0x1E,0x00,0x07,0x81,0xE0,0x00,0x1E,0x0F,0x00,0x00,0xF0,0x70,0x00,0x07,0x87,0x80,0x00,0x1C,0x3C,0x00,0x00,0xE1,0xE0,0x00,0x07,0x8E,0x00,0x00,0x38,0x00,0x00,0x01,0xC0,0x00,0x00,0x0E,0x00,0x00,0x00,0xF0,0x00,0x00,0x07,0x00,0x00,0x00,0x78,0x00,0x00,0x03,0x80,0x00,0x00,0x3C,0x00,0x00,0x03,0xC0,0x00,0x00,0x3C,0x00,0x00,0x01,0xE0,0x00,0x00,0x1E,0x00,0x00,0x01,0xE0,0x00,0x00,0x1E,0x00,0x00,0x01,0xE0,0x00,0x00,0x1E,0x00,0x00,0x01,0xE0,0x00,0x00,0x1F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF8,0x00,0x00,0x07,0x80,0x00,0x00,0x7F,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0x9F,0xFF,0xFF,0xFC, // '2' + 0x00,0x7F,0x80,0x00,0x1F,0xFF,0x00,0x07,0xFF,0xFC,0x00,0xFC,0x07,0xE0,0x1F,0x00,0x1F,0x03,0xC0,0x00,0xF0,0x3C,0x00,0x07,0x87,0x80,0x00,0x78,0x70,0x00,0x03,0x87,0x00,0x00,0x3C,0xF0,0x00,0x03,0xCF,0x00,0x00,0x3C,0x00,0x00,0x03,0xC0,0x00,0x00,0x3C,0x00,0x00,0x03,0x80,0x00,0x00,0x78,0x00,0x00,0x07,0x00,0x00,0x00,0xF0,0x00,0x00,0x3E,0x00,0x00,0x0F,0xC0,0x00,0x7F,0xF0,0x00,0x07,0xFE,0x00,0x00,0x7F,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x1F,0x00,0x00,0x00,0xF8,0x00,0x00,0x07,0x80,0x00,0x00,0x3C,0x00,0x00,0x03,0xC0,0x00,0x00,0x1C,0x00,0x00,0x01,0xC0,0x00,0x00,0x1E,0xE0,0x00,0x01,0xEE,0x00,0x00,0x1C,0xF0,0x00,0x01,0xCF,0x00,0x00,0x3C,0x70,0x00,0x03,0xC7,0x80,0x00,0x78,0x3C,0x00,0x07,0x83,0xF0,0x01,0xF0,0x1F,0xC0,0x7E,0x00,0x7F,0xFF,0xC0,0x03,0xFF,0xF0,0x00,0x07,0xFC,0x00, // '3' + 0x00,0x00,0x1F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF8,0x00,0x00,0x07,0xF0,0x00,0x00,0x1F,0xE0,0x00,0x00,0x7B,0xC0,0x00,0x00,0xE7,0x80,0x00,0x03,0xCF,0x00,0x00,0x0F,0x1E,0x00,0x00,0x1C,0x3C,0x00,0x00,0x78,0x78,0x00,0x01,0xE0,0xF0,0x00,0x03,0x81,0xE0,0x00,0x0F,0x03,0xC0,0x00,0x3C,0x07,0x80,0x00,0x70,0x0F,0x00,0x01,0xE0,0x1E,0x00,0x03,0x80,0x3C,0x00,0x0F,0x00,0x78,0x00,0x3C,0x00,0xF0,0x00,0x70,0x01,0xE0,0x01,0xE0,0x03,0xC0,0x07,0x80,0x07,0x80,0x0E,0x00,0x0F,0x00,0x3C,0x00,0x1E,0x00,0xF0,0x00,0x3C,0x01,0xC0,0x00,0x78,0x07,0x80,0x00,0xF0,0x1F,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x0F,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xF0,0x00,0x00,0x01,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0x07,0x80,0x00,0x00,0x0F,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x3C,0x00, // '4' + 0x1F,0xFF,0xFF,0x83,0xFF,0xFF,0xF0,0x7F,0xFF,0xFE,0x0E,0x00,0x00,0x01,0xC0,0x00,0x00,0x38,0x00,0x00,0x07,0x00,0x00,0x00,0xE0,0x00,0x00,0x3C,0x00,0x00,0x07,0x80,0x00,0x00,0xF0,0x00,0x00,0x1E,0x00,0x00,0x03,0x80,0x00,0x00,0x70,0x00,0x00,0x0E,0x00,0x00,0x01,0xC0,0x00,0x00,0x38,0x7F,0x80,0x07,0x7F,0xFC,0x01,0xFF,0xFF,0xE0,0x3F,0x80,0x7E,0x07,0xC0,0x03,0xE0,0x70,0x00,0x3C,0x00,0x00,0x03,0xC0,0x00,0x00,0x78,0x00,0x00,0x07,0x80,0x00,0x00,0xF0,0x00,0x00,0x0E,0x00,0x00,0x01,0xC0,0x00,0x00,0x38,0x00,0x00,0x07,0x00,0x00,0x00,0xF0,0x00,0x00,0x1C,0xE0,0x00,0x03,0x9C,0x00,0x00,0x73,0xC0,0x00,0x1E,0x78,0x00,0x03,0xC7,0x00,0x00,0x70,0xF0,0x00,0x1E,0x0F,0x00,0x07,0x81,0xF0,0x01,0xF0,0x1F,0x80,0xFC,0x01,0xFF,0xFF,0x00,0x0F,0xFF,0x80,0x00,0x3F,0xC0,0x00, // '5' + 0x00,0x01,0xF8,0x00,0x01,0xFF,0x00,0x00,0xFF,0xE0,0x00,0x7F,0x80,0x00,0x1F,0x80,0x00,0x07,0xC0,0x00,0x01,0xE0,0x00,0x00,0x78,0x00,0x00,0x1E,0x00,0x00,0x03,0xC0,0x00,0x00,0xF0,0x00,0x00,0x1C,0x00,0x00,0x07,0x80,0x00,0x00,0xF0,0x00,0x00,0x1C,0x00,0x00,0x03,0x81,0xFC,0x00,0xF1,0xFF,0xF0,0x1E,0x7F,0xFF,0x03,0x9F,0x03,0xF0,0x77,0x80,0x1F,0x0F,0xC0,0x00,0xF1,0xF0,0x00,0x1E,0x3E,0x00,0x01,0xE7,0x80,0x00,0x1C,0xE0,0x00,0x03,0xDC,0x00,0x00,0x7B,0x80,0x00,0x0F,0x70,0x00,0x00,0xEE,0x00,0x00,0x1D,0xC0,0x00,0x03,0xB8,0x00,0x00,0x77,0x00,0x00,0x1E,0xF0,0x00,0x03,0xDE,0x00,0x00,0x79,0xC0,0x00,0x0E,0x3C,0x00,0x03,0xC7,0x80,0x00,0x78,0x78,0x00,0x1E,0x07,0x80,0x07,0xC0,0x78,0x01,0xF0,0x0F,0xC0,0xFC,0x00,0x7F,0xFF,0x00,0x07,0xFF,0x80,0x00,0x1F,0xC0,0x00, // '6' + 0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFC,0x00,0x00,0x01,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0xF0,0x00,0x00,0x07,0x00,0x00,0x00,0x78,0x00,0x00,0x03,0x80,0x00,0x00,0x1C,0x00,0x00,0x01,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0xF0,0x00,0x00,0x07,0x00,0x00,0x00,0x78,0x00,0x00,0x03,0x80,0x00,0x00,0x3C,0x00,0x00,0x01,0xC0,0x00,0x00,0x1E,0x00,0x00,0x00,0xF0,0x00,0x00,0x07,0x00,0x00,0x00,0x78,0x00,0x00,0x03,0x80,0x00,0x00,0x3C,0x00,0x00,0x01,0xC0,0x00,0x00,0x1E,0x00,0x00,0x00,0xE0,0x00,0x00,0x0F,0x00,0x00,0x00,0x78,0x00,0x00,0x07,0x80,0x00,0x00,0x3C,0x00,0x00,0x01,0xC0,0x00,0x00,0x1E,0x00,0x00,0x00,0xE0,0x00,0x00,0x0F,0x00,0x00,0x00,0x70,0x00,0x00,0x07,0x80,0x00,0x00,0x3C,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0x00,0x00,0x00,0xE0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00, // '7' + 0x00,0x7F,0xC0,0x00,0x1F,0xFF,0x00,0x07,0xFF,0xFC,0x00,0xFC,0x07,0xE0,0x1F,0x00,0x1F,0x01,0xE0,0x00,0xF0,0x3C,0x00,0x07,0x83,0x80,0x00,0x78,0x78,0x00,0x03,0xC7,0x80,0x00,0x3C,0x78,0x00,0x03,0xC7,0x80,0x00,0x1C,0x78,0x00,0x03,0xC7,0x80,0x00,0x3C,0x78,0x00,0x03,0xC3,0x80,0x00,0x38,0x3C,0x00,0x07,0x81,0xE0,0x00,0xF0,0x0F,0x00,0x1E,0x00,0x7C,0x07,0xC0,0x03,0xFF,0xF8,0x00,0x0F,0xFE,0x00,0x03,0xFF,0xF8,0x00,0xFC,0x07,0xE0,0x1F,0x00,0x1F,0x03,0xC0,0x00,0x78,0x78,0x00,0x03,0xC7,0x80,0x00,0x3C,0x70,0x00,0x01,0xEF,0x00,0x00,0x1E,0xF0,0x00,0x01,0xEE,0x00,0x00,0x0E,0xE0,0x00,0x00,0xEF,0x00,0x00,0x0E,0xF0,0x00,0x01,0xEF,0x00,0x00,0x1E,0x70,0x00,0x01,0xC7,0x80,0x00,0x3C,0x3C,0x00,0x07,0x83,0xE0,0x00,0xF8,0x1F,0xC0,0x7F,0x00,0x7F,0xFF,0xE0,0x03,0xFF,0xF8,0x00,0x07,0xFC,0x00, // '8' + 0x00,0x7F,0x80,0x00,0x3F,0xFC,0x00,0x1F,0xFF,0xE0,0x07,0xE0,0x7E,0x01,0xF0,0x03,0xE0,0x7C,0x00,0x3C,0x0F,0x00,0x03,0xC3,0xC0,0x00,0x3C,0x78,0x00,0x07,0x8E,0x00,0x00,0x73,0xC0,0x00,0x0F,0x78,0x00,0x01,0xEE,0x00,0x00,0x3D,0xC0,0x00,0x03,0xB8,0x00,0x00,0x77,0x00,0x00,0x0E,0xE0,0x00,0x01,0xDE,0x00,0x00,0x3B,0xC0,0x00,0x07,0x78,0x00,0x01,0xE7,0x00,0x00,0x3C,0xF0,0x00,0x0F,0x8F,0x00,0x03,0xF1,0xE0,0x00,0xFE,0x1F,0x00,0x3D,0xC1,0xF0,0x1F,0x38,0x1F,0xFF,0xCF,0x01,0xFF,0xE1,0xE0,0x07,0xF0,0x38,0x00,0x00,0x07,0x00,0x00,0x00,0xE0,0x00,0x00,0x3C,0x00,0x00,0x07,0x00,0x00,0x01,0xE0,0x00,0x00,0x38,0x00,0x00,0x0F,0x00,0x00,0x03,0xC0,0x00,0x01,0xF0,0x00,0x00,0x7C,0x00,0x00,0xFF,0x00,0x03,0xFF,0x80,0x00,0x7F,0xC0,0x00,0x0F,0xC0,0x00,0x00, // '9' + 0x38,0xF9,0xF3,0xE3,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x8F,0x9F,0x3E,0x38, // ':' + 0x38,0xF9,0xF3,0xE3,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE1,0xC3,0x87,0x0E,0x3C,0x78,0xE1,0xC7,0x8E,0x3C,0x70, // ';' + 0x00,0x00,0x01,0x80,0x00,0x01,0xE0,0x00,0x01,0xF8,0x00,0x01,0xF8,0x00,0x01,0xF8,0x00,0x03,0xF8,0x00,0x03,0xF8,0x00,0x03,0xF8,0x00,0x03,0xF8,0x00,0x03,0xF8,0x00,0x03,0xF8,0x00,0x03,0xF0,0x00,0x00,0xF0,0x00,0x00,0x3F,0x00,0x00,0x03,0xF0,0x00,0x00,0x3F,0x80,0x00,0x03,0xF8,0x00,0x00,0x3F,0x80,0x00,0x03,0xF8,0x00,0x00,0x1F,0x80,0x00,0x01,0xF8,0x00,0x00,0x1F,0x80,0x00,0x01,0xF8,0x00,0x00,0x1E,0x00,0x00,0x01,0x80, // '<' + 0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xEF,0xFF,0xFF,0xF8,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,0xFF,0xFF,0xBF,0xFF,0xFF,0xEF,0xFF,0xFF,0xF8, // '=' + 0x80,0x00,0x00,0x70,0x00,0x00,0x3E,0x00,0x00,0x0F,0xC0,0x00,0x01,0xFC,0x00,0x00,0x3F,0x80,0x00,0x07,0xF0,0x00,0x00,0x7E,0x00,0x00,0x0F,0xE0,0x00,0x01,0xFC,0x00,0x00,0x3F,0x80,0x00,0x07,0xE0,0x00,0x00,0xF0,0x00,0x01,0xF8,0x00,0x03,0xF8,0x00,0x07,0xF0,0x00,0x0F,0xE0,0x00,0x3F,0x80,0x00,0x7F,0x00,0x00,0xFE,0x00,0x01,0xFC,0x00,0x03,0xF0,0x00,0x03,0xE0,0x00,0x01,0xC0,0x00,0x00,0x80,0x00,0x00,0x00, // '>' + 0x00,0xFE,0x00,0x07,0xFF,0xC0,0x0F,0xFF,0xE0,0x1F,0x81,0xF0,0x3E,0x00,0xF8,0x7C,0x00,0x78,0x78,0x00,0x3C,0x70,0x00,0x1C,0xF0,0x00,0x1C,0xF0,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0xF0,0x00,0x01,0xE0,0x00,0x03,0xC0,0x00,0x07,0x80,0x00,0x0F,0x00,0x00,0x1E,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x78,0x00,0x00,0xF8,0x00,0x00,0x78,0x00,0x00,0x70,0x00, // '?' + 0x00,0x00,0x07,0xFE,0x00,0x00,0x00,0x00,0x1F,0xFF,0xF8,0x00,0x00,0x00,0x1F,0xFF,0xFF,0x80,0x00,0x00,0x1F,0xE0,0x07,0xF8,0x00,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x0F,0xC0,0x00,0x01,0xF0,0x00,0x07,0xC0,0x00,0x00,0x3E,0x00,0x03,0xE0,0x00,0x00,0x03,0x80,0x01,0xF0,0x00,0x00,0x00,0x70,0x00,0x78,0x00,0x00,0x00,0x0E,0x00,0x3C,0x00,0x00,0x00,0x03,0x80,0x1E,0x00,0x00,0x00,0x00,0x70,0x07,0x00,0x00,0x00,0x00,0x1C,0x03,0xC0,0x00,0x7F,0x00,0x03,0x80,0xE0,0x00,0x7F,0xF0,0x00,0xE0,0x78,0x00,0x3F,0xFE,0x00,0x18,0x1C,0x00,0x1F,0x07,0xC0,0x07,0x07,0x00,0x0F,0x00,0x70,0x01,0xC3,0x80,0x07,0x80,0x1C,0x00,0x70,0xE0,0x01,0xC0,0x07,0x00,0x1C,0x38,0x00,0xF0,0x01,0xC0,0x03,0x1C,0x00,0x38,0x00,0x70,0x00,0xC7,0x00,0x1E,0x00,0x1C,0x00,0x31,0xC0,0x07,0x00,0x07,0x00,0x0C,0x70,0x01,0xC0,0x01,0xC0,0x03,0x9C,0x00,0xF0,0x00,0x70,0x00,0xE7,0x00,0x38,0x00,0x38,0x00,0x31,0xC0,0x0E,0x00,0x0E,0x00,0x0C,0x70,0x03,0x80,0x03,0x80,0x03,0x1C,0x00,0xE0,0x00,0xE0,0x00,0xC7,0x00,0x38,0x00,0x38,0x00,0x71,0xC0,0x0E,0x00,0x0E,0x00,0x1C,0x70,0x03,0x80,0x03,0x80,0x07,0x1C,0x00,0xE0,0x00,0xE0,0x01,0x87,0x00,0x38,0x00,0x78,0x00,0xE1,0xC0,0x0E,0x00,0x1E,0x00,0x38,0x70,0x03,0x80,0x0F,0x80,0x1C,0x0E,0x00,0xF0,0x07,0xE0,0x07,0x03,0x80,0x1E,0x03,0xBC,0x03,0x80,0xE0,0x07,0xC1,0xE7,0x81,0xC0,0x3C,0x00,0xFF,0xF1,0xFF,0xF0,0x07,0x00,0x1F,0xF0,0x3F,0xF0,0x01,0xE0,0x03,0xF0,0x03,0xF0,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x00,0x0C,0x00,0x00,0x00,0x7F,0x80,0x3F,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x00,0x00,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x03,0xFF,0x00,0x00,0x00, // '@' + 0x00,0x00,0xE0,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x01,0xF0,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x03,0xB8,0x00,0x00,0x00,0x3B,0x80,0x00,0x00,0x07,0xBC,0x00,0x00,0x00,0x71,0xC0,0x00,0x00,0x07,0x1C,0x00,0x00,0x00,0xF1,0xE0,0x00,0x00,0x0E,0x0E,0x00,0x00,0x01,0xE0,0xF0,0x00,0x00,0x1E,0x0F,0x00,0x00,0x01,0xC0,0x70,0x00,0x00,0x3C,0x07,0x80,0x00,0x03,0x80,0x78,0x00,0x00,0x38,0x03,0x80,0x00,0x07,0x80,0x3C,0x00,0x00,0x70,0x01,0xC0,0x00,0x0F,0x00,0x1E,0x00,0x00,0xF0,0x01,0xE0,0x00,0x0E,0x00,0x0E,0x00,0x01,0xE0,0x00,0xF0,0x00,0x1E,0x00,0x0F,0x00,0x01,0xC0,0x00,0x70,0x00,0x3C,0x00,0x07,0x80,0x03,0xC0,0x00,0x78,0x00,0x78,0x00,0x03,0xC0,0x07,0xFF,0xFF,0xFC,0x00,0x7F,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xFE,0x00,0xF0,0x00,0x01,0xE0,0x0E,0x00,0x00,0x0E,0x01,0xE0,0x00,0x00,0xF0,0x1E,0x00,0x00,0x0F,0x03,0xC0,0x00,0x00,0x78,0x3C,0x00,0x00,0x07,0x83,0x80,0x00,0x00,0x38,0x78,0x00,0x00,0x03,0xC7,0x80,0x00,0x00,0x3C,0x70,0x00,0x00,0x01,0xCF,0x00,0x00,0x00,0x1E,0xF0,0x00,0x00,0x01,0xE0, // 'A' + 0xFF,0xFF,0x80,0x07,0xFF,0xFF,0x80,0x3F,0xFF,0xFF,0x01,0xC0,0x00,0xFC,0x0E,0x00,0x01,0xF0,0x70,0x00,0x07,0xC3,0x80,0x00,0x1E,0x1C,0x00,0x00,0x78,0xE0,0x00,0x03,0xC7,0x00,0x00,0x1E,0x38,0x00,0x00,0xF1,0xC0,0x00,0x07,0x8E,0x00,0x00,0x3C,0x70,0x00,0x01,0xE3,0x80,0x00,0x0E,0x1C,0x00,0x00,0xF0,0xE0,0x00,0x0F,0x07,0x00,0x00,0xF8,0x38,0x00,0x1F,0x81,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0x00,0x7F,0xFF,0xFE,0x03,0x80,0x00,0xFC,0x1C,0x00,0x01,0xF0,0xE0,0x00,0x07,0xC7,0x00,0x00,0x1E,0x38,0x00,0x00,0x79,0xC0,0x00,0x03,0xCE,0x00,0x00,0x0E,0x70,0x00,0x00,0x73,0x80,0x00,0x03,0xDC,0x00,0x00,0x1E,0xE0,0x00,0x00,0xE7,0x00,0x00,0x07,0x38,0x00,0x00,0x79,0xC0,0x00,0x03,0xCE,0x00,0x00,0x3C,0x70,0x00,0x03,0xE3,0x80,0x00,0x3E,0x1C,0x00,0x07,0xE0,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xC0,0x3F,0xFF,0xF0,0x00, // 'B' + 0x00,0x0F,0xF8,0x00,0x00,0x3F,0xFF,0x80,0x00,0x7F,0xFF,0xE0,0x00,0x7F,0x01,0xFC,0x00,0x7C,0x00,0x1F,0x00,0x7C,0x00,0x07,0xC0,0x7C,0x00,0x01,0xE0,0x3C,0x00,0x00,0x78,0x3C,0x00,0x00,0x3C,0x1E,0x00,0x00,0x0F,0x1E,0x00,0x00,0x07,0x8F,0x00,0x00,0x01,0xC7,0x00,0x00,0x00,0xE7,0x80,0x00,0x00,0x7B,0xC0,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x03,0xC0,0x00,0x00,0x3C,0xE0,0x00,0x00,0x1C,0x78,0x00,0x00,0x0E,0x3C,0x00,0x00,0x0F,0x0F,0x00,0x00,0x07,0x87,0x80,0x00,0x07,0x81,0xE0,0x00,0x03,0xC0,0xF8,0x00,0x03,0xC0,0x3E,0x00,0x03,0xE0,0x0F,0x80,0x03,0xE0,0x03,0xF0,0x0F,0xE0,0x00,0xFF,0xFF,0xC0,0x00,0x1F,0xFF,0xC0,0x00,0x01,0xFF,0x00,0x00, // 'C' + 0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xF0,0x07,0x80,0x07,0xF0,0x0F,0x00,0x01,0xF0,0x1E,0x00,0x00,0xF0,0x3C,0x00,0x00,0xF0,0x78,0x00,0x00,0xF0,0xF0,0x00,0x00,0xF1,0xE0,0x00,0x01,0xE3,0xC0,0x00,0x01,0xE7,0x80,0x00,0x03,0xCF,0x00,0x00,0x03,0x9E,0x00,0x00,0x07,0xBC,0x00,0x00,0x0F,0x78,0x00,0x00,0x1E,0xF0,0x00,0x00,0x1D,0xE0,0x00,0x00,0x3B,0xC0,0x00,0x00,0x77,0x80,0x00,0x00,0xEF,0x00,0x00,0x01,0xDE,0x00,0x00,0x03,0xBC,0x00,0x00,0x07,0x78,0x00,0x00,0x0E,0xF0,0x00,0x00,0x1D,0xE0,0x00,0x00,0x3B,0xC0,0x00,0x00,0x77,0x80,0x00,0x01,0xEF,0x00,0x00,0x03,0xDE,0x00,0x00,0x07,0xBC,0x00,0x00,0x0E,0x78,0x00,0x00,0x3C,0xF0,0x00,0x00,0x79,0xE0,0x00,0x01,0xE3,0xC0,0x00,0x03,0xC7,0x80,0x00,0x0F,0x0F,0x00,0x00,0x3C,0x1E,0x00,0x01,0xF0,0x3C,0x00,0x07,0xC0,0x78,0x00,0x7F,0x00,0xFF,0xFF,0xFC,0x01,0xFF,0xFF,0xE0,0x03,0xFF,0xFE,0x00,0x00, // 'D' + 0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xEF,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xF0,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xE0, // 'E' + 0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xEF,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xF0,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x00, // 'F' + 0x00,0x0F,0xF8,0x00,0x00,0x1F,0xFF,0x80,0x00,0x3F,0xFF,0xF0,0x00,0x7F,0x00,0xFE,0x00,0x7E,0x00,0x1F,0x80,0x7C,0x00,0x03,0xC0,0x3C,0x00,0x00,0xF0,0x3C,0x00,0x00,0x3C,0x3C,0x00,0x00,0x1E,0x1E,0x00,0x00,0x07,0x0E,0x00,0x00,0x03,0xCF,0x00,0x00,0x01,0xE7,0x80,0x00,0x00,0x73,0x80,0x00,0x00,0x01,0xC0,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x03,0xC0,0x00,0x00,0x01,0xE0,0x00,0xFF,0xFE,0xF0,0x00,0x7F,0xFF,0x78,0x00,0x3F,0xFF,0xBC,0x00,0x00,0x01,0xDE,0x00,0x00,0x00,0xE7,0x00,0x00,0x00,0x73,0x80,0x00,0x00,0x39,0xE0,0x00,0x00,0x1C,0xF0,0x00,0x00,0x0E,0x78,0x00,0x00,0x07,0x1E,0x00,0x00,0x03,0x8F,0x00,0x00,0x01,0xC3,0xC0,0x00,0x00,0xE1,0xF0,0x00,0x00,0x70,0x78,0x00,0x00,0x78,0x1F,0x00,0x00,0x7C,0x07,0xC0,0x00,0xFC,0x01,0xFC,0x03,0xFC,0x00,0x7F,0xFF,0xFC,0x00,0x0F,0xFF,0xF0,0x00,0x00,0xFF,0xC0,0x00, // 'G' + 0xF0,0x00,0x00,0x0F,0x78,0x00,0x00,0x07,0xBC,0x00,0x00,0x03,0xDE,0x00,0x00,0x01,0xEF,0x00,0x00,0x00,0xF7,0x80,0x00,0x00,0x7B,0xC0,0x00,0x00,0x3D,0xE0,0x00,0x00,0x1E,0xF0,0x00,0x00,0x0F,0x78,0x00,0x00,0x07,0xBC,0x00,0x00,0x03,0xDE,0x00,0x00,0x01,0xEF,0x00,0x00,0x00,0xF7,0x80,0x00,0x00,0x7B,0xC0,0x00,0x00,0x3D,0xE0,0x00,0x00,0x1E,0xF0,0x00,0x00,0x0F,0x78,0x00,0x00,0x07,0xBC,0x00,0x00,0x03,0xDF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFB,0xC0,0x00,0x00,0x3D,0xE0,0x00,0x00,0x1E,0xF0,0x00,0x00,0x0F,0x78,0x00,0x00,0x07,0xBC,0x00,0x00,0x03,0xDE,0x00,0x00,0x01,0xEF,0x00,0x00,0x00,0xF7,0x80,0x00,0x00,0x7B,0xC0,0x00,0x00,0x3D,0xE0,0x00,0x00,0x1E,0xF0,0x00,0x00,0x0F,0x78,0x00,0x00,0x07,0xBC,0x00,0x00,0x03,0xDE,0x00,0x00,0x01,0xEF,0x00,0x00,0x00,0xF7,0x80,0x00,0x00,0x7B,0xC0,0x00,0x00,0x3D,0xE0,0x00,0x00,0x1E,0xF0,0x00,0x00,0x0F,0x78,0x00,0x00,0x07,0xBC,0x00,0x00,0x03,0xC0, // 'H' + 0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBC, // 'I' + 0x00,0x00,0x03,0xC0,0x00,0x00,0x78,0x00,0x00,0x0F,0x00,0x00,0x01,0xE0,0x00,0x00,0x3C,0x00,0x00,0x07,0x80,0x00,0x00,0xF0,0x00,0x00,0x1E,0x00,0x00,0x03,0xC0,0x00,0x00,0x78,0x00,0x00,0x0F,0x00,0x00,0x01,0xE0,0x00,0x00,0x3C,0x00,0x00,0x07,0x80,0x00,0x00,0xF0,0x00,0x00,0x1E,0x00,0x00,0x03,0xC0,0x00,0x00,0x78,0x00,0x00,0x0F,0x00,0x00,0x01,0xE0,0x00,0x00,0x3C,0x00,0x00,0x07,0x80,0x00,0x00,0xF0,0x00,0x00,0x1E,0x00,0x00,0x03,0xC0,0x00,0x00,0x78,0x00,0x00,0x0F,0x00,0x00,0x01,0xE0,0x00,0x00,0x3C,0x00,0x00,0x07,0x80,0x00,0x00,0xF0,0x00,0x00,0x1E,0xF0,0x00,0x03,0xDE,0x00,0x00,0x7B,0xC0,0x00,0x0E,0x78,0x00,0x03,0xC7,0x80,0x00,0x78,0xF0,0x00,0x1E,0x0F,0x00,0x07,0xC1,0xF0,0x01,0xF0,0x1F,0x80,0xFC,0x01,0xFF,0xFF,0x00,0x0F,0xFF,0xC0,0x00,0x3F,0xC0,0x00, // 'J' + 0xF0,0x00,0x00,0x7C,0x78,0x00,0x00,0x7C,0x3C,0x00,0x00,0x3C,0x1E,0x00,0x00,0x3C,0x0F,0x00,0x00,0x3C,0x07,0x80,0x00,0x3C,0x03,0xC0,0x00,0x3C,0x01,0xE0,0x00,0x3C,0x00,0xF0,0x00,0x3E,0x00,0x78,0x00,0x3E,0x00,0x3C,0x00,0x3E,0x00,0x1E,0x00,0x3E,0x00,0x0F,0x00,0x3E,0x00,0x07,0x80,0x3E,0x00,0x03,0xC0,0x3E,0x00,0x01,0xE0,0x3E,0x00,0x00,0xF0,0x3E,0x00,0x00,0x78,0x3E,0x00,0x00,0x3C,0x3E,0x00,0x00,0x1E,0x1F,0x00,0x00,0x0F,0x1F,0xC0,0x00,0x07,0x9F,0xF0,0x00,0x03,0xDE,0x78,0x00,0x01,0xFE,0x1E,0x00,0x00,0xFE,0x0F,0x80,0x00,0x7E,0x03,0xE0,0x00,0x3E,0x00,0xF8,0x00,0x1E,0x00,0x3C,0x00,0x0F,0x00,0x0F,0x00,0x07,0x80,0x07,0xC0,0x03,0xC0,0x01,0xF0,0x01,0xE0,0x00,0x7C,0x00,0xF0,0x00,0x1E,0x00,0x78,0x00,0x07,0x80,0x3C,0x00,0x01,0xE0,0x1E,0x00,0x00,0xF8,0x0F,0x00,0x00,0x3E,0x07,0x80,0x00,0x0F,0x03,0xC0,0x00,0x03,0xC1,0xE0,0x00,0x00,0xF0,0xF0,0x00,0x00,0x7C,0x78,0x00,0x00,0x1F,0x3C,0x00,0x00,0x07,0xC0, // 'K' + 0xF0,0x00,0x00,0x3C,0x00,0x00,0x0F,0x00,0x00,0x03,0xC0,0x00,0x00,0xF0,0x00,0x00,0x3C,0x00,0x00,0x0F,0x00,0x00,0x03,0xC0,0x00,0x00,0xF0,0x00,0x00,0x3C,0x00,0x00,0x0F,0x00,0x00,0x03,0xC0,0x00,0x00,0xF0,0x00,0x00,0x3C,0x00,0x00,0x0F,0x00,0x00,0x03,0xC0,0x00,0x00,0xF0,0x00,0x00,0x3C,0x00,0x00,0x0F,0x00,0x00,0x03,0xC0,0x00,0x00,0xF0,0x00,0x00,0x3C,0x00,0x00,0x0F,0x00,0x00,0x03,0xC0,0x00,0x00,0xF0,0x00,0x00,0x3C,0x00,0x00,0x0F,0x00,0x00,0x03,0xC0,0x00,0x00,0xF0,0x00,0x00,0x3C,0x00,0x00,0x0F,0x00,0x00,0x03,0xC0,0x00,0x00,0xF0,0x00,0x00,0x3C,0x00,0x00,0x0F,0x00,0x00,0x03,0xC0,0x00,0x00,0xF0,0x00,0x00,0x3C,0x00,0x00,0x0F,0x00,0x00,0x03,0xC0,0x00,0x00,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xEF,0xFF,0xFF,0xF8, // 'L' + 0xF8,0x00,0x00,0x00,0x0F,0xDF,0x80,0x00,0x00,0x01,0xFB,0xF0,0x00,0x00,0x00,0x3F,0x7F,0x00,0x00,0x00,0x0F,0xEF,0xE0,0x00,0x00,0x01,0xFD,0xFC,0x00,0x00,0x00,0x7F,0xBF,0xC0,0x00,0x00,0x0F,0xF7,0xB8,0x00,0x00,0x01,0xDE,0xF7,0x80,0x00,0x00,0x7B,0xDE,0xF0,0x00,0x00,0x0E,0x7B,0xCF,0x00,0x00,0x03,0xCF,0x79,0xE0,0x00,0x00,0x79,0xEF,0x1C,0x00,0x00,0x1E,0x3D,0xE3,0xC0,0x00,0x03,0xC7,0xBC,0x38,0x00,0x00,0x70,0xF7,0x87,0x80,0x00,0x1E,0x1E,0xF0,0xF0,0x00,0x03,0x83,0xDE,0x0E,0x00,0x00,0xF0,0x7B,0xC1,0xE0,0x00,0x1E,0x0F,0x78,0x1C,0x00,0x03,0x81,0xEF,0x03,0xC0,0x00,0xF0,0x3D,0xE0,0x38,0x00,0x1C,0x07,0xBC,0x07,0x00,0x07,0x80,0xF7,0x80,0xF0,0x00,0xE0,0x1E,0xF0,0x0E,0x00,0x3C,0x03,0xDE,0x01,0xE0,0x07,0x80,0x7B,0xC0,0x1C,0x00,0xE0,0x0F,0x78,0x03,0xC0,0x3C,0x01,0xEF,0x00,0x78,0x07,0x00,0x3D,0xE0,0x07,0x01,0xE0,0x07,0xBC,0x00,0xF0,0x3C,0x00,0xF7,0x80,0x0E,0x07,0x00,0x1E,0xF0,0x01,0xE1,0xE0,0x03,0xDE,0x00,0x1C,0x38,0x00,0x7B,0xC0,0x03,0x8F,0x00,0x0F,0x78,0x00,0x79,0xC0,0x01,0xEF,0x00,0x07,0x78,0x00,0x3D,0xE0,0x00,0xFF,0x00,0x07,0xBC,0x00,0x0F,0xC0,0x00,0xF7,0x80,0x01,0xF8,0x00,0x1E,0xF0,0x00,0x3E,0x00,0x03,0xDE,0x00,0x03,0xC0,0x00,0x7B,0xC0,0x00,0x78,0x00,0x0F,0x00, // 'M' + 0xF0,0x00,0x00,0x0E,0xF0,0x00,0x00,0x0E,0xF8,0x00,0x00,0x0E,0xFC,0x00,0x00,0x0E,0xFC,0x00,0x00,0x0E,0xFE,0x00,0x00,0x0E,0xEF,0x00,0x00,0x0E,0xEF,0x00,0x00,0x0E,0xE7,0x80,0x00,0x0E,0xE3,0xC0,0x00,0x0E,0xE3,0xC0,0x00,0x0E,0xE1,0xE0,0x00,0x0E,0xE0,0xF0,0x00,0x0E,0xE0,0xF0,0x00,0x0E,0xE0,0x78,0x00,0x0E,0xE0,0x3C,0x00,0x0E,0xE0,0x3C,0x00,0x0E,0xE0,0x1E,0x00,0x0E,0xE0,0x0F,0x00,0x0E,0xE0,0x0F,0x00,0x0E,0xE0,0x07,0x80,0x0E,0xE0,0x03,0xC0,0x0E,0xE0,0x03,0xC0,0x0E,0xE0,0x01,0xE0,0x0E,0xE0,0x00,0xF0,0x0E,0xE0,0x00,0xF0,0x0E,0xE0,0x00,0x78,0x0E,0xE0,0x00,0x3C,0x0E,0xE0,0x00,0x3C,0x0E,0xE0,0x00,0x1E,0x0E,0xE0,0x00,0x0F,0x0E,0xE0,0x00,0x0F,0x0E,0xE0,0x00,0x07,0x8E,0xE0,0x00,0x03,0xCE,0xE0,0x00,0x03,0xCE,0xE0,0x00,0x01,0xEE,0xE0,0x00,0x00,0xFE,0xE0,0x00,0x00,0xFE,0xE0,0x00,0x00,0x7E,0xE0,0x00,0x00,0x3E,0xE0,0x00,0x00,0x3E,0xE0,0x00,0x00,0x1E,0xE0,0x00,0x00,0x0E, // 'N' + 0x00,0x0F,0xF8,0x00,0x00,0x1F,0xFF,0x80,0x00,0x0F,0xFF,0xF8,0x00,0x0F,0xE0,0x3F,0x80,0x07,0xC0,0x01,0xF0,0x03,0xE0,0x00,0x3E,0x00,0xF0,0x00,0x07,0x80,0x78,0x00,0x00,0xF0,0x3C,0x00,0x00,0x1E,0x0F,0x00,0x00,0x07,0x87,0x80,0x00,0x00,0xF1,0xE0,0x00,0x00,0x3C,0x70,0x00,0x00,0x07,0x1C,0x00,0x00,0x01,0xCF,0x00,0x00,0x00,0x7B,0xC0,0x00,0x00,0x1E,0xF0,0x00,0x00,0x07,0xBC,0x00,0x00,0x01,0xEE,0x00,0x00,0x00,0x7B,0x80,0x00,0x00,0x1E,0xE0,0x00,0x00,0x07,0xB8,0x00,0x00,0x01,0xEE,0x00,0x00,0x00,0x7B,0x80,0x00,0x00,0x1E,0xE0,0x00,0x00,0x07,0xB8,0x00,0x00,0x01,0xEF,0x00,0x00,0x00,0x7B,0xC0,0x00,0x00,0x1E,0xF0,0x00,0x00,0x07,0xBC,0x00,0x00,0x01,0xE7,0x00,0x00,0x00,0x71,0xC0,0x00,0x00,0x1C,0x78,0x00,0x00,0x0F,0x1E,0x00,0x00,0x03,0xC3,0xC0,0x00,0x01,0xE0,0xF0,0x00,0x00,0x78,0x1E,0x00,0x00,0x3C,0x03,0xC0,0x00,0x1F,0x00,0xF8,0x00,0x0F,0x80,0x1F,0x00,0x07,0xC0,0x03,0xF8,0x0F,0xE0,0x00,0x3F,0xFF,0xE0,0x00,0x07,0xFF,0xF0,0x00,0x00,0x3F,0xE0,0x00, // 'O' + 0xFF,0xFF,0xF0,0x03,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x3C,0x00,0x07,0xF0,0xF0,0x00,0x07,0xE3,0xC0,0x00,0x07,0x8F,0x00,0x00,0x0F,0x3C,0x00,0x00,0x3C,0xF0,0x00,0x00,0x7B,0xC0,0x00,0x01,0xEF,0x00,0x00,0x03,0xBC,0x00,0x00,0x0E,0xF0,0x00,0x00,0x3B,0xC0,0x00,0x00,0xEF,0x00,0x00,0x03,0xBC,0x00,0x00,0x1E,0xF0,0x00,0x00,0x7B,0xC0,0x00,0x01,0xEF,0x00,0x00,0x0F,0x3C,0x00,0x00,0x7C,0xF0,0x00,0x03,0xE3,0xC0,0x00,0x7F,0x0F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0x80,0xFF,0xFF,0xF0,0x03,0xC0,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,0x00,0x03,0xC0,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,0x00,0x03,0xC0,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,0x00,0x03,0xC0,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,0x00,0x03,0xC0,0x00,0x00,0x0F,0x00,0x00,0x00,0x00, // 'P' + 0x00,0x0F,0xF0,0x00,0x00,0x1F,0xFF,0x80,0x00,0x0F,0xFF,0xF8,0x00,0x0F,0xE0,0x3F,0x80,0x07,0xC0,0x03,0xF0,0x03,0xE0,0x00,0x3E,0x01,0xF0,0x00,0x07,0x80,0x78,0x00,0x00,0xF0,0x3C,0x00,0x00,0x1C,0x0F,0x00,0x00,0x07,0x87,0x80,0x00,0x00,0xE1,0xE0,0x00,0x00,0x3C,0x70,0x00,0x00,0x0F,0x3C,0x00,0x00,0x01,0xCF,0x00,0x00,0x00,0x7B,0xC0,0x00,0x00,0x1E,0xF0,0x00,0x00,0x07,0xB8,0x00,0x00,0x01,0xEE,0x00,0x00,0x00,0x7B,0x80,0x00,0x00,0x1E,0xE0,0x00,0x00,0x07,0xB8,0x00,0x00,0x01,0xEE,0x00,0x00,0x00,0x7B,0x80,0x00,0x00,0x1E,0xE0,0x00,0x00,0x07,0xB8,0x00,0x00,0x01,0xEE,0x00,0x00,0x00,0x7B,0x80,0x00,0x00,0x1E,0xF0,0x00,0x00,0x07,0xBC,0x00,0x00,0x01,0xEF,0x00,0x00,0x00,0x71,0xC0,0x00,0x00,0x3C,0x78,0x00,0x00,0x0F,0x1E,0x00,0x00,0x03,0x83,0xC0,0x00,0x01,0xE0,0xF0,0x00,0x00,0x78,0x1E,0x00,0x00,0x3C,0x07,0xC0,0x00,0x1E,0x00,0xF8,0x00,0x0F,0x80,0x1F,0x00,0x07,0xC0,0x03,0xF8,0x0F,0xE0,0x00,0x3F,0xFF,0xE0,0x00,0x07,0xFF,0xF8,0x00,0x00,0x3F,0xFF,0x80,0x00,0x00,0x01,0xF0,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x07,0xC0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x40, // 'Q' + 0xFF,0xFF,0xE0,0x01,0xFF,0xFF,0xF8,0x03,0xFF,0xFF,0xFC,0x07,0x80,0x01,0xFC,0x0F,0x00,0x00,0x7C,0x1E,0x00,0x00,0x7C,0x3C,0x00,0x00,0x78,0x78,0x00,0x00,0x78,0xF0,0x00,0x00,0xF1,0xE0,0x00,0x00,0xE3,0xC0,0x00,0x01,0xC7,0x80,0x00,0x03,0xCF,0x00,0x00,0x07,0x9E,0x00,0x00,0x0F,0x3C,0x00,0x00,0x1E,0x78,0x00,0x00,0x38,0xF0,0x00,0x00,0xF1,0xE0,0x00,0x01,0xE3,0xC0,0x00,0x07,0x87,0x80,0x00,0x1F,0x0F,0x00,0x00,0x7C,0x1E,0x00,0x07,0xF0,0x3F,0xFF,0xFF,0xC0,0x7F,0xFF,0xFE,0x00,0xFF,0xFF,0xF0,0x01,0xE0,0x00,0xF0,0x03,0xC0,0x01,0xE0,0x07,0x80,0x01,0xE0,0x0F,0x00,0x03,0xC0,0x1E,0x00,0x03,0xC0,0x3C,0x00,0x07,0x80,0x78,0x00,0x07,0x80,0xF0,0x00,0x07,0x81,0xE0,0x00,0x0F,0x03,0xC0,0x00,0x0F,0x07,0x80,0x00,0x1E,0x0F,0x00,0x00,0x1E,0x1E,0x00,0x00,0x3C,0x3C,0x00,0x00,0x3C,0x78,0x00,0x00,0x3C,0xF0,0x00,0x00,0x79,0xE0,0x00,0x00,0x7B,0xC0,0x00,0x00,0xF0, // 'R' + 0x00,0x1F,0xF0,0x00,0x01,0xFF,0xFC,0x00,0x0F,0xFF,0xFE,0x00,0x3F,0x00,0xFE,0x00,0xF8,0x00,0x3E,0x03,0xC0,0x00,0x3E,0x0F,0x00,0x00,0x3C,0x1E,0x00,0x00,0x3C,0x78,0x00,0x00,0x38,0xF0,0x00,0x00,0x79,0xE0,0x00,0x00,0xF3,0xC0,0x00,0x01,0xE7,0x80,0x00,0x03,0xCF,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0xC0,0x00,0x00,0x0F,0xF0,0x00,0x00,0x07,0xFC,0x00,0x00,0x03,0xFF,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x1F,0xC0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x07,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x0F,0x70,0x00,0x00,0x0E,0xE0,0x00,0x00,0x1D,0xE0,0x00,0x00,0x3B,0xC0,0x00,0x00,0x73,0x80,0x00,0x01,0xE7,0x80,0x00,0x03,0xCF,0x80,0x00,0x0F,0x0F,0x80,0x00,0x3E,0x0F,0xC0,0x00,0xF8,0x0F,0xE0,0x0F,0xE0,0x07,0xFF,0xFF,0x80,0x03,0xFF,0xFC,0x00,0x00,0xFF,0xC0,0x00, // 'S' + 0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xC0,0x00,0x78,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x03,0xC0,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x03,0xC0,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x03,0xC0,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x03,0xC0,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x03,0xC0,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00, // 'T' + 0xE0,0x00,0x00,0x3D,0xC0,0x00,0x00,0x7B,0x80,0x00,0x00,0xF7,0x00,0x00,0x01,0xEE,0x00,0x00,0x03,0xDC,0x00,0x00,0x07,0xB8,0x00,0x00,0x0F,0x70,0x00,0x00,0x1E,0xE0,0x00,0x00,0x3D,0xC0,0x00,0x00,0x7B,0x80,0x00,0x00,0xF7,0x00,0x00,0x01,0xEE,0x00,0x00,0x03,0xDC,0x00,0x00,0x07,0xB8,0x00,0x00,0x0F,0x70,0x00,0x00,0x1E,0xE0,0x00,0x00,0x3D,0xC0,0x00,0x00,0x7B,0x80,0x00,0x00,0xF7,0x00,0x00,0x01,0xEE,0x00,0x00,0x03,0xDC,0x00,0x00,0x07,0xB8,0x00,0x00,0x0F,0x70,0x00,0x00,0x1E,0xE0,0x00,0x00,0x3D,0xC0,0x00,0x00,0x7B,0x80,0x00,0x00,0xF7,0x00,0x00,0x01,0xEE,0x00,0x00,0x03,0xDC,0x00,0x00,0x07,0xB8,0x00,0x00,0x0F,0x70,0x00,0x00,0x1C,0xE0,0x00,0x00,0x39,0xE0,0x00,0x00,0xF3,0xC0,0x00,0x01,0xE3,0x80,0x00,0x03,0xC7,0x80,0x00,0x0F,0x0F,0x80,0x00,0x3E,0x0F,0x80,0x00,0xF8,0x0F,0x80,0x03,0xE0,0x0F,0xE0,0x3F,0x80,0x0F,0xFF,0xFE,0x00,0x07,0xFF,0xF0,0x00,0x01,0xFF,0x00,0x00, // 'U' + 0xF0,0x00,0x00,0x01,0xEF,0x00,0x00,0x00,0x1E,0x78,0x00,0x00,0x03,0xC7,0x80,0x00,0x00,0x3C,0x38,0x00,0x00,0x03,0x83,0xC0,0x00,0x00,0x78,0x3C,0x00,0x00,0x07,0x81,0xC0,0x00,0x00,0xF0,0x1E,0x00,0x00,0x0F,0x01,0xE0,0x00,0x00,0xF0,0x0F,0x00,0x00,0x1E,0x00,0xF0,0x00,0x01,0xE0,0x07,0x00,0x00,0x1E,0x00,0x78,0x00,0x03,0xC0,0x07,0x80,0x00,0x3C,0x00,0x38,0x00,0x03,0x80,0x03,0xC0,0x00,0x78,0x00,0x3C,0x00,0x07,0x80,0x01,0xC0,0x00,0x70,0x00,0x1E,0x00,0x0F,0x00,0x01,0xE0,0x00,0xF0,0x00,0x0E,0x00,0x1E,0x00,0x00,0xF0,0x01,0xE0,0x00,0x07,0x00,0x1C,0x00,0x00,0x78,0x03,0xC0,0x00,0x07,0x80,0x3C,0x00,0x00,0x38,0x03,0x80,0x00,0x03,0xC0,0x78,0x00,0x00,0x3C,0x07,0x80,0x00,0x01,0xC0,0x70,0x00,0x00,0x1E,0x0F,0x00,0x00,0x00,0xE0,0xF0,0x00,0x00,0x0E,0x0E,0x00,0x00,0x00,0xF1,0xE0,0x00,0x00,0x07,0x1C,0x00,0x00,0x00,0x71,0xC0,0x00,0x00,0x07,0xBC,0x00,0x00,0x00,0x3B,0x80,0x00,0x00,0x03,0xB8,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x01,0xF0,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0xE0,0x00,0x00, // 'V' + 0xF0,0x00,0x01,0xE0,0x00,0x03,0xDE,0x00,0x00,0x3C,0x00,0x00,0x7B,0xC0,0x00,0x07,0x80,0x00,0x0F,0x38,0x00,0x01,0xF8,0x00,0x01,0xC7,0x80,0x00,0x3F,0x00,0x00,0x78,0xF0,0x00,0x07,0xE0,0x00,0x0F,0x1E,0x00,0x00,0xFE,0x00,0x01,0xE1,0xC0,0x00,0x3D,0xC0,0x00,0x38,0x3C,0x00,0x07,0x38,0x00,0x0F,0x07,0x80,0x00,0xE7,0x00,0x01,0xE0,0xF0,0x00,0x3C,0x70,0x00,0x3C,0x0E,0x00,0x07,0x0E,0x00,0x07,0x01,0xE0,0x00,0xE1,0xC0,0x01,0xE0,0x3C,0x00,0x1C,0x3C,0x00,0x3C,0x07,0x80,0x07,0x83,0x80,0x07,0x80,0x70,0x00,0xE0,0x70,0x00,0xE0,0x0F,0x00,0x1C,0x0E,0x00,0x3C,0x01,0xE0,0x07,0x80,0xE0,0x07,0x80,0x3C,0x00,0xE0,0x1C,0x00,0xF0,0x03,0x80,0x1C,0x03,0x80,0x1C,0x00,0x78,0x07,0x80,0x78,0x03,0x80,0x0F,0x00,0xE0,0x07,0x00,0xF0,0x01,0xE0,0x1C,0x00,0xE0,0x1E,0x00,0x1C,0x03,0x80,0x1C,0x03,0x80,0x03,0xC0,0xF0,0x01,0xC0,0x70,0x00,0x78,0x1C,0x00,0x38,0x1E,0x00,0x07,0x03,0x80,0x07,0x03,0xC0,0x00,0xE0,0xF0,0x00,0xF0,0x70,0x00,0x1E,0x1C,0x00,0x0E,0x0E,0x00,0x03,0xC3,0x80,0x01,0xC3,0xC0,0x00,0x38,0x70,0x00,0x3C,0x78,0x00,0x07,0x1E,0x00,0x03,0x8E,0x00,0x00,0xE3,0x80,0x00,0x71,0xC0,0x00,0x1E,0x70,0x00,0x0E,0x78,0x00,0x01,0xDE,0x00,0x01,0xEE,0x00,0x00,0x3B,0x80,0x00,0x1D,0xC0,0x00,0x07,0x70,0x00,0x03,0xB8,0x00,0x00,0xEE,0x00,0x00,0x77,0x00,0x00,0x0F,0x80,0x00,0x07,0xC0,0x00,0x01,0xF0,0x00,0x00,0xF8,0x00,0x00,0x3E,0x00,0x00,0x1F,0x00,0x00,0x07,0xC0,0x00,0x03,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00, // 'W' + 0xF8,0x00,0x00,0x0F,0x9E,0x00,0x00,0x07,0xC3,0xC0,0x00,0x01,0xE0,0xF8,0x00,0x00,0xF0,0x1E,0x00,0x00,0x7C,0x03,0xC0,0x00,0x1E,0x00,0xF8,0x00,0x0F,0x00,0x1E,0x00,0x07,0xC0,0x03,0xC0,0x01,0xE0,0x00,0xF8,0x00,0xF0,0x00,0x1E,0x00,0x7C,0x00,0x03,0xC0,0x1E,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1E,0x07,0xC0,0x00,0x03,0xC1,0xE0,0x00,0x00,0xF8,0xF0,0x00,0x00,0x1E,0x7C,0x00,0x00,0x03,0xDE,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x1F,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x1F,0xC0,0x00,0x00,0x0F,0x78,0x00,0x00,0x07,0xDE,0x00,0x00,0x01,0xE3,0xC0,0x00,0x00,0xF0,0x78,0x00,0x00,0x7C,0x1E,0x00,0x00,0x1E,0x03,0xC0,0x00,0x0F,0x00,0x78,0x00,0x07,0xC0,0x1E,0x00,0x01,0xE0,0x03,0xC0,0x00,0xF0,0x00,0x78,0x00,0x7C,0x00,0x1E,0x00,0x1E,0x00,0x03,0xC0,0x0F,0x00,0x00,0x78,0x07,0xC0,0x00,0x1E,0x01,0xE0,0x00,0x03,0xC0,0xF0,0x00,0x00,0xF8,0x7C,0x00,0x00,0x1E,0x1E,0x00,0x00,0x03,0xCF,0x00,0x00,0x00,0xF8, // 'X' + 0xF0,0x00,0x00,0x03,0xCF,0x00,0x00,0x00,0xF1,0xE0,0x00,0x00,0x1E,0x1E,0x00,0x00,0x07,0x83,0xC0,0x00,0x01,0xF0,0x3C,0x00,0x00,0x3C,0x07,0xC0,0x00,0x0F,0x00,0x78,0x00,0x01,0xE0,0x07,0x80,0x00,0x78,0x00,0xF0,0x00,0x0F,0x00,0x0F,0x00,0x03,0xC0,0x01,0xE0,0x00,0x78,0x00,0x1E,0x00,0x1E,0x00,0x03,0xC0,0x07,0x80,0x00,0x3C,0x00,0xF0,0x00,0x03,0xC0,0x3C,0x00,0x00,0x78,0x07,0x80,0x00,0x07,0x81,0xE0,0x00,0x00,0xF0,0x38,0x00,0x00,0x0F,0x0F,0x00,0x00,0x01,0xE1,0xC0,0x00,0x00,0x1E,0x78,0x00,0x00,0x01,0xDE,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x03,0xF0,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x07,0x80,0x00,0x00, // 'Y' + 0xFF,0xFF,0xFF,0xF9,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xE0,0x00,0x00,0x07,0x80,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,0x00,0x03,0xE0,0x00,0x00,0x07,0x80,0x00,0x00,0x1E,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xF0,0x00,0x00,0x03,0xC0,0x00,0x00,0x0F,0x80,0x00,0x00,0x1E,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF0,0x00,0x00,0x03,0xC0,0x00,0x00,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xE0,0x00,0x00,0x07,0x80,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,0x00,0x01,0xE0,0x00,0x00,0x07,0x80,0x00,0x00,0x1E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,0x00,0x03,0xC0,0x00,0x00,0x07,0x80,0x00,0x00,0x1E,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xF0, // 'Z' + 0xFF,0xBF,0xEF,0xFB,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0xFE,0xFF,0xBF,0xE0, // '[' + 0xF0,0x00,0x00,0xE0,0x00,0x01,0xE0,0x00,0x01,0xC0,0x00,0x03,0xC0,0x00,0x07,0x80,0x00,0x07,0x00,0x00,0x0F,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x3C,0x00,0x00,0x38,0x00,0x00,0x78,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x80,0x00,0x07,0x00,0x00,0x0F,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x3C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xF0,0x00,0x00,0xE0,0x00,0x01,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x80,0x00,0x07,0x00,0x00,0x0F,0x00,0x00,0x1E,0x00,0x00,0x1C,0x00,0x00,0x3C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xF0,0x00,0x00,0xE0,0x00,0x01,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x80,0x00,0x07,0x00,0x00,0x0F,0x00, // '\' + 0xFF,0xDF,0xFB,0xFF,0x01,0xE0,0x3C,0x07,0x80,0xF0,0x1E,0x03,0xC0,0x78,0x0F,0x01,0xE0,0x3C,0x07,0x80,0xF0,0x1E,0x03,0xC0,0x78,0x0F,0x01,0xE0,0x3C,0x07,0x80,0xF0,0x1E,0x03,0xC0,0x78,0x0F,0x01,0xE0,0x3C,0x07,0x80,0xF0,0x1E,0x03,0xC0,0x78,0x0F,0x01,0xE0,0x3C,0x07,0x80,0xF0,0x1E,0x03,0xC0,0x78,0x0F,0x01,0xE0,0x3C,0x07,0x80,0xF0,0x1E,0x03,0xC0,0x78,0x0F,0x01,0xE0,0x3C,0x07,0x80,0xF7,0xFE,0xFF,0xDF,0xF8, // ']' + 0x00,0x70,0x00,0x07,0x80,0x00,0x3E,0x00,0x01,0xF0,0x00,0x1F,0xC0,0x00,0xEE,0x00,0x0F,0x70,0x00,0x71,0xC0,0x07,0x8E,0x00,0x38,0x78,0x01,0xC1,0xC0,0x1E,0x0E,0x00,0xE0,0x38,0x0F,0x01,0xC0,0x70,0x0F,0x03,0x80,0x38,0x3C,0x01,0xE1,0xC0,0x07,0x1E,0x00,0x38,0xE0,0x01,0xEF,0x00,0x07,0x00, // '^' + 0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0x00, // '_' + 0xF8,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0E,0x01,0xE0,0x1E, // '`' + 0x00,0x7F,0x80,0x00,0xFF,0xFC,0x00,0xFF,0xFF,0x80,0x7E,0x03,0xF0,0x3E,0x00,0x3E,0x0F,0x00,0x07,0x87,0x80,0x00,0xF1,0xC0,0x00,0x3C,0x70,0x00,0x07,0x00,0x00,0x01,0xC0,0x00,0x00,0x70,0x00,0x00,0x1C,0x00,0x00,0x07,0x00,0x00,0x01,0xC0,0x07,0xFF,0xF0,0x0F,0xFF,0xFC,0x0F,0xFF,0xFF,0x07,0xF0,0x01,0xC3,0xE0,0x00,0x71,0xF0,0x00,0x1C,0x78,0x00,0x07,0x3C,0x00,0x01,0xCF,0x00,0x00,0x73,0x80,0x00,0x1C,0xE0,0x00,0x0F,0x3C,0x00,0x03,0xCF,0x00,0x01,0xF1,0xE0,0x00,0xFC,0x7C,0x00,0xF7,0x0F,0x80,0xF9,0xE1,0xFF,0xFC,0x78,0x3F,0xFC,0x1E,0x03,0xFC,0x00,0x00, // 'a' + 0xF0,0x00,0x00,0x1E,0x00,0x00,0x03,0xC0,0x00,0x00,0x78,0x00,0x00,0x0F,0x00,0x00,0x01,0xE0,0x00,0x00,0x3C,0x00,0x00,0x07,0x80,0x00,0x00,0xF0,0x00,0x00,0x1E,0x00,0x00,0x03,0xC0,0x00,0x00,0x78,0x00,0x00,0x0F,0x00,0x00,0x01,0xE0,0x7F,0x00,0x3C,0x3F,0xFC,0x07,0x9F,0xFF,0xC0,0xF7,0xC0,0xFC,0x1F,0xE0,0x07,0xC3,0xF0,0x00,0x78,0x7E,0x00,0x07,0x8F,0x80,0x00,0x71,0xE0,0x00,0x0F,0x3C,0x00,0x00,0xE7,0x80,0x00,0x1C,0xF0,0x00,0x03,0xDE,0x00,0x00,0x7B,0xC0,0x00,0x0F,0x78,0x00,0x01,0xEF,0x00,0x00,0x3D,0xE0,0x00,0x07,0xBC,0x00,0x00,0xF7,0x80,0x00,0x1E,0xF0,0x00,0x03,0xDE,0x00,0x00,0x7B,0xC0,0x00,0x0F,0x78,0x00,0x01,0xCF,0x00,0x00,0x79,0xE0,0x00,0x0F,0x3E,0x00,0x01,0xC7,0xC0,0x00,0x78,0xFC,0x00,0x1E,0x1F,0xE0,0x07,0xC3,0xDF,0x03,0xF0,0x79,0xFF,0xFC,0x0F,0x0F,0xFF,0x00,0x00,0x7F,0x00,0x00, // 'b' + 0x00,0x7F,0x80,0x00,0x3F,0xFE,0x00,0x1F,0xFF,0xE0,0x07,0xE0,0x7E,0x01,0xF0,0x03,0xE0,0x3C,0x00,0x1E,0x0F,0x00,0x01,0xC3,0xC0,0x00,0x3C,0x78,0x00,0x03,0x8E,0x00,0x00,0x73,0xC0,0x00,0x0E,0x78,0x00,0x00,0x2F,0x00,0x00,0x01,0xC0,0x00,0x00,0x38,0x00,0x00,0x07,0x00,0x00,0x00,0xE0,0x00,0x00,0x1C,0x00,0x00,0x03,0x80,0x00,0x00,0x70,0x00,0x00,0x0F,0x00,0x00,0x01,0xE0,0x00,0x00,0x3C,0x00,0x00,0x03,0x80,0x00,0x1E,0x78,0x00,0x03,0x8F,0x00,0x00,0xF0,0xF0,0x00,0x1E,0x0F,0x00,0x07,0x81,0xF0,0x01,0xE0,0x1F,0x80,0xF8,0x01,0xFF,0xFE,0x00,0x0F,0xFF,0x80,0x00,0x7F,0x80,0x00, // 'c' + 0x00,0x00,0x03,0xC0,0x00,0x00,0x78,0x00,0x00,0x0F,0x00,0x00,0x01,0xE0,0x00,0x00,0x3C,0x00,0x00,0x07,0x80,0x00,0x00,0xF0,0x00,0x00,0x1E,0x00,0x00,0x03,0xC0,0x00,0x00,0x78,0x00,0x00,0x0F,0x00,0x00,0x01,0xE0,0x00,0x00,0x3C,0x00,0xFE,0x07,0x80,0xFF,0xF0,0xF0,0x3F,0xFF,0x9E,0x0F,0xC0,0xFB,0xC3,0xE0,0x07,0xF8,0x78,0x00,0x7F,0x1E,0x00,0x07,0xE3,0x80,0x00,0x7C,0xF0,0x00,0x07,0x9E,0x00,0x00,0xF3,0x80,0x00,0x1E,0xF0,0x00,0x03,0xDE,0x00,0x00,0x7B,0xC0,0x00,0x0F,0x78,0x00,0x01,0xEF,0x00,0x00,0x3D,0xE0,0x00,0x07,0xBC,0x00,0x00,0xF7,0x80,0x00,0x1E,0xF0,0x00,0x03,0xDE,0x00,0x00,0x7B,0xC0,0x00,0x0F,0x38,0x00,0x01,0xE7,0x00,0x00,0x3C,0xF0,0x00,0x07,0x8E,0x00,0x01,0xF1,0xE0,0x00,0x3E,0x1E,0x00,0x0F,0xC3,0xE0,0x07,0xF8,0x3F,0x03,0xEF,0x03,0xFF,0xF9,0xE0,0x3F,0xFC,0x3C,0x00,0xFE,0x00,0x00, // 'd' + 0x00,0x3F,0x80,0x00,0x3F,0xFC,0x00,0x0F,0xFF,0xE0,0x03,0xE0,0x7E,0x00,0xF0,0x03,0xE0,0x3C,0x00,0x3C,0x0F,0x00,0x03,0xC1,0xC0,0x00,0x38,0x78,0x00,0x07,0x8E,0x00,0x00,0x73,0xC0,0x00,0x0E,0x78,0x00,0x01,0xCE,0x00,0x00,0x3D,0xC0,0x00,0x07,0xBF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xDC,0x00,0x00,0x03,0x80,0x00,0x00,0x70,0x00,0x00,0x0E,0x00,0x00,0x01,0xE0,0x00,0x00,0x3C,0x00,0x00,0x03,0x80,0x00,0x00,0x78,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x0C,0x0F,0x00,0x03,0xC0,0xF8,0x00,0xF0,0x1F,0xC0,0x7C,0x00,0xFF,0xFF,0x00,0x0F,0xFF,0xC0,0x00,0x3F,0xC0,0x00, // 'e' + 0x00,0x1F,0xC0,0x0F,0xF8,0x03,0xFF,0x00,0xF8,0x00,0x3E,0x00,0x07,0x80,0x00,0xE0,0x00,0x3C,0x00,0x07,0x80,0x00,0xF0,0x00,0x1E,0x00,0x03,0xC0,0x00,0x78,0x00,0x0F,0x00,0x3F,0xFF,0xC7,0xFF,0xF8,0xFF,0xFF,0x00,0xF0,0x00,0x1E,0x00,0x03,0xC0,0x00,0x78,0x00,0x0F,0x00,0x01,0xE0,0x00,0x3C,0x00,0x07,0x80,0x00,0xF0,0x00,0x1E,0x00,0x03,0xC0,0x00,0x78,0x00,0x0F,0x00,0x01,0xE0,0x00,0x3C,0x00,0x07,0x80,0x00,0xF0,0x00,0x1E,0x00,0x03,0xC0,0x00,0x78,0x00,0x0F,0x00,0x01,0xE0,0x00,0x3C,0x00,0x07,0x80,0x00,0xF0,0x00,0x1E,0x00,0x03,0xC0,0x00,0x78,0x00,0x0F,0x00,0x00, // 'f' + 0x00,0x7F,0x03,0xC0,0x7F,0xF8,0x78,0x1F,0xFF,0xCF,0x07,0xE0,0x7D,0xE1,0xF0,0x03,0xFC,0x3C,0x00,0x1F,0x8F,0x00,0x03,0xF1,0xC0,0x00,0x3E,0x78,0x00,0x03,0xCF,0x00,0x00,0x79,0xC0,0x00,0x0F,0x78,0x00,0x01,0xEF,0x00,0x00,0x3D,0xE0,0x00,0x07,0xBC,0x00,0x00,0xF7,0x80,0x00,0x1E,0xF0,0x00,0x03,0xDE,0x00,0x00,0x7B,0xC0,0x00,0x0F,0x78,0x00,0x01,0xEF,0x00,0x00,0x3D,0xE0,0x00,0x07,0x9C,0x00,0x00,0xF3,0xC0,0x00,0x1E,0x78,0x00,0x03,0xC7,0x00,0x00,0xF8,0xF0,0x00,0x1F,0x0F,0x00,0x07,0xE1,0xF0,0x03,0xFC,0x1F,0x81,0xF7,0x81,0xFF,0xFC,0xF0,0x1F,0xFF,0x1E,0x00,0x7F,0x03,0xC0,0x00,0x00,0x70,0x00,0x00,0x0E,0x00,0x00,0x01,0xC0,0x00,0x00,0x78,0x20,0x00,0x0F,0x06,0x00,0x03,0xC1,0xE0,0x00,0xF8,0x3E,0x00,0x3E,0x03,0xF0,0x1F,0x80,0x1F,0xFF,0xE0,0x01,0xFF,0xF0,0x00,0x07,0xF8,0x00, // 'g' + 0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x0E,0x00,0x00,0x07,0x00,0x00,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x0E,0x00,0x00,0x07,0x01,0xFC,0x03,0x83,0xFF,0x81,0xC7,0xFF,0xF0,0xE7,0xC0,0xF8,0x77,0x80,0x1E,0x3F,0x00,0x07,0x9F,0x00,0x03,0xCF,0x80,0x00,0xE7,0x80,0x00,0x73,0x80,0x00,0x39,0xC0,0x00,0x1C,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF0, // 'h' + 0x73,0xEF,0xBE,0x70,0x00,0x00,0x00,0x00,0x00,0x71,0xC7,0x1C,0x71,0xC7,0x1C,0x71,0xC7,0x1C,0x71,0xC7,0x1C,0x71,0xC7,0x1C,0x71,0xC7,0x1C,0x71,0xC7,0x1C,0x71,0xC7,0x1C, // 'i' + 0x00,0xE0,0x07,0x80,0x7C,0x01,0xE0,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x78,0x03,0xC0,0x1E,0x00,0xF0,0x07,0x80,0x3C,0x01,0xE0,0x0F,0x00,0x78,0x03,0xC0,0x1E,0x00,0xF0,0x07,0x80,0x3C,0x01,0xE0,0x0F,0x00,0x78,0x03,0xC0,0x1E,0x00,0xF0,0x07,0x80,0x3C,0x01,0xE0,0x0F,0x00,0x78,0x03,0xC0,0x1E,0x00,0xF0,0x07,0x80,0x3C,0x01,0xE0,0x0F,0x00,0x78,0x03,0xC0,0x1E,0x00,0xF0,0x07,0x00,0x38,0x03,0xC0,0x1E,0x03,0xE3,0xFF,0x1F,0xE0,0xFC,0x00, // 'j' + 0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x0E,0x00,0x00,0x07,0x00,0x00,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x0E,0x00,0x00,0x07,0x00,0x01,0xF3,0x80,0x01,0xE1,0xC0,0x01,0xE0,0xE0,0x01,0xE0,0x70,0x01,0xE0,0x38,0x01,0xE0,0x1C,0x01,0xE0,0x0E,0x01,0xE0,0x07,0x01,0xE0,0x03,0x81,0xE0,0x01,0xC1,0xE0,0x00,0xE1,0xE0,0x00,0x71,0xE0,0x00,0x39,0xF0,0x00,0x1D,0xF8,0x00,0x0F,0xFE,0x00,0x07,0xE7,0x80,0x03,0xE3,0xE0,0x01,0xE0,0xF0,0x00,0xE0,0x3C,0x00,0x70,0x0F,0x00,0x38,0x03,0xC0,0x1C,0x01,0xF0,0x0E,0x00,0x78,0x07,0x00,0x1E,0x03,0x80,0x07,0x81,0xC0,0x01,0xE0,0xE0,0x00,0xF8,0x70,0x00,0x3C,0x38,0x00,0x0F,0x1C,0x00,0x03,0xCE,0x00,0x00,0xF0, // 'k' + 0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x00, // 'l' + 0xF0,0x3F,0xC0,0x01,0xFC,0x03,0xC3,0xFF,0xC0,0x3F,0xFC,0x0F,0x1F,0xFF,0x81,0xFF,0xFC,0x3D,0xF0,0x3F,0x0F,0x81,0xF8,0xF7,0x00,0x3E,0x70,0x01,0xE3,0xF8,0x00,0x7B,0x80,0x03,0xCF,0xC0,0x00,0xFC,0x00,0x0F,0x3E,0x00,0x03,0xE0,0x00,0x1C,0xF8,0x00,0x0F,0x80,0x00,0x7B,0xC0,0x00,0x1E,0x00,0x01,0xEF,0x00,0x00,0x70,0x00,0x07,0xBC,0x00,0x01,0xC0,0x00,0x1E,0xF0,0x00,0x07,0x00,0x00,0x7B,0xC0,0x00,0x1C,0x00,0x01,0xEF,0x00,0x00,0x70,0x00,0x07,0xBC,0x00,0x01,0xC0,0x00,0x1E,0xF0,0x00,0x07,0x00,0x00,0x7B,0xC0,0x00,0x1C,0x00,0x01,0xEF,0x00,0x00,0x70,0x00,0x07,0xBC,0x00,0x01,0xC0,0x00,0x1E,0xF0,0x00,0x07,0x00,0x00,0x7B,0xC0,0x00,0x1C,0x00,0x01,0xEF,0x00,0x00,0x70,0x00,0x07,0xBC,0x00,0x01,0xC0,0x00,0x1E,0xF0,0x00,0x07,0x00,0x00,0x7B,0xC0,0x00,0x1C,0x00,0x01,0xEF,0x00,0x00,0x70,0x00,0x07,0xBC,0x00,0x01,0xC0,0x00,0x1E,0xF0,0x00,0x07,0x00,0x00,0x7B,0xC0,0x00,0x1C,0x00,0x01,0xEF,0x00,0x00,0x70,0x00,0x07,0xBC,0x00,0x01,0xC0,0x00,0x1E, // 'm' + 0xE0,0x3F,0x80,0x70,0x7F,0xF0,0x38,0xFF,0xFE,0x1C,0xF8,0x1F,0x0E,0xF0,0x03,0xC7,0xE0,0x00,0xF3,0xE0,0x00,0x79,0xF0,0x00,0x3C,0xF0,0x00,0x0E,0x70,0x00,0x07,0x38,0x00,0x03,0x9C,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E, // 'n' + 0x00,0x3F,0xC0,0x00,0x07,0xFF,0x80,0x00,0xFF,0xFF,0x00,0x0F,0xC0,0xFC,0x00,0xF8,0x01,0xF0,0x0F,0x00,0x03,0xC0,0xF0,0x00,0x0F,0x07,0x80,0x00,0x78,0x78,0x00,0x01,0xE3,0xC0,0x00,0x0F,0x1C,0x00,0x00,0x39,0xE0,0x00,0x01,0xEF,0x00,0x00,0x0F,0x78,0x00,0x00,0x7B,0x80,0x00,0x01,0xDC,0x00,0x00,0x0E,0xE0,0x00,0x00,0x77,0x00,0x00,0x03,0xB8,0x00,0x00,0x1D,0xC0,0x00,0x01,0xEF,0x00,0x00,0x0F,0x78,0x00,0x00,0x79,0xC0,0x00,0x03,0x8F,0x00,0x00,0x3C,0x78,0x00,0x01,0xE1,0xE0,0x00,0x1E,0x0F,0x00,0x00,0xF0,0x3C,0x00,0x0F,0x00,0xF8,0x01,0xF0,0x03,0xF0,0x3F,0x00,0x0F,0xFF,0xF0,0x00,0x3F,0xFE,0x00,0x00,0x3F,0xC0,0x00, // 'o' + 0xF0,0x3F,0x80,0x1E,0x1F,0xFE,0x03,0xCF,0xFF,0xE0,0x7B,0xE0,0x7E,0x0F,0xF0,0x03,0xE1,0xF8,0x00,0x3C,0x3E,0x00,0x03,0xC7,0xC0,0x00,0x38,0xF0,0x00,0x07,0x9E,0x00,0x00,0xF3,0xC0,0x00,0x0E,0x78,0x00,0x01,0xEF,0x00,0x00,0x3D,0xE0,0x00,0x07,0xBC,0x00,0x00,0xF7,0x80,0x00,0x1E,0xF0,0x00,0x03,0xDE,0x00,0x00,0x7B,0xC0,0x00,0x0F,0x78,0x00,0x01,0xEF,0x00,0x00,0x3D,0xE0,0x00,0x07,0xBC,0x00,0x00,0xE7,0x80,0x00,0x3C,0xF0,0x00,0x07,0x9E,0x00,0x00,0xE3,0xE0,0x00,0x3C,0x7E,0x00,0x0F,0x0F,0xE0,0x03,0xE1,0xEF,0x81,0xF8,0x3C,0xFF,0xFE,0x07,0x8F,0xFF,0x80,0xF0,0x3F,0x80,0x1E,0x00,0x00,0x03,0xC0,0x00,0x00,0x78,0x00,0x00,0x0F,0x00,0x00,0x01,0xE0,0x00,0x00,0x3C,0x00,0x00,0x07,0x80,0x00,0x00,0xF0,0x00,0x00,0x1E,0x00,0x00,0x03,0xC0,0x00,0x00,0x78,0x00,0x00,0x00, // 'p' + 0x00,0x7F,0x03,0x80,0xFF,0xF0,0xE0,0x7F,0xFF,0x38,0x3F,0x03,0xEE,0x1F,0x00,0x3F,0x8F,0x80,0x07,0xE3,0xC0,0x00,0xF9,0xE0,0x00,0x1E,0x78,0x00,0x03,0x9C,0x00,0x00,0xE7,0x00,0x00,0x3B,0xC0,0x00,0x0E,0xF0,0x00,0x03,0xBC,0x00,0x00,0xEF,0x00,0x00,0x3B,0xC0,0x00,0x0E,0xE0,0x00,0x03,0xB8,0x00,0x00,0xEF,0x00,0x00,0x3B,0xC0,0x00,0x0E,0xF0,0x00,0x03,0xBC,0x00,0x00,0xE7,0x00,0x00,0x39,0xC0,0x00,0x0E,0x78,0x00,0x03,0x9E,0x00,0x01,0xE3,0xC0,0x00,0x78,0x78,0x00,0x3E,0x1F,0x00,0x3F,0x83,0xF0,0x3E,0xE0,0x7F,0xFF,0x38,0x0F,0xFF,0x8E,0x00,0x7F,0x03,0x80,0x00,0x00,0xE0,0x00,0x00,0x38,0x00,0x00,0x0E,0x00,0x00,0x03,0x80,0x00,0x00,0xE0,0x00,0x00,0x38,0x00,0x00,0x0E,0x00,0x00,0x03,0x80,0x00,0x00,0xE0,0x00,0x00,0x38,0x00,0x00,0x0E, // 'q' + 0xF0,0x3E,0xF1,0xFE,0xF3,0xFE,0xF7,0xC0,0xF7,0x00,0xFC,0x00,0xFC,0x00,0xF8,0x00,0xF8,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00, // 'r' + 0x00,0xFF,0x00,0x03,0xFF,0xF0,0x03,0xFF,0xFC,0x03,0xF0,0x3F,0x03,0xC0,0x07,0xC3,0xC0,0x00,0xF1,0xE0,0x00,0x78,0xE0,0x00,0x1E,0x70,0x00,0x0F,0x38,0x00,0x07,0x9E,0x00,0x00,0x0F,0x00,0x00,0x03,0xE0,0x00,0x00,0xFC,0x00,0x00,0x3F,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xF8,0x00,0x00,0x7F,0x00,0x00,0x0F,0xC0,0x00,0x01,0xE0,0x00,0x00,0x78,0x00,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x78,0x00,0x07,0xBC,0x00,0x03,0xCF,0x00,0x03,0xC7,0xC0,0x03,0xE1,0xF8,0x07,0xE0,0x7F,0xFF,0xE0,0x0F,0xFF,0xC0,0x00,0xFF,0x00,0x00, // 's' + 0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0xFF,0xFE,0x7F,0xFF,0x3F,0xFF,0x80,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0x70,0x00,0x3C,0x00,0x1F,0x00,0x07,0xFC,0x01,0xFE,0x00,0x7F,0x00, // 't' + 0xF0,0x00,0x07,0x78,0x00,0x03,0xBC,0x00,0x01,0xDE,0x00,0x00,0xEF,0x00,0x00,0x77,0x80,0x00,0x3B,0xC0,0x00,0x1D,0xE0,0x00,0x0E,0xF0,0x00,0x07,0x78,0x00,0x03,0xBC,0x00,0x01,0xDE,0x00,0x00,0xEF,0x00,0x00,0x77,0x80,0x00,0x3B,0xC0,0x00,0x1D,0xE0,0x00,0x0E,0xF0,0x00,0x07,0x78,0x00,0x03,0xBC,0x00,0x01,0xDE,0x00,0x00,0xEF,0x00,0x00,0x77,0x80,0x00,0x39,0xC0,0x00,0x1C,0xE0,0x00,0x0E,0x70,0x00,0x07,0x3C,0x00,0x07,0x9E,0x00,0x07,0xC7,0x80,0x03,0xE3,0xE0,0x07,0xF0,0xF8,0x0F,0xB8,0x3F,0xFF,0x9C,0x0F,0xFF,0x0E,0x01,0xFE,0x00,0x00, // 'u' + 0xF0,0x00,0x01,0xE7,0x00,0x00,0x1C,0x78,0x00,0x03,0xC7,0x80,0x00,0x38,0x38,0x00,0x03,0x83,0xC0,0x00,0x78,0x1C,0x00,0x07,0x01,0xC0,0x00,0xF0,0x1E,0x00,0x0F,0x00,0xE0,0x00,0xE0,0x0F,0x00,0x1E,0x00,0xF0,0x01,0xE0,0x07,0x00,0x1C,0x00,0x78,0x03,0xC0,0x03,0x80,0x38,0x00,0x38,0x03,0x80,0x03,0xC0,0x78,0x00,0x1C,0x07,0x00,0x01,0xC0,0x70,0x00,0x1E,0x0F,0x00,0x00,0xE0,0xE0,0x00,0x0E,0x1E,0x00,0x00,0x71,0xC0,0x00,0x07,0x1C,0x00,0x00,0x7B,0xC0,0x00,0x03,0xB8,0x00,0x00,0x3B,0x80,0x00,0x03,0xF8,0x00,0x00,0x1F,0x00,0x00,0x01,0xF0,0x00,0x00,0x0E,0x00,0x00,0x00,0xE0,0x00, // 'v' + 0xF0,0x00,0x1C,0x00,0x07,0xBC,0x00,0x07,0x00,0x01,0xE7,0x00,0x03,0xE0,0x00,0x71,0xC0,0x00,0xF8,0x00,0x1C,0x78,0x00,0x3E,0x00,0x0F,0x1E,0x00,0x1D,0xC0,0x03,0xC3,0x80,0x07,0x70,0x00,0xE0,0xE0,0x01,0xDC,0x00,0x38,0x3C,0x00,0xE7,0x80,0x1E,0x07,0x00,0x38,0xE0,0x07,0x01,0xC0,0x0E,0x38,0x01,0xC0,0x78,0x07,0x8F,0x00,0xF0,0x1E,0x01,0xC1,0xC0,0x3C,0x03,0x80,0x70,0x70,0x0E,0x00,0xE0,0x3C,0x1C,0x03,0x80,0x3C,0x0E,0x03,0x81,0xE0,0x07,0x03,0x80,0xE0,0x70,0x01,0xC0,0xE0,0x38,0x1C,0x00,0x70,0x70,0x07,0x07,0x00,0x1E,0x1C,0x01,0xC3,0xC0,0x03,0x87,0x00,0x70,0xE0,0x00,0xE3,0x80,0x0E,0x38,0x00,0x3C,0xE0,0x03,0x8E,0x00,0x07,0x38,0x00,0xE7,0x00,0x01,0xDC,0x00,0x1D,0xC0,0x00,0x77,0x00,0x07,0x70,0x00,0x1F,0xC0,0x01,0xDC,0x00,0x03,0xE0,0x00,0x7E,0x00,0x00,0xF8,0x00,0x0F,0x80,0x00,0x3E,0x00,0x03,0xE0,0x00,0x07,0x80,0x00,0xF0,0x00,0x01,0xC0,0x00,0x1C,0x00, // 'w' + 0x78,0x00,0x03,0xC3,0xC0,0x00,0x78,0x1E,0x00,0x0F,0x81,0xE0,0x00,0xF0,0x0F,0x00,0x1E,0x00,0x78,0x03,0xC0,0x07,0x80,0x3C,0x00,0x3C,0x07,0x80,0x01,0xE0,0xF0,0x00,0x1E,0x0F,0x00,0x00,0xF1,0xE0,0x00,0x07,0xBC,0x00,0x00,0x7B,0xC0,0x00,0x03,0xF8,0x00,0x00,0x1F,0x00,0x00,0x01,0xF0,0x00,0x00,0x1F,0x00,0x00,0x03,0xF8,0x00,0x00,0x3F,0x80,0x00,0x07,0xBC,0x00,0x00,0xF1,0xE0,0x00,0x0F,0x0E,0x00,0x01,0xE0,0xF0,0x00,0x3C,0x07,0x80,0x03,0xC0,0x3C,0x00,0x78,0x03,0xC0,0x0F,0x00,0x1E,0x01,0xF0,0x00,0xF0,0x1E,0x00,0x0F,0x03,0xC0,0x00,0x78,0x7C,0x00,0x03,0xCF,0x80,0x00,0x3E, // 'x' + 0xF0,0x00,0x01,0xE7,0x80,0x00,0x1C,0x78,0x00,0x03,0xC7,0x80,0x00,0x3C,0x3C,0x00,0x03,0x83,0xC0,0x00,0x78,0x1C,0x00,0x07,0x81,0xE0,0x00,0x70,0x1E,0x00,0x0F,0x00,0xE0,0x00,0xE0,0x0F,0x00,0x1E,0x00,0xF0,0x01,0xE0,0x07,0x80,0x1C,0x00,0x78,0x03,0xC0,0x03,0x80,0x3C,0x00,0x3C,0x03,0x80,0x03,0xC0,0x78,0x00,0x1C,0x07,0x80,0x01,0xE0,0x70,0x00,0x1E,0x0F,0x00,0x00,0xF0,0xF0,0x00,0x0F,0x0E,0x00,0x00,0x71,0xE0,0x00,0x07,0x9C,0x00,0x00,0x79,0xC0,0x00,0x03,0xBC,0x00,0x00,0x3F,0x80,0x00,0x03,0xF8,0x00,0x00,0x1F,0x80,0x00,0x01,0xF0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF0,0x00,0x00,0x0E,0x00,0x00,0x00,0xE0,0x00,0x00,0x1C,0x00,0x00,0x01,0xC0,0x00,0x00,0x3C,0x00,0x00,0x03,0x80,0x00,0x00,0x38,0x00,0x00,0x07,0x00,0x00,0x00,0xF0,0x00,0x00,0x3E,0x00,0x00,0x3F,0xE0,0x00,0x03,0xF8,0x00,0x00,0x3F,0x00,0x00,0x00, // 'y' + 0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0x3F,0xFF,0xFF,0x80,0x00,0x07,0xC0,0x00,0x03,0xC0,0x00,0x03,0xC0,0x00,0x03,0xC0,0x00,0x03,0xE0,0x00,0x01,0xE0,0x00,0x01,0xE0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0xF8,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x7C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x0F,0x00,0x00,0x0F,0x00,0x00,0x07,0xFF,0xFF,0xFB,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE, // 'z' + 0x00,0x01,0x80,0x00,0xF0,0x00,0x3F,0x00,0x1F,0x00,0x03,0xC0,0x00,0xF0,0x00,0x3C,0x00,0x07,0x80,0x00,0xE0,0x00,0x3C,0x00,0x07,0x80,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x1E,0x00,0x03,0xC0,0x00,0x70,0x00,0x1E,0x00,0x0F,0x80,0x0F,0xE0,0x01,0xF0,0x00,0x3F,0x80,0x00,0xF8,0x00,0x07,0x80,0x00,0x70,0x00,0x0F,0x00,0x01,0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xE0,0x00,0x3C,0x00,0x07,0x80,0x00,0x78,0x00,0x0F,0x00,0x00,0xF0,0x00,0x0F,0x00,0x01,0xF0,0x00,0x0F,0x80,0x00,0xF8,0x00,0x06,0x00, // '{' + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xE0, // '|' + 0x60,0x00,0x0F,0x00,0x03,0xF0,0x00,0x0F,0x00,0x00,0xF0,0x00,0x0F,0x00,0x00,0xF0,0x00,0x1E,0x00,0x01,0xC0,0x00,0x3C,0x00,0x07,0x80,0x00,0xF0,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xF0,0x00,0x0E,0x00,0x01,0xE0,0x00,0x1F,0x00,0x01,0xFC,0x00,0x0F,0x80,0x07,0xF0,0x01,0xF0,0x00,0x78,0x00,0x0E,0x00,0x03,0xC0,0x00,0x78,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x0F,0x00,0x01,0xE0,0x00,0x3C,0x00,0x07,0x00,0x01,0xE0,0x00,0x3C,0x00,0x0F,0x00,0x03,0xC0,0x00,0xF0,0x00,0x7C,0x00,0x1F,0x00,0x01,0x80,0x00,0x00 // '}' +}; +const GFXglyph Roboto_Light_60Glyphs[] PROGMEM = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 1, 1, 16, 0, 0 }, // ' ' + { 1, 6, 43, 15, 5, -43 }, // '!' + { 34, 11, 13, 18, 4, -45 }, // '"' + { 52, 34, 43, 36, 2, -43 }, // '#' + { 235, 28, 55, 34, 3, -49 }, // '$' + { 428, 39, 44, 45, 3, -43 }, // '%' + { 643, 34, 44, 38, 3, -43 }, // '&' + { 830, 5, 13, 11, 3, -45 }, // ''' + { 839, 15, 62, 20, 4, -48 }, // '(' + { 956, 15, 62, 21, 1, -48 }, // ')' + { 1073, 25, 24, 26, 1, -43 }, // '*' + { 1148, 30, 31, 35, 2, -36 }, // '+' + { 1265, 7, 13, 12, 2, -5 }, // ',' + { 1277, 15, 3, 18, 1, -20 }, // '-' + { 1283, 6, 5, 15, 4, -5 }, // '.' + { 1287, 22, 47, 25, 1, -43 }, // '/' + { 1417, 28, 44, 34, 3, -43 }, // '0' + { 1571, 16, 43, 34, 5, -43 }, // '1' + { 1657, 29, 43, 34, 3, -43 }, // '2' + { 1813, 28, 44, 34, 3, -43 }, // '3' + { 1967, 31, 43, 34, 2, -43 }, // '4' + { 2134, 27, 44, 34, 5, -43 }, // '5' + { 2283, 27, 44, 34, 4, -43 }, // '6' + { 2432, 29, 43, 34, 2, -43 }, // '7' + { 2588, 28, 44, 34, 3, -43 }, // '8' + { 2742, 27, 43, 34, 3, -43 }, // '9' + { 2888, 7, 32, 14, 3, -32 }, // ':' + { 2916, 7, 40, 13, 2, -32 }, // ';' + { 2951, 26, 25, 32, 2, -32 }, // '<' + { 3033, 26, 15, 34, 4, -27 }, // '=' + { 3082, 25, 25, 32, 4, -32 }, // '>' + { 3161, 24, 43, 28, 2, -43 }, // '?' + { 3290, 50, 55, 56, 3, -42 }, // '@' + { 3634, 36, 43, 38, 1, -43 }, // 'A' + { 3828, 29, 43, 38, 6, -43 }, // 'B' + { 3984, 33, 44, 40, 4, -43 }, // 'C' + { 4166, 31, 43, 40, 5, -43 }, // 'D' + { 4333, 28, 43, 35, 5, -43 }, // 'E' + { 4484, 28, 43, 35, 5, -43 }, // 'F' + { 4635, 33, 44, 42, 4, -43 }, // 'G' + { 4817, 33, 43, 43, 5, -43 }, // 'H' + { 4995, 5, 43, 17, 6, -43 }, // 'I' + { 5022, 27, 44, 34, 2, -43 }, // 'J' + { 5171, 33, 43, 39, 5, -43 }, // 'K' + { 5349, 26, 43, 33, 5, -43 }, // 'L' + { 5489, 43, 43, 53, 5, -43 }, // 'M' + { 5721, 32, 43, 44, 6, -43 }, // 'N' + { 5893, 34, 44, 42, 4, -43 }, // 'O' + { 6080, 30, 43, 38, 5, -43 }, // 'P' + { 6242, 34, 51, 42, 4, -43 }, // 'Q' + { 6459, 31, 43, 39, 5, -43 }, // 'R' + { 6626, 31, 44, 37, 3, -43 }, // 'S' + { 6797, 33, 43, 37, 2, -43 }, // 'T' + { 6975, 31, 44, 40, 5, -43 }, // 'U' + { 7146, 36, 43, 38, 1, -43 }, // 'V' + { 7340, 51, 43, 55, 2, -43 }, // 'W' + { 7615, 34, 43, 38, 2, -43 }, // 'X' + { 7798, 35, 43, 37, 1, -43 }, // 'Y' + { 7987, 31, 43, 37, 3, -43 }, // 'Z' + { 8154, 10, 58, 15, 5, -49 }, // '[' + { 8227, 23, 47, 25, 1, -43 }, // '\' + { 8363, 11, 58, 15, 0, -49 }, // ']' + { 8443, 21, 21, 26, 2, -43 }, // '^' + { 8499, 27, 3, 27, 0, 0 }, // '_' + { 8510, 11, 8, 18, 3, -45 }, // '`' + { 8521, 26, 33, 33, 3, -32 }, // 'a' + { 8629, 27, 46, 34, 4, -45 }, // 'b' + { 8785, 27, 33, 32, 3, -32 }, // 'c' + { 8897, 27, 46, 34, 3, -45 }, // 'd' + { 9053, 27, 33, 32, 3, -32 }, // 'e' + { 9165, 19, 46, 21, 2, -46 }, // 'f' + { 9275, 27, 45, 34, 3, -32 }, // 'g' + { 9427, 25, 45, 34, 5, -45 }, // 'h' + { 9568, 6, 44, 14, 4, -44 }, // 'i' + { 9601, 13, 57, 15, -3, -44 }, // 'j' + { 9694, 25, 45, 30, 5, -45 }, // 'k' + { 9835, 5, 45, 14, 5, -45 }, // 'l' + { 9864, 46, 32, 54, 4, -32 }, // 'm' + { 10048, 25, 32, 34, 5, -32 }, // 'n' + { 10148, 29, 33, 35, 3, -32 }, // 'o' + { 10268, 27, 44, 34, 4, -32 }, // 'p' + { 10417, 26, 44, 34, 3, -32 }, // 'q' + { 10560, 16, 32, 21, 4, -32 }, // 'r' + { 10624, 25, 33, 31, 3, -32 }, // 's' + { 10728, 17, 41, 20, 1, -40 }, // 't' + { 10816, 25, 33, 34, 4, -32 }, // 'u' + { 10920, 28, 32, 30, 1, -32 }, // 'v' + { 11032, 42, 32, 46, 2, -32 }, // 'w' + { 11200, 28, 32, 30, 1, -32 }, // 'x' + { 11312, 28, 45, 30, 1, -32 }, // 'y' + { 11470, 25, 32, 30, 3, -32 }, // 'z' + { 11570, 19, 59, 21, 2, -47 }, // '{' + { 11711, 4, 51, 14, 5, -43 }, // '|' + { 11737, 19, 59, 21, 0, -47 } // '}' +}; +const GFXfont Roboto_Light_60 PROGMEM = { +(uint8_t *)Roboto_Light_60Bitmaps,(GFXglyph *)Roboto_Light_60Glyphs,0x20, 0x7E, 71}; \ No newline at end of file diff --git a/firmware/src/interface_task.cpp b/firmware/src/interface_task.cpp new file mode 100644 index 0000000..53648f2 --- /dev/null +++ b/firmware/src/interface_task.cpp @@ -0,0 +1,70 @@ +#include "interface_task.h" + +#define COUNT_OF(A) (sizeof(A) / sizeof(A[0])) + +InterfaceTask::InterfaceTask(const uint8_t task_core, MotorTask& motor_task) : Task{"Interface", 8192, 1, task_core}, motor_task_(motor_task) { +} + +InterfaceTask::~InterfaceTask() {} + +void InterfaceTask::run() { + KnobConfig configs[] = { + { + .num_positions = 0, + .position = 0, + .position_width_radians = 10 * PI / 180, + .detent_strength_unit = 0, + }, + { + .num_positions = 11, + .position = 0, + .position_width_radians = 10 * PI / 180, + .detent_strength_unit = 0, + }, + { + .num_positions = 2, + .position = 0, + .position_width_radians = 60 * PI / 180, + .detent_strength_unit = 1, + }, + { + .num_positions = 256, + .position = 127, + .position_width_radians = 1 * PI / 180, + .detent_strength_unit = 0, + }, + { + .num_positions = 256, + .position = 127, + .position_width_radians = 1 * PI / 180, + .detent_strength_unit = 1, + }, + { + .num_positions = 32, + .position = 0, + .position_width_radians = 8.225806452 * PI / 180, + .detent_strength_unit = 1, + }, + { + .num_positions = 32, + .position = 0, + .position_width_radians = 8.225806452 * PI / 180, + .detent_strength_unit = 0.1, + }, + }; + + int current_config = 0; + + motor_task_.setConfig(configs[current_config]); + while (1) { + if (Serial.available()) { + int v = Serial.read(); + if (v == ' ') { + current_config = (current_config + 1) % COUNT_OF(configs); + Serial.printf("Chaning config to %d\n", current_config); + motor_task_.setConfig(configs[current_config]); + } + } + delay(10); + } +} diff --git a/firmware/src/interface_task.h b/firmware/src/interface_task.h new file mode 100644 index 0000000..cc3e3aa --- /dev/null +++ b/firmware/src/interface_task.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +#include "motor_task.h" +#include "task.h" + +class InterfaceTask : public Task { + friend class Task; // Allow base Task to invoke protected run() + + public: + InterfaceTask(const uint8_t task_core, MotorTask& motor_task); + ~InterfaceTask(); + + protected: + void run(); + + private: + MotorTask& motor_task_; +}; diff --git a/firmware/src/knob_data.h b/firmware/src/knob_data.h new file mode 100644 index 0000000..593d3ce --- /dev/null +++ b/firmware/src/knob_data.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +struct KnobConfig { + int32_t num_positions; + int32_t position; + float position_width_radians; + float detent_strength_unit; +}; + +struct KnobState { + int32_t num_positions; + int32_t current_position; + float sub_position_unit; + float position_width_radians; +}; diff --git a/firmware/src/main.cpp b/firmware/src/main.cpp index 5f05690..3f08602 100644 --- a/firmware/src/main.cpp +++ b/firmware/src/main.cpp @@ -5,6 +5,7 @@ #include #include "display_task.h" +#include "interface_task.h" #include "motor_task.h" #include "tlv_sensor.h" @@ -12,6 +13,7 @@ using namespace ace_button; DisplayTask display_task = DisplayTask(1); MotorTask motor_task = MotorTask(0, display_task); +InterfaceTask interface_task = InterfaceTask(1, motor_task); CRGB leds[1]; @@ -21,6 +23,7 @@ void setup() { display_task.begin(); motor_task.begin(); + interface_task.begin(); vTaskDelete(nullptr); } diff --git a/firmware/src/motor_task.cpp b/firmware/src/motor_task.cpp index 52d6dfd..ec2229d 100644 --- a/firmware/src/motor_task.cpp +++ b/firmware/src/motor_task.cpp @@ -20,6 +20,8 @@ static const float IDLE_CORRECTION_RATE_ALPHA = 0.0005; MotorTask::MotorTask(const uint8_t task_core, DisplayTask& display_task) : Task{"Motor", 8192, 1, task_core}, display_task_(display_task) { + queue_ = xQueueCreate(1, sizeof(KnobConfig)); + assert(queue_ != NULL); } MotorTask::~MotorTask() {} @@ -35,10 +37,7 @@ TlvSensor tlv = TlvSensor(); Commander command = Commander(Serial); -float detents = 36; - void doMotor(char* cmd) { command.motor(&motor, cmd); } -void doDetents(char* cmd) { command.scalar(&detents, cmd); } void MotorTask::run() { driver.voltage_power_supply = 5; @@ -63,32 +62,42 @@ void MotorTask::run() { motor.PID_velocity.limit = 10; + // motor.useMonitoring(Serial); + motor.init(); + tlv.update(); + delay(10); - motor.initFOC(-0.2, Direction::CW); + motor.initFOC(6, Direction::CW); + Serial.println(motor.zero_electric_angle); command.add('M', &doMotor, "foo"); - command.add('D', &doDetents, "Detents"); - motor.useMonitoring(Serial); + // command.add('D', &doDetents, "Detents"); motor.monitor_downsample = 0; // disable monitor at first - optional // disableCore0WDT(); float current_detent_center = motor.shaft_angle; - - int min = 0; - int max = 255; - int value = 0; + KnobConfig config = { + .num_positions = 2, + .position = 0, + .position_width_radians = 60 * _PI / 180, + .detent_strength_unit = 0, + }; float idle_check_velocity_ewma = 0; uint32_t last_idle_start = 0; uint32_t last_debug = 0; while (1) { - motor.loopFOC(); + if (xQueueReceive(queue_, &config, 0) == pdTRUE) { + Serial.println("Got new config"); + current_detent_center = motor.shaft_angle; + } + idle_check_velocity_ewma = motor.shaft_velocity * IDLE_VELOCITY_EWMA_ALPHA + idle_check_velocity_ewma * (1 - IDLE_VELOCITY_EWMA_ALPHA); if (fabsf(idle_check_velocity_ewma) > IDLE_VELOCITY_RAD_PER_SEC) { last_idle_start = 0; @@ -101,48 +110,55 @@ void MotorTask::run() { // If we are not moving and we're close to the center (but not exactly there), slowly adjust the centerpoint to match the current position if (last_idle_start > 0 && millis() - last_idle_start > IDLE_CORRECTION_DELAY_MILLIS && fabsf(motor.shaft_angle - current_detent_center) < IDLE_CORRECTION_MAX_ANGLE_RAD) { current_detent_center = motor.shaft_angle * IDLE_CORRECTION_RATE_ALPHA + current_detent_center * (1 - IDLE_CORRECTION_RATE_ALPHA); - if (millis() - last_debug > 100) { - last_debug = millis(); - Serial.print("Moving detent center. "); - Serial.print(current_detent_center); - Serial.print(" "); - Serial.println(motor.shaft_angle); - } + // if (millis() - last_debug > 100) { + // last_debug = millis(); + // Serial.print("Moving detent center. "); + // Serial.print(current_detent_center); + // Serial.print(" "); + // Serial.println(motor.shaft_angle); + // } } - if (fabs(detents) < 0.01) { + float angle_to_detent_center = motor.shaft_angle - current_detent_center; + if (angle_to_detent_center > config.position_width_radians * 1.05 && (config.num_positions <= 0 || config.position > 0)) { + current_detent_center += config.position_width_radians; + angle_to_detent_center -= config.position_width_radians; + config.position--; + } else if (angle_to_detent_center < -config.position_width_radians * 1.05 && (config.num_positions <= 0 || config.position < config.num_positions - 1)) { + current_detent_center -= config.position_width_radians; + angle_to_detent_center += config.position_width_radians; + config.position++; + } + + float dead_zone_adjustment = CLAMP( + angle_to_detent_center, + fmaxf(-config.position_width_radians*DEAD_ZONE_DETENT_PERCENT, -DEAD_ZONE_RAD), + fminf(config.position_width_radians*DEAD_ZONE_DETENT_PERCENT, DEAD_ZONE_RAD)); + + bool out_of_bounds = config.num_positions > 0 && ((angle_to_detent_center > 0 && config.position == 0) || (angle_to_detent_center < 0 && config.position == config.num_positions - 1)); + motor.PID_velocity.limit = out_of_bounds ? 10 : 3; + motor.PID_velocity.P = out_of_bounds ? 4 : config.detent_strength_unit * 4; + motor.PID_velocity.D = config.detent_strength_unit * 0.04; + + if (fabsf(motor.shaft_velocity) > 20) { + // Don't apply torque if velocity is too high (helps avoid feedback loop) motor.move(0); - display_task_.set_angle(motor.shaft_angle); - current_detent_center = motor.shaft_angle; } else { - float detent_width = 2*PI/detents; - - float angle_to_detent_center = motor.shaft_angle - current_detent_center; - if (angle_to_detent_center > detent_width * 1.2 && value > min) { - current_detent_center += detent_width; - angle_to_detent_center -= detent_width; - value--; - } else if (angle_to_detent_center < -detent_width * 1.2 && value < max) { - current_detent_center -= detent_width; - angle_to_detent_center += detent_width; - value++; - } - - float dead_zone_adjustment = CLAMP( - angle_to_detent_center, - fmaxf(-detent_width*DEAD_ZONE_DETENT_PERCENT, -DEAD_ZONE_RAD), - fminf(detent_width*DEAD_ZONE_DETENT_PERCENT, DEAD_ZONE_RAD)); - - if (fabsf(motor.shaft_velocity) > 20) { - // Don't apply torque if velocity is too high (helps avoid feedback loop) - motor.move(0); - } else { - motor.move(motor.PID_velocity(-angle_to_detent_center + dead_zone_adjustment)); - } - - display_task_.set_angle(-value * PI / 180); + motor.move(motor.PID_velocity(-angle_to_detent_center + dead_zone_adjustment)); } + + display_task_.setData({ + .num_positions = config.num_positions, + .current_position = config.position, + .sub_position_unit = -angle_to_detent_center / config.position_width_radians, + .position_width_radians = config.position_width_radians, + }); + motor.monitor(); - command.run(); + // command.run(); } } + +void MotorTask::setConfig(const KnobConfig& config) { + xQueueOverwrite(queue_, &config); +} diff --git a/firmware/src/motor_task.h b/firmware/src/motor_task.h index c2240a2..6bed911 100644 --- a/firmware/src/motor_task.h +++ b/firmware/src/motor_task.h @@ -2,6 +2,7 @@ #include +#include "knob_data.h" #include "task.h" #include "display_task.h" @@ -12,9 +13,12 @@ class MotorTask : public Task { MotorTask(const uint8_t task_core, DisplayTask& display_task); ~MotorTask(); + void setConfig(const KnobConfig& config); + protected: void run(); private: DisplayTask& display_task_; + QueueHandle_t queue_; };