Extended library to include a screensaver

Dependencies:   SDFileSystem

Fork of 4DGL-uLCD-SE by Jay Danner

Committer:
macenzofan
Date:
Wed Feb 08 21:53:30 2017 +0000
Revision:
3:f09725357991
Parent:
1:6b33efd3caee
IOT EC

Who changed what in which revision?

UserRevisionLine numberNew 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 }