screensaver extension to uLCD

Dependencies:   4DGL-uLCD-SE mbed-rtos mbed

Committer:
jdanner3
Date:
Fri Mar 13 08:44:15 2015 +0000
Revision:
0:b193ec191a95
Child:
1:8a33c01add45
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jdanner3 0:b193ec191a95 1 #include "mbed.h"
jdanner3 0:b193ec191a95 2 #include "uLCD_4DGL.h"
jdanner3 0:b193ec191a95 3 #include "rtos.h"
jdanner3 0:b193ec191a95 4 #include <vector>
jdanner3 0:b193ec191a95 5
jdanner3 0:b193ec191a95 6 DigitalOut led1(LED1);
jdanner3 0:b193ec191a95 7 DigitalOut led2(LED2);
jdanner3 0:b193ec191a95 8 DigitalOut led3(LED3);
jdanner3 0:b193ec191a95 9 DigitalOut led4(LED4);
jdanner3 0:b193ec191a95 10 uLCD_4DGL lcd(p28, p27, p30);
jdanner3 0:b193ec191a95 11 DigitalIn refreshButton(p21);
jdanner3 0:b193ec191a95 12 Serial pc(USBTX, USBRX);
jdanner3 0:b193ec191a95 13 Mutex mutex;
jdanner3 0:b193ec191a95 14
jdanner3 0:b193ec191a95 15 // Function declarations
jdanner3 0:b193ec191a95 16 void checkRefreshButton();
jdanner3 0:b193ec191a95 17 void screensaver(void const*);
jdanner3 0:b193ec191a95 18
jdanner3 0:b193ec191a95 19 int main() {
jdanner3 0:b193ec191a95 20 refreshButton.mode(PullUp);
jdanner3 0:b193ec191a95 21 lcd.background_color(0x00000000);
jdanner3 0:b193ec191a95 22
jdanner3 0:b193ec191a95 23 // Draw some initial objects
jdanner3 0:b193ec191a95 24 int WHITE = 0x00FFFFFF;
jdanner3 0:b193ec191a95 25 lcd.filled_circle(64, 64, 25, WHITE);
jdanner3 0:b193ec191a95 26 lcd.filled_circle(25, 45, 25, WHITE);
jdanner3 0:b193ec191a95 27 lcd.filled_circle(90, 90, 25, WHITE);
jdanner3 0:b193ec191a95 28 lcd.filled_circle(90, 35, 25, WHITE);
jdanner3 0:b193ec191a95 29 Thread screensave(screensaver);
jdanner3 0:b193ec191a95 30
jdanner3 0:b193ec191a95 31 while(1) {
jdanner3 0:b193ec191a95 32 // Lock the LCD and check to see if screensaver
jdanner3 0:b193ec191a95 33 // should be (de)activated
jdanner3 0:b193ec191a95 34 mutex.lock();
jdanner3 0:b193ec191a95 35 lcd.checkActiveScreenTime();
jdanner3 0:b193ec191a95 36 mutex.unlock();
jdanner3 0:b193ec191a95 37
jdanner3 0:b193ec191a95 38 // Check state of screen refresh pushbutton
jdanner3 0:b193ec191a95 39 checkRefreshButton();
jdanner3 0:b193ec191a95 40 led1 = !led1;
jdanner3 0:b193ec191a95 41 Thread::wait(500);
jdanner3 0:b193ec191a95 42 }
jdanner3 0:b193ec191a95 43 }
jdanner3 0:b193ec191a95 44
jdanner3 0:b193ec191a95 45
jdanner3 0:b193ec191a95 46 // Graphics for the screensaver
jdanner3 0:b193ec191a95 47 void screensaver(void const* p) {
jdanner3 0:b193ec191a95 48
jdanner3 0:b193ec191a95 49 // Show the screensaver
jdanner3 0:b193ec191a95 50 int trail_size = 64;
jdanner3 0:b193ec191a95 51 int xbound_l = 0;
jdanner3 0:b193ec191a95 52 int xbound_r = 127;
jdanner3 0:b193ec191a95 53 int ybound_t = 0;
jdanner3 0:b193ec191a95 54 int ybound_b = 127;
jdanner3 0:b193ec191a95 55
jdanner3 0:b193ec191a95 56 int x = 64;
jdanner3 0:b193ec191a95 57 int y = 64;
jdanner3 0:b193ec191a95 58 int px = 0;
jdanner3 0:b193ec191a95 59 int py = 0;
jdanner3 0:b193ec191a95 60 int dx = 2;
jdanner3 0:b193ec191a95 61 int dy = 1;
jdanner3 0:b193ec191a95 62 int loopCounter = 0;
jdanner3 0:b193ec191a95 63
jdanner3 0:b193ec191a95 64 uint8_t R = 0xFF;
jdanner3 0:b193ec191a95 65 uint8_t G = 0x00;
jdanner3 0:b193ec191a95 66 uint8_t dG = 0x02;
jdanner3 0:b193ec191a95 67 uint8_t B = 0xFF;
jdanner3 0:b193ec191a95 68 uint8_t dB = 0x02;
jdanner3 0:b193ec191a95 69 uint32_t COLOR = 0x0;
jdanner3 0:b193ec191a95 70
jdanner3 0:b193ec191a95 71 lcd.baudrate(3000000);
jdanner3 0:b193ec191a95 72
jdanner3 0:b193ec191a95 73 std::vector<int> trail_px;
jdanner3 0:b193ec191a95 74 std::vector<int> trail_py;
jdanner3 0:b193ec191a95 75
jdanner3 0:b193ec191a95 76 while(1) {
jdanner3 0:b193ec191a95 77 if (!lcd.isInScreensaverMode()) {
jdanner3 0:b193ec191a95 78 Thread::yield();
jdanner3 0:b193ec191a95 79 } else {
jdanner3 0:b193ec191a95 80
jdanner3 0:b193ec191a95 81 if (loopCounter++ == 100000) {
jdanner3 0:b193ec191a95 82 COLOR=0x0;
jdanner3 0:b193ec191a95 83 R = ~B;
jdanner3 0:b193ec191a95 84 G += dG;
jdanner3 0:b193ec191a95 85 B += dB;
jdanner3 0:b193ec191a95 86
jdanner3 0:b193ec191a95 87 COLOR |= R << 16;
jdanner3 0:b193ec191a95 88 COLOR |= G << 8;
jdanner3 0:b193ec191a95 89 COLOR |= B;
jdanner3 0:b193ec191a95 90 COLOR = COLOR ^ 0xFFFFFF;
jdanner3 0:b193ec191a95 91
jdanner3 0:b193ec191a95 92 px = x;
jdanner3 0:b193ec191a95 93 py = y;
jdanner3 0:b193ec191a95 94
jdanner3 0:b193ec191a95 95 trail_px.push_back(px);
jdanner3 0:b193ec191a95 96 trail_py.push_back(py);
jdanner3 0:b193ec191a95 97 if(trail_px.size() > trail_size) {
jdanner3 0:b193ec191a95 98 lcd.pixel(*trail_px.begin(), *trail_py.begin(), 0x0, true);
jdanner3 0:b193ec191a95 99 trail_px.erase( trail_px.begin() );
jdanner3 0:b193ec191a95 100 trail_py.erase( trail_py.begin() );
jdanner3 0:b193ec191a95 101 }
jdanner3 0:b193ec191a95 102
jdanner3 0:b193ec191a95 103 if(trail_px.size() > trail_size) trail_px.pop_back();
jdanner3 0:b193ec191a95 104 if(trail_py.size() > trail_size) trail_py.pop_back();
jdanner3 0:b193ec191a95 105
jdanner3 0:b193ec191a95 106 if((x+dx) >= xbound_r || (x+dx) <= xbound_l) dx *= -1;
jdanner3 0:b193ec191a95 107 if((y+dy) >= ybound_b || (y+dy) <= ybound_t) dy *= -1;
jdanner3 0:b193ec191a95 108
jdanner3 0:b193ec191a95 109 x += dx;
jdanner3 0:b193ec191a95 110 y += dy;
jdanner3 0:b193ec191a95 111
jdanner3 0:b193ec191a95 112 mutex.lock();
jdanner3 0:b193ec191a95 113 lcd.pixel(x, y, COLOR, true);
jdanner3 0:b193ec191a95 114 mutex.unlock();
jdanner3 0:b193ec191a95 115
jdanner3 0:b193ec191a95 116 loopCounter = 0;
jdanner3 0:b193ec191a95 117 }
jdanner3 0:b193ec191a95 118 }
jdanner3 0:b193ec191a95 119 }
jdanner3 0:b193ec191a95 120 }
jdanner3 0:b193ec191a95 121
jdanner3 0:b193ec191a95 122
jdanner3 0:b193ec191a95 123 // Check the state of the screen refresh pushbutton
jdanner3 0:b193ec191a95 124 void checkRefreshButton() {
jdanner3 0:b193ec191a95 125 if (refreshButton == 0) {
jdanner3 0:b193ec191a95 126 if (lcd.isInScreensaverMode()) {
jdanner3 0:b193ec191a95 127 mutex.lock();
jdanner3 0:b193ec191a95 128 lcd.exitScreensaverMode();
jdanner3 0:b193ec191a95 129 mutex.unlock();
jdanner3 0:b193ec191a95 130 }
jdanner3 0:b193ec191a95 131 else {
jdanner3 0:b193ec191a95 132 lcd.reportScreenInteraction();
jdanner3 0:b193ec191a95 133 }
jdanner3 0:b193ec191a95 134 }
jdanner3 0:b193ec191a95 135 }