Library to control a Graphics TFT connected to 4-wire SPI - revised for the Raio RA8875 Display Controller.

Dependents:   FRDM_RA8875_mPaint RA8875_Demo RA8875_KeyPadDemo SignalGenerator ... more

Fork of SPI_TFT by Peter Drescher

See Components - RA8875 Based Display

Enhanced touch-screen support - where it previous supported both the Resistive Touch and Capacitive Touch based on the FT5206 Touch Controller, now it also has support for the GSL1680 Touch Controller.

Offline Help Manual (Windows chm)

/media/uploads/WiredHome/ra8875.zip.bin (download, rename to .zip and unzip)

Committer:
WiredHome
Date:
Mon Jan 12 01:10:35 2015 +0000
Revision:
84:e102021864b5
Parent:
83:7bad0068cca0
Child:
85:022bba13c5c4
Added SetOrientation method, to orient the display in one of 0, 90, 180, 270. Removed a rotation parameter from the SetTextFontControl method.

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