Extended library to include a screensaver
uLCD_Screensaver.cpp@1:6b33efd3caee, 2015-03-13 (annotated)
- Committer:
- jdanner3
- Date:
- Fri Mar 13 14:37:56 2015 +0000
- Revision:
- 1:6b33efd3caee
- Parent:
- 0:975087cba076
Updated docs
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jdanner3 | 0:975087cba076 | 1 | /** |
jdanner3 | 0:975087cba076 | 2 | Screensaver functions for the uLCD_4DGL |
jdanner3 | 0:975087cba076 | 3 | */ |
jdanner3 | 0:975087cba076 | 4 | #include "mbed.h" |
jdanner3 | 0:975087cba076 | 5 | #include "uLCD_4DGL.h" |
jdanner3 | 0:975087cba076 | 6 | |
jdanner3 | 1:6b33efd3caee | 7 | /** Determine if the screensaver should be shown */ |
jdanner3 | 0:975087cba076 | 8 | void uLCD_4DGL :: checkActiveScreenTime() { |
jdanner3 | 0:975087cba076 | 9 | time(&now); |
jdanner3 | 0:975087cba076 | 10 | if (difftime(now, lastDisplayActivityTime) >= max_active_screen_interval) { |
jdanner3 | 0:975087cba076 | 11 | if (!inScreensaverMode) { |
jdanner3 | 0:975087cba076 | 12 | enableScreensaverMode(); |
jdanner3 | 0:975087cba076 | 13 | } else if (inScreensaverHysteresis) { |
jdanner3 | 0:975087cba076 | 14 | inScreensaverHysteresis = false; |
jdanner3 | 0:975087cba076 | 15 | } |
jdanner3 | 0:975087cba076 | 16 | } |
jdanner3 | 0:975087cba076 | 17 | } |
jdanner3 | 0:975087cba076 | 18 | |
jdanner3 | 1:6b33efd3caee | 19 | /** Whenever a change is made to the LCD screen that is not part of the |
jdanner3 | 1:6b33efd3caee | 20 | screensaver graphics method, it is reported and the last screen |
jdanner3 | 1:6b33efd3caee | 21 | activity time is updated */ |
jdanner3 | 0:975087cba076 | 22 | void uLCD_4DGL :: reportScreenInteraction() { |
jdanner3 | 0:975087cba076 | 23 | time(&lastDisplayActivityTime); // indicate that the screen is still active |
jdanner3 | 0:975087cba076 | 24 | if (inScreensaverMode) { |
jdanner3 | 0:975087cba076 | 25 | exitScreensaverMode(); |
jdanner3 | 0:975087cba076 | 26 | } |
jdanner3 | 0:975087cba076 | 27 | } |
jdanner3 | 0:975087cba076 | 28 | |
jdanner3 | 1:6b33efd3caee | 29 | /** Initialize the screen saver */ |
jdanner3 | 0:975087cba076 | 30 | void uLCD_4DGL :: enableScreensaverMode() { |
jdanner3 | 0:975087cba076 | 31 | inScreensaverMode = true; |
jdanner3 | 0:975087cba076 | 32 | backupStateOfScreen(); |
jdanner3 | 0:975087cba076 | 33 | inScreensaverHysteresis = true; |
jdanner3 | 0:975087cba076 | 34 | cls(); |
jdanner3 | 0:975087cba076 | 35 | #if MYDEBUG |
jdanner3 | 0:975087cba076 | 36 | pc.printf("Going into screensaver mode\r\n"); |
jdanner3 | 0:975087cba076 | 37 | #endif |
jdanner3 | 0:975087cba076 | 38 | } |
jdanner3 | 0:975087cba076 | 39 | |
jdanner3 | 1:6b33efd3caee | 40 | /** Close the screen saver */ |
jdanner3 | 0:975087cba076 | 41 | void uLCD_4DGL :: exitScreensaverMode() { |
jdanner3 | 0:975087cba076 | 42 | inScreensaverMode = false; |
jdanner3 | 0:975087cba076 | 43 | restoreStateOfScreen(); |
jdanner3 | 0:975087cba076 | 44 | inScreensaverHysteresis = false; |
jdanner3 | 0:975087cba076 | 45 | #if MYDEBUG |
jdanner3 | 0:975087cba076 | 46 | pc.printf("Going out of screensaver mode\r\n"); |
jdanner3 | 0:975087cba076 | 47 | #endif |
jdanner3 | 0:975087cba076 | 48 | } |
jdanner3 | 0:975087cba076 | 49 | |
jdanner3 | 1:6b33efd3caee | 50 | /** Set the timeout interval for active screen */ |
jdanner3 | 0:975087cba076 | 51 | void uLCD_4DGL :: setActiveScreenInterval(int newInterval) { |
jdanner3 | 0:975087cba076 | 52 | max_active_screen_interval = newInterval; |
jdanner3 | 0:975087cba076 | 53 | } |
jdanner3 | 0:975087cba076 | 54 | |
jdanner3 | 1:6b33efd3caee | 55 | /** Get the timeout interval for active screen */ |
jdanner3 | 0:975087cba076 | 56 | int uLCD_4DGL :: getActiveScreenInterval() { |
jdanner3 | 0:975087cba076 | 57 | return max_active_screen_interval; |
jdanner3 | 0:975087cba076 | 58 | } |
jdanner3 | 0:975087cba076 | 59 | |
jdanner3 | 1:6b33efd3caee | 60 | /**Return whether the LCD is currently in screen saver mode */ |
jdanner3 | 0:975087cba076 | 61 | bool uLCD_4DGL :: isInScreensaverMode() { |
jdanner3 | 0:975087cba076 | 62 | return inScreensaverMode; |
jdanner3 | 0:975087cba076 | 63 | } |
jdanner3 | 0:975087cba076 | 64 | |
jdanner3 | 1:6b33efd3caee | 65 | /** Backup the current pixels of the display to the sd card */ |
jdanner3 | 0:975087cba076 | 66 | void uLCD_4DGL :: backupStateOfScreen() { |
jdanner3 | 0:975087cba076 | 67 | FILE* data = fopen("/sd/pixelData.txt","w"); |
jdanner3 | 0:975087cba076 | 68 | fclose(data); |
jdanner3 | 0:975087cba076 | 69 | data = fopen("/sd/pixelData.txt","a"); |
jdanner3 | 0:975087cba076 | 70 | if (data == NULL) { |
jdanner3 | 0:975087cba076 | 71 | pc.printf("Data file failed to open!\r\n"); |
jdanner3 | 0:975087cba076 | 72 | } |
jdanner3 | 0:975087cba076 | 73 | for (int x = 0; x < 127; x+=2) { |
jdanner3 | 0:975087cba076 | 74 | for (int y = 0; y < 127; y+=2) { |
jdanner3 | 0:975087cba076 | 75 | int color = read_pixel(x, y); |
jdanner3 | 0:975087cba076 | 76 | if (color > 0 && color != 1536 && color != 1538) { |
jdanner3 | 0:975087cba076 | 77 | fprintf(data, "%i %i %i\n", x, y, color); |
jdanner3 | 0:975087cba076 | 78 | } |
jdanner3 | 0:975087cba076 | 79 | |
jdanner3 | 0:975087cba076 | 80 | } |
jdanner3 | 0:975087cba076 | 81 | } |
jdanner3 | 0:975087cba076 | 82 | fclose(data); |
jdanner3 | 0:975087cba076 | 83 | } |
jdanner3 | 0:975087cba076 | 84 | |
jdanner3 | 0:975087cba076 | 85 | // Retrive the backed-up pixel display |
jdanner3 | 0:975087cba076 | 86 | // from the sd card |
jdanner3 | 0:975087cba076 | 87 | void uLCD_4DGL :: restoreStateOfScreen() { |
jdanner3 | 0:975087cba076 | 88 | cls(); |
jdanner3 | 0:975087cba076 | 89 | const int CHARS = 16; |
jdanner3 | 0:975087cba076 | 90 | const int TOKENS = 4; |
jdanner3 | 0:975087cba076 | 91 | const char* const delim = " "; |
jdanner3 | 0:975087cba076 | 92 | |
jdanner3 | 0:975087cba076 | 93 | std::ifstream fin; |
jdanner3 | 0:975087cba076 | 94 | fin.open("/sd/pixelData.txt"); |
jdanner3 | 0:975087cba076 | 95 | |
jdanner3 | 0:975087cba076 | 96 | while(!fin.eof()) { |
jdanner3 | 0:975087cba076 | 97 | // int char int char int \n |
jdanner3 | 0:975087cba076 | 98 | // 4 + 1 + 4 + 1 + 4 + 1 |
jdanner3 | 0:975087cba076 | 99 | char buf[CHARS]; |
jdanner3 | 0:975087cba076 | 100 | fin.getline(buf, CHARS); |
jdanner3 | 0:975087cba076 | 101 | const char* token[TOKENS] = {}; |
jdanner3 | 0:975087cba076 | 102 | |
jdanner3 | 0:975087cba076 | 103 | int i=0; |
jdanner3 | 0:975087cba076 | 104 | int color; |
jdanner3 | 0:975087cba076 | 105 | token[0] = strtok(buf, delim); |
jdanner3 | 0:975087cba076 | 106 | if(token[0]) { |
jdanner3 | 0:975087cba076 | 107 | for(i=1; i<TOKENS; i++) { |
jdanner3 | 0:975087cba076 | 108 | token[i] = strtok(0, delim); |
jdanner3 | 0:975087cba076 | 109 | if(!token[i]) break; |
jdanner3 | 0:975087cba076 | 110 | color = atoi(token[2]); |
jdanner3 | 0:975087cba076 | 111 | if (color > 0 && color != 1536 && color != 1538) { |
jdanner3 | 0:975087cba076 | 112 | int red5 = (color >> 11) & 0x1F; |
jdanner3 | 0:975087cba076 | 113 | int green6 = (color >> 5) & 0x1F; |
jdanner3 | 0:975087cba076 | 114 | int blue5 = (color >> 0) & 0x1F; |
jdanner3 | 0:975087cba076 | 115 | color = 0; |
jdanner3 | 0:975087cba076 | 116 | color |= blue5 << 0 + 3; |
jdanner3 | 0:975087cba076 | 117 | color |= green6 << 2 + 8; |
jdanner3 | 0:975087cba076 | 118 | color |= red5 << 16 + 3; |
jdanner3 | 0:975087cba076 | 119 | pixel(atoi(token[0]), atoi(token[1]), color); |
jdanner3 | 0:975087cba076 | 120 | } else { |
jdanner3 | 0:975087cba076 | 121 | pixel(atoi(token[0]), atoi(token[1]), 0); |
jdanner3 | 0:975087cba076 | 122 | } |
jdanner3 | 0:975087cba076 | 123 | } |
jdanner3 | 0:975087cba076 | 124 | } |
jdanner3 | 0:975087cba076 | 125 | } |
jdanner3 | 0:975087cba076 | 126 | fin.close(); |
jdanner3 | 0:975087cba076 | 127 | } |