diff --git a/src/main.cpp b/src/main.cpp index b6c42c2..3609a5b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,6 +12,8 @@ #define DISPLAY_CS_PIN D6 #define VERTICAL_BAR_STARTS_TOP false #define DEBUG_RELAYS false +#define DEBUG_DISPLAY false +#define DEBUG_LVL 0 #include #include @@ -58,7 +60,7 @@ WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000); // Field default values -char *clockName = "FastClk "; +char *clockName = "FREMO"; char *clockSpeed_modelMsPerRealSec_String = "250"; int clockSpeed_modelMsPerRealSec = 250; char *relay1Pin_String = "D1"; @@ -68,7 +70,14 @@ char *relayHoldTime_ms_String = "200"; int relayHoldTime_ms = 200; char *relayMinOffTime_ms_String = "100"; int relayMinOffTime_ms = 100; +int displayRefresh_ms = 200; +// Clock Display Config Parameter +static char * displayClockNameEvery_ms_String = "16000"; +static char * displayClockNameDuration_ms_String = "1200"; +static uint32_t displayClockNameEvery_ms = 16000; +static uint32_t displayClockNameDuration_ms = 1200; +static uint32_t doNotShowClockNameBeforeAndAfterMinuteChange_s = 2; void setupIAS(void) { #if defined ESP8266 @@ -87,6 +96,8 @@ void setupIAS(void) { // define fields IAS.addField(clockName, "Clock Name", 8, 'T'); IAS.addField(clockSpeed_modelMsPerRealSec_String, "Model MilliSec per Real Sec", 8, 'N'); + IAS.addField(displayClockNameEvery_ms_String, "Display clock name every (ms)", 5, 'N'); + IAS.addField(displayClockNameDuration_ms_String, "Display clock name duration (ms)", 5, 'N'); IAS.addField(relay1Pin_String, "Pin Relay 1", 2, 'P'); IAS.addField(relay2Pin_String, "Pin Relay 2", 2, 'P'); IAS.addField(relayHoldTime_ms_String, "Relay hold time (ms)", 3, 'N'); @@ -148,6 +159,8 @@ void setupIAS(void) { relay2Pin = IAS.dPinConv(relay2Pin_String); relayHoldTime_ms = atoi(relayHoldTime_ms_String); relayMinOffTime_ms = atoi(relayMinOffTime_ms_String); + displayClockNameEvery_ms = atoi(displayClockNameEvery_ms_String); + displayClockNameDuration_ms = atoi(displayClockNameDuration_ms_String); Serial.println(F("Configuration used:")); Serial.print(F("Relay1 Pin: ")); Serial.println(relay1Pin); @@ -155,6 +168,9 @@ void setupIAS(void) { Serial.print(F("Clock speed: ")); Serial.print(clockSpeed_modelMsPerRealSec); Serial.println(F(" model ms per real sec")); Serial.print(F("Relay hold time (ms): ")); Serial.println(relayHoldTime_ms); Serial.print(F("Relay min off time (ms): ")); Serial.println(relayMinOffTime_ms); + Serial.print(F("Clock speed (model ms per real time s): ")); Serial.println(clockSpeed_modelMsPerRealSec); + Serial.print(F("Show clock name every (ms): ")); Serial.println(displayClockNameEvery_ms); + Serial.print(F("Show clock name for (ms): ")); Serial.println(displayClockNameDuration_ms); } void setupRelays(int relay1Pin, int relay2Pin) { @@ -191,14 +207,18 @@ void setupDisplay() { 1, 0xff, /* vertical bar completely set */ }; // columns from right to left, each byte is a single column #endif + static uint8_t newZero[] = {0x05, 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x00}; P.begin(); // P.setZoneEffect(0, true, PA_FLIP_LR); P.setIntensity(1); - for (charCode=1; charCode<=8; ++charCode) { + for (charCode=1; charCode<=9; ++charCode) { P.addChar(charCode, verticalBarFont+2*(charCode-1)); } char intro[] = {':', '-', ')', ' ', 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00}; + + // replace the 0 characters, we do not like the "slash" + P.addChar('0', newZero); P.print(intro); } void setup(void) @@ -299,8 +319,9 @@ void loop(void) minutes = (millis() / 60 * 1000) % 60; seconds = (millis() / 1000) % 60; } - minuteProgressIndicator = seconds/7.5 + 1; // char code 1-8 show vertical bar - snprintf(timeBuffer, 10, "%c %02d:%02d", minuteProgressIndicator, hours, minutes); + minuteProgressIndicator = seconds/6.7 + 1; // char code 1-8 show vertical bar + if (minuteProgressIndicator > 9) minuteProgressIndicator = 9; + snprintf(timeBuffer, 10, "%c %2d:%02d", minuteProgressIndicator, hours, minutes); /* DEBUG */ #if DEBUG_RELAYS @@ -327,6 +348,7 @@ void loop(void) currentDisplayState = seconds / 5; // Value 0..11 +#if DEBUG_DISPLAY static bool executed = false; if (recentDisplayState != currentDisplayState) executed = false; @@ -352,15 +374,43 @@ void loop(void) break; case 7: ExecOnce(P.print(timeBuffer)); break; case 8: - /*snprintf(debugMsg, MsgSize, "t%cr%c", timeClientInitialized ? 'x':'-', (relaysState == RELAY_STATE_OFF)?'-':(relaysState == RELAY_STATE_ON_EVEN_MINUTE?'e':'o')); + snprintf(debugMsg, MsgSize, "t%cr%c", timeClientInitialized ? 'x':'-', (relaysState == RELAY_STATE_OFF)?'-':(relaysState == RELAY_STATE_ON_EVEN_MINUTE?'e':'o')); ExecOnce(P.print(debugMsg)); - break;*/ + break; case 9: ExecOnce(P.print(timeBuffer)); break; case 10: if (lastSeconds != seconds) P.printf("%c %d", minuteProgressIndicator, seconds); break; case 11: ExecOnce(P.print(timeBuffer)); break; default: ExecOnce(P.print("default")); break; } recentDisplayState = currentDisplayState; +#else + // standard procedure to display + static uint32_t last_clock_refresh = 0; + static uint32_t lastTimeClockNameShown = 0; + static boolean showingClockName = false; + + if (showingClockName) { + if (millis() - lastTimeClockNameShown > displayClockNameDuration_ms) { + // stop showingClockName + showingClockName = false; + } + } else { + if ((millis() - lastTimeClockNameShown > displayClockNameEvery_ms) + && (seconds < 60-doNotShowClockNameBeforeAndAfterMinuteChange_s) + && (seconds > doNotShowClockNameBeforeAndAfterMinuteChange_s)) { + P.print(clockName); + lastTimeClockNameShown = millis(); + showingClockName = true; + } else { + // showing clock + if (millis() - last_clock_refresh > displayRefresh_ms) { + P.print(timeBuffer); + last_clock_refresh = millis(); + } + } + } + +#endif // toggle relays if (lastMinutes != minutes) {