00001
00002
00003
00004
00005
00006
00007
00008 #include "uOLED.h"
00009 #include "WProgram.h"
00010
00011 uOLED::uOLED(void) {}
00012
00013 void uOLED::begin(int pin, long baud, HardwareSerial *serialToUse)
00014 {
00015 pSerial = serialToUse;
00016 PinReset= pin;
00017 pinMode(PinReset, OUTPUT);
00018
00019
00020 digitalWrite(PinReset,LOW);
00021 delay(30);
00022 digitalWrite(PinReset,HIGH);
00023 delay(1000);
00024 begin(baud);
00025 write(0x55);
00026
00027 res=RBack();
00028
00029 DevInfoInVar();
00030
00031 Cls();
00032 }
00033
00034 void uOLED::write(byte pData)
00035 {
00036 pSerial->write(pData);
00037 }
00038
00039 void uOLED::begin(long BaudRate)
00040 {
00041 pSerial->begin(BaudRate);
00042 }
00043
00044 boolean uOLED::available()
00045 {
00046 return pSerial->available();
00047 }
00048
00049 int uOLED::read()
00050 {
00051 return pSerial->read();
00052 }
00053
00054
00055 void uOLED::Cls()
00056 {
00057 write(0x45);
00058 res=RBack();
00059 }
00060
00064 char uOLED::RBack()
00065 { long starttime = millis();
00066 while (!available())
00067 {
00068 if (millis()-starttime > 4000) {
00069 #if DEBUG
00070 debugPort.println("Serial timeout");
00071 #endif
00072 return 0;
00073 }
00074
00075
00076 }
00077 return read();
00078 }
00079
00083 void uOLED::PutPixel(char x, char y, int color)
00084 {
00085 write(0x50);
00086 write(x);
00087 write(y);
00088 write(color >> 8);
00089 write(color & 0xFF);
00090 res=RBack();
00091 }
00092
00093
00094 void uOLED::Line (char x1, char y1, char x2, char y2, int color)
00095 {
00096 write(0x4C);
00097 write(x1);
00098 write(y1);
00099 write(x2);
00100 write(y2);
00101 write(color >> 8);
00102 write(color & 0xFF);
00103 res=RBack();
00104 }
00105
00106
00107 void uOLED::PenSize(char size)
00108 {
00109 write(0x70);
00110 write(byte(size));
00111 res=RBack();
00112 }
00113
00114 void uOLED::Rectangle (char x1, char y1, char x2, char y2, int color, char filled)
00115 {
00116 PenSize(filled);
00117
00118 write(0x72);
00119 write(x1);
00120 write(y1);
00121 write(x2);
00122 write(y2);
00123 write(color >> 8);
00124 write(color & 0xFF);
00125 res=RBack();
00126 }
00127
00128 void uOLED::Circle (char x, char y, char radius, int color, char filled)
00129 {
00130 PenSize(filled);
00131
00132 write(0x43);
00133 write(x);
00134 write(y);
00135 write(radius);
00136 write(color >> 8);
00137 write(color & 0xFF);
00138 res=RBack();
00139 }
00140
00141
00142 void uOLED::SetBackColor (int color)
00143 {
00144 write(0x42);
00145 write(color >> 8);
00146 write(color & 0xFF);
00147 res=RBack();
00148 }
00149
00150 void uOLED::Triangle (char x1, char y1, char x2, char y2, char x3, char y3, int color, char filled)
00151 {
00152 PenSize(filled);
00153
00154 write(0x47);
00155 write(x1);
00156 write(y1);
00157 write(x2);
00158 write(y2);
00159 write(x3);
00160 write(y3);
00161 write(color >> 8);
00162 write(color & 0xFF);
00163 res=RBack();
00164 }
00165
00166 void uOLED::CopyPaste (char xCopy,char yCopy,char xPaste, char yPaste, char Width, char Height)
00167 {
00168 write(0x63);
00169 write(xCopy);
00170 write(yCopy);
00171 write(xPaste);
00172 write(yPaste);
00173 write(Width);
00174 write(Height);
00175 res=RBack();
00176 }
00177
00178 void uOLED::SetFontSize(char font)
00179 {
00180 write(0x46);
00181 write(font);
00182 res=RBack();
00183 }
00184
00185 void uOLED::TextMode (char mode)
00186 {
00187 write(0x4F);
00188 write(mode);
00189 res=RBack();
00190 }
00191
00192 void uOLED::Character (char Character, char font, char col, char row, int color, char transparent)
00193 {
00194 SetFontSize(font);
00195
00196 TextMode(transparent);
00197
00198 write(0x54);
00199 write(Character);
00200 write(col);
00201 write(row);
00202 write(color >> 8);
00203 write(color & 0xFF);
00204 res=RBack();
00205 }
00206
00207 void uOLED::CharacterGraphic(char Character, char font, char col, char row, int color, char Width, char Height, char transparent)
00208 {
00209 SetFontSize(font);
00210
00211 TextMode(transparent);
00212
00213 write(0x74);
00214 write(Character);
00215 write(col);
00216 write(row);
00217 write(color >> 8);
00218 write(color & 0xFF);
00219 write(Width);
00220 write(Height);
00221 res=RBack();
00222 }
00223
00224 void uOLED::Text( char col, char row, char font, int color, char *Text, char transparent)
00225 {
00226 TextMode(transparent);
00227
00228 write(0x73);
00229 write(col);
00230 write(row);
00231 write(font);
00232 write(color >> 8);
00233 write(color & 0xFF);
00234 for (int i=0 ; i<strlen(Text) ; i++)
00235 {
00236 write(Text[i]);
00237 }
00238 write(byte(0x00));
00239 res=RBack();
00240 }
00241
00242 void uOLED::TextGraphic(char col, char row, char font, int color, char Width, char Height, char *text, char transparent)
00243 {
00244 TextMode(transparent);
00245
00246 write(0x53);
00247 write(col);
00248 write(row);
00249 write(font);
00250 write(color >> 8);
00251 write(color & 0xFF);
00252 write(Width);
00253 write(Height);
00254 for (int i=0 ; i<strlen(text) ; i++)
00255 {
00256 write(text[i]);
00257 }
00258 write(byte(0x00));
00259 res=RBack();
00260 }
00261
00262 void uOLED::TextButton (char state, char x, char y, int ButtonColor, char font, int TextColor, char TextWidth, char TextHeight, char *Text)
00263 {
00264 TextMode(byte(0x00));
00265
00266 write(0x62);
00267 write(state);
00268 write(x);
00269 write(y);
00270 write(ButtonColor >> 8);
00271 write(ButtonColor & 0xFF);
00272 write(font);
00273 write(TextColor >> 8);
00274 write(TextColor & 0xFF);
00275 write(TextWidth);
00276 write(TextHeight);
00277 for (int i=0 ; i<strlen(Text) ; i++)
00278 {
00279 write(Text[i]);
00280 }
00281 write(byte(0x00));
00282 res=RBack();
00283 }
00284
00285 void uOLED::AddBMPChar(char reference, char data1,char data2,char data3,char data4,char data5,char data6,char data7,char data8)
00286 {
00287 write(0x41);
00288 write(reference);
00289 write(data1);
00290 write(data2);
00291 write(data3);
00292 write(data4);
00293 write(data5);
00294 write(data6);
00295 write(data7);
00296 write(data8);
00297 res=RBack();
00298 }
00299
00300 void uOLED::PutBMPChar(char reference, char x, char y, int color)
00301 {
00302 write(0x44);
00303 write(reference);
00304 write(x);
00305 write(y);
00306 write(color >> 8);
00307 write(color & 0xFF);
00308 res=RBack();
00309 }
00310
00311 void uOLED::DisplayControl(char Mode, char Value)
00312 {
00313 write(0x59);
00314 write(Mode);
00315 write(Value);
00316 res=RBack();
00317 }
00318
00319
00320 unsigned int uOLED::ReadPixel(char x, char y)
00321 {
00322 byte highByte;
00323 byte lowByte;
00324 unsigned int data;
00325 write(0x52);
00326 write(x);
00327 write(y);
00328 highByte = RBack();
00329 lowByte = RBack();
00330 data = word(highByte, lowByte);
00331 return data;
00332 }
00333
00334
00335 void uOLED::SetContrast(char contrastValue)
00336 {
00337 write(0x59);
00338 write(0x02);
00339 write(contrastValue);
00340 res=RBack();
00341 }
00342
00343
00344 void uOLED::SetPowerState (char state)
00345 {
00346 write(0x59);
00347 write(0x03);
00348 write(state);
00349 res=RBack();
00350 }
00351
00352
00353 void uOLED::SetDisplayState (char state)
00354 {
00355 write(0x59);
00356 write(0x01);
00357 write(state);
00358 res=RBack();
00359 }
00360
00361
00362 void uOLED::DeviceInfo ()
00363 {
00364 write(0x56);
00365 write(0x01);
00366 for ( byte i=0; i<5; i++)
00367 {
00368 RBack();
00369 }
00370 }
00371
00372 void uOLED::DevInfoInVar()
00373 {
00374 write(0x56);
00375 write(byte(0x00));
00376 for ( byte i=0; i<3; i++)
00377 {
00378 RBack();
00379 }
00380 switch (RBack())
00381 {
00382 case 0x22:
00383 x_res=219;
00384 break;
00385 case 0x28:
00386 x_res=127;
00387 break;
00388 case 0x32:
00389 x_res=319;
00390 break;
00391 case 0x60:
00392 x_res=159;
00393 break;
00394 case 0x64:
00395 x_res=63;
00396 break;
00397 case 0x76:
00398 x_res=175;
00399 break;
00400 case 0x96:
00401 x_res=95;
00402 break;
00403 }
00404 switch (RBack())
00405 {
00406 case 0x22:
00407 y_res=219;
00408 break;
00409 case 0x28:
00410 y_res=127;
00411 break;
00412 case 0x32:
00413 y_res=319;
00414 break;
00415 case 0x60:
00416 y_res=159;
00417 break;
00418 case 0x64:
00419 y_res=63;
00420 break;
00421 case 0x76:
00422 y_res=175;
00423 break;
00424 case 0x96:
00425 y_res=95;
00426 break;
00427 }
00428 }
00429
00430 void uOLED::sdInit()
00431 {
00432 write(0x40);
00433 write(0x69);
00434 res=RBack();
00435 }
00436
00437
00438 void uOLED::sdSetMemAdrr(char Umsb, char Ulsb, char Lmsb, char Llsb)
00439 {
00440 write(0x40);
00441 write(0x41);
00442 write(Umsb);
00443 write(Ulsb);
00444 write(Lmsb);
00445 write(Llsb);
00446 res=RBack();
00447 }
00448
00449 void uOLED::sdWriteByte(byte data)
00450 {
00451 write(0x40);
00452 write(0x77);
00453 write(data);
00454 res=RBack();
00455 }
00456
00457 byte uOLED::sdReadByte(void)
00458 {
00459 write(0x40);
00460 write(0x72);
00461 return RBack();;
00462 }
00463
00464 void uOLED::sdWriteBlock(long sector, byte data[])
00465 {
00466 write(0x40);
00467 write(0x57);
00468 write(sector >> 16);
00469 write(sector >> 8);
00470 write(sector & 0xFF);
00471 for (int i=0; i<512; i++) {
00472 write(data[i]);
00473 }
00474 res=RBack();
00475 }
00476
00477 void uOLED::sdReadBlock(long sector, byte data[])
00478 { write(0x40);
00479 write(0x52);
00480 write(sector >> 16);
00481 write(sector >> 8);
00482 write(sector & 0xFF);
00483 for (int j=0; j<512; j++) {
00484 data[j]=RBack();
00485 }
00486 }
00487
00488 void uOLED::sdScreenCopy(byte x, byte y, byte width, byte height, long sector)
00489 {
00490 write(0x40);
00491 write(0x43);
00492 write(x);
00493 write(y);
00494 write(width);
00495 write(height);
00496 write(sector >> 16);
00497 write(sector >> 8);
00498 write(sector & 0xFF);
00499 res=RBack();
00500 }
00501
00502 void uOLED::sdDisplayImage(byte x, byte y, byte width, byte height, boolean twoBytesPP, long sector)
00503 {
00504 write(0x40);
00505 write(0x49);
00506 write(x);
00507 write(y);
00508 write(width);
00509 write(height);
00510 if (twoBytesPP == true) {
00511 write(0x10);
00512 } else {
00513 write(0x08);
00514 }
00515 write(sector >> 16);
00516 write(sector >> 8);
00517 write(sector & 0xFF);
00518 res=RBack();
00519 }
00520
00521 void uOLED::sdDisplayVideo(byte x, byte y, byte width, byte height, boolean twoBytesPP, byte fdelay, int frames, long sector)
00522 {
00523 write(0x40);
00524 write(0x56);
00525 write(x);
00526 write(y);
00527 write(width);
00528 write(height);
00529 if (twoBytesPP == true) {
00530 write(0x10);
00531 } else {
00532 write(0x08);
00533 }
00534 write(fdelay);
00535 write(frames >> 8);
00536 write(frames & 0xFF);
00537 write(sector >> 16);
00538 write(sector >> 8);
00539 write(sector & 0xFF);
00540 res=RBack();
00541 }
00542
00543 void uOLED::scrollEnable(boolean enable)
00544 {
00545 write(0x24);
00546 write(0x53);
00547 write(0x0);
00548 write(enable);
00549 res=RBack();
00550 }
00551
00552 void uOLED::scrollToRight(boolean toRight)
00553 {
00554 write(0x24);
00555 write(0x53);
00556 write(0x01);
00557 write(toRight);
00558 res=RBack();
00559 }
00560
00561 void uOLED::scrollSpeed(byte scrollSpeed)
00562 {
00563 write(0x24);
00564 write(0x53);
00565 write(0x02);
00566 if (scrollSpeed > 7)
00567 {
00568 write(0x07);
00569 }
00570 else if (scrollSpeed < 0)
00571 {
00572 write(byte(0));
00573 } else
00574 {
00575 write(scrollSpeed);
00576 }
00577 res=RBack();
00578 }
00579
00580 void uOLED::playTone(int tone, int duration)
00581 {
00582 write(0x4e);
00583 write(tone >> 8);
00584 write(tone & 0xFF);
00585 write(duration >> 8);
00586 write(duration & 0xFF);
00587 res=RBack();
00588 }
00589
00590 #define isdigit(n) (n >= '0' && n <= '9')
00591 void uOLED::playRtttl(char *song)
00592 {
00593 const int notes[] = { 0,
00594 NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
00595 NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
00596 NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
00597 NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
00598 };
00599
00600
00601
00602 byte default_duration = 4;
00603 byte default_octave = 6;
00604 int bpm = 63;
00605 int num;
00606 long wholenote;
00607 long duration;
00608 byte note;
00609 byte scale;
00610
00611
00612
00613
00614 while(*song != ':') song++;
00615 song++;
00616
00617
00618 if(*song == 'd')
00619 {
00620 song++; song++;
00621 num = 0;
00622 while(isdigit(*song))
00623 {
00624 num = (num * 10) + (*song++ - '0');
00625 }
00626 if(num > 0) default_duration = num;
00627 song++;
00628 }
00629
00630 Serial.print("duration: "); Serial.println(default_duration, 10);
00631
00632
00633 if(*song == 'o')
00634 {
00635 song++; song++;
00636 num = *song++ - '0';
00637 if(num >= 3 && num <=7) default_octave = num;
00638 song++;
00639 }
00640
00641 Serial.print("default_octave "); Serial.println(default_octave, 10);
00642
00643
00644 if(*song == 'b')
00645 {
00646 song++; song++;
00647 num = 0;
00648 while(isdigit(*song))
00649 {
00650 num = (num * 10) + (*song++ - '0');
00651 }
00652 bpm = num;
00653 song++;
00654 }
00655
00656 Serial.print("bpm: "); Serial.println(bpm, 10);
00657
00658
00659 wholenote = (60 * 1000L / bpm) * 4;
00660
00661 Serial.print("wholenote "); Serial.print(wholenote, 10);Serial.println(" ms");
00662
00663
00664
00665 while(*song)
00666 {
00667
00668 num = 0;
00669 while(isdigit(*song))
00670 {
00671 num = (num * 10) + (*song++ - '0');
00672 }
00673
00674 if(num) duration = wholenote / num;
00675 else duration = wholenote / default_duration;
00676
00677
00678 note = 0;
00679
00680 switch(*song)
00681 {
00682 case 'c':
00683 note = 1;
00684 break;
00685 case 'd':
00686 note = 3;
00687 break;
00688 case 'e':
00689 note = 5;
00690 break;
00691 case 'f':
00692 note = 6;
00693 break;
00694 case 'g':
00695 note = 8;
00696 break;
00697 case 'a':
00698 note = 10;
00699 break;
00700 case 'b':
00701 note = 12;
00702 break;
00703 case 'p':
00704 default:
00705 note = 0;
00706 }
00707 song++;
00708
00709
00710 if(*song == '#')
00711 {
00712 note++;
00713 song++;
00714 }
00715
00716
00717 if(*song == '.')
00718 {
00719 duration += duration/2;
00720 song++;
00721 }
00722
00723
00724 if(isdigit(*song))
00725 {
00726 scale = *song - '0';
00727 song++;
00728 }
00729 else
00730 {
00731 scale = default_octave;
00732 }
00733
00734 scale += OCTAVE_OFFSET;
00735
00736 if(*song == ',')
00737 song++;
00738
00739
00740
00741 if(note)
00742 {
00743 Serial.print("Playing: ");
00744 Serial.print(scale, 10); Serial.print(' ');
00745 Serial.print(note, 10); Serial.print(" (");
00746 Serial.print(notes[(scale - 4) * 12 + note], 10);
00747 Serial.print(") ");
00748 Serial.println(duration, 10);
00749 playTone(notes[(scale - 4) * 12 + note], duration);
00750 }
00751 else
00752 {
00753 Serial.print("Pausing: ");
00754 Serial.println(duration, 10);
00755 delay(duration);
00756 }
00757 }
00758 }