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