Tue, 20 Sep 2016 23:50:45 +0200
several improvements
- add (used parts of) unigraphics in repo
- extract hp communication protocol listener in a dedicated file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/unigraphic/Arial12x12.h Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,145 @@ + + +//GLCD FontName : Arial12x12 +//GLCD FontSize : 12 x 12 + +/** Arial Font with 12*12 matrix to use with SPI_TFT lib + */ +#ifdef TOOLCHAIN_GCC +const unsigned char Arial12x12[] __attribute__((aligned (2))) = { +#else +__align(2) +const unsigned char Arial12x12[] = { +#endif + 0xFF/*unused*/,12,12,0xFF/*unused*/, + // Length,horz,vert,byte/vert + 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char + + 0x02, + 0x00, 0x00, 0x7F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ! + + 0x03, + 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char " + + 0x07, + 0x24, 0x00, 0xA4, 0x01, 0x7C, 0x00, 0xA7, 0x01, 0x7C, 0x00, 0x27, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char # + + 0x06, + 0x00, 0x00, 0xCE, 0x00, 0x11, 0x01, 0xFF, 0x03, 0x11, 0x01, 0xE2, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char $ + + 0x0A, + 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x11, 0x01, 0xCE, 0x00, 0x38, 0x00, + 0xE6, 0x00, 0x11, 0x01, 0x10, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char % + + 0x08, + 0x00, 0x00, 0xE0, 0x00, 0x1E, 0x01, 0x11, 0x01, 0x29, 0x01, 0xC6, 0x00, + 0xA0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char & + + 0x02, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ' + + 0x04, + 0x00, 0x00, 0xF8, 0x00, 0x06, 0x03, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ( + + 0x03, + 0x01, 0x04, 0x06, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ) + + 0x05, + 0x02, 0x00, 0x0A, 0x00, 0x07, 0x00, 0x0A, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char * + + 0x06, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char + + 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char , + 0x03, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char - + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char . + 0x03, 0x80, 0x01, 0x7C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char / + 0x06, 0x00, 0x00, 0xFE, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 0 + 0x06, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 1 + 0x06, 0x00, 0x00, 0x02, 0x01, 0x81, 0x01, 0x41, 0x01, 0x31, 0x01, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 2 + 0x06, 0x00, 0x00, 0x82, 0x00, 0x01, 0x01, 0x11, 0x01, 0x11, 0x01, 0xEE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 3 + 0x06, 0x00, 0x00, 0x60, 0x00, 0x58, 0x00, 0x46, 0x00, 0xFF, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 4 + 0x06, 0x00, 0x00, 0x9C, 0x00, 0x0B, 0x01, 0x09, 0x01, 0x09, 0x01, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 5 + 0x06, 0x00, 0x00, 0xFE, 0x00, 0x11, 0x01, 0x09, 0x01, 0x09, 0x01, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 6 + 0x06, 0x00, 0x00, 0x01, 0x00, 0xC1, 0x01, 0x39, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 7 + 0x06, 0x00, 0x00, 0xEE, 0x00, 0x11, 0x01, 0x11, 0x01, 0x11, 0x01, 0xEE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 8 + 0x06, 0x00, 0x00, 0x9E, 0x00, 0x21, 0x01, 0x21, 0x01, 0x11, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 9 + 0x02, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char : + 0x02, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ; + 0x06, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x28, 0x00, 0x44, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char < + 0x06, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char = + 0x06, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char > + 0x06, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x61, 0x01, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ? + 0x0C, 0x00, 0x00, 0xF0, 0x01, 0x0C, 0x02, 0xE2, 0x04, 0x12, 0x09, 0x09, 0x09, 0x09, 0x09, 0xF1, 0x09, 0x19, 0x09, 0x02, 0x05, 0x86, 0x04, 0x78, 0x02, // Code for char @ + 0x07, 0x80, 0x01, 0x70, 0x00, 0x2E, 0x00, 0x21, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char A + 0x07, 0x00, 0x00, 0xFF, 0x01, 0x11, 0x01, 0x11, 0x01, 0x11, 0x01, 0x11, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char B + 0x08, 0x00, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x82, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char C + 0x08, 0x00, 0x00, 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x82, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char D + 0x07, 0x00, 0x00, 0xFF, 0x01, 0x11, 0x01, 0x11, 0x01, 0x11, 0x01, 0x11, 0x01, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char E + 0x06, 0x00, 0x00, 0xFF, 0x01, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char F + 0x08, 0x00, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x01, 0x01, 0x01, 0x01, 0x11, 0x01, 0x92, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char G + 0x08, 0x00, 0x00, 0xFF, 0x01, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char H + 0x02, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char I + 0x05, 0xC0, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char J + 0x08, 0x00, 0x00, 0xFF, 0x01, 0x20, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x82, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char K + 0x07, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char L + 0x08, 0x00, 0x00, 0xFF, 0x01, 0x06, 0x00, 0x78, 0x00, 0x80, 0x01, 0x78, 0x00, 0x06, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char M + 0x08, 0x00, 0x00, 0xFF, 0x01, 0x02, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x60, 0x00, 0x80, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char N + 0x08, 0x00, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x82, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char O + 0x07, 0x00, 0x00, 0xFF, 0x01, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char P + 0x08, 0x00, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x01, 0x01, 0x41, 0x01, 0x41, 0x01, 0x82, 0x00, 0x7C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Q + 0x08, 0x00, 0x00, 0xFF, 0x01, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x31, 0x00, 0xD1, 0x00, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char R + 0x07, 0x00, 0x00, 0xCE, 0x00, 0x11, 0x01, 0x11, 0x01, 0x11, 0x01, 0x11, 0x01, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char S + 0x07, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0xFF, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char T + 0x08, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char U + 0x07, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x80, 0x01, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char V + 0x0B, 0x07, 0x00, 0x78, 0x00, 0x80, 0x01, 0x70, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x70, 0x00, 0x80, 0x01, 0x7C, 0x00, 0x03, 0x00, 0x00, 0x00, // Code for char W + 0x07, 0x01, 0x01, 0xC6, 0x00, 0x28, 0x00, 0x10, 0x00, 0x28, 0x00, 0xC6, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char X + 0x07, 0x01, 0x00, 0x06, 0x00, 0x08, 0x00, 0xF0, 0x01, 0x08, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Y + 0x07, 0x00, 0x01, 0x81, 0x01, 0x61, 0x01, 0x11, 0x01, 0x0D, 0x01, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Z + 0x03, 0x00, 0x00, 0xFF, 0x07, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char [ + 0x03, 0x03, 0x00, 0x7C, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char BackSlash + 0x02, 0x01, 0x04, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ] + 0x05, 0x18, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ^ + 0x07, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char _ + 0x03, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ` + 0x06, 0x00, 0x00, 0xC8, 0x00, 0x24, 0x01, 0x24, 0x01, 0xA4, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char a + 0x06, 0x00, 0x00, 0xFF, 0x01, 0x88, 0x00, 0x04, 0x01, 0x04, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char b + 0x05, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x01, 0x04, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char c + 0x06, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x01, 0x04, 0x01, 0x08, 0x01, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char d + 0x06, 0x00, 0x00, 0xF8, 0x00, 0x24, 0x01, 0x24, 0x01, 0x24, 0x01, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char e + 0x04, 0x04, 0x00, 0xFE, 0x01, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char f + 0x06, 0x00, 0x00, 0xF8, 0x04, 0x04, 0x05, 0x04, 0x05, 0x88, 0x04, 0xFC, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char g + 0x06, 0x00, 0x00, 0xFF, 0x01, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char h + 0x02, 0x00, 0x00, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char i + 0x02, 0x00, 0x04, 0xFD, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char j + 0x06, 0x00, 0x00, 0xFF, 0x01, 0x20, 0x00, 0x30, 0x00, 0xC8, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char k + 0x02, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char l + 0x0A, 0x00, 0x00, 0xFC, 0x01, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0xF8, 0x01, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x00, // Code for char m + 0x06, 0x00, 0x00, 0xFC, 0x01, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char n + 0x06, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char o + 0x06, 0x00, 0x00, 0xFC, 0x07, 0x88, 0x00, 0x04, 0x01, 0x04, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char p + 0x06, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x01, 0x04, 0x01, 0x88, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char q + 0x04, 0x00, 0x00, 0xFC, 0x01, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char r + 0x06, 0x00, 0x00, 0x98, 0x00, 0x24, 0x01, 0x24, 0x01, 0x24, 0x01, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char s + 0x03, 0x04, 0x00, 0xFF, 0x01, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char t + 0x06, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char u + 0x05, 0x0C, 0x00, 0x70, 0x00, 0x80, 0x01, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char v + 0x09, 0x0C, 0x00, 0x70, 0x00, 0x80, 0x01, 0x70, 0x00, 0x0C, 0x00, 0x70, 0x00, 0x80, 0x01, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char w + 0x05, 0x04, 0x01, 0xD8, 0x00, 0x20, 0x00, 0xD8, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char x + 0x05, 0x0C, 0x00, 0x70, 0x04, 0x80, 0x03, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char y + 0x05, 0x04, 0x01, 0xC4, 0x01, 0x24, 0x01, 0x1C, 0x01, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char z + 0x03, 0x20, 0x00, 0xDE, 0x03, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char { + 0x02, 0x00, 0x00, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char | + 0x04, 0x00, 0x00, 0x01, 0x04, 0xDE, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char } + 0x07, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ~ + 0x08, 0x00, 0x00, 0xFE, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Code for char + };
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/unigraphic/GraphicsDisplay.cpp Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,473 @@ +/* mbed UniGraphic library - Graphics class + * Copyright (c) 2015 Giuliano Dianda + * Released under the MIT License: http://mbed.org/license/mit + * + * Derived work of: + * + * mbed GraphicsDisplay Display Library Base Class + * Copyright (c) 2007-2009 sford + * Released under the MIT License: http://mbed.org/license/mit + * + * mbed library for 240*320 pixel display TFT based on ILI9341 LCD Controller + * Copyright (c) 2013 Peter Drescher - DC2PD + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + + +#include "GraphicsDisplay.h" +#define SWAP(a, b) { a ^= b; b ^= a; a ^= b; } +GraphicsDisplay::GraphicsDisplay(const char *name):TextDisplay(name) { + set_font((unsigned char*)Terminal6x8,32,127,true); + // foreground(0xFFFF); + // background(0x0000); + char_x = 0; + char_y = 0; + oriented_width=0; + oriented_height=0; + fontzoomver=1; + fontzoomhor=1; + auto_up = true; +} + +void GraphicsDisplay::WindowMax (void) +{ + window (0, 0, oriented_width, oriented_height); +} +void GraphicsDisplay::set_width(int width) +{ + oriented_width = width; +} +void GraphicsDisplay::set_height(int height) +{ + oriented_height = height; +} +int GraphicsDisplay::width() +{ + return oriented_width; +} +int GraphicsDisplay::height() +{ + return oriented_height; +} +void GraphicsDisplay::circle(int x0, int y0, int r, unsigned short color) +{ + int x = -r, y = 0, err = 2-2*r, e2; + do { + pixel(x0-x, y0+y,color); + pixel(x0+x, y0+y,color); + pixel(x0+x, y0-y,color); + pixel(x0-x, y0-y,color); + e2 = err; + if (e2 <= y) { + err += ++y*2+1; + if (-x == y && e2 <= x) e2 = 0; + } + if (e2 > x) err += ++x*2+1; + } while (x <= 0); + if(auto_up) copy_to_lcd(); +} +void GraphicsDisplay::fillcircle(int x0, int y0, int r, unsigned short color) +{ + bool old_auto_up=auto_up; + if(auto_up) auto_up=false; + int x = -r, y = 0, err = 2-2*r, e2; + do { + vline(x0-x, y0-y, y0+y, color); + vline(x0+x, y0-y, y0+y, color); + e2 = err; + if (e2 <= y) { + err += ++y*2+1; + if (-x == y && e2 <= x) e2 = 0; + } + if (e2 > x) err += ++x*2+1; + } while (x <= 0); + if(old_auto_up) + { + auto_up=true; + copy_to_lcd(); + } +} +void GraphicsDisplay::hline(int x0, int x1, int y, unsigned short color) +{ + int len = x1 - x0 + 1; + window(x0,y,len,1); + // for (int j=0; j<len; j++) window_pushpixel(color); + window_pushpixel(color, len); + if(auto_up) copy_to_lcd(); + return; +} +void GraphicsDisplay::vline(int x, int y0, int y1, unsigned short color) +{ + int len = y1 - y0 + 1; + window(x,y0,1,len); + // for (int y=0; y<len; y++) window_pushpixel(color); + window_pushpixel(color, len); + if(auto_up) copy_to_lcd(); + return; +} +void GraphicsDisplay::line(int x0, int y0, int x1, int y1, unsigned short color) +{ + //WindowMax(); + int dx = 0, dy = 0; + int dx_sym = 0, dy_sym = 0; + int dx_x2 = 0, dy_x2 = 0; + int di = 0; + + dx = x1-x0; + dy = y1-y0; + + if (dx == 0) { /* vertical line */ + if (y1 < y0) SWAP(y0,y1); + vline(x0,y0,y1,color); + return; + } + + if (dx > 0) { + dx_sym = 1; + } else { + dx_sym = -1; + } + if (dy == 0) { /* horizontal line */ + if (x1 < x0) SWAP(x1,x0); + hline(x0,x1,y0,color); + return; + } + + if (dy > 0) { + dy_sym = 1; + } else { + dy_sym = -1; + } + + dx = dx_sym*dx; + dy = dy_sym*dy; + + dx_x2 = dx*2; + dy_x2 = dy*2; + + if (dx >= dy) { + di = dy_x2 - dx; + while (x0 != x1) { + + pixel(x0, y0, color); + x0 += dx_sym; + if (di<0) { + di += dy_x2; + } else { + di += dy_x2 - dx_x2; + y0 += dy_sym; + } + } + pixel(x0, y0, color); + } else { + di = dx_x2 - dy; + while (y0 != y1) { + pixel(x0, y0, color); + y0 += dy_sym; + if (di < 0) { + di += dx_x2; + } else { + di += dx_x2 - dy_x2; + x0 += dx_sym; + } + } + pixel(x0, y0, color); + } + if(auto_up) copy_to_lcd(); + return; +} +void GraphicsDisplay::rect(int x0, int y0, int x1, int y1, unsigned short color) +{ + bool old_auto_up=auto_up; + if(auto_up) auto_up=0; + if (x1 > x0) hline(x0,x1,y0,color); + else hline(x1,x0,y0,color); + + if (y1 > y0) vline(x0,y0,y1,color); + else vline(x0,y1,y0,color); + + if (x1 > x0) hline(x0,x1,y1,color); + else hline(x1,x0,y1,color); + + if (y1 > y0) vline(x1,y0,y1,color); + else vline(x1,y1,y0,color); + if(old_auto_up) + { + auto_up=true; + copy_to_lcd(); + } + return; +} +void GraphicsDisplay::fillrect(int x0, int y0, int x1, int y1, unsigned short color) +{ + if(x0 > x1) SWAP(x0,x1); + if(y0 > y1) SWAP(y0,y1); + + int h = y1 - y0 + 1; + int w = x1 - x0 + 1; + unsigned int pixels = h * w; + window(x0,y0,w,h); + // for (unsigned int p=0; p<pixels; p++) window_pushpixel(color); + window_pushpixel(color, pixels); + if(auto_up) copy_to_lcd(); + return; +} +void GraphicsDisplay::locate(int x, int y) +{ + char_x = x; + char_y = y; +} +int GraphicsDisplay::columns() +{ + return oriented_width / fonthor; +} +int GraphicsDisplay::rows() +{ + return oriented_height / fontvert; +} +void GraphicsDisplay::set_font(unsigned char* f, unsigned char firstascii, unsigned char lastascii, bool proportional) +{ + font = f; + // read font parameter from start of array + //fontoffset = font[0]; // bytes / char + fonthor = font[1]; // get hor size of font + fontvert = font[2]; // get vert size of font + //fontbpl = font[3]; // bytes per line + fontbpl = (fontvert+7)>>3; //bytes per line, rounded up to multiple of 8 + fontoffset = (fonthor*fontbpl)+1; + firstch = firstascii; // first ascii code present in font array (usually 32) + lastch = lastascii; // last ascii code present in font array (usually 127) + fontprop = proportional; + set_font_zoom(1,1); +} +void GraphicsDisplay::set_font_zoom(unsigned char x_mul, unsigned char y_mul) +{ + fontzoomhor=((x_mul==0) ? 1:x_mul); + fontzoomver=((y_mul==0) ? 1:y_mul); +} +int GraphicsDisplay::_putc(int value) +{ + if (value == '\n') { // new line + char_x = 0; + char_y = char_y + fontvert*fontzoomver; + if (char_y >= oriented_height - fontvert*fontzoomver) { + char_y = 0; + } + } else { + character(char_x, char_y, value); + if(auto_up) copy_to_lcd(); + } + return value; +} +void GraphicsDisplay::character(int x, int y, int c) +{ + char_x=x; + char_y=y; + int j,i,b; + unsigned char* zeichen; + unsigned char z,w,v; + + /* // read font parameter from start of array + offset = font[0]; // bytes / char + hor = font[1]; // get hor size of font + vert = font[2]; // get vert size of font + bpl = font[3]; // bytes per line +*/ + if (char_x + fonthor*fontzoomhor > oriented_width) { + char_x = 0; + char_y = char_y + fontvert*fontzoomver; + if (char_y > oriented_height - fontvert*fontzoomver) { + char_y = 0; + } + } + window(char_x, char_y, fonthor*fontzoomhor, fontvert*fontzoomver); // char box + if ((c < firstch) || (c > lastch)) { // test char range - if not exist fill with blank + window_pushpixel(_background, fontzoomhor*fonthor*fontvert*fontzoomver); //(color, howmany) + w = fonthor; + } else { + zeichen = &font[((c-firstch) * fontoffset) + 4]; // start of char bitmap + w = zeichen[0]; // width of actual char + // construct the char into the buffer + for (j=0; j<(fontbpl); j++) { // vert bytes + for (v=0; v<fontzoomver; v++) { // repeat horiz line for vertical zooming + for (int p=0; p<8; p++) { // pixel in the current vert byte + if ((j*8+p) > fontvert) + break; + b = 1 << p; + for (i=0; i<fonthor; i++) { // horz line + z = zeichen[(fontbpl * i) + j + 1]; + window_pushpixel(( z & b ) ? _foreground : _background, fontzoomhor); //(color, howmany) + } + } + } //for each zoomed vert + } + } + if((fontprop) && (w<fonthor)) + // put at least 1 blank after variable-width characters, except + // characters that occupy whole fonthor space like "_" + char_x += (w*fontzoomhor) + 1; + else + char_x += fonthor*fontzoomhor; +} + +void GraphicsDisplay::Bitmap_BW(Bitmap_s bm, int x, int y) +{ + int h,v,b; + // int cropX; + char d; + if(x<0) x=0; + if(y<0) y=0; + int cropX = (x+bm.xSize)-oriented_width; + if(cropX<0) cropX=0; + window(x, y, bm.xSize-cropX, bm.ySize); + for(v=0; v < bm.ySize; v++) { // lines + if((v + y) >= oriented_height) break; // no need to crop Y + for(h=0; h < bm.xSize; h++) { // pixel + if((h + x) >= oriented_width) break; + d = bm.data[bm.Byte_in_Line * v + ((h & 0xF8) >> 3)]; + b = 0x80 >> (h & 0x07); + if((d & b) == 0) { + window_pushpixel(_background); + } else { + window_pushpixel(_foreground); + } + } + } + if(auto_up) copy_to_lcd(); +} +void GraphicsDisplay::Bitmap(int x, int y, int w, int h,unsigned char *bitmap) +{ + int j; + unsigned char padd; + unsigned short *bitmap_ptr = (unsigned short *)bitmap; + + padd = w%2; // the lines are padded to multiple of 4 bytes in a bitmap + if(x<0) x=0; + else if(x>=oriented_width) return; + if(y<0) y=0; + else if(y>=oriented_height) return; + int cropX = (x+w)-oriented_width; + if(cropX<0) cropX=0; + int cropY = (y+h)-oriented_height; + if(cropY<0) cropY=0; + window(x, y, w-cropX, h-cropY); + bitmap_ptr += ((h - 1)* (w + padd)); // begin of last line in array (first line of image)(standard bmp scan direction is left->right bottom->top) + for (j = 0; j < h-cropY; j++) { //Lines + window_pushpixelbuf(bitmap_ptr, w-cropX); + bitmap_ptr -= w+padd; + } + if(auto_up) copy_to_lcd(); +} + +// local filesystem is not implemented in kinetis board , but you can add a SD card +// fixme this whole functions needs testing and speedup +int GraphicsDisplay::BMP_16(int x, int y, const char *Name_BMP) +{ + +#define OffsetPixelWidth 18 +#define OffsetPixelHeigh 22 +#define OffsetFileSize 34 +#define OffsetPixData 10 +#define OffsetBPP 28 + + char filename[50]; + unsigned char BMP_Header[54]; + unsigned short BPP_t; + unsigned int PixelWidth,PixelHeigh,start_data; + unsigned int i,off; + int padd,j; + unsigned short *line; + + // get the filename + i=0; + while (*Name_BMP!='\0') { + filename[i++]=*Name_BMP++; + } + filename[i] = 0; + + FILE *Image = fopen((const char *)&filename[0], "rb"); // open the bmp file + if (!Image) { + return(0); // error file not found ! + } + + fread(&BMP_Header[0],1,54,Image); // get the BMP Header + + if (BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte + fclose(Image); + return(-1); // error no BMP file + } + + BPP_t = BMP_Header[OffsetBPP] + (BMP_Header[OffsetBPP + 1] << 8); + if (BPP_t != 0x0010) { + fclose(Image); + return(-2); // error no 16 bit BMP + } + + PixelHeigh = BMP_Header[OffsetPixelHeigh] + (BMP_Header[OffsetPixelHeigh + 1] << 8) + (BMP_Header[OffsetPixelHeigh + 2] << 16) + (BMP_Header[OffsetPixelHeigh + 3] << 24); + PixelWidth = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24); + if (PixelHeigh > oriented_height + y || PixelWidth > oriented_width + x) { + fclose(Image); + return(-3); // to big + } + + start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24); + + line = (unsigned short *) malloc (2 * PixelWidth); // we need a buffer for a line + if (line == NULL) { + return(-4); // error no memory + } + + // the bmp lines are padded to multiple of 4 bytes + padd = -1; + do { + padd ++; + } while ((PixelWidth * 2 + padd)%4 != 0); + + window(x, y,PixelWidth ,PixelHeigh); +// wr_cmd(0x2C); // send pixel + for (j = PixelHeigh - 1; j >= 0; j--) { //Lines bottom up + off = j * (PixelWidth * 2 + padd) + start_data; // start of line + fseek(Image, off ,SEEK_SET); + fread(line,1,PixelWidth * 2,Image); // read a line - slow + /* for (i = 0; i < PixelWidth; i++) + { // copy pixel data to TFT + // wr_16(line[i]); // one 16 bit pixel + window_pushpixel(line[i]); + + } */ + window_pushpixelbuf(line, PixelWidth); + } + free (line); + fclose(Image); + if(auto_up) copy_to_lcd(); + return(1); +} + +void GraphicsDisplay::cls (void) +{ + unsigned int pixels = ( oriented_width * oriented_height); + WindowMax(); + for (unsigned int i = 0; i < pixels; i++) + { + window_pushpixel(_background); + } +} +void GraphicsDisplay::set_auto_up(bool up) +{ + if(up) auto_up = true; + else auto_up = false; +} +bool GraphicsDisplay::get_auto_up(void) +{ + return (auto_up); +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/unigraphic/GraphicsDisplay.h Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,361 @@ +/* mbed GraphicsDisplay Display Library Base Class + * Copyright (c) 2007-2009 sford + * Released under the MIT License: http://mbed.org/license/mit + * + * A library for providing a common base class for Graphics displays + * To port a new display, derive from this class and implement + * the constructor (setup the display), pixel (put a pixel + * at a location), width and height functions. Everything else + * (locate, printf, putc, cls, window, putp, fill, blit, blitbit) + * will come for free. You can also provide a specialised implementation + * of window and putp to speed up the results + */ + +#ifndef MBED_GRAPHICSDISPLAY_H +#define MBED_GRAPHICSDISPLAY_H + +#include "TextDisplay.h" +#include "Terminal6x8.h" + + + +/* some RGB color definitions */ +#define Black 0x0000 /* 0, 0, 0 */ +#define Navy 0x000F /* 0, 0, 128 */ +#define DarkGreen 0x03E0 /* 0, 128, 0 */ +#define DarkCyan 0x03EF /* 0, 128, 128 */ +#define Maroon 0x7800 /* 128, 0, 0 */ +#define Purple 0x780F /* 128, 0, 128 */ +#define Olive 0x7BE0 /* 128, 128, 0 */ +#define LightGrey 0xC618 /* 192, 192, 192 */ +#define DarkGrey 0x7BEF /* 128, 128, 128 */ +#define Blue 0x001F /* 0, 0, 255 */ +#define Green 0x07E0 /* 0, 255, 0 */ +#define Cyan 0x07FF /* 0, 255, 255 */ +#define Red 0xF800 /* 255, 0, 0 */ +#define Magenta 0xF81F /* 255, 0, 255 */ +#define Yellow 0xFFE0 /* 255, 255, 0 */ +#define White 0xFFFF /* 255, 255, 255 */ +#define Orange 0xFD20 /* 255, 165, 0 */ +#define GreenYellow 0xAFE5 /* 173, 255, 47 */ + +/** Bitmap + */ +struct Bitmap_s{ + int xSize; + int ySize; + int Byte_in_Line; + char* data; + }; + +/** A common base class for Graphics displays +*/ +class GraphicsDisplay : public TextDisplay { + +public: + + /** Create a GraphicsDisplay interface + * @param name The name used by the parent class to access the interface + */ + GraphicsDisplay(const char* name); + +////// functions needing implementation in derived implementation class /////////////////////////////////////// +////// ---------------------------------------------------------------- /////////////////////////////////////// + + /** Draw a pixel in the specified color. + * @note this method must be supported in the derived class. + * @param x is the horizontal offset to this pixel. + * @param y is the vertical offset to this pixel. + * @param color defines the color for the pixel. + */ + virtual void pixel(int x, int y, unsigned short color) = 0; + + /** Set the window, which controls where items are written to the screen. + * When something hits the window width, it wraps back to the left side + * and down a row. If the initial write is outside the window, it will + * be captured into the window when it crosses a boundary. + * @param x is the left edge in pixels. + * @param y is the top edge in pixels. + * @param w is the window width in pixels. + * @param h is the window height in pixels. + * @note this method must be overridden in a derived class. + */ + virtual void window(int x, int y, int w, int h) = 0; + + /** Push a single pixel into the window and increment position. + * You may first call window() then push pixels in loop. + * @param color is the pixel color. + * @note this method must be overridden in a derived class. + */ + virtual void window_pushpixel(unsigned short color) = 0; + + /** Push some pixels of the same color into the window and increment position. + * You must first call window() then push pixels. + * @param color is the pixel color. + * @param count: how many + */ + virtual void window_pushpixel(unsigned short color, unsigned int count) = 0; + + /** Push array of pixel colors into the window and increment position. + * You must first call window() then push pixels. + * @param color is the pixel color. + */ + virtual void window_pushpixelbuf(unsigned short* color, unsigned int lenght) = 0; + + /** If framebuffer is used, it needs to be sent to LCD from time to time + @note this method must be overridden in a derived class. + @note real function for LCD, dummy for TFT + */ + virtual void copy_to_lcd() = 0; + +/////// functions that come for free, but can be overwritten/////////////////////////////////////////////////// +/////// ----------------------------------------------------/////////////////////////////////////////////////// + + /** Set window to max possible size + * May be overridden in a derived class. + */ + virtual void WindowMax(void); + + /** clear the entire screen + * Basically it sets windomax then fill with background color + * May be overridden in a derived class. + */ + virtual void cls(); + + /** draw a circle + * + * @param x0,y0 center + * @param r radius + * @param color 16 bit color * + * + */ + virtual void circle(int x, int y, int r, unsigned short color); + + /** draw a filled circle + * + * @param x0,y0 center + * @param r radius + * @param color 16 bit color * + */ + virtual void fillcircle(int x, int y, int r, unsigned short color); + + + /** draw a 1 pixel line + * + * @param x0,y0 start point + * @param x1,y1 stop point + * @param color 16 bit color + * + */ + virtual void line(int x0, int y0, int x1, int y1, unsigned short color); + + /** draw a horizontal line + * + * @param x0 horizontal start + * @param x1 horizontal stop + * @param y vertical position + * @param color 16 bit color + * + */ + void hline(int x0, int x1, int y, unsigned short color); + + /** draw a vertical line + * + * @param x horizontal position + * @param y0 vertical start + * @param y1 vertical stop + * @param color 16 bit color + */ + void vline(int y0, int y1, int x, unsigned short color); + + /** draw a rect + * + * @param x0,y0 top left corner + * @param x1,y1 down right corner + * @param color 16 bit color + * * + */ + virtual void rect(int x0, int y0, int x1, int y1, unsigned short color); + + /** draw a filled rect + * + * @param x0,y0 top left corner + * @param x1,y1 down right corner + * @param color 16 bit color + * + */ + virtual void fillrect(int x0, int y0, int x1, int y1, unsigned short color); + + /** setup cursor position for text + * + * @param x x-position (top left) + * @param y y-position + */ + virtual void locate(int x, int y); + + /** put a char on the screen + * + * @param value char to print + * @returns printed char + * + */ + virtual int _putc(int value); + + /** draw a character on given position out of the active font to the TFT + * + * @param x x-position of char (top left) + * @param y y-position + * @param c char to print + * + */ + virtual void character(int x, int y, int c); + + /** paint a bitmap on the TFT + * + * @param x,y : upper left corner + * @param w width of bitmap + * @param h high of bitmap + * @param *bitmap pointer to the bitmap data + * + * bitmap format: 16 bit R5 G6 B5 + * + * use Gimp to create / load , save as BMP, option 16 bit R5 G6 B5 + * use winhex to load this file and mark data stating at offset 0x46 to end + * use edit -> copy block -> C Source to export C array + * paste this array into your program + * + * define the array as static const unsigned char to put it into flash memory + * cast the pointer to (unsigned char *) : + * tft.Bitmap(10,40,309,50,(unsigned char *)scala); + */ + void Bitmap(int x, int y, int w, int h,unsigned char *bitmap); + + /** paint monochrome bitmap to screen + * + * @param bm Bitmap in flash + * @param x x start + * @param y y start + * + */ + void Bitmap_BW(Bitmap_s bm, int x, int y); + + /** paint a 16 bit BMP from filesytem on the TFT (slow) + * + * @param x,y : position of upper left corner + * @param *Name_BMP name of the BMP file with drive: "/local/test.bmp" + * + * @returns 1 if bmp file was found and painted + * @returns 0 if bmp file was found not found + * @returns -1 if file is no bmp + * @returns -2 if bmp file is no 16 bit bmp + * @returns -3 if bmp file is to big for screen + * @returns -4 if buffer malloc go wrong + * + * bitmap format: 16 bit R5 G6 B5 + * + * use Gimp to create / load , save as BMP, option 16 bit R5 G6 B5 + * copy to internal file system or SD card + */ + int BMP_16(int x, int y, const char *Name_BMP); + + + + /** select the font to use + * + * @param f pointer to font array + * @param firstascii first ascii code present in font array, default 32 (space) + * @param lastascii last ascii code present in font array, default 127 (DEL) + * @param proportional enable/disable variable font width (default enabled) + * + * font array can created with GLCD Font Creator from http://www.mikroe.com + * you have to add 4 parameter at the beginning of the font array to use: + * - the number of byte / char (not used in this revision, set to whatever) + * - the vertial size in pixel + * - the horizontal size in pixel + * - the number of byte per vertical line (not used in this revision, set to whatever) + * you also have to change the array to cont unsigned char[] and __align(2) + * + */ + void set_font(unsigned char* f, unsigned char firstascii=32, unsigned char lastascii=127, bool proportional = true); + + /** Zoom fount + * + * @param x_mul horizontal size multiplier + * @param y_mul vertical size multiplier + */ + void set_font_zoom(unsigned char x_mul, unsigned char y_mul); + + /** Get the number of columns based on the currently active font. + * @returns number of columns. + * @note this method may be overridden in a derived class. + */ + virtual int columns(); + + /** Get the number of rows based on the currently active font. + * @returns number of rows. + * @note this method may be overridden in a derived class. + */ + virtual int rows(); + + /** get the current oriented screen width in pixels + * @returns screen width in pixels. + */ + int width(); + + /** get the current oriented screen height in pixels + * @returns screen height in pixels. + */ + int height(); + + /** set the current oriented screen width in pixels + * @param width screen width in pixels. + */ + void set_width(int width); + + /** set the current oriented screen height in pixels + * @param height screen height in pixels. + */ + void set_height(int height); + + /** setup auto update of screen + * + * @param up 1 = on , 0 = off + * if switched off the program has to call copy_to_lcd() + * to update screen from framebuffer + */ + void set_auto_up(bool up); + + /** get status of the auto update function + * + * @returns if auto update is on + */ + bool get_auto_up(void); + + + +private: + + unsigned char* font; + // display width and height related to current orientation + int oriented_width; + int oriented_height; + + // text char location + int char_x; + int char_y; + + int fontoffset;// bytes / char (short) + int fonthor; // hor size of font (char) + int fontvert; // ver size of font (char) + int fontbpl; // bytes per line (char) + int fontzoomver; // size multiplier + int fontzoomhor; // size multiplier + unsigned char firstch; // first ascii code present in font array (usually 32) + unsigned char lastch; // last ascii code present in font array (usually 127) + bool auto_up; // autoupdate flag for LCD + bool fontprop; + + +}; + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/unigraphic/Mono15x22.h Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,1842 @@ +// Save as: fonts/FONT_MONOSPACE_15x22_33_TO_126.h + + + +#ifndef FONT_MONOSPACE_15x22_33_TO_126_H + +#define FONT_MONOSPACE_15x22_33_TO_126_H + + + +// Size: 15x22 + +// Chars: 33 to 126 + +#ifdef TOOLCHAIN_GCC + +const unsigned char Mono15x22[] __attribute__((aligned (2))) = { + +#else + +__align(2) + +const unsigned char Mono15x22[] = { + +#endif + + 2, 15, 22, 2 /*unused*/, + + // byte/char, horz, vert, byte/vert + + + + 15, + +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, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char ' ' + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0xcf, 0x01, +0xfc, 0xcf, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '!' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0x00, 0x00, +0xfc, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0x00, 0x00, +0xfc, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '"' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x18, 0x00, +0xc0, 0x18, 0x00, +0xc0, 0xd8, 0x01, +0xc0, 0xfc, 0x00, +0xc0, 0x1f, 0x00, +0xfc, 0x19, 0x00, +0xdc, 0x98, 0x01, +0xc0, 0xf8, 0x01, +0xc0, 0x3f, 0x00, +0xf8, 0x1b, 0x00, +0xfc, 0x18, 0x00, +0xc0, 0x18, 0x00, +0xc0, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '#' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xe0, 0xc1, 0x00, +0xf0, 0x83, 0x01, +0x38, 0x83, 0x01, +0x18, 0x86, 0x01, +0xfe, 0xff, 0x0f, +0x18, 0x86, 0x01, +0x18, 0xcc, 0x01, +0x30, 0xfc, 0x00, +0x00, 0x78, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '$' + + + 15, + +0x00, 0x00, 0x00, +0x70, 0x00, 0x00, +0xf8, 0x04, 0x00, +0x8c, 0x05, 0x00, +0x04, 0x05, 0x00, +0x8c, 0x07, 0x00, +0xf8, 0x02, 0x00, +0x70, 0x72, 0x00, +0x00, 0xfa, 0x00, +0x00, 0x8d, 0x01, +0x00, 0x05, 0x01, +0x00, 0x8d, 0x01, +0x80, 0xf9, 0x00, +0x00, 0x70, 0x00, +0x00, 0x00, 0x00, // Char '%' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x3c, 0x00, +0x00, 0xfe, 0x00, +0x78, 0xe3, 0x00, +0xf8, 0xc1, 0x01, +0x8c, 0x83, 0x01, +0x0c, 0x87, 0x01, +0x0c, 0x8e, 0x01, +0x0c, 0xbc, 0x00, +0x0c, 0x70, 0x00, +0x00, 0xe0, 0x01, +0x00, 0xbe, 0x01, +0x00, 0x0e, 0x01, +0x00, 0x00, 0x00, // Char '&' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0x00, 0x00, +0xfc, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char ''' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x80, 0x3f, 0x00, +0xf0, 0xff, 0x01, +0x7c, 0xc0, 0x07, +0x0e, 0x00, 0x0e, +0x02, 0x00, 0x08, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '(' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x02, 0x00, 0x08, +0x0e, 0x00, 0x0e, +0x7c, 0xc0, 0x07, +0xf0, 0xff, 0x01, +0x80, 0x3f, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char ')' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x10, 0x02, 0x00, +0x20, 0x01, 0x00, +0x20, 0x01, 0x00, +0xc0, 0x00, 0x00, +0xfc, 0x0f, 0x00, +0xc0, 0x00, 0x00, +0x20, 0x01, 0x00, +0x20, 0x01, 0x00, +0x10, 0x02, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '*' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0xf0, 0xff, 0x00, +0xf0, 0xff, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '+' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x0c, +0x00, 0xc0, 0x0f, +0x00, 0xc0, 0x07, +0x00, 0xc0, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char ',' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x0c, 0x00, +0x00, 0x0c, 0x00, +0x00, 0x0c, 0x00, +0x00, 0x0c, 0x00, +0x00, 0x0c, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '-' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0xc0, 0x01, +0x00, 0xc0, 0x01, +0x00, 0xc0, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '.' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x04, +0x00, 0x00, 0x07, +0x00, 0xc0, 0x03, +0x00, 0xf0, 0x00, +0x00, 0x3e, 0x00, +0x80, 0x0f, 0x00, +0xe0, 0x01, 0x00, +0x78, 0x00, 0x00, +0x1c, 0x00, 0x00, +0x04, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '/' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xc0, 0x1f, 0x00, +0xf0, 0x7f, 0x00, +0x38, 0xe0, 0x00, +0x0c, 0x80, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x80, 0x01, +0x38, 0xe0, 0x00, +0xf0, 0x7f, 0x00, +0xc0, 0x1f, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '0' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x18, 0x80, 0x01, +0x18, 0x80, 0x01, +0x0c, 0x80, 0x01, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '1' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x18, 0x80, 0x01, +0x1c, 0xc0, 0x01, +0x0c, 0xe0, 0x01, +0x0c, 0xb0, 0x01, +0x0c, 0xb8, 0x01, +0x0c, 0x9c, 0x01, +0x0c, 0x8e, 0x01, +0x18, 0x87, 0x01, +0xf8, 0x83, 0x01, +0xf0, 0x81, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '2' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x18, 0xc0, 0x00, +0x08, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x98, 0xc7, 0x00, +0xf8, 0xfd, 0x00, +0xf0, 0x78, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '3' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x38, 0x00, +0x00, 0x3c, 0x00, +0x00, 0x37, 0x00, +0x80, 0x31, 0x00, +0xe0, 0x30, 0x00, +0x38, 0x30, 0x00, +0x0c, 0x30, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x00, 0x30, 0x00, +0x00, 0x30, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '4' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0xc0, 0x00, +0xfc, 0x83, 0x01, +0xfc, 0x81, 0x01, +0x8c, 0x81, 0x01, +0x8c, 0x81, 0x01, +0x8c, 0x81, 0x01, +0x8c, 0x81, 0x01, +0x0c, 0xc3, 0x00, +0x0c, 0xff, 0x00, +0x00, 0x3c, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '5' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xc0, 0x3f, 0x00, +0xf0, 0xff, 0x00, +0x78, 0xc6, 0x00, +0x1c, 0x82, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0xc7, 0x01, +0x18, 0xfe, 0x00, +0x00, 0x7c, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '6' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x0c, 0x00, 0x01, +0x0c, 0xe0, 0x01, +0x0c, 0xf8, 0x00, +0x0c, 0x3e, 0x00, +0xcc, 0x07, 0x00, +0xfc, 0x01, 0x00, +0x7c, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '7' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x70, 0x78, 0x00, +0xf8, 0xfc, 0x00, +0x9c, 0xc7, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x9c, 0xc7, 0x01, +0xf8, 0xfc, 0x00, +0x70, 0x78, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '8' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xf0, 0x01, 0x00, +0xf8, 0xc3, 0x00, +0x1c, 0x87, 0x01, +0x0c, 0x86, 0x01, +0x0c, 0x86, 0x01, +0x0c, 0x86, 0x01, +0x0c, 0xc2, 0x01, +0x18, 0xf3, 0x00, +0xf8, 0x7f, 0x00, +0xe0, 0x1f, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '9' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xc0, 0xc1, 0x01, +0xc0, 0xc1, 0x01, +0xc0, 0xc1, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char ':' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x0c, +0xc0, 0xc1, 0x0f, +0xc0, 0xc1, 0x07, +0xc0, 0xc1, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char ';' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x0f, 0x00, +0x00, 0x0f, 0x00, +0x80, 0x19, 0x00, +0x80, 0x19, 0x00, +0x80, 0x10, 0x00, +0xc0, 0x30, 0x00, +0xc0, 0x30, 0x00, +0x40, 0x20, 0x00, +0x60, 0x60, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '<' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x33, 0x00, +0x00, 0x33, 0x00, +0x00, 0x33, 0x00, +0x00, 0x33, 0x00, +0x00, 0x33, 0x00, +0x00, 0x33, 0x00, +0x00, 0x33, 0x00, +0x00, 0x33, 0x00, +0x00, 0x33, 0x00, +0x00, 0x33, 0x00, +0x00, 0x33, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '=' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x60, 0x60, 0x00, +0x40, 0x20, 0x00, +0xc0, 0x30, 0x00, +0xc0, 0x30, 0x00, +0x80, 0x10, 0x00, +0x80, 0x19, 0x00, +0x80, 0x19, 0x00, +0x00, 0x0f, 0x00, +0x00, 0x0f, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '>' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x18, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x0c, 0xce, 0x01, +0x0c, 0xcf, 0x01, +0x8c, 0x01, 0x00, +0xcc, 0x01, 0x00, +0xf8, 0x00, 0x00, +0x70, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '?' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x7f, 0x00, +0xc0, 0xff, 0x01, +0xe0, 0x80, 0x03, +0x30, 0x00, 0x06, +0x18, 0x3e, 0x04, +0x08, 0x7f, 0x08, +0x88, 0xc1, 0x08, +0x88, 0x80, 0x08, +0x88, 0x80, 0x08, +0x98, 0xc1, 0x08, +0xf0, 0xff, 0x00, +0xe0, 0xff, 0x00, +0x00, 0x00, 0x00, // Char '@' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x80, 0x01, +0x00, 0xf8, 0x01, +0x80, 0x7f, 0x00, +0xf0, 0x1f, 0x00, +0xfc, 0x18, 0x00, +0xfc, 0x18, 0x00, +0xf0, 0x1f, 0x00, +0x80, 0x7f, 0x00, +0x00, 0xf8, 0x01, +0x00, 0x80, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'A' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x9c, 0x83, 0x01, +0xf8, 0xc7, 0x01, +0xf0, 0xfc, 0x00, +0x00, 0x78, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'B' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xc0, 0x1f, 0x00, +0xf0, 0x7f, 0x00, +0x38, 0xe0, 0x00, +0x18, 0xc0, 0x00, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x18, 0xc0, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'C' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x18, 0xc0, 0x00, +0x38, 0xe0, 0x00, +0xf0, 0x7f, 0x00, +0xc0, 0x1f, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'D' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x80, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'E' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x0c, 0x03, 0x00, +0x0c, 0x03, 0x00, +0x0c, 0x03, 0x00, +0x0c, 0x03, 0x00, +0x0c, 0x03, 0x00, +0x0c, 0x03, 0x00, +0x0c, 0x03, 0x00, +0x0c, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'F' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xc0, 0x1f, 0x00, +0xf0, 0x7f, 0x00, +0x38, 0xe0, 0x00, +0x1c, 0xc0, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x86, 0x01, +0x0c, 0x86, 0x01, +0x18, 0xfe, 0x00, +0x00, 0xfe, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'G' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x00, 0x03, 0x00, +0x00, 0x03, 0x00, +0x00, 0x03, 0x00, +0x00, 0x03, 0x00, +0x00, 0x03, 0x00, +0x00, 0x03, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'H' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'I' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0xc0, 0x00, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0xc0, 0x01, +0xfc, 0xff, 0x00, +0xfc, 0x7f, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'J' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x00, 0x07, 0x00, +0x80, 0x03, 0x00, +0xc0, 0x07, 0x00, +0xe0, 0x0e, 0x00, +0x70, 0x3c, 0x00, +0x18, 0x70, 0x00, +0x0c, 0xe0, 0x01, +0x04, 0x80, 0x01, +0x00, 0x00, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'K' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'L' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x3c, 0x00, 0x00, +0xe0, 0x01, 0x00, +0x00, 0x0f, 0x00, +0x00, 0x0f, 0x00, +0xe0, 0x01, 0x00, +0x3c, 0x00, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'M' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x3c, 0x00, 0x00, +0xf0, 0x00, 0x00, +0xc0, 0x03, 0x00, +0x00, 0x1e, 0x00, +0x00, 0x78, 0x00, +0x00, 0xe0, 0x01, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'N' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xe0, 0x3f, 0x00, +0xf8, 0xff, 0x00, +0x38, 0xe0, 0x00, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x38, 0xe0, 0x00, +0xf8, 0xff, 0x00, +0xe0, 0x3f, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'O' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x0c, 0x06, 0x00, +0x0c, 0x06, 0x00, +0x0c, 0x06, 0x00, +0x0c, 0x06, 0x00, +0x0c, 0x06, 0x00, +0x1c, 0x07, 0x00, +0xf8, 0x03, 0x00, +0xf0, 0x01, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'P' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xe0, 0x3f, 0x00, +0xf8, 0x7f, 0x00, +0x38, 0xe0, 0x00, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x0c, 0x80, 0x03, +0x38, 0xe0, 0x0e, +0xf8, 0x7f, 0x04, +0xe0, 0x3f, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'Q' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x0c, 0x06, 0x00, +0x0c, 0x06, 0x00, +0x0c, 0x06, 0x00, +0x0c, 0x06, 0x00, +0x0c, 0x0e, 0x00, +0x18, 0x1f, 0x00, +0xf8, 0x7b, 0x00, +0xf0, 0xe0, 0x01, +0x00, 0x80, 0x01, +0x00, 0x00, 0x01, +0x00, 0x00, 0x00, // Char 'R' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xf0, 0xc0, 0x00, +0xf8, 0x81, 0x01, +0x9c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x83, 0x01, +0x0c, 0x86, 0x01, +0x0c, 0xc6, 0x01, +0x18, 0xfc, 0x00, +0x00, 0x78, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'S' + + + 15, + +0x00, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x0c, 0x00, 0x00, +0xfc, 0xff, 0x01, +0xfc, 0xff, 0x01, +0x0c, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'T' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfc, 0x7f, 0x00, +0xfc, 0xff, 0x00, +0x00, 0xc0, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0xc0, 0x01, +0xfc, 0xff, 0x00, +0xfc, 0x7f, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'U' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x0c, 0x00, 0x00, +0xfc, 0x00, 0x00, +0xf0, 0x0f, 0x00, +0x00, 0x7f, 0x00, +0x00, 0xf8, 0x01, +0x00, 0xf8, 0x01, +0x00, 0x7f, 0x00, +0xf0, 0x0f, 0x00, +0xfc, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'V' + + + 15, + +0x00, 0x00, 0x00, +0x1c, 0x00, 0x00, +0xfc, 0x0f, 0x00, +0xe0, 0xff, 0x01, +0x00, 0xf8, 0x01, +0x00, 0xfc, 0x00, +0xc0, 0x0f, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0x0f, 0x00, +0x00, 0xfc, 0x00, +0x00, 0xf8, 0x01, +0xe0, 0xff, 0x01, +0xfc, 0x0f, 0x00, +0x1c, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'W' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x04, 0x00, 0x01, +0x1c, 0xc0, 0x01, +0x3c, 0xf0, 0x00, +0xf0, 0x3c, 0x00, +0xc0, 0x0f, 0x00, +0xc0, 0x1f, 0x00, +0xf0, 0x7c, 0x00, +0x3c, 0xf0, 0x01, +0x1c, 0xc0, 0x01, +0x04, 0x00, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'X' + + + 15, + +0x00, 0x00, 0x00, +0x04, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x3c, 0x00, 0x00, +0xf0, 0x00, 0x00, +0xc0, 0x01, 0x00, +0x80, 0xff, 0x01, +0x80, 0xff, 0x01, +0xc0, 0x01, 0x00, +0xf0, 0x00, 0x00, +0x3c, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x04, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'Y' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x0c, 0x80, 0x01, +0x0c, 0xe0, 0x01, +0x0c, 0xf0, 0x01, +0x0c, 0xbc, 0x01, +0x0c, 0x8f, 0x01, +0x8c, 0x87, 0x01, +0xec, 0x81, 0x01, +0x7c, 0x80, 0x01, +0x3c, 0x80, 0x01, +0x0c, 0x80, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'Z' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfe, 0xff, 0x0f, +0xfe, 0xff, 0x0f, +0x06, 0x00, 0x0c, +0x06, 0x00, 0x0c, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '[' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x04, 0x00, 0x00, +0x1c, 0x00, 0x00, +0x78, 0x00, 0x00, +0xe0, 0x01, 0x00, +0x80, 0x0f, 0x00, +0x00, 0x3e, 0x00, +0x00, 0xf0, 0x00, +0x00, 0xc0, 0x03, +0x00, 0x00, 0x07, +0x00, 0x00, 0x04, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '\' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x06, 0x00, 0x0c, +0x06, 0x00, 0x0c, +0xfe, 0xff, 0x0f, +0xfe, 0xff, 0x0f, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char ']' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x80, 0x00, 0x00, +0xc0, 0x00, 0x00, +0x60, 0x00, 0x00, +0x38, 0x00, 0x00, +0x1c, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x1c, 0x00, 0x00, +0x38, 0x00, 0x00, +0x60, 0x00, 0x00, +0xc0, 0x00, 0x00, +0x80, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '^' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x30, +0x00, 0x00, 0x30, +0x00, 0x00, 0x30, +0x00, 0x00, 0x30, +0x00, 0x00, 0x30, +0x00, 0x00, 0x30, +0x00, 0x00, 0x30, +0x00, 0x00, 0x30, +0x00, 0x00, 0x30, +0x00, 0x00, 0x30, +0x00, 0x00, 0x30, +0x00, 0x00, 0x30, +0x00, 0x00, 0x30, +0x00, 0x00, 0x00, // Char '_' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x01, 0x00, 0x00, +0x03, 0x00, 0x00, +0x06, 0x00, 0x00, +0x0c, 0x00, 0x00, +0x08, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '`' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x70, 0x00, +0x80, 0xf9, 0x00, +0xc0, 0x9c, 0x01, +0xc0, 0x8c, 0x01, +0xc0, 0x8c, 0x01, +0xc0, 0x8c, 0x01, +0xc0, 0x8c, 0x00, +0xc0, 0x4d, 0x00, +0x80, 0xff, 0x01, +0x00, 0xff, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'a' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfe, 0xff, 0x01, +0xfe, 0xff, 0x01, +0x80, 0xc1, 0x00, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0xc1, 0x01, +0x80, 0xff, 0x00, +0x00, 0x3e, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'b' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x3e, 0x00, +0x80, 0xff, 0x00, +0x80, 0xc1, 0x00, +0xc0, 0xc1, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0x80, 0xc1, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'c' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x3e, 0x00, +0x80, 0xff, 0x00, +0xc0, 0xc1, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0x80, 0xc1, 0x00, +0xfe, 0xff, 0x01, +0xfe, 0xff, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'd' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x3e, 0x00, +0x80, 0x7f, 0x00, +0x80, 0xcd, 0x00, +0xc0, 0x8c, 0x01, +0xc0, 0x8c, 0x01, +0xc0, 0x8c, 0x01, +0xc0, 0x8c, 0x01, +0xc0, 0x8d, 0x01, +0x80, 0x8f, 0x01, +0x00, 0xcf, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'e' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xf8, 0xff, 0x01, +0xfc, 0xff, 0x01, +0xc6, 0x00, 0x00, +0xc6, 0x00, 0x00, +0xc6, 0x00, 0x00, +0xc6, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'f' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x3e, 0x00, +0x80, 0xff, 0x0c, +0x80, 0xc1, 0x19, +0xc0, 0x80, 0x19, +0xc0, 0x80, 0x19, +0xc0, 0x80, 0x19, +0xc0, 0x80, 0x19, +0x80, 0xc1, 0x0c, +0xc0, 0xff, 0x0f, +0xc0, 0xff, 0x07, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'g' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfe, 0xff, 0x01, +0xfe, 0xff, 0x01, +0x00, 0x01, 0x00, +0x80, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0x01, 0x00, +0x80, 0xff, 0x01, +0x00, 0xff, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'h' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc6, 0xff, 0x01, +0xc6, 0xff, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'i' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x18, +0xc0, 0x00, 0x18, +0xc0, 0x00, 0x18, +0xc0, 0x00, 0x18, +0xc6, 0xff, 0x0f, +0xc6, 0xff, 0x07, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'j' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfe, 0xff, 0x01, +0xfe, 0xff, 0x01, +0x00, 0x1c, 0x00, +0x00, 0x0e, 0x00, +0x00, 0x1f, 0x00, +0x80, 0x3b, 0x00, +0xc0, 0xf1, 0x00, +0xc0, 0xc0, 0x01, +0x40, 0x80, 0x01, +0x00, 0x00, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'k' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x06, 0x00, 0x00, +0x06, 0x00, 0x00, +0x06, 0x00, 0x00, +0x06, 0x00, 0x00, +0xfe, 0x7f, 0x00, +0xfe, 0xff, 0x00, +0x00, 0xc0, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'l' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xc0, 0xff, 0x01, +0xc0, 0xff, 0x01, +0x80, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0xff, 0x01, +0x80, 0xff, 0x01, +0xc0, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0xff, 0x01, +0x80, 0xff, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'm' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xc0, 0xff, 0x01, +0xc0, 0xff, 0x01, +0x00, 0x01, 0x00, +0x80, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0x01, 0x00, +0x80, 0xff, 0x01, +0x00, 0xff, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'n' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x3e, 0x00, +0x80, 0xff, 0x00, +0x80, 0xc1, 0x00, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0x80, 0xc1, 0x00, +0x80, 0xff, 0x00, +0x00, 0x3e, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'o' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xc0, 0xff, 0x1f, +0xc0, 0xff, 0x1f, +0x80, 0xc1, 0x00, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0xc1, 0x01, +0x80, 0xff, 0x00, +0x00, 0x3e, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'p' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x3e, 0x00, +0x80, 0xff, 0x00, +0xc0, 0xc1, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0x80, 0xc1, 0x00, +0xc0, 0xff, 0x1f, +0xc0, 0xff, 0x1f, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'q' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xc0, 0xff, 0x01, +0xc0, 0xff, 0x01, +0x00, 0x03, 0x00, +0x80, 0x01, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0x00, 0x00, +0x80, 0x01, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'r' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0xc7, 0x00, +0x80, 0x87, 0x01, +0xc0, 0x8c, 0x01, +0xc0, 0x8c, 0x01, +0xc0, 0x8c, 0x01, +0xc0, 0x8c, 0x01, +0xc0, 0x8c, 0x01, +0xc0, 0xdc, 0x01, +0x80, 0xf9, 0x00, +0x00, 0x70, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 's' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xf8, 0xff, 0x00, +0xf8, 0xff, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0x80, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 't' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xc0, 0x7f, 0x00, +0xc0, 0xff, 0x00, +0x00, 0xc0, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x01, +0x00, 0x80, 0x00, +0x00, 0x40, 0x00, +0xc0, 0xff, 0x01, +0xc0, 0xff, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'u' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x40, 0x00, 0x00, +0xc0, 0x03, 0x00, +0x80, 0x1f, 0x00, +0x00, 0xfc, 0x00, +0x00, 0xe0, 0x01, +0x00, 0xe0, 0x01, +0x00, 0xfc, 0x00, +0x80, 0x1f, 0x00, +0xc0, 0x03, 0x00, +0x40, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'v' + + + 15, + +0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, +0xc0, 0x0f, 0x00, +0x00, 0xff, 0x00, +0x00, 0xf0, 0x01, +0x00, 0xe0, 0x01, +0x00, 0x3c, 0x00, +0x00, 0x06, 0x00, +0x00, 0x3c, 0x00, +0x00, 0xe0, 0x01, +0x00, 0xf0, 0x01, +0x00, 0xff, 0x00, +0xc0, 0x0f, 0x00, +0xc0, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'w' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x40, 0x00, 0x01, +0xc0, 0x80, 0x01, +0xc0, 0xe1, 0x01, +0x80, 0x77, 0x00, +0x00, 0x3e, 0x00, +0x00, 0x3e, 0x00, +0x80, 0x77, 0x00, +0xc0, 0xe1, 0x01, +0xc0, 0x80, 0x01, +0x40, 0x00, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'x' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x40, 0x00, 0x00, +0xc0, 0x03, 0x18, +0x80, 0x0f, 0x18, +0x00, 0x3e, 0x1c, +0x00, 0xf0, 0x0f, +0x00, 0xf0, 0x03, +0x00, 0x7c, 0x00, +0x80, 0x0f, 0x00, +0xc0, 0x03, 0x00, +0x40, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'y' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xc0, 0x80, 0x01, +0xc0, 0xc0, 0x01, +0xc0, 0xe0, 0x01, +0xc0, 0xf8, 0x01, +0xc0, 0x9c, 0x01, +0xc0, 0x8e, 0x01, +0xc0, 0x87, 0x01, +0xc0, 0x83, 0x01, +0xc0, 0x81, 0x01, +0xc0, 0x80, 0x01, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char 'z' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x0e, 0x00, +0xfc, 0xff, 0x07, +0xfe, 0xf9, 0x0f, +0x06, 0x00, 0x0c, +0x06, 0x00, 0x0c, +0x06, 0x00, 0x0c, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '{' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0xfe, 0xff, 0x3f, +0xfe, 0xff, 0x3f, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '|' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x06, 0x00, 0x0c, +0x06, 0x00, 0x0c, +0x06, 0x00, 0x0c, +0xfe, 0xf9, 0x0f, +0xfc, 0xff, 0x07, +0x00, 0x0e, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '}' + + + 15, + +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, +0x00, 0x0c, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x06, 0x00, +0x00, 0x0c, 0x00, +0x00, 0x0c, 0x00, +0x00, 0x0c, 0x00, +0x00, 0x0c, 0x00, +0x00, 0x06, 0x00, +0x00, 0x00, 0x00, +0x00, 0x00, 0x00, // Char '~' + + +}; + + + +#endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/unigraphic/Mono19x27.h Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,1920 @@ +// Save as: fonts/FONT_MONOSPACE_19x27_32_TO_126.h + +#ifndef FONT_MONOSPACE_19x27_32_TO_126_H +#define FONT_MONOSPACE_19x27_32_TO_126_H + +// Size: 19x27 +// Chars: 32 to 126 +#ifdef TOOLCHAIN_GCC +const unsigned char Mono19x27[] __attribute__((aligned (2))) = { +#else +__align(2) +const unsigned char Mono19x27[] = { +#endif + 3, 19, 27, 3 /*unused*/, + // byte/char, horz, vert, byte/vert + + 9, +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, 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, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char ' ' + 7, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0x7f, 0x1c, 0x00, +0xfe, 0x7f, 0x1c, 0x00, +0xfe, 0x7f, 0x1c, 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, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '!' + 11, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0x00, 0x00, 0x00, +0xfe, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0x00, 0x00, 0x00, +0xfe, 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, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '"' + 17, +0x00, 0xc0, 0x00, 0x00, +0x00, 0xc3, 0x00, 0x00, +0x00, 0xc3, 0x18, 0x00, +0x00, 0xc3, 0x1f, 0x00, +0x00, 0xf3, 0x0f, 0x00, +0x00, 0xff, 0x00, 0x00, +0xf0, 0xcf, 0x00, 0x00, +0xf8, 0xc3, 0x10, 0x00, +0x08, 0xc3, 0x1e, 0x00, +0x00, 0xe3, 0x1f, 0x00, +0x00, 0xff, 0x01, 0x00, +0xe0, 0xdf, 0x00, 0x00, +0xf8, 0xc3, 0x00, 0x00, +0x38, 0xc3, 0x00, 0x00, +0x00, 0xc3, 0x00, 0x00, +0x00, 0x03, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '#' + 17, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x80, 0x07, 0x0c, 0x00, +0xe0, 0x0f, 0x08, 0x00, +0xe0, 0x1f, 0x18, 0x00, +0x70, 0x1c, 0x18, 0x00, +0x30, 0x18, 0x18, 0x00, +0xfe, 0xff, 0xff, 0x01, +0x30, 0x30, 0x18, 0x00, +0x30, 0x30, 0x18, 0x00, +0x30, 0x70, 0x1c, 0x00, +0x60, 0xe0, 0x0f, 0x00, +0x60, 0xe0, 0x07, 0x00, +0x00, 0xc0, 0x03, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '$' + 17, +0x78, 0x00, 0x00, 0x00, +0xfc, 0x40, 0x00, 0x00, +0xce, 0x61, 0x00, 0x00, +0x86, 0x21, 0x00, 0x00, +0x86, 0x31, 0x00, 0x00, +0xce, 0x19, 0x00, 0x00, +0xfc, 0x08, 0x00, 0x00, +0x78, 0x8c, 0x07, 0x00, +0x00, 0xc4, 0x0f, 0x00, +0x00, 0xe6, 0x1c, 0x00, +0x00, 0x63, 0x18, 0x00, +0x00, 0x61, 0x18, 0x00, +0x80, 0xe1, 0x1c, 0x00, +0x80, 0xc0, 0x0f, 0x00, +0x00, 0x80, 0x07, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '%' + 17, +0x00, 0x00, 0x00, 0x00, +0x00, 0xf0, 0x01, 0x00, +0x00, 0xf8, 0x07, 0x00, +0x78, 0xfc, 0x0f, 0x00, +0xfc, 0x0f, 0x0e, 0x00, +0xfe, 0x07, 0x1c, 0x00, +0x8e, 0x1f, 0x18, 0x00, +0x06, 0x3e, 0x18, 0x00, +0x06, 0xfc, 0x18, 0x00, +0x06, 0xf0, 0x19, 0x00, +0x0c, 0xe0, 0x0f, 0x00, +0x00, 0x80, 0x07, 0x00, +0x00, 0x00, 0x1f, 0x00, +0x00, 0x80, 0x1f, 0x00, +0x00, 0xf8, 0x1d, 0x00, +0x00, 0x78, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '&' + 6, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0x00, 0x00, 0x00, +0xfe, 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, 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, // Char ''' + 10, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0xff, 0x00, 0x00, +0xe0, 0xff, 0x07, 0x00, +0xf8, 0xff, 0x1f, 0x00, +0x7e, 0x00, 0x7e, 0x00, +0x07, 0x00, 0xe0, 0x00, +0x01, 0x00, 0x80, 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, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '(' + 10, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x80, 0x00, +0x0f, 0x00, 0xf0, 0x00, +0x7e, 0x00, 0x7e, 0x00, +0xf8, 0xff, 0x1f, 0x00, +0xe0, 0xff, 0x07, 0x00, +0x00, 0xff, 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, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char ')' + 17, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x18, 0x06, 0x00, 0x00, +0x18, 0x06, 0x00, 0x00, +0x30, 0x03, 0x00, 0x00, +0x20, 0x01, 0x00, 0x00, +0xe0, 0x01, 0x00, 0x00, +0xfe, 0x1f, 0x00, 0x00, +0xfe, 0x1f, 0x00, 0x00, +0xe0, 0x01, 0x00, 0x00, +0x20, 0x01, 0x00, 0x00, +0x30, 0x03, 0x00, 0x00, +0x18, 0x06, 0x00, 0x00, +0x18, 0x06, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '*' + 17, +0x00, 0x00, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0xc0, 0xff, 0x0f, 0x00, +0xc0, 0xff, 0x0f, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '+' + 6, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xc0, 0x01, +0x00, 0x00, 0xfe, 0x01, +0x00, 0x00, 0xfe, 0x00, +0x00, 0x00, 0x1e, 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, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char ',' + 11, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x60, 0x00, 0x00, +0x00, 0x60, 0x00, 0x00, +0x00, 0x60, 0x00, 0x00, +0x00, 0x60, 0x00, 0x00, +0x00, 0x60, 0x00, 0x00, +0x00, 0x60, 0x00, 0x00, +0x00, 0x60, 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, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '-' + 5, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1e, 0x00, +0x00, 0x00, 0x1e, 0x00, +0x00, 0x00, 0x1e, 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, 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, // Char '.' + 16, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x70, 0x00, +0x00, 0x00, 0x7e, 0x00, +0x00, 0x80, 0x3f, 0x00, +0x00, 0xe0, 0x0f, 0x00, +0x00, 0xf8, 0x03, 0x00, +0x00, 0x7e, 0x00, 0x00, +0xc0, 0x1f, 0x00, 0x00, +0xf0, 0x07, 0x00, 0x00, +0xfc, 0x01, 0x00, 0x00, +0x7e, 0x00, 0x00, 0x00, +0x0e, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '/' + 15, +0x00, 0x00, 0x00, 0x00, +0xc0, 0xff, 0x00, 0x00, +0xf0, 0xff, 0x03, 0x00, +0xfc, 0xff, 0x0f, 0x00, +0x3c, 0x00, 0x0f, 0x00, +0x0e, 0x00, 0x1c, 0x00, +0x06, 0x0e, 0x18, 0x00, +0x06, 0x0e, 0x18, 0x00, +0x06, 0x0e, 0x18, 0x00, +0x0e, 0x00, 0x1c, 0x00, +0x3c, 0x00, 0x0f, 0x00, +0xf8, 0xff, 0x0f, 0x00, +0xf0, 0xff, 0x03, 0x00, +0xc0, 0xff, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '0' + 15, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x0c, 0x00, 0x18, 0x00, +0x0c, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '1' + 15, +0x00, 0x00, 0x00, 0x00, +0x1c, 0x00, 0x18, 0x00, +0x0c, 0x00, 0x1c, 0x00, +0x0e, 0x00, 0x1e, 0x00, +0x06, 0x00, 0x1f, 0x00, +0x06, 0x80, 0x1b, 0x00, +0x06, 0xe0, 0x19, 0x00, +0x06, 0xf0, 0x18, 0x00, +0x06, 0xf8, 0x18, 0x00, +0x0e, 0x7c, 0x18, 0x00, +0x1c, 0x3e, 0x18, 0x00, +0xfc, 0x1f, 0x18, 0x00, +0xf8, 0x0f, 0x18, 0x00, +0xf0, 0x03, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '2' + 15, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0c, 0x00, +0x0c, 0x00, 0x0c, 0x00, +0x0c, 0x00, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x0f, 0x1c, 0x00, +0x0c, 0x1f, 0x0e, 0x00, +0xfc, 0xf9, 0x0f, 0x00, +0xf8, 0xf9, 0x07, 0x00, +0xf0, 0xe0, 0x03, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '3' + 15, +0x00, 0x00, 0x00, 0x00, +0x00, 0xe0, 0x00, 0x00, +0x00, 0xf8, 0x00, 0x00, +0x00, 0xdc, 0x00, 0x00, +0x00, 0xcf, 0x00, 0x00, +0xc0, 0xc3, 0x00, 0x00, +0xe0, 0xc0, 0x00, 0x00, +0x38, 0xc0, 0x00, 0x00, +0x1c, 0xc0, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x00, 0xc0, 0x00, 0x00, +0x00, 0xc0, 0x00, 0x00, +0x00, 0xc0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '4' + 15, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0c, 0x00, +0xfe, 0x07, 0x1c, 0x00, +0xfe, 0x03, 0x18, 0x00, +0xfe, 0x03, 0x18, 0x00, +0x06, 0x03, 0x18, 0x00, +0x06, 0x03, 0x18, 0x00, +0x06, 0x03, 0x18, 0x00, +0x06, 0x03, 0x18, 0x00, +0x06, 0x07, 0x1c, 0x00, +0x06, 0x0e, 0x0e, 0x00, +0x06, 0xfe, 0x0f, 0x00, +0x06, 0xfc, 0x07, 0x00, +0x00, 0xf0, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '5' + 15, +0x00, 0x00, 0x00, 0x00, +0x80, 0xff, 0x00, 0x00, +0xf0, 0xff, 0x03, 0x00, +0xf8, 0xff, 0x0f, 0x00, +0x7c, 0x0c, 0x0e, 0x00, +0x1c, 0x06, 0x1c, 0x00, +0x0e, 0x03, 0x18, 0x00, +0x06, 0x03, 0x18, 0x00, +0x06, 0x03, 0x18, 0x00, +0x06, 0x07, 0x1c, 0x00, +0x06, 0x0f, 0x1e, 0x00, +0x06, 0xfe, 0x0f, 0x00, +0x0c, 0xfc, 0x07, 0x00, +0x00, 0xf8, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '6' + 15, +0x00, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x06, 0x00, 0x10, 0x00, +0x06, 0x00, 0x1e, 0x00, +0x06, 0xc0, 0x1f, 0x00, +0x06, 0xf8, 0x0f, 0x00, +0x06, 0xfe, 0x01, 0x00, +0xc6, 0x7f, 0x00, 0x00, +0xfe, 0x0f, 0x00, 0x00, +0xfe, 0x01, 0x00, 0x00, +0x3e, 0x00, 0x00, 0x00, +0x0e, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '7' + 15, +0x00, 0x00, 0x00, 0x00, +0xf0, 0xe0, 0x03, 0x00, +0xfc, 0xf9, 0x07, 0x00, +0xfc, 0xf9, 0x0f, 0x00, +0x0e, 0x1f, 0x0e, 0x00, +0x06, 0x0e, 0x1c, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x0e, 0x1c, 0x00, +0x0e, 0x1f, 0x0e, 0x00, +0xfc, 0xf9, 0x0f, 0x00, +0xfc, 0xf9, 0x07, 0x00, +0xf0, 0xe0, 0x03, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '8' + 16, +0x00, 0x00, 0x00, 0x00, +0xf0, 0x07, 0x00, 0x00, +0xf8, 0x0f, 0x0c, 0x00, +0xfc, 0x1f, 0x18, 0x00, +0x1e, 0x3c, 0x18, 0x00, +0x0e, 0x38, 0x18, 0x00, +0x06, 0x30, 0x18, 0x00, +0x06, 0x30, 0x18, 0x00, +0x06, 0x30, 0x1c, 0x00, +0x0e, 0x18, 0x0e, 0x00, +0x1c, 0x8c, 0x0f, 0x00, +0xfc, 0xff, 0x07, 0x00, +0xf0, 0xff, 0x03, 0x00, +0xc0, 0x7f, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '9' + 5, +0x00, 0x00, 0x00, 0x00, +0x80, 0x07, 0x1e, 0x00, +0x80, 0x07, 0x1e, 0x00, +0x80, 0x07, 0x1e, 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, 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, // Char ':' + 5, +0x00, 0x00, 0xc0, 0x01, +0x80, 0x07, 0xfe, 0x01, +0x80, 0x07, 0xfe, 0x00, +0x80, 0x07, 0x1e, 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, 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, // Char ';' + 15, +0x00, 0x00, 0x00, 0x00, +0x00, 0x38, 0x00, 0x00, +0x00, 0x38, 0x00, 0x00, +0x00, 0x7c, 0x00, 0x00, +0x00, 0x6c, 0x00, 0x00, +0x00, 0x6c, 0x00, 0x00, +0x00, 0xce, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0x83, 0x01, 0x00, +0x00, 0x83, 0x01, 0x00, +0x80, 0x83, 0x03, 0x00, +0x80, 0x01, 0x03, 0x00, +0x80, 0x01, 0x03, 0x00, +0xc0, 0x01, 0x07, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '<' + 15, +0x00, 0x00, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '=' + 15, +0x00, 0x00, 0x00, 0x00, +0xc0, 0x01, 0x07, 0x00, +0x80, 0x01, 0x03, 0x00, +0x80, 0x01, 0x03, 0x00, +0x80, 0x83, 0x03, 0x00, +0x00, 0x83, 0x01, 0x00, +0x00, 0x83, 0x01, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0xc6, 0x00, 0x00, +0x00, 0x6c, 0x00, 0x00, +0x00, 0x6c, 0x00, 0x00, +0x00, 0x7c, 0x00, 0x00, +0x00, 0x38, 0x00, 0x00, +0x00, 0x38, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '>' + 13, +0x00, 0x00, 0x00, 0x00, +0x18, 0x00, 0x00, 0x00, +0x0c, 0x00, 0x00, 0x00, +0x0c, 0x00, 0x00, 0x00, +0x06, 0xf8, 0x1c, 0x00, +0x06, 0xfc, 0x1c, 0x00, +0x06, 0xff, 0x1c, 0x00, +0x06, 0x0f, 0x00, 0x00, +0xce, 0x07, 0x00, 0x00, +0xfc, 0x03, 0x00, 0x00, +0xfc, 0x01, 0x00, 0x00, +0xf0, 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, // Char '?' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0xfc, 0x03, 0x00, +0x80, 0xff, 0x0f, 0x00, +0xc0, 0x03, 0x3c, 0x00, +0xe0, 0x00, 0x70, 0x00, +0x70, 0x00, 0xe0, 0x00, +0x30, 0xf0, 0xc0, 0x00, +0x18, 0xfc, 0xc3, 0x00, +0x18, 0x0c, 0x83, 0x01, +0x18, 0x06, 0x86, 0x01, +0x18, 0x06, 0x86, 0x01, +0x18, 0x06, 0x86, 0x01, +0x30, 0x06, 0x86, 0x01, +0x70, 0x0c, 0xc3, 0x01, +0xe0, 0xff, 0x07, 0x00, +0x80, 0xff, 0x07, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '@' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x1f, 0x00, +0x00, 0xf0, 0x1f, 0x00, +0x00, 0xfe, 0x0f, 0x00, +0xc0, 0xff, 0x00, 0x00, +0xfc, 0xdf, 0x00, 0x00, +0xfe, 0xc3, 0x00, 0x00, +0x3e, 0xc0, 0x00, 0x00, +0xfe, 0xc3, 0x00, 0x00, +0xfc, 0xdf, 0x00, 0x00, +0xc0, 0xff, 0x00, 0x00, +0x00, 0xfe, 0x0f, 0x00, +0x00, 0xe0, 0x1f, 0x00, +0x00, 0x00, 0x1f, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'A' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x0e, 0x0f, 0x1c, 0x00, +0xfc, 0x1f, 0x0e, 0x00, +0xfc, 0xf9, 0x0f, 0x00, +0xf0, 0xf8, 0x07, 0x00, +0x00, 0xe0, 0x03, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'B' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x80, 0x7f, 0x00, 0x00, +0xf0, 0xff, 0x03, 0x00, +0xf8, 0xff, 0x07, 0x00, +0x7c, 0x80, 0x0f, 0x00, +0x1c, 0x00, 0x0e, 0x00, +0x0e, 0x00, 0x1c, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x0e, 0x00, 0x1c, 0x00, +0x1c, 0x00, 0x0e, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'C' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x0e, 0x00, 0x1c, 0x00, +0x0c, 0x00, 0x0c, 0x00, +0x3c, 0x80, 0x0f, 0x00, +0xf8, 0xff, 0x07, 0x00, +0xf0, 0xff, 0x03, 0x00, +0x80, 0x7f, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'D' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x06, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'E' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x06, 0x06, 0x00, 0x00, +0x06, 0x06, 0x00, 0x00, +0x06, 0x06, 0x00, 0x00, +0x06, 0x06, 0x00, 0x00, +0x06, 0x06, 0x00, 0x00, +0x06, 0x06, 0x00, 0x00, +0x06, 0x06, 0x00, 0x00, +0x06, 0x06, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'F' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x80, 0x7f, 0x00, 0x00, +0xf0, 0xff, 0x03, 0x00, +0xf8, 0xff, 0x07, 0x00, +0x7c, 0x00, 0x0f, 0x00, +0x1c, 0x00, 0x0c, 0x00, +0x0e, 0x00, 0x1c, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x18, 0x18, 0x00, +0x06, 0x18, 0x18, 0x00, +0x06, 0x18, 0x18, 0x00, +0x0e, 0xf8, 0x1f, 0x00, +0x1c, 0xf8, 0x0f, 0x00, +0x00, 0xf8, 0x0f, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'G' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x00, 0x06, 0x00, 0x00, +0x00, 0x06, 0x00, 0x00, +0x00, 0x06, 0x00, 0x00, +0x00, 0x06, 0x00, 0x00, +0x00, 0x06, 0x00, 0x00, +0x00, 0x06, 0x00, 0x00, +0x00, 0x06, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'H' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'I' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0e, 0x00, +0x00, 0x00, 0x0c, 0x00, +0x00, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x1c, 0x00, +0xfe, 0xff, 0x0f, 0x00, +0xfe, 0xff, 0x0f, 0x00, +0xfe, 0xff, 0x03, 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, // Char 'J' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x00, 0x1e, 0x00, 0x00, +0x00, 0x0f, 0x00, 0x00, +0x80, 0x1f, 0x00, 0x00, +0xc0, 0x3f, 0x00, 0x00, +0xe0, 0xfc, 0x00, 0x00, +0x70, 0xf0, 0x01, 0x00, +0x38, 0xe0, 0x07, 0x00, +0x1c, 0x80, 0x0f, 0x00, +0x0e, 0x00, 0x1f, 0x00, +0x06, 0x00, 0x1c, 0x00, +0x02, 0x00, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'K' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'L' + 19, +0x00, 0x00, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x1e, 0x00, 0x00, 0x00, +0xf8, 0x01, 0x00, 0x00, +0xc0, 0x0f, 0x00, 0x00, +0x00, 0x3c, 0x00, 0x00, +0x00, 0x3e, 0x00, 0x00, +0xc0, 0x0f, 0x00, 0x00, +0xf8, 0x01, 0x00, 0x00, +0x3e, 0x00, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'M' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x3e, 0x00, 0x00, 0x00, +0xf8, 0x01, 0x00, 0x00, +0xc0, 0x07, 0x00, 0x00, +0x00, 0x3f, 0x00, 0x00, +0x00, 0xf8, 0x00, 0x00, +0x00, 0xe0, 0x07, 0x00, +0x00, 0x00, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'N' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xc0, 0xff, 0x00, 0x00, +0xf0, 0xff, 0x03, 0x00, +0xfc, 0xff, 0x0f, 0x00, +0x3c, 0x00, 0x0f, 0x00, +0x0e, 0x00, 0x1c, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x0e, 0x00, 0x1c, 0x00, +0x3c, 0x00, 0x0f, 0x00, +0xfc, 0xff, 0x0f, 0x00, +0xf0, 0xff, 0x03, 0x00, +0xc0, 0xff, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'O' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x06, 0x18, 0x00, 0x00, +0x06, 0x18, 0x00, 0x00, +0x06, 0x18, 0x00, 0x00, +0x06, 0x18, 0x00, 0x00, +0x06, 0x18, 0x00, 0x00, +0x0e, 0x1c, 0x00, 0x00, +0x1c, 0x0e, 0x00, 0x00, +0xfc, 0x0f, 0x00, 0x00, +0xf8, 0x07, 0x00, 0x00, +0xf0, 0x03, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'P' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xc0, 0xff, 0x00, 0x00, +0xf0, 0xff, 0x03, 0x00, +0xfc, 0xff, 0x0f, 0x00, +0x3c, 0x00, 0x0f, 0x00, +0x0e, 0x00, 0x1c, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x18, 0x00, +0x06, 0x00, 0x38, 0x00, +0x0e, 0x00, 0x7c, 0x00, +0x3c, 0x00, 0xef, 0x01, +0xfc, 0xff, 0xcf, 0x00, +0xf0, 0xff, 0x83, 0x00, +0xc0, 0xff, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'Q' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x06, 0x0c, 0x00, 0x00, +0x06, 0x0c, 0x00, 0x00, +0x06, 0x0c, 0x00, 0x00, +0x06, 0x1c, 0x00, 0x00, +0x06, 0x3c, 0x00, 0x00, +0x0e, 0xfe, 0x00, 0x00, +0xfc, 0xf7, 0x03, 0x00, +0xf8, 0xe3, 0x0f, 0x00, +0xf0, 0x81, 0x1f, 0x00, +0x00, 0x00, 0x1c, 0x00, +0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'R' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xf0, 0x01, 0x0e, 0x00, +0xf8, 0x03, 0x0c, 0x00, +0xfc, 0x07, 0x1c, 0x00, +0x1c, 0x07, 0x18, 0x00, +0x0e, 0x0f, 0x18, 0x00, +0x06, 0x0e, 0x18, 0x00, +0x06, 0x0e, 0x18, 0x00, +0x06, 0x0e, 0x18, 0x00, +0x06, 0x1c, 0x1c, 0x00, +0x0e, 0x3c, 0x0e, 0x00, +0x0c, 0xfc, 0x0f, 0x00, +0x1c, 0xf8, 0x07, 0x00, +0x00, 0xe0, 0x03, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'S' + 19, +0x00, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0x06, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'T' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xfe, 0xff, 0x03, 0x00, +0xfe, 0xff, 0x07, 0x00, +0xfe, 0xff, 0x0f, 0x00, +0x00, 0x00, 0x1c, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x1c, 0x00, +0xfe, 0xff, 0x0f, 0x00, +0xfe, 0xff, 0x07, 0x00, +0xfe, 0xff, 0x03, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'U' + 19, +0x00, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x3e, 0x00, 0x00, 0x00, +0xfe, 0x03, 0x00, 0x00, +0xfc, 0x1f, 0x00, 0x00, +0xc0, 0xff, 0x00, 0x00, +0x00, 0xfe, 0x0f, 0x00, +0x00, 0xe0, 0x1f, 0x00, +0x00, 0x00, 0x1f, 0x00, +0x00, 0xf0, 0x1f, 0x00, +0x00, 0xfe, 0x0f, 0x00, +0xc0, 0xff, 0x00, 0x00, +0xfc, 0x1f, 0x00, 0x00, +0xfe, 0x03, 0x00, 0x00, +0x3e, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'V' + 19, +0x1e, 0x00, 0x00, 0x00, +0xfe, 0x07, 0x00, 0x00, +0xfe, 0xff, 0x03, 0x00, +0xf0, 0xff, 0x1f, 0x00, +0x00, 0xf8, 0x1f, 0x00, +0x00, 0xf0, 0x0f, 0x00, +0x80, 0xff, 0x00, 0x00, +0xc0, 0x07, 0x00, 0x00, +0xc0, 0x07, 0x00, 0x00, +0x80, 0xff, 0x00, 0x00, +0x00, 0xf0, 0x0f, 0x00, +0x00, 0xf8, 0x1f, 0x00, +0xf0, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x03, 0x00, +0xfe, 0x07, 0x00, 0x00, +0x1e, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'W' + 19, +0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x10, 0x00, +0x06, 0x00, 0x1c, 0x00, +0x1e, 0x00, 0x1e, 0x00, +0x3e, 0x80, 0x1f, 0x00, +0xfc, 0xe0, 0x07, 0x00, +0xf0, 0xf1, 0x03, 0x00, +0xe0, 0xff, 0x00, 0x00, +0x80, 0x3f, 0x00, 0x00, +0x80, 0x7f, 0x00, 0x00, +0xe0, 0xff, 0x00, 0x00, +0xf0, 0xf1, 0x03, 0x00, +0xfc, 0xc0, 0x07, 0x00, +0x3e, 0x80, 0x1f, 0x00, +0x1e, 0x00, 0x1e, 0x00, +0x06, 0x00, 0x18, 0x00, +0x02, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'X' + 19, +0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, +0x0e, 0x00, 0x00, 0x00, +0x3e, 0x00, 0x00, 0x00, +0x7e, 0x00, 0x00, 0x00, +0xf8, 0x01, 0x00, 0x00, +0xe0, 0x07, 0x00, 0x00, +0x80, 0xff, 0x1f, 0x00, +0x00, 0xfe, 0x1f, 0x00, +0x80, 0xff, 0x1f, 0x00, +0xe0, 0x07, 0x00, 0x00, +0xf8, 0x01, 0x00, 0x00, +0x7e, 0x00, 0x00, 0x00, +0x3e, 0x00, 0x00, 0x00, +0x0e, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'Y' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x06, 0x00, 0x1c, 0x00, +0x06, 0x00, 0x1f, 0x00, +0x06, 0x80, 0x1f, 0x00, +0x06, 0xe0, 0x1f, 0x00, +0x06, 0xf8, 0x19, 0x00, +0x06, 0xfc, 0x18, 0x00, +0x06, 0x3f, 0x18, 0x00, +0xc6, 0x0f, 0x18, 0x00, +0xe6, 0x07, 0x18, 0x00, +0xfe, 0x01, 0x18, 0x00, +0x7e, 0x00, 0x18, 0x00, +0x3e, 0x00, 0x18, 0x00, +0x0e, 0x00, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'Z' + 19, +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, 0x00, +0xff, 0xff, 0xff, 0x00, +0xff, 0xff, 0xff, 0x00, +0x03, 0x00, 0xc0, 0x00, +0x03, 0x00, 0xc0, 0x00, +0x03, 0x00, 0xc0, 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, // Char '[' + 19, +0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, +0x0e, 0x00, 0x00, 0x00, +0x7e, 0x00, 0x00, 0x00, +0xfc, 0x01, 0x00, 0x00, +0xf0, 0x07, 0x00, 0x00, +0xc0, 0x1f, 0x00, 0x00, +0x00, 0x7e, 0x00, 0x00, +0x00, 0xf8, 0x03, 0x00, +0x00, 0xe0, 0x0f, 0x00, +0x00, 0x80, 0x3f, 0x00, +0x00, 0x00, 0x7e, 0x00, +0x00, 0x00, 0x70, 0x00, +0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '\' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x03, 0x00, 0xc0, 0x00, +0x03, 0x00, 0xc0, 0x00, +0x03, 0x00, 0xc0, 0x00, +0xff, 0xff, 0xff, 0x00, +0xff, 0xff, 0xff, 0x00, +0xff, 0xff, 0xff, 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, // Char ']' + 19, +0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xe0, 0x00, 0x00, 0x00, +0x70, 0x00, 0x00, 0x00, +0x38, 0x00, 0x00, 0x00, +0x1e, 0x00, 0x00, 0x00, +0x0e, 0x00, 0x00, 0x00, +0x0e, 0x00, 0x00, 0x00, +0x1e, 0x00, 0x00, 0x00, +0x38, 0x00, 0x00, 0x00, +0x70, 0x00, 0x00, 0x00, +0xe0, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '^' + 19, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '_' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, +0x07, 0x00, 0x00, 0x00, +0x0c, 0x00, 0x00, 0x00, +0x08, 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, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '`' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x07, 0x00, +0x80, 0xe1, 0x0f, 0x00, +0x80, 0xe1, 0x1f, 0x00, +0xc0, 0x70, 0x1c, 0x00, +0xc0, 0x30, 0x18, 0x00, +0xc0, 0x30, 0x18, 0x00, +0xc0, 0x30, 0x18, 0x00, +0xc0, 0x30, 0x18, 0x00, +0xc0, 0x30, 0x0c, 0x00, +0xc0, 0x31, 0x06, 0x00, +0x80, 0xff, 0x1f, 0x00, +0x00, 0xff, 0x1f, 0x00, +0x00, 0xfe, 0x1f, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'a' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0x1f, 0x00, +0xff, 0xff, 0x1f, 0x00, +0xff, 0xff, 0x1f, 0x00, +0x80, 0x03, 0x0e, 0x00, +0x80, 0x01, 0x0c, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x01, 0x1c, 0x00, +0xc0, 0x03, 0x1e, 0x00, +0x80, 0xff, 0x0f, 0x00, +0x00, 0xff, 0x07, 0x00, +0x00, 0xfc, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'b' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0xfc, 0x01, 0x00, +0x00, 0xff, 0x07, 0x00, +0x80, 0xff, 0x0f, 0x00, +0x80, 0x07, 0x0e, 0x00, +0xc0, 0x01, 0x1c, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0x80, 0x01, 0x0c, 0x00, +0x00, 0x01, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'c' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0xfc, 0x01, 0x00, +0x00, 0xff, 0x07, 0x00, +0x80, 0xff, 0x0f, 0x00, +0xc0, 0x03, 0x1e, 0x00, +0xc0, 0x01, 0x1c, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0x80, 0x01, 0x0c, 0x00, +0x00, 0x03, 0x0e, 0x00, +0xff, 0xff, 0x1f, 0x00, +0xff, 0xff, 0x1f, 0x00, +0xff, 0xff, 0x1f, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'd' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0xfc, 0x01, 0x00, +0x00, 0xff, 0x07, 0x00, +0x80, 0xff, 0x0f, 0x00, +0x80, 0x33, 0x0e, 0x00, +0xc0, 0x31, 0x1c, 0x00, +0xc0, 0x30, 0x18, 0x00, +0xc0, 0x30, 0x18, 0x00, +0xc0, 0x30, 0x18, 0x00, +0xc0, 0x31, 0x18, 0x00, +0xc0, 0x33, 0x08, 0x00, +0x80, 0x3f, 0x0c, 0x00, +0x00, 0x3f, 0x06, 0x00, +0x00, 0x3c, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'e' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xfc, 0xff, 0x1f, 0x00, +0xfe, 0xff, 0x1f, 0x00, +0xff, 0xff, 0x1f, 0x00, +0xc7, 0x00, 0x00, 0x00, +0xc3, 0x00, 0x00, 0x00, +0xc3, 0x00, 0x00, 0x00, +0xc3, 0x00, 0x00, 0x00, +0xc3, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'f' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0xfc, 0x01, 0x00, +0x00, 0xff, 0x07, 0x00, +0x80, 0xff, 0x0f, 0x03, +0xc0, 0x03, 0x1e, 0x06, +0xc0, 0x01, 0x1c, 0x06, +0xc0, 0x00, 0x18, 0x06, +0xc0, 0x00, 0x18, 0x06, +0xc0, 0x00, 0x18, 0x06, +0x80, 0x01, 0x0c, 0x07, +0x00, 0x03, 0x86, 0x03, +0xc0, 0xff, 0xff, 0x03, +0xc0, 0xff, 0xff, 0x01, +0xc0, 0xff, 0x7f, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'g' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0x1f, 0x00, +0xff, 0xff, 0x1f, 0x00, +0xff, 0xff, 0x1f, 0x00, +0x00, 0x03, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x01, 0x00, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0x80, 0xff, 0x1f, 0x00, +0x00, 0xfe, 0x1f, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'h' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc7, 0xff, 0x1f, 0x00, +0xc7, 0xff, 0x1f, 0x00, +0xc7, 0xff, 0x1f, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'i' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x06, +0xc0, 0x00, 0x00, 0x06, +0xc0, 0x00, 0x00, 0x06, +0xc0, 0x00, 0x00, 0x06, +0xc0, 0x00, 0x00, 0x07, +0xc7, 0xff, 0xff, 0x03, +0xc7, 0xff, 0xff, 0x03, +0xc7, 0xff, 0xff, 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, // Char 'j' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0x1f, 0x00, +0xff, 0xff, 0x1f, 0x00, +0xff, 0xff, 0x1f, 0x00, +0x00, 0xf0, 0x00, 0x00, +0x00, 0x78, 0x00, 0x00, +0x00, 0xfc, 0x00, 0x00, +0x00, 0xfe, 0x01, 0x00, +0x00, 0xef, 0x03, 0x00, +0x80, 0x87, 0x0f, 0x00, +0xc0, 0x03, 0x1f, 0x00, +0xc0, 0x01, 0x1e, 0x00, +0xc0, 0x00, 0x18, 0x00, +0x40, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'k' + 19, +0x00, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, +0xff, 0xff, 0x03, 0x00, +0xff, 0xff, 0x0f, 0x00, +0xff, 0xff, 0x0f, 0x00, +0x00, 0x00, 0x1c, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'l' + 19, +0x00, 0x00, 0x00, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0x80, 0x01, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0x80, 0xff, 0x1f, 0x00, +0x00, 0xff, 0x1f, 0x00, +0x80, 0x01, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0x80, 0xff, 0x1f, 0x00, +0x00, 0xff, 0x1f, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'm' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0x00, 0x03, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x01, 0x00, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0x80, 0xff, 0x1f, 0x00, +0x00, 0xfe, 0x1f, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'n' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0xfc, 0x01, 0x00, +0x00, 0xff, 0x07, 0x00, +0x80, 0xff, 0x0f, 0x00, +0x80, 0x03, 0x0e, 0x00, +0xc0, 0x01, 0x1c, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x01, 0x1c, 0x00, +0x80, 0x03, 0x0e, 0x00, +0x80, 0xff, 0x0f, 0x00, +0x00, 0xff, 0x07, 0x00, +0x00, 0xfc, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'o' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xc0, 0xff, 0xff, 0x07, +0xc0, 0xff, 0xff, 0x07, +0xc0, 0xff, 0xff, 0x07, +0x80, 0x03, 0x0e, 0x00, +0x80, 0x01, 0x0c, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x01, 0x1c, 0x00, +0xc0, 0x03, 0x1e, 0x00, +0x80, 0xff, 0x0f, 0x00, +0x00, 0xff, 0x07, 0x00, +0x00, 0xfc, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'p' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0xfc, 0x01, 0x00, +0x00, 0xff, 0x07, 0x00, +0x80, 0xff, 0x0f, 0x00, +0xc0, 0x03, 0x1e, 0x00, +0xc0, 0x01, 0x1c, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0x80, 0x01, 0x0c, 0x00, +0x00, 0x03, 0x0e, 0x00, +0xc0, 0xff, 0xff, 0x07, +0xc0, 0xff, 0xff, 0x07, +0xc0, 0xff, 0xff, 0x07, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'q' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0x00, 0x03, 0x00, 0x00, +0x80, 0x01, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0x80, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'r' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x0f, 0x0c, 0x00, +0x80, 0x1f, 0x0c, 0x00, +0x80, 0x3f, 0x18, 0x00, +0xc0, 0x39, 0x18, 0x00, +0xc0, 0x38, 0x18, 0x00, +0xc0, 0x78, 0x18, 0x00, +0xc0, 0x70, 0x18, 0x00, +0xc0, 0xf0, 0x1c, 0x00, +0xc0, 0xf0, 0x0f, 0x00, +0x80, 0xe1, 0x0f, 0x00, +0x00, 0xc0, 0x07, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 's' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0xfc, 0xff, 0x07, 0x00, +0xfc, 0xff, 0x0f, 0x00, +0xfc, 0xff, 0x1f, 0x00, +0xc0, 0x00, 0x1c, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 't' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xc0, 0xff, 0x07, 0x00, +0xc0, 0xff, 0x0f, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0x00, 0x00, 0x1c, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x06, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0xc0, 0xff, 0x1f, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'u' + 19, +0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, +0xc0, 0x03, 0x00, 0x00, +0xc0, 0x1f, 0x00, 0x00, +0x80, 0xff, 0x00, 0x00, +0x00, 0xfc, 0x07, 0x00, +0x00, 0xf0, 0x1f, 0x00, +0x00, 0x80, 0x1f, 0x00, +0x00, 0x80, 0x1f, 0x00, +0x00, 0xf0, 0x1f, 0x00, +0x00, 0xfc, 0x07, 0x00, +0x80, 0xff, 0x00, 0x00, +0xc0, 0x1f, 0x00, 0x00, +0xc0, 0x03, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'v' + 19, +0xc0, 0x00, 0x00, 0x00, +0xc0, 0x1f, 0x00, 0x00, +0xc0, 0xff, 0x01, 0x00, +0x00, 0xff, 0x1f, 0x00, +0x00, 0xf0, 0x1f, 0x00, +0x00, 0x00, 0x1f, 0x00, +0x00, 0xf0, 0x03, 0x00, +0x00, 0x3c, 0x00, 0x00, +0x00, 0x3c, 0x00, 0x00, +0x00, 0xf0, 0x03, 0x00, +0x00, 0x00, 0x1f, 0x00, +0x00, 0xf0, 0x1f, 0x00, +0x00, 0xff, 0x1f, 0x00, +0xc0, 0xff, 0x01, 0x00, +0xc0, 0x1f, 0x00, 0x00, +0xc0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'w' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, +0x40, 0x00, 0x18, 0x00, +0xc0, 0x00, 0x1c, 0x00, +0xc0, 0x03, 0x1f, 0x00, +0xc0, 0x87, 0x0f, 0x00, +0x80, 0xdf, 0x07, 0x00, +0x00, 0xfe, 0x01, 0x00, +0x00, 0xfe, 0x01, 0x00, +0x80, 0xdf, 0x07, 0x00, +0xc0, 0x87, 0x0f, 0x00, +0xc0, 0x03, 0x1f, 0x00, +0xc0, 0x00, 0x1c, 0x00, +0x40, 0x00, 0x18, 0x00, +0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'x' + 19, +0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, +0xc0, 0x03, 0x00, 0x06, +0xc0, 0x1f, 0x00, 0x06, +0x80, 0x7f, 0x00, 0x07, +0x00, 0xfe, 0xc3, 0x07, +0x00, 0xf0, 0xff, 0x03, +0x00, 0x80, 0xff, 0x01, +0x00, 0x80, 0x7f, 0x00, +0x00, 0xf0, 0x0f, 0x00, +0x00, 0xfe, 0x03, 0x00, +0x80, 0x7f, 0x00, 0x00, +0xc0, 0x1f, 0x00, 0x00, +0xc0, 0x03, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'y' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xc0, 0x00, 0x1c, 0x00, +0xc0, 0x00, 0x1e, 0x00, +0xc0, 0x80, 0x1f, 0x00, +0xc0, 0xc0, 0x1f, 0x00, +0xc0, 0xf0, 0x1b, 0x00, +0xc0, 0xf8, 0x18, 0x00, +0xc0, 0x7e, 0x18, 0x00, +0xc0, 0x1f, 0x18, 0x00, +0xc0, 0x0f, 0x18, 0x00, +0xc0, 0x03, 0x18, 0x00, +0xc0, 0x01, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char 'z' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x18, 0x00, 0x00, +0x00, 0x18, 0x00, 0x00, +0x00, 0x18, 0x00, 0x00, +0x00, 0x3c, 0x00, 0x00, +0xfc, 0xff, 0x7f, 0x00, +0xfe, 0xe7, 0xff, 0x00, +0xff, 0xc3, 0xff, 0x01, +0x07, 0x00, 0xc0, 0x01, +0x03, 0x00, 0x80, 0x01, +0x03, 0x00, 0x80, 0x01, +0x03, 0x00, 0x80, 0x01, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '{' + 19, +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, 0x07, +0xff, 0xff, 0xff, 0x07, +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, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '|' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x03, 0x00, 0x80, 0x01, +0x03, 0x00, 0x80, 0x01, +0x03, 0x00, 0x80, 0x01, +0x07, 0x00, 0xc0, 0x01, +0xff, 0xc3, 0xff, 0x01, +0xfe, 0xe7, 0xff, 0x00, +0xfc, 0xff, 0x7f, 0x00, +0x00, 0x3c, 0x00, 0x00, +0x00, 0x18, 0x00, 0x00, +0x00, 0x18, 0x00, 0x00, +0x00, 0x18, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '}' + 19, +0x00, 0x00, 0x00, 0x00, +0x00, 0x70, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x18, 0x00, 0x00, +0x00, 0x18, 0x00, 0x00, +0x00, 0x18, 0x00, 0x00, +0x00, 0x18, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x60, 0x00, 0x00, +0x00, 0x60, 0x00, 0x00, +0x00, 0x60, 0x00, 0x00, +0x00, 0x60, 0x00, 0x00, +0x00, 0x30, 0x00, 0x00, +0x00, 0x38, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, // Char '~' +}; + +#endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/unigraphic/Protocols.h Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,163 @@ + /* mbed UniGraphic library - Abstract protocol class + * Copyright (c) 2015 Giuliano Dianda + * Released under the MIT License: http://mbed.org/license/mit + */ + +/** @file Protocols.h +*/ +#ifndef Protocols_H +#define Protocols_H + +#include "mbed.h" + +#define RGB24to16(r,g,b) (((r&0xF8)<<8)|((g&0xFC)<<3)|((b&0xF8)>>3)) //5 red | 6 green | 5 blue +#define BGR2RGB(color) (((color&0x1F)<<11) | (color&0x7E0) | ((color&0xF800)>>11)) + +#define FLIP_NONE 0 +#define FLIP_X 1 +#define FLIP_Y 2 + +//#define USE_CS + +/** Protocol types +*/ +#include "platform.h" + +#if DEVICE_PORTINOUT +enum proto_t { + PAR_8 /**< Parallel 8bit, port pins 0 to 7 */ + ,PAR_16 /**< Parallel 16bit, port pins 0 to 15 */ + ,BUS_8 /**< Parallel 8bit, scattered pins */ + ,BUS_16 /**< Parallel 16bit, scattered pins */ + ,SPI_8 /**< SPI 8bit */ + ,SPI_16 /**< SPI 16bit */ +}; +#else +enum proto_t { + BUS_8 /**< Parallel 8bit, scattered pins */ + ,BUS_16 /**< Parallel 16bit, scattered pins */ + ,SPI_8 /**< SPI 8bit */ + ,SPI_16 /**< SPI 16bit */ +}; +#endif + + +/** Abstract interface class for spi and parallel protocols +*/ +class Protocols +{ + public: + + /** Send 8bit command to display controller + * + * @param cmd: byte to send + * + */ + virtual void wr_cmd8(unsigned char cmd) = 0; + + /** Send 8bit data to display controller + * + * @param data: byte to send + * + */ + virtual void wr_data8(unsigned char data) = 0; + + /** Send 2x8bit command to display controller + * + * @param cmd: halfword to send + * + */ + virtual void wr_cmd16(unsigned short cmd) = 0; + + /** Send 2x8bit data to display controller + * + * @param data: halfword to send + * + */ + virtual void wr_data16(unsigned short data) = 0; + + /** Send 16bit pixeldata to display controller + * + * @param data: halfword to send + * + */ + virtual void wr_gram(unsigned short data) = 0; + + /** Send same 16bit pixeldata to display controller multiple times + * + * @param data: halfword to send + * @param count: how many + * + */ + virtual void wr_gram(unsigned short data, unsigned int count) = 0; + + /** Send array of pixeldata shorts to display controller + * + * @param data: unsigned short pixeldata array + * @param lenght: lenght (in shorts) + * + */ + virtual void wr_grambuf(unsigned short* data, unsigned int lenght) = 0; + + /** Read 16bit pixeldata from display controller (with dummy cycle) + * + * @param convert true/false. Convert 18bit to 16bit, some controllers returns 18bit + * @returns 16bit color + */ + virtual unsigned short rd_gram(bool convert) = 0; + + /** Read 4x8bit register data (with dummy cycle) + * @param reg the register to read + * @returns data as uint + * + */ + virtual unsigned int rd_reg_data32(unsigned char reg) = 0; + + /** Read 3x8bit ExtendedCommands register data + * @param reg the register to read + * @param SPIreadenablecmd vendor/device specific cmd to read EXTC registers + * @returns data as uint + * @note EXTC regs (0xB0 to 0xFF) are read/write registers but needs special cmd to be read in SPI mode + */ + virtual unsigned int rd_extcreg_data32(unsigned char reg, unsigned char SPIreadenablecmd) = 0; + + /** ILI932x specific, does a dummy read cycle, number of bits is protocol dependent + * for PAR protocols: a signle RD bit toggle + * for SPI8: 8clocks + * for SPI16: 16 clocks + */ + virtual void dummyread () = 0; + + /** ILI932x specific, select register for a successive write or read + * + * @param reg register to be selected + * @param forread false = a write next (default), true = a read next + * @note forread only used by SPI protocols + */ + virtual void reg_select(unsigned char reg, bool forread =false) = 0; + + /** ILI932x specific, write register with data + * + * @param reg register to write + * @param data 16bit data + */ + virtual void reg_write(unsigned char reg, unsigned short data) = 0; + + /** ILI932x specific, read register + * + * @param reg register to be read + * @returns 16bit register value + */ + virtual unsigned short reg_read(unsigned char reg) = 0; + + /** HW reset sequence (without display init commands) + */ + virtual void hw_reset() = 0; + + /** Set ChipSelect high or low + * @param enable 0/1 + */ + virtual void BusEnable(bool enable) = 0; + +}; +#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/unigraphic/SPI8.cpp Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,209 @@ + /* mbed UniGraphic library - SPI8 protocol class + * Copyright (c) 2015 Giuliano Dianda + * Released under the MIT License: http://mbed.org/license/mit + * + * Derived work of: + * + * mbed library for 240*320 pixel display TFT based on ILI9341 LCD Controller + * Copyright (c) 2013 Peter Drescher - DC2PD + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "SPI8.h" + + +SPI8::SPI8(int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC) + : _CS(CS), _spi(mosi, miso, sclk), _reset(reset), _DC(DC) +{ + _reset = 1; + _DC=1; + _CS=1; + _spi.format(8,0); // 8 bit spi mode 0 + _spi.frequency(Hz); + hw_reset(); +} + +void SPI8::wr_cmd8(unsigned char cmd) +{ + _DC.write(0); // 0=cmd + _spi.write(cmd); // write 8bit + _DC.write(1); // 1=data next +} +void SPI8::wr_data8(unsigned char data) +{ + _spi.write(data); // write 8bit +} + +void SPI8::wr_cmd16(unsigned short cmd) +{ + _DC.write(0); // 0=cmd + _spi.write(cmd>>8); // write 8bit + _spi.write(cmd&0xFF); // write 8bit + _DC.write(1); // 1=data next +} +void SPI8::wr_data16(unsigned short data) +{ + _spi.write(data>>8); // write 8bit + _spi.write(data&0xFF); // write 8bit +} +void SPI8::wr_gram(unsigned short data) +{ + _spi.write(data>>8); // write 8bit + _spi.write(data&0xFF); // write 8bit +} +void SPI8::wr_gram(unsigned short data, unsigned int count) +{ + if((data>>8)==(data&0xFF)) + { + count<<=1; + while(count) + { + _spi.write(data); // write 8bit + count--; + } + } + else + { + while(count) + { + _spi.write(data>>8); // write 8bit + _spi.write(data&0xFF); // write 8bit + count--; + } + } +} +void SPI8::wr_grambuf(unsigned short* data, unsigned int lenght) +{ + while(lenght) + { + _spi.write((*data)>>8); // write 8bit + _spi.write((*data)&0xFF); // write 8bit + data++; + lenght--; + } +} +unsigned short SPI8::rd_gram(bool convert) +{ + unsigned int r=0; + _spi.write(0); // whole first byte is dummy + r |= _spi.write(0); + r <<= 8; + r |= _spi.write(0); + if(convert) + { + r <<= 8; + r |= _spi.write(0); + // gram is 18bit/pixel, if you set 16bit/pixel (cmd 3A), during writing the 16bits are expanded to 18bit + // during reading, you read the raw 18bit gram + r = RGB24to16((r&0xFF0000)>>16, (r&0xFF00)>>8, r&0xFF);// 18bit pixel padded to 24bits, rrrrrr00_gggggg00_bbbbbb00, converted to 16bit + } + _CS = 1; // force CS HIG to interupt the "read state" + _CS = 0; + return (unsigned short)r; +} +unsigned int SPI8::rd_reg_data32(unsigned char reg) +{ + wr_cmd8(reg); + unsigned int r=0; + + r |= _spi.write(0); // we get only 7bit valid, first bit was the dummy cycle + r <<= 8; + r |= _spi.write(0); + r <<= 8; + r |= _spi.write(0); + r <<= 8; + r |= _spi.write(0); + r <<= 1; // 32bits are aligned, now collecting bit_0 + r |= (_spi.write(0) >> 7); + // we clocked 7 more bit so ILI waiting for 8th, we need to reset spi bus + _CS = 1; // force CS HIG to interupt the cmd + _CS = 0; + return r; +} +unsigned int SPI8::rd_extcreg_data32(unsigned char reg, unsigned char SPIreadenablecmd) +{ + unsigned int r=0; + for(int regparam=1; regparam<4; regparam++) // when reading EXTC regs, first parameter is always dummy, so start with 1 + { + wr_cmd8(SPIreadenablecmd); // spi-in enable cmd, 0xD9 (ili9341) or 0xFB (ili9488) or don't know + wr_data8(0xF0|regparam); // in low nibble specify which reg parameter we want + wr_cmd8(reg); // now send cmd (select register we want to read) + r <<= 8; + r |= _spi.write(0); + // r = _spi.write(0) >> 8; for 16bit + } + _CS = 1; // force CS HIG to interupt the cmd + _CS = 0; + return r; +} +// ILI932x specific +void SPI8::dummyread() +{ + _spi.write(0); // dummy read +} +// ILI932x specific +void SPI8::reg_select(unsigned char reg, bool forread) +{ + _CS = 1; //fixme: really needed? + _CS = 0; //fixme: really needed? + _spi.write(0x70); + _spi.write(0); // write MSB + _spi.write(reg); // write LSB + _CS = 1; //fixme: really needed? + _CS = 0; //fixme: really needed? + if(forread) _spi.write(0x73); + else _spi.write(0x72); +} +// ILI932x specific +void SPI8::reg_write(unsigned char reg, unsigned short data) +{ + _CS = 1; //fixme: really needed? + _CS = 0; //fixme: really needed? + _spi.write(0x70); + _spi.write(0); // write MSB + _spi.write(reg); // write LSB + _CS = 1; //fixme: really needed? + _CS = 0; //fixme: really needed? + _spi.write(0x72); + _spi.write(data>>8); + _spi.write(data&0xFF); +} +// ILI932x specific +unsigned short SPI8::reg_read(unsigned char reg) +{ + unsigned short r=0; + _CS = 1; //fixme: really needed? + _CS = 0; //fixme: really needed? + _spi.write(0x70); + _spi.write(0); // write MSB + _spi.write(reg); // write LSB + _CS = 1; //fixme: really needed? + _CS = 0; //fixme: really needed? + _spi.write(0x73); + _spi.write(0); // dummy read + r = _spi.write(0); // read 8bit + r <<= 8; + r |= _spi.write(0); // read 8bit + return r; +} +void SPI8::hw_reset() +{ + wait_ms(15); + _DC = 1; + _CS = 1; + _reset = 0; // display reset + wait_ms(2); + _reset = 1; // end reset + wait_ms(100); +} +void SPI8::BusEnable(bool enable) +{ + _CS = enable ? 0:1; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/unigraphic/SPI8.h Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,148 @@ +#ifndef SPI8_H +#define SPI8_H + +#define NDEBUG // avoid MBED_ASSERT to halt process when PinName DC==NC + +#include "mbed.h" +#include "Protocols.h" +//#include "GraphicsDisplay.h" + +/** SPI 8bit interface +*/ +class SPI8 : public Protocols +{ + public: + + /** Create an SPI 8bit display interface with 3 control pins + * + * @param SPI mosi + * @param SPI miso + * @param SPI sclk + * @param CS pin connected to CS of display + * @param reset pin connected to RESET of display + * @param DC pin connected to data/command of display + */ + SPI8(int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC=NC); + +protected: + + /** Send 8bit command to display controller + * + * @param cmd: byte to send + * + */ + virtual void wr_cmd8(unsigned char cmd); + + /** Send 8bit data to display controller + * + * @param data: byte to send + * + */ + virtual void wr_data8(unsigned char data); + + /** Send 2x8bit command to display controller + * + * @param cmd: halfword to send + */ + virtual void wr_cmd16(unsigned short cmd); + + /** Send 2x8bit data to display controller + * + * @param data: halfword to send + * + */ + virtual void wr_data16(unsigned short data); + + /** Send 16bit pixeldata to display controller + * + * @param data: halfword to send + * + */ + virtual void wr_gram(unsigned short data); + + /** Send same 16bit pixeldata to display controller multiple times + * + * @param data: halfword to send + * @param count: how many + * + */ + virtual void wr_gram(unsigned short data, unsigned int count); + + /** Send array of pixeldata shorts to display controller + * + * @param data: unsigned short pixeldata array + * @param lenght: lenght (in shorts) + * + */ + virtual void wr_grambuf(unsigned short* data, unsigned int lenght); + + /** Read 16bit pixeldata from display controller (with dummy cycle) + * + * @param convert true/false. Convert 18bit to 16bit, some controllers returns 18bit + * @returns 16bit color + */ + virtual unsigned short rd_gram(bool convert); + + /** Read 4x8bit register data (with dummy cycle) + * @param reg the register to read + * @returns data as uint + * + */ + virtual unsigned int rd_reg_data32(unsigned char reg); + + /** Read 3x8bit ExtendedCommands register data + * @param reg the register to read + * @param SPIreadenablecmd vendor/device specific cmd to read EXTC registers + * @returns data as uint + * @note EXTC regs (0xB0 to 0xFF) are read/write registers but needs special cmd to be read in SPI mode + */ + virtual unsigned int rd_extcreg_data32(unsigned char reg, unsigned char SPIreadenablecmd); + + /** ILI932x specific, does a dummy read cycle, number of bits is protocol dependent + * for PAR protocols: a signle RD bit toggle + * for SPI8: 8clocks + * for SPI16: 16 clocks + */ + virtual void dummyread (); + + /** ILI932x specific, select register for a successive write or read + * + * @param reg register to be selected + * @param forread false = a write next (default), true = a read next + * @note forread only used by SPI protocols + */ + virtual void reg_select(unsigned char reg, bool forread =false); + + /** ILI932x specific, write register with data + * + * @param reg register to write + * @param data 16bit data + */ + virtual void reg_write(unsigned char reg, unsigned short data); + + /** ILI932x specific, read register + * + * @param reg register to be read + * @returns 16bit register value + */ + virtual unsigned short reg_read(unsigned char reg); + + /** HW reset sequence (without display init commands) + */ + virtual void hw_reset(); + + /** Set ChipSelect high or low + * @param enable 0/1 + */ + virtual void BusEnable(bool enable); + + DigitalOut _CS; + +private: + + SPI _spi; + DigitalOut _reset; + DigitalOut _DC; + +}; +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/unigraphic/SSD1322.cpp Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,472 @@ +/* mbed UniGraphic library - Device specific class + * Copyright (c) 2015 Peter Drescher + * Released under the MIT License: http://mbed.org/license/mit + */ + +#include "platform.h" +#include "SSD1322.h" + +////////////////////////////////////////////////////////////////////////////////// +// display settings /////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////// + +#define IC_X_SEGS 480 // SSD1322 SEG has range 0-479 (479-0 if MX=1), check your datasheet, important for the orientation +#define IC_Y_COMS 128 // SSD1322 COM has range 0-127 (127-0 if MY=1), check your datasheet, important for the orientation +#define BPP 4 // SSD1322 has 16 gray levels + +#define SSD1322_CMD_ENABLE_GRAY_SCALE_TABLE 0x00 +#define SSD1322_CMD_SET_COLUMN_ADDR 0x15 +#define SSD1322_CMD_WRITE_RAM 0x5C +#define SSD1322_CMD_READ_RAM 0x5D +#define SSD1322_CMD_SET_ROW_ADDR 0x75 +#define SSD1322_CMD_SET_REMAP 0xA0 +#define SSD1322_CMD_SET_DISPLAY_START_LINE 0xA1 +#define SSD1322_CMD_SET_DISPLAY_OFFSET 0xA2 +#define SSD1322_CMD_SET_DISPLAY_MODE_OFF 0xA4 +#define SSD1322_CMD_SET_DISPLAY_MODE_ON 0xA5 +#define SSD1322_CMD_SET_DISPLAY_MODE_NORMAL 0xA6 +#define SSD1322_CMD_SET_DISPLAY_MODE_INVERSE 0xA7 +#define SSD1322_CMD_ENABLE_PARTIAL_DISPLAY 0xA8 +#define SSD1322_CMD_EXIT_PARTIAL_DISPLAY 0xA9 +#define SSD1322_CMD_SET_FUNCTION_SELECTION 0xAB +#define SSD1322_CMD_SET_DISPLAY_OFF 0xAE +#define SSD1322_CMD_SET_DISPLAY_ON 0xAF +#define SSD1322_CMD_SET_PHASE_LENGTH 0xB1 +#define SSD1322_CMD_SET_CLOCK_DIVIDER 0xB3 +#define SSD1322_CMD_DISPLAY_ENHANCEMENT 0xB4 +#define SSD1322_CMD_SET_GPIO 0xB5 +#define SSD1322_CMD_SET_SECOND_PRECHARGE_PERIOD 0xB6 +#define SSD1322_CMD_SET_GRAY_SCALE_TABLE 0xB8 +#define SSD1322_CMD_SET_DEFAULT_LINEAR_GRAY_SCALE_TABLE 0xB9 +#define SSD1322_CMD_SET_PRECHARGE_VOLTAGE 0xBB +#define SSD1322_CMD_SET_VCOMH_VOLTAGE 0xBE +#define SSD1322_CMD_SET_CONTRAST_CURRENT 0xC1 +#define SSD1322_CMD_MASTER_CURRENT_CONTROL 0xC7 +#define SSD1322_CMD_SET_MULTIPLEX_RATIO 0xCA +#define SSD1322_CMD_DISPLAY_ENHANCEMENT_B 0xD1 +#define SSD1322_CMD_SET_COMMAND_LOCK 0xFD + +// set for some OLED displays +//#define ALTERNATE_OLED_VERSION + + +static const uint8_t oledInit[] = { + SSD1322_CMD_SET_COMMAND_LOCK, 1, 0x12, /* Unlock OLED driver IC*/ + SSD1322_CMD_SET_DISPLAY_OFF, 0, + SSD1322_CMD_SET_CLOCK_DIVIDER, 1, 0x91, + SSD1322_CMD_SET_MULTIPLEX_RATIO, 1, 0x3F, /*duty = 1/64*,64 COMS are enabled*/ + SSD1322_CMD_SET_DISPLAY_OFFSET, 1, 0x00, + SSD1322_CMD_SET_DISPLAY_START_LINE, 1, 0x00, /*set start line position*/ + SSD1322_CMD_SET_REMAP, 2, 0x14, // Horizontal address increment, + // Disable Column Address Re-map, + // Enable Nibble Re-map,Scan from COM[N-1] to COM0, + // Disable COM Split Odd Even + 0x11, // Enable Dual COM mode + SSD1322_CMD_SET_GPIO, 1, 0x00, + SSD1322_CMD_SET_FUNCTION_SELECTION, 1, 0x01, /* selection external VDD */ + SSD1322_CMD_DISPLAY_ENHANCEMENT, 2, 0xA0, /* enables the external VSL*/ + 0xfd, /* 0xfd,Enhanced low GS display quality;default is 0xb5(normal),*/ + SSD1322_CMD_SET_CONTRAST_CURRENT, 1, 0xff, /* default is 0x7f*/ + SSD1322_CMD_MASTER_CURRENT_CONTROL, 1, 0x0f, + /* writeCommand(0xB9); GRAY TABLE,linear Gray Scale*/ + SSD1322_CMD_SET_PHASE_LENGTH, 1, 0xE2, /*default is 0x74*/ + SSD1322_CMD_DISPLAY_ENHANCEMENT_B, 2, 0x82, 0x20, +#ifdef ALTERNATE_OLED_VERSION + SSD1322_CMD_SET_PRECHARGE_VOLTAGE, 1, 0x08, /* 0.3xVcc */ + SSD1322_CMD_SET_SECOND_PRECHARGE_PERIOD, 1, 0x0F, /* 15 clocks */ +#else + SSD1322_CMD_SET_PRECHARGE_VOLTAGE, 1, 0x1F, /* 0.6xVcc */ + SSD1322_CMD_SET_SECOND_PRECHARGE_PERIOD, 1, 0x08, /* default */ +#endif + SSD1322_CMD_SET_VCOMH_VOLTAGE, 1, 0x07, /*0.86xVcc;default is 0x04*/ + SSD1322_CMD_SET_DISPLAY_MODE_NORMAL, 0, + SSD1322_CMD_SET_DISPLAY_ON, 0 +}; + + +//////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////// + + +//#include "mbed_debug.h" + +#define SWAP(a, b) { a ^= b; b ^= a; a ^= b; } + + +SSD1322::SSD1322(proto_t displayproto, + int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, + const char *name, + const unsigned int lcdsize_x, const unsigned int lcdsize_y) + : GraphicsDisplay(name), + screensize_X(lcdsize_x), screensize_Y(lcdsize_y), + _BPP(BPP), _PAGES(lcdsize_y/8*BPP), + _IC_X_SEGS(IC_X_SEGS), _IC_Y_COMS(IC_Y_COMS), _IC_PAGES(IC_Y_COMS/8*BPP) +{ + proto = new SPI8(Hz, mosi, miso, sclk, CS, reset, DC); + buffer = (unsigned char*) malloc (screensize_X*_PAGES); + set_auto_up(false); + foreground(0xFFFF); + background(0x0000); + hw_reset(); + bus_enable(true); + init(); + set_orientation(1); + cls(); + locate(0,0); +} + +SSD1322::~SSD1322() +{ + free(buffer); +} + +void SSD1322::wr_cmd8(unsigned char cmd) +{ + proto->wr_cmd8(cmd); +} + +void SSD1322::wr_data8(unsigned char data) +{ + proto->wr_data8(data); +} + +void SSD1322::wr_cmd16(unsigned short cmd) +{ + proto->wr_cmd16(cmd); +} + +void SSD1322::wr_gram(unsigned short data, unsigned int count) +{ + proto->wr_gram(data, count); +} + +void SSD1322::wr_grambuf(unsigned short* data, unsigned int lenght) +{ + proto->wr_grambuf(data, lenght); +} + +void SSD1322::hw_reset() +{ + proto->hw_reset(); +} + +void SSD1322::bus_enable(bool enable) +{ + proto->BusEnable(enable); +} + + + +// monochrome SSD1322 driver ICs does not have ram rotate in hw (swap raw<->columns) like TFT displays +// for portrait views, XY swap will be done in sw in pixel() function +void SSD1322::set_orientation(int o) +{ + orientation = o; + if (o & 0x01) { + set_width(screensize_X); + set_height(screensize_Y); + } else { + set_width(screensize_Y); + set_height(screensize_X); + } + switch (o) { + case (0):// portrait view -90° + mirrorXY(Y); + break; + case (1): // default, landscape view 0° + mirrorXY(NONE); + break; + case (2):// portrait view +90° + mirrorXY(X); + break; + case (3):// landscape view +180° + mirrorXY(XY); + break; + } +} + +void SSD1322::mirrorXY(mirror_t mode) +{ + // Horizontal address increment, + // Disable Column Address Re-map, + // Enable Nibble Re-map,Scan from COM[N-1] to COM0, + // Disable COM Split Odd Even + // Enable Dual COM mode + unsigned char d; + switch (mode) + { + case(NONE): + d = 0x14; + break; + case(X): + d = 0x10; + break; + case(Y): + d = 0x16; + break; + case(XY): + d = 0x12; + break; + } + wr_cmd8(SSD1322_CMD_SET_REMAP); + wr_data8(d); + wr_data8(0x11); +} + +void SSD1322::invert(unsigned char o) +{ + if(o == 0) wr_cmd8(0xA6); + else wr_cmd8(0xA7); +} + +void SSD1322::set_contrast(int o) +{ + contrast = o; + + wr_cmd8(SSD1322_CMD_SET_CONTRAST_CURRENT); + wr_data8(o&0xFF); +} + +int SSD1322::get_contrast(void) +{ + return(contrast); +} +void SSD1322::window(int x, int y, int w, int h) { + // current pixel location + cur_x = x; + cur_y = y; + // window settings + win_x1 = x; + win_x2 = x + w - 1; + win_y1 = y; + win_y2 = y + h - 1; +} +void SSD1322::window_pushpixel(unsigned short color) { + pixel(cur_x, cur_y, color); + cur_x++; + if(cur_x > win_x2) { + cur_x = win_x1; + cur_y++; + if(cur_y > win_y2) { + cur_y = win_y1; + } + } +} +void SSD1322::window_pushpixel(unsigned short color, unsigned int count) { + while(count) + { + pixel(cur_x, cur_y, color); + cur_x++; + if(cur_x > win_x2) + { + cur_x = win_x1; + cur_y++; + if(cur_y > win_y2) + { + cur_y = win_y1; + } + } + count--; + } +} +void SSD1322::window_pushpixelbuf(unsigned short* color, unsigned int lenght) { + while(lenght) + { + pixel(cur_x, cur_y, *color++); + cur_x++; + if(cur_x > win_x2) + { + cur_x = win_x1; + cur_y++; + if(cur_y > win_y2) + { + cur_y = win_y1; + } + } + lenght--; + } +} + +unsigned short SSD1322::pixelpos(int x, int y) +{ + if(!(orientation&1)) SWAP(x,y); + // first check parameter + if((x >= screensize_X) || (y >= screensize_Y)) return 0; + + unsigned short page = y * _BPP / 8; + return (x + page*screensize_X); +} + +void SSD1322::pixel(int x, int y, unsigned short color) +{ + if(!(orientation&1)) SWAP(x,y); + // first check parameter + if((x >= screensize_X) || (y >= screensize_Y)) return; + + /* + unsigned short page = y * _BPP / 8; + unsigned char pos = y & ((8 / _BPP) - 1); // position in page + unsigned char mask = (( 1 << _BPP) - 1); + + buffer[(x + page*screensize_X)] = (buffer[(x + page*screensize_X)] & ~(mask<<(pos*_BPP))) | ((color&mask)<<(pos*_BPP)); + */ + + unsigned char cval = buffer[(y*128) + x/2]; + if (x&1) { + cval = (cval & 0xF0) | (color & 0x0F); + } else { + cval = (cval & 0x0F) | (color & 0x0F)<<4; + } + buffer[(y*128) + x/2] = cval; +} + +unsigned short SSD1322::pixelread(int x, int y) +{ + if(!(orientation&1)) SWAP(x,y); + // first check parameter + if((x >= screensize_X) || (y >= screensize_Y)) return 0; + + unsigned short page = y * _BPP / 8; + unsigned char pos = y & ((8 / _BPP) - 1); // position in page + unsigned char mask = (( 1 << _BPP) - 1); + + //FAUX + return (buffer[(x + page*screensize_X)]); // = (buffer[(x + page*screensize_X)] & ~(mask<<(pos*_BPP))) | ((color&mask)<<(pos*_BPP)); +} + + + +// Set row address 0~32 +void SSD1322::set_row_address(unsigned char add) +{ + wr_cmd8(SSD1322_CMD_SET_ROW_ADDR); + add &= 0x3F; + wr_data8(add); + wr_data8(0x3F); +} + +// Set col address 0~64 for Gray mode) +void SSD1322::set_column_address(unsigned char add) +{ + wr_cmd8(SSD1322_CMD_SET_COLUMN_ADDR); + add &= 0x3F; + wr_data8(0x1c+add); // where does this 0x1C (28) comes from??? + wr_data8(0x5b); // this 0x5B (91) seems 28+64 (-1) +} + +void SSD1322::copy_to_lcd(void) +{ + unsigned int i; + unsigned char x, y; + + set_row_address(0); + set_column_address(0); + + i = 0; + wr_cmd8(SSD1322_CMD_WRITE_RAM); + for(y=0; y<64; y++) + for(x=0; x<128; x++) + wr_data8(buffer[i++]); +} + +unsigned long SSD1322::buffaddr(unsigned int i) +{ + return (unsigned long) &(buffer[i]); +} + +void SSD1322::clrbuff(const unsigned char value) +{ + memset(buffer, value, screensize_X*_PAGES); +} + +void SSD1322::fills(const unsigned char value) +{ +clrbuff(value); +copy_to_lcd(); +} + +void SSD1322::cls(void) +{ +clrbuff(); +copy_to_lcd(); +} + +//void ll_fill(const unsigned char value=0xFF, const unsigned char w=0x78, const unsigned char=0x80); +void SSD1322::ll_fill(const unsigned char value, const unsigned char w, const unsigned char h) +{ + unsigned short x,y; + //w = 0x78; // 120 x 2px by byte => 240px + //h = 0x80; // 0x80 for 64 rows because 2 COMs mode + + wr_cmd8(0x15); // COL ADDR + wr_data8(0x00); + wr_data8(w-1); + + wr_cmd8(0x75); // ROW ADDR + wr_data8(0x00); + wr_data8(h-1); + + wr_cmd8(0x5C); // WRITE RAM + for(y=0; y<h/2; y++) + { + for(x=0; x<2*w; x++) + { + if ((y==0) | (y==(h/2-1))) + wr_data8(0xFF); + else if (x == 56) // ???? + wr_data8(0xF2); + else if (x == 183) + //else if (x == (2*w-1)) + wr_data8(0x2F); + else if ((x%10) == 0) + wr_data8(0x55); + else if ((x%5) == 0) + wr_data8(0x33); + else + wr_data8(0x22); + } + } +} + +int SSD1322::sizeX() +{ + return screensize_X; +} +int SSD1322::sizeY() +{ + return screensize_Y; +} + +// reset and init the lcd controller +void SSD1322::init() +{ + /* Start Initial Sequence ----------------------------------------------------*/ + for (uint16_t ind=0; ind < sizeof(oledInit); ) { + wr_cmd8(oledInit[ind++]); + uint8_t dataSize = oledInit[ind++]; + while (dataSize--) { + wr_data8(oledInit[ind++]); + } + } + } + +void SSD1322::loop_event(void) { + if (loop_pos >= 64) + loop_pos = 0; + set_row_address(loop_pos); + set_column_address(0); + wr_cmd8(SSD1322_CMD_WRITE_RAM); + + for(uint8_t i=0; i<128; i++) + wr_data8(buffer[loop_pos*64+i]); +} + +void SSD1322::start_loop(float tick) { + loop_pos = 0; + bah.attach(this, &SSD1322::loop_event, tick); +} + +void SSD1322::stop_loop() { + bah.detach(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/unigraphic/SSD1322.h Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,244 @@ +#ifndef MBED_SSD1322_H +#define MBED_SSD1322_H + +#include "mbed.h" + +#include "SPI8.h" + +#include "Protocols.h" +#include "GraphicsDisplay.h" + +/** Mirror mode */ +enum mirror_t {X,Y,XY,NONE}; + +/** A common base class for monochrome Display +*/ +class SSD1322 : public GraphicsDisplay +{ + +public: + + + /** Create a monochrome SSD1322 SPI interface + * @param name The name used by the parent class to access the interface + */ + SSD1322(proto_t displayproto, + int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, + const char* name, + const unsigned int lcdsize_x=128, const unsigned int lcdsize_y=64); + + /** Destructor + * will free framebuffer + */ + virtual ~SSD1322(); + + + +/////// functions that come for free, but can be overwritten/////////////////////////////////////////////////// +/////// ----------------------------------------------------/////////////////////////////////////////////////// + + /** Draw a pixel in the specified color. + * @param x is the horizontal offset to this pixel. + * @param y is the vertical offset to this pixel. + * @param color defines the color for the pixel. + */ + virtual void pixel(int x, int y, unsigned short color); + + /** Set the window, which controls where items are written to the screen. + * When something hits the window width, it wraps back to the left side + * and down a row. If the initial write is outside the window, it will + * be captured into the window when it crosses a boundary. + * @param x is the left edge in pixels. + * @param y is the top edge in pixels. + * @param w is the window width in pixels. + * @param h is the window height in pixels. + */ + virtual void window(int x, int y, int w, int h); + + /** Read pixel color at location + * @param x is the horizontal offset to this pixel. + * @param y is the vertical offset to this pixel. + * @returns 16bit color, 0000=Black(pixel set), FFFF=White(pixel clear). + */ + virtual unsigned short pixelread(int x, int y); + + /** Push a single pixel into the window and increment position. + * You must first call window() then push pixels in loop. + * @param color is the pixel color. + */ + virtual void window_pushpixel(unsigned short color); + + /** Push some pixels of the same color into the window and increment position. + * You must first call window() then push pixels. + * @param color is the pixel color. + * @param count: how many + */ + virtual void window_pushpixel(unsigned short color, unsigned int count); + + /** Push array of pixel colors into the window and increment position. + * You must first call window() then push pixels. + * @param color is the pixel color. + */ + virtual void window_pushpixelbuf(unsigned short* color, unsigned int lenght); + + /** Framebuffer is used, it needs to be sent to SSD1322 from time to time + */ + virtual void copy_to_lcd(); + + /** set the contrast of the screen + * + * @param o contrast 0-63 + * @note may be overrided in case of not standard command + */ + virtual void set_contrast(int o); + + /** read the contrast level + * + */ + int get_contrast(void); + + /** display inverted colors + * + * @param o = 0 normal, 1 invert + */ + void invert(unsigned char o); + + /** clear the entire screen + * The inherited one sets windomax then fill with background color + * We override it to speedup + */ + virtual void cls(); + + /** Set the orientation of the screen + * x,y: 0,0 is always top left + * + * @param o direction to use the screen (0-3) + * 0 = -90° + * 1 = default 0° + * 2 = +90° + * 3 = +180° + * + */ + void set_orientation(int o); + + /** Set ChipSelect high or low + * @param enable 0/1 + */ + virtual void bus_enable(bool enable); + + /** get display X size in pixels (native, orientation independent) + * @returns X size in pixels + */ + int sizeX(); + + /** get display Y size in pixels (native, orientation independent) + * @returns Y size in pixels + */ + int sizeY(); + +//////////////////////////////////////////////////////////////////////////////// + // not implemented yet +////////////////////////////////////////////////////////////////// + // virtual unsigned short pixelread(int x, int y){return 0;}; + virtual void window4read(int x, int y, int w, int h){}; + void setscrollarea (int startY, int areasize){}; + void scroll (int lines){}; + void scrollreset(){}; + void FastWindow(bool enable){}; + + unsigned int buffsize() { return _PAGES*screensize_X;}; + unsigned short pixelpos(int x, int y); + void clrbuff(const unsigned char value=0x00); + unsigned long buffaddr(unsigned int i); + void fills(const unsigned char value=0xFF); + void ll_fill(const unsigned char value=0xFF, const unsigned char w=0x78, const unsigned char=0x80); + void set_row_address(unsigned char add); + void set_column_address(unsigned char add); + + void start_loop(float tick); + void stop_loop(void); + +protected: + /** Setup some stuff (malloc the buffer, etc) + */ + void init(); + + /** set mirror mode + * @note may be overridden by specific display init class in case of not standard cmds or inverted wiring + * @param mode NONE, X, Y, XY + */ + virtual void mirrorXY(mirror_t mode); + +////// functions needed by parent class /////////////////////////////////////// +////// -------------------------------- /////////////////////////////////////// + + /** Send 8bit command to display controller + * + * @param cmd: byte to send + * @note if protocol is SPI16, it will insert NOP cmd before, so if cmd is a 2byte cmd, the second cmd will be broken. Use wr_cmd16 for 2bytes cmds + */ + void wr_cmd8(unsigned char cmd); + + /** Send 8bit data to display controller + * + * @param data: byte to send + * + */ + void wr_data8(unsigned char data); + + /** Send 16bit command to display controller + * + * @param cmd: halfword to send + * + */ + void wr_cmd16(unsigned short cmd); + + /** Send same 16bit pixeldata to display controller multiple times + * + * @param data: halfword to send + * @param count: how many + * + */ + virtual void wr_gram(unsigned short data, unsigned int count); + + /** Send array of pixeldata shorts to display controller + * + * @param data: unsigned short pixeldata array + * @param lenght: lenght (in shorts) + * + */ + virtual void wr_grambuf(unsigned short* data, unsigned int lenght); + + /** HW reset sequence (without display init commands) + */ + void hw_reset(); + + int contrast; + void loop_event(void); + +protected: + + Protocols* proto; + unsigned char *buffer; + const int screensize_X; + const int screensize_Y; + const int _PAGES; + const int _BPP; + const int _IC_X_SEGS; + const int _IC_Y_COMS; + const int _IC_PAGES; + + Ticker bah; + int loop_pos; + // pixel location + int cur_x; + int cur_y; + // window location + int win_x1; + int win_x2; + int win_y1; + int win_y2; + int orientation; +}; + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/unigraphic/Terminal6x8.h Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,114 @@ +//Font Generated by MikroElektronika GLCD Font Creator 1.2.0.0 +//MikroElektronika 2011 +//http://www.mikroe.com + +#ifndef FONT_TERMINAL6x8 +#define FONT_TERMINAL6x8 +//GLCD FontName : Terminal6x8 +//GLCD FontSize : 6 x 8 +#ifdef TOOLCHAIN_GCC +const unsigned char Terminal6x8[] __attribute__((aligned (2))) = { +#else +__align(2) +const unsigned char Terminal6x8[] = { +#endif + 0xFF/*unused*/,6,8,0xFF/*unused*/, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char + 0x05, 0x00, 0x00, 0x06, 0x5F, 0x06, 0x00, // Code for char ! + 0x06, 0x00, 0x07, 0x03, 0x00, 0x07, 0x03, // Code for char " + 0x06, 0x00, 0x24, 0x7E, 0x24, 0x7E, 0x24, // Code for char # + 0x05, 0x00, 0x24, 0x2B, 0x6A, 0x12, 0x00, // Code for char $ + 0x06, 0x00, 0x63, 0x13, 0x08, 0x64, 0x63, // Code for char % + 0x06, 0x00, 0x36, 0x49, 0x56, 0x20, 0x50, // Code for char & + 0x04, 0x00, 0x00, 0x07, 0x03, 0x00, 0x00, // Code for char ' + 0x04, 0x00, 0x00, 0x3E, 0x41, 0x00, 0x00, // Code for char ( + 0x04, 0x00, 0x00, 0x41, 0x3E, 0x00, 0x00, // Code for char ) + 0x06, 0x00, 0x08, 0x3E, 0x1C, 0x3E, 0x08, // Code for char * + 0x06, 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, // Code for char + + 0x04, 0x00, 0x00, 0xE0, 0x60, 0x00, 0x00, // Code for char , + 0x06, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, // Code for char - + 0x04, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, // Code for char . + 0x06, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, // Code for char / + 0x06, 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, // Code for char 0 + 0x05, 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, // Code for char 1 + 0x06, 0x00, 0x62, 0x51, 0x49, 0x49, 0x46, // Code for char 2 + 0x06, 0x00, 0x22, 0x49, 0x49, 0x49, 0x36, // Code for char 3 + 0x06, 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, // Code for char 4 + 0x06, 0x00, 0x2F, 0x49, 0x49, 0x49, 0x31, // Code for char 5 + 0x06, 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, // Code for char 6 + 0x06, 0x00, 0x01, 0x71, 0x09, 0x05, 0x03, // Code for char 7 + 0x06, 0x00, 0x36, 0x49, 0x49, 0x49, 0x36, // Code for char 8 + 0x06, 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, // Code for char 9 + 0x04, 0x00, 0x00, 0x6C, 0x6C, 0x00, 0x00, // Code for char : + 0x04, 0x00, 0x00, 0xEC, 0x6C, 0x00, 0x00, // Code for char ; + 0x05, 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, // Code for char < + 0x06, 0x00, 0x24, 0x24, 0x24, 0x24, 0x24, // Code for char = + 0x06, 0x00, 0x00, 0x41, 0x22, 0x14, 0x08, // Code for char > + 0x06, 0x00, 0x02, 0x01, 0x59, 0x09, 0x06, // Code for char ? + 0x06, 0x00, 0x3E, 0x41, 0x5D, 0x55, 0x1E, // Code for char @ + 0x06, 0x00, 0x7E, 0x11, 0x11, 0x11, 0x7E, // Code for char A + 0x06, 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, // Code for char B + 0x06, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, // Code for char C + 0x06, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x3E, // Code for char D + 0x06, 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, // Code for char E + 0x06, 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, // Code for char F + 0x06, 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A, // Code for char G + 0x06, 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, // Code for char H + 0x05, 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, // Code for char I + 0x06, 0x00, 0x30, 0x40, 0x40, 0x40, 0x3F, // Code for char J + 0x06, 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, // Code for char K + 0x06, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, // Code for char L + 0x06, 0x00, 0x7F, 0x02, 0x04, 0x02, 0x7F, // Code for char M + 0x06, 0x00, 0x7F, 0x02, 0x04, 0x08, 0x7F, // Code for char N + 0x06, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, // Code for char O + 0x06, 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, // Code for char P + 0x06, 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, // Code for char Q + 0x06, 0x00, 0x7F, 0x09, 0x09, 0x19, 0x66, // Code for char R + 0x06, 0x00, 0x26, 0x49, 0x49, 0x49, 0x32, // Code for char S + 0x06, 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, // Code for char T + 0x06, 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, // Code for char U + 0x06, 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, // Code for char V + 0x06, 0x00, 0x3F, 0x40, 0x3C, 0x40, 0x3F, // Code for char W + 0x06, 0x00, 0x63, 0x14, 0x08, 0x14, 0x63, // Code for char X + 0x06, 0x00, 0x07, 0x08, 0x70, 0x08, 0x07, // Code for char Y + 0x05, 0x00, 0x71, 0x49, 0x45, 0x43, 0x00, // Code for char Z + 0x05, 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, // Code for char [ + 0x06, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, // Code for char BackSlash + 0x05, 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00, // Code for char ] + 0x06, 0x00, 0x04, 0x02, 0x01, 0x02, 0x04, // Code for char ^ + 0x06, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // Code for char _ + 0x04, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, // Code for char ` + 0x06, 0x00, 0x20, 0x54, 0x54, 0x54, 0x78, // Code for char a + 0x06, 0x00, 0x7F, 0x44, 0x44, 0x44, 0x38, // Code for char b + 0x06, 0x00, 0x38, 0x44, 0x44, 0x44, 0x28, // Code for char c + 0x06, 0x00, 0x38, 0x44, 0x44, 0x44, 0x7F, // Code for char d + 0x06, 0x00, 0x38, 0x54, 0x54, 0x54, 0x08, // Code for char e + 0x05, 0x00, 0x08, 0x7E, 0x09, 0x09, 0x00, // Code for char f + 0x06, 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C, // Code for char g + 0x05, 0x00, 0x7F, 0x04, 0x04, 0x78, 0x00, // Code for char h + 0x05, 0x00, 0x00, 0x00, 0x7D, 0x40, 0x00, // Code for char i + 0x05, 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00, // Code for char j + 0x05, 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, // Code for char k + 0x05, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x00, // Code for char l + 0x06, 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, // Code for char m + 0x05, 0x00, 0x7C, 0x04, 0x04, 0x78, 0x00, // Code for char n + 0x06, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, // Code for char o + 0x06, 0x00, 0xFC, 0x44, 0x44, 0x44, 0x38, // Code for char p + 0x06, 0x00, 0x38, 0x44, 0x44, 0x44, 0xFC, // Code for char q + 0x06, 0x00, 0x44, 0x78, 0x44, 0x04, 0x08, // Code for char r + 0x06, 0x00, 0x08, 0x54, 0x54, 0x54, 0x20, // Code for char s + 0x05, 0x00, 0x04, 0x3E, 0x44, 0x24, 0x00, // Code for char t + 0x05, 0x00, 0x3C, 0x40, 0x20, 0x7C, 0x00, // Code for char u + 0x06, 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, // Code for char v + 0x06, 0x00, 0x3C, 0x60, 0x30, 0x60, 0x3C, // Code for char w + 0x05, 0x00, 0x6C, 0x10, 0x10, 0x6C, 0x00, // Code for char x + 0x05, 0x00, 0x9C, 0xA0, 0x60, 0x3C, 0x00, // Code for char y + 0x05, 0x00, 0x64, 0x54, 0x54, 0x4C, 0x00, // Code for char z + 0x05, 0x00, 0x08, 0x3E, 0x41, 0x41, 0x00, // Code for char { + 0x04, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, // Code for char | + 0x06, 0x00, 0x00, 0x41, 0x41, 0x3E, 0x08, // Code for char } + 0x05, 0x00, 0x02, 0x01, 0x02, 0x01, 0x00, // Code for char ~ + 0x06, 0x00, 0x3C, 0x26, 0x23, 0x26, 0x3C // Code for char + }; + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/unigraphic/TextDisplay.cpp Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,77 @@ +/* mbed TextDisplay Display Library Base Class + * Copyright (c) 2007-2009 sford + * Released under the MIT License: http://mbed.org/license/mit + */ + +#include "TextDisplay.h" + +TextDisplay::TextDisplay(const char *name) : Stream(name){ + _row = 0; + _column = 0; + if (name == NULL) { + _path = NULL; + } else { + _path = new char[strlen(name) + 2]; + sprintf(_path, "/%s", name); + } +} + +int TextDisplay::_putc(int value) { + if(value == '\n') { + _column = 0; + _row++; + if(_row >= rows()) { + _row = 0; + } + } else { + character(_column, _row, value); + _column++; + if(_column >= columns()) { + _column = 0; + _row++; + if(_row >= rows()) { + _row = 0; + } + } + } + return value; +} + +// crude cls implementation, should generally be overwritten in derived class +void TextDisplay::cls() { + locate(0, 0); + for(int i=0; i<columns()*rows(); i++) { + putc(' '); + } +} + +void TextDisplay::locate(int column, int row) { + _column = column; + _row = row; +} + +int TextDisplay::_getc() { + return -1; +} + +void TextDisplay::foreground(uint16_t colour) { + _foreground = colour; +} + +void TextDisplay::background(uint16_t colour) { + _background = colour; +} + +bool TextDisplay::claim (FILE *stream) { + if ( _path == NULL) { + fprintf(stderr, "claim requires a name to be given in the instantioator of the TextDisplay instance!\r\n"); + return false; + } + if (freopen(_path, "w", stream) == NULL) { + // Failed, should not happen + return false; + } + // make sure we use line buffering + setvbuf(stdout, NULL, _IOLBF, columns()); + return true; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/unigraphic/TextDisplay.h Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,106 @@ +/* mbed TextDisplay Library Base Class + * Copyright (c) 2007-2009 sford + * Released under the MIT License: http://mbed.org/license/mit + * + * A common base class for Text displays + * To port a new display, derive from this class and implement + * the constructor (setup the display), character (put a character + * at a location), rows and columns (number of rows/cols) functions. + * Everything else (locate, printf, putc, cls) will come for free + * + * The model is the display will wrap at the right and bottom, so you can + * keep writing and will always get valid characters. The location is + * maintained internally to the class to make this easy + */ + +#ifndef MBED_TEXTDISPLAY_H +#define MBED_TEXTDISPLAY_H + +#include "mbed.h" + +/** A common base class for Text displays +*/ +class TextDisplay : public Stream { +public: + + // functions needing implementation in derived implementation class + // ---------------------------------------------------------------- + /** Create a TextDisplay interface + * @param name The name used in the path to access the strean through the filesystem + */ + TextDisplay(const char *name = NULL); + + /** output a character at the given position + * + * @param column column where charater must be written + * @param row where character must be written + * @param c the character to be written to the TextDisplay + * @note this method may be overridden in a derived class. + */ + virtual void character(int column, int row, int c) = 0; + + /** return number of rows on TextDisplay + * @result number of rows + * @note this method must be supported in the derived class. + */ + virtual int rows() = 0; + + /** return number of columns on TextDisplay + * @result number of columns + * @note this method must be supported in the derived class. + */ + virtual int columns() = 0; + + // functions that come for free, but can be overwritten + // ---------------------------------------------------- + /** redirect output from a stream (stoud, sterr) to display + * @param stream stream that shall be redirected to the TextDisplay + * @note this method may be overridden in a derived class. + * @returns true if the claim succeeded. + */ + virtual bool claim (FILE *stream); + + /** clear the entire screen + * @note this method may be overridden in a derived class. + */ + virtual void cls(); + + /** locate the cursor at a character position. + * Based on the currently active font, locate the cursor on screen. + * @note this method may be overridden in a derived class. + * @param column is the horizontal offset from the left side. + * @param row is the vertical offset from the top. + */ + virtual void locate(int column, int row); + + /** set the foreground color + * @note this method may be overridden in a derived class. + * @param color is color to use for foreground drawing. + */ + virtual void foreground(uint16_t colour); + + /** set the background color + * @note this method may be overridden in a derived class. + * @param color is color to use for background drawing. + */ + virtual void background(uint16_t colour); + + // putc (from Stream) + // printf (from Stream) + +protected: + + virtual int _putc(int value); + virtual int _getc(); + + // character location + int _column; + int _row; + + // colours + volatile uint16_t _foreground; + volatile uint16_t _background; + char *_path; +}; + +#endif
--- a/platformio.ini Tue Sep 13 21:32:48 2016 +0200 +++ b/platformio.ini Tue Sep 20 23:50:45 2016 +0200 @@ -25,9 +25,9 @@ upload_port = /media/sdb lib_compat_mode = 0 -[env:nucleo_f031k6] -platform = ststm32 -framework = mbed -board = nucleo_f031k6 -build_flags = -D UNIG_SPI8 -upload_port = /media/sdb +# [env:nucleo_f031k6] +# platform = ststm31 +# framework = mbed +# board = nucleo_f031k6 +# build_flags = -D UNIG_SPI8 +# upload_port = /media/sdb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hp34comm.cpp Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,252 @@ +#include "hp34comm.h" +#include "mbed.h" +#include "CircularBuffer.h" + +/***** HP 34970A communication class ***/ + +#define HP_SERIAL_TX PC_7 // serial6 RX +#define HP_SERIAL_RX PA_1 // serial4 RX + +#ifdef DEBUG + +DigitalOut inrx(PC_0); +DigitalOut intx(PC_1); +DigitalOut ack(PC_3); +DigitalOut staterx(PC_2); +DigitalOut statetx(PH_1); + +#endif + + +HPSerial::HPSerial(): + ncmd(0), + serial_tx(NC, HP_SERIAL_TX), serial_rx(NC, HP_SERIAL_RX) { + + //pc.printf("HPSerial init\n"); + + for(uint8_t i=0; i<MAX_ERRS; i++) + errs[i] = 0; + reset(); + + serial_tx.baud(187500); + serial_tx.attach(this, &HPSerial::txIrq, Serial::RxIrq); //sic! + + serial_rx.baud(187500); + serial_rx.attach(this, &HPSerial::rxIrq, Serial::RxIrq); +} + +bool HPSerial::cmd_available(void) { + return !cmdbuf.empty(); +} + +bool HPSerial::pop(CMD& cmd) { + return cmdbuf.pop(cmd); +} + +bool HPSerial::cmd_buf_full(void) { + return cmdbuf.full(); +} + +unsigned int HPSerial::nerrors(uint8_t errorno) { + return errs[errorno]; +} + + + +void HPSerial::reset(uint8_t errorno) { + timeouter.detach(); + head = 0; + tx_state = Idle; + setstatedbg(); + tx_cmd = 0xFF; + tx_ack = false; + tx_len = 0xFF; + memset(buf, 0, BUF_SIZE); + if (errorno != 0xFF){ + errs[errorno]++; + } + +} + +void HPSerial::handleAck(uint8_t val) { + if ((tx_state == Rx) & (tx_cmd == 0xFF) & (tx_ack == false) & (val == 0x66)) { + // special case: keypad does not acknwledge and takes precedence + // on the "bus" + tx_state = Tx; + setstatedbg(); + } else + + if (tx_ack == true) + reset(0); + + else + if (tx_cmd == 0xFF) // still at the beginning of a packet, expect 0x99 as ack + if (val == 0x99) + { + tx_ack = true; +#ifdef DEBUG + ack = 1; + wait_us(2); + ack = 0; +#endif + } + else + reset(1); + + else // expect 0x00 as ack + if (val == 0x00) + { + tx_ack = true; +#ifdef DEBUG + ack = 1; + wait_us(2); + ack = 0; + wait_us(2); + ack = 1; + wait_us(2); + ack = 0; +#endif + } + else + reset(2); +} + +void HPSerial::pushCmd(TrState direction, uint8_t cmd, uint8_t size, char *payload) { + CMD val; + uint8_t i; + val.id = ncmd++; + val.direction = direction; + val.cmd = cmd; + val.size = size; + for(i=0; i<size; i++) + val.value[i] = payload[i]; + val.value[i] = 0x00; + cmdbuf.push(val); +} + +void HPSerial::handleChar(uint8_t val) { + if (tx_ack == false) + reset(3); + else // remaining of the state machine + if (tx_cmd == 0xFF) { + // begin of transmission, expect a cmd + tx_cmd = val; + tx_ack = false; + if (tx_state == Rx) + tx_len = 0xFF; + else + tx_len = 0x00; // no payload: tx_cmd is the key stroke + } + else if (tx_len == 0xFF) { + // got a cmd, expect a payload size + tx_len = val; + tx_ack = false; + } + else if (tx_len > 0) { + // a payload char + buf[head++] = val; + tx_len--; + tx_ack = false; + } + else { // end of payload, manage sent content + uint8_t cur_state = tx_state; + pushCmd(tx_state, tx_cmd, head, buf); + + switch(val) { + case 0x66: // a new transmisson + reset(); + tx_state = cur_state; + setstatedbg(); + break; + case 0x55: + reset(); + break; + default: + reset(6); + break; + } + } +} + + + +void HPSerial::setstatedbg(void) { + /* + if (tx_state == Rx) + staterx = 1; + else + staterx = 0; + if (tx_state == Tx) + statetx = 1; + else + statetx = 0; + */ +} + +void HPSerial::rxIrq(void) { + uint8_t val; + if(serial_rx.readable()) { // no reason why we would end here without this condition, but hey +#ifdef DEBUG + inrx=1; +#endif + val = serial_rx.getc(); + + timeouter.attach(this, &HPSerial::timeout, 0.001); // if nothing else happen in the next ms, reset + + if (tx_state == Idle) + if (val == 0x66) { + // no transmission in progress, expect a start of transmission + tx_state = Rx; + tx_ack = false; + setstatedbg(); + } + else + reset(4); + + else if (tx_state == Tx) // manage the acks + handleAck(val); + + else + handleChar(val); +#ifdef DEBUG + inrx=0; +#endif + } +} + +void HPSerial::txIrq(void) { + uint8_t val; + if(serial_tx.readable()) { // no reason why we would end here without this condition, but hey +#ifdef DEBUG + intx=1; +#endif + val = serial_tx.getc(); + + timeouter.attach(this, &HPSerial::timeout, 0.001); // if nothing else happen in the next ms, reset + + if (tx_state == Idle) + if (val == 0x66) { + // no transmission in progress, expect a start of transmission + tx_state = Tx; + tx_ack = false; + setstatedbg(); + } + else + reset(5); + + else if (tx_state == Rx) // manage the acks + handleAck(val); + + else + handleChar(val); + } +#ifdef DEBUG + intx=0; +#endif +} + +void HPSerial::timeout(void) { + if (tx_state != Idle) { + reset(7); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hp34comm.cpp~ Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,241 @@ + +#include "hp34comm.h" + +/***** HP 34970A communication class ***/ + + + + +HPSerial::HPSerial(): + ncmd(0), + serial_tx(NC, HP_SERIAL_TX), serial_rx(NC, HP_SERIAL_RX) { + + //pc.printf("HPSerial init\n"); + + for(uint8_t i=0; i<MAX_ERRS; i++) + errs[i] = 0; + reset(); + + serial_tx.baud(187500); + serial_tx.attach(this, &HPSerial::txIrq, Serial::RxIrq); //sic! + + serial_rx.baud(187500); + serial_rx.attach(this, &HPSerial::rxIrq, Serial::RxIrq); +} + +bool HPSerial::cmd_available(void) { + return !cmdbuf.empty(); +} + +bool HPSerial::pop(CMD& cmd) { + return cmdbuf.pop(cmd); +} + +bool HPSerial::cmd_buf_full(void) { + return cmdbuf.full(); +} + +unsigned int HPSerial::nerrors(uint8_t errorno) { + return errs[errorno]; +} + + + +void HPSerial::reset(uint8_t errorno=0xFF) { + timeouter.detach(); + head = 0; + tx_state = Idle; + setstatedbg(); + tx_cmd = 0xFF; + tx_ack = false; + tx_len = 0xFF; + memset(buf, 0, BUF_SIZE); + if (errorno != 0xFF){ + errs[errorno]++; + pulse(errorno+1); + } + +} + +void HPSerial::handleAck(uint8_t val) { + if ((tx_state == Rx) & (tx_cmd == 0xFF) & (tx_ack == false) & (val == 0x66)) { + // special case: keypad does not acknwledge and takes precedence + // on the "bus" + tx_state = Tx; + setstatedbg(); + } else + + if (tx_ack == true) + reset(0); + + else + if (tx_cmd == 0xFF) // still at the beginning of a packet, expect 0x99 as ack + if (val == 0x99) + { + tx_ack = true; +#ifdef DEBUG + ack = 1; + wait_us(2); + ack = 0; +#endif + } + else + reset(1); + + else // expect 0x00 as ack + if (val == 0x00) + { + tx_ack = true; +#ifdef DEBUG + ack = 1; + wait_us(2); + ack = 0; + wait_us(2); + ack = 1; + wait_us(2); + ack = 0; +#endif + } + else + reset(2); +} + +void HPSerial::pushCmd(TrState direction, uint8_t cmd, uint8_t size, char *payload) { + CMD val; + uint8_t i; + val.id = ncmd++; + val.direction = direction; + val.cmd = cmd; + val.size = size; + for(i=0; i<size; i++) + val.value[i] = payload[i]; + val.value[i] = 0x00; + cmdbuf.push(val); +} + +void HPSerial::handleChar(uint8_t val) { + if (tx_ack == false) + reset(3); + else // remaining of the state machine + if (tx_cmd == 0xFF) { + // begin of transmission, expect a cmd + tx_cmd = val; + tx_ack = false; + if (tx_state == Rx) + tx_len = 0xFF; + else + tx_len = 0x00; // no payload: tx_cmd is the key stroke + } + else if (tx_len == 0xFF) { + // got a cmd, expect a payload size + tx_len = val; + tx_ack = false; + } + else if (tx_len > 0) { + // a payload char + buf[head++] = val; + tx_len--; + tx_ack = false; + } + else { // end of payload, manage sent content + uint8_t cur_state = tx_state; + pushCmd(tx_state, tx_cmd, head, buf); + + switch(val) { + case 0x66: // a new transmisson + reset(); + tx_state = cur_state; + setstatedbg(); + break; + case 0x55: + reset(); + break; + default: + reset(6); + break; + } + } +} + + + +void HPSerial::setstatedbg(void) { + /* + if (tx_state == Rx) + staterx = 1; + else + staterx = 0; + if (tx_state == Tx) + statetx = 1; + else + statetx = 0; + */ +} + +void HPSerial::rxIrq(void) { + uint8_t val; + if(serial_rx.readable()) { // no reason why we would end here without this condition, but hey +#ifdef DEBUG + inrx=1; +#endif + val = serial_rx.getc(); + + timeouter.attach(this, &HPSerial::timeout, 0.001); // if nothing else happen in the next ms, reset + + if (tx_state == Idle) + if (val == 0x66) { + // no transmission in progress, expect a start of transmission + tx_state = Rx; + tx_ack = false; + setstatedbg(); + } + else + reset(4); + + else if (tx_state == Tx) // manage the acks + handleAck(val); + + else + handleChar(val); +#ifdef DEBUG + inrx=0; +#endif + } +} + +void HPSerial::txIrq(void) { + uint8_t val; + if(serial_tx.readable()) { // no reason why we would end here without this condition, but hey +#ifdef DEBUG + intx=1; +#endif + val = serial_tx.getc(); + + timeouter.attach(this, &HPSerial::timeout, 0.001); // if nothing else happen in the next ms, reset + + if (tx_state == Idle) + if (val == 0x66) { + // no transmission in progress, expect a start of transmission + tx_state = Tx; + tx_ack = false; + setstatedbg(); + } + else + reset(5); + + else if (tx_state == Rx) // manage the acks + handleAck(val); + + else + handleChar(val); + } +#ifdef DEBUG + intx=0; +#endif +} + +void HPSerial::timeout(void) { + if (tx_state != Idle) { + reset(7); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hp34comm.h Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,65 @@ +#ifndef HP34COMM_H +#define HP34COMM_H + +#include "mbed.h" +#include "CircularBuffer.h" + +/***** HP 34970A communication class ***/ + +#define MAX_ERRS 10 +#define MAX_BUFF 32 +#define BUF_SIZE 32 + +class HPSerial { + +public: + enum TrState { + Idle = 0, + Tx, + Rx, + }; + typedef struct _CMD + { + TrState direction; + uint8_t cmd; + uint8_t size; + char value[MAX_BUFF+1]; + unsigned long id; + } CMD; + + + + HPSerial(); + + bool cmd_available(void); + bool pop(CMD& cmd); + bool cmd_buf_full(void); + unsigned int nerrors(uint8_t errorno); + + +private: + void reset(uint8_t errorno=0xFF); + void handleAck(uint8_t val); + void pushCmd(TrState direction, uint8_t cmd, uint8_t size, char *payload); + void handleChar(uint8_t val); + void setstatedbg(void); + void rxIrq(void); + void txIrq(void); + void timeout(void); + + private: + RawSerial serial_tx; + RawSerial serial_rx; + uint8_t buf[BUF_SIZE]; + uint8_t head; + uint8_t tx_state; + uint8_t tx_cmd; + uint8_t tx_len; + bool tx_ack; + CircularBuffer<CMD, 32> cmdbuf; + unsigned long ncmd; + unsigned int errs[MAX_ERRS]; + Ticker timeouter; +}; + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hp34comm.h~ Tue Sep 20 23:50:45 2016 +0200 @@ -0,0 +1,270 @@ +#ifndef HP34COMM_H +#define HP34COMM_H + +/***** HP 34970A communication class ***/ + +class HPSerial { + +public: + enum TrState { + Idle = 0, + Tx, + Rx, + }; + typedef struct _CMD + { + TrState direction; + uint8_t cmd; + uint8_t size; + char value[MAX_BUFF+1]; + unsigned long id; + } CMD; + + + + HPSerial(): ncmd(0), serial_tx(NC, HP_SERIAL_TX), serial_rx(NC, HP_SERIAL_RX) { + pc.printf("HPSerial init\n"); + for(uint8_t i=0; i<MAX_ERRS; i++) + errs[i] = 0; + reset(); + + serial_tx.baud(187500); + serial_tx.attach(this, &HPSerial::txIrq, Serial::RxIrq); //sic! + + serial_rx.baud(187500); + serial_rx.attach(this, &HPSerial::rxIrq, Serial::RxIrq); + } + + bool cmd_available(void) { + return !cmdbuf.empty(); + } + + bool pop(CMD& cmd) { + return cmdbuf.pop(cmd); + } + + bool cmd_buf_full(void) { + return cmdbuf.full(); + } + + unsigned int nerrors(uint8_t errorno) { + return errs[errorno]; + } + + + +private: + void reset(uint8_t errorno=0xFF) { + timeouter.detach(); + head = 0; + tx_state = Idle; + setstatedbg(); + tx_cmd = 0xFF; + tx_ack = false; + tx_len = 0xFF; + memset(buf, 0, BUF_SIZE); + if (errorno != 0xFF){ + errs[errorno]++; + pulse(errorno+1); + } + + } + + void handleAck(uint8_t val) { + if ((tx_state == Rx) & (tx_cmd == 0xFF) & (tx_ack == false) & (val == 0x66)) { + // special case: keypad does not acknwledge and takes precedence + // on the "bus" + tx_state = Tx; + setstatedbg(); + } else + + if (tx_ack == true) + reset(0); + + else + if (tx_cmd == 0xFF) // still at the beginning of a packet, expect 0x99 as ack + if (val == 0x99) + { + tx_ack = true; +#ifdef DEBUG + ack = 1; + wait_us(2); + ack = 0; +#endif + } + else + reset(1); + + else // expect 0x00 as ack + if (val == 0x00) + { + tx_ack = true; +#ifdef DEBUG + ack = 1; + wait_us(2); + ack = 0; + wait_us(2); + ack = 1; + wait_us(2); + ack = 0; +#endif + } + else + reset(2); + } + + void pushCmd(TrState direction, uint8_t cmd, uint8_t size, char *payload) { + CMD val; + uint8_t i; + val.id = ncmd++; + val.direction = direction; + val.cmd = cmd; + val.size = size; + for(i=0; i<size; i++) + val.value[i] = payload[i]; + val.value[i] = 0x00; + cmdbuf.push(val); + } + + void handleChar(uint8_t val) { + if (tx_ack == false) + reset(3); + else // remaining of the state machine + if (tx_cmd == 0xFF) { + // begin of transmission, expect a cmd + tx_cmd = val; + tx_ack = false; + if (tx_state == Rx) + tx_len = 0xFF; + else + tx_len = 0x00; // no payload: tx_cmd is the key stroke + } + else if (tx_len == 0xFF) { + // got a cmd, expect a payload size + tx_len = val; + tx_ack = false; + } + else if (tx_len > 0) { + // a payload char + buf[head++] = val; + tx_len--; + tx_ack = false; + } + else { // end of payload, manage sent content + uint8_t cur_state = tx_state; + pushCmd(tx_state, tx_cmd, head, buf); + + switch(val) { + case 0x66: // a new transmisson + reset(); + tx_state = cur_state; + setstatedbg(); + break; + case 0x55: + reset(); + break; + default: + reset(6); + break; + } + } + } + + + + void setstatedbg(void) { + /* + if (tx_state == Rx) + staterx = 1; + else + staterx = 0; + if (tx_state == Tx) + statetx = 1; + else + statetx = 0; + */ + } + + void rxIrq(void) { + uint8_t val; + if(serial_rx.readable()) { // no reason why we would end here without this condition, but hey +#ifdef DEBUG + inrx=1; +#endif + val = serial_rx.getc(); + + timeouter.attach(this, &HPSerial::timeout, 0.001); // if nothing else happen in the next ms, reset + + if (tx_state == Idle) + if (val == 0x66) { + // no transmission in progress, expect a start of transmission + tx_state = Rx; + tx_ack = false; + setstatedbg(); + } + else + reset(4); + + else if (tx_state == Tx) // manage the acks + handleAck(val); + + else + handleChar(val); +#ifdef DEBUG + inrx=0; +#endif + } + } + + void txIrq(void) { + uint8_t val; + if(serial_tx.readable()) { // no reason why we would end here without this condition, but hey +#ifdef DEBUG + intx=1; +#endif + val = serial_tx.getc(); + + timeouter.attach(this, &HPSerial::timeout, 0.001); // if nothing else happen in the next ms, reset + + if (tx_state == Idle) + if (val == 0x66) { + // no transmission in progress, expect a start of transmission + tx_state = Tx; + tx_ack = false; + setstatedbg(); + } + else + reset(5); + + else if (tx_state == Rx) // manage the acks + handleAck(val); + + else + handleChar(val); + } +#ifdef DEBUG + intx=0; +#endif + } + + void timeout(void) { + if (tx_state != Idle) { + reset(7); + } + } +private: + RawSerial serial_tx; + RawSerial serial_rx; + uint8_t buf[BUF_SIZE]; + uint8_t head; + uint8_t tx_state; + uint8_t tx_cmd; + uint8_t tx_len; + bool tx_ack; + CircularBuffer<CMD, 32> cmdbuf; + unsigned long ncmd; + unsigned int errs[MAX_ERRS]; + Ticker timeouter; +}; + +#endif
--- a/src/main.cpp Tue Sep 13 21:32:48 2016 +0200 +++ b/src/main.cpp Tue Sep 20 23:50:45 2016 +0200 @@ -1,8 +1,8 @@ #include "stdio.h" #include "mbed.h" +#include "rtos.h" #include "string" -#include "CircularBuffer.h" #include "Terminal6x8.h" #include "Mono19x27.h" @@ -10,18 +10,15 @@ #include "Arial12x12.h" #include "SSD1322.h" +#include "hp34comm.h" Serial pc(USBTX, USBRX); -//BufferedSerial hp(NC, PA_1, 64, 0); // serial4 -#define HP_SERIAL_TX PC_7 // serial6 RX -#define HP_SERIAL_RX PA_1 // serial4 RX +#define DEBUG -SSD1322 dsp(SPI_8, 10000000, PB_15, PB_14, PB_13, PB_12, D11, D12, "SSD1322", 256, 64); +SSD1322 dsp(SPI_8, 20000000, PB_15, PB_14, PB_13, PB_12, D11, D12, "SSD1322", 256, 64); -#define BUF_SIZE 32 -#define MAX_BUFF 15 -#define MAX_ERRS 10 + uint8_t curchar; uint8_t cmd; uint8_t nchars; @@ -34,7 +31,7 @@ uint8_t bgcolor; uint8_t x0; uint8_t y0; - uint8_t fmt; // 0=>ascii, 1=>hex, 2=>bits, 3=>flags + uint8_t fmt; // 0x01=>ascii, 0x02=>hex, 0x04=>bits, 0x08=>flags, 0x80=>ignore uint8_t maxsize; uint8_t width; const unsigned char* font; @@ -43,13 +40,12 @@ static DSP table[] = { - { 0x00, 0xF, 0x0, 0, 0, 0, MAX_BUFF, 245, Mono19x27}, // main display - { 0x0C, 0xF, 0x0,204, 38, 0, 3, 45, Mono15x22}, // channels display - { 0x01, 0xF, 0x0, 0, 0, 4, MAX_BUFF, 0, Terminal6x8}, - { 0x02, 0xF, 0x0, 0, 0, 4, MAX_BUFF, 0, Terminal6x8}, - { 0x0A, 0xF, 0x0, 0, 57, 2, 4, 0, Terminal6x8}, - { 0x0A, 0xF, 0x0, 0, 0, 3, 4, 0, Terminal6x8}, // flags - { 0xFF, 0xF, 0x0, 0, 0, 4, MAX_BUFF, 0, Terminal6x8}, + { 0x00, 0xF, 0x0, 0, 0, 0x01, MAX_BUFF, 245, Mono19x27}, // main display + { 0x0C, 0xF, 0x0,204, 38, 0x01, 3, 45, Mono15x22}, // channels display + { 0x01, 0xF, 0x0, 0, 0, 0x80, MAX_BUFF, 0, Terminal6x8}, + { 0x02, 0xF, 0x0, 0, 0, 0x80, MAX_BUFF, 0, Terminal6x8}, + { 0x0A, 0xF, 0x0, 0, 57, 0x0C, 4, 0, Terminal6x8}, // flags + bits + { 0xFF, 0xF, 0x0, 0, 0, 0x80, MAX_BUFF, 0, Terminal6x8}, }; // 9x10 @@ -93,16 +89,16 @@ static const FLAG flags[] = { //{ 0x00, 160, 30, "Alarm"}, // for the 'alarm' box - { 0x00, 246, 0, NULL, icon_alarm}, // F1.1 - { 0x01, 246, 11, NULL, icon_curve}, // F1.2 - { 0x03, 204, 30, "Channel"}, // F1.4 - { 0x14, 68, 44, "4W"}, // F2.5 - { 0x33, 40, 44, "VIEW"}, // F4.4 - { 0x34, 0, 30, "MON"}, // F4.5 - { 0x36, 0, 44, "CONFIG"}, // F4.7 + { 0x00, 246, 0, NULL, icon_alarm}, // F1.1 + { 0x01, 246, 11, NULL, icon_curve}, // F1.2 + { 0x03, 204, 30, "Channel"}, // F1.4 + { 0x14, 68, 44, "4W"}, // F2.5 + { 0x32, 40, 44, "*"}, // F4.3 + { 0x33, 40, 44, "VIEW"}, // F4.4 + { 0x34, 0, 30, "MON"}, // F4.5 + { 0x35, 0, 44, "SCAN"}, // F4.6 + { 0x36, 0, 44, "CONFIG"}, // F4.7 - { 0xFF, 0, 0, "SCAN"}, // F4.6 or F4.3 - { 0xFF, 0, 0, "*"}, { 0xFF, 0, 0, "ADRS"}, { 0xFF, 0, 0, "RMT"}, { 0xFF, 0, 0, "ERROR"}, @@ -125,218 +121,49 @@ }; +typedef struct _FRAME +{ + uint8_t flag; + uint8_t x0; + uint8_t y0; + uint8_t x1; + uint8_t y1; +} FRAME; + +static const FRAME frames[] = + { + { 0x02, 203, 35, 248, 55}, // F1.3 + }; + #ifdef DEBUG #define DBGPIN PC_0 DigitalOut dbgpin(DBGPIN); -inline void DebugPulse(uint8_t count=1) +inline void pulse(uint8_t count=1, bool stayup=false) { + dbgpin = 0; + wait_us(2); while (count--) { dbgpin = 1; - dbgpin = 0; - } + wait_us(2); + dbgpin = 0; + wait_us(2); + } + if (stayup) + dbgpin = 1; + } #else -inline void DebugPulse(uint8_t count=1) +inline void pulse(uint8_t count=1, bool stayup=false) {} #endif - -/***** HP 34970A communication class ***/ - -class HPSerial { - -public: - enum TrState { - Idle = 0, - Tx, - Rx, - }; - typedef struct _CMD - { - TrState direction; - uint8_t cmd; - uint8_t size; - char value[MAX_BUFF+1]; - unsigned long id; - } CMD; - - - - HPSerial(): ncmd(0), serial_tx(NC, HP_SERIAL_TX), serial_rx(NC, HP_SERIAL_RX) { - pc.printf("HPSerial init\n"); - for(uint8_t i=0; i<MAX_ERRS; i++) - errs[i] = 0; - reset(); - - serial_tx.baud(187500); - serial_tx.attach(this, &HPSerial::txIrq, Serial::RxIrq); //sic! - - serial_rx.baud(187500); - serial_rx.attach(this, &HPSerial::rxIrq, Serial::RxIrq); - } - - bool cmd_available(void) { - return !cmdbuf.empty(); - } - - bool pop(CMD& cmd) { - return cmdbuf.pop(cmd); - } - - bool cmd_buf_full(void) { - return cmdbuf.full(); - } - - unsigned int nerrors(uint8_t errorno) { - return errs[errorno]; - } - - - -private: - void reset(uint8_t errorno=0xFF) { - head = 0; - tx_state = Idle; - tx_cmd = 0xFF; - tx_ack = false; - tx_len = 0xFF; - memset(buf, 0, BUF_SIZE); - if (errorno != 0xFF) - errs[errorno]++; - } - - void handleAck(uint8_t val) { - if (tx_ack == true) - reset(0); - - else - if (tx_cmd == 0xFF) // still at the beginning of a packet, expect 0x99 as ack - if (val == 0x99) - tx_ack = true; - else - reset(1); - - else // expect 0x00 as ack - if (val == 0x00) - tx_ack = true; - else - reset(2); - } - - void pushCmd(TrState direction, uint8_t cmd, uint8_t size, char *payload) { - CMD val; - uint8_t i; - val.id = ncmd++; - val.direction = direction; - val.cmd = cmd; - val.size = size; - for(i=0; i<size; i++) - val.value[i] = payload[i]; - val.value[i] = 0x00; - cmdbuf.push(val); - } - - void handleChar(uint8_t val) { - if (tx_ack == false) - reset(3); - else // remaining of the state machine - if (tx_cmd == 0xFF) { - // begin of transmission, expect a cmd - tx_cmd = val; - tx_ack = false; - tx_len = 0xFF; - } - else if (tx_len == 0xFF) { - // got a cmd, expect a payload size - tx_len = val; - tx_ack = false; - } - else if (tx_len > 0) { - // a payload char - buf[head++] = val; - tx_len--; - tx_ack = false; - } - else { - uint8_t cur_state = tx_state; - pushCmd(tx_state, tx_cmd, head, buf); - reset(); - - if (val != 0x55) { // not an end of transmission - // should be another cmd I think - tx_cmd = val; - tx_state = cur_state; - } - } - } - - - void rxIrq(void) { - uint8_t val; - if(serial_rx.readable()) { // no reason why we would end here without this condition, but hey - val = serial_rx.getc(); - - if (tx_state == Idle) - if (val == 0x66) { - // no transmission in progress, expect a start of transmission - tx_state = Rx; - tx_ack = false; - } - else - reset(4); - - else if (tx_state == Tx) // manage the acks - handleAck(val); - - else - handleChar(val); - } - } - - void txIrq(void) { - uint8_t val; - if(serial_tx.readable()) { // no reason why we would end here without this condition, but hey - val = serial_tx.getc(); - - if (tx_state == Idle) - if (val == 0x66) { - // no transmission in progress, expect a start of transmission - tx_state = Tx; - tx_ack = false; - } - else - reset(5); - - else if (tx_state == Rx) // manage the acks - handleAck(val); - - else - handleChar(val); - } - } - -private: - RawSerial serial_tx; - RawSerial serial_rx; - uint8_t buf[BUF_SIZE]; - uint8_t head; - uint8_t tx_state; - uint8_t tx_cmd; - uint8_t tx_len; - bool tx_ack; - CircularBuffer<CMD, 32> cmdbuf; - unsigned long ncmd; - unsigned int errs[MAX_ERRS]; -}; - - HPSerial hp; -Ticker dsp_refresher; volatile bool must_refresh; +Thread tdsp, tloop; void copy_to_lcd(void); void test_dsp(); @@ -362,7 +189,9 @@ curchar = 0; nchars = 0; - + for (uint8_t i=0; i<sizeof(table)/sizeof(table[0]); ++i) + memset(table[i].buffer, 0, MAX_BUFF+1); + dsp.printf("HP34970A"); dsp.set_font(Terminal6x8); for(uint8_t i=0; i<4; i++) { @@ -375,16 +204,23 @@ wait(2); dsp.cls(); - dsp_refresher.attach(©_to_lcd, 0.1); test_dsp(); + dsp.copy_to_lcd(); wait(2); dsp.cls(); } void copy_to_lcd(void) { - if (must_refresh) - dsp.copy_to_lcd(); + while(1) { + pulse(0, true); + if (must_refresh) { + must_refresh = false; + dsp.copy_to_lcd(); + } + pulse(0, false); + Thread::wait(100); + } } void show(uint8_t cmd, char *txt, uint8_t nchar=0) { @@ -392,6 +228,8 @@ uint16_t bgcolor, fgcolor; char *oldv; + pulse(1, true); + must_refresh = false; len = MAX_BUFF; @@ -406,13 +244,34 @@ dsp.set_font((unsigned char*) table[i].font); oldv = table[i].buffer; - switch (table[i].fmt) { - case 0: //ascii + + if (table[i].fmt & 0x01 ) { + // ascii if (table[i].width > 0) dsp.fillrect(table[i].x0, table[i].y0, table[i].x0 + table[i].width, table[i].y0 + table[i].font[2], bgcolor); - dsp.printf(txt); - break; - case 1: // hex + for (uint8_t k=0; ;k++) { + if (txt[k] == 0x00) + { + dsp.printf(txt); + break; + } + if (txt[k] == 0x09) { // \t is a special char for 'unselected' display value + txt[k] = 0x00; + dsp.printf(txt); + + if (fgcolor == table[i].color) + fgcolor /= 2; + else + fgcolor = table[i].color; + dsp.foreground(fgcolor); + txt = &(txt[k+1]); + k = 0; + } + } + } + + if (table[i].fmt & 0x02 ) { + // hex for (uint8_t j=0;; j++) { if (txt[j] == 0x00) break; @@ -420,8 +279,10 @@ } for (uint8_t j=3*strlen(txt); j<table[i].maxsize; j++) dsp.printf(" "); - break; - case 2: // binary + } + + if (table[i].fmt & 0x04 ) { + // binary dsp.foreground(fgcolor); dsp.printf(" ["); for (uint8_t j=0; j<max(nchar, table[i].maxsize) ; j++) { @@ -439,8 +300,10 @@ } dsp.foreground(fgcolor); dsp.printf("]"); - break; - case 3: // flags + } + + if (table[i].fmt & 0x08 ) { + // flags for (uint8_t j=0; j<max(nchar, table[i].maxsize) ; j++) { for (uint8_t k=0; k<8; k++) { if ((txt[j] & (1 << k) ) != (oldv[j] & (1 << k))) { @@ -449,6 +312,20 @@ dsp.foreground(fgcolor); else dsp.foreground(bgcolor); + + for (uint8_t l=0; + l<(sizeof(frames)/sizeof(frames[0])); ++l) { + if (frames[l].flag & ((j<<4) + k)) + dsp.rect(frames[l].x0, frames[l].y0, + frames[l].x1, frames[l].y1, + fgcolor); + else + dsp.rect(frames[l].x0, frames[l].y0, + frames[l].x1, frames[l].y1, + bgcolor); + + } + for (uint8_t l=0; l<(sizeof(flags)/sizeof(flags[0])); ++l) { if (flags[l].flag == ((j<<4) + k)) { @@ -459,44 +336,47 @@ Bitmap_s pic = {9, 10, 2, flags[l].icon}; dsp.Bitmap_BW(pic, flags[l].x, flags[l].y); } - break; + //break; } - } + } } } - oldv[j] = txt[j]; } - break; - case 4: //ignore - break; } + + for(uint8_t j=0; j<table[i].maxsize; j++) + oldv[j] = txt[j]; } } + must_refresh = true; //dsp.copy_to_lcd(); + pulse(1, false); } void test_dsp() { show(0x00, "8g8g8g8g8g8g8", 13); // main dsp show(0x0C, "888", 3); // channel dsp - show(0x0A, "\xFF\xFF\xFF\xFF", 4); // flags + show(0x0A, "\xFF\xFF\xFF\xFF", 4); // all flags } void loop() { // run over and over + while(1){ if (hp.cmd_available()) { HPSerial::CMD cmd; if (hp.pop(cmd)) { - pc.printf("CMD[%s:%d %d/%d/%d/%d/%d/%d] %X\n", (cmd.direction==HPSerial::Rx)?"Rx":"Tx", cmd.id, + pc.printf("CMD[%s:%d %d/%d/%d/%d/%d/%d/%d] %X\n", (cmd.direction==HPSerial::Rx)?"Rx":"Tx", cmd.id, hp.nerrors(0), hp.nerrors(1), hp.nerrors(2), hp.nerrors(3), hp.nerrors(4), hp.nerrors(5), + hp.nerrors(6), cmd.cmd); if (cmd.direction == HPSerial::Rx) { @@ -507,11 +387,15 @@ } } } + Thread::wait(0.01); + } } int main() { setup(); - while(1) - loop(); + tdsp.start(copy_to_lcd); + tloop.start(loop); + while(1); + //loop(); }