KSM edits to RA8875

Dependents:   Liz_Test_Code

Committer:
WiredHome
Date:
Mon Jul 25 10:55:58 2016 +0000
Revision:
123:2f45e80fec5f
Parent:
111:efe436c43aba
Child:
124:1690a7ae871c
Added idle callback - when the RA8875 driver is stuck waiting on the HW, or on a long timeout, it can call an optional callback. This could be used for maintaining the Watchdog, or other activities.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 19:3f82c1161fd2 1 /// RA8875 Display Controller Library.
WiredHome 73:f22a18707b5e 2 ///
WiredHome 68:ab08efabfc88 3 /// This is being created for a Raio RA8875-based display from buydisplay.com,
WiredHome 80:cc4fab58179c 4 /// which is 480 x 272 using a 4-wire SPI interface. Support is provided for
WiredHome 80:cc4fab58179c 5 /// both a keypad and a resistive touch-screen.
WiredHome 80:cc4fab58179c 6 ///
WiredHome 68:ab08efabfc88 7 /// This display controller is used in other display resolutions, up to 800x600.
WiredHome 68:ab08efabfc88 8 /// While this driver has not been tested with these variants, nothing was done
WiredHome 68:ab08efabfc88 9 /// to prevent easily supporting them.
WiredHome 19:3f82c1161fd2 10 ///
WiredHome 19:3f82c1161fd2 11 #include "RA8875.h"
WiredHome 19:3f82c1161fd2 12
WiredHome 41:2956a0a221e5 13 //#define DEBUG "RAIO"
WiredHome 19:3f82c1161fd2 14 // ...
WiredHome 19:3f82c1161fd2 15 // INFO("Stuff to show %d", var); // new-line is automatically appended
WiredHome 19:3f82c1161fd2 16 //
WiredHome 19:3f82c1161fd2 17 #if (defined(DEBUG) && !defined(TARGET_LPC11U24))
WiredHome 98:ecebed9b80b2 18 #define INFO(x, ...) std::printf("[INF %s %4d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 98:ecebed9b80b2 19 #define WARN(x, ...) std::printf("[WRN %s %4d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 98:ecebed9b80b2 20 #define ERR(x, ...) std::printf("[ERR %s %4d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 98:ecebed9b80b2 21 static void HexDump(const char * title, const uint8_t * p, int count)
WiredHome 73:f22a18707b5e 22 {
WiredHome 73:f22a18707b5e 23 int i;
WiredHome 73:f22a18707b5e 24 char buf[100] = "0000: ";
WiredHome 73:f22a18707b5e 25
WiredHome 73:f22a18707b5e 26 if (*title)
WiredHome 73:f22a18707b5e 27 INFO("%s", title);
WiredHome 73:f22a18707b5e 28 for (i=0; i<count; ) {
WiredHome 73:f22a18707b5e 29 sprintf(buf + strlen(buf), "%02X ", *(p+i));
WiredHome 73:f22a18707b5e 30 if ((++i & 0x0F) == 0x00) {
WiredHome 73:f22a18707b5e 31 INFO("%s", buf);
WiredHome 73:f22a18707b5e 32 if (i < count)
WiredHome 73:f22a18707b5e 33 sprintf(buf, "%04X: ", i);
WiredHome 73:f22a18707b5e 34 else
WiredHome 73:f22a18707b5e 35 buf[0] = '\0';
WiredHome 73:f22a18707b5e 36 }
WiredHome 73:f22a18707b5e 37 }
WiredHome 73:f22a18707b5e 38 if (strlen(buf))
WiredHome 73:f22a18707b5e 39 INFO("%s", buf);
WiredHome 73:f22a18707b5e 40 }
WiredHome 19:3f82c1161fd2 41 #else
WiredHome 19:3f82c1161fd2 42 #define INFO(x, ...)
WiredHome 19:3f82c1161fd2 43 #define WARN(x, ...)
WiredHome 19:3f82c1161fd2 44 #define ERR(x, ...)
WiredHome 73:f22a18707b5e 45 #define HexDump(a, b, c)
WiredHome 19:3f82c1161fd2 46 #endif
WiredHome 19:3f82c1161fd2 47
WiredHome 109:7b94f06f085b 48 // Defaults. Users can override this with the init() method.
WiredHome 19:3f82c1161fd2 49 #define RA8875_DISPLAY_WIDTH 480
WiredHome 19:3f82c1161fd2 50 #define RA8875_DISPLAY_HEIGHT 272
WiredHome 43:3becae133285 51 #define RA8875_COLORDEPTH_BPP 16 /* Not an API */
WiredHome 19:3f82c1161fd2 52
WiredHome 19:3f82c1161fd2 53 #ifdef PERF_METRICS
WiredHome 19:3f82c1161fd2 54 #define PERFORMANCE_RESET performance.reset()
WiredHome 19:3f82c1161fd2 55 #define REGISTERPERFORMANCE(a) RegisterPerformance(a)
WiredHome 68:ab08efabfc88 56 #define COUNTIDLETIME(a) CountIdleTime(a)
WiredHome 73:f22a18707b5e 57 static const char *metricsName[] = {
WiredHome 109:7b94f06f085b 58 "Cls", "Pixel", "Pixel Stream", "Boolean Stream",
WiredHome 41:2956a0a221e5 59 "Read Pixel", "Read Pixel Stream",
WiredHome 73:f22a18707b5e 60 "Line",
WiredHome 73:f22a18707b5e 61 "Rectangle", "Rounded Rectangle",
WiredHome 68:ab08efabfc88 62 "Triangle", "Circle", "Ellipse"
WiredHome 19:3f82c1161fd2 63 };
WiredHome 91:ca5f829e6d27 64 uint16_t commandsUsed[256]; // track which commands are used with simple counter of number of hits.
WiredHome 19:3f82c1161fd2 65 #else
WiredHome 19:3f82c1161fd2 66 #define PERFORMANCE_RESET
WiredHome 19:3f82c1161fd2 67 #define REGISTERPERFORMANCE(a)
WiredHome 68:ab08efabfc88 68 #define COUNTIDLETIME(a)
WiredHome 19:3f82c1161fd2 69 #endif
WiredHome 19:3f82c1161fd2 70
WiredHome 73:f22a18707b5e 71 // When it is going to poll a register for completion, how many
WiredHome 19:3f82c1161fd2 72 // uSec should it wait between each polling activity.
WiredHome 19:3f82c1161fd2 73 #define POLLWAITuSec 10
WiredHome 19:3f82c1161fd2 74
WiredHome 75:ca78388cfd77 75 // Private RawKeyMap for the Keyboard interface
WiredHome 79:544eb4964795 76 static const uint8_t DefaultKeyMap[22] = {
WiredHome 77:9206c13aa527 77 0,
WiredHome 77:9206c13aa527 78 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
WiredHome 75:ca78388cfd77 79 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
WiredHome 75:ca78388cfd77 80 255
WiredHome 77:9206c13aa527 81 };
WiredHome 75:ca78388cfd77 82
WiredHome 79:544eb4964795 83 static const char * ErrMessages[] = {
WiredHome 79:544eb4964795 84 "noerror", ///< no errors, command completed successfully
WiredHome 89:04575562c961 85 "bad parameter", ///< one or more parameters are invalid
WiredHome 89:04575562c961 86 "file not found", ///< specified file could not be found
WiredHome 89:04575562c961 87 "not bmp format", ///< file is not a .bmp file
WiredHome 89:04575562c961 88 "not ico format", ///< file is not a .ico file
WiredHome 89:04575562c961 89 "not supported format", ///< file format is not yet supported
WiredHome 89:04575562c961 90 "image too big", ///< image is too large for the screen
WiredHome 89:04575562c961 91 "not enough ram", ///< could not allocate ram for scanline
WiredHome 79:544eb4964795 92 };
WiredHome 19:3f82c1161fd2 93
WiredHome 19:3f82c1161fd2 94 RA8875::RA8875(PinName mosi, PinName miso, PinName sclk, PinName csel, PinName reset, const char *name)
WiredHome 58:26658a56112a 95 : GraphicsDisplay(name)
WiredHome 58:26658a56112a 96 , spi(mosi, miso, sclk)
WiredHome 19:3f82c1161fd2 97 , cs(csel)
WiredHome 19:3f82c1161fd2 98 , res(reset)
WiredHome 19:3f82c1161fd2 99 {
WiredHome 96:40b74dd3695b 100 c_callback = NULL;
WiredHome 96:40b74dd3695b 101 obj_callback = NULL;
WiredHome 96:40b74dd3695b 102 method_callback = NULL;
WiredHome 123:2f45e80fec5f 103 idle_callback = NULL;
WiredHome 19:3f82c1161fd2 104 }
WiredHome 19:3f82c1161fd2 105
WiredHome 19:3f82c1161fd2 106 //RA8875::~RA8875()
WiredHome 19:3f82c1161fd2 107 //{
WiredHome 19:3f82c1161fd2 108 //}
WiredHome 19:3f82c1161fd2 109
WiredHome 81:01da2e34283d 110 RetCode_t RA8875::init(int width, int height, int color_bpp, bool poweron, bool keypadon, bool touchscreenon)
WiredHome 79:544eb4964795 111 {
WiredHome 98:ecebed9b80b2 112 font = NULL; // no external font, use internal.
WiredHome 98:ecebed9b80b2 113 pKeyMap = DefaultKeyMap; // set default key map
WiredHome 98:ecebed9b80b2 114 _select(false); // deselect the display
WiredHome 98:ecebed9b80b2 115 frequency(RA8875_DEFAULT_SPI_FREQ); // data rate
WiredHome 79:544eb4964795 116 Reset();
WiredHome 79:544eb4964795 117 WriteCommand(0x88, 0x0B); // PLLC1 - Phase Lock Loop registers
WiredHome 79:544eb4964795 118 wait_ms(1);
WiredHome 79:544eb4964795 119 WriteCommand(0x89, 0x02);
WiredHome 79:544eb4964795 120 wait_ms(1);
WiredHome 79:544eb4964795 121
WiredHome 79:544eb4964795 122 // System Config Register (SYSR)
WiredHome 105:4f116006ba1f 123 screenbpp = color_bpp;
WiredHome 79:544eb4964795 124 if (color_bpp == 16) {
WiredHome 79:544eb4964795 125 WriteCommand(0x10, 0x0C); // 16-bpp (65K colors) color depth, 8-bit interface
WiredHome 79:544eb4964795 126 } else { // color_bpp == 8
WiredHome 79:544eb4964795 127 WriteCommand(0x10, 0x00); // 8-bpp (256 colors)
WiredHome 79:544eb4964795 128 }
WiredHome 79:544eb4964795 129 // Pixel Clock Setting Register (PCSR)
WiredHome 79:544eb4964795 130 WriteCommand(0x04, 0x82); // PDAT on PCLK falling edge, PCLK = 4 x System Clock
WiredHome 79:544eb4964795 131 wait_ms(1);
WiredHome 79:544eb4964795 132
WiredHome 79:544eb4964795 133 // Horizontal Settings
WiredHome 90:d113d71ae4f0 134 screenwidth = width;
WiredHome 79:544eb4964795 135 WriteCommand(0x14, width/8 - 1); //HDWR//Horizontal Display Width Setting Bit[6:0]
WiredHome 79:544eb4964795 136 WriteCommand(0x15, 0x02); //HNDFCR//Horizontal Non-Display Period fine tune Bit[3:0]
WiredHome 79:544eb4964795 137 WriteCommand(0x16, 0x03); //HNDR//Horizontal Non-Display Period Bit[4:0]
WiredHome 79:544eb4964795 138 WriteCommand(0x17, 0x01); //HSTR//HSYNC Start Position[4:0]
WiredHome 79:544eb4964795 139 WriteCommand(0x18, 0x03); //HPWR//HSYNC Polarity ,The period width of HSYNC.
WiredHome 79:544eb4964795 140
WiredHome 79:544eb4964795 141 // Vertical Settings
WiredHome 90:d113d71ae4f0 142 screenheight = height;
WiredHome 79:544eb4964795 143 WriteCommand(0x19, (height-1)&0xFF); //VDHR0 //Vertical Display Height Bit [7:0]
WiredHome 79:544eb4964795 144 WriteCommand(0x1a, (height-1)>>8); //VDHR1 //Vertical Display Height Bit [8]
WiredHome 79:544eb4964795 145 WriteCommand(0x1b, 0x0F); //VNDR0 //Vertical Non-Display Period Bit [7:0]
WiredHome 79:544eb4964795 146 WriteCommand(0x1c, 0x00); //VNDR1 //Vertical Non-Display Period Bit [8]
WiredHome 79:544eb4964795 147 WriteCommand(0x1d, 0x0e); //VSTR0 //VSYNC Start Position[7:0]
WiredHome 79:544eb4964795 148 WriteCommand(0x1e, 0x06); //VSTR1 //VSYNC Start Position[8]
WiredHome 98:ecebed9b80b2 149 WriteCommand(0x1f, 0x01); //VPWR //VSYNC Polarity ,VSYNC Pulse Width[6:0]
WiredHome 79:544eb4964795 150
WiredHome 100:0b084475d5a9 151 portraitmode = false;
WiredHome 100:0b084475d5a9 152
WiredHome 79:544eb4964795 153 if (width >= 800 && height >= 480 && color_bpp > 8) {
WiredHome 79:544eb4964795 154 WriteCommand(0x20, 0x00); // DPCR - 1-layer mode when the resolution is too high
WiredHome 79:544eb4964795 155 } else {
WiredHome 79:544eb4964795 156 WriteCommand(0x20, 0x80); // DPCR - 2-layer mode
WiredHome 79:544eb4964795 157 }
WiredHome 79:544eb4964795 158
WiredHome 79:544eb4964795 159 // Set display image to Blue on Black as default
WiredHome 79:544eb4964795 160 window(0,0, width, height); // Initialize to full screen
WiredHome 79:544eb4964795 161 SetTextCursorControl();
WiredHome 79:544eb4964795 162 foreground(Blue);
WiredHome 79:544eb4964795 163 background(Black);
WiredHome 79:544eb4964795 164 cls(3);
WiredHome 79:544eb4964795 165
WiredHome 79:544eb4964795 166 Power(poweron);
WiredHome 79:544eb4964795 167 if (poweron)
WiredHome 79:544eb4964795 168 Backlight_u8(255);
WiredHome 81:01da2e34283d 169 if (keypadon)
WiredHome 81:01da2e34283d 170 KeypadInit();
WiredHome 81:01da2e34283d 171 if (touchscreenon)
WiredHome 81:01da2e34283d 172 TouchPanelInit();
WiredHome 79:544eb4964795 173 #ifdef PERF_METRICS
WiredHome 79:544eb4964795 174 performance.start();
WiredHome 79:544eb4964795 175 ClearPerformance();
WiredHome 79:544eb4964795 176 #endif
WiredHome 79:544eb4964795 177 return noerror;
WiredHome 79:544eb4964795 178 }
WiredHome 79:544eb4964795 179
WiredHome 79:544eb4964795 180
WiredHome 79:544eb4964795 181 RetCode_t RA8875::Reset(void)
WiredHome 79:544eb4964795 182 {
WiredHome 79:544eb4964795 183 RetCode_t ret;
WiredHome 79:544eb4964795 184
WiredHome 94:203729061e48 185 #if 0
WiredHome 94:203729061e48 186 if (res != (PinName)NC) {
WiredHome 94:203729061e48 187 res = 0; // Active low - assert reset
WiredHome 94:203729061e48 188 wait_ms(2); // must be > 1024 clock periods. (@25 MHz, this is 40.96 usec)
WiredHome 94:203729061e48 189 res = 1; // de-assert reset
WiredHome 94:203729061e48 190 }
WiredHome 94:203729061e48 191 #endif
WiredHome 94:203729061e48 192 ret = WriteCommand(0x01, 0x01); // Apply Display Off, Reset
WiredHome 94:203729061e48 193 wait_ms(2); // no idea if I need to wait, or how long
WiredHome 79:544eb4964795 194 if (ret == noerror) {
WiredHome 94:203729061e48 195 ret = WriteCommand(0x01, 0x00); // Display off, Remove reset
WiredHome 94:203729061e48 196 wait_ms(2); // no idea if I need to wait, or how long
WiredHome 79:544eb4964795 197 }
WiredHome 79:544eb4964795 198 return ret;
WiredHome 79:544eb4964795 199 }
WiredHome 79:544eb4964795 200
WiredHome 79:544eb4964795 201
WiredHome 79:544eb4964795 202 const char * RA8875::GetErrorMessage(RetCode_t code)
WiredHome 79:544eb4964795 203 {
WiredHome 79:544eb4964795 204 if (code >= LastErrCode)
WiredHome 79:544eb4964795 205 code = bad_parameter;
WiredHome 79:544eb4964795 206 return ErrMessages[code];
WiredHome 79:544eb4964795 207 }
WiredHome 79:544eb4964795 208
WiredHome 79:544eb4964795 209
WiredHome 61:8f3153bf0baa 210 uint16_t RA8875::GetDrawingLayer(void)
WiredHome 61:8f3153bf0baa 211 {
WiredHome 61:8f3153bf0baa 212 return (ReadCommand(0x41) & 0x01);
WiredHome 61:8f3153bf0baa 213 }
WiredHome 43:3becae133285 214
WiredHome 79:544eb4964795 215
WiredHome 50:2c4f474a2453 216 RetCode_t RA8875::SelectDrawingLayer(uint16_t layer)
WiredHome 43:3becae133285 217 {
WiredHome 43:3becae133285 218 unsigned char mwcr1 = ReadCommand(0x41) & ~0x01; // retain all but the currently selected layer
WiredHome 43:3becae133285 219
WiredHome 106:c80828f5dea4 220 if (screenwidth >= 800 && screenheight >= 480 && screenbpp > 8) {
WiredHome 43:3becae133285 221 return bad_parameter;
WiredHome 43:3becae133285 222 } else if (layer > 1) {
WiredHome 43:3becae133285 223 return bad_parameter;
WiredHome 43:3becae133285 224 } else { // layer == 0 ro 1
WiredHome 72:ecffe56af969 225 return WriteCommand(0x41, mwcr1 | layer);
WiredHome 43:3becae133285 226 }
WiredHome 43:3becae133285 227 }
WiredHome 43:3becae133285 228
WiredHome 44:207594dece70 229
WiredHome 82:f7d300f26540 230 RA8875::LayerMode_T RA8875::GetLayerMode(void)
WiredHome 82:f7d300f26540 231 {
WiredHome 82:f7d300f26540 232 return (LayerMode_T)(ReadCommand(0x52) & 0x7);
WiredHome 82:f7d300f26540 233 }
WiredHome 82:f7d300f26540 234
WiredHome 82:f7d300f26540 235
WiredHome 53:86d24b9480b9 236 RetCode_t RA8875::SetLayerMode(LayerMode_T mode)
WiredHome 44:207594dece70 237 {
WiredHome 53:86d24b9480b9 238 unsigned char ltpr0 = ReadCommand(0x52) & ~0x7; // retain all but the display layer mode
WiredHome 105:4f116006ba1f 239
WiredHome 53:86d24b9480b9 240 if (mode <= (LayerMode_T)6) {
WiredHome 53:86d24b9480b9 241 WriteCommand(0x52, ltpr0 | (mode & 0x7));
WiredHome 53:86d24b9480b9 242 return noerror;
WiredHome 53:86d24b9480b9 243 } else {
WiredHome 53:86d24b9480b9 244 return bad_parameter;
WiredHome 53:86d24b9480b9 245 }
WiredHome 44:207594dece70 246 }
WiredHome 44:207594dece70 247
WiredHome 44:207594dece70 248
WiredHome 44:207594dece70 249 RetCode_t RA8875::SetLayerTransparency(uint8_t layer1, uint8_t layer2)
WiredHome 44:207594dece70 250 {
WiredHome 44:207594dece70 251 if (layer1 > 8)
WiredHome 44:207594dece70 252 layer1 = 8;
WiredHome 44:207594dece70 253 if (layer2 > 8)
WiredHome 44:207594dece70 254 layer2 = 8;
WiredHome 44:207594dece70 255 WriteCommand(0x53, ((layer2 & 0xF) << 4) | (layer1 & 0xF));
WiredHome 44:207594dece70 256 return noerror;
WiredHome 44:207594dece70 257 }
WiredHome 44:207594dece70 258
WiredHome 44:207594dece70 259
WiredHome 53:86d24b9480b9 260 RetCode_t RA8875::SetBackgroundTransparencyColor(color_t color)
WiredHome 53:86d24b9480b9 261 {
WiredHome 53:86d24b9480b9 262 WriteCommand(0x67, (color >> 11) & 0x1F);
WiredHome 53:86d24b9480b9 263 WriteCommand(0x68, (color >> 5) & 0x3F);
WiredHome 53:86d24b9480b9 264 WriteCommand(0x69, (color & 0x1F));
WiredHome 53:86d24b9480b9 265 return noerror;
WiredHome 53:86d24b9480b9 266 }
WiredHome 53:86d24b9480b9 267
WiredHome 79:544eb4964795 268
WiredHome 73:f22a18707b5e 269 color_t RA8875::GetBackgroundTransparencyColor(void)
WiredHome 73:f22a18707b5e 270 {
WiredHome 73:f22a18707b5e 271 RGBQUAD q;
WiredHome 105:4f116006ba1f 272
WiredHome 73:f22a18707b5e 273 q.rgbRed = ReadCommand(0x67);
WiredHome 73:f22a18707b5e 274 q.rgbGreen = ReadCommand(0x68);
WiredHome 73:f22a18707b5e 275 q.rgbBlue = ReadCommand(0x69);
WiredHome 73:f22a18707b5e 276 return RGBQuadToRGB16(&q, 0);
WiredHome 73:f22a18707b5e 277 }
WiredHome 73:f22a18707b5e 278
WiredHome 71:dcac8efd842d 279
WiredHome 77:9206c13aa527 280 RetCode_t RA8875::KeypadInit(bool scanEnable, bool longDetect, uint8_t sampleTime, uint8_t scanFrequency,
WiredHome 77:9206c13aa527 281 uint8_t longTimeAdjustment, bool interruptEnable, bool wakeupEnable)
WiredHome 71:dcac8efd842d 282 {
WiredHome 71:dcac8efd842d 283 uint8_t value = 0;
WiredHome 77:9206c13aa527 284
WiredHome 71:dcac8efd842d 285 if (sampleTime > 3 || scanFrequency > 7 || longTimeAdjustment > 3)
WiredHome 71:dcac8efd842d 286 return bad_parameter;
WiredHome 71:dcac8efd842d 287 value |= (scanEnable) ? 0x80 : 0x00;
WiredHome 71:dcac8efd842d 288 value |= (longDetect) ? 0x40 : 0x00;
WiredHome 71:dcac8efd842d 289 value |= (sampleTime & 0x03) << 4;
WiredHome 71:dcac8efd842d 290 value |= (scanFrequency & 0x07);
WiredHome 75:ca78388cfd77 291 WriteCommand(0xC0, value); // KSCR1 - Enable Key Scan (and ignore possibility of an error)
WiredHome 77:9206c13aa527 292
WiredHome 71:dcac8efd842d 293 value = 0;
WiredHome 71:dcac8efd842d 294 value |= (wakeupEnable) ? 0x80 : 0x00;
WiredHome 71:dcac8efd842d 295 value |= (longTimeAdjustment & 0x03) << 2;
WiredHome 75:ca78388cfd77 296 WriteCommand(0xC1, value); // KSCR2 - (and ignore possibility of an error)
WiredHome 77:9206c13aa527 297
WiredHome 75:ca78388cfd77 298 value = ReadCommand(0xF0); // (and ignore possibility of an error)
WiredHome 71:dcac8efd842d 299 value &= ~0x10;
WiredHome 71:dcac8efd842d 300 value |= (interruptEnable) ? 0x10 : 0x00;
WiredHome 75:ca78388cfd77 301 return WriteCommand(0xF0, value); // INT
WiredHome 71:dcac8efd842d 302 }
WiredHome 71:dcac8efd842d 303
WiredHome 79:544eb4964795 304
WiredHome 75:ca78388cfd77 305 RetCode_t RA8875::SetKeyMap(const uint8_t * CodeList)
WiredHome 75:ca78388cfd77 306 {
WiredHome 75:ca78388cfd77 307 pKeyMap = CodeList;
WiredHome 75:ca78388cfd77 308 return noerror;
WiredHome 75:ca78388cfd77 309 }
WiredHome 75:ca78388cfd77 310
WiredHome 79:544eb4964795 311
WiredHome 75:ca78388cfd77 312 bool RA8875::readable(void)
WiredHome 71:dcac8efd842d 313 {
WiredHome 71:dcac8efd842d 314 return (ReadCommand(0xF1) & 0x10); // check KS status - true if kbhit
WiredHome 71:dcac8efd842d 315 }
WiredHome 71:dcac8efd842d 316
WiredHome 79:544eb4964795 317
WiredHome 75:ca78388cfd77 318 uint8_t RA8875::getc(void)
WiredHome 71:dcac8efd842d 319 {
WiredHome 79:544eb4964795 320 //#define GETC_DEV // for development
WiredHome 77:9206c13aa527 321 #ifdef GETC_DEV
WiredHome 75:ca78388cfd77 322 uint8_t keyCode1, keyCode2;
WiredHome 77:9206c13aa527 323 #endif
WiredHome 75:ca78388cfd77 324 uint8_t keyCode3;
WiredHome 75:ca78388cfd77 325 static uint8_t count = 0;
WiredHome 75:ca78388cfd77 326 uint8_t col, row;
WiredHome 75:ca78388cfd77 327 uint8_t key;
WiredHome 123:2f45e80fec5f 328
WiredHome 75:ca78388cfd77 329 while (!readable()) {
WiredHome 71:dcac8efd842d 330 wait_us(POLLWAITuSec);
WiredHome 75:ca78388cfd77 331 // COUNTIDLETIME(POLLWAITuSec); // As it is voluntary to call the getc and pend. Don't tally it.
WiredHome 123:2f45e80fec5f 332 if (idle_callback) {
WiredHome 123:2f45e80fec5f 333 if (external_abort == (*idle_callback)(getc_wait)) {
WiredHome 123:2f45e80fec5f 334 return 0;
WiredHome 123:2f45e80fec5f 335 }
WiredHome 123:2f45e80fec5f 336 }
WiredHome 71:dcac8efd842d 337 }
WiredHome 71:dcac8efd842d 338 // read the key press number
WiredHome 71:dcac8efd842d 339 uint8_t keyNumReg = ReadCommand(0xC1) & 0x03;
WiredHome 75:ca78388cfd77 340 count++;
WiredHome 75:ca78388cfd77 341 switch (keyNumReg) {
WiredHome 75:ca78388cfd77 342 case 0x01: // one key
WiredHome 75:ca78388cfd77 343 keyCode3 = ReadCommand(0xC2);
WiredHome 77:9206c13aa527 344 #ifdef GETC_DEV
WiredHome 75:ca78388cfd77 345 keyCode2 = 0;
WiredHome 75:ca78388cfd77 346 keyCode1 = 0;
WiredHome 77:9206c13aa527 347 #endif
WiredHome 75:ca78388cfd77 348 break;
WiredHome 75:ca78388cfd77 349 case 0x02: // two keys
WiredHome 75:ca78388cfd77 350 keyCode3 = ReadCommand(0xC3);
WiredHome 77:9206c13aa527 351 #ifdef GETC_DEV
WiredHome 75:ca78388cfd77 352 keyCode2 = ReadCommand(0xC2);
WiredHome 75:ca78388cfd77 353 keyCode1 = 0;
WiredHome 77:9206c13aa527 354 #endif
WiredHome 75:ca78388cfd77 355 break;
WiredHome 75:ca78388cfd77 356 case 0x03: // three keys
WiredHome 75:ca78388cfd77 357 keyCode3 = ReadCommand(0xC4);
WiredHome 77:9206c13aa527 358 #ifdef GETC_DEV
WiredHome 75:ca78388cfd77 359 keyCode2 = ReadCommand(0xC3);
WiredHome 75:ca78388cfd77 360 keyCode1 = ReadCommand(0xC2);
WiredHome 77:9206c13aa527 361 #endif
WiredHome 75:ca78388cfd77 362 break;
WiredHome 75:ca78388cfd77 363 default: // no keys (key released)
WiredHome 75:ca78388cfd77 364 keyCode3 = 0xFF;
WiredHome 77:9206c13aa527 365 #ifdef GETC_DEV
WiredHome 75:ca78388cfd77 366 keyCode2 = 0;
WiredHome 75:ca78388cfd77 367 keyCode1 = 0;
WiredHome 77:9206c13aa527 368 #endif
WiredHome 75:ca78388cfd77 369 break;
WiredHome 75:ca78388cfd77 370 }
WiredHome 75:ca78388cfd77 371 if (keyCode3 == 0xFF)
WiredHome 75:ca78388cfd77 372 key = pKeyMap[0]; // Key value 0
WiredHome 75:ca78388cfd77 373 else {
WiredHome 75:ca78388cfd77 374 row = (keyCode3 >> 4) & 0x03;
WiredHome 75:ca78388cfd77 375 col = (keyCode3 & 7);
WiredHome 75:ca78388cfd77 376 key = row * 5 + col + 1; // Keys value 1 - 20
WiredHome 75:ca78388cfd77 377 if (key > 21) {
WiredHome 75:ca78388cfd77 378 key = 21;
WiredHome 75:ca78388cfd77 379 }
WiredHome 75:ca78388cfd77 380 key = pKeyMap[key];
WiredHome 75:ca78388cfd77 381 key |= (keyCode3 & 0x80); // combine the key held flag
WiredHome 75:ca78388cfd77 382 }
WiredHome 77:9206c13aa527 383 #if GETC_DEV // for Development only
WiredHome 75:ca78388cfd77 384 SetTextCursor(0, 20);
WiredHome 75:ca78388cfd77 385 printf(" Reg: %02x\r\n", keyNumReg);
WiredHome 75:ca78388cfd77 386 printf(" key1: %02x\r\n", keyCode1);
WiredHome 75:ca78388cfd77 387 printf(" key2: %02x\r\n", keyCode2);
WiredHome 75:ca78388cfd77 388 printf(" key3: %02x\r\n", keyCode3);
WiredHome 75:ca78388cfd77 389 printf(" count: %02X\r\n", count);
WiredHome 75:ca78388cfd77 390 printf(" key: %02X\r\n", key);
WiredHome 77:9206c13aa527 391 #endif
WiredHome 75:ca78388cfd77 392 WriteCommand(0xF1, 0x10); // Clear KS status
WiredHome 75:ca78388cfd77 393 return key;
WiredHome 71:dcac8efd842d 394 }
WiredHome 71:dcac8efd842d 395
WiredHome 79:544eb4964795 396
WiredHome 19:3f82c1161fd2 397 #ifdef PERF_METRICS
WiredHome 19:3f82c1161fd2 398 void RA8875::ClearPerformance()
WiredHome 19:3f82c1161fd2 399 {
WiredHome 100:0b084475d5a9 400 int i;
WiredHome 100:0b084475d5a9 401
WiredHome 100:0b084475d5a9 402 for (i=0; i<METRICCOUNT; i++)
WiredHome 19:3f82c1161fd2 403 metrics[i] = 0;
WiredHome 75:ca78388cfd77 404 idletime_usec = 0;
WiredHome 100:0b084475d5a9 405 for (i=0; i<256; i++)
WiredHome 100:0b084475d5a9 406 commandsUsed[i] = 0;
WiredHome 19:3f82c1161fd2 407 }
WiredHome 19:3f82c1161fd2 408
WiredHome 79:544eb4964795 409
WiredHome 19:3f82c1161fd2 410 void RA8875::RegisterPerformance(method_e method)
WiredHome 19:3f82c1161fd2 411 {
WiredHome 19:3f82c1161fd2 412 unsigned long elapsed = performance.read_us();
WiredHome 73:f22a18707b5e 413
WiredHome 19:3f82c1161fd2 414 if (method < METRICCOUNT && elapsed > metrics[method])
WiredHome 19:3f82c1161fd2 415 metrics[method] = elapsed;
WiredHome 19:3f82c1161fd2 416 }
WiredHome 19:3f82c1161fd2 417
WiredHome 79:544eb4964795 418
WiredHome 66:468a11f05580 419 void RA8875::CountIdleTime(uint32_t t)
WiredHome 66:468a11f05580 420 {
WiredHome 75:ca78388cfd77 421 idletime_usec += t;
WiredHome 66:468a11f05580 422 }
WiredHome 44:207594dece70 423
WiredHome 79:544eb4964795 424
WiredHome 41:2956a0a221e5 425 void RA8875::ReportPerformance(Serial & pc)
WiredHome 19:3f82c1161fd2 426 {
WiredHome 100:0b084475d5a9 427 int i;
WiredHome 100:0b084475d5a9 428
WiredHome 41:2956a0a221e5 429 pc.printf("\r\nPerformance Metrics\r\n");
WiredHome 100:0b084475d5a9 430 for (i=0; i<METRICCOUNT; i++) {
WiredHome 41:2956a0a221e5 431 pc.printf("%10d uS %s\r\n", metrics[i], metricsName[i]);
WiredHome 66:468a11f05580 432 }
WiredHome 75:ca78388cfd77 433 pc.printf("%10d uS Idle time polling display for ready.\r\n", idletime_usec);
WiredHome 91:ca5f829e6d27 434 for (i=0; i<256; i++) {
WiredHome 91:ca5f829e6d27 435 if (commandsUsed[i])
WiredHome 100:0b084475d5a9 436 pc.printf("Command %02X used %5d times.\r\n", i, commandsUsed[i]);
WiredHome 91:ca5f829e6d27 437 }
WiredHome 19:3f82c1161fd2 438 }
WiredHome 19:3f82c1161fd2 439 #endif
WiredHome 19:3f82c1161fd2 440
WiredHome 44:207594dece70 441
WiredHome 82:f7d300f26540 442 bool RA8875::Intersect(rect_t rect, point_t p)
WiredHome 82:f7d300f26540 443 {
WiredHome 82:f7d300f26540 444 if (p.x >= min(rect.p1.x, rect.p2.x) && p.x <= max(rect.p1.x, rect.p2.x)
WiredHome 82:f7d300f26540 445 && p.y >= min(rect.p1.y, rect.p2.y) && p.y <= max(rect.p1.y, rect.p2.y))
WiredHome 82:f7d300f26540 446 return true;
WiredHome 82:f7d300f26540 447 else
WiredHome 82:f7d300f26540 448 return false;
WiredHome 82:f7d300f26540 449 }
WiredHome 82:f7d300f26540 450
WiredHome 82:f7d300f26540 451
WiredHome 82:f7d300f26540 452
WiredHome 38:38d503b4fad6 453 RetCode_t RA8875::WriteCommandW(uint8_t command, uint16_t data)
WiredHome 38:38d503b4fad6 454 {
WiredHome 38:38d503b4fad6 455 WriteCommand(command, data & 0xFF);
WiredHome 38:38d503b4fad6 456 WriteCommand(command+1, data >> 8);
WiredHome 38:38d503b4fad6 457 return noerror;
WiredHome 38:38d503b4fad6 458 }
WiredHome 38:38d503b4fad6 459
WiredHome 44:207594dece70 460
WiredHome 19:3f82c1161fd2 461 RetCode_t RA8875::WriteCommand(unsigned char command, unsigned int data)
WiredHome 19:3f82c1161fd2 462 {
WiredHome 91:ca5f829e6d27 463 #ifdef PERF_METRICS
WiredHome 92:ce1ab76e8614 464 if (commandsUsed[command] < 65535)
WiredHome 91:ca5f829e6d27 465 commandsUsed[command]++;
WiredHome 91:ca5f829e6d27 466 #endif
WiredHome 79:544eb4964795 467 _select(true);
WiredHome 83:7bad0068cca0 468 _spiwrite(0x80); // RS:1 (Cmd/Status), RW:0 (Write)
WiredHome 79:544eb4964795 469 _spiwrite(command);
WiredHome 19:3f82c1161fd2 470 if (data <= 0xFF) { // only if in the valid range
WiredHome 79:544eb4964795 471 _spiwrite(0x00);
WiredHome 79:544eb4964795 472 _spiwrite(data);
WiredHome 19:3f82c1161fd2 473 }
WiredHome 79:544eb4964795 474 _select(false);
WiredHome 19:3f82c1161fd2 475 return noerror;
WiredHome 19:3f82c1161fd2 476 }
WiredHome 19:3f82c1161fd2 477
WiredHome 44:207594dece70 478
WiredHome 38:38d503b4fad6 479 RetCode_t RA8875::WriteDataW(uint16_t data)
WiredHome 38:38d503b4fad6 480 {
WiredHome 79:544eb4964795 481 _select(true);
WiredHome 83:7bad0068cca0 482 _spiwrite(0x00); // RS:0 (Data), RW:0 (Write)
WiredHome 79:544eb4964795 483 _spiwrite(data & 0xFF);
WiredHome 79:544eb4964795 484 _spiwrite(data >> 8);
WiredHome 79:544eb4964795 485 _select(false);
WiredHome 38:38d503b4fad6 486 return noerror;
WiredHome 38:38d503b4fad6 487 }
WiredHome 38:38d503b4fad6 488
WiredHome 44:207594dece70 489
WiredHome 19:3f82c1161fd2 490 RetCode_t RA8875::WriteData(unsigned char data)
WiredHome 19:3f82c1161fd2 491 {
WiredHome 79:544eb4964795 492 _select(true);
WiredHome 83:7bad0068cca0 493 _spiwrite(0x00); // RS:0 (Data), RW:0 (Write)
WiredHome 79:544eb4964795 494 _spiwrite(data);
WiredHome 79:544eb4964795 495 _select(false);
WiredHome 19:3f82c1161fd2 496 return noerror;
WiredHome 19:3f82c1161fd2 497 }
WiredHome 19:3f82c1161fd2 498
WiredHome 44:207594dece70 499
WiredHome 19:3f82c1161fd2 500 unsigned char RA8875::ReadCommand(unsigned char command)
WiredHome 19:3f82c1161fd2 501 {
WiredHome 19:3f82c1161fd2 502 WriteCommand(command);
WiredHome 19:3f82c1161fd2 503 return ReadData();
WiredHome 19:3f82c1161fd2 504 }
WiredHome 19:3f82c1161fd2 505
WiredHome 44:207594dece70 506
WiredHome 19:3f82c1161fd2 507 unsigned char RA8875::ReadData(void)
WiredHome 19:3f82c1161fd2 508 {
WiredHome 19:3f82c1161fd2 509 unsigned char data;
WiredHome 73:f22a18707b5e 510
WiredHome 79:544eb4964795 511 _select(true);
WiredHome 83:7bad0068cca0 512 _spiwrite(0x40); // RS:0 (Data), RW:1 (Read)
WiredHome 79:544eb4964795 513 data = _spiread();
WiredHome 79:544eb4964795 514 _select(false);
WiredHome 19:3f82c1161fd2 515 return data;
WiredHome 19:3f82c1161fd2 516 }
WiredHome 19:3f82c1161fd2 517
WiredHome 44:207594dece70 518
WiredHome 41:2956a0a221e5 519 uint16_t RA8875::ReadDataW(void)
WiredHome 41:2956a0a221e5 520 {
WiredHome 41:2956a0a221e5 521 uint16_t data;
WiredHome 73:f22a18707b5e 522
WiredHome 79:544eb4964795 523 _select(true);
WiredHome 83:7bad0068cca0 524 _spiwrite(0x40); // RS:0 (Data), RW:1 (Read)
WiredHome 79:544eb4964795 525 data = _spiread();
WiredHome 79:544eb4964795 526 data |= (_spiread() << 8);
WiredHome 79:544eb4964795 527 _select(false);
WiredHome 41:2956a0a221e5 528 return data;
WiredHome 41:2956a0a221e5 529 }
WiredHome 41:2956a0a221e5 530
WiredHome 44:207594dece70 531
WiredHome 19:3f82c1161fd2 532 unsigned char RA8875::ReadStatus(void)
WiredHome 19:3f82c1161fd2 533 {
WiredHome 19:3f82c1161fd2 534 unsigned char data;
WiredHome 73:f22a18707b5e 535
WiredHome 79:544eb4964795 536 _select(true);
WiredHome 83:7bad0068cca0 537 _spiwrite(0xC0); // RS:1 (Cmd/Status), RW:1 (Read) (Read STSR)
WiredHome 79:544eb4964795 538 data = _spiread();
WiredHome 79:544eb4964795 539 _select(false);
WiredHome 19:3f82c1161fd2 540 return data;
WiredHome 19:3f82c1161fd2 541 }
WiredHome 19:3f82c1161fd2 542
WiredHome 79:544eb4964795 543
WiredHome 66:468a11f05580 544 /// @todo add a timeout and return false, but how long
WiredHome 66:468a11f05580 545 /// to wait since some operations can be very long.
WiredHome 66:468a11f05580 546 bool RA8875::_WaitWhileBusy(uint8_t mask)
WiredHome 66:468a11f05580 547 {
WiredHome 66:468a11f05580 548 int i = 20000/POLLWAITuSec; // 20 msec max
WiredHome 66:468a11f05580 549
WiredHome 67:9f834f0ff97d 550 while (i-- && ReadStatus() & mask) {
WiredHome 66:468a11f05580 551 wait_us(POLLWAITuSec);
WiredHome 68:ab08efabfc88 552 COUNTIDLETIME(POLLWAITuSec);
WiredHome 123:2f45e80fec5f 553 if (idle_callback) {
WiredHome 123:2f45e80fec5f 554 if (external_abort == (*idle_callback)(status_wait)) {
WiredHome 123:2f45e80fec5f 555 return false;
WiredHome 123:2f45e80fec5f 556 }
WiredHome 123:2f45e80fec5f 557 }
WiredHome 67:9f834f0ff97d 558 }
WiredHome 66:468a11f05580 559 if (i)
WiredHome 66:468a11f05580 560 return true;
WiredHome 66:468a11f05580 561 else
WiredHome 66:468a11f05580 562 return false;
WiredHome 66:468a11f05580 563 }
WiredHome 66:468a11f05580 564
WiredHome 79:544eb4964795 565
WiredHome 66:468a11f05580 566 /// @todo add a timeout and return false, but how long
WiredHome 66:468a11f05580 567 /// to wait since some operations can be very long.
WiredHome 66:468a11f05580 568 bool RA8875::_WaitWhileReg(uint8_t reg, uint8_t mask)
WiredHome 66:468a11f05580 569 {
WiredHome 66:468a11f05580 570 int i = 20000/POLLWAITuSec; // 20 msec max
WiredHome 66:468a11f05580 571
WiredHome 67:9f834f0ff97d 572 while (i-- && ReadCommand(reg) & mask) {
WiredHome 66:468a11f05580 573 wait_us(POLLWAITuSec);
WiredHome 68:ab08efabfc88 574 COUNTIDLETIME(POLLWAITuSec);
WiredHome 123:2f45e80fec5f 575 if (idle_callback) {
WiredHome 123:2f45e80fec5f 576 if (external_abort == (*idle_callback)(command_wait)) {
WiredHome 123:2f45e80fec5f 577 return false;
WiredHome 123:2f45e80fec5f 578 }
WiredHome 123:2f45e80fec5f 579 }
WiredHome 67:9f834f0ff97d 580 }
WiredHome 66:468a11f05580 581 if (i)
WiredHome 66:468a11f05580 582 return true;
WiredHome 66:468a11f05580 583 else
WiredHome 66:468a11f05580 584 return false;
WiredHome 66:468a11f05580 585 }
WiredHome 66:468a11f05580 586
WiredHome 106:c80828f5dea4 587 // RRRR RGGG GGGB BBBB
WiredHome 106:c80828f5dea4 588 // 4321 0543 2104 3210
WiredHome 106:c80828f5dea4 589 // RRRG GGBB
WiredHome 106:c80828f5dea4 590 // 2102 1010
WiredHome 105:4f116006ba1f 591 uint8_t RA8875::_cvt16to8(color_t c16)
WiredHome 105:4f116006ba1f 592 {
WiredHome 105:4f116006ba1f 593 return ((c16 >> 8) & 0xE0)
WiredHome 105:4f116006ba1f 594 | ((c16 >> 6) & 0x1C)
WiredHome 105:4f116006ba1f 595 | ((c16 >> 3) & 0x03);
WiredHome 105:4f116006ba1f 596 }
WiredHome 105:4f116006ba1f 597
WiredHome 106:c80828f5dea4 598 // RRRG GGBB
WiredHome 106:c80828f5dea4 599 // 2102 1010
WiredHome 106:c80828f5dea4 600 // RRRR RGGG GGGB BBBB
WiredHome 106:c80828f5dea4 601 // 2101 0543 2104 3210
WiredHome 105:4f116006ba1f 602 color_t RA8875::_cvt8to16(uint8_t c8)
WiredHome 105:4f116006ba1f 603 {
WiredHome 106:c80828f5dea4 604 color_t c16;
WiredHome 106:c80828f5dea4 605 color_t temp = (color_t)c8;
WiredHome 106:c80828f5dea4 606
WiredHome 106:c80828f5dea4 607 c16 = ((temp & 0xE0) << 8)
WiredHome 106:c80828f5dea4 608 | ((temp & 0xC0) << 5)
WiredHome 106:c80828f5dea4 609 | ((temp & 0x1C) << 6)
WiredHome 106:c80828f5dea4 610 | ((temp & 0x1C) << 3)
WiredHome 106:c80828f5dea4 611 | ((temp & 0x03) << 3)
WiredHome 106:c80828f5dea4 612 | ((temp & 0x03) << 1)
WiredHome 106:c80828f5dea4 613 | ((temp & 0x03) >> 1);
WiredHome 106:c80828f5dea4 614 c16 = (c16 << 8) | (c16 >> 8);
WiredHome 105:4f116006ba1f 615 return c16;
WiredHome 105:4f116006ba1f 616 }
WiredHome 66:468a11f05580 617
WiredHome 37:f19b7e7449dc 618 dim_t RA8875::fontwidth(void)
WiredHome 19:3f82c1161fd2 619 {
WiredHome 19:3f82c1161fd2 620 if (font == NULL)
WiredHome 55:dfbabef7003e 621 return (((ReadCommand(0x22) >> 2) & 0x3) + 1) * 8;
WiredHome 19:3f82c1161fd2 622 else
WiredHome 98:ecebed9b80b2 623 return extFontWidth;
WiredHome 19:3f82c1161fd2 624 }
WiredHome 19:3f82c1161fd2 625
WiredHome 44:207594dece70 626
WiredHome 37:f19b7e7449dc 627 dim_t RA8875::fontheight(void)
WiredHome 19:3f82c1161fd2 628 {
WiredHome 19:3f82c1161fd2 629 if (font == NULL)
WiredHome 23:a50ded45dbaf 630 return (((ReadCommand(0x22) >> 0) & 0x3) + 1) * 16;
WiredHome 19:3f82c1161fd2 631 else
WiredHome 98:ecebed9b80b2 632 return extFontHeight;
WiredHome 19:3f82c1161fd2 633 }
WiredHome 19:3f82c1161fd2 634
WiredHome 44:207594dece70 635
WiredHome 37:f19b7e7449dc 636 RetCode_t RA8875::locate(textloc_t column, textloc_t row)
WiredHome 19:3f82c1161fd2 637 {
WiredHome 32:0e4f2ae512e2 638 return SetTextCursor(column * fontwidth(), row * fontheight());
WiredHome 19:3f82c1161fd2 639 }
WiredHome 19:3f82c1161fd2 640
WiredHome 44:207594dece70 641
WiredHome 19:3f82c1161fd2 642 int RA8875::columns(void)
WiredHome 19:3f82c1161fd2 643 {
WiredHome 105:4f116006ba1f 644 return screenwidth / fontwidth();
WiredHome 19:3f82c1161fd2 645 }
WiredHome 19:3f82c1161fd2 646
WiredHome 44:207594dece70 647
WiredHome 19:3f82c1161fd2 648 int RA8875::rows(void)
WiredHome 19:3f82c1161fd2 649 {
WiredHome 105:4f116006ba1f 650 return screenheight / fontheight();
WiredHome 19:3f82c1161fd2 651 }
WiredHome 19:3f82c1161fd2 652
WiredHome 44:207594dece70 653
WiredHome 38:38d503b4fad6 654 dim_t RA8875::width(void)
WiredHome 19:3f82c1161fd2 655 {
WiredHome 90:d113d71ae4f0 656 if (portraitmode)
WiredHome 90:d113d71ae4f0 657 return screenheight;
WiredHome 90:d113d71ae4f0 658 else
WiredHome 90:d113d71ae4f0 659 return screenwidth;
WiredHome 19:3f82c1161fd2 660 }
WiredHome 19:3f82c1161fd2 661
WiredHome 44:207594dece70 662
WiredHome 38:38d503b4fad6 663 dim_t RA8875::height(void)
WiredHome 19:3f82c1161fd2 664 {
WiredHome 90:d113d71ae4f0 665 if (portraitmode)
WiredHome 90:d113d71ae4f0 666 return screenwidth;
WiredHome 90:d113d71ae4f0 667 else
WiredHome 90:d113d71ae4f0 668 return screenheight;
WiredHome 19:3f82c1161fd2 669 }
WiredHome 19:3f82c1161fd2 670
WiredHome 44:207594dece70 671
WiredHome 43:3becae133285 672 dim_t RA8875::color_bpp(void)
WiredHome 43:3becae133285 673 {
WiredHome 105:4f116006ba1f 674 return screenbpp;
WiredHome 43:3becae133285 675 }
WiredHome 43:3becae133285 676
WiredHome 103:7e0464ca6c5c 677 RetCode_t RA8875::SetTextCursor(point_t p)
WiredHome 103:7e0464ca6c5c 678 {
WiredHome 103:7e0464ca6c5c 679 return SetTextCursor(p.x, p.y);
WiredHome 103:7e0464ca6c5c 680 }
WiredHome 44:207594dece70 681
WiredHome 37:f19b7e7449dc 682 RetCode_t RA8875::SetTextCursor(loc_t x, loc_t y)
WiredHome 19:3f82c1161fd2 683 {
WiredHome 98:ecebed9b80b2 684 INFO("SetTextCursor(%d, %d)", x, y);
WiredHome 75:ca78388cfd77 685 cursor_x = x; // set these values for non-internal fonts
WiredHome 75:ca78388cfd77 686 cursor_y = y;
WiredHome 38:38d503b4fad6 687 WriteCommandW(0x2A, x);
WiredHome 38:38d503b4fad6 688 WriteCommandW(0x2C, y);
WiredHome 19:3f82c1161fd2 689 return noerror;
WiredHome 19:3f82c1161fd2 690 }
WiredHome 19:3f82c1161fd2 691
WiredHome 103:7e0464ca6c5c 692 point_t RA8875::GetTextCursor(void)
WiredHome 103:7e0464ca6c5c 693 {
WiredHome 103:7e0464ca6c5c 694 point_t p;
WiredHome 103:7e0464ca6c5c 695
WiredHome 103:7e0464ca6c5c 696 p.x = GetTextCursor_X();
WiredHome 103:7e0464ca6c5c 697 p.y = GetTextCursor_Y();
WiredHome 103:7e0464ca6c5c 698 return p;
WiredHome 103:7e0464ca6c5c 699 }
WiredHome 44:207594dece70 700
WiredHome 37:f19b7e7449dc 701 loc_t RA8875::GetTextCursor_Y(void)
WiredHome 29:422616aa04bd 702 {
WiredHome 98:ecebed9b80b2 703 loc_t y;
WiredHome 98:ecebed9b80b2 704
WiredHome 29:422616aa04bd 705 if (font == NULL)
WiredHome 98:ecebed9b80b2 706 y = ReadCommand(0x2C) | (ReadCommand(0x2D) << 8);
WiredHome 29:422616aa04bd 707 else
WiredHome 98:ecebed9b80b2 708 y = cursor_y;
WiredHome 98:ecebed9b80b2 709 INFO("GetTextCursor_Y = %d", y);
WiredHome 98:ecebed9b80b2 710 return y;
WiredHome 29:422616aa04bd 711 }
WiredHome 29:422616aa04bd 712
WiredHome 44:207594dece70 713
WiredHome 37:f19b7e7449dc 714 loc_t RA8875::GetTextCursor_X(void)
WiredHome 29:422616aa04bd 715 {
WiredHome 98:ecebed9b80b2 716 loc_t x;
WiredHome 98:ecebed9b80b2 717
WiredHome 29:422616aa04bd 718 if (font == NULL)
WiredHome 98:ecebed9b80b2 719 x = ReadCommand(0x2A) | (ReadCommand(0x2B) << 8);
WiredHome 29:422616aa04bd 720 else
WiredHome 98:ecebed9b80b2 721 x = cursor_x;
WiredHome 98:ecebed9b80b2 722 INFO("GetTextCursor_X = %d", x);
WiredHome 98:ecebed9b80b2 723 return x;
WiredHome 29:422616aa04bd 724 }
WiredHome 29:422616aa04bd 725
WiredHome 44:207594dece70 726
WiredHome 24:8ca861acf12d 727 RetCode_t RA8875::SetTextCursorControl(cursor_t cursor, bool blink)
WiredHome 23:a50ded45dbaf 728 {
WiredHome 23:a50ded45dbaf 729 unsigned char mwcr0 = ReadCommand(0x40) & 0x0F; // retain direction, auto-increase
WiredHome 43:3becae133285 730 unsigned char mwcr1 = ReadCommand(0x41) & 0x01; // retain currently selected layer
WiredHome 24:8ca861acf12d 731 unsigned char horz = 0;
WiredHome 24:8ca861acf12d 732 unsigned char vert = 0;
WiredHome 73:f22a18707b5e 733
WiredHome 24:8ca861acf12d 734 mwcr0 |= 0x80; // text mode
WiredHome 24:8ca861acf12d 735 if (cursor != NOCURSOR)
WiredHome 24:8ca861acf12d 736 mwcr0 |= 0x40; // visible
WiredHome 23:a50ded45dbaf 737 if (blink)
WiredHome 24:8ca861acf12d 738 mwcr0 |= 0x20; // blink
WiredHome 23:a50ded45dbaf 739 WriteCommand(0x40, mwcr0); // configure the cursor
WiredHome 43:3becae133285 740 WriteCommand(0x41, mwcr1); // close the graphics cursor
WiredHome 24:8ca861acf12d 741 WriteCommand(0x44, 0x1f); // The cursor flashing cycle
WiredHome 24:8ca861acf12d 742 switch (cursor) {
WiredHome 24:8ca861acf12d 743 case IBEAM:
WiredHome 24:8ca861acf12d 744 horz = 0x01;
WiredHome 24:8ca861acf12d 745 vert = 0x1F;
WiredHome 24:8ca861acf12d 746 break;
WiredHome 24:8ca861acf12d 747 case UNDER:
WiredHome 24:8ca861acf12d 748 horz = 0x07;
WiredHome 24:8ca861acf12d 749 vert = 0x01;
WiredHome 24:8ca861acf12d 750 break;
WiredHome 24:8ca861acf12d 751 case BLOCK:
WiredHome 24:8ca861acf12d 752 horz = 0x07;
WiredHome 24:8ca861acf12d 753 vert = 0x1F;
WiredHome 24:8ca861acf12d 754 break;
WiredHome 24:8ca861acf12d 755 case NOCURSOR:
WiredHome 24:8ca861acf12d 756 default:
WiredHome 24:8ca861acf12d 757 break;
WiredHome 24:8ca861acf12d 758 }
WiredHome 24:8ca861acf12d 759 WriteCommand(0x4e, horz); // The cursor size horz
WiredHome 24:8ca861acf12d 760 WriteCommand(0x4f, vert); // The cursor size vert
WiredHome 23:a50ded45dbaf 761 return noerror;
WiredHome 23:a50ded45dbaf 762 }
WiredHome 23:a50ded45dbaf 763
WiredHome 44:207594dece70 764
WiredHome 19:3f82c1161fd2 765 RetCode_t RA8875::SetTextFont(RA8875::font_t font)
WiredHome 19:3f82c1161fd2 766 {
WiredHome 19:3f82c1161fd2 767 if (/*font >= RA8875::ISO8859_1 && */ font <= RA8875::ISO8859_4) {
WiredHome 19:3f82c1161fd2 768 WriteCommand(0x21, (unsigned int)(font));
WiredHome 19:3f82c1161fd2 769 return noerror;
WiredHome 19:3f82c1161fd2 770 } else {
WiredHome 19:3f82c1161fd2 771 return bad_parameter;
WiredHome 19:3f82c1161fd2 772 }
WiredHome 19:3f82c1161fd2 773 }
WiredHome 19:3f82c1161fd2 774
WiredHome 44:207594dece70 775
WiredHome 84:e102021864b5 776 RetCode_t RA8875::SetOrientation(RA8875::orientation_t angle)
WiredHome 84:e102021864b5 777 {
WiredHome 84:e102021864b5 778 uint8_t fncr1Val = ReadCommand(0x22);
WiredHome 84:e102021864b5 779 uint8_t dpcrVal = ReadCommand(0x20);
WiredHome 84:e102021864b5 780
WiredHome 84:e102021864b5 781 fncr1Val &= ~0x10; // remove the old direction bit
WiredHome 84:e102021864b5 782 dpcrVal &= ~0x0C; // remove the old scan direction bits
WiredHome 84:e102021864b5 783 switch (angle) {
WiredHome 84:e102021864b5 784 case RA8875::normal:
WiredHome 84:e102021864b5 785 //fncr1Val |= 0x10;
WiredHome 84:e102021864b5 786 //dpcrVal |= 0x00;
WiredHome 90:d113d71ae4f0 787 portraitmode = false;
WiredHome 84:e102021864b5 788 break;
WiredHome 84:e102021864b5 789 case RA8875::rotate_90:
WiredHome 84:e102021864b5 790 fncr1Val |= 0x10;
WiredHome 84:e102021864b5 791 dpcrVal |= 0x08;
WiredHome 90:d113d71ae4f0 792 portraitmode = true;
WiredHome 84:e102021864b5 793 break;
WiredHome 84:e102021864b5 794 case RA8875::rotate_180:
WiredHome 84:e102021864b5 795 //fncr1Val |= 0x00;
WiredHome 84:e102021864b5 796 dpcrVal |= 0x0C;
WiredHome 90:d113d71ae4f0 797 portraitmode = false;
WiredHome 84:e102021864b5 798 break;
WiredHome 84:e102021864b5 799 case RA8875::rotate_270:
WiredHome 84:e102021864b5 800 fncr1Val |= 0x10;
WiredHome 84:e102021864b5 801 dpcrVal |= 0x04;
WiredHome 90:d113d71ae4f0 802 portraitmode = true;
WiredHome 84:e102021864b5 803 break;
WiredHome 84:e102021864b5 804 default:
WiredHome 84:e102021864b5 805 return bad_parameter;
WiredHome 84:e102021864b5 806 }
WiredHome 100:0b084475d5a9 807 INFO("Orientation: %d, %d", angle, portraitmode);
WiredHome 84:e102021864b5 808 WriteCommand(0x22, fncr1Val);
WiredHome 84:e102021864b5 809 return WriteCommand(0x20, dpcrVal);
WiredHome 84:e102021864b5 810 }
WiredHome 84:e102021864b5 811
WiredHome 84:e102021864b5 812
WiredHome 19:3f82c1161fd2 813 RetCode_t RA8875::SetTextFontControl(fill_t fillit,
WiredHome 73:f22a18707b5e 814 RA8875::HorizontalScale hScale,
WiredHome 73:f22a18707b5e 815 RA8875::VerticalScale vScale,
WiredHome 73:f22a18707b5e 816 RA8875::alignment_t alignment)
WiredHome 19:3f82c1161fd2 817 {
WiredHome 73:f22a18707b5e 818 if (hScale >= 1 && hScale <= 4 &&
WiredHome 73:f22a18707b5e 819 vScale >= 1 && vScale <= 4) {
WiredHome 84:e102021864b5 820 uint8_t fncr1Val = ReadCommand(0x22);
WiredHome 84:e102021864b5 821
WiredHome 98:ecebed9b80b2 822 fncr1Val &= ~0x10; // do not disturb the rotate flag
WiredHome 19:3f82c1161fd2 823 if (alignment == align_full)
WiredHome 84:e102021864b5 824 fncr1Val |= 0x80;
WiredHome 19:3f82c1161fd2 825 if (fillit == NOFILL)
WiredHome 84:e102021864b5 826 fncr1Val |= 0x40;
WiredHome 84:e102021864b5 827 fncr1Val |= ((hScale - 1) << 2);
WiredHome 84:e102021864b5 828 fncr1Val |= ((vScale - 1) << 0);
WiredHome 84:e102021864b5 829 return WriteCommand(0x22, fncr1Val);
WiredHome 19:3f82c1161fd2 830 } else {
WiredHome 19:3f82c1161fd2 831 return bad_parameter;
WiredHome 19:3f82c1161fd2 832 }
WiredHome 19:3f82c1161fd2 833 }
WiredHome 19:3f82c1161fd2 834
WiredHome 44:207594dece70 835
WiredHome 19:3f82c1161fd2 836 RetCode_t RA8875::SetTextFontSize(RA8875::HorizontalScale hScale, RA8875::VerticalScale vScale)
WiredHome 19:3f82c1161fd2 837 {
WiredHome 19:3f82c1161fd2 838 unsigned char reg = ReadCommand(0x22);
WiredHome 73:f22a18707b5e 839
WiredHome 40:04aa280dfa39 840 if (vScale == -1)
WiredHome 40:04aa280dfa39 841 vScale = hScale;
WiredHome 19:3f82c1161fd2 842 if (hScale >= 1 && hScale <= 4 && vScale >= 1 && vScale <= 4) {
WiredHome 19:3f82c1161fd2 843 reg &= 0xF0; // keep the high nibble as is.
WiredHome 19:3f82c1161fd2 844 reg |= ((hScale - 1) << 2);
WiredHome 19:3f82c1161fd2 845 reg |= ((vScale - 1) << 0);
WiredHome 19:3f82c1161fd2 846 WriteCommand(0x22, reg);
WiredHome 19:3f82c1161fd2 847 return noerror;
WiredHome 19:3f82c1161fd2 848 } else {
WiredHome 19:3f82c1161fd2 849 return bad_parameter;
WiredHome 19:3f82c1161fd2 850 }
WiredHome 19:3f82c1161fd2 851 }
WiredHome 19:3f82c1161fd2 852
WiredHome 44:207594dece70 853
WiredHome 19:3f82c1161fd2 854 int RA8875::_putc(int c)
WiredHome 19:3f82c1161fd2 855 {
WiredHome 29:422616aa04bd 856 if (font == NULL) {
WiredHome 29:422616aa04bd 857 return _internal_putc(c);
WiredHome 29:422616aa04bd 858 } else {
WiredHome 29:422616aa04bd 859 return _external_putc(c);
WiredHome 29:422616aa04bd 860 }
WiredHome 29:422616aa04bd 861 }
WiredHome 29:422616aa04bd 862
WiredHome 44:207594dece70 863
WiredHome 101:e0aad446094a 864
WiredHome 101:e0aad446094a 865 // Questions to ponder -
WiredHome 101:e0aad446094a 866 // - if we choose to wrap to the next line, because the character won't fit on the current line,
WiredHome 101:e0aad446094a 867 // should it erase the space to the width of the screen (in case there is leftover junk there)?
WiredHome 101:e0aad446094a 868 // - it currently wraps from the bottom of the screen back to the top. I have pondered what
WiredHome 101:e0aad446094a 869 // it might take to scroll the screen - but haven't thought hard enough about it.
WiredHome 101:e0aad446094a 870 //
WiredHome 29:422616aa04bd 871 int RA8875::_external_putc(int c)
WiredHome 29:422616aa04bd 872 {
WiredHome 19:3f82c1161fd2 873 if (c) {
WiredHome 19:3f82c1161fd2 874 if (c == '\r') {
WiredHome 111:efe436c43aba 875 cursor_x = windowrect.p1.x;
WiredHome 29:422616aa04bd 876 } else if (c == '\n') {
WiredHome 98:ecebed9b80b2 877 cursor_y += extFontHeight;
WiredHome 29:422616aa04bd 878 } else {
WiredHome 109:7b94f06f085b 879 dim_t charWidth, charHeight;
WiredHome 101:e0aad446094a 880 const uint8_t * charRecord;
WiredHome 101:e0aad446094a 881
WiredHome 101:e0aad446094a 882 charRecord = getCharMetrics(c, &charWidth, &charHeight);
WiredHome 101:e0aad446094a 883 //int advance = charwidth(c);
WiredHome 111:efe436c43aba 884 INFO("(%d,%d) - (%d,%d):(%d,%d), charWidth: %d '%c", cursor_x, cursor_y,
WiredHome 111:efe436c43aba 885 windowrect.p1.x, windowrect.p1.y, windowrect.p2.x, windowrect.p2.y,
WiredHome 111:efe436c43aba 886 charWidth, c);
WiredHome 101:e0aad446094a 887 if (charRecord) {
WiredHome 101:e0aad446094a 888 //cursor_x += advance;
WiredHome 111:efe436c43aba 889 if (cursor_x + charWidth >= windowrect.p2.x) {
WiredHome 111:efe436c43aba 890 cursor_x = windowrect.p1.x;
WiredHome 101:e0aad446094a 891 cursor_y += charHeight;
WiredHome 29:422616aa04bd 892 }
WiredHome 111:efe436c43aba 893 if (cursor_y + charHeight >= windowrect.p2.y) {
WiredHome 111:efe436c43aba 894 cursor_y = windowrect.p1.y; // @todo Should it scroll?
WiredHome 101:e0aad446094a 895 }
WiredHome 101:e0aad446094a 896 (void)character(cursor_x, cursor_y, c);
WiredHome 101:e0aad446094a 897 cursor_x += charWidth;
WiredHome 29:422616aa04bd 898 }
WiredHome 29:422616aa04bd 899 }
WiredHome 29:422616aa04bd 900 }
WiredHome 29:422616aa04bd 901 return c;
WiredHome 29:422616aa04bd 902 }
WiredHome 29:422616aa04bd 903
WiredHome 44:207594dece70 904
WiredHome 29:422616aa04bd 905 int RA8875::_internal_putc(int c)
WiredHome 29:422616aa04bd 906 {
WiredHome 29:422616aa04bd 907 if (c) {
WiredHome 29:422616aa04bd 908 unsigned char mwcr0;
WiredHome 73:f22a18707b5e 909
WiredHome 29:422616aa04bd 910 mwcr0 = ReadCommand(0x40);
WiredHome 29:422616aa04bd 911 if ((mwcr0 & 0x80) == 0x00) {
WiredHome 29:422616aa04bd 912 WriteCommand(0x40, 0x80 | mwcr0); // Put in Text mode if not already
WiredHome 29:422616aa04bd 913 }
WiredHome 29:422616aa04bd 914 if (c == '\r') {
WiredHome 37:f19b7e7449dc 915 loc_t x;
WiredHome 19:3f82c1161fd2 916 x = ReadCommand(0x30) | (ReadCommand(0x31) << 8); // Left edge of active window
WiredHome 38:38d503b4fad6 917 WriteCommandW(0x2A, x);
WiredHome 19:3f82c1161fd2 918 } else if (c == '\n') {
WiredHome 37:f19b7e7449dc 919 loc_t y;
WiredHome 19:3f82c1161fd2 920 y = ReadCommand(0x2C) | (ReadCommand(0x2D) << 8); // current y location
WiredHome 19:3f82c1161fd2 921 y += fontheight();
WiredHome 47:d96a09269f91 922 if (y >= height()) // @TODO after bottom of active window, then scroll window?
WiredHome 19:3f82c1161fd2 923 y = 0;
WiredHome 38:38d503b4fad6 924 WriteCommandW(0x2C, y);
WiredHome 19:3f82c1161fd2 925 } else {
WiredHome 29:422616aa04bd 926 WriteCommand(0x02); // RA8875 Internal Fonts
WiredHome 79:544eb4964795 927 _select(true);
WiredHome 29:422616aa04bd 928 WriteData(c);
WiredHome 66:468a11f05580 929 _WaitWhileBusy(0x80);
WiredHome 79:544eb4964795 930 _select(false);
WiredHome 19:3f82c1161fd2 931 }
WiredHome 19:3f82c1161fd2 932 }
WiredHome 19:3f82c1161fd2 933 return c;
WiredHome 19:3f82c1161fd2 934 }
WiredHome 19:3f82c1161fd2 935
WiredHome 44:207594dece70 936
WiredHome 32:0e4f2ae512e2 937 RetCode_t RA8875::_StartGraphicsStream(void)
WiredHome 32:0e4f2ae512e2 938 {
WiredHome 32:0e4f2ae512e2 939 WriteCommand(0x40,0x00); // Graphics write mode
WiredHome 32:0e4f2ae512e2 940 WriteCommand(0x02); // Prepare for streaming data
WiredHome 32:0e4f2ae512e2 941 return noerror;
WiredHome 32:0e4f2ae512e2 942 }
WiredHome 32:0e4f2ae512e2 943
WiredHome 44:207594dece70 944
WiredHome 32:0e4f2ae512e2 945 RetCode_t RA8875::_EndGraphicsStream(void)
WiredHome 32:0e4f2ae512e2 946 {
WiredHome 32:0e4f2ae512e2 947 return noerror;
WiredHome 32:0e4f2ae512e2 948 }
WiredHome 32:0e4f2ae512e2 949
WiredHome 44:207594dece70 950
WiredHome 55:dfbabef7003e 951 RetCode_t RA8875::_putp(color_t pixel)
WiredHome 32:0e4f2ae512e2 952 {
WiredHome 38:38d503b4fad6 953 WriteDataW((pixel>>8) | (pixel<<8));
WiredHome 73:f22a18707b5e 954 return noerror;
WiredHome 32:0e4f2ae512e2 955 }
WiredHome 29:422616aa04bd 956
WiredHome 44:207594dece70 957
WiredHome 37:f19b7e7449dc 958 void RA8875::puts(loc_t x, loc_t y, const char * string)
WiredHome 19:3f82c1161fd2 959 {
WiredHome 19:3f82c1161fd2 960 SetTextCursor(x,y);
WiredHome 19:3f82c1161fd2 961 puts(string);
WiredHome 19:3f82c1161fd2 962 }
WiredHome 19:3f82c1161fd2 963
WiredHome 44:207594dece70 964
WiredHome 19:3f82c1161fd2 965 void RA8875::puts(const char * string)
WiredHome 19:3f82c1161fd2 966 {
WiredHome 37:f19b7e7449dc 967 if (font == NULL) {
WiredHome 100:0b084475d5a9 968 WriteCommand(0x40,0x80); // Put in Text mode if internal font
WiredHome 37:f19b7e7449dc 969 }
WiredHome 19:3f82c1161fd2 970 if (*string != '\0') {
WiredHome 29:422616aa04bd 971 while (*string) { // @TODO calling individual _putc is slower... optimizations?
WiredHome 19:3f82c1161fd2 972 _putc(*string++);
WiredHome 19:3f82c1161fd2 973 }
WiredHome 19:3f82c1161fd2 974 }
WiredHome 19:3f82c1161fd2 975 }
WiredHome 19:3f82c1161fd2 976
WiredHome 44:207594dece70 977
WiredHome 37:f19b7e7449dc 978 RetCode_t RA8875::SetGraphicsCursor(loc_t x, loc_t y)
WiredHome 19:3f82c1161fd2 979 {
WiredHome 38:38d503b4fad6 980 WriteCommandW(0x46, x);
WiredHome 38:38d503b4fad6 981 WriteCommandW(0x48, y);
WiredHome 19:3f82c1161fd2 982 return noerror;
WiredHome 19:3f82c1161fd2 983 }
WiredHome 19:3f82c1161fd2 984
WiredHome 44:207594dece70 985
WiredHome 41:2956a0a221e5 986 RetCode_t RA8875::SetGraphicsCursorRead(loc_t x, loc_t y)
WiredHome 41:2956a0a221e5 987 {
WiredHome 41:2956a0a221e5 988 WriteCommandW(0x4A, x);
WiredHome 41:2956a0a221e5 989 WriteCommandW(0x4C, y);
WiredHome 41:2956a0a221e5 990 return noerror;
WiredHome 41:2956a0a221e5 991 }
WiredHome 41:2956a0a221e5 992
WiredHome 111:efe436c43aba 993 RetCode_t RA8875::window(rect_t r)
WiredHome 111:efe436c43aba 994 {
WiredHome 111:efe436c43aba 995 return window(r.p1.x, r.p1.y, r.p2.x + 1 - r.p1.x, r.p2.y + 1 - r.p1.y);
WiredHome 111:efe436c43aba 996 }
WiredHome 44:207594dece70 997
WiredHome 37:f19b7e7449dc 998 RetCode_t RA8875::window(loc_t x, loc_t y, dim_t width, dim_t height)
WiredHome 19:3f82c1161fd2 999 {
WiredHome 111:efe436c43aba 1000 INFO("window(%d,%d,%d,%d)", x, y, width, height);
WiredHome 111:efe436c43aba 1001 if (width == (dim_t)-1)
WiredHome 111:efe436c43aba 1002 width = screenwidth - x;
WiredHome 111:efe436c43aba 1003 if (height == (dim_t)-1)
WiredHome 111:efe436c43aba 1004 height = screenheight - y;
WiredHome 111:efe436c43aba 1005 windowrect.p1.x = x;
WiredHome 111:efe436c43aba 1006 windowrect.p1.y = y;
WiredHome 111:efe436c43aba 1007 windowrect.p2.x = x + width - 1;
WiredHome 111:efe436c43aba 1008 windowrect.p2.y = y + height - 1;
WiredHome 37:f19b7e7449dc 1009 GraphicsDisplay::window(x,y, width,height);
WiredHome 38:38d503b4fad6 1010 WriteCommandW(0x30, x);
WiredHome 38:38d503b4fad6 1011 WriteCommandW(0x32, y);
WiredHome 38:38d503b4fad6 1012 WriteCommandW(0x34, (x+width-1));
WiredHome 38:38d503b4fad6 1013 WriteCommandW(0x36, (y+height-1));
WiredHome 111:efe436c43aba 1014 //SetTextCursor(x,y);
WiredHome 111:efe436c43aba 1015 //SetGraphicsCursor(x,y);
WiredHome 19:3f82c1161fd2 1016 return noerror;
WiredHome 19:3f82c1161fd2 1017 }
WiredHome 19:3f82c1161fd2 1018
WiredHome 44:207594dece70 1019
WiredHome 61:8f3153bf0baa 1020 RetCode_t RA8875::cls(uint16_t layers)
WiredHome 19:3f82c1161fd2 1021 {
WiredHome 61:8f3153bf0baa 1022 RetCode_t ret;
WiredHome 73:f22a18707b5e 1023
WiredHome 19:3f82c1161fd2 1024 PERFORMANCE_RESET;
WiredHome 61:8f3153bf0baa 1025 if (layers == 0) {
WiredHome 61:8f3153bf0baa 1026 ret = clsw(FULLWINDOW);
WiredHome 61:8f3153bf0baa 1027 ret = SetTextCursor(0,0);
WiredHome 61:8f3153bf0baa 1028 } else if (layers > 3) {
WiredHome 61:8f3153bf0baa 1029 ret = bad_parameter;
WiredHome 61:8f3153bf0baa 1030 } else {
WiredHome 61:8f3153bf0baa 1031 uint16_t prevLayer = GetDrawingLayer();
WiredHome 61:8f3153bf0baa 1032 if (layers & 1) {
WiredHome 61:8f3153bf0baa 1033 SelectDrawingLayer(0);
WiredHome 61:8f3153bf0baa 1034 clsw(FULLWINDOW);
WiredHome 61:8f3153bf0baa 1035 }
WiredHome 61:8f3153bf0baa 1036 if (layers & 2) {
WiredHome 61:8f3153bf0baa 1037 SelectDrawingLayer(1);
WiredHome 61:8f3153bf0baa 1038 clsw(FULLWINDOW);
WiredHome 61:8f3153bf0baa 1039 }
WiredHome 61:8f3153bf0baa 1040 ret = SelectDrawingLayer(prevLayer);
WiredHome 61:8f3153bf0baa 1041 }
WiredHome 19:3f82c1161fd2 1042 REGISTERPERFORMANCE(PRF_CLS);
WiredHome 61:8f3153bf0baa 1043 return ret;
WiredHome 19:3f82c1161fd2 1044 }
WiredHome 19:3f82c1161fd2 1045
WiredHome 44:207594dece70 1046
WiredHome 19:3f82c1161fd2 1047 RetCode_t RA8875::clsw(RA8875::Region_t region)
WiredHome 19:3f82c1161fd2 1048 {
WiredHome 19:3f82c1161fd2 1049 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 1050 WriteCommand(0x8E, (region == ACTIVEWINDOW) ? 0xC0 : 0x80);
WiredHome 66:468a11f05580 1051 _WaitWhileReg(0x8E, 0x80);
WiredHome 19:3f82c1161fd2 1052 REGISTERPERFORMANCE(PRF_CLS);
WiredHome 19:3f82c1161fd2 1053 return noerror;
WiredHome 19:3f82c1161fd2 1054 }
WiredHome 19:3f82c1161fd2 1055
WiredHome 44:207594dece70 1056
WiredHome 87:ee2240581aa7 1057 RetCode_t RA8875::pixel(point_t p, color_t color)
WiredHome 87:ee2240581aa7 1058 {
WiredHome 87:ee2240581aa7 1059 return pixel(p.x, p.y, color);
WiredHome 87:ee2240581aa7 1060 }
WiredHome 87:ee2240581aa7 1061
WiredHome 87:ee2240581aa7 1062 RetCode_t RA8875::pixel(point_t p)
WiredHome 87:ee2240581aa7 1063 {
WiredHome 87:ee2240581aa7 1064 return pixel(p.x, p.y);
WiredHome 87:ee2240581aa7 1065 }
WiredHome 87:ee2240581aa7 1066
WiredHome 37:f19b7e7449dc 1067 RetCode_t RA8875::pixel(loc_t x, loc_t y, color_t color)
WiredHome 19:3f82c1161fd2 1068 {
WiredHome 62:ba5d33438fda 1069 RetCode_t ret;
WiredHome 73:f22a18707b5e 1070
WiredHome 62:ba5d33438fda 1071 PERFORMANCE_RESET;
WiredHome 62:ba5d33438fda 1072 ret = pixelStream(&color, 1, x,y);
WiredHome 62:ba5d33438fda 1073 REGISTERPERFORMANCE(PRF_DRAWPIXEL);
WiredHome 62:ba5d33438fda 1074 return ret;
WiredHome 19:3f82c1161fd2 1075 }
WiredHome 19:3f82c1161fd2 1076
WiredHome 44:207594dece70 1077
WiredHome 37:f19b7e7449dc 1078 RetCode_t RA8875::pixel(loc_t x, loc_t y)
WiredHome 19:3f82c1161fd2 1079 {
WiredHome 19:3f82c1161fd2 1080 RetCode_t ret;
WiredHome 73:f22a18707b5e 1081
WiredHome 19:3f82c1161fd2 1082 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 1083 color_t color = GetForeColor();
WiredHome 62:ba5d33438fda 1084 ret = pixelStream(&color, 1, x, y);
WiredHome 41:2956a0a221e5 1085 REGISTERPERFORMANCE(PRF_DRAWPIXEL);
WiredHome 19:3f82c1161fd2 1086 return ret;
WiredHome 19:3f82c1161fd2 1087 }
WiredHome 19:3f82c1161fd2 1088
WiredHome 44:207594dece70 1089
WiredHome 41:2956a0a221e5 1090 RetCode_t RA8875::pixelStream(color_t * p, uint32_t count, loc_t x, loc_t y)
WiredHome 41:2956a0a221e5 1091 {
WiredHome 41:2956a0a221e5 1092 PERFORMANCE_RESET;
WiredHome 41:2956a0a221e5 1093 SetGraphicsCursor(x, y);
WiredHome 109:7b94f06f085b 1094 _StartGraphicsStream();
WiredHome 79:544eb4964795 1095 _select(true);
WiredHome 79:544eb4964795 1096 _spiwrite(0x00); // Cmd: write data
WiredHome 41:2956a0a221e5 1097 while (count--) {
WiredHome 105:4f116006ba1f 1098 if (screenbpp == 16) {
WiredHome 105:4f116006ba1f 1099 _spiwrite(*p >> 8);
WiredHome 105:4f116006ba1f 1100 _spiwrite(*p & 0xFF);
WiredHome 105:4f116006ba1f 1101 } else {
WiredHome 105:4f116006ba1f 1102 _spiwrite(_cvt16to8(*p));
WiredHome 105:4f116006ba1f 1103 }
WiredHome 41:2956a0a221e5 1104 p++;
WiredHome 41:2956a0a221e5 1105 }
WiredHome 79:544eb4964795 1106 _select(false);
WiredHome 109:7b94f06f085b 1107 _EndGraphicsStream();
WiredHome 41:2956a0a221e5 1108 REGISTERPERFORMANCE(PRF_PIXELSTREAM);
WiredHome 41:2956a0a221e5 1109 return(noerror);
WiredHome 41:2956a0a221e5 1110 }
WiredHome 41:2956a0a221e5 1111
WiredHome 109:7b94f06f085b 1112 RetCode_t RA8875::booleanStream(loc_t x, loc_t y, dim_t w, dim_t h, const uint8_t * boolStream)
WiredHome 109:7b94f06f085b 1113 {
WiredHome 109:7b94f06f085b 1114 PERFORMANCE_RESET;
WiredHome 111:efe436c43aba 1115 rect_t restore = windowrect;
WiredHome 111:efe436c43aba 1116
WiredHome 109:7b94f06f085b 1117 window(x, y, w, h);
WiredHome 109:7b94f06f085b 1118 SetGraphicsCursor(x, y);
WiredHome 109:7b94f06f085b 1119 _StartGraphicsStream();
WiredHome 109:7b94f06f085b 1120 _select(true);
WiredHome 109:7b94f06f085b 1121 _spiwrite(0x00); // Cmd: write data
WiredHome 109:7b94f06f085b 1122 while (h--) {
WiredHome 109:7b94f06f085b 1123 uint8_t pixels = w;
WiredHome 109:7b94f06f085b 1124 uint8_t bitmask = 0x01;
WiredHome 109:7b94f06f085b 1125
WiredHome 109:7b94f06f085b 1126 while (pixels) {
WiredHome 109:7b94f06f085b 1127 uint8_t byte = *boolStream;
WiredHome 111:efe436c43aba 1128 //INFO("byte, mask: %02X, %02X", byte, bitmask);
WiredHome 109:7b94f06f085b 1129 color_t c = (byte & bitmask) ? _foreground : _background;
WiredHome 109:7b94f06f085b 1130 if (screenbpp == 16) {
WiredHome 109:7b94f06f085b 1131 _spiwrite(c >> 8);
WiredHome 109:7b94f06f085b 1132 _spiwrite(c & 0xFF);
WiredHome 109:7b94f06f085b 1133 } else {
WiredHome 109:7b94f06f085b 1134 _spiwrite(_cvt16to8(c));
WiredHome 109:7b94f06f085b 1135 }
WiredHome 109:7b94f06f085b 1136 bitmask <<= 1;
WiredHome 109:7b94f06f085b 1137 if (pixels > 1 && bitmask == 0) {
WiredHome 109:7b94f06f085b 1138 bitmask = 0x01;
WiredHome 109:7b94f06f085b 1139 boolStream++;
WiredHome 109:7b94f06f085b 1140 }
WiredHome 109:7b94f06f085b 1141 pixels--;
WiredHome 109:7b94f06f085b 1142 }
WiredHome 109:7b94f06f085b 1143 boolStream++;
WiredHome 109:7b94f06f085b 1144 }
WiredHome 109:7b94f06f085b 1145 _select(false);
WiredHome 109:7b94f06f085b 1146 _EndGraphicsStream();
WiredHome 111:efe436c43aba 1147 window(restore);
WiredHome 109:7b94f06f085b 1148 REGISTERPERFORMANCE(PRF_BOOLSTREAM);
WiredHome 109:7b94f06f085b 1149 return(noerror);
WiredHome 109:7b94f06f085b 1150 }
WiredHome 44:207594dece70 1151
WiredHome 41:2956a0a221e5 1152 color_t RA8875::getPixel(loc_t x, loc_t y)
WiredHome 41:2956a0a221e5 1153 {
WiredHome 41:2956a0a221e5 1154 color_t pixel;
WiredHome 73:f22a18707b5e 1155
WiredHome 41:2956a0a221e5 1156 PERFORMANCE_RESET;
WiredHome 41:2956a0a221e5 1157 //WriteCommand(0x45,0x00); // read left->right, top->bottom
WiredHome 41:2956a0a221e5 1158 WriteCommand(0x40,0x00); // Graphics write mode
WiredHome 41:2956a0a221e5 1159 SetGraphicsCursorRead(x, y);
WiredHome 41:2956a0a221e5 1160 WriteCommand(0x02);
WiredHome 79:544eb4964795 1161 _select(true);
WiredHome 79:544eb4964795 1162 _spiwrite(0x40); // Cmd: read data
WiredHome 79:544eb4964795 1163 _spiwrite(0x00); // dummy read
WiredHome 105:4f116006ba1f 1164 if (screenbpp == 16) {
WiredHome 105:4f116006ba1f 1165 pixel = _spiread();
WiredHome 105:4f116006ba1f 1166 pixel |= (_spiread() << 8);
WiredHome 105:4f116006ba1f 1167 } else {
WiredHome 105:4f116006ba1f 1168 pixel = _cvt8to16(_spiread());
WiredHome 105:4f116006ba1f 1169 }
WiredHome 79:544eb4964795 1170 _select(false);
WiredHome 41:2956a0a221e5 1171 REGISTERPERFORMANCE(PRF_READPIXEL);
WiredHome 41:2956a0a221e5 1172 return pixel;
WiredHome 41:2956a0a221e5 1173 }
WiredHome 41:2956a0a221e5 1174
WiredHome 44:207594dece70 1175
WiredHome 41:2956a0a221e5 1176 RetCode_t RA8875::getPixelStream(color_t * p, uint32_t count, loc_t x, loc_t y)
WiredHome 41:2956a0a221e5 1177 {
WiredHome 41:2956a0a221e5 1178 color_t pixel;
WiredHome 86:e86b355940f4 1179 RetCode_t ret = noerror;
WiredHome 73:f22a18707b5e 1180
WiredHome 41:2956a0a221e5 1181 PERFORMANCE_RESET;
WiredHome 86:e86b355940f4 1182 ret = WriteCommand(0x40,0x00); // Graphics write mode
WiredHome 86:e86b355940f4 1183 ret = SetGraphicsCursorRead(x, y);
WiredHome 86:e86b355940f4 1184 ret = WriteCommand(0x02);
WiredHome 79:544eb4964795 1185 _select(true);
WiredHome 79:544eb4964795 1186 _spiwrite(0x40); // Cmd: read data
WiredHome 79:544eb4964795 1187 _spiwrite(0x00); // dummy read
WiredHome 106:c80828f5dea4 1188 if (screenbpp == 16)
WiredHome 106:c80828f5dea4 1189 _spiwrite(0x00); // dummy read is only necessary when in 16-bit mode
WiredHome 41:2956a0a221e5 1190 while (count--) {
WiredHome 105:4f116006ba1f 1191 if (screenbpp == 16) {
WiredHome 105:4f116006ba1f 1192 pixel = _spiread();
WiredHome 105:4f116006ba1f 1193 pixel |= (_spiread() << 8);
WiredHome 105:4f116006ba1f 1194 } else {
WiredHome 105:4f116006ba1f 1195 pixel = _cvt8to16(_spiread());
WiredHome 105:4f116006ba1f 1196 }
WiredHome 41:2956a0a221e5 1197 *p++ = pixel;
WiredHome 41:2956a0a221e5 1198 }
WiredHome 79:544eb4964795 1199 _select(false);
WiredHome 41:2956a0a221e5 1200 REGISTERPERFORMANCE(PRF_READPIXELSTREAM);
WiredHome 86:e86b355940f4 1201 return ret;
WiredHome 41:2956a0a221e5 1202 }
WiredHome 41:2956a0a221e5 1203
WiredHome 44:207594dece70 1204
WiredHome 83:7bad0068cca0 1205 RetCode_t RA8875::line(point_t p1, point_t p2)
WiredHome 83:7bad0068cca0 1206 {
WiredHome 83:7bad0068cca0 1207 return line(p1.x, p1.y, p2.x, p2.y);
WiredHome 83:7bad0068cca0 1208 }
WiredHome 83:7bad0068cca0 1209
WiredHome 83:7bad0068cca0 1210
WiredHome 83:7bad0068cca0 1211 RetCode_t RA8875::line(point_t p1, point_t p2, color_t color)
WiredHome 83:7bad0068cca0 1212 {
WiredHome 83:7bad0068cca0 1213 return line(p1.x, p1.y, p2.x, p2.y, color);
WiredHome 83:7bad0068cca0 1214 }
WiredHome 83:7bad0068cca0 1215
WiredHome 83:7bad0068cca0 1216
WiredHome 37:f19b7e7449dc 1217 RetCode_t RA8875::line(loc_t x1, loc_t y1, loc_t x2, loc_t y2, color_t color)
WiredHome 19:3f82c1161fd2 1218 {
WiredHome 19:3f82c1161fd2 1219 foreground(color);
WiredHome 19:3f82c1161fd2 1220 return line(x1,y1,x2,y2);
WiredHome 19:3f82c1161fd2 1221 }
WiredHome 19:3f82c1161fd2 1222
WiredHome 44:207594dece70 1223
WiredHome 37:f19b7e7449dc 1224 RetCode_t RA8875::line(loc_t x1, loc_t y1, loc_t x2, loc_t y2)
WiredHome 19:3f82c1161fd2 1225 {
WiredHome 19:3f82c1161fd2 1226 PERFORMANCE_RESET;
WiredHome 62:ba5d33438fda 1227 if (x1 == x2 && y1 == y2) {
WiredHome 60:2dfd574f63bd 1228 pixel(x1, y1);
WiredHome 62:ba5d33438fda 1229 } else {
WiredHome 60:2dfd574f63bd 1230 WriteCommandW(0x91, x1);
WiredHome 60:2dfd574f63bd 1231 WriteCommandW(0x93, y1);
WiredHome 60:2dfd574f63bd 1232 WriteCommandW(0x95, x2);
WiredHome 60:2dfd574f63bd 1233 WriteCommandW(0x97, y2);
WiredHome 60:2dfd574f63bd 1234 unsigned char drawCmd = 0x00; // Line
WiredHome 60:2dfd574f63bd 1235 WriteCommand(0x90, drawCmd);
WiredHome 60:2dfd574f63bd 1236 WriteCommand(0x90, 0x80 + drawCmd); // Start drawing.
WiredHome 66:468a11f05580 1237 _WaitWhileReg(0x90, 0x80);
WiredHome 60:2dfd574f63bd 1238 }
WiredHome 19:3f82c1161fd2 1239 REGISTERPERFORMANCE(PRF_DRAWLINE);
WiredHome 19:3f82c1161fd2 1240 return noerror;
WiredHome 19:3f82c1161fd2 1241 }
WiredHome 19:3f82c1161fd2 1242
WiredHome 107:f9ccffcb84f1 1243 //
WiredHome 107:f9ccffcb84f1 1244 // Rectangle functions all mostly helpers to the basic rectangle function
WiredHome 107:f9ccffcb84f1 1245 //
WiredHome 107:f9ccffcb84f1 1246
WiredHome 81:01da2e34283d 1247 RetCode_t RA8875::fillrect(rect_t r, color_t color, fill_t fillit)
WiredHome 81:01da2e34283d 1248 {
WiredHome 81:01da2e34283d 1249 return rect(r.p1.x, r.p1.y, r.p2.x, r.p2.y, color, fillit);
WiredHome 81:01da2e34283d 1250 }
WiredHome 44:207594dece70 1251
WiredHome 73:f22a18707b5e 1252 RetCode_t RA8875::fillrect(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1253 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1254 {
WiredHome 19:3f82c1161fd2 1255 return rect(x1,y1,x2,y2,color,fillit);
WiredHome 19:3f82c1161fd2 1256 }
WiredHome 19:3f82c1161fd2 1257
WiredHome 81:01da2e34283d 1258 RetCode_t RA8875::rect(rect_t r, color_t color, fill_t fillit)
WiredHome 81:01da2e34283d 1259 {
WiredHome 81:01da2e34283d 1260 return rect(r.p1.x, r.p1.y, r.p2.x, r.p2.y, color, fillit);
WiredHome 81:01da2e34283d 1261 }
WiredHome 44:207594dece70 1262
WiredHome 73:f22a18707b5e 1263 RetCode_t RA8875::rect(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1264 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1265 {
WiredHome 19:3f82c1161fd2 1266 foreground(color);
WiredHome 19:3f82c1161fd2 1267 return rect(x1,y1,x2,y2,fillit);
WiredHome 19:3f82c1161fd2 1268 }
WiredHome 19:3f82c1161fd2 1269
WiredHome 73:f22a18707b5e 1270 RetCode_t RA8875::rect(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1271 fill_t fillit)
WiredHome 19:3f82c1161fd2 1272 {
WiredHome 85:022bba13c5c4 1273 RetCode_t ret = noerror;
WiredHome 19:3f82c1161fd2 1274 PERFORMANCE_RESET;
WiredHome 85:022bba13c5c4 1275 // check for bad_parameter
WiredHome 105:4f116006ba1f 1276 if (x1 < 0 || x1 >= screenwidth || x2 < 0 || x2 >= screenwidth
WiredHome 105:4f116006ba1f 1277 || y1 < 0 || y1 >= screenheight || y2 < 0 || y2 >= screenheight) {
WiredHome 85:022bba13c5c4 1278 ret = bad_parameter;
WiredHome 100:0b084475d5a9 1279 } else {
WiredHome 85:022bba13c5c4 1280 if (x1 == x2 && y1 == y2) {
WiredHome 85:022bba13c5c4 1281 pixel(x1, y1);
WiredHome 85:022bba13c5c4 1282 } else if (x1 == x2) {
WiredHome 85:022bba13c5c4 1283 line(x1, y1, x2, y2);
WiredHome 85:022bba13c5c4 1284 } else if (y1 == y2) {
WiredHome 85:022bba13c5c4 1285 line(x1, y1, x2, y2);
WiredHome 85:022bba13c5c4 1286 } else {
WiredHome 85:022bba13c5c4 1287 WriteCommandW(0x91, x1);
WiredHome 85:022bba13c5c4 1288 WriteCommandW(0x93, y1);
WiredHome 85:022bba13c5c4 1289 WriteCommandW(0x95, x2);
WiredHome 85:022bba13c5c4 1290 WriteCommandW(0x97, y2);
WiredHome 85:022bba13c5c4 1291 unsigned char drawCmd = 0x10; // Rectangle
WiredHome 85:022bba13c5c4 1292 if (fillit == FILL)
WiredHome 85:022bba13c5c4 1293 drawCmd |= 0x20;
WiredHome 85:022bba13c5c4 1294 WriteCommand(0x90, drawCmd);
WiredHome 85:022bba13c5c4 1295 ret = WriteCommand(0x90, 0x80 + drawCmd); // Start drawing.
WiredHome 85:022bba13c5c4 1296 _WaitWhileReg(0x90, 0x80);
WiredHome 85:022bba13c5c4 1297 }
WiredHome 19:3f82c1161fd2 1298 }
WiredHome 19:3f82c1161fd2 1299 REGISTERPERFORMANCE(PRF_DRAWRECTANGLE);
WiredHome 85:022bba13c5c4 1300 return ret;
WiredHome 19:3f82c1161fd2 1301 }
WiredHome 19:3f82c1161fd2 1302
WiredHome 44:207594dece70 1303
WiredHome 107:f9ccffcb84f1 1304 //
WiredHome 107:f9ccffcb84f1 1305 // rounded rectangle functions are mostly helpers to the base round rect
WiredHome 107:f9ccffcb84f1 1306 //
WiredHome 107:f9ccffcb84f1 1307
WiredHome 107:f9ccffcb84f1 1308 RetCode_t RA8875::fillroundrect(rect_t r, dim_t radius1, dim_t radius2, color_t color, fill_t fillit)
WiredHome 107:f9ccffcb84f1 1309 {
WiredHome 107:f9ccffcb84f1 1310 return roundrect(r.p1.x, r.p1.y, r.p2.x, r.p2.y, radius1, radius2, color, fillit);
WiredHome 107:f9ccffcb84f1 1311 }
WiredHome 107:f9ccffcb84f1 1312
WiredHome 73:f22a18707b5e 1313 RetCode_t RA8875::fillroundrect(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1314 dim_t radius1, dim_t radius2, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1315 {
WiredHome 19:3f82c1161fd2 1316 foreground(color);
WiredHome 19:3f82c1161fd2 1317 return roundrect(x1,y1,x2,y2,radius1,radius2,fillit);
WiredHome 19:3f82c1161fd2 1318 }
WiredHome 19:3f82c1161fd2 1319
WiredHome 107:f9ccffcb84f1 1320 RetCode_t RA8875::roundrect(rect_t r, dim_t radius1, dim_t radius2, color_t color, fill_t fillit)
WiredHome 107:f9ccffcb84f1 1321 {
WiredHome 107:f9ccffcb84f1 1322 return roundrect(r.p1.x, r.p1.y, r.p2.x, r.p2.y, radius1, radius2, color, fillit);
WiredHome 107:f9ccffcb84f1 1323 }
WiredHome 44:207594dece70 1324
WiredHome 73:f22a18707b5e 1325 RetCode_t RA8875::roundrect(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1326 dim_t radius1, dim_t radius2, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1327 {
WiredHome 19:3f82c1161fd2 1328 foreground(color);
WiredHome 19:3f82c1161fd2 1329 return roundrect(x1,y1,x2,y2,radius1,radius2,fillit);
WiredHome 19:3f82c1161fd2 1330 }
WiredHome 19:3f82c1161fd2 1331
WiredHome 44:207594dece70 1332
WiredHome 73:f22a18707b5e 1333 RetCode_t RA8875::roundrect(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1334 dim_t radius1, dim_t radius2, fill_t fillit)
WiredHome 19:3f82c1161fd2 1335 {
WiredHome 19:3f82c1161fd2 1336 RetCode_t ret = noerror;
WiredHome 73:f22a18707b5e 1337
WiredHome 19:3f82c1161fd2 1338 PERFORMANCE_RESET;
WiredHome 105:4f116006ba1f 1339 if (x1 < 0 || x1 >= screenwidth || x2 < 0 || x2 >= screenwidth
WiredHome 105:4f116006ba1f 1340 || y1 < 0 || y1 >= screenheight || y2 < 0 || y2 >= screenheight) {
WiredHome 85:022bba13c5c4 1341 ret = bad_parameter;
WiredHome 85:022bba13c5c4 1342 } else if (x1 > x2 || y1 > y2 || (radius1 > (x2-x1)/2) || (radius2 > (y2-y1)/2) ) {
WiredHome 21:3c1efb192927 1343 ret = bad_parameter;
WiredHome 21:3c1efb192927 1344 } else if (x1 == x2 && y1 == y2) {
WiredHome 19:3f82c1161fd2 1345 pixel(x1, y1);
WiredHome 19:3f82c1161fd2 1346 } else if (x1 == x2) {
WiredHome 19:3f82c1161fd2 1347 line(x1, y1, x2, y2);
WiredHome 19:3f82c1161fd2 1348 } else if (y1 == y2) {
WiredHome 19:3f82c1161fd2 1349 line(x1, y1, x2, y2);
WiredHome 19:3f82c1161fd2 1350 } else {
WiredHome 38:38d503b4fad6 1351 WriteCommandW(0x91, x1);
WiredHome 38:38d503b4fad6 1352 WriteCommandW(0x93, y1);
WiredHome 38:38d503b4fad6 1353 WriteCommandW(0x95, x2);
WiredHome 38:38d503b4fad6 1354 WriteCommandW(0x97, y2);
WiredHome 38:38d503b4fad6 1355 WriteCommandW(0xA1, radius1);
WiredHome 38:38d503b4fad6 1356 WriteCommandW(0xA3, radius2);
WiredHome 21:3c1efb192927 1357 // Should not need this...
WiredHome 38:38d503b4fad6 1358 WriteCommandW(0xA5, 0);
WiredHome 38:38d503b4fad6 1359 WriteCommandW(0xA7, 0);
WiredHome 19:3f82c1161fd2 1360 unsigned char drawCmd = 0x20; // Rounded Rectangle
WiredHome 19:3f82c1161fd2 1361 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 1362 drawCmd |= 0x40;
WiredHome 19:3f82c1161fd2 1363 WriteCommand(0xA0, drawCmd);
WiredHome 19:3f82c1161fd2 1364 WriteCommand(0xA0, 0x80 + drawCmd); // Start drawing.
WiredHome 66:468a11f05580 1365 _WaitWhileReg(0xA0, 0x80);
WiredHome 19:3f82c1161fd2 1366 }
WiredHome 19:3f82c1161fd2 1367 REGISTERPERFORMANCE(PRF_DRAWROUNDEDRECTANGLE);
WiredHome 19:3f82c1161fd2 1368 return ret;
WiredHome 19:3f82c1161fd2 1369 }
WiredHome 19:3f82c1161fd2 1370
WiredHome 44:207594dece70 1371
WiredHome 107:f9ccffcb84f1 1372 //
WiredHome 107:f9ccffcb84f1 1373 // triangle functions
WiredHome 107:f9ccffcb84f1 1374 //
WiredHome 107:f9ccffcb84f1 1375
WiredHome 73:f22a18707b5e 1376 RetCode_t RA8875::triangle(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1377 loc_t x3, loc_t y3, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1378 {
WiredHome 20:6e2e4a8372eb 1379 RetCode_t ret;
WiredHome 20:6e2e4a8372eb 1380
WiredHome 105:4f116006ba1f 1381 if (x1 < 0 || x1 >= screenwidth || x2 < 0 || x2 >= screenwidth || x3 < 0 || x3 >= screenwidth
WiredHome 105:4f116006ba1f 1382 || y1 < 0 || y1 >= screenheight || y2 < 0 || y2 >= screenheight || y3 < 0 || y3 >= screenheight)
WiredHome 85:022bba13c5c4 1383 ret = bad_parameter;
WiredHome 19:3f82c1161fd2 1384 foreground(color);
WiredHome 20:6e2e4a8372eb 1385 ret = triangle(x1,y1,x2,y2,x3,y3,fillit);
WiredHome 20:6e2e4a8372eb 1386 return ret;
WiredHome 19:3f82c1161fd2 1387 }
WiredHome 19:3f82c1161fd2 1388
WiredHome 44:207594dece70 1389
WiredHome 73:f22a18707b5e 1390 RetCode_t RA8875::filltriangle(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1391 loc_t x3, loc_t y3, color_t color, fill_t fillit)
WiredHome 73:f22a18707b5e 1392 {
WiredHome 73:f22a18707b5e 1393 RetCode_t ret;
WiredHome 73:f22a18707b5e 1394
WiredHome 73:f22a18707b5e 1395 foreground(color);
WiredHome 73:f22a18707b5e 1396 ret = triangle(x1,y1,x2,y2,x3,y3,fillit);
WiredHome 73:f22a18707b5e 1397 return ret;
WiredHome 73:f22a18707b5e 1398 }
WiredHome 73:f22a18707b5e 1399
WiredHome 73:f22a18707b5e 1400
WiredHome 73:f22a18707b5e 1401 RetCode_t RA8875::triangle(loc_t x1, loc_t y1 ,loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1402 loc_t x3, loc_t y3, fill_t fillit)
WiredHome 19:3f82c1161fd2 1403 {
WiredHome 19:3f82c1161fd2 1404 RetCode_t ret = noerror;
WiredHome 73:f22a18707b5e 1405
WiredHome 19:3f82c1161fd2 1406 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 1407 if (x1 == x2 && y1 == y2 && x1 == x3 && y1 == y3) {
WiredHome 19:3f82c1161fd2 1408 pixel(x1, y1);
WiredHome 19:3f82c1161fd2 1409 } else {
WiredHome 38:38d503b4fad6 1410 WriteCommandW(0x91, x1);
WiredHome 38:38d503b4fad6 1411 WriteCommandW(0x93, y1);
WiredHome 38:38d503b4fad6 1412 WriteCommandW(0x95, x2);
WiredHome 38:38d503b4fad6 1413 WriteCommandW(0x97, y2);
WiredHome 38:38d503b4fad6 1414 WriteCommandW(0xA9, x3);
WiredHome 38:38d503b4fad6 1415 WriteCommandW(0xAB, y3);
WiredHome 19:3f82c1161fd2 1416 unsigned char drawCmd = 0x01; // Triangle
WiredHome 19:3f82c1161fd2 1417 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 1418 drawCmd |= 0x20;
WiredHome 19:3f82c1161fd2 1419 WriteCommand(0x90, drawCmd);
WiredHome 19:3f82c1161fd2 1420 WriteCommand(0x90, 0x80 + drawCmd); // Start drawing.
WiredHome 66:468a11f05580 1421 _WaitWhileReg(0x90, 0x80);
WiredHome 19:3f82c1161fd2 1422 }
WiredHome 19:3f82c1161fd2 1423 REGISTERPERFORMANCE(PRF_DRAWTRIANGLE);
WiredHome 19:3f82c1161fd2 1424 return ret;
WiredHome 19:3f82c1161fd2 1425 }
WiredHome 19:3f82c1161fd2 1426
WiredHome 83:7bad0068cca0 1427
WiredHome 83:7bad0068cca0 1428 RetCode_t RA8875::circle(point_t p, dim_t radius,
WiredHome 83:7bad0068cca0 1429 color_t color, fill_t fillit)
WiredHome 83:7bad0068cca0 1430 {
WiredHome 83:7bad0068cca0 1431 foreground(color);
WiredHome 83:7bad0068cca0 1432 return circle(p.x,p.y,radius,fillit);
WiredHome 83:7bad0068cca0 1433 }
WiredHome 83:7bad0068cca0 1434
WiredHome 83:7bad0068cca0 1435
WiredHome 83:7bad0068cca0 1436 RetCode_t RA8875::fillcircle(point_t p, dim_t radius,
WiredHome 83:7bad0068cca0 1437 color_t color, fill_t fillit)
WiredHome 83:7bad0068cca0 1438 {
WiredHome 83:7bad0068cca0 1439 foreground(color);
WiredHome 83:7bad0068cca0 1440 return circle(p.x,p.y,radius,fillit);
WiredHome 83:7bad0068cca0 1441 }
WiredHome 83:7bad0068cca0 1442
WiredHome 83:7bad0068cca0 1443
WiredHome 83:7bad0068cca0 1444 RetCode_t RA8875::circle(point_t p, dim_t radius, fill_t fillit)
WiredHome 83:7bad0068cca0 1445 {
WiredHome 83:7bad0068cca0 1446 return circle(p.x,p.y,radius,fillit);
WiredHome 83:7bad0068cca0 1447 }
WiredHome 83:7bad0068cca0 1448
WiredHome 83:7bad0068cca0 1449
WiredHome 73:f22a18707b5e 1450 RetCode_t RA8875::circle(loc_t x, loc_t y, dim_t radius,
WiredHome 73:f22a18707b5e 1451 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1452 {
WiredHome 19:3f82c1161fd2 1453 foreground(color);
WiredHome 19:3f82c1161fd2 1454 return circle(x,y,radius,fillit);
WiredHome 19:3f82c1161fd2 1455 }
WiredHome 19:3f82c1161fd2 1456
WiredHome 44:207594dece70 1457
WiredHome 73:f22a18707b5e 1458 RetCode_t RA8875::fillcircle(loc_t x, loc_t y, dim_t radius,
WiredHome 73:f22a18707b5e 1459 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1460 {
WiredHome 19:3f82c1161fd2 1461 foreground(color);
WiredHome 19:3f82c1161fd2 1462 return circle(x,y,radius,fillit);
WiredHome 19:3f82c1161fd2 1463 }
WiredHome 19:3f82c1161fd2 1464
WiredHome 44:207594dece70 1465
WiredHome 37:f19b7e7449dc 1466 RetCode_t RA8875::circle(loc_t x, loc_t y, dim_t radius, fill_t fillit)
WiredHome 19:3f82c1161fd2 1467 {
WiredHome 19:3f82c1161fd2 1468 RetCode_t ret = noerror;
WiredHome 73:f22a18707b5e 1469
WiredHome 19:3f82c1161fd2 1470 PERFORMANCE_RESET;
WiredHome 105:4f116006ba1f 1471 if (radius <= 0 || (x - radius) < 0 || (x + radius) > screenwidth
WiredHome 105:4f116006ba1f 1472 || (y - radius) < 0 || (y + radius) > screenheight) {
WiredHome 19:3f82c1161fd2 1473 ret = bad_parameter;
WiredHome 19:3f82c1161fd2 1474 } else if (radius == 1) {
WiredHome 19:3f82c1161fd2 1475 pixel(x,y);
WiredHome 19:3f82c1161fd2 1476 } else {
WiredHome 38:38d503b4fad6 1477 WriteCommandW(0x99, x);
WiredHome 38:38d503b4fad6 1478 WriteCommandW(0x9B, y);
WiredHome 19:3f82c1161fd2 1479 WriteCommand(0x9d, radius & 0xFF);
WiredHome 19:3f82c1161fd2 1480 unsigned char drawCmd = 0x00; // Circle
WiredHome 19:3f82c1161fd2 1481 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 1482 drawCmd |= 0x20;
WiredHome 19:3f82c1161fd2 1483 WriteCommand(0x90, drawCmd);
WiredHome 19:3f82c1161fd2 1484 WriteCommand(0x90, 0x40 + drawCmd); // Start drawing.
WiredHome 66:468a11f05580 1485 _WaitWhileReg(0x90, 0x40);
WiredHome 19:3f82c1161fd2 1486 }
WiredHome 19:3f82c1161fd2 1487 REGISTERPERFORMANCE(PRF_DRAWCIRCLE);
WiredHome 19:3f82c1161fd2 1488 return ret;
WiredHome 19:3f82c1161fd2 1489 }
WiredHome 19:3f82c1161fd2 1490
WiredHome 44:207594dece70 1491
WiredHome 37:f19b7e7449dc 1492 RetCode_t RA8875::ellipse(loc_t x, loc_t y, dim_t radius1, dim_t radius2, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1493 {
WiredHome 19:3f82c1161fd2 1494 foreground(color);
WiredHome 25:9556a3a9b7cc 1495 return ellipse(x,y,radius1,radius2,fillit);
WiredHome 19:3f82c1161fd2 1496 }
WiredHome 19:3f82c1161fd2 1497
WiredHome 44:207594dece70 1498
WiredHome 37:f19b7e7449dc 1499 RetCode_t RA8875::fillellipse(loc_t x, loc_t y, dim_t radius1, dim_t radius2, color_t color, fill_t fillit)
WiredHome 25:9556a3a9b7cc 1500 {
WiredHome 25:9556a3a9b7cc 1501 foreground(color);
WiredHome 25:9556a3a9b7cc 1502 return ellipse(x,y,radius1,radius2,fillit);
WiredHome 25:9556a3a9b7cc 1503 }
WiredHome 44:207594dece70 1504
WiredHome 73:f22a18707b5e 1505
WiredHome 37:f19b7e7449dc 1506 RetCode_t RA8875::ellipse(loc_t x, loc_t y, dim_t radius1, dim_t radius2, fill_t fillit)
WiredHome 19:3f82c1161fd2 1507 {
WiredHome 19:3f82c1161fd2 1508 RetCode_t ret = noerror;
WiredHome 73:f22a18707b5e 1509
WiredHome 19:3f82c1161fd2 1510 PERFORMANCE_RESET;
WiredHome 105:4f116006ba1f 1511 if (radius1 <= 0 || radius2 <= 0 || (x - radius1) < 0 || (x + radius1) > screenwidth
WiredHome 105:4f116006ba1f 1512 || (y - radius2) < 0 || (y + radius2) > screenheight) {
WiredHome 85:022bba13c5c4 1513 ret = bad_parameter;
WiredHome 25:9556a3a9b7cc 1514 } else if (radius1 == 1 && radius2 == 1) {
WiredHome 19:3f82c1161fd2 1515 pixel(x, y);
WiredHome 19:3f82c1161fd2 1516 } else {
WiredHome 38:38d503b4fad6 1517 WriteCommandW(0xA5, x);
WiredHome 38:38d503b4fad6 1518 WriteCommandW(0xA7, y);
WiredHome 38:38d503b4fad6 1519 WriteCommandW(0xA1, radius1);
WiredHome 38:38d503b4fad6 1520 WriteCommandW(0xA3, radius2);
WiredHome 19:3f82c1161fd2 1521 unsigned char drawCmd = 0x00; // Ellipse
WiredHome 19:3f82c1161fd2 1522 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 1523 drawCmd |= 0x40;
WiredHome 19:3f82c1161fd2 1524 WriteCommand(0xA0, drawCmd);
WiredHome 19:3f82c1161fd2 1525 WriteCommand(0xA0, 0x80 + drawCmd); // Start drawing.
WiredHome 66:468a11f05580 1526 _WaitWhileReg(0xA0, 0x80);
WiredHome 19:3f82c1161fd2 1527 }
WiredHome 19:3f82c1161fd2 1528 REGISTERPERFORMANCE(PRF_DRAWELLIPSE);
WiredHome 19:3f82c1161fd2 1529 return ret;
WiredHome 19:3f82c1161fd2 1530 }
WiredHome 19:3f82c1161fd2 1531
WiredHome 44:207594dece70 1532
WiredHome 68:ab08efabfc88 1533 RetCode_t RA8875::frequency(unsigned long Hz, unsigned long Hz2)
WiredHome 19:3f82c1161fd2 1534 {
WiredHome 66:468a11f05580 1535 spiwritefreq = Hz;
WiredHome 68:ab08efabfc88 1536 if (Hz2 != 0)
WiredHome 68:ab08efabfc88 1537 spireadfreq = Hz2;
WiredHome 68:ab08efabfc88 1538 else
WiredHome 68:ab08efabfc88 1539 spireadfreq = Hz/2;
WiredHome 68:ab08efabfc88 1540 _setWriteSpeed(true);
WiredHome 19:3f82c1161fd2 1541 // __ ___
WiredHome 19:3f82c1161fd2 1542 // Clock ___A Rising edge latched
WiredHome 19:3f82c1161fd2 1543 // ___ ____
WiredHome 19:3f82c1161fd2 1544 // Data ___X____
WiredHome 19:3f82c1161fd2 1545 spi.format(8, 3); // 8 bits and clock to data phase 0
WiredHome 19:3f82c1161fd2 1546 return noerror;
WiredHome 19:3f82c1161fd2 1547 }
WiredHome 19:3f82c1161fd2 1548
WiredHome 68:ab08efabfc88 1549 void RA8875::_setWriteSpeed(bool writeSpeed)
WiredHome 68:ab08efabfc88 1550 {
WiredHome 68:ab08efabfc88 1551 if (writeSpeed) {
WiredHome 68:ab08efabfc88 1552 spi.frequency(spiwritefreq);
WiredHome 68:ab08efabfc88 1553 spiWriteSpeed = true;
WiredHome 68:ab08efabfc88 1554 } else {
WiredHome 68:ab08efabfc88 1555 spi.frequency(spireadfreq);
WiredHome 68:ab08efabfc88 1556 spiWriteSpeed = false;
WiredHome 68:ab08efabfc88 1557 }
WiredHome 68:ab08efabfc88 1558 }
WiredHome 44:207594dece70 1559
WiredHome 19:3f82c1161fd2 1560 RetCode_t RA8875::Power(bool on)
WiredHome 19:3f82c1161fd2 1561 {
WiredHome 19:3f82c1161fd2 1562 WriteCommand(0x01, (on) ? 0x80 : 0x00);
WiredHome 19:3f82c1161fd2 1563 return noerror;
WiredHome 19:3f82c1161fd2 1564 }
WiredHome 19:3f82c1161fd2 1565
WiredHome 44:207594dece70 1566
WiredHome 19:3f82c1161fd2 1567 RetCode_t RA8875::Backlight_u8(unsigned char brightness)
WiredHome 19:3f82c1161fd2 1568 {
WiredHome 19:3f82c1161fd2 1569 static bool is_enabled = false;
WiredHome 19:3f82c1161fd2 1570 if (brightness == 0) {
WiredHome 19:3f82c1161fd2 1571 WriteCommand(0x8a); // Disable the PWM
WiredHome 19:3f82c1161fd2 1572 WriteData(0x00);
WiredHome 19:3f82c1161fd2 1573 is_enabled = false;
WiredHome 19:3f82c1161fd2 1574 } else if (!is_enabled) {
WiredHome 19:3f82c1161fd2 1575 WriteCommand(0x8a); // Enable the PWM
WiredHome 19:3f82c1161fd2 1576 WriteData(0x80);
WiredHome 19:3f82c1161fd2 1577 WriteCommand(0x8a); // Not sure why this is needed, but following the pattern
WiredHome 19:3f82c1161fd2 1578 WriteData(0x81); // open PWM (SYS_CLK / 2 as best I can tell)
WiredHome 19:3f82c1161fd2 1579 is_enabled = true;
WiredHome 19:3f82c1161fd2 1580 }
WiredHome 19:3f82c1161fd2 1581 WriteCommand(0x8b, brightness); // Brightness parameter 0xff-0x00
WiredHome 19:3f82c1161fd2 1582 return noerror;
WiredHome 19:3f82c1161fd2 1583 }
WiredHome 19:3f82c1161fd2 1584
WiredHome 86:e86b355940f4 1585 uint8_t RA8875::GetBacklight_u8(void)
WiredHome 86:e86b355940f4 1586 {
WiredHome 86:e86b355940f4 1587 return ReadCommand(0x8b);
WiredHome 86:e86b355940f4 1588 }
WiredHome 44:207594dece70 1589
WiredHome 19:3f82c1161fd2 1590 RetCode_t RA8875::Backlight(float brightness)
WiredHome 19:3f82c1161fd2 1591 {
WiredHome 19:3f82c1161fd2 1592 unsigned char b;
WiredHome 73:f22a18707b5e 1593
WiredHome 29:422616aa04bd 1594 if (brightness >= 1.0)
WiredHome 19:3f82c1161fd2 1595 b = 255;
WiredHome 29:422616aa04bd 1596 else if (brightness <= 0.0)
WiredHome 19:3f82c1161fd2 1597 b = 0;
WiredHome 19:3f82c1161fd2 1598 else
WiredHome 19:3f82c1161fd2 1599 b = (unsigned char)(brightness * 255);
WiredHome 19:3f82c1161fd2 1600 return Backlight_u8(b);
WiredHome 19:3f82c1161fd2 1601 }
WiredHome 19:3f82c1161fd2 1602
WiredHome 86:e86b355940f4 1603 float RA8875::GetBacklight(void)
WiredHome 86:e86b355940f4 1604 {
WiredHome 86:e86b355940f4 1605 return (float)(GetBacklight_u8())/255;
WiredHome 86:e86b355940f4 1606 }
WiredHome 44:207594dece70 1607
WiredHome 98:ecebed9b80b2 1608 RetCode_t RA8875::SelectUserFont(const uint8_t * _font)
WiredHome 98:ecebed9b80b2 1609 {
WiredHome 98:ecebed9b80b2 1610 INFO("Cursor(%d,%d) %p", cursor_x, cursor_y, _font);
WiredHome 98:ecebed9b80b2 1611 INFO("Text C(%d,%d)", GetTextCursor_X(), GetTextCursor_Y());
WiredHome 98:ecebed9b80b2 1612 if (_font) {
WiredHome 98:ecebed9b80b2 1613 HexDump("Font Memory", _font, 16);
WiredHome 98:ecebed9b80b2 1614 extFontHeight = _font[6];
WiredHome 98:ecebed9b80b2 1615 uint32_t totalWidth = 0;
WiredHome 98:ecebed9b80b2 1616 uint16_t firstChar = _font[3] * 256 + _font[2];
WiredHome 98:ecebed9b80b2 1617 uint16_t lastChar = _font[5] * 256 + _font[4];
WiredHome 98:ecebed9b80b2 1618 uint16_t i;
WiredHome 98:ecebed9b80b2 1619
WiredHome 98:ecebed9b80b2 1620 for (i=firstChar; i<=lastChar; i++) {
WiredHome 98:ecebed9b80b2 1621 // 8 bytes of preamble to the first level lookup table
WiredHome 98:ecebed9b80b2 1622 uint16_t offsetToCharLookup = 8 + 4 * (i - firstChar); // 4-bytes: width(pixels), 16-bit offset from table start, 0
WiredHome 98:ecebed9b80b2 1623 totalWidth += _font[offsetToCharLookup];
WiredHome 98:ecebed9b80b2 1624 }
WiredHome 98:ecebed9b80b2 1625 extFontWidth = totalWidth / (lastChar - firstChar);
WiredHome 98:ecebed9b80b2 1626 INFO("Font Metrics: Avg W: %2d, H: %2d, First:%d, Last:%d", extFontWidth, extFontHeight, firstChar, lastChar);
WiredHome 98:ecebed9b80b2 1627 }
WiredHome 98:ecebed9b80b2 1628 SetTextCursor(GetTextCursor_X(), GetTextCursor_Y()); // soft-font cursor -> hw cursor
WiredHome 98:ecebed9b80b2 1629 font = _font;
WiredHome 98:ecebed9b80b2 1630 return GraphicsDisplay::SelectUserFont(_font);
WiredHome 98:ecebed9b80b2 1631 }
WiredHome 44:207594dece70 1632
WiredHome 19:3f82c1161fd2 1633 RetCode_t RA8875::background(color_t color)
WiredHome 19:3f82c1161fd2 1634 {
WiredHome 37:f19b7e7449dc 1635 GraphicsDisplay::background(color);
WiredHome 19:3f82c1161fd2 1636 WriteCommand(0x60, (color>>11)); // BGCR0
WiredHome 19:3f82c1161fd2 1637 WriteCommand(0x61, (unsigned char)(color>>5)); // BGCR0
WiredHome 19:3f82c1161fd2 1638 WriteCommand(0x62, (unsigned char)(color)); // BGCR0
WiredHome 19:3f82c1161fd2 1639 return noerror;
WiredHome 19:3f82c1161fd2 1640 }
WiredHome 19:3f82c1161fd2 1641
WiredHome 44:207594dece70 1642
WiredHome 19:3f82c1161fd2 1643 RetCode_t RA8875::background(unsigned char r, unsigned char g, unsigned char b)
WiredHome 19:3f82c1161fd2 1644 {
WiredHome 37:f19b7e7449dc 1645 background(RGB(r,g,b));
WiredHome 19:3f82c1161fd2 1646 return noerror;
WiredHome 19:3f82c1161fd2 1647 }
WiredHome 19:3f82c1161fd2 1648
WiredHome 44:207594dece70 1649
WiredHome 19:3f82c1161fd2 1650 RetCode_t RA8875::foreground(color_t color)
WiredHome 19:3f82c1161fd2 1651 {
WiredHome 37:f19b7e7449dc 1652 GraphicsDisplay::foreground(color);
WiredHome 19:3f82c1161fd2 1653 WriteCommand(0x63, (unsigned char)(color>>11));
WiredHome 19:3f82c1161fd2 1654 WriteCommand(0x64, (unsigned char)(color>>5));
WiredHome 19:3f82c1161fd2 1655 WriteCommand(0x65, (unsigned char)(color));
WiredHome 19:3f82c1161fd2 1656 return noerror;
WiredHome 19:3f82c1161fd2 1657 }
WiredHome 19:3f82c1161fd2 1658
WiredHome 44:207594dece70 1659
WiredHome 37:f19b7e7449dc 1660 RetCode_t RA8875::foreground(unsigned char r, unsigned char g, unsigned char b)
WiredHome 19:3f82c1161fd2 1661 {
WiredHome 37:f19b7e7449dc 1662 foreground(RGB(r,g,b));
WiredHome 19:3f82c1161fd2 1663 return noerror;
WiredHome 19:3f82c1161fd2 1664 }
WiredHome 19:3f82c1161fd2 1665
WiredHome 44:207594dece70 1666
WiredHome 37:f19b7e7449dc 1667 color_t RA8875::GetForeColor(void)
WiredHome 19:3f82c1161fd2 1668 {
WiredHome 19:3f82c1161fd2 1669 color_t color;
WiredHome 73:f22a18707b5e 1670
WiredHome 19:3f82c1161fd2 1671 color = (ReadCommand(0x63) & 0x1F) << 11;
WiredHome 19:3f82c1161fd2 1672 color |= (ReadCommand(0x64) & 0x3F) << 5;
WiredHome 19:3f82c1161fd2 1673 color |= (ReadCommand(0x65) & 0x1F);
WiredHome 19:3f82c1161fd2 1674 return color;
WiredHome 19:3f82c1161fd2 1675 }
WiredHome 19:3f82c1161fd2 1676
WiredHome 44:207594dece70 1677
WiredHome 19:3f82c1161fd2 1678 color_t RA8875::DOSColor(int i)
WiredHome 73:f22a18707b5e 1679 {
WiredHome 73:f22a18707b5e 1680 const color_t colors[16] = {
WiredHome 19:3f82c1161fd2 1681 Black, Blue, Green, Cyan,
WiredHome 19:3f82c1161fd2 1682 Red, Magenta, Brown, Gray,
WiredHome 19:3f82c1161fd2 1683 Charcoal, BrightBlue, BrightGreen, BrightCyan,
WiredHome 19:3f82c1161fd2 1684 Orange, Pink, Yellow, White
WiredHome 73:f22a18707b5e 1685 };
WiredHome 85:022bba13c5c4 1686 if (i >= 0 && i < 16)
WiredHome 19:3f82c1161fd2 1687 return colors[i];
WiredHome 19:3f82c1161fd2 1688 else
WiredHome 19:3f82c1161fd2 1689 return 0;
WiredHome 73:f22a18707b5e 1690 }
WiredHome 19:3f82c1161fd2 1691
WiredHome 44:207594dece70 1692
WiredHome 73:f22a18707b5e 1693 const char * RA8875::DOSColorNames(int i)
WiredHome 73:f22a18707b5e 1694 {
WiredHome 73:f22a18707b5e 1695 const char * names[16] = {
WiredHome 19:3f82c1161fd2 1696 "Black", "Blue", "Green", "Cyan",
WiredHome 19:3f82c1161fd2 1697 "Red", "Magenta", "Brown", "Gray",
WiredHome 19:3f82c1161fd2 1698 "Charcoal", "BrightBlue", "BrightGreen", "BrightCyan",
WiredHome 19:3f82c1161fd2 1699 "Orange", "Pink", "Yellow", "White"
WiredHome 73:f22a18707b5e 1700 };
WiredHome 85:022bba13c5c4 1701 if (i >= 0 && i < 16)
WiredHome 19:3f82c1161fd2 1702 return names[i];
WiredHome 19:3f82c1161fd2 1703 else
WiredHome 19:3f82c1161fd2 1704 return NULL;
WiredHome 73:f22a18707b5e 1705 }
WiredHome 19:3f82c1161fd2 1706
WiredHome 19:3f82c1161fd2 1707
WiredHome 19:3f82c1161fd2 1708 ///////////////////////////////////////////////////////////////
WiredHome 19:3f82c1161fd2 1709 // Private functions
WiredHome 19:3f82c1161fd2 1710
WiredHome 79:544eb4964795 1711 unsigned char RA8875::_spiwrite(unsigned char data)
WiredHome 19:3f82c1161fd2 1712 {
WiredHome 19:3f82c1161fd2 1713 unsigned char retval;
WiredHome 73:f22a18707b5e 1714
WiredHome 68:ab08efabfc88 1715 if (!spiWriteSpeed)
WiredHome 68:ab08efabfc88 1716 _setWriteSpeed(true);
WiredHome 19:3f82c1161fd2 1717 retval = spi.write(data);
WiredHome 19:3f82c1161fd2 1718 return retval;
WiredHome 19:3f82c1161fd2 1719 }
WiredHome 19:3f82c1161fd2 1720
WiredHome 44:207594dece70 1721
WiredHome 79:544eb4964795 1722 unsigned char RA8875::_spiread(void)
WiredHome 19:3f82c1161fd2 1723 {
WiredHome 19:3f82c1161fd2 1724 unsigned char retval;
WiredHome 19:3f82c1161fd2 1725 unsigned char data = 0;
WiredHome 73:f22a18707b5e 1726
WiredHome 68:ab08efabfc88 1727 if (spiWriteSpeed)
WiredHome 68:ab08efabfc88 1728 _setWriteSpeed(false);
WiredHome 19:3f82c1161fd2 1729 retval = spi.write(data);
WiredHome 19:3f82c1161fd2 1730 return retval;
WiredHome 19:3f82c1161fd2 1731 }
WiredHome 19:3f82c1161fd2 1732
WiredHome 44:207594dece70 1733
WiredHome 79:544eb4964795 1734 RetCode_t RA8875::_select(bool chipsel)
WiredHome 19:3f82c1161fd2 1735 {
WiredHome 19:3f82c1161fd2 1736 cs = (chipsel == true) ? 0 : 1;
WiredHome 19:3f82c1161fd2 1737 return noerror;
WiredHome 19:3f82c1161fd2 1738 }
WiredHome 19:3f82c1161fd2 1739
WiredHome 44:207594dece70 1740
WiredHome 72:ecffe56af969 1741 RetCode_t RA8875::PrintScreen(uint16_t layer, loc_t x, loc_t y, dim_t w, dim_t h, const char *Name_BMP)
WiredHome 72:ecffe56af969 1742 {
WiredHome 74:686faa218914 1743 (void)layer;
WiredHome 96:40b74dd3695b 1744
WiredHome 96:40b74dd3695b 1745 // AttachPrintHandler(this, RA8875::_printCallback);
WiredHome 96:40b74dd3695b 1746 // return PrintScreen(x,y,w,h);
WiredHome 74:686faa218914 1747 return PrintScreen(x, y, w, h, Name_BMP);
WiredHome 72:ecffe56af969 1748 }
WiredHome 72:ecffe56af969 1749
WiredHome 96:40b74dd3695b 1750 RetCode_t RA8875::_printCallback(RA8875::filecmd_t cmd, uint8_t * buffer, uint16_t size)
WiredHome 96:40b74dd3695b 1751 {
WiredHome 96:40b74dd3695b 1752 HexDump("CB", buffer, size);
WiredHome 96:40b74dd3695b 1753 switch(cmd) {
WiredHome 96:40b74dd3695b 1754 case RA8875::OPEN:
WiredHome 96:40b74dd3695b 1755 //pc.printf("About to write %lu bytes\r\n", *(uint32_t *)buffer);
WiredHome 96:40b74dd3695b 1756 _printFH = fopen("file.bmp", "w+b");
WiredHome 96:40b74dd3695b 1757 if (_printFH == 0)
WiredHome 96:40b74dd3695b 1758 return file_not_found;
WiredHome 96:40b74dd3695b 1759 break;
WiredHome 96:40b74dd3695b 1760 case RA8875::WRITE:
WiredHome 96:40b74dd3695b 1761 //pc.printf(" Write %4u bytes\r\n", size);
WiredHome 96:40b74dd3695b 1762 fwrite(buffer, 1, size, _printFH);
WiredHome 96:40b74dd3695b 1763 break;
WiredHome 96:40b74dd3695b 1764 case RA8875::CLOSE:
WiredHome 96:40b74dd3695b 1765 //pc.printf(" close\r\n");
WiredHome 96:40b74dd3695b 1766 fclose(_printFH);
WiredHome 96:40b74dd3695b 1767 _printFH = 0;
WiredHome 96:40b74dd3695b 1768 break;
WiredHome 96:40b74dd3695b 1769 default:
WiredHome 96:40b74dd3695b 1770 //pc.printf("Unexpected callback %d\r\n", cmd);
WiredHome 96:40b74dd3695b 1771 return file_not_found;
WiredHome 96:40b74dd3695b 1772 //break;
WiredHome 96:40b74dd3695b 1773 }
WiredHome 96:40b74dd3695b 1774 return noerror;
WiredHome 96:40b74dd3695b 1775 }
WiredHome 96:40b74dd3695b 1776
WiredHome 96:40b74dd3695b 1777 RetCode_t RA8875::PrintScreen(loc_t x, loc_t y, dim_t w, dim_t h)
WiredHome 96:40b74dd3695b 1778 {
WiredHome 96:40b74dd3695b 1779 BITMAPFILEHEADER BMP_Header;
WiredHome 96:40b74dd3695b 1780 BITMAPINFOHEADER BMP_Info;
WiredHome 96:40b74dd3695b 1781 uint8_t * lineBuffer = NULL;
WiredHome 96:40b74dd3695b 1782 color_t * pixelBuffer = NULL;
WiredHome 96:40b74dd3695b 1783 color_t * pixelBuffer2 = NULL;
WiredHome 96:40b74dd3695b 1784
WiredHome 98:ecebed9b80b2 1785 INFO("(%d,%d) - (%d,%d)", x,y,w,h);
WiredHome 105:4f116006ba1f 1786 if (x >= 0 && x < screenwidth
WiredHome 105:4f116006ba1f 1787 && y >= 0 && y < screenheight
WiredHome 105:4f116006ba1f 1788 && w > 0 && x + w <= screenwidth
WiredHome 105:4f116006ba1f 1789 && h > 0 && y + h <= screenheight) {
WiredHome 96:40b74dd3695b 1790
WiredHome 96:40b74dd3695b 1791 BMP_Header.bfType = BF_TYPE;
WiredHome 96:40b74dd3695b 1792 BMP_Header.bfSize = (w * h * sizeof(RGBQUAD)) + sizeof(BMP_Header) + sizeof(BMP_Header);
WiredHome 96:40b74dd3695b 1793 BMP_Header.bfReserved1 = 0;
WiredHome 96:40b74dd3695b 1794 BMP_Header.bfReserved2 = 0;
WiredHome 96:40b74dd3695b 1795 BMP_Header.bfOffBits = sizeof(BMP_Header) + sizeof(BMP_Header);
WiredHome 96:40b74dd3695b 1796
WiredHome 96:40b74dd3695b 1797 BMP_Info.biSize = sizeof(BMP_Info);
WiredHome 96:40b74dd3695b 1798 BMP_Info.biWidth = w;
WiredHome 96:40b74dd3695b 1799 BMP_Info.biHeight = h;
WiredHome 96:40b74dd3695b 1800 BMP_Info.biPlanes = 1;
WiredHome 96:40b74dd3695b 1801 BMP_Info.biBitCount = 24;
WiredHome 96:40b74dd3695b 1802 BMP_Info.biCompression = BI_RGB;
WiredHome 96:40b74dd3695b 1803 BMP_Info.biSizeImage = 0;
WiredHome 96:40b74dd3695b 1804 BMP_Info.biXPelsPerMeter = 0;
WiredHome 96:40b74dd3695b 1805 BMP_Info.biYPelsPerMeter = 0;
WiredHome 96:40b74dd3695b 1806 BMP_Info.biClrUsed = 0;
WiredHome 96:40b74dd3695b 1807 BMP_Info.biClrImportant = 0;
WiredHome 96:40b74dd3695b 1808
WiredHome 96:40b74dd3695b 1809 // Allocate the memory we need to proceed
WiredHome 96:40b74dd3695b 1810 int lineBufSize = ((24 * w + 7)/8);
WiredHome 96:40b74dd3695b 1811 lineBuffer = (uint8_t *)malloc(lineBufSize);
WiredHome 96:40b74dd3695b 1812 if (lineBuffer == NULL) {
WiredHome 96:40b74dd3695b 1813 ERR("Not enough RAM for PrintScreen lineBuffer");
WiredHome 96:40b74dd3695b 1814 return(not_enough_ram);
WiredHome 96:40b74dd3695b 1815 }
WiredHome 96:40b74dd3695b 1816
WiredHome 96:40b74dd3695b 1817 #define DOUBLEBUF /* one larger buffer instead of two */
WiredHome 96:40b74dd3695b 1818
WiredHome 96:40b74dd3695b 1819 #ifdef DOUBLEBUF
WiredHome 96:40b74dd3695b 1820 // In the "#else", pixelBuffer2 malloc returns a value,
WiredHome 96:40b74dd3695b 1821 // but is actually causing a failure later.
WiredHome 96:40b74dd3695b 1822 // This test helps determine if it is truly out of memory,
WiredHome 96:40b74dd3695b 1823 // or if malloc is broken.
WiredHome 96:40b74dd3695b 1824 pixelBuffer = (color_t *)malloc(2 * w * sizeof(color_t));
WiredHome 96:40b74dd3695b 1825 pixelBuffer2 = pixelBuffer + (w * sizeof(color_t));
WiredHome 96:40b74dd3695b 1826 #else
WiredHome 96:40b74dd3695b 1827 pixelBuffer = (color_t *)malloc(w * sizeof(color_t));
WiredHome 96:40b74dd3695b 1828 pixelBuffer2 = (color_t *)malloc(w * sizeof(color_t));
WiredHome 96:40b74dd3695b 1829 #endif
WiredHome 96:40b74dd3695b 1830 if (pixelBuffer == NULL || pixelBuffer2 == NULL) {
WiredHome 96:40b74dd3695b 1831 ERR("Not enough RAM for pixelBuffer");
WiredHome 96:40b74dd3695b 1832 #ifndef DOUBLEBUF
WiredHome 96:40b74dd3695b 1833 if (pixelBuffer2)
WiredHome 96:40b74dd3695b 1834 free(pixelBuffer2);
WiredHome 96:40b74dd3695b 1835 #endif
WiredHome 96:40b74dd3695b 1836 if (pixelBuffer)
WiredHome 96:40b74dd3695b 1837 free(pixelBuffer);
WiredHome 96:40b74dd3695b 1838 free(lineBuffer);
WiredHome 96:40b74dd3695b 1839 return(not_enough_ram);
WiredHome 96:40b74dd3695b 1840 }
WiredHome 96:40b74dd3695b 1841
WiredHome 96:40b74dd3695b 1842 // Get the file primed...
WiredHome 96:40b74dd3695b 1843 privateCallback(OPEN, (uint8_t *)&BMP_Header.bfSize, 4);
WiredHome 96:40b74dd3695b 1844
WiredHome 96:40b74dd3695b 1845 // Be optimistic - don't check for errors.
WiredHome 96:40b74dd3695b 1846 HexDump("BMP_Header", (uint8_t *)&BMP_Header, sizeof(BMP_Header));
WiredHome 96:40b74dd3695b 1847 //fwrite(&BMP_Header, sizeof(char), sizeof(BMP_Header), Image);
WiredHome 96:40b74dd3695b 1848 privateCallback(WRITE, (uint8_t *)&BMP_Header, sizeof(BMP_Header));
WiredHome 96:40b74dd3695b 1849
WiredHome 96:40b74dd3695b 1850 HexDump("BMP_Info", (uint8_t *)&BMP_Info, sizeof(BMP_Info));
WiredHome 96:40b74dd3695b 1851 //fwrite(&BMP_Info, sizeof(char), sizeof(BMP_Info), Image);
WiredHome 96:40b74dd3695b 1852 privateCallback(WRITE, (uint8_t *)&BMP_Info, sizeof(BMP_Info));
WiredHome 96:40b74dd3695b 1853
WiredHome 96:40b74dd3695b 1854 //color_t transparency = GetBackgroundTransparencyColor();
WiredHome 96:40b74dd3695b 1855 LayerMode_T ltpr0 = GetLayerMode();
WiredHome 96:40b74dd3695b 1856
WiredHome 96:40b74dd3695b 1857 uint16_t prevLayer = GetDrawingLayer();
WiredHome 96:40b74dd3695b 1858 // If only one of the layers is visible, select that layer
WiredHome 96:40b74dd3695b 1859 switch(ltpr0) {
WiredHome 96:40b74dd3695b 1860 case ShowLayer0:
WiredHome 96:40b74dd3695b 1861 SelectDrawingLayer(0);
WiredHome 96:40b74dd3695b 1862 break;
WiredHome 96:40b74dd3695b 1863 case ShowLayer1:
WiredHome 96:40b74dd3695b 1864 SelectDrawingLayer(1);
WiredHome 96:40b74dd3695b 1865 break;
WiredHome 96:40b74dd3695b 1866 default:
WiredHome 96:40b74dd3695b 1867 break;
WiredHome 96:40b74dd3695b 1868 }
WiredHome 96:40b74dd3695b 1869
WiredHome 96:40b74dd3695b 1870 // Read the display from the last line toward the top
WiredHome 96:40b74dd3695b 1871 // so we can write the file in one pass.
WiredHome 96:40b74dd3695b 1872 for (int j = h - 1; j >= 0; j--) {
WiredHome 96:40b74dd3695b 1873 if (ltpr0 >= 2) // Need to combine the layers...
WiredHome 96:40b74dd3695b 1874 SelectDrawingLayer(0); // so read layer 0 first
WiredHome 96:40b74dd3695b 1875 // Read one line of pixels to a local buffer
WiredHome 96:40b74dd3695b 1876 if (getPixelStream(pixelBuffer, w, x,y+j) != noerror) {
WiredHome 96:40b74dd3695b 1877 ERR("getPixelStream error, and no recovery handler...");
WiredHome 96:40b74dd3695b 1878 }
WiredHome 96:40b74dd3695b 1879 if (ltpr0 >= 2) { // Need to combine the layers...
WiredHome 96:40b74dd3695b 1880 SelectDrawingLayer(1); // so read layer 1 next
WiredHome 96:40b74dd3695b 1881 if (getPixelStream(pixelBuffer2, w, x,y+j) != noerror) {
WiredHome 96:40b74dd3695b 1882 ERR("getPixelStream error, and no recovery handler...");
WiredHome 96:40b74dd3695b 1883 }
WiredHome 96:40b74dd3695b 1884 }
WiredHome 96:40b74dd3695b 1885 INFO("1st Color: %04X", pixelBuffer[0]);
WiredHome 96:40b74dd3695b 1886 HexDump("Raster", (uint8_t *)pixelBuffer, w);
WiredHome 96:40b74dd3695b 1887 // Convert the local buffer to RGBQUAD format
WiredHome 96:40b74dd3695b 1888 int lb = 0;
WiredHome 96:40b74dd3695b 1889 for (int i=0; i<w; i++) {
WiredHome 96:40b74dd3695b 1890 RGBQUAD q0 = RGB16ToRGBQuad(pixelBuffer[x+i]); // Scale to 24-bits
WiredHome 96:40b74dd3695b 1891 RGBQUAD q1 = RGB16ToRGBQuad(pixelBuffer2[x+i]); // Scale to 24-bits
WiredHome 96:40b74dd3695b 1892 switch (ltpr0) {
WiredHome 96:40b74dd3695b 1893 case 0:
WiredHome 96:40b74dd3695b 1894 case 1:
WiredHome 96:40b74dd3695b 1895 case 2: // lighten-overlay (@TODO Not supported yet)
WiredHome 96:40b74dd3695b 1896 case 6: // Floating Windows (@TODO not sure how to support)
WiredHome 96:40b74dd3695b 1897 default: // Reserved...
WiredHome 96:40b74dd3695b 1898 lineBuffer[lb++] = q0.rgbBlue;
WiredHome 96:40b74dd3695b 1899 lineBuffer[lb++] = q0.rgbGreen;
WiredHome 96:40b74dd3695b 1900 lineBuffer[lb++] = q0.rgbRed;
WiredHome 96:40b74dd3695b 1901 break;
WiredHome 96:40b74dd3695b 1902 case 3: // transparent mode (@TODO Read the background color register for transparent)
WiredHome 96:40b74dd3695b 1903 case 4: // boolean or
WiredHome 96:40b74dd3695b 1904 lineBuffer[lb++] = q0.rgbBlue | q1.rgbBlue;
WiredHome 96:40b74dd3695b 1905 lineBuffer[lb++] = q0.rgbGreen | q1.rgbGreen;
WiredHome 96:40b74dd3695b 1906 lineBuffer[lb++] = q0.rgbRed | q1.rgbRed;
WiredHome 96:40b74dd3695b 1907 break;
WiredHome 96:40b74dd3695b 1908 case 5: // boolean AND
WiredHome 96:40b74dd3695b 1909 lineBuffer[lb++] = q0.rgbBlue & q1.rgbBlue;
WiredHome 96:40b74dd3695b 1910 lineBuffer[lb++] = q0.rgbGreen & q1.rgbGreen;
WiredHome 96:40b74dd3695b 1911 lineBuffer[lb++] = q0.rgbRed & q1.rgbRed;
WiredHome 96:40b74dd3695b 1912 break;
WiredHome 96:40b74dd3695b 1913 }
WiredHome 96:40b74dd3695b 1914 }
WiredHome 96:40b74dd3695b 1915 if (j == h - 1) {
WiredHome 96:40b74dd3695b 1916 HexDump("Line", lineBuffer, lineBufSize);
WiredHome 96:40b74dd3695b 1917 }
WiredHome 96:40b74dd3695b 1918 // Write to disk
WiredHome 96:40b74dd3695b 1919 //fwrite(lineBuffer, sizeof(char), lb, Image);
WiredHome 96:40b74dd3695b 1920 privateCallback(WRITE, (uint8_t *)lineBuffer, lb);
WiredHome 96:40b74dd3695b 1921 }
WiredHome 96:40b74dd3695b 1922 SelectDrawingLayer(prevLayer);
WiredHome 96:40b74dd3695b 1923 //fclose(Image);
WiredHome 96:40b74dd3695b 1924 privateCallback(CLOSE, NULL, 0);
WiredHome 96:40b74dd3695b 1925
WiredHome 96:40b74dd3695b 1926 #ifndef DOUBLEBUF
WiredHome 96:40b74dd3695b 1927 if (pixelBuffer2)
WiredHome 96:40b74dd3695b 1928 free(pixelBuffer2);
WiredHome 96:40b74dd3695b 1929 #endif
WiredHome 96:40b74dd3695b 1930 if (pixelBuffer)
WiredHome 96:40b74dd3695b 1931 free(pixelBuffer);
WiredHome 96:40b74dd3695b 1932 free(lineBuffer);
WiredHome 96:40b74dd3695b 1933 INFO("Image closed");
WiredHome 96:40b74dd3695b 1934 return noerror;
WiredHome 96:40b74dd3695b 1935 } else {
WiredHome 96:40b74dd3695b 1936 return bad_parameter;
WiredHome 96:40b74dd3695b 1937 }
WiredHome 96:40b74dd3695b 1938 }
WiredHome 79:544eb4964795 1939
WiredHome 72:ecffe56af969 1940 RetCode_t RA8875::PrintScreen(loc_t x, loc_t y, dim_t w, dim_t h, const char *Name_BMP)
WiredHome 72:ecffe56af969 1941 {
WiredHome 72:ecffe56af969 1942 BITMAPFILEHEADER BMP_Header;
WiredHome 72:ecffe56af969 1943 BITMAPINFOHEADER BMP_Info;
WiredHome 86:e86b355940f4 1944 uint8_t * lineBuffer = NULL;
WiredHome 86:e86b355940f4 1945 color_t * pixelBuffer = NULL;
WiredHome 86:e86b355940f4 1946 color_t * pixelBuffer2 = NULL;
WiredHome 86:e86b355940f4 1947
WiredHome 72:ecffe56af969 1948 INFO("(%d,%d) - (%d,%d) %s", x,y,w,h,Name_BMP);
WiredHome 105:4f116006ba1f 1949 if (x >= 0 && x < screenwidth
WiredHome 105:4f116006ba1f 1950 && y >= 0 && y < screenheight
WiredHome 105:4f116006ba1f 1951 && w > 0 && x + w <= screenwidth
WiredHome 105:4f116006ba1f 1952 && h > 0 && y + h <= screenheight) {
WiredHome 72:ecffe56af969 1953
WiredHome 72:ecffe56af969 1954 BMP_Header.bfType = BF_TYPE;
WiredHome 72:ecffe56af969 1955 BMP_Header.bfSize = (w * h * sizeof(RGBQUAD)) + sizeof(BMP_Header) + sizeof(BMP_Header);
WiredHome 72:ecffe56af969 1956 BMP_Header.bfReserved1 = 0;
WiredHome 72:ecffe56af969 1957 BMP_Header.bfReserved2 = 0;
WiredHome 72:ecffe56af969 1958 BMP_Header.bfOffBits = sizeof(BMP_Header) + sizeof(BMP_Header);
WiredHome 73:f22a18707b5e 1959
WiredHome 72:ecffe56af969 1960 BMP_Info.biSize = sizeof(BMP_Info);
WiredHome 72:ecffe56af969 1961 BMP_Info.biWidth = w;
WiredHome 72:ecffe56af969 1962 BMP_Info.biHeight = h;
WiredHome 72:ecffe56af969 1963 BMP_Info.biPlanes = 1;
WiredHome 72:ecffe56af969 1964 BMP_Info.biBitCount = 24;
WiredHome 72:ecffe56af969 1965 BMP_Info.biCompression = BI_RGB;
WiredHome 72:ecffe56af969 1966 BMP_Info.biSizeImage = 0;
WiredHome 72:ecffe56af969 1967 BMP_Info.biXPelsPerMeter = 0;
WiredHome 72:ecffe56af969 1968 BMP_Info.biYPelsPerMeter = 0;
WiredHome 72:ecffe56af969 1969 BMP_Info.biClrUsed = 0;
WiredHome 72:ecffe56af969 1970 BMP_Info.biClrImportant = 0;
WiredHome 72:ecffe56af969 1971
WiredHome 86:e86b355940f4 1972 // Allocate the memory we need to proceed
WiredHome 86:e86b355940f4 1973 int lineBufSize = ((24 * w + 7)/8);
WiredHome 86:e86b355940f4 1974 lineBuffer = (uint8_t *)malloc(lineBufSize);
WiredHome 86:e86b355940f4 1975 if (lineBuffer == NULL) {
WiredHome 86:e86b355940f4 1976 ERR("Not enough RAM for PrintScreen lineBuffer");
WiredHome 86:e86b355940f4 1977 return(not_enough_ram);
WiredHome 86:e86b355940f4 1978 }
WiredHome 86:e86b355940f4 1979
WiredHome 86:e86b355940f4 1980 #define DOUBLEBUF /* one larger buffer instead of two */
WiredHome 86:e86b355940f4 1981
WiredHome 86:e86b355940f4 1982 #ifdef DOUBLEBUF
WiredHome 86:e86b355940f4 1983 // In the "#else", pixelBuffer2 malloc returns a value,
WiredHome 86:e86b355940f4 1984 // but is actually causing a failure later.
WiredHome 86:e86b355940f4 1985 // This test helps determine if it is truly out of memory,
WiredHome 86:e86b355940f4 1986 // or if malloc is broken.
WiredHome 86:e86b355940f4 1987 pixelBuffer = (color_t *)malloc(2 * w * sizeof(color_t));
WiredHome 86:e86b355940f4 1988 pixelBuffer2 = pixelBuffer + (w * sizeof(color_t));
WiredHome 86:e86b355940f4 1989 #else
WiredHome 86:e86b355940f4 1990 pixelBuffer = (color_t *)malloc(w * sizeof(color_t));
WiredHome 86:e86b355940f4 1991 pixelBuffer2 = (color_t *)malloc(w * sizeof(color_t));
WiredHome 86:e86b355940f4 1992 #endif
WiredHome 86:e86b355940f4 1993 if (pixelBuffer == NULL || pixelBuffer2 == NULL) {
WiredHome 86:e86b355940f4 1994 ERR("Not enough RAM for pixelBuffer");
WiredHome 86:e86b355940f4 1995 #ifndef DOUBLEBUF
WiredHome 86:e86b355940f4 1996 if (pixelBuffer2)
WiredHome 86:e86b355940f4 1997 free(pixelBuffer2);
WiredHome 86:e86b355940f4 1998 #endif
WiredHome 86:e86b355940f4 1999 if (pixelBuffer)
WiredHome 86:e86b355940f4 2000 free(pixelBuffer);
WiredHome 86:e86b355940f4 2001 free(lineBuffer);
WiredHome 86:e86b355940f4 2002 return(not_enough_ram);
WiredHome 86:e86b355940f4 2003 }
WiredHome 86:e86b355940f4 2004
WiredHome 72:ecffe56af969 2005 FILE *Image = fopen(Name_BMP, "wb");
WiredHome 72:ecffe56af969 2006 if (!Image) {
WiredHome 86:e86b355940f4 2007 ERR("Can't open file for write");
WiredHome 86:e86b355940f4 2008 #ifndef DOUBLEBUF
WiredHome 86:e86b355940f4 2009 if (pixelBuffer2)
WiredHome 86:e86b355940f4 2010 free(pixelBuffer2);
WiredHome 86:e86b355940f4 2011 #endif
WiredHome 86:e86b355940f4 2012 if (pixelBuffer)
WiredHome 86:e86b355940f4 2013 free(pixelBuffer);
WiredHome 86:e86b355940f4 2014 free(lineBuffer);
WiredHome 72:ecffe56af969 2015 return(file_not_found);
WiredHome 72:ecffe56af969 2016 }
WiredHome 72:ecffe56af969 2017
WiredHome 72:ecffe56af969 2018 // Be optimistic - don't check for errors.
WiredHome 93:6fbc516de05e 2019 HexDump("BMP_Header", (uint8_t *)&BMP_Header, sizeof(BMP_Header));
WiredHome 95:ef538bd687c0 2020 fwrite(&BMP_Header, sizeof(char), sizeof(BMP_Header), Image);
WiredHome 73:f22a18707b5e 2021
WiredHome 93:6fbc516de05e 2022 HexDump("BMP_Info", (uint8_t *)&BMP_Info, sizeof(BMP_Info));
WiredHome 95:ef538bd687c0 2023 fwrite(&BMP_Info, sizeof(char), sizeof(BMP_Info), Image);
WiredHome 73:f22a18707b5e 2024
WiredHome 95:ef538bd687c0 2025 //color_t transparency = GetBackgroundTransparencyColor();
WiredHome 95:ef538bd687c0 2026 LayerMode_T ltpr0 = GetLayerMode();
WiredHome 73:f22a18707b5e 2027
WiredHome 73:f22a18707b5e 2028 uint16_t prevLayer = GetDrawingLayer();
WiredHome 73:f22a18707b5e 2029 // If only one of the layers is visible, select that layer
WiredHome 73:f22a18707b5e 2030 switch(ltpr0) {
WiredHome 95:ef538bd687c0 2031 case ShowLayer0:
WiredHome 73:f22a18707b5e 2032 SelectDrawingLayer(0);
WiredHome 73:f22a18707b5e 2033 break;
WiredHome 95:ef538bd687c0 2034 case ShowLayer1:
WiredHome 73:f22a18707b5e 2035 SelectDrawingLayer(1);
WiredHome 73:f22a18707b5e 2036 break;
WiredHome 73:f22a18707b5e 2037 default:
WiredHome 73:f22a18707b5e 2038 break;
WiredHome 73:f22a18707b5e 2039 }
WiredHome 73:f22a18707b5e 2040
WiredHome 72:ecffe56af969 2041 // Read the display from the last line toward the top
WiredHome 72:ecffe56af969 2042 // so we can write the file in one pass.
WiredHome 72:ecffe56af969 2043 for (int j = h - 1; j >= 0; j--) {
WiredHome 73:f22a18707b5e 2044 if (ltpr0 >= 2) // Need to combine the layers...
WiredHome 73:f22a18707b5e 2045 SelectDrawingLayer(0); // so read layer 0 first
WiredHome 72:ecffe56af969 2046 // Read one line of pixels to a local buffer
WiredHome 72:ecffe56af969 2047 if (getPixelStream(pixelBuffer, w, x,y+j) != noerror) {
WiredHome 72:ecffe56af969 2048 ERR("getPixelStream error, and no recovery handler...");
WiredHome 72:ecffe56af969 2049 }
WiredHome 73:f22a18707b5e 2050 if (ltpr0 >= 2) { // Need to combine the layers...
WiredHome 86:e86b355940f4 2051 SelectDrawingLayer(1); // so read layer 1 next
WiredHome 73:f22a18707b5e 2052 if (getPixelStream(pixelBuffer2, w, x,y+j) != noerror) {
WiredHome 73:f22a18707b5e 2053 ERR("getPixelStream error, and no recovery handler...");
WiredHome 73:f22a18707b5e 2054 }
WiredHome 73:f22a18707b5e 2055 }
WiredHome 93:6fbc516de05e 2056 INFO("1st Color: %04X", pixelBuffer[0]);
WiredHome 93:6fbc516de05e 2057 HexDump("Raster", (uint8_t *)pixelBuffer, w);
WiredHome 72:ecffe56af969 2058 // Convert the local buffer to RGBQUAD format
WiredHome 72:ecffe56af969 2059 int lb = 0;
WiredHome 72:ecffe56af969 2060 for (int i=0; i<w; i++) {
WiredHome 73:f22a18707b5e 2061 RGBQUAD q0 = RGB16ToRGBQuad(pixelBuffer[x+i]); // Scale to 24-bits
WiredHome 73:f22a18707b5e 2062 RGBQUAD q1 = RGB16ToRGBQuad(pixelBuffer2[x+i]); // Scale to 24-bits
WiredHome 73:f22a18707b5e 2063 switch (ltpr0) {
WiredHome 73:f22a18707b5e 2064 case 0:
WiredHome 73:f22a18707b5e 2065 case 1:
WiredHome 73:f22a18707b5e 2066 case 2: // lighten-overlay (@TODO Not supported yet)
WiredHome 73:f22a18707b5e 2067 case 6: // Floating Windows (@TODO not sure how to support)
WiredHome 73:f22a18707b5e 2068 default: // Reserved...
WiredHome 73:f22a18707b5e 2069 lineBuffer[lb++] = q0.rgbBlue;
WiredHome 73:f22a18707b5e 2070 lineBuffer[lb++] = q0.rgbGreen;
WiredHome 73:f22a18707b5e 2071 lineBuffer[lb++] = q0.rgbRed;
WiredHome 73:f22a18707b5e 2072 break;
WiredHome 73:f22a18707b5e 2073 case 3: // transparent mode (@TODO Read the background color register for transparent)
WiredHome 73:f22a18707b5e 2074 case 4: // boolean or
WiredHome 73:f22a18707b5e 2075 lineBuffer[lb++] = q0.rgbBlue | q1.rgbBlue;
WiredHome 73:f22a18707b5e 2076 lineBuffer[lb++] = q0.rgbGreen | q1.rgbGreen;
WiredHome 73:f22a18707b5e 2077 lineBuffer[lb++] = q0.rgbRed | q1.rgbRed;
WiredHome 73:f22a18707b5e 2078 break;
WiredHome 73:f22a18707b5e 2079 case 5: // boolean AND
WiredHome 73:f22a18707b5e 2080 lineBuffer[lb++] = q0.rgbBlue & q1.rgbBlue;
WiredHome 73:f22a18707b5e 2081 lineBuffer[lb++] = q0.rgbGreen & q1.rgbGreen;
WiredHome 73:f22a18707b5e 2082 lineBuffer[lb++] = q0.rgbRed & q1.rgbRed;
WiredHome 73:f22a18707b5e 2083 break;
WiredHome 73:f22a18707b5e 2084 }
WiredHome 72:ecffe56af969 2085 }
WiredHome 95:ef538bd687c0 2086 if (j == h - 1) {
WiredHome 73:f22a18707b5e 2087 HexDump("Line", lineBuffer, lineBufSize);
WiredHome 95:ef538bd687c0 2088 }
WiredHome 72:ecffe56af969 2089 // Write to disk
WiredHome 72:ecffe56af969 2090 fwrite(lineBuffer, sizeof(char), lb, Image);
WiredHome 72:ecffe56af969 2091 }
WiredHome 73:f22a18707b5e 2092 SelectDrawingLayer(prevLayer);
WiredHome 72:ecffe56af969 2093 fclose(Image);
WiredHome 86:e86b355940f4 2094 #ifndef DOUBLEBUF
WiredHome 86:e86b355940f4 2095 if (pixelBuffer2)
WiredHome 86:e86b355940f4 2096 free(pixelBuffer2);
WiredHome 86:e86b355940f4 2097 #endif
WiredHome 86:e86b355940f4 2098 if (pixelBuffer)
WiredHome 86:e86b355940f4 2099 free(pixelBuffer);
WiredHome 72:ecffe56af969 2100 free(lineBuffer);
WiredHome 73:f22a18707b5e 2101 INFO("Image closed");
WiredHome 72:ecffe56af969 2102 return noerror;
WiredHome 72:ecffe56af969 2103 } else {
WiredHome 72:ecffe56af969 2104 return bad_parameter;
WiredHome 72:ecffe56af969 2105 }
WiredHome 72:ecffe56af969 2106 }
WiredHome 72:ecffe56af969 2107
WiredHome 72:ecffe56af969 2108
WiredHome 72:ecffe56af969 2109 // ##########################################################################
WiredHome 72:ecffe56af969 2110 // ##########################################################################
WiredHome 72:ecffe56af969 2111 // ##########################################################################
WiredHome 72:ecffe56af969 2112
WiredHome 23:a50ded45dbaf 2113 #ifdef TESTENABLE
WiredHome 23:a50ded45dbaf 2114
WiredHome 98:ecebed9b80b2 2115 #include "BPG_Arial08x08.h"
WiredHome 98:ecebed9b80b2 2116 #include "BPG_Arial20x20.h"
WiredHome 37:f19b7e7449dc 2117
WiredHome 23:a50ded45dbaf 2118 // ______________ ______________ ______________ _______________
WiredHome 23:a50ded45dbaf 2119 // /_____ _____/ / ___________/ / ___________/ /_____ ______/
WiredHome 23:a50ded45dbaf 2120 // / / / / / / / /
WiredHome 23:a50ded45dbaf 2121 // / / / /___ / /__________ / /
WiredHome 23:a50ded45dbaf 2122 // / / / ____/ /__________ / / /
WiredHome 23:a50ded45dbaf 2123 // / / / / / / / /
WiredHome 23:a50ded45dbaf 2124 // / / / /__________ ___________/ / / /
WiredHome 23:a50ded45dbaf 2125 // /__/ /_____________/ /_____________/ /__/
WiredHome 23:a50ded45dbaf 2126 //
WiredHome 23:a50ded45dbaf 2127 // Everything from here down is test code.
WiredHome 75:ca78388cfd77 2128 //
WiredHome 41:2956a0a221e5 2129 bool SuppressSlowStuff = false;
WiredHome 23:a50ded45dbaf 2130
WiredHome 49:c5182231d1b9 2131 void TextWrapTest(RA8875 & display, Serial & pc)
WiredHome 49:c5182231d1b9 2132 {
WiredHome 49:c5182231d1b9 2133 if (!SuppressSlowStuff)
WiredHome 49:c5182231d1b9 2134 pc.printf("Text Wrap Test\r\n");
WiredHome 49:c5182231d1b9 2135 display.background(Black);
WiredHome 49:c5182231d1b9 2136 display.foreground(Blue);
WiredHome 49:c5182231d1b9 2137 display.cls();
WiredHome 49:c5182231d1b9 2138 display.Backlight_u8(255);
WiredHome 100:0b084475d5a9 2139 display.puts("Text Wrap Test.\r\n");
WiredHome 52:e6039a823420 2140 for (int i=1; i<60; i++) {
WiredHome 52:e6039a823420 2141 display.printf("L%2d\n", i % 17);
WiredHome 49:c5182231d1b9 2142 if (!SuppressSlowStuff)
WiredHome 52:e6039a823420 2143 wait_ms(100);
WiredHome 49:c5182231d1b9 2144 }
WiredHome 49:c5182231d1b9 2145 if (!SuppressSlowStuff)
WiredHome 49:c5182231d1b9 2146 wait_ms(3000);
WiredHome 49:c5182231d1b9 2147 }
WiredHome 49:c5182231d1b9 2148
WiredHome 75:ca78388cfd77 2149
WiredHome 75:ca78388cfd77 2150 void ShowKey(RA8875 & display, int key)
WiredHome 75:ca78388cfd77 2151 {
WiredHome 75:ca78388cfd77 2152 loc_t col, row;
WiredHome 75:ca78388cfd77 2153 dim_t r1 = 25;
WiredHome 75:ca78388cfd77 2154 color_t color = (key & 0x80) ? Red : Green;
WiredHome 75:ca78388cfd77 2155
WiredHome 75:ca78388cfd77 2156 key &= 0x7F; // remove the long-press flag
WiredHome 75:ca78388cfd77 2157 row = (key - 1) / 5;
WiredHome 75:ca78388cfd77 2158 col = (key - 1) % 5;
WiredHome 75:ca78388cfd77 2159 if (col > 5) col = 5;
WiredHome 75:ca78388cfd77 2160 if (row > 4) row = 4;
WiredHome 75:ca78388cfd77 2161 display.circle(450 - + (2 * r1) * col, 200 - (2 * r1) * row, r1-2, color, FILL);
WiredHome 75:ca78388cfd77 2162 }
WiredHome 75:ca78388cfd77 2163
WiredHome 75:ca78388cfd77 2164 void HideKey(RA8875 & display, int key)
WiredHome 75:ca78388cfd77 2165 {
WiredHome 75:ca78388cfd77 2166 loc_t col, row;
WiredHome 75:ca78388cfd77 2167 dim_t r1 = 25;
WiredHome 75:ca78388cfd77 2168
WiredHome 75:ca78388cfd77 2169 row = (key - 1) / 5;
WiredHome 75:ca78388cfd77 2170 col = (key - 1) % 5;
WiredHome 75:ca78388cfd77 2171 if (col > 5) col = 5;
WiredHome 75:ca78388cfd77 2172 if (row > 4) row = 4;
WiredHome 75:ca78388cfd77 2173 display.background(Black);
WiredHome 75:ca78388cfd77 2174 display.circle(450 - (2 * r1) * col, 200 - (2 * r1) * row, r1-2, Black, FILL);
WiredHome 75:ca78388cfd77 2175 display.circle(450 - (2 * r1) * col, 200 - (2 * r1) * row, r1-2, Blue);
WiredHome 75:ca78388cfd77 2176 }
WiredHome 75:ca78388cfd77 2177
WiredHome 75:ca78388cfd77 2178 void KeyPadTest(RA8875 & display, Serial & pc)
WiredHome 75:ca78388cfd77 2179 {
WiredHome 75:ca78388cfd77 2180 const uint8_t myMap[22] = {
WiredHome 77:9206c13aa527 2181 0,
WiredHome 75:ca78388cfd77 2182 'a', 'b', 'c', 'd', 'e',
WiredHome 75:ca78388cfd77 2183 'f', 'g', 'h', 'i', 'j',
WiredHome 75:ca78388cfd77 2184 'k', 'l', 'm', 'n', 'o',
WiredHome 75:ca78388cfd77 2185 'p', 'q', 'r', 's', 't',
WiredHome 75:ca78388cfd77 2186 'x'
WiredHome 75:ca78388cfd77 2187 };
WiredHome 77:9206c13aa527 2188
WiredHome 75:ca78388cfd77 2189 display.background(Black);
WiredHome 75:ca78388cfd77 2190 display.foreground(Blue);
WiredHome 75:ca78388cfd77 2191 display.cls();
WiredHome 75:ca78388cfd77 2192 display.Backlight_u8(255);
WiredHome 100:0b084475d5a9 2193 display.puts("KeyPad Test. Touch the keypad...");
WiredHome 75:ca78388cfd77 2194 pc.printf("\r\n"
WiredHome 75:ca78388cfd77 2195 "Raw KeyPad Test. Keypad returns the key-number.\r\n"
WiredHome 75:ca78388cfd77 2196 "Press [most] any PC keyboard key to advance to next test.\r\n");
WiredHome 75:ca78388cfd77 2197 RetCode_t ret = display.KeypadInit(true, true, 3, 7, 3);
WiredHome 75:ca78388cfd77 2198 if (ret != noerror)
WiredHome 75:ca78388cfd77 2199 pc.printf("returncode from KeypadInit is %d\r\n", ret);
WiredHome 75:ca78388cfd77 2200 int lastKey = 0;
WiredHome 75:ca78388cfd77 2201 while (!pc.readable()) {
WiredHome 75:ca78388cfd77 2202 if (display.readable()) {
WiredHome 75:ca78388cfd77 2203 int key = display.getc();
WiredHome 75:ca78388cfd77 2204 if (key) {
WiredHome 75:ca78388cfd77 2205 if (((key & 0x7F) != lastKey) && (lastKey != 0))
WiredHome 75:ca78388cfd77 2206 HideKey(display, lastKey);
WiredHome 75:ca78388cfd77 2207 ShowKey(display, key);
WiredHome 75:ca78388cfd77 2208 lastKey = key & 0x7F;
WiredHome 75:ca78388cfd77 2209 } else {
WiredHome 75:ca78388cfd77 2210 // erase the last one
WiredHome 75:ca78388cfd77 2211 if (lastKey)
WiredHome 75:ca78388cfd77 2212 HideKey(display, lastKey);
WiredHome 75:ca78388cfd77 2213 }
WiredHome 75:ca78388cfd77 2214 }
WiredHome 75:ca78388cfd77 2215 }
WiredHome 75:ca78388cfd77 2216 (void)pc.getc();
WiredHome 75:ca78388cfd77 2217 pc.printf("\r\n"
WiredHome 75:ca78388cfd77 2218 "Map KeyPad Test. Keypad returns the remapped key 'a' - 't'.\r\n"
WiredHome 75:ca78388cfd77 2219 "Press [most] any PC keyboard key to advance to exit test.\r\n");
WiredHome 75:ca78388cfd77 2220 display.SetKeyMap(myMap);
WiredHome 75:ca78388cfd77 2221 while (!pc.readable()) {
WiredHome 75:ca78388cfd77 2222 if (display.readable()) {
WiredHome 75:ca78388cfd77 2223 int key = display.getc();
WiredHome 75:ca78388cfd77 2224 bool longPress = key & 0x80;
WiredHome 75:ca78388cfd77 2225 display.SetTextCursor(0, 120);
WiredHome 75:ca78388cfd77 2226 display.printf("Long Press: %d\r\n", longPress);
WiredHome 75:ca78388cfd77 2227 display.printf(" Remapped: %c %02X\r\n", (key) ? key & 0x7F : ' ', key);
WiredHome 75:ca78388cfd77 2228 }
WiredHome 75:ca78388cfd77 2229 }
WiredHome 75:ca78388cfd77 2230 (void)pc.getc();
WiredHome 75:ca78388cfd77 2231 display.SetKeyMap();
WiredHome 75:ca78388cfd77 2232 pc.printf("\r\n");
WiredHome 75:ca78388cfd77 2233 }
WiredHome 75:ca78388cfd77 2234
WiredHome 23:a50ded45dbaf 2235 void TextCursorTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2236 {
WiredHome 75:ca78388cfd77 2237 const char * iCursor = "The I-Beam cursor should be visible for this text.\r\n";
WiredHome 75:ca78388cfd77 2238 const char * uCursor = "The Underscore cursor should be visible for this text.\r\n";
WiredHome 75:ca78388cfd77 2239 const char * bCursor = "The Block cursor should be visible for this text.\r\n";
WiredHome 37:f19b7e7449dc 2240 const char * bbCursor = "The Blinking Block cursor should be visible for this text.\r\n";
WiredHome 23:a50ded45dbaf 2241 const char * p;
WiredHome 100:0b084475d5a9 2242 int delay = 60;
WiredHome 73:f22a18707b5e 2243
WiredHome 41:2956a0a221e5 2244 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2245 pc.printf("Text Cursor Test\r\n");
WiredHome 73:f22a18707b5e 2246 else
WiredHome 41:2956a0a221e5 2247 delay = 0;
WiredHome 23:a50ded45dbaf 2248 display.background(Black);
WiredHome 23:a50ded45dbaf 2249 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2250 display.cls();
WiredHome 25:9556a3a9b7cc 2251 display.Backlight_u8(255);
WiredHome 100:0b084475d5a9 2252 display.puts("Text Cursor Test.");
WiredHome 73:f22a18707b5e 2253
WiredHome 23:a50ded45dbaf 2254 // visible, non-blinking
WiredHome 24:8ca861acf12d 2255 display.SetTextCursor(0,20);
WiredHome 53:86d24b9480b9 2256 display.SetTextCursorControl(RA8875::IBEAM, false);
WiredHome 24:8ca861acf12d 2257 p = iCursor;
WiredHome 23:a50ded45dbaf 2258 while (*p) {
WiredHome 24:8ca861acf12d 2259 display._putc(*p++);
WiredHome 41:2956a0a221e5 2260 wait_ms(delay);
WiredHome 24:8ca861acf12d 2261 }
WiredHome 24:8ca861acf12d 2262
WiredHome 53:86d24b9480b9 2263 display.SetTextCursorControl(RA8875::UNDER, false);
WiredHome 24:8ca861acf12d 2264 p = uCursor;
WiredHome 24:8ca861acf12d 2265 while (*p) {
WiredHome 24:8ca861acf12d 2266 display._putc(*p++);
WiredHome 41:2956a0a221e5 2267 wait_ms(delay);
WiredHome 23:a50ded45dbaf 2268 }
WiredHome 73:f22a18707b5e 2269
WiredHome 53:86d24b9480b9 2270 display.SetTextCursorControl(RA8875::BLOCK, false);
WiredHome 24:8ca861acf12d 2271 p = bCursor;
WiredHome 24:8ca861acf12d 2272 while (*p) {
WiredHome 24:8ca861acf12d 2273 display._putc(*p++);
WiredHome 41:2956a0a221e5 2274 wait_ms(delay);
WiredHome 24:8ca861acf12d 2275 }
WiredHome 24:8ca861acf12d 2276
WiredHome 53:86d24b9480b9 2277 display.SetTextCursorControl(RA8875::BLOCK, true);
WiredHome 24:8ca861acf12d 2278 p = bbCursor;
WiredHome 24:8ca861acf12d 2279 while (*p) {
WiredHome 24:8ca861acf12d 2280 display._putc(*p++);
WiredHome 41:2956a0a221e5 2281 wait_ms(delay);
WiredHome 24:8ca861acf12d 2282 }
WiredHome 41:2956a0a221e5 2283 wait_ms(delay * 20);
WiredHome 53:86d24b9480b9 2284 display.SetTextCursorControl(RA8875::NOCURSOR, false);
WiredHome 23:a50ded45dbaf 2285 }
WiredHome 23:a50ded45dbaf 2286
WiredHome 44:207594dece70 2287
WiredHome 23:a50ded45dbaf 2288 void BacklightTest(RA8875 & display, Serial & pc, float ramptime)
WiredHome 23:a50ded45dbaf 2289 {
WiredHome 29:422616aa04bd 2290 char buf[60];
WiredHome 41:2956a0a221e5 2291 unsigned int w = (ramptime * 1000)/ 256;
WiredHome 41:2956a0a221e5 2292 int delay = 200;
WiredHome 41:2956a0a221e5 2293
WiredHome 41:2956a0a221e5 2294 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2295 pc.printf("Backlight Test - ramp over %f sec.\r\n", ramptime);
WiredHome 41:2956a0a221e5 2296 else {
WiredHome 41:2956a0a221e5 2297 delay = 0;
WiredHome 41:2956a0a221e5 2298 w = 0;
WiredHome 41:2956a0a221e5 2299 }
WiredHome 23:a50ded45dbaf 2300 display.Backlight_u8(0);
WiredHome 29:422616aa04bd 2301 display.background(White);
WiredHome 23:a50ded45dbaf 2302 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2303 display.cls();
WiredHome 100:0b084475d5a9 2304 display.puts("RA8875 Backlight Test - Ramp up.");
WiredHome 41:2956a0a221e5 2305 wait_ms(delay);
WiredHome 38:38d503b4fad6 2306 for (int i=0; i <= 255; i++) {
WiredHome 29:422616aa04bd 2307 sprintf(buf, "%3d, %4d", i, w);
WiredHome 37:f19b7e7449dc 2308 display.puts(100,100,buf);
WiredHome 23:a50ded45dbaf 2309 display.Backlight_u8(i);
WiredHome 29:422616aa04bd 2310 wait_ms(w);
WiredHome 23:a50ded45dbaf 2311 }
WiredHome 23:a50ded45dbaf 2312 }
WiredHome 23:a50ded45dbaf 2313
WiredHome 44:207594dece70 2314
WiredHome 23:a50ded45dbaf 2315 void BacklightTest2(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2316 {
WiredHome 41:2956a0a221e5 2317 int delay = 20;
WiredHome 41:2956a0a221e5 2318
WiredHome 41:2956a0a221e5 2319 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2320 pc.printf("Backlight Test 2\r\n");
WiredHome 41:2956a0a221e5 2321 else
WiredHome 41:2956a0a221e5 2322 delay = 0;
WiredHome 41:2956a0a221e5 2323
WiredHome 23:a50ded45dbaf 2324 // Dim it out at the end of the tests.
WiredHome 37:f19b7e7449dc 2325 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2326 display.puts(0,0, "Ramp Backlight down.");
WiredHome 23:a50ded45dbaf 2327 // Ramp it off
WiredHome 23:a50ded45dbaf 2328 for (int i=255; i != 0; i--) {
WiredHome 23:a50ded45dbaf 2329 display.Backlight_u8(i);
WiredHome 41:2956a0a221e5 2330 wait_ms(delay);
WiredHome 23:a50ded45dbaf 2331 }
WiredHome 23:a50ded45dbaf 2332 display.Backlight_u8(0);
WiredHome 23:a50ded45dbaf 2333 }
WiredHome 23:a50ded45dbaf 2334
WiredHome 44:207594dece70 2335
WiredHome 23:a50ded45dbaf 2336 void ExternalFontTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2337 {
WiredHome 41:2956a0a221e5 2338 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2339 pc.printf("External Font Test\r\n");
WiredHome 23:a50ded45dbaf 2340 display.background(Black);
WiredHome 23:a50ded45dbaf 2341 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2342 display.cls();
WiredHome 100:0b084475d5a9 2343 display.puts("External Font Test.");
WiredHome 23:a50ded45dbaf 2344 display.Backlight(1);
WiredHome 37:f19b7e7449dc 2345
WiredHome 98:ecebed9b80b2 2346 display.SelectUserFont(BPG_Arial08x08);
WiredHome 73:f22a18707b5e 2347 display.puts(0,30, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
WiredHome 37:f19b7e7449dc 2348
WiredHome 98:ecebed9b80b2 2349 display.SelectUserFont(BPG_Arial20x20);
WiredHome 37:f19b7e7449dc 2350 display.puts("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
WiredHome 98:ecebed9b80b2 2351
WiredHome 98:ecebed9b80b2 2352 display.SelectUserFont();
WiredHome 73:f22a18707b5e 2353
WiredHome 37:f19b7e7449dc 2354 display.puts("Normal font again.");
WiredHome 37:f19b7e7449dc 2355 //display.window(0,0, display.width(), display.height());
WiredHome 23:a50ded45dbaf 2356 }
WiredHome 23:a50ded45dbaf 2357
WiredHome 44:207594dece70 2358
WiredHome 23:a50ded45dbaf 2359 void DOSColorTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2360 {
WiredHome 41:2956a0a221e5 2361 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2362 pc.printf("DOS Color Test\r\n");
WiredHome 23:a50ded45dbaf 2363 display.background(Black);
WiredHome 23:a50ded45dbaf 2364 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2365 display.cls();
WiredHome 100:0b084475d5a9 2366 display.puts("DOS Colors - Fore");
WiredHome 23:a50ded45dbaf 2367 display.puts(280,0, "Back");
WiredHome 23:a50ded45dbaf 2368 display.background(Gray);
WiredHome 23:a50ded45dbaf 2369 for (int i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 2370 display.foreground(display.DOSColor(i));
WiredHome 23:a50ded45dbaf 2371 display.puts(160, i*16, display.DOSColorNames(i));
WiredHome 23:a50ded45dbaf 2372 display.background(Black);
WiredHome 23:a50ded45dbaf 2373 }
WiredHome 23:a50ded45dbaf 2374 display.foreground(White);
WiredHome 23:a50ded45dbaf 2375 for (int i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 2376 display.background(display.DOSColor(i));
WiredHome 23:a50ded45dbaf 2377 display.puts(360, i*16, display.DOSColorNames(i));
WiredHome 23:a50ded45dbaf 2378 display.foreground(White);
WiredHome 23:a50ded45dbaf 2379 }
WiredHome 23:a50ded45dbaf 2380 }
WiredHome 23:a50ded45dbaf 2381
WiredHome 44:207594dece70 2382
WiredHome 23:a50ded45dbaf 2383 void WebColorTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2384 {
WiredHome 41:2956a0a221e5 2385 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2386 pc.printf("Web Color Test\r\n");
WiredHome 23:a50ded45dbaf 2387 display.background(Black);
WiredHome 23:a50ded45dbaf 2388 display.foreground(Blue);
WiredHome 32:0e4f2ae512e2 2389 display.window(0,0, display.width(), display.height());
WiredHome 23:a50ded45dbaf 2390 display.cls();
WiredHome 59:fb40aad4efd4 2391 display.SetTextFontSize(1,1);
WiredHome 59:fb40aad4efd4 2392 display.puts(200,0, "Web Color Test");
WiredHome 59:fb40aad4efd4 2393 display.SetTextCursor(0,0);
WiredHome 59:fb40aad4efd4 2394 display.puts(" ");
WiredHome 59:fb40aad4efd4 2395 for (int i=0; i<16; i++)
WiredHome 59:fb40aad4efd4 2396 display.printf("%X", i&0xF);
WiredHome 59:fb40aad4efd4 2397 display.puts("\r\n0 ");
WiredHome 23:a50ded45dbaf 2398 for (int i=0; i<sizeof(WebColors)/sizeof(WebColors[0]); i++) {
WiredHome 23:a50ded45dbaf 2399 display.background(WebColors[i]);
WiredHome 23:a50ded45dbaf 2400 display.puts(" ");
WiredHome 59:fb40aad4efd4 2401 if (i % 16 == 15 && i < 255) {
WiredHome 59:fb40aad4efd4 2402 display.printf("\r\n%X ", ((i+1)/16));
WiredHome 59:fb40aad4efd4 2403 }
WiredHome 23:a50ded45dbaf 2404 }
WiredHome 23:a50ded45dbaf 2405 display.SetTextFontSize(1,1);
WiredHome 23:a50ded45dbaf 2406 }
WiredHome 23:a50ded45dbaf 2407
WiredHome 44:207594dece70 2408
WiredHome 37:f19b7e7449dc 2409 void PixelTest(RA8875 & display, Serial & pc)
WiredHome 37:f19b7e7449dc 2410 {
WiredHome 37:f19b7e7449dc 2411 int i, c, x, y;
WiredHome 37:f19b7e7449dc 2412
WiredHome 41:2956a0a221e5 2413 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2414 pc.printf("Pixel Test\r\n");
WiredHome 37:f19b7e7449dc 2415 display.background(Black);
WiredHome 37:f19b7e7449dc 2416 display.foreground(Blue);
WiredHome 37:f19b7e7449dc 2417 display.cls();
WiredHome 100:0b084475d5a9 2418 display.puts("Pixel Test");
WiredHome 37:f19b7e7449dc 2419 for (i=0; i<1000; i++) {
WiredHome 37:f19b7e7449dc 2420 x = rand() % 480;
WiredHome 37:f19b7e7449dc 2421 y = 16 + rand() % (272-16);
WiredHome 37:f19b7e7449dc 2422 c = rand() % 16;
WiredHome 37:f19b7e7449dc 2423 //pc.printf(" (%d,%d) - %d\r\n", x,y,r1);
WiredHome 37:f19b7e7449dc 2424 display.pixel(x,y, display.DOSColor(c));
WiredHome 37:f19b7e7449dc 2425 }
WiredHome 37:f19b7e7449dc 2426 }
WiredHome 37:f19b7e7449dc 2427
WiredHome 44:207594dece70 2428
WiredHome 23:a50ded45dbaf 2429 void LineTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2430 {
WiredHome 23:a50ded45dbaf 2431 int i, x, y, x2, y2;
WiredHome 23:a50ded45dbaf 2432
WiredHome 41:2956a0a221e5 2433 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2434 pc.printf("Line Test\r\n");
WiredHome 23:a50ded45dbaf 2435 display.background(Black);
WiredHome 23:a50ded45dbaf 2436 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2437 display.cls();
WiredHome 100:0b084475d5a9 2438 display.puts("Line Test");
WiredHome 23:a50ded45dbaf 2439 for (i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 2440 // Lines
WiredHome 23:a50ded45dbaf 2441 x = rand() % 480;
WiredHome 23:a50ded45dbaf 2442 y = rand() % 272;
WiredHome 23:a50ded45dbaf 2443 x2 = rand() % 480;
WiredHome 23:a50ded45dbaf 2444 y2 = rand() % 272;
WiredHome 23:a50ded45dbaf 2445 display.line(x,y, x2,y2, display.DOSColor(i));
WiredHome 23:a50ded45dbaf 2446 }
WiredHome 62:ba5d33438fda 2447 display.foreground(BrightRed);
WiredHome 62:ba5d33438fda 2448 display.foreground(BrightGreen);
WiredHome 62:ba5d33438fda 2449 display.foreground(BrightBlue);
WiredHome 62:ba5d33438fda 2450 display.line(55,50, 79,74, BrightRed);
WiredHome 62:ba5d33438fda 2451 display.line(57,50, 81,74, BrightGreen);
WiredHome 62:ba5d33438fda 2452 display.line(59,50, 83,74, BrightBlue);
WiredHome 62:ba5d33438fda 2453 // horz
WiredHome 62:ba5d33438fda 2454 display.line(30,40, 32,40, BrightRed);
WiredHome 62:ba5d33438fda 2455 display.line(30,42, 32,42, BrightGreen);
WiredHome 62:ba5d33438fda 2456 display.line(30,44, 32,44, BrightBlue);
WiredHome 62:ba5d33438fda 2457 // vert
WiredHome 62:ba5d33438fda 2458 display.line(20,40, 20,42, BrightRed);
WiredHome 62:ba5d33438fda 2459 display.line(22,40, 22,42, BrightGreen);
WiredHome 62:ba5d33438fda 2460 display.line(24,40, 24,42, BrightBlue);
WiredHome 62:ba5d33438fda 2461 // compare point to line-point
WiredHome 62:ba5d33438fda 2462 display.pixel(20,50, BrightRed);
WiredHome 62:ba5d33438fda 2463 display.pixel(22,50, BrightGreen);
WiredHome 62:ba5d33438fda 2464 display.pixel(24,50, BrightBlue);
WiredHome 62:ba5d33438fda 2465 display.line(20,52, 20,52, BrightRed);
WiredHome 62:ba5d33438fda 2466 display.line(22,52, 22,52, BrightGreen);
WiredHome 62:ba5d33438fda 2467 display.line(24,52, 24,52, BrightBlue);
WiredHome 73:f22a18707b5e 2468
WiredHome 62:ba5d33438fda 2469 // point
WiredHome 62:ba5d33438fda 2470 display.line(50,50, 50,50, Red);
WiredHome 62:ba5d33438fda 2471 display.line(52,52, 52,52, Green);
WiredHome 62:ba5d33438fda 2472 display.line(54,54, 54,54, Blue);
WiredHome 62:ba5d33438fda 2473 display.line(60,60, 60,60, BrightRed);
WiredHome 62:ba5d33438fda 2474 display.line(62,62, 62,62, BrightGreen);
WiredHome 62:ba5d33438fda 2475 display.line(64,64, 64,64, BrightBlue);
WiredHome 62:ba5d33438fda 2476 display.line(70,70, 70,70, DarkRed);
WiredHome 62:ba5d33438fda 2477 display.line(72,72, 72,72, DarkGreen);
WiredHome 62:ba5d33438fda 2478 display.line(74,74, 74,74, DarkBlue);
WiredHome 23:a50ded45dbaf 2479 }
WiredHome 23:a50ded45dbaf 2480
WiredHome 44:207594dece70 2481
WiredHome 23:a50ded45dbaf 2482 void RectangleTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2483 {
WiredHome 23:a50ded45dbaf 2484 int i, x1,y1, x2,y2;
WiredHome 23:a50ded45dbaf 2485
WiredHome 41:2956a0a221e5 2486 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2487 pc.printf("Rectangle Test\r\n");
WiredHome 23:a50ded45dbaf 2488 display.background(Black);
WiredHome 23:a50ded45dbaf 2489 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2490 display.cls();
WiredHome 100:0b084475d5a9 2491 display.puts("Rectangle Test");
WiredHome 23:a50ded45dbaf 2492 for (i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 2493 x1 = rand() % 240;
WiredHome 23:a50ded45dbaf 2494 y1 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2495 x2 = rand() % 240;
WiredHome 23:a50ded45dbaf 2496 y2 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2497 display.rect(x1,y1, x2,y2, display.DOSColor(i));
WiredHome 23:a50ded45dbaf 2498
WiredHome 23:a50ded45dbaf 2499 x1 = 240 + rand() % 240;
WiredHome 23:a50ded45dbaf 2500 y1 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2501 x2 = 240 + rand() % 240;
WiredHome 23:a50ded45dbaf 2502 y2 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2503 display.rect(x1,y1, x2,y2, FILL);
WiredHome 23:a50ded45dbaf 2504 }
WiredHome 23:a50ded45dbaf 2505 }
WiredHome 23:a50ded45dbaf 2506
WiredHome 44:207594dece70 2507
WiredHome 44:207594dece70 2508 void LayerTest(RA8875 & display, Serial & pc)
WiredHome 44:207594dece70 2509 {
WiredHome 44:207594dece70 2510 loc_t i, x1,y1, x2,y2, r1,r2;
WiredHome 44:207594dece70 2511
WiredHome 44:207594dece70 2512 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2513 pc.printf("Layer Test\r\n");
WiredHome 44:207594dece70 2514
WiredHome 50:2c4f474a2453 2515 display.SelectDrawingLayer(0);
WiredHome 44:207594dece70 2516 display.background(Black);
WiredHome 44:207594dece70 2517 display.foreground(Blue);
WiredHome 44:207594dece70 2518 display.cls();
WiredHome 100:0b084475d5a9 2519 display.puts("Layer 0");
WiredHome 44:207594dece70 2520 for (i=0; i<16; i++) {
WiredHome 44:207594dece70 2521 x1 = rand() % 240;
WiredHome 44:207594dece70 2522 y1 = 50 + rand() % 200;
WiredHome 44:207594dece70 2523 x2 = x1 + rand() % 100;
WiredHome 44:207594dece70 2524 y2 = y1 + rand() % 100;
WiredHome 44:207594dece70 2525 r1 = rand() % (x2 - x1)/2;
WiredHome 44:207594dece70 2526 r2 = rand() % (y2 - y1)/2;
WiredHome 44:207594dece70 2527 display.roundrect(x1,y1, x2,y2, r1,r2, display.DOSColor(i));
WiredHome 44:207594dece70 2528 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2529 wait_ms(20);
WiredHome 44:207594dece70 2530 }
WiredHome 44:207594dece70 2531 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2532 wait_ms(1000);
WiredHome 44:207594dece70 2533
WiredHome 50:2c4f474a2453 2534 display.SelectDrawingLayer(1);
WiredHome 44:207594dece70 2535 display.background(Black);
WiredHome 44:207594dece70 2536 display.foreground(Yellow);
WiredHome 44:207594dece70 2537 display.cls();
WiredHome 44:207594dece70 2538 display.puts(240,0, "Layer 1");
WiredHome 44:207594dece70 2539 for (i=0; i<16; i++) {
WiredHome 44:207594dece70 2540 x1 = 300 + rand() % 100;
WiredHome 44:207594dece70 2541 y1 = 70 + rand() % 200;
WiredHome 44:207594dece70 2542 r1 = rand() % min(y1 - 20, 100);
WiredHome 44:207594dece70 2543 display.circle(x1,y1,r1, display.DOSColor(i));
WiredHome 44:207594dece70 2544 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2545 wait_ms(20);
WiredHome 44:207594dece70 2546 }
WiredHome 56:7a85d226ad0d 2547 display.SetLayerMode(RA8875::ShowLayer1); // Show it after the build-up
WiredHome 44:207594dece70 2548 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2549 wait_ms(2000);
WiredHome 44:207594dece70 2550
WiredHome 50:2c4f474a2453 2551 display.SelectDrawingLayer(0);
WiredHome 56:7a85d226ad0d 2552 display.SetLayerMode(RA8875::ShowLayer0); // Show Layer 0 again
WiredHome 44:207594dece70 2553 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2554 wait_ms(1000);
WiredHome 53:86d24b9480b9 2555 display.SetLayerMode(RA8875::TransparentMode); // Transparent mode
WiredHome 44:207594dece70 2556 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2557 wait_ms(1000);
WiredHome 44:207594dece70 2558 for (i=0; i<=8; i++) {
WiredHome 44:207594dece70 2559 display.SetLayerTransparency(i, 8-i);
WiredHome 44:207594dece70 2560 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2561 wait_ms(200);
WiredHome 44:207594dece70 2562 }
WiredHome 73:f22a18707b5e 2563
WiredHome 44:207594dece70 2564 // Restore before we exit
WiredHome 44:207594dece70 2565 display.SetLayerTransparency(0, 0);
WiredHome 56:7a85d226ad0d 2566 display.SetLayerMode(RA8875::ShowLayer0); // Restore to layer 0
WiredHome 44:207594dece70 2567 }
WiredHome 44:207594dece70 2568
WiredHome 44:207594dece70 2569
WiredHome 23:a50ded45dbaf 2570 void RoundRectTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2571 {
WiredHome 37:f19b7e7449dc 2572 loc_t i, x1,y1, x2,y2, r1,r2;
WiredHome 23:a50ded45dbaf 2573
WiredHome 41:2956a0a221e5 2574 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2575 pc.printf("Round Rectangle Test\r\n");
WiredHome 23:a50ded45dbaf 2576 display.background(Black);
WiredHome 23:a50ded45dbaf 2577 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2578 display.cls();
WiredHome 100:0b084475d5a9 2579 display.puts("Rounded Rectangle Test");
WiredHome 73:f22a18707b5e 2580
WiredHome 23:a50ded45dbaf 2581 for (i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 2582 x1 = rand() % 240;
WiredHome 23:a50ded45dbaf 2583 y1 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2584 x2 = x1 + rand() % 100;
WiredHome 23:a50ded45dbaf 2585 y2 = y1 + rand() % 100;
WiredHome 23:a50ded45dbaf 2586 r1 = rand() % (x2 - x1)/2;
WiredHome 23:a50ded45dbaf 2587 r2 = rand() % (y2 - y1)/2;
WiredHome 23:a50ded45dbaf 2588 display.roundrect(x1,y1, x2,y2, 5,8, display.DOSColor(i));
WiredHome 23:a50ded45dbaf 2589
WiredHome 23:a50ded45dbaf 2590 x1 = 240 + rand() % 240;
WiredHome 23:a50ded45dbaf 2591 y1 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2592 x2 = x1 + rand() % 100;
WiredHome 23:a50ded45dbaf 2593 y2 = y1 + rand() % 100;
WiredHome 23:a50ded45dbaf 2594 r1 = rand() % (x2 - x1)/2;
WiredHome 23:a50ded45dbaf 2595 r2 = rand() % (y2 - y1)/2;
WiredHome 23:a50ded45dbaf 2596 display.roundrect(x1,y1, x2,y2, r1,r2, FILL);
WiredHome 23:a50ded45dbaf 2597 }
WiredHome 23:a50ded45dbaf 2598 }
WiredHome 23:a50ded45dbaf 2599
WiredHome 44:207594dece70 2600
WiredHome 23:a50ded45dbaf 2601 void TriangleTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2602 {
WiredHome 23:a50ded45dbaf 2603 int i, x1, y1, x2, y2, x3, y3;
WiredHome 23:a50ded45dbaf 2604
WiredHome 41:2956a0a221e5 2605 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2606 pc.printf("Triangle Test\r\n");
WiredHome 23:a50ded45dbaf 2607 display.background(Black);
WiredHome 23:a50ded45dbaf 2608 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2609 display.cls();
WiredHome 23:a50ded45dbaf 2610 display.puts(0,0, "Triangle Test");
WiredHome 23:a50ded45dbaf 2611
WiredHome 23:a50ded45dbaf 2612 x1 = 150;
WiredHome 23:a50ded45dbaf 2613 y1 = 2;
WiredHome 23:a50ded45dbaf 2614 x2 = 190;
WiredHome 23:a50ded45dbaf 2615 y2 = 7;
WiredHome 23:a50ded45dbaf 2616 x3 = 170;
WiredHome 23:a50ded45dbaf 2617 y3 = 16;
WiredHome 23:a50ded45dbaf 2618 display.triangle(x1,y1, x2,y2, x3,y3);
WiredHome 23:a50ded45dbaf 2619
WiredHome 23:a50ded45dbaf 2620 x1 = 200;
WiredHome 23:a50ded45dbaf 2621 y1 = 2;
WiredHome 23:a50ded45dbaf 2622 x2 = 240;
WiredHome 23:a50ded45dbaf 2623 y2 = 7;
WiredHome 23:a50ded45dbaf 2624 x3 = 220;
WiredHome 23:a50ded45dbaf 2625 y3 = 16;
WiredHome 23:a50ded45dbaf 2626 display.filltriangle(x1,y1, x2,y2, x3,y3, BrightRed);
WiredHome 23:a50ded45dbaf 2627
WiredHome 23:a50ded45dbaf 2628 x1 = 300;
WiredHome 23:a50ded45dbaf 2629 y1 = 2;
WiredHome 23:a50ded45dbaf 2630 x2 = 340;
WiredHome 23:a50ded45dbaf 2631 y2 = 7;
WiredHome 23:a50ded45dbaf 2632 x3 = 320;
WiredHome 23:a50ded45dbaf 2633 y3 = 16;
WiredHome 23:a50ded45dbaf 2634 display.triangle(x1,y1, x2,y2, x3,y3, NOFILL);
WiredHome 23:a50ded45dbaf 2635
WiredHome 23:a50ded45dbaf 2636 x1 = 400;
WiredHome 23:a50ded45dbaf 2637 y1 = 2;
WiredHome 23:a50ded45dbaf 2638 x2 = 440;
WiredHome 23:a50ded45dbaf 2639 y2 = 7;
WiredHome 23:a50ded45dbaf 2640 x3 = 420;
WiredHome 23:a50ded45dbaf 2641 y3 = 16;
WiredHome 23:a50ded45dbaf 2642 display.triangle(x1,y1, x2,y2, x3,y3, Blue);
WiredHome 23:a50ded45dbaf 2643
WiredHome 23:a50ded45dbaf 2644 for (i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 2645 x1 = rand() % 240;
WiredHome 23:a50ded45dbaf 2646 y1 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2647 x2 = rand() % 240;
WiredHome 23:a50ded45dbaf 2648 y2 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2649 x3 = rand() % 240;
WiredHome 23:a50ded45dbaf 2650 y3 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2651 display.triangle(x1,y1, x2,y2, x3,y3, display.DOSColor(i));
WiredHome 23:a50ded45dbaf 2652 x1 = 240 + rand() % 240;
WiredHome 23:a50ded45dbaf 2653 y1 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2654 x2 = 240 + rand() % 240;
WiredHome 23:a50ded45dbaf 2655 y2 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2656 x3 = 240 + rand() % 240;
WiredHome 23:a50ded45dbaf 2657 y3 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2658 display.triangle(x1,y1, x2,y2, x3,y3, FILL);
WiredHome 23:a50ded45dbaf 2659 }
WiredHome 23:a50ded45dbaf 2660 }
WiredHome 23:a50ded45dbaf 2661
WiredHome 44:207594dece70 2662
WiredHome 23:a50ded45dbaf 2663 void CircleTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2664 {
WiredHome 23:a50ded45dbaf 2665 int i, x, y, r1;
WiredHome 23:a50ded45dbaf 2666
WiredHome 41:2956a0a221e5 2667 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2668 pc.printf("Circle Test\r\n");
WiredHome 23:a50ded45dbaf 2669 display.background(Black);
WiredHome 23:a50ded45dbaf 2670 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2671 display.cls();
WiredHome 100:0b084475d5a9 2672 display.puts("Circle Test");
WiredHome 23:a50ded45dbaf 2673 for (i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 2674 x = 100 + rand() % 100;
WiredHome 23:a50ded45dbaf 2675 y = 70 + rand() % 200;
WiredHome 23:a50ded45dbaf 2676 r1 = rand() % min(y - 20, 100);
WiredHome 23:a50ded45dbaf 2677 //pc.printf(" (%d,%d) - %d\r\n", x,y,r1);
WiredHome 23:a50ded45dbaf 2678 display.circle(x,y,r1, display.DOSColor(i));
WiredHome 23:a50ded45dbaf 2679
WiredHome 23:a50ded45dbaf 2680 x = 300 + rand() % 100;
WiredHome 23:a50ded45dbaf 2681 y = 70 + rand() % 200;
WiredHome 23:a50ded45dbaf 2682 r1 = rand() % min(y - 20, 100);
WiredHome 23:a50ded45dbaf 2683 //pc.printf(" (%d,%d) - %d FILL\r\n", x,y,r1);
WiredHome 23:a50ded45dbaf 2684 display.circle(x,y,r1, display.DOSColor(i), FILL);
WiredHome 23:a50ded45dbaf 2685 }
WiredHome 23:a50ded45dbaf 2686 }
WiredHome 23:a50ded45dbaf 2687
WiredHome 44:207594dece70 2688
WiredHome 23:a50ded45dbaf 2689 void EllipseTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2690 {
WiredHome 23:a50ded45dbaf 2691 int i,x,y,r1,r2;
WiredHome 23:a50ded45dbaf 2692
WiredHome 41:2956a0a221e5 2693 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2694 pc.printf("Ellipse Test\r\n");
WiredHome 23:a50ded45dbaf 2695 display.background(Black);
WiredHome 23:a50ded45dbaf 2696 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2697 display.cls();
WiredHome 100:0b084475d5a9 2698 display.puts("Ellipse Test");
WiredHome 23:a50ded45dbaf 2699 for (i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 2700 x = 100 + rand() % 100;
WiredHome 23:a50ded45dbaf 2701 y = 70 + rand() % 200;
WiredHome 23:a50ded45dbaf 2702 r1 = rand() % min(y - 20, 100);
WiredHome 23:a50ded45dbaf 2703 r2 = rand() % min(y - 20, 100);
WiredHome 23:a50ded45dbaf 2704 display.ellipse(x,y,r1,r2, display.DOSColor(i));
WiredHome 23:a50ded45dbaf 2705
WiredHome 23:a50ded45dbaf 2706 x = 300 + rand() % 100;
WiredHome 23:a50ded45dbaf 2707 y = 70 + rand() % 200;
WiredHome 23:a50ded45dbaf 2708 r1 = rand() % min(y - 20, 100);
WiredHome 23:a50ded45dbaf 2709 r2 = rand() % min(y - 20, 100);
WiredHome 23:a50ded45dbaf 2710 display.ellipse(x,y,r1,r2, FILL);
WiredHome 23:a50ded45dbaf 2711 }
WiredHome 23:a50ded45dbaf 2712 }
WiredHome 23:a50ded45dbaf 2713
WiredHome 44:207594dece70 2714
WiredHome 37:f19b7e7449dc 2715 void TestGraphicsBitmap(RA8875 & display, Serial & pc)
WiredHome 37:f19b7e7449dc 2716 {
WiredHome 37:f19b7e7449dc 2717 LocalFileSystem local("local");
WiredHome 41:2956a0a221e5 2718 if (!SuppressSlowStuff)
WiredHome 73:f22a18707b5e 2719 pc.printf("Bitmap File Load\r\n");
WiredHome 37:f19b7e7449dc 2720 display.background(Black);
WiredHome 37:f19b7e7449dc 2721 display.foreground(Blue);
WiredHome 37:f19b7e7449dc 2722 display.cls();
WiredHome 100:0b084475d5a9 2723 display.puts("Graphics Test, loading /local/TestPat.bmp");
WiredHome 37:f19b7e7449dc 2724 wait(3);
WiredHome 37:f19b7e7449dc 2725
WiredHome 37:f19b7e7449dc 2726 int r = display.RenderBitmapFile(0,0, "/local/TestPat.bmp");
WiredHome 59:fb40aad4efd4 2727 if (!SuppressSlowStuff)
WiredHome 59:fb40aad4efd4 2728 pc.printf(" returned %d\r\n", r);
WiredHome 37:f19b7e7449dc 2729 }
WiredHome 37:f19b7e7449dc 2730
WiredHome 44:207594dece70 2731
WiredHome 77:9206c13aa527 2732 void TouchPanelTest(RA8875 & display, Serial & pc)
WiredHome 77:9206c13aa527 2733 {
WiredHome 77:9206c13aa527 2734 Timer t;
WiredHome 98:ecebed9b80b2 2735 int x, y;
WiredHome 78:faf49c381591 2736 tpMatrix_t calmatrix;
WiredHome 78:faf49c381591 2737
WiredHome 77:9206c13aa527 2738 display.background(Black);
WiredHome 77:9206c13aa527 2739 display.foreground(Blue);
WiredHome 77:9206c13aa527 2740 display.cls();
WiredHome 100:0b084475d5a9 2741 display.puts("Touch Panel Test\r\n");
WiredHome 78:faf49c381591 2742 pc.printf("Touch Panel Test\r\n");
WiredHome 77:9206c13aa527 2743 display.TouchPanelInit();
WiredHome 78:faf49c381591 2744 pc.printf(" TP: c - calibrate, r - restore, t - test\r\n");
WiredHome 78:faf49c381591 2745 int c = pc.getc();
WiredHome 78:faf49c381591 2746 if (c == 'c') {
WiredHome 78:faf49c381591 2747 point_t pTest[3] =
WiredHome 78:faf49c381591 2748 { { 50, 50 }, {450, 150}, {225,250} };
WiredHome 78:faf49c381591 2749 point_t pSample[3];
WiredHome 78:faf49c381591 2750 for (int i=0; i<3; i++) {
WiredHome 78:faf49c381591 2751 display.foreground(Blue);
WiredHome 78:faf49c381591 2752 display.printf(" (%3d,%3d) => ", pTest[i].x, pTest[i].y);
WiredHome 78:faf49c381591 2753 display.line(pTest[i].x-10, pTest[i].y, pTest[i].x+10, pTest[i].y, White);
WiredHome 78:faf49c381591 2754 display.line(pTest[i].x, pTest[i].y-10, pTest[i].x, pTest[i].y+10, White);
WiredHome 79:544eb4964795 2755 while (!display.TouchPanelA2DFiltered(&x, &y))
WiredHome 78:faf49c381591 2756 wait_ms(20);
WiredHome 78:faf49c381591 2757 pSample[i].x = x;
WiredHome 78:faf49c381591 2758 pSample[i].y = y;
WiredHome 78:faf49c381591 2759 display.line(pTest[i].x-10, pTest[i].y, pTest[i].x+10, pTest[i].y, Black);
WiredHome 78:faf49c381591 2760 display.line(pTest[i].x, pTest[i].y-10, pTest[i].x, pTest[i].y+10, Black);
WiredHome 78:faf49c381591 2761 display.foreground(Blue);
WiredHome 78:faf49c381591 2762 display.printf(" (%4d,%4d)\r\n", x,y);
WiredHome 79:544eb4964795 2763 while (display.TouchPanelA2DFiltered(&x, &y))
WiredHome 78:faf49c381591 2764 wait_ms(20);
WiredHome 78:faf49c381591 2765 wait(2);
WiredHome 78:faf49c381591 2766 }
WiredHome 81:01da2e34283d 2767 display.TouchPanelComputeCalibration(pTest, pSample, &calmatrix);
WiredHome 78:faf49c381591 2768 display.printf(" Writing calibration to tpcal.cfg\r\n");
WiredHome 78:faf49c381591 2769 FILE * fh = fopen("/local/tpcal.cfg", "wb");
WiredHome 78:faf49c381591 2770 if (fh) {
WiredHome 78:faf49c381591 2771 fwrite(&calmatrix, sizeof(calmatrix), 1, fh);
WiredHome 78:faf49c381591 2772 fclose(fh);
WiredHome 78:faf49c381591 2773 }
WiredHome 78:faf49c381591 2774 display.printf(" Calibration is complete.");
WiredHome 78:faf49c381591 2775 } else if (c == 'r') {
WiredHome 78:faf49c381591 2776 display.printf(" Reading calibration from tpcal.cfg\r\n");
WiredHome 78:faf49c381591 2777 FILE * fh = fopen("/local/tpcal.cfg", "rb");
WiredHome 78:faf49c381591 2778 if (fh) {
WiredHome 78:faf49c381591 2779 fread(&calmatrix, sizeof(calmatrix), 1, fh);
WiredHome 78:faf49c381591 2780 fclose(fh);
WiredHome 78:faf49c381591 2781 }
WiredHome 78:faf49c381591 2782 display.printf(" Calibration is complete.");
WiredHome 78:faf49c381591 2783 display.TouchPanelSetMatrix(&calmatrix);
WiredHome 77:9206c13aa527 2784 }
WiredHome 77:9206c13aa527 2785 t.start();
WiredHome 77:9206c13aa527 2786 do {
WiredHome 77:9206c13aa527 2787 point_t point = {0, 0};
WiredHome 79:544eb4964795 2788 if (display.TouchPanelReadable(&point)) {
WiredHome 77:9206c13aa527 2789 display.pixel(point.x, point.y, Red);
WiredHome 77:9206c13aa527 2790 }
WiredHome 77:9206c13aa527 2791 } while (t.read_ms() < 30000);
WiredHome 77:9206c13aa527 2792 pc.printf(">");
WiredHome 77:9206c13aa527 2793 }
WiredHome 77:9206c13aa527 2794
WiredHome 77:9206c13aa527 2795
WiredHome 41:2956a0a221e5 2796 void SpeedTest(RA8875 & display, Serial & pc)
WiredHome 41:2956a0a221e5 2797 {
WiredHome 41:2956a0a221e5 2798 Timer t;
WiredHome 41:2956a0a221e5 2799 SuppressSlowStuff = true;
WiredHome 41:2956a0a221e5 2800 pc.printf("\r\nSpeedTest disables delays, runs tests, reports overall time.\r\n");
WiredHome 41:2956a0a221e5 2801 t.start();
WiredHome 41:2956a0a221e5 2802 // do stuff fast
WiredHome 41:2956a0a221e5 2803 TextCursorTest(display, pc);
WiredHome 49:c5182231d1b9 2804 TextWrapTest(display, pc);
WiredHome 41:2956a0a221e5 2805 BacklightTest(display, pc, 0);
WiredHome 41:2956a0a221e5 2806 BacklightTest2(display, pc);
WiredHome 41:2956a0a221e5 2807 ExternalFontTest(display, pc);
WiredHome 41:2956a0a221e5 2808 DOSColorTest(display, pc);
WiredHome 41:2956a0a221e5 2809 WebColorTest(display, pc);
WiredHome 41:2956a0a221e5 2810 PixelTest(display, pc);
WiredHome 41:2956a0a221e5 2811 LineTest(display, pc);
WiredHome 41:2956a0a221e5 2812 RectangleTest(display, pc);
WiredHome 41:2956a0a221e5 2813 RoundRectTest(display, pc);
WiredHome 41:2956a0a221e5 2814 TriangleTest(display, pc);
WiredHome 41:2956a0a221e5 2815 CircleTest(display, pc);
WiredHome 41:2956a0a221e5 2816 EllipseTest(display, pc);
WiredHome 44:207594dece70 2817 LayerTest(display, pc);
WiredHome 41:2956a0a221e5 2818 //TestGraphicsBitmap(display, pc);
WiredHome 41:2956a0a221e5 2819 pc.printf("SpeedTest completed in %d msec\r\n", t.read_ms());
WiredHome 73:f22a18707b5e 2820 #ifdef PERF_METRICS
WiredHome 41:2956a0a221e5 2821 display.ReportPerformance(pc);
WiredHome 73:f22a18707b5e 2822 #endif
WiredHome 41:2956a0a221e5 2823 SuppressSlowStuff = false;
WiredHome 41:2956a0a221e5 2824 }
WiredHome 41:2956a0a221e5 2825
WiredHome 44:207594dece70 2826
WiredHome 41:2956a0a221e5 2827 void PrintScreen(RA8875 & display, Serial & pc)
WiredHome 41:2956a0a221e5 2828 {
WiredHome 41:2956a0a221e5 2829 if (!SuppressSlowStuff)
WiredHome 73:f22a18707b5e 2830 pc.printf("PrintScreen\r\n");
WiredHome 41:2956a0a221e5 2831 display.PrintScreen( 0,0, 480,272, "/local/Capture.bmp");
WiredHome 41:2956a0a221e5 2832 }
WiredHome 41:2956a0a221e5 2833
WiredHome 44:207594dece70 2834
WiredHome 23:a50ded45dbaf 2835 void RunTestSet(RA8875 & lcd, Serial & pc)
WiredHome 23:a50ded45dbaf 2836 {
WiredHome 23:a50ded45dbaf 2837 int q = 0;
WiredHome 23:a50ded45dbaf 2838 int automode = 0;
WiredHome 49:c5182231d1b9 2839 const unsigned char modelist[] = "BDWtGLlFROTPCEbw"; // auto-test in this order.
WiredHome 23:a50ded45dbaf 2840
WiredHome 23:a50ded45dbaf 2841 while(1) {
WiredHome 23:a50ded45dbaf 2842 pc.printf("\r\n"
WiredHome 41:2956a0a221e5 2843 "B - Backlight up b - backlight dim\r\n"
WiredHome 41:2956a0a221e5 2844 "D - DOS Colors W - Web Colors\r\n"
WiredHome 41:2956a0a221e5 2845 "t - text cursor G - Graphics Bitmap\r\n"
WiredHome 41:2956a0a221e5 2846 "L - Lines F - external Font\r\n"
WiredHome 41:2956a0a221e5 2847 "R - Rectangles O - rOund rectangles\r\n"
WiredHome 41:2956a0a221e5 2848 "T - Triangles P - Pixels \r\n"
WiredHome 41:2956a0a221e5 2849 "C - Circles E - Ellipses\r\n"
WiredHome 41:2956a0a221e5 2850 "A - Auto Test mode S - Speed Test\r\n"
WiredHome 77:9206c13aa527 2851 "K - Keypad Test s - touch screen test\r\n"
WiredHome 41:2956a0a221e5 2852 "p - print screen r - reset \r\n"
WiredHome 49:c5182231d1b9 2853 "l - layer test w - wrapping text \r\n"
WiredHome 73:f22a18707b5e 2854 #ifdef PERF_METRICS
WiredHome 41:2956a0a221e5 2855 "0 - clear performance 1 - report performance\r\n"
WiredHome 73:f22a18707b5e 2856 #endif
WiredHome 23:a50ded45dbaf 2857 "> ");
WiredHome 23:a50ded45dbaf 2858 if (automode == -1 || pc.readable()) {
WiredHome 23:a50ded45dbaf 2859 automode = -1;
WiredHome 37:f19b7e7449dc 2860 q = pc.getc();
WiredHome 37:f19b7e7449dc 2861 while (pc.readable())
WiredHome 37:f19b7e7449dc 2862 pc.getc();
WiredHome 23:a50ded45dbaf 2863 } else if (automode >= 0) {
WiredHome 23:a50ded45dbaf 2864 q = modelist[automode];
WiredHome 23:a50ded45dbaf 2865 }
WiredHome 23:a50ded45dbaf 2866 switch(q) {
WiredHome 73:f22a18707b5e 2867 #ifdef PERF_METRICS
WiredHome 41:2956a0a221e5 2868 case '0':
WiredHome 41:2956a0a221e5 2869 lcd.ClearPerformance();
WiredHome 41:2956a0a221e5 2870 break;
WiredHome 41:2956a0a221e5 2871 case '1':
WiredHome 41:2956a0a221e5 2872 lcd.ReportPerformance(pc);
WiredHome 41:2956a0a221e5 2873 break;
WiredHome 73:f22a18707b5e 2874 #endif
WiredHome 23:a50ded45dbaf 2875 case 'A':
WiredHome 23:a50ded45dbaf 2876 automode = 0;
WiredHome 23:a50ded45dbaf 2877 break;
WiredHome 23:a50ded45dbaf 2878 case 'B':
WiredHome 41:2956a0a221e5 2879 BacklightTest(lcd, pc, 2);
WiredHome 23:a50ded45dbaf 2880 break;
WiredHome 23:a50ded45dbaf 2881 case 'b':
WiredHome 23:a50ded45dbaf 2882 BacklightTest2(lcd, pc);
WiredHome 23:a50ded45dbaf 2883 break;
WiredHome 23:a50ded45dbaf 2884 case 'D':
WiredHome 23:a50ded45dbaf 2885 DOSColorTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2886 break;
WiredHome 75:ca78388cfd77 2887 case 'K':
WiredHome 75:ca78388cfd77 2888 KeyPadTest(lcd, pc);
WiredHome 75:ca78388cfd77 2889 break;
WiredHome 23:a50ded45dbaf 2890 case 'W':
WiredHome 23:a50ded45dbaf 2891 WebColorTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2892 break;
WiredHome 23:a50ded45dbaf 2893 case 't':
WiredHome 23:a50ded45dbaf 2894 TextCursorTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2895 break;
WiredHome 49:c5182231d1b9 2896 case 'w':
WiredHome 49:c5182231d1b9 2897 TextWrapTest(lcd, pc);
WiredHome 49:c5182231d1b9 2898 break;
WiredHome 23:a50ded45dbaf 2899 case 'F':
WiredHome 23:a50ded45dbaf 2900 ExternalFontTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2901 break;
WiredHome 23:a50ded45dbaf 2902 case 'L':
WiredHome 23:a50ded45dbaf 2903 LineTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2904 break;
WiredHome 44:207594dece70 2905 case 'l':
WiredHome 44:207594dece70 2906 LayerTest(lcd, pc);
WiredHome 44:207594dece70 2907 break;
WiredHome 23:a50ded45dbaf 2908 case 'R':
WiredHome 23:a50ded45dbaf 2909 RectangleTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2910 break;
WiredHome 23:a50ded45dbaf 2911 case 'O':
WiredHome 23:a50ded45dbaf 2912 RoundRectTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2913 break;
WiredHome 41:2956a0a221e5 2914 case 'p':
WiredHome 41:2956a0a221e5 2915 PrintScreen(lcd, pc);
WiredHome 41:2956a0a221e5 2916 break;
WiredHome 41:2956a0a221e5 2917 case 'S':
WiredHome 41:2956a0a221e5 2918 SpeedTest(lcd, pc);
WiredHome 41:2956a0a221e5 2919 break;
WiredHome 77:9206c13aa527 2920 case 's':
WiredHome 77:9206c13aa527 2921 TouchPanelTest(lcd, pc);
WiredHome 77:9206c13aa527 2922 break;
WiredHome 23:a50ded45dbaf 2923 case 'T':
WiredHome 23:a50ded45dbaf 2924 TriangleTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2925 break;
WiredHome 37:f19b7e7449dc 2926 case 'P':
WiredHome 37:f19b7e7449dc 2927 PixelTest(lcd, pc);
WiredHome 37:f19b7e7449dc 2928 break;
WiredHome 37:f19b7e7449dc 2929 case 'G':
WiredHome 37:f19b7e7449dc 2930 TestGraphicsBitmap(lcd, pc);
WiredHome 37:f19b7e7449dc 2931 break;
WiredHome 23:a50ded45dbaf 2932 case 'C':
WiredHome 23:a50ded45dbaf 2933 CircleTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2934 break;
WiredHome 23:a50ded45dbaf 2935 case 'E':
WiredHome 23:a50ded45dbaf 2936 EllipseTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2937 break;
WiredHome 23:a50ded45dbaf 2938 case 'r':
WiredHome 23:a50ded45dbaf 2939 pc.printf("Resetting ...\r\n");
WiredHome 23:a50ded45dbaf 2940 wait_ms(20);
WiredHome 23:a50ded45dbaf 2941 mbed_reset();
WiredHome 23:a50ded45dbaf 2942 break;
WiredHome 75:ca78388cfd77 2943 case ' ':
WiredHome 75:ca78388cfd77 2944 break;
WiredHome 23:a50ded45dbaf 2945 default:
WiredHome 23:a50ded45dbaf 2946 printf("huh?\n");
WiredHome 23:a50ded45dbaf 2947 break;
WiredHome 23:a50ded45dbaf 2948 }
WiredHome 23:a50ded45dbaf 2949 if (automode >= 0) {
WiredHome 23:a50ded45dbaf 2950 automode++;
WiredHome 23:a50ded45dbaf 2951 if (automode >= sizeof(modelist))
WiredHome 23:a50ded45dbaf 2952 automode = 0;
WiredHome 23:a50ded45dbaf 2953 wait_ms(2000);
WiredHome 23:a50ded45dbaf 2954 }
WiredHome 23:a50ded45dbaf 2955 wait_ms(200);
WiredHome 23:a50ded45dbaf 2956 }
WiredHome 23:a50ded45dbaf 2957 }
WiredHome 23:a50ded45dbaf 2958
WiredHome 79:544eb4964795 2959 #endif // TESTENABLE