KSM edits to RA8875

Dependents:   Liz_Test_Code

Committer:
WiredHome
Date:
Sat Oct 11 17:24:29 2014 +0000
Revision:
72:ecffe56af969
Parent:
71:dcac8efd842d
Child:
73:f22a18707b5e
Documentation updates only.

Who changed what in which revision?

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