Fork of David Smart's RA8875 library

Fork of RA8875 by David Smart

Committer:
WiredHome
Date:
Sun Jan 12 17:40:32 2014 +0000
Revision:
19:3f82c1161fd2
Child:
20:6e2e4a8372eb
Initial commit - mostly working (not Triangles, Externals Fonts). Not ready for other users.

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