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

Dependents:   FRDM_RA8875_mPaint RA8875_Demo RA8875_KeyPadDemo SignalGenerator ... more

Fork of SPI_TFT by Peter Drescher

See Components - RA8875 Based Display

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

Offline Help Manual (Windows chm)

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

Committer:
WiredHome
Date:
Sun Jan 12 18:44:58 2014 +0000
Revision:
20:6e2e4a8372eb
Parent:
19:3f82c1161fd2
Child:
21:3c1efb192927
Triangle methods are now working - now does not perform unintended recursive call...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 19:3f82c1161fd2 1 /// RA8875 Display Controller Library.
WiredHome 19:3f82c1161fd2 2 ///
WiredHome 19:3f82c1161fd2 3 /// This is being created for a specific display from buydisplay.com,
WiredHome 19:3f82c1161fd2 4 /// which is 480 x xxx. It has other attributes (like display controller
WiredHome 19:3f82c1161fd2 5 /// managed backlight brightness. So, there are expectations and some
WiredHome 19:3f82c1161fd2 6 /// defined constants based on that specific display.
WiredHome 19:3f82c1161fd2 7 ///
WiredHome 19:3f82c1161fd2 8 #include "RA8875.h"
WiredHome 19:3f82c1161fd2 9
WiredHome 20:6e2e4a8372eb 10 DigitalOut zz1(LED1);
WiredHome 20:6e2e4a8372eb 11 DigitalOut zz2(LED2);
WiredHome 20:6e2e4a8372eb 12 DigitalOut zz3(LED3);
WiredHome 20:6e2e4a8372eb 13 DigitalOut zz4(LED4);
WiredHome 20:6e2e4a8372eb 14
WiredHome 19:3f82c1161fd2 15 //#define DEBUG "RAIO"
WiredHome 19:3f82c1161fd2 16 // ...
WiredHome 19:3f82c1161fd2 17 // INFO("Stuff to show %d", var); // new-line is automatically appended
WiredHome 19:3f82c1161fd2 18 //
WiredHome 19:3f82c1161fd2 19 #if (defined(DEBUG) && !defined(TARGET_LPC11U24))
WiredHome 19:3f82c1161fd2 20 #define INFO(x, ...) std::printf("[INF %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 19:3f82c1161fd2 21 #define WARN(x, ...) std::printf("[WRN %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 19:3f82c1161fd2 22 #define ERR(x, ...) std::printf("[ERR %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 19:3f82c1161fd2 23 #else
WiredHome 19:3f82c1161fd2 24 #define INFO(x, ...)
WiredHome 19:3f82c1161fd2 25 #define WARN(x, ...)
WiredHome 19:3f82c1161fd2 26 #define ERR(x, ...)
WiredHome 19:3f82c1161fd2 27 #endif
WiredHome 19:3f82c1161fd2 28
WiredHome 19:3f82c1161fd2 29
WiredHome 19:3f82c1161fd2 30 #define RA8875_DISPLAY_WIDTH 480
WiredHome 19:3f82c1161fd2 31 #define RA8875_DISPLAY_HEIGHT 272
WiredHome 19:3f82c1161fd2 32
WiredHome 19:3f82c1161fd2 33 /// @TODO what is the size?
WiredHome 19:3f82c1161fd2 34 /// If we're using the built-in font, read it from the chip.
WiredHome 19:3f82c1161fd2 35 /// If we're using a custom font, get it from the font metrics.
WiredHome 19:3f82c1161fd2 36 const int size_x = 16;
WiredHome 19:3f82c1161fd2 37 const int size_y = 16;
WiredHome 19:3f82c1161fd2 38
WiredHome 19:3f82c1161fd2 39
WiredHome 19:3f82c1161fd2 40 #ifdef PERF_METRICS
WiredHome 19:3f82c1161fd2 41 #define PERFORMANCE_RESET performance.reset()
WiredHome 19:3f82c1161fd2 42 #define REGISTERPERFORMANCE(a) RegisterPerformance(a)
WiredHome 19:3f82c1161fd2 43 static const char *metricsName[] =
WiredHome 19:3f82c1161fd2 44 {
WiredHome 19:3f82c1161fd2 45 "Point", "Line", "Rectangle", "Rounded Rectangle", "Triangle", "Circle", "Ellipse"
WiredHome 19:3f82c1161fd2 46 };
WiredHome 19:3f82c1161fd2 47 #else
WiredHome 19:3f82c1161fd2 48 #define PERFORMANCE_RESET
WiredHome 19:3f82c1161fd2 49 #define REGISTERPERFORMANCE(a)
WiredHome 19:3f82c1161fd2 50 #endif
WiredHome 19:3f82c1161fd2 51
WiredHome 19:3f82c1161fd2 52 // When it is going to poll a register for completion, how many
WiredHome 19:3f82c1161fd2 53 // uSec should it wait between each polling activity.
WiredHome 19:3f82c1161fd2 54 #define POLLWAITuSec 10
WiredHome 19:3f82c1161fd2 55
WiredHome 19:3f82c1161fd2 56
WiredHome 19:3f82c1161fd2 57 RA8875::RA8875(PinName mosi, PinName miso, PinName sclk, PinName csel, PinName reset, const char *name)
WiredHome 19:3f82c1161fd2 58 : spi(mosi, miso, sclk)
WiredHome 19:3f82c1161fd2 59 , cs(csel)
WiredHome 19:3f82c1161fd2 60 , res(reset)
WiredHome 19:3f82c1161fd2 61 , GraphicsDisplay(name)
WiredHome 19:3f82c1161fd2 62 {
WiredHome 19:3f82c1161fd2 63 font = NULL; // no external font, use internal.
WiredHome 19:3f82c1161fd2 64 select(false); // deselect the display
WiredHome 19:3f82c1161fd2 65 frequency(RA8875_DEFAULT_SPI_FREQ); // data rate
WiredHome 19:3f82c1161fd2 66 init();
WiredHome 19:3f82c1161fd2 67 #ifdef PERF_METRICS
WiredHome 19:3f82c1161fd2 68 performance.start();
WiredHome 19:3f82c1161fd2 69 ClearPerformance();
WiredHome 19:3f82c1161fd2 70 #endif
WiredHome 19:3f82c1161fd2 71 }
WiredHome 19:3f82c1161fd2 72
WiredHome 19:3f82c1161fd2 73 //RA8875::~RA8875()
WiredHome 19:3f82c1161fd2 74 //{
WiredHome 19:3f82c1161fd2 75 //}
WiredHome 19:3f82c1161fd2 76
WiredHome 19:3f82c1161fd2 77 #ifdef PERF_METRICS
WiredHome 19:3f82c1161fd2 78 void RA8875::ClearPerformance()
WiredHome 19:3f82c1161fd2 79 {
WiredHome 19:3f82c1161fd2 80 for (int i=0; i<METRICCOUNT; i++)
WiredHome 19:3f82c1161fd2 81 metrics[i] = 0;
WiredHome 19:3f82c1161fd2 82 }
WiredHome 19:3f82c1161fd2 83
WiredHome 19:3f82c1161fd2 84 void RA8875::RegisterPerformance(method_e method)
WiredHome 19:3f82c1161fd2 85 {
WiredHome 19:3f82c1161fd2 86 unsigned long elapsed = performance.read_us();
WiredHome 19:3f82c1161fd2 87
WiredHome 19:3f82c1161fd2 88 if (method < METRICCOUNT && elapsed > metrics[method])
WiredHome 19:3f82c1161fd2 89 metrics[method] = elapsed;
WiredHome 19:3f82c1161fd2 90 }
WiredHome 19:3f82c1161fd2 91
WiredHome 19:3f82c1161fd2 92 void RA8875::ReportPerformance()
WiredHome 19:3f82c1161fd2 93 {
WiredHome 19:3f82c1161fd2 94 for (int i=0; i<METRICCOUNT; i++) {
WiredHome 19:3f82c1161fd2 95 printf("%10d uS %s\r\n", metrics[i], metricsName[i]);
WiredHome 19:3f82c1161fd2 96 }
WiredHome 19:3f82c1161fd2 97 }
WiredHome 19:3f82c1161fd2 98 #endif
WiredHome 19:3f82c1161fd2 99
WiredHome 19:3f82c1161fd2 100 RetCode_t RA8875::WriteCommand(unsigned char command, unsigned int data)
WiredHome 19:3f82c1161fd2 101 {
WiredHome 19:3f82c1161fd2 102 select(true);
WiredHome 19:3f82c1161fd2 103 spiwrite(0x80);
WiredHome 19:3f82c1161fd2 104 spiwrite(command);
WiredHome 19:3f82c1161fd2 105 if (data <= 0xFF) { // only if in the valid range
WiredHome 19:3f82c1161fd2 106 spiwrite(0x00);
WiredHome 19:3f82c1161fd2 107 spiwrite(data);
WiredHome 19:3f82c1161fd2 108 }
WiredHome 19:3f82c1161fd2 109 select(false);
WiredHome 19:3f82c1161fd2 110 return noerror;
WiredHome 19:3f82c1161fd2 111 }
WiredHome 19:3f82c1161fd2 112
WiredHome 19:3f82c1161fd2 113 RetCode_t RA8875::WriteData(unsigned char data)
WiredHome 19:3f82c1161fd2 114 {
WiredHome 19:3f82c1161fd2 115 select(true);
WiredHome 19:3f82c1161fd2 116 spiwrite(0x00);
WiredHome 19:3f82c1161fd2 117 spiwrite(data);
WiredHome 19:3f82c1161fd2 118 select(false);
WiredHome 19:3f82c1161fd2 119 return noerror;
WiredHome 19:3f82c1161fd2 120 }
WiredHome 19:3f82c1161fd2 121
WiredHome 19:3f82c1161fd2 122 unsigned char RA8875::ReadCommand(unsigned char command)
WiredHome 19:3f82c1161fd2 123 {
WiredHome 19:3f82c1161fd2 124 WriteCommand(command);
WiredHome 19:3f82c1161fd2 125 return ReadData();
WiredHome 19:3f82c1161fd2 126 }
WiredHome 19:3f82c1161fd2 127
WiredHome 19:3f82c1161fd2 128 unsigned char RA8875::ReadData(void)
WiredHome 19:3f82c1161fd2 129 {
WiredHome 19:3f82c1161fd2 130 unsigned char data;
WiredHome 19:3f82c1161fd2 131
WiredHome 19:3f82c1161fd2 132 select(true);
WiredHome 19:3f82c1161fd2 133 spiwrite(0x40);
WiredHome 19:3f82c1161fd2 134 data = spiread();
WiredHome 19:3f82c1161fd2 135 select(false);
WiredHome 19:3f82c1161fd2 136 return data;
WiredHome 19:3f82c1161fd2 137 }
WiredHome 19:3f82c1161fd2 138
WiredHome 19:3f82c1161fd2 139 unsigned char RA8875::ReadStatus(void)
WiredHome 19:3f82c1161fd2 140 {
WiredHome 19:3f82c1161fd2 141 unsigned char data;
WiredHome 19:3f82c1161fd2 142
WiredHome 19:3f82c1161fd2 143 select(true);
WiredHome 19:3f82c1161fd2 144 spiwrite(0xC0);
WiredHome 19:3f82c1161fd2 145 data = spiread();
WiredHome 19:3f82c1161fd2 146 select(false);
WiredHome 19:3f82c1161fd2 147 return data;
WiredHome 19:3f82c1161fd2 148 }
WiredHome 19:3f82c1161fd2 149
WiredHome 19:3f82c1161fd2 150 unsigned int RA8875::fontwidth(void)
WiredHome 19:3f82c1161fd2 151 {
WiredHome 19:3f82c1161fd2 152 if (font == NULL)
WiredHome 19:3f82c1161fd2 153 return size_x;
WiredHome 19:3f82c1161fd2 154 else
WiredHome 19:3f82c1161fd2 155 return width() / font[1];
WiredHome 19:3f82c1161fd2 156 }
WiredHome 19:3f82c1161fd2 157
WiredHome 19:3f82c1161fd2 158 unsigned int RA8875::fontheight(void)
WiredHome 19:3f82c1161fd2 159 {
WiredHome 19:3f82c1161fd2 160 if (font == NULL)
WiredHome 19:3f82c1161fd2 161 return size_y;
WiredHome 19:3f82c1161fd2 162 else
WiredHome 19:3f82c1161fd2 163 return height() / font[2];
WiredHome 19:3f82c1161fd2 164 }
WiredHome 19:3f82c1161fd2 165
WiredHome 19:3f82c1161fd2 166 RetCode_t RA8875::locate(unsigned int x, unsigned int y)
WiredHome 19:3f82c1161fd2 167 {
WiredHome 19:3f82c1161fd2 168 return SetTextCursor(x * fontwidth(), y * fontheight());
WiredHome 19:3f82c1161fd2 169 }
WiredHome 19:3f82c1161fd2 170
WiredHome 19:3f82c1161fd2 171 int RA8875::columns(void)
WiredHome 19:3f82c1161fd2 172 {
WiredHome 19:3f82c1161fd2 173 return width() / fontwidth();
WiredHome 19:3f82c1161fd2 174 }
WiredHome 19:3f82c1161fd2 175
WiredHome 19:3f82c1161fd2 176 int RA8875::rows(void)
WiredHome 19:3f82c1161fd2 177 {
WiredHome 19:3f82c1161fd2 178 return height() / fontheight();
WiredHome 19:3f82c1161fd2 179 }
WiredHome 19:3f82c1161fd2 180
WiredHome 19:3f82c1161fd2 181 int RA8875::width(void)
WiredHome 19:3f82c1161fd2 182 {
WiredHome 19:3f82c1161fd2 183 return RA8875_DISPLAY_WIDTH;
WiredHome 19:3f82c1161fd2 184 }
WiredHome 19:3f82c1161fd2 185
WiredHome 19:3f82c1161fd2 186 int RA8875::height(void)
WiredHome 19:3f82c1161fd2 187 {
WiredHome 19:3f82c1161fd2 188 return RA8875_DISPLAY_HEIGHT;
WiredHome 19:3f82c1161fd2 189 }
WiredHome 19:3f82c1161fd2 190
WiredHome 19:3f82c1161fd2 191 RetCode_t RA8875::SetTextCursor(unsigned int x, unsigned int y)
WiredHome 19:3f82c1161fd2 192 {
WiredHome 19:3f82c1161fd2 193 WriteCommand(0x2A, x & 0xFF);
WiredHome 19:3f82c1161fd2 194 WriteCommand(0x2B, x >> 8);
WiredHome 19:3f82c1161fd2 195 WriteCommand(0x2C, y & 0xFF);
WiredHome 19:3f82c1161fd2 196 WriteCommand(0x2D, y >> 8);
WiredHome 19:3f82c1161fd2 197 INFO("SetTextCursor(%d,%d)", x,y);
WiredHome 19:3f82c1161fd2 198 return noerror;
WiredHome 19:3f82c1161fd2 199 }
WiredHome 19:3f82c1161fd2 200
WiredHome 19:3f82c1161fd2 201 RetCode_t RA8875::SetTextFont(RA8875::font_t font)
WiredHome 19:3f82c1161fd2 202 {
WiredHome 19:3f82c1161fd2 203 if (/*font >= RA8875::ISO8859_1 && */ font <= RA8875::ISO8859_4) {
WiredHome 19:3f82c1161fd2 204 WriteCommand(0x21, (unsigned int)(font));
WiredHome 19:3f82c1161fd2 205 return noerror;
WiredHome 19:3f82c1161fd2 206 } else {
WiredHome 19:3f82c1161fd2 207 return bad_parameter;
WiredHome 19:3f82c1161fd2 208 }
WiredHome 19:3f82c1161fd2 209 }
WiredHome 19:3f82c1161fd2 210
WiredHome 19:3f82c1161fd2 211 RetCode_t RA8875::SetTextFontControl(fill_t fillit,
WiredHome 19:3f82c1161fd2 212 RA8875::font_angle_t angle,
WiredHome 19:3f82c1161fd2 213 RA8875::HorizontalScale hScale,
WiredHome 19:3f82c1161fd2 214 RA8875::VerticalScale vScale,
WiredHome 19:3f82c1161fd2 215 RA8875::alignment_t alignment)
WiredHome 19:3f82c1161fd2 216 {
WiredHome 19:3f82c1161fd2 217 if (hScale >= 1 && hScale <= 4 &&
WiredHome 19:3f82c1161fd2 218 vScale >= 1 && vScale <= 4) {
WiredHome 19:3f82c1161fd2 219 unsigned char x = 0;
WiredHome 19:3f82c1161fd2 220
WiredHome 19:3f82c1161fd2 221 if (alignment == align_full)
WiredHome 19:3f82c1161fd2 222 x |= 0x80;
WiredHome 19:3f82c1161fd2 223 if (fillit == NOFILL)
WiredHome 19:3f82c1161fd2 224 x |= 0x40;
WiredHome 19:3f82c1161fd2 225 if (angle == rotated)
WiredHome 19:3f82c1161fd2 226 x |= 0x10;
WiredHome 19:3f82c1161fd2 227 x |= ((hScale - 1) << 2);
WiredHome 19:3f82c1161fd2 228 x |= ((vScale - 1) << 0);
WiredHome 19:3f82c1161fd2 229 WriteCommand(0x22, x);
WiredHome 19:3f82c1161fd2 230 return noerror;
WiredHome 19:3f82c1161fd2 231 } else {
WiredHome 19:3f82c1161fd2 232 return bad_parameter;
WiredHome 19:3f82c1161fd2 233 }
WiredHome 19:3f82c1161fd2 234 }
WiredHome 19:3f82c1161fd2 235
WiredHome 19:3f82c1161fd2 236 RetCode_t RA8875::SetTextFontSize(RA8875::HorizontalScale hScale, RA8875::VerticalScale vScale)
WiredHome 19:3f82c1161fd2 237 {
WiredHome 19:3f82c1161fd2 238 unsigned char reg = ReadCommand(0x22);
WiredHome 19:3f82c1161fd2 239
WiredHome 19:3f82c1161fd2 240 if (hScale >= 1 && hScale <= 4 && vScale >= 1 && vScale <= 4) {
WiredHome 19:3f82c1161fd2 241 reg &= 0xF0; // keep the high nibble as is.
WiredHome 19:3f82c1161fd2 242 reg |= ((hScale - 1) << 2);
WiredHome 19:3f82c1161fd2 243 reg |= ((vScale - 1) << 0);
WiredHome 19:3f82c1161fd2 244 WriteCommand(0x22, reg);
WiredHome 19:3f82c1161fd2 245 return noerror;
WiredHome 19:3f82c1161fd2 246 } else {
WiredHome 19:3f82c1161fd2 247 return bad_parameter;
WiredHome 19:3f82c1161fd2 248 }
WiredHome 19:3f82c1161fd2 249 }
WiredHome 19:3f82c1161fd2 250
WiredHome 19:3f82c1161fd2 251 int RA8875::_putc(int c)
WiredHome 19:3f82c1161fd2 252 {
WiredHome 19:3f82c1161fd2 253 if (c) {
WiredHome 19:3f82c1161fd2 254 if (c == '\r') {
WiredHome 19:3f82c1161fd2 255 unsigned int x;
WiredHome 19:3f82c1161fd2 256 x = ReadCommand(0x30) | (ReadCommand(0x31) << 8); // Left edge of active window
WiredHome 19:3f82c1161fd2 257 WriteCommand(0x2A, x & 0xFF);
WiredHome 19:3f82c1161fd2 258 WriteCommand(0x2B, x >> 8);
WiredHome 19:3f82c1161fd2 259 } else if (c == '\n') {
WiredHome 19:3f82c1161fd2 260 unsigned int y;
WiredHome 19:3f82c1161fd2 261 y = ReadCommand(0x2C) | (ReadCommand(0x2D) << 8); // current y location
WiredHome 19:3f82c1161fd2 262 y += fontheight();
WiredHome 19:3f82c1161fd2 263 if (y > height()) // @TODO > active window, then scroll?
WiredHome 19:3f82c1161fd2 264 y = 0;
WiredHome 19:3f82c1161fd2 265 WriteCommand(0x2C, y & 0xFF);
WiredHome 19:3f82c1161fd2 266 WriteCommand(0x2D, y >> 8);
WiredHome 19:3f82c1161fd2 267 } else {
WiredHome 19:3f82c1161fd2 268 if (font == NULL) {
WiredHome 19:3f82c1161fd2 269 WriteCommand(0x40,0x80);
WiredHome 19:3f82c1161fd2 270 WriteCommand(0x02);
WiredHome 19:3f82c1161fd2 271 select(true);
WiredHome 19:3f82c1161fd2 272 WriteData(c);
WiredHome 19:3f82c1161fd2 273 while (ReadStatus() & 0x80)
WiredHome 19:3f82c1161fd2 274 wait_us(POLLWAITuSec); // Chk_Busy();
WiredHome 19:3f82c1161fd2 275 select(false);
WiredHome 19:3f82c1161fd2 276 } else {
WiredHome 19:3f82c1161fd2 277 unsigned int x = (ReadCommand(0x2A) | (ReadCommand(0x2B) << 8)) / fontwidth();
WiredHome 19:3f82c1161fd2 278 unsigned int y = (ReadCommand(0x2C) | (ReadCommand(0x2D) << 8)) / fontheight();
WiredHome 19:3f82c1161fd2 279 character(x,y,c);
WiredHome 19:3f82c1161fd2 280 }
WiredHome 19:3f82c1161fd2 281 // @TODO right of active window, then wrap?
WiredHome 19:3f82c1161fd2 282 }
WiredHome 19:3f82c1161fd2 283 }
WiredHome 19:3f82c1161fd2 284 return c;
WiredHome 19:3f82c1161fd2 285 }
WiredHome 19:3f82c1161fd2 286
WiredHome 19:3f82c1161fd2 287 void RA8875::puts(unsigned int x, unsigned int y, const char * string)
WiredHome 19:3f82c1161fd2 288 {
WiredHome 19:3f82c1161fd2 289 SetTextCursor(x,y);
WiredHome 19:3f82c1161fd2 290 puts(string);
WiredHome 19:3f82c1161fd2 291 }
WiredHome 19:3f82c1161fd2 292
WiredHome 19:3f82c1161fd2 293 void RA8875::puts(const char * string)
WiredHome 19:3f82c1161fd2 294 {
WiredHome 19:3f82c1161fd2 295 if (*string != '\0') {
WiredHome 19:3f82c1161fd2 296 INFO("puts(%s)", string);
WiredHome 19:3f82c1161fd2 297 #if 1
WiredHome 19:3f82c1161fd2 298 while (*string) { // @TODO calling individual _putc is slower... anything to do?
WiredHome 19:3f82c1161fd2 299 _putc(*string++);
WiredHome 19:3f82c1161fd2 300 }
WiredHome 19:3f82c1161fd2 301 #else
WiredHome 19:3f82c1161fd2 302 WriteCommand(0x40,0x80); // Put display into text mode
WiredHome 19:3f82c1161fd2 303 WriteCommand(0x02);
WiredHome 19:3f82c1161fd2 304 select(true);
WiredHome 19:3f82c1161fd2 305 while (*string != '\0') {
WiredHome 19:3f82c1161fd2 306 WriteData(*string);
WiredHome 19:3f82c1161fd2 307 ++string;
WiredHome 19:3f82c1161fd2 308 while (ReadStatus() & 0x80)
WiredHome 19:3f82c1161fd2 309 wait_us(POLLWAITuSec); // Chk_Busy();
WiredHome 19:3f82c1161fd2 310 }
WiredHome 19:3f82c1161fd2 311 select(false);
WiredHome 19:3f82c1161fd2 312 #endif
WiredHome 19:3f82c1161fd2 313 }
WiredHome 19:3f82c1161fd2 314 }
WiredHome 19:3f82c1161fd2 315
WiredHome 19:3f82c1161fd2 316 RetCode_t RA8875::SetMemoryCursor(unsigned int x, unsigned int y)
WiredHome 19:3f82c1161fd2 317
WiredHome 19:3f82c1161fd2 318 {
WiredHome 19:3f82c1161fd2 319 WriteCommand(0x46, x & 0xFF);
WiredHome 19:3f82c1161fd2 320 WriteCommand(0x47, x >> 8);
WiredHome 19:3f82c1161fd2 321 WriteCommand(0x48, y & 0xFF);
WiredHome 19:3f82c1161fd2 322 WriteCommand(0x49, y >> 8);
WiredHome 19:3f82c1161fd2 323 return noerror;
WiredHome 19:3f82c1161fd2 324 }
WiredHome 19:3f82c1161fd2 325
WiredHome 19:3f82c1161fd2 326 RetCode_t RA8875::SetWindow(unsigned int x, unsigned int y, unsigned int width, unsigned int height)
WiredHome 19:3f82c1161fd2 327 {
WiredHome 19:3f82c1161fd2 328 WriteCommand(0x30, x & 0xFF); // HSAW0
WiredHome 19:3f82c1161fd2 329 WriteCommand(0x31, x >> 8); // HSAW1
WiredHome 19:3f82c1161fd2 330 WriteCommand(0x32, y & 0xFF); // VSAW0
WiredHome 19:3f82c1161fd2 331 WriteCommand(0x33, y >> 8); // VSAW1
WiredHome 19:3f82c1161fd2 332 WriteCommand(0x34, (x+width-1) & 0xFF); // HEAW0
WiredHome 19:3f82c1161fd2 333 WriteCommand(0x35, (x+width-1) >> 8); // HEAW1
WiredHome 19:3f82c1161fd2 334 WriteCommand(0x36, (y+height-1) & 0xFF); // VEAW0
WiredHome 19:3f82c1161fd2 335 WriteCommand(0x37, (y+height-1) >> 8); // VEAW1
WiredHome 19:3f82c1161fd2 336 return noerror;
WiredHome 19:3f82c1161fd2 337 }
WiredHome 19:3f82c1161fd2 338
WiredHome 19:3f82c1161fd2 339 RetCode_t RA8875::cls(void)
WiredHome 19:3f82c1161fd2 340 {
WiredHome 19:3f82c1161fd2 341 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 342 clsw(FULLWINDOW);
WiredHome 19:3f82c1161fd2 343 REGISTERPERFORMANCE(PRF_CLS);
WiredHome 19:3f82c1161fd2 344 return noerror;
WiredHome 19:3f82c1161fd2 345 }
WiredHome 19:3f82c1161fd2 346
WiredHome 19:3f82c1161fd2 347 RetCode_t RA8875::clsw(RA8875::Region_t region)
WiredHome 19:3f82c1161fd2 348 {
WiredHome 19:3f82c1161fd2 349 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 350 WriteCommand(0x8E, (region == ACTIVEWINDOW) ? 0xC0 : 0x80);
WiredHome 19:3f82c1161fd2 351 while (ReadCommand(0x8E) & 0x80)
WiredHome 19:3f82c1161fd2 352 wait_us(POLLWAITuSec);
WiredHome 19:3f82c1161fd2 353 REGISTERPERFORMANCE(PRF_CLS);
WiredHome 19:3f82c1161fd2 354 return noerror;
WiredHome 19:3f82c1161fd2 355 }
WiredHome 19:3f82c1161fd2 356
WiredHome 19:3f82c1161fd2 357 RetCode_t RA8875::pixel(unsigned int x, unsigned int y, color_t color)
WiredHome 19:3f82c1161fd2 358 {
WiredHome 19:3f82c1161fd2 359 foreground(color);
WiredHome 19:3f82c1161fd2 360 return pixel(x,y);
WiredHome 19:3f82c1161fd2 361 }
WiredHome 19:3f82c1161fd2 362
WiredHome 19:3f82c1161fd2 363 RetCode_t RA8875::pixel(unsigned int x, unsigned int y)
WiredHome 19:3f82c1161fd2 364 {
WiredHome 19:3f82c1161fd2 365 RetCode_t ret;
WiredHome 19:3f82c1161fd2 366
WiredHome 19:3f82c1161fd2 367 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 368 #if 1
WiredHome 19:3f82c1161fd2 369 color_t color = GetForeColor();
WiredHome 19:3f82c1161fd2 370 WriteCommand(0x40,0x00); // Graphics write mode
WiredHome 19:3f82c1161fd2 371 SetMemoryCursor(x, y);
WiredHome 19:3f82c1161fd2 372 WriteCommand(0x02); //start data write
WiredHome 19:3f82c1161fd2 373 WriteData(color & 0xFF);
WiredHome 19:3f82c1161fd2 374 WriteData(color >> 8);
WiredHome 19:3f82c1161fd2 375 ret = noerror;
WiredHome 19:3f82c1161fd2 376 #else
WiredHome 19:3f82c1161fd2 377 // There isn't actually a set pixel function that I found
WiredHome 19:3f82c1161fd2 378 // so we'll emulate it as we can.
WiredHome 19:3f82c1161fd2 379 ret = line(x,y, x,y);
WiredHome 19:3f82c1161fd2 380 #endif
WiredHome 19:3f82c1161fd2 381 REGISTERPERFORMANCE(PRF_DRAWPOINT);
WiredHome 19:3f82c1161fd2 382 return ret;
WiredHome 19:3f82c1161fd2 383 }
WiredHome 19:3f82c1161fd2 384
WiredHome 19:3f82c1161fd2 385 RetCode_t RA8875::line(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2, color_t color)
WiredHome 19:3f82c1161fd2 386 {
WiredHome 19:3f82c1161fd2 387 foreground(color);
WiredHome 19:3f82c1161fd2 388 return line(x1,y1,x2,y2);
WiredHome 19:3f82c1161fd2 389 }
WiredHome 19:3f82c1161fd2 390
WiredHome 19:3f82c1161fd2 391 RetCode_t RA8875::line(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2)
WiredHome 19:3f82c1161fd2 392 {
WiredHome 19:3f82c1161fd2 393 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 394 WriteCommand(0x91, x1 & 0xFF);
WiredHome 19:3f82c1161fd2 395 WriteCommand(0x92, x1 >> 8);
WiredHome 19:3f82c1161fd2 396 WriteCommand(0x93, y1 & 0xFF);
WiredHome 19:3f82c1161fd2 397 WriteCommand(0x94, y1 >> 8);
WiredHome 19:3f82c1161fd2 398 WriteCommand(0x95, x2 & 0xFF);
WiredHome 19:3f82c1161fd2 399 WriteCommand(0x96, x2 >> 8);
WiredHome 19:3f82c1161fd2 400 WriteCommand(0x97, y2 & 0xFF);
WiredHome 19:3f82c1161fd2 401 WriteCommand(0x98, y2 >> 8);
WiredHome 19:3f82c1161fd2 402
WiredHome 19:3f82c1161fd2 403 unsigned char drawCmd = 0x00; // Line
WiredHome 19:3f82c1161fd2 404 WriteCommand(0x90, drawCmd);
WiredHome 19:3f82c1161fd2 405 WriteCommand(0x90, 0x80 + drawCmd); // Start drawing.
WiredHome 19:3f82c1161fd2 406 while (ReadCommand(0x90) & 0x80) // await completion.
WiredHome 19:3f82c1161fd2 407 wait_us(POLLWAITuSec);
WiredHome 19:3f82c1161fd2 408 REGISTERPERFORMANCE(PRF_DRAWLINE);
WiredHome 19:3f82c1161fd2 409 return noerror;
WiredHome 19:3f82c1161fd2 410 }
WiredHome 19:3f82c1161fd2 411
WiredHome 19:3f82c1161fd2 412 RetCode_t RA8875::fillrect(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 413 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 414 {
WiredHome 19:3f82c1161fd2 415 return rect(x1,y1,x2,y2,color,fillit);
WiredHome 19:3f82c1161fd2 416 }
WiredHome 19:3f82c1161fd2 417
WiredHome 19:3f82c1161fd2 418 RetCode_t RA8875::rect(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 419 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 420 {
WiredHome 19:3f82c1161fd2 421 foreground(color);
WiredHome 19:3f82c1161fd2 422 return rect(x1,y1,x2,y2,fillit);
WiredHome 19:3f82c1161fd2 423 }
WiredHome 19:3f82c1161fd2 424
WiredHome 19:3f82c1161fd2 425 RetCode_t RA8875::rect(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 426 fill_t fillit)
WiredHome 19:3f82c1161fd2 427 {
WiredHome 19:3f82c1161fd2 428 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 429 if (x1 == x2 && y1 == y2) {
WiredHome 19:3f82c1161fd2 430 pixel(x1, y1);
WiredHome 19:3f82c1161fd2 431 } else if (x1 == x2) {
WiredHome 19:3f82c1161fd2 432 line(x1, y1, x2, y2);
WiredHome 19:3f82c1161fd2 433 } else if (y1 == y2) {
WiredHome 19:3f82c1161fd2 434 line(x1, y1, x2, y2);
WiredHome 19:3f82c1161fd2 435 } else {
WiredHome 19:3f82c1161fd2 436 WriteCommand(0x91, x1 & 0xFF);
WiredHome 19:3f82c1161fd2 437 WriteCommand(0x92, x1 >> 8);
WiredHome 19:3f82c1161fd2 438 WriteCommand(0x93, y1 & 0xFF);
WiredHome 19:3f82c1161fd2 439 WriteCommand(0x94, y1 >> 8);
WiredHome 19:3f82c1161fd2 440 WriteCommand(0x95, x2 & 0xFF);
WiredHome 19:3f82c1161fd2 441 WriteCommand(0x96, x2 >> 8);
WiredHome 19:3f82c1161fd2 442 WriteCommand(0x97, y2 & 0xFF);
WiredHome 19:3f82c1161fd2 443 WriteCommand(0x98, y2 >> 8);
WiredHome 19:3f82c1161fd2 444
WiredHome 19:3f82c1161fd2 445 unsigned char drawCmd = 0x10; // Rectangle
WiredHome 19:3f82c1161fd2 446 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 447 drawCmd |= 0x20;
WiredHome 19:3f82c1161fd2 448 WriteCommand(0x90, drawCmd);
WiredHome 19:3f82c1161fd2 449 WriteCommand(0x90, 0x80 + drawCmd); // Start drawing.
WiredHome 19:3f82c1161fd2 450 while (ReadCommand(0x90) & 0x80) // await completion.
WiredHome 19:3f82c1161fd2 451 wait_us(POLLWAITuSec);
WiredHome 19:3f82c1161fd2 452 }
WiredHome 19:3f82c1161fd2 453 REGISTERPERFORMANCE(PRF_DRAWRECTANGLE);
WiredHome 19:3f82c1161fd2 454 return noerror;
WiredHome 19:3f82c1161fd2 455 }
WiredHome 19:3f82c1161fd2 456
WiredHome 19:3f82c1161fd2 457 RetCode_t RA8875::fillroundrect(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 458 unsigned int radius1, unsigned int radius2, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 459 {
WiredHome 19:3f82c1161fd2 460 foreground(color);
WiredHome 19:3f82c1161fd2 461 return roundrect(x1,y1,x2,y2,radius1,radius2,fillit);
WiredHome 19:3f82c1161fd2 462 }
WiredHome 19:3f82c1161fd2 463
WiredHome 19:3f82c1161fd2 464 RetCode_t RA8875::roundrect(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 465 unsigned int radius1, unsigned int radius2, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 466 {
WiredHome 19:3f82c1161fd2 467 foreground(color);
WiredHome 19:3f82c1161fd2 468 return roundrect(x1,y1,x2,y2,radius1,radius2,fillit);
WiredHome 19:3f82c1161fd2 469 }
WiredHome 19:3f82c1161fd2 470
WiredHome 19:3f82c1161fd2 471 RetCode_t RA8875::roundrect(unsigned int x1, unsigned int y1 ,unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 472 unsigned int radius1, unsigned int radius2, fill_t fillit)
WiredHome 19:3f82c1161fd2 473 {
WiredHome 19:3f82c1161fd2 474 RetCode_t ret = noerror;
WiredHome 19:3f82c1161fd2 475
WiredHome 19:3f82c1161fd2 476 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 477 if (x1 == x2 && y1 == y2) {
WiredHome 19:3f82c1161fd2 478 pixel(x1, y1);
WiredHome 19:3f82c1161fd2 479 } else if (x1 == x2) {
WiredHome 19:3f82c1161fd2 480 line(x1, y1, x2, y2);
WiredHome 19:3f82c1161fd2 481 } else if (y1 == y2) {
WiredHome 19:3f82c1161fd2 482 line(x1, y1, x2, y2);
WiredHome 19:3f82c1161fd2 483 } else {
WiredHome 19:3f82c1161fd2 484 WriteCommand(0x91, x1 & 0xFF);
WiredHome 19:3f82c1161fd2 485 WriteCommand(0x92, x1 >> 8);
WiredHome 19:3f82c1161fd2 486 WriteCommand(0x93, y1 & 0xFF);
WiredHome 19:3f82c1161fd2 487 WriteCommand(0x94, y1 >> 8);
WiredHome 19:3f82c1161fd2 488 WriteCommand(0x95, x2 & 0xFF);
WiredHome 19:3f82c1161fd2 489 WriteCommand(0x96, x2 >> 8);
WiredHome 19:3f82c1161fd2 490 WriteCommand(0x97, y2 & 0xFF);
WiredHome 19:3f82c1161fd2 491 WriteCommand(0x98, y2 >> 8);
WiredHome 19:3f82c1161fd2 492
WiredHome 19:3f82c1161fd2 493 //while (r && r > (x2 - x1) || r > (y2 - y1))
WiredHome 19:3f82c1161fd2 494 // r--;
WiredHome 19:3f82c1161fd2 495 WriteCommand(0xA1, radius1 & 0xFF);
WiredHome 19:3f82c1161fd2 496 WriteCommand(0xA2, radius1 >> 8);
WiredHome 19:3f82c1161fd2 497 WriteCommand(0xA3, radius2 & 0xFF);
WiredHome 19:3f82c1161fd2 498 WriteCommand(0xA4, radius2 >> 8);
WiredHome 19:3f82c1161fd2 499
WiredHome 19:3f82c1161fd2 500 unsigned char drawCmd = 0x20; // Rounded Rectangle
WiredHome 19:3f82c1161fd2 501 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 502 drawCmd |= 0x40;
WiredHome 19:3f82c1161fd2 503 WriteCommand(0xA0, drawCmd);
WiredHome 19:3f82c1161fd2 504 WriteCommand(0xA0, 0x80 + drawCmd); // Start drawing.
WiredHome 19:3f82c1161fd2 505 while (ReadCommand(0xA0) & 0x80) { // await completion.
WiredHome 19:3f82c1161fd2 506 wait_us(POLLWAITuSec);
WiredHome 19:3f82c1161fd2 507 }
WiredHome 19:3f82c1161fd2 508 }
WiredHome 19:3f82c1161fd2 509 REGISTERPERFORMANCE(PRF_DRAWROUNDEDRECTANGLE);
WiredHome 19:3f82c1161fd2 510 return ret;
WiredHome 19:3f82c1161fd2 511 }
WiredHome 19:3f82c1161fd2 512
WiredHome 19:3f82c1161fd2 513 RetCode_t RA8875::triangle(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 514 unsigned int x3, unsigned int y3, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 515 {
WiredHome 20:6e2e4a8372eb 516 RetCode_t ret;
WiredHome 20:6e2e4a8372eb 517
WiredHome 19:3f82c1161fd2 518 foreground(color);
WiredHome 20:6e2e4a8372eb 519 ret = triangle(x1,y1,x2,y2,x3,y3,fillit);
WiredHome 20:6e2e4a8372eb 520 return ret;
WiredHome 19:3f82c1161fd2 521 }
WiredHome 19:3f82c1161fd2 522
WiredHome 19:3f82c1161fd2 523 RetCode_t RA8875::filltriangle(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 524 unsigned int x3, unsigned int y3, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 525 {
WiredHome 20:6e2e4a8372eb 526 RetCode_t ret;
WiredHome 20:6e2e4a8372eb 527
WiredHome 19:3f82c1161fd2 528 foreground(color);
WiredHome 20:6e2e4a8372eb 529 ret = triangle(x1,y1,x2,y2,x3,y3,fillit);
WiredHome 20:6e2e4a8372eb 530 return ret;
WiredHome 19:3f82c1161fd2 531 }
WiredHome 19:3f82c1161fd2 532
WiredHome 19:3f82c1161fd2 533 RetCode_t RA8875::triangle(unsigned int x1, unsigned int y1 ,unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 534 unsigned int x3, unsigned int y3, fill_t fillit)
WiredHome 19:3f82c1161fd2 535 {
WiredHome 19:3f82c1161fd2 536 RetCode_t ret = noerror;
WiredHome 19:3f82c1161fd2 537
WiredHome 19:3f82c1161fd2 538 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 539 if (x1 == x2 && y1 == y2 && x1 == x3 && y1 == y3) {
WiredHome 19:3f82c1161fd2 540 pixel(x1, y1);
WiredHome 19:3f82c1161fd2 541 } else {
WiredHome 19:3f82c1161fd2 542 WriteCommand(0x91, x1 & 0xFF);
WiredHome 19:3f82c1161fd2 543 WriteCommand(0x92, x1 >> 8);
WiredHome 19:3f82c1161fd2 544 WriteCommand(0x93, y1 & 0xFF);
WiredHome 19:3f82c1161fd2 545 WriteCommand(0x94, y1 >> 8);
WiredHome 19:3f82c1161fd2 546
WiredHome 19:3f82c1161fd2 547 WriteCommand(0x95, x2 & 0xFF);
WiredHome 19:3f82c1161fd2 548 WriteCommand(0x96, x2 >> 8);
WiredHome 19:3f82c1161fd2 549 WriteCommand(0x97, y2 & 0xFF);
WiredHome 19:3f82c1161fd2 550 WriteCommand(0x98, y2 >> 8);
WiredHome 19:3f82c1161fd2 551
WiredHome 19:3f82c1161fd2 552 WriteCommand(0xA9, x3 & 0xFF);
WiredHome 19:3f82c1161fd2 553 WriteCommand(0xAA, x3 >> 8);
WiredHome 19:3f82c1161fd2 554 WriteCommand(0xAB, y3 & 0xFF);
WiredHome 19:3f82c1161fd2 555 WriteCommand(0xAC, y3 >> 8);
WiredHome 19:3f82c1161fd2 556
WiredHome 19:3f82c1161fd2 557 unsigned char drawCmd = 0x01; // Triangle
WiredHome 19:3f82c1161fd2 558 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 559 drawCmd |= 0x20;
WiredHome 19:3f82c1161fd2 560 WriteCommand(0x90, drawCmd);
WiredHome 19:3f82c1161fd2 561 WriteCommand(0x90, 0x80 + drawCmd); // Start drawing.
WiredHome 19:3f82c1161fd2 562 while (ReadCommand(0x90) & 0x80) // await completion.
WiredHome 19:3f82c1161fd2 563 wait_us(POLLWAITuSec);
WiredHome 19:3f82c1161fd2 564 }
WiredHome 19:3f82c1161fd2 565 REGISTERPERFORMANCE(PRF_DRAWTRIANGLE);
WiredHome 19:3f82c1161fd2 566 return ret;
WiredHome 19:3f82c1161fd2 567 }
WiredHome 19:3f82c1161fd2 568
WiredHome 19:3f82c1161fd2 569 RetCode_t RA8875::circle(unsigned int x, unsigned int y, unsigned int radius,
WiredHome 19:3f82c1161fd2 570 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 571 {
WiredHome 19:3f82c1161fd2 572 foreground(color);
WiredHome 19:3f82c1161fd2 573 return circle(x,y,radius,fillit);
WiredHome 19:3f82c1161fd2 574 }
WiredHome 19:3f82c1161fd2 575
WiredHome 19:3f82c1161fd2 576 RetCode_t RA8875::fillcircle(unsigned int x, unsigned int y, unsigned int radius,
WiredHome 19:3f82c1161fd2 577 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 578 {
WiredHome 19:3f82c1161fd2 579 foreground(color);
WiredHome 19:3f82c1161fd2 580 return circle(x,y,radius,fillit);
WiredHome 19:3f82c1161fd2 581 }
WiredHome 19:3f82c1161fd2 582
WiredHome 19:3f82c1161fd2 583 RetCode_t RA8875::circle(unsigned int x, unsigned int y, unsigned int radius, fill_t fillit)
WiredHome 19:3f82c1161fd2 584 {
WiredHome 19:3f82c1161fd2 585 RetCode_t ret = noerror;
WiredHome 19:3f82c1161fd2 586
WiredHome 19:3f82c1161fd2 587 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 588 if (radius <= 0) {
WiredHome 19:3f82c1161fd2 589 ret = bad_parameter;
WiredHome 19:3f82c1161fd2 590 } else if (radius == 1) {
WiredHome 19:3f82c1161fd2 591 pixel(x,y);
WiredHome 19:3f82c1161fd2 592 } else {
WiredHome 19:3f82c1161fd2 593 WriteCommand(0x99, x & 0xFF);
WiredHome 19:3f82c1161fd2 594 WriteCommand(0x9a, x >> 8);
WiredHome 19:3f82c1161fd2 595 WriteCommand(0x9b, y & 0xFF);
WiredHome 19:3f82c1161fd2 596 WriteCommand(0x9c, y >> 8);
WiredHome 19:3f82c1161fd2 597 WriteCommand(0x9d, radius & 0xFF);
WiredHome 19:3f82c1161fd2 598
WiredHome 19:3f82c1161fd2 599 unsigned char drawCmd = 0x00; // Circle
WiredHome 19:3f82c1161fd2 600 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 601 drawCmd |= 0x20;
WiredHome 19:3f82c1161fd2 602 WriteCommand(0x90, drawCmd);
WiredHome 19:3f82c1161fd2 603 WriteCommand(0x90, 0x40 + drawCmd); // Start drawing.
WiredHome 19:3f82c1161fd2 604 while (ReadCommand(0x90) & 0x40) // await completion.
WiredHome 19:3f82c1161fd2 605 wait_us(POLLWAITuSec);
WiredHome 19:3f82c1161fd2 606 }
WiredHome 19:3f82c1161fd2 607 REGISTERPERFORMANCE(PRF_DRAWCIRCLE);
WiredHome 19:3f82c1161fd2 608 return ret;
WiredHome 19:3f82c1161fd2 609 }
WiredHome 19:3f82c1161fd2 610
WiredHome 19:3f82c1161fd2 611 RetCode_t RA8875::ellipse(unsigned int x, unsigned int y, unsigned int R1, unsigned int R2, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 612 {
WiredHome 19:3f82c1161fd2 613 foreground(color);
WiredHome 19:3f82c1161fd2 614 return ellipse(x,y,R1,R2,fillit);
WiredHome 19:3f82c1161fd2 615 }
WiredHome 19:3f82c1161fd2 616
WiredHome 19:3f82c1161fd2 617 RetCode_t RA8875::ellipse(unsigned int x, unsigned int y, unsigned int R1, unsigned int R2, fill_t fillit)
WiredHome 19:3f82c1161fd2 618 {
WiredHome 19:3f82c1161fd2 619 RetCode_t ret = noerror;
WiredHome 19:3f82c1161fd2 620
WiredHome 19:3f82c1161fd2 621 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 622 if (R1 <= 0 || R2 <= 0) {
WiredHome 19:3f82c1161fd2 623 ; // do nothing
WiredHome 19:3f82c1161fd2 624 } else if (R1 == 1 && R2 == 1) {
WiredHome 19:3f82c1161fd2 625 pixel(x, y);
WiredHome 19:3f82c1161fd2 626 } else {
WiredHome 19:3f82c1161fd2 627 WriteCommand(0xA5, x & 0xFF);
WiredHome 19:3f82c1161fd2 628 WriteCommand(0xA6, x >> 8);
WiredHome 19:3f82c1161fd2 629 WriteCommand(0xA7, y & 0xFF);
WiredHome 19:3f82c1161fd2 630 WriteCommand(0xA8, y >> 8);
WiredHome 19:3f82c1161fd2 631 WriteCommand(0xA1, R1 & 0xFF);
WiredHome 19:3f82c1161fd2 632 WriteCommand(0xA2, R1 >> 8);
WiredHome 19:3f82c1161fd2 633 WriteCommand(0xA3, R2 & 0xFF);
WiredHome 19:3f82c1161fd2 634 WriteCommand(0xA4, R2 >> 8);
WiredHome 19:3f82c1161fd2 635
WiredHome 19:3f82c1161fd2 636 unsigned char drawCmd = 0x00; // Ellipse
WiredHome 19:3f82c1161fd2 637 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 638 drawCmd |= 0x40;
WiredHome 19:3f82c1161fd2 639 WriteCommand(0xA0, drawCmd);
WiredHome 19:3f82c1161fd2 640 WriteCommand(0xA0, 0x80 + drawCmd); // Start drawing.
WiredHome 19:3f82c1161fd2 641 while (ReadCommand(0xA0) & 0x80) // await completion.
WiredHome 19:3f82c1161fd2 642 wait_us(POLLWAITuSec);
WiredHome 19:3f82c1161fd2 643 }
WiredHome 19:3f82c1161fd2 644 REGISTERPERFORMANCE(PRF_DRAWELLIPSE);
WiredHome 19:3f82c1161fd2 645 return ret;
WiredHome 19:3f82c1161fd2 646 }
WiredHome 19:3f82c1161fd2 647
WiredHome 19:3f82c1161fd2 648
WiredHome 19:3f82c1161fd2 649 RetCode_t RA8875::frequency(unsigned long Hz)
WiredHome 19:3f82c1161fd2 650 {
WiredHome 19:3f82c1161fd2 651 spi.frequency(Hz);
WiredHome 19:3f82c1161fd2 652 // __ ___
WiredHome 19:3f82c1161fd2 653 // Clock ___A Rising edge latched
WiredHome 19:3f82c1161fd2 654 // ___ ____
WiredHome 19:3f82c1161fd2 655 // Data ___X____
WiredHome 19:3f82c1161fd2 656 spi.format(8, 3); // 8 bits and clock to data phase 0
WiredHome 19:3f82c1161fd2 657 init();
WiredHome 19:3f82c1161fd2 658 return noerror;
WiredHome 19:3f82c1161fd2 659 }
WiredHome 19:3f82c1161fd2 660
WiredHome 19:3f82c1161fd2 661 RetCode_t RA8875::Power(bool on)
WiredHome 19:3f82c1161fd2 662 {
WiredHome 19:3f82c1161fd2 663 WriteCommand(0x01, (on) ? 0x80 : 0x00);
WiredHome 19:3f82c1161fd2 664 return noerror;
WiredHome 19:3f82c1161fd2 665 }
WiredHome 19:3f82c1161fd2 666
WiredHome 19:3f82c1161fd2 667 RetCode_t RA8875::Reset(void)
WiredHome 19:3f82c1161fd2 668 {
WiredHome 19:3f82c1161fd2 669 WriteCommand(0x01, 0x01); // Apply Display Off, Reset
WiredHome 19:3f82c1161fd2 670 wait_ms(2); // no idea if I need to wait, or how long
WiredHome 19:3f82c1161fd2 671 WriteCommand(0x01, 0x00); // Display off, Remove reset
WiredHome 19:3f82c1161fd2 672 wait_ms(2); // no idea if I need to wait, or how long
WiredHome 19:3f82c1161fd2 673 init();
WiredHome 19:3f82c1161fd2 674 return noerror;
WiredHome 19:3f82c1161fd2 675 }
WiredHome 19:3f82c1161fd2 676
WiredHome 19:3f82c1161fd2 677
WiredHome 19:3f82c1161fd2 678 RetCode_t RA8875::Backlight_u8(unsigned char brightness)
WiredHome 19:3f82c1161fd2 679 {
WiredHome 19:3f82c1161fd2 680 static bool is_enabled = false;
WiredHome 19:3f82c1161fd2 681 if (brightness == 0) {
WiredHome 19:3f82c1161fd2 682 WriteCommand(0x8a); // Disable the PWM
WiredHome 19:3f82c1161fd2 683 WriteData(0x00);
WiredHome 19:3f82c1161fd2 684 is_enabled = false;
WiredHome 19:3f82c1161fd2 685 } else if (!is_enabled) {
WiredHome 19:3f82c1161fd2 686 WriteCommand(0x8a); // Enable the PWM
WiredHome 19:3f82c1161fd2 687 WriteData(0x80);
WiredHome 19:3f82c1161fd2 688 WriteCommand(0x8a); // Not sure why this is needed, but following the pattern
WiredHome 19:3f82c1161fd2 689 WriteData(0x81); // open PWM (SYS_CLK / 2 as best I can tell)
WiredHome 19:3f82c1161fd2 690 is_enabled = true;
WiredHome 19:3f82c1161fd2 691 }
WiredHome 19:3f82c1161fd2 692 WriteCommand(0x8b, brightness); // Brightness parameter 0xff-0x00
WiredHome 19:3f82c1161fd2 693 return noerror;
WiredHome 19:3f82c1161fd2 694 }
WiredHome 19:3f82c1161fd2 695
WiredHome 19:3f82c1161fd2 696 RetCode_t RA8875::Backlight(float brightness)
WiredHome 19:3f82c1161fd2 697 {
WiredHome 19:3f82c1161fd2 698 unsigned char b;
WiredHome 19:3f82c1161fd2 699
WiredHome 19:3f82c1161fd2 700 if (brightness > 1.0)
WiredHome 19:3f82c1161fd2 701 b = 255;
WiredHome 19:3f82c1161fd2 702 else if (brightness < 0)
WiredHome 19:3f82c1161fd2 703 b = 0;
WiredHome 19:3f82c1161fd2 704 else
WiredHome 19:3f82c1161fd2 705 b = (unsigned char)(brightness * 255);
WiredHome 19:3f82c1161fd2 706 return Backlight_u8(b);
WiredHome 19:3f82c1161fd2 707 }
WiredHome 19:3f82c1161fd2 708
WiredHome 19:3f82c1161fd2 709
WiredHome 19:3f82c1161fd2 710 RetCode_t RA8875::set_font(const unsigned char * _font)
WiredHome 19:3f82c1161fd2 711 {
WiredHome 19:3f82c1161fd2 712 font = _font;
WiredHome 19:3f82c1161fd2 713 return noerror; // trusting them, but we could put some checks in here...
WiredHome 19:3f82c1161fd2 714 }
WiredHome 19:3f82c1161fd2 715
WiredHome 19:3f82c1161fd2 716 RetCode_t RA8875::background(color_t color)
WiredHome 19:3f82c1161fd2 717 {
WiredHome 19:3f82c1161fd2 718 WriteCommand(0x60, (color>>11)); // BGCR0
WiredHome 19:3f82c1161fd2 719 WriteCommand(0x61, (unsigned char)(color>>5)); // BGCR0
WiredHome 19:3f82c1161fd2 720 WriteCommand(0x62, (unsigned char)(color)); // BGCR0
WiredHome 19:3f82c1161fd2 721 return noerror;
WiredHome 19:3f82c1161fd2 722 }
WiredHome 19:3f82c1161fd2 723
WiredHome 19:3f82c1161fd2 724 RetCode_t RA8875::background(unsigned char r, unsigned char g, unsigned char b)
WiredHome 19:3f82c1161fd2 725 {
WiredHome 19:3f82c1161fd2 726 WriteCommand(0x60, r);
WiredHome 19:3f82c1161fd2 727 WriteCommand(0x61, g);
WiredHome 19:3f82c1161fd2 728 WriteCommand(0x62, b);
WiredHome 19:3f82c1161fd2 729 return noerror;
WiredHome 19:3f82c1161fd2 730 }
WiredHome 19:3f82c1161fd2 731
WiredHome 19:3f82c1161fd2 732 RetCode_t RA8875::foreground(color_t color)
WiredHome 19:3f82c1161fd2 733 {
WiredHome 19:3f82c1161fd2 734 WriteCommand(0x63, (unsigned char)(color>>11));
WiredHome 19:3f82c1161fd2 735 WriteCommand(0x64, (unsigned char)(color>>5));
WiredHome 19:3f82c1161fd2 736 WriteCommand(0x65, (unsigned char)(color));
WiredHome 19:3f82c1161fd2 737 return noerror;
WiredHome 19:3f82c1161fd2 738 }
WiredHome 19:3f82c1161fd2 739
WiredHome 19:3f82c1161fd2 740 RetCode_t RA8875::foreground(unsigned char setR, unsigned char setG, unsigned char setB)
WiredHome 19:3f82c1161fd2 741 {
WiredHome 19:3f82c1161fd2 742 WriteCommand(0x63, setR);
WiredHome 19:3f82c1161fd2 743 WriteCommand(0x64, setG);
WiredHome 19:3f82c1161fd2 744 WriteCommand(0x65, setB);
WiredHome 19:3f82c1161fd2 745 return noerror;
WiredHome 19:3f82c1161fd2 746 }
WiredHome 19:3f82c1161fd2 747
WiredHome 19:3f82c1161fd2 748 unsigned int RA8875::GetForeColor(void)
WiredHome 19:3f82c1161fd2 749 {
WiredHome 19:3f82c1161fd2 750 color_t color;
WiredHome 19:3f82c1161fd2 751
WiredHome 19:3f82c1161fd2 752 color = (ReadCommand(0x63) & 0x1F) << 11;
WiredHome 19:3f82c1161fd2 753 color |= (ReadCommand(0x64) & 0x3F) << 5;
WiredHome 19:3f82c1161fd2 754 color |= (ReadCommand(0x65) & 0x1F);
WiredHome 19:3f82c1161fd2 755 return color;
WiredHome 19:3f82c1161fd2 756 }
WiredHome 19:3f82c1161fd2 757
WiredHome 19:3f82c1161fd2 758 color_t RA8875::DOSColor(int i)
WiredHome 19:3f82c1161fd2 759 {
WiredHome 19:3f82c1161fd2 760 const color_t colors[16] =
WiredHome 19:3f82c1161fd2 761 {
WiredHome 19:3f82c1161fd2 762 Black, Blue, Green, Cyan,
WiredHome 19:3f82c1161fd2 763 Red, Magenta, Brown, Gray,
WiredHome 19:3f82c1161fd2 764 Charcoal, BrightBlue, BrightGreen, BrightCyan,
WiredHome 19:3f82c1161fd2 765 Orange, Pink, Yellow, White
WiredHome 19:3f82c1161fd2 766 };
WiredHome 19:3f82c1161fd2 767 if (i < 16)
WiredHome 19:3f82c1161fd2 768 return colors[i];
WiredHome 19:3f82c1161fd2 769 else
WiredHome 19:3f82c1161fd2 770 return 0;
WiredHome 19:3f82c1161fd2 771 }
WiredHome 19:3f82c1161fd2 772
WiredHome 19:3f82c1161fd2 773 const char * RA8875::DOSColorNames(int i)
WiredHome 19:3f82c1161fd2 774 {
WiredHome 19:3f82c1161fd2 775 const char * names[16] =
WiredHome 19:3f82c1161fd2 776 {
WiredHome 19:3f82c1161fd2 777 "Black", "Blue", "Green", "Cyan",
WiredHome 19:3f82c1161fd2 778 "Red", "Magenta", "Brown", "Gray",
WiredHome 19:3f82c1161fd2 779 "Charcoal", "BrightBlue", "BrightGreen", "BrightCyan",
WiredHome 19:3f82c1161fd2 780 "Orange", "Pink", "Yellow", "White"
WiredHome 19:3f82c1161fd2 781 };
WiredHome 19:3f82c1161fd2 782 if (i < 16)
WiredHome 19:3f82c1161fd2 783 return names[i];
WiredHome 19:3f82c1161fd2 784 else
WiredHome 19:3f82c1161fd2 785 return NULL;
WiredHome 19:3f82c1161fd2 786 }
WiredHome 19:3f82c1161fd2 787
WiredHome 19:3f82c1161fd2 788
WiredHome 19:3f82c1161fd2 789 ///////////////////////////////////////////////////////////////
WiredHome 19:3f82c1161fd2 790 // Private functions
WiredHome 19:3f82c1161fd2 791
WiredHome 19:3f82c1161fd2 792 unsigned char RA8875::spiwrite(unsigned char data)
WiredHome 19:3f82c1161fd2 793 {
WiredHome 19:3f82c1161fd2 794 unsigned char retval;
WiredHome 19:3f82c1161fd2 795
WiredHome 19:3f82c1161fd2 796 retval = spi.write(data);
WiredHome 19:3f82c1161fd2 797 return retval;
WiredHome 19:3f82c1161fd2 798 }
WiredHome 19:3f82c1161fd2 799
WiredHome 19:3f82c1161fd2 800 unsigned char RA8875::spiread(void)
WiredHome 19:3f82c1161fd2 801 {
WiredHome 19:3f82c1161fd2 802 unsigned char retval;
WiredHome 19:3f82c1161fd2 803 unsigned char data = 0;
WiredHome 19:3f82c1161fd2 804
WiredHome 19:3f82c1161fd2 805 retval = spi.write(data);
WiredHome 19:3f82c1161fd2 806 return retval;
WiredHome 19:3f82c1161fd2 807 }
WiredHome 19:3f82c1161fd2 808
WiredHome 19:3f82c1161fd2 809 RetCode_t RA8875::select(bool chipsel)
WiredHome 19:3f82c1161fd2 810 {
WiredHome 19:3f82c1161fd2 811 cs = (chipsel == true) ? 0 : 1;
WiredHome 19:3f82c1161fd2 812 return noerror;
WiredHome 19:3f82c1161fd2 813 }
WiredHome 19:3f82c1161fd2 814
WiredHome 19:3f82c1161fd2 815 RetCode_t RA8875::init(void)
WiredHome 19:3f82c1161fd2 816 {
WiredHome 19:3f82c1161fd2 817 Backlight_u8(0);
WiredHome 19:3f82c1161fd2 818 WriteCommand(0x88, 0x0a); // PLLC1 - Phase Lock Loop registers
WiredHome 19:3f82c1161fd2 819 wait_ms(1);
WiredHome 19:3f82c1161fd2 820 WriteCommand(0x89, 0x02);
WiredHome 19:3f82c1161fd2 821 wait_ms(1);
WiredHome 19:3f82c1161fd2 822
WiredHome 19:3f82c1161fd2 823 //?
WiredHome 19:3f82c1161fd2 824 WriteCommand(0x10, 0x0C); //SYSR bit[4:3]=00 256 color bit[2:1]= 00 8bit MPU interface, 1x 64k color 1x 16bit
WiredHome 19:3f82c1161fd2 825
WiredHome 19:3f82c1161fd2 826 //?
WiredHome 19:3f82c1161fd2 827 WriteCommand(0x04, 0x82); //PCLK
WiredHome 19:3f82c1161fd2 828 wait_ms(1);
WiredHome 19:3f82c1161fd2 829
WiredHome 19:3f82c1161fd2 830 // Horizontal Settings
WiredHome 19:3f82c1161fd2 831 WriteCommand(0x14, RA8875_DISPLAY_WIDTH/8 - 1); //HDWR//Horizontal Display Width Setting Bit[6:0]
WiredHome 19:3f82c1161fd2 832 WriteCommand(0x15, 0x02); //HNDFCR//Horizontal Non-Display Period fine tune Bit[3:0]
WiredHome 19:3f82c1161fd2 833 WriteCommand(0x16, 0x03); //HNDR//Horizontal Non-Display Period Bit[4:0]
WiredHome 19:3f82c1161fd2 834 WriteCommand(0x17, 0x01); //HSTR//HSYNC Start Position[4:0]
WiredHome 19:3f82c1161fd2 835 WriteCommand(0x18, 0x03); //HPWR//HSYNC Polarity ,The period width of HSYNC.
WiredHome 19:3f82c1161fd2 836
WiredHome 19:3f82c1161fd2 837 // Vertical Settings
WiredHome 19:3f82c1161fd2 838 WriteCommand(0x19, (RA8875_DISPLAY_HEIGHT-1)&0xFF); //VDHR0 //Vertical Display Height Bit [7:0]
WiredHome 19:3f82c1161fd2 839 WriteCommand(0x1a, (RA8875_DISPLAY_HEIGHT-1)>>8); //VDHR1 //Vertical Display Height Bit [8]
WiredHome 19:3f82c1161fd2 840 WriteCommand(0x1b, 0x0F); //VNDR0 //Vertical Non-Display Period Bit [7:0]
WiredHome 19:3f82c1161fd2 841 WriteCommand(0x1c, 0x00); //VNDR1 //Vertical Non-Display Period Bit [8]
WiredHome 19:3f82c1161fd2 842 WriteCommand(0x1d, 0x0e); //VSTR0 //VSYNC Start Position[7:0]
WiredHome 19:3f82c1161fd2 843 WriteCommand(0x1e, 0x06); //VSTR1 //VSYNC Start Position[8]
WiredHome 19:3f82c1161fd2 844 WriteCommand(0x1f, 0x01); //VPWR //VSYNC Polarity ,VSYNC Pulse Width[6:0]
WiredHome 19:3f82c1161fd2 845
WiredHome 19:3f82c1161fd2 846 // Clear ram image
WiredHome 19:3f82c1161fd2 847 SetWindow(0,0, width(), height()); // Initialize to full screen
WiredHome 19:3f82c1161fd2 848 foreground(Black);
WiredHome 19:3f82c1161fd2 849 background(Black);
WiredHome 19:3f82c1161fd2 850 cls();
WiredHome 19:3f82c1161fd2 851 return noerror;
WiredHome 19:3f82c1161fd2 852 }
WiredHome 19:3f82c1161fd2 853