2#ifdef USE_DISPLAY_MODULE
64 M5.Lcd.drawRGBBitmap(0,0, (uint16_t *)bitmap, 135,100);
69boolean _showScrollingTextWindow =
false;
71#define SHOW_BIG_BUTTON
81boolean inAlternateDisplay_displayModule()
85 return _showScrollingTextWindow;
92void printText(String text,
int maxLen);
95String _currentSemanticMarkerAddress=
"https://iDogWatch.com";
102 return _currentSemanticMarkerAddress.c_str();
104String _lastSemanticMarkerAddress =
"";
106String _semanticTitle =
"M5 Clicker";
108String _currentSemanticMarkerAddressBase =
"https://iDogWatch.com";
110const char* (*_getStatusFunc)(void) = NULL;
113boolean _semanticMarkerShown =
false;
116#define SEMANTIC_MARKER_QR_VERSION 10
120#define SCREEN_TYPE_NORMAL 0
122#define SCREEN_TYPE_HOME 1
123#define SCREEN_TYPE_STATUS 2
124#define SCREEN_TYPE_HELP 3
125#define SCREEN_TYPE_WIFI 4
126#define SCREEN_TYPE_TILT 5
127#define SCREEN_TYPE_BUZZ 6
128#define SCREEN_TYPE_AP 7
129#define SCREEN_TYPE_GUEST_PAGE 8
130#define SCREEN_TYPE_FEED_GUEST 9
131#define SCREEN_TYPE_PAIRED_DEV 10
132#define SCREEN_TYPE_RESET 11
133#define SCREEN_TYPE_REBOOT 12
135#define SCREEN_TYPE_HOME_SIMPLE 13
136#define SCREEN_TYPE_HOME_SIMPLE_1 14
137#define SCREEN_TYPE_HOME_SIMPLE_2 15
138#define SCREEN_TYPE_HOME_SIMPLE_3 16
139#define SCREEN_TYPE_DOC_FOLLOW 17
140#define SCREEN_TYPE_TIMER 18
143int _currentScreenType = SCREEN_TYPE_NORMAL;
147int screenTypeForTitle_displayModule(String title)
151 int screenType = SCREEN_TYPE_NORMAL;
152 if (title.compareTo(
"MINI CLICKER")==0)
154 screenType = SCREEN_TYPE_HOME_SIMPLE;
156 else if (title.compareTo(
"MINI-1")==0)
158 screenType = SCREEN_TYPE_HOME_SIMPLE_1;
160 else if (title.compareTo(
"MINI-2")==0)
162 screenType = SCREEN_TYPE_HOME_SIMPLE_2;
166 else if (title.compareTo(
"MINI-3")==0)
168 screenType = SCREEN_TYPE_HOME_SIMPLE_3;
171 else if (title.compareTo(
"WIFI FEED")==0)
173 screenType = SCREEN_TYPE_HOME;
175 else if (title.startsWith(
"HELP"))
177 screenType = SCREEN_TYPE_HELP;
179 else if (title.startsWith(
"WIFI"))
181 screenType = SCREEN_TYPE_WIFI;
183 else if (title.startsWith(
"TILT"))
185 screenType = SCREEN_TYPE_TILT;
187 else if (title.startsWith(
"BUZZ"))
189 screenType = SCREEN_TYPE_BUZZ;
191 else if (title.startsWith(
"AP"))
193 screenType = SCREEN_TYPE_AP;
195 else if (title.startsWith(
"GUEST PAGE"))
197 screenType = SCREEN_TYPE_GUEST_PAGE;
199 else if (title.startsWith(
"FEED GUEST"))
201 screenType = SCREEN_TYPE_FEED_GUEST;
203 else if (title.startsWith(
"STATUS"))
205 screenType = SCREEN_TYPE_STATUS;
207 else if (title.startsWith(
"RESET"))
209 screenType = SCREEN_TYPE_RESET;
211 else if (title.startsWith(
"DOC FOLLOW"))
213 screenType = SCREEN_TYPE_DOC_FOLLOW;
215 else if (title.startsWith(
"REBOOT"))
217 screenType = SCREEN_TYPE_REBOOT;
219 else if (title.startsWith(
"TIMER"))
221 screenType = SCREEN_TYPE_TIMER;
224 else if (title.startsWith(
"P:"))
226 screenType = SCREEN_TYPE_PAIRED_DEV;
229 _currentScreenType = screenType;
254#define HEIGHT_3_2LINE 60
269typedef struct TextPosition
272 uint16_t width, height;
275 uint16_t textColorBackground;
286TextPositionStruct _actionTextPosition = {0,2,WIDTH,HEIGHT_2,FONT_2,BLUE,WHITE,BLACK,ROTATE_0,11};
287TextPositionStruct _actionTextPositionZoomed = {0,2,WIDTH,HEIGHT_3_2LINE,FONT_3,BLUE,WHITE,BLACK,ROTATE_0,14};
288TextPositionStruct _actionTextHomePositionZoomed= {0,2,WIDTH,HEIGHT_3_2LINE,FONT_3,ORANGE,BLACK,BLACK,ROTATE_0,14};
290TextPositionStruct _actionTextHomeSimplePositionZoomed = {0,2,WIDTH,HEIGHT_3_2LINE,FONT_3,YELLOW,BLUE,BLACK,ROTATE_0,15};
291TextPositionStruct _actionTextHomeSimplePositionZoomed_1= {0,2,WIDTH,HEIGHT_3_2LINE,FONT_3,BLUE,YELLOW,BLACK,ROTATE_0,15};
292TextPositionStruct _actionTextHomeSimplePositionZoomed_2= {0,2,WIDTH,HEIGHT_3_2LINE,FONT_3,BLACK,GREEN,BLACK,ROTATE_0,15};
293TextPositionStruct _actionTextHomeSimplePositionZoomed_3= {0,2,WIDTH,HEIGHT_3_2LINE,FONT_3,BLACK,WHITE,BLACK,ROTATE_0,15};
294TextPositionStruct _actionTextHomeSimplePositionZoomed_4= {0,2,WIDTH,HEIGHT_3_2LINE,FONT_3,WHITE,RED,BLACK,ROTATE_0,15};
297#define MAX_ACTION_TEXT_HOME_COLORS 5
298TextPositionStruct _actionTextHomeSimpleColor[MAX_ACTION_TEXT_HOME_COLORS] =
300 _actionTextHomeSimplePositionZoomed,
301 _actionTextHomeSimplePositionZoomed_1,
302 _actionTextHomeSimplePositionZoomed_2,
303 _actionTextHomeSimplePositionZoomed_3,
304 _actionTextHomeSimplePositionZoomed_4,
308TextPositionStruct _sensorStatusTextPosition = {0,27,WIDTH,HEIGHT_2,FONT_2,WHITE,BLACK,BLACK,ROTATE_0,22};
309TextPositionStruct _sensorStatusTextPositionZoomed = {0,65,WIDTH,HEIGHT_3,FONT_2,WHITE,BLACK,BLACK,ROTATE_0,22};
311TextPositionStruct _helpStatusTextPosition =
312 {0,65,WIDTH,HEIGHT_3,FONT_2,ORANGE,BLACK,BLACK,ROTATE_0,22};
314TextPositionStruct _multilineStatusTextPosition = {0,27,WIDTH,HEIGHT_4,FONT_2,WHITE,BLACK,BLACK,ROTATE_0,40};
315TextPositionStruct _multilineStatusTextPositionZoomed = {0,65,WIDTH,HEIGHT_4,FONT_2,WHITE,BLACK,BLACK,ROTATE_0,40};
319TextPositionStruct _moduleDeviceNameTextPosition = {0,40,WIDTH,HEIGHT_3,FONT_3,YELLOW,BLUE,BLACK,ROTATE_0,30};
322TextPositionStruct _moduleStatusTextPosition = {0,67,WIDTH,HEIGHT_3,FONT_3,YELLOW,BLUE,BLACK,ROTATE_0,7};
323TextPositionStruct _moduleStatusTextPositionZoomed = {0,105,WIDTH,HEIGHT_3,FONT_3,YELLOW,BLUE,BLACK,ROTATE_0,7};
326TextPositionStruct _homeSimpleStatusTextPositionZoomed = {0,105,WIDTH,HEIGHT_3,FONT_3,ORANGE,BLACK,BLACK,ROTATE_0,7};
328TextPositionStruct _homeSimpleStatusTextPositionZoomedRED = {0,105,WIDTH,HEIGHT_3,FONT_3,RED,BLACK,BLACK,ROTATE_0,7};
331TextPositionStruct _connectedStatusTextPositionZoomed = {0,213,WIDTH,HEIGHT_2,FONT_2,WHITE,BLACK,BLACK,ROTATE_0,11};
334TextPositionStruct _menuTextPositionZoomed_4less = {0,105,WIDTH,HEIGHT_3,FONT_3,ORANGE,BLACK,BLACK,ROTATE_0,7};
335TextPositionStruct _menuTextPositionZoomed_4plus = {0,105,WIDTH,HEIGHT_2,FONT_2,ORANGE,BLACK,BLACK,ROTATE_0,22};
341#define SM_ACTION_SMALL 2
342#define QRAVATAR_ACTION 3
346#define TRY_SWAPPED_COLORS
347#ifdef TRY_SWAPPED_COLORS
348TextPositionStruct _zoomedTextPositions[MAX_ACTIONS] = {
349 {0,145,WIDTH,HEIGHT_3,FONT_3,ORANGE,BLACK,BLACK,ROTATE_0,7},
350 {0,180,WIDTH,HEIGHT_3,FONT_3,WHITE,BLUE,BLACK,ROTATE_0,7},
353 {0,145,WIDTH,HEIGHT_2,FONT_2,WHITE,BLACK,BLACK,ROTATE_0,40},
355 {50,150,1,HEIGHT_3,FONT_3,RED,YELLOW,BLACK,ROTATE_0,2}
358TextPositionStruct _zoomedTextPositions[MAX_ACTIONS] = {
359 {0,145,WIDTH,HEIGHT_3,FONT_3,WHITE,BLUE,BLACK,ROTATE_0,7},
360 {0,180,WIDTH,HEIGHT_3,FONT_3,WHITE,BLACK,BLACK,ROTATE_0,7},
362 {0,180,WIDTH,HEIGHT_3,FONT_3,ORANGE,BLACK,BLACK,ROTATE_0,7},
365 {0,145,WIDTH,HEIGHT_2,FONT_2,WHITE,BLACK,BLACK,ROTATE_0,40},
367 {50,150,1,HEIGHT_3,FONT_3,RED,YELLOW,BLACK,ROTATE_0,2}
372void setupTextPositionOverrideTextColor(TextPositionStruct textP, TextPositionStruct textColor)
379 M5.Lcd.setRotation(textP.rotation);
381 M5.Lcd.fillRect(textP.x, textP.y, textP.width, textP.height, textColor.blankColor );
382 M5.Lcd.setTextColor(textColor.textColor, textColor.textColorBackground);
383 M5.Lcd.setCursor(textP.x + 2, textP.y);
384 M5.Lcd.setTextSize(textP.textSize);
393 M5.Lcd.fillRect(0, 60, 135, 140, ORANGE);
394 M5.Lcd.setTextColor(WHITE, BLACK);
395 M5.Lcd.setCursor(10, 90);
396 M5.Lcd.setTextSize(2);
397 M5.Lcd.println(
"\nStarting \nOTA Update \nPlease Wait\n2-5 minutes");
402boolean _fullScreenMessageDisplayed =
false;
407void displayFullscreenMessage(String text,
boolean turnOn)
412 _fullScreenMessageDisplayed =
true;
416 M5.Lcd.fillRect(0, 0, 135, 240, BLUE);
417 M5.Lcd.setTextColor(WHITE, BLACK);
418 M5.Lcd.setCursor(10, 90);
419 M5.Lcd.setTextSize(3);
429 _fullScreenMessageDisplayed =
false;
439void setupTextPosition(TextPositionStruct textP)
442 setupTextPositionOverrideTextColor(textP, textP);
447void printTextAtTextPositionOverrideTextColor(String text, TextPositionStruct textPosition, TextPositionStruct textColor)
449 setupTextPositionOverrideTextColor(textPosition, textColor);
457void printTextAtTextPosition(String text, TextPositionStruct textPosition)
459 setupTextPosition(textPosition);
473 if (screenColor >= MAX_ACTION_TEXT_HOME_COLORS)
480 SerialCall.printf(
"incrementScreenColor_displayModule = %d\n", screenColor);
484int getScreenColor_displayModule()
488 if (screenColor < 0 || screenColor >= MAX_ACTION_TEXT_HOME_COLORS)
491 screenColor = screenColor % MAX_ACTION_TEXT_HOME_COLORS;
494 SerialLots.printf(
"getScreenColor_displayModule = %d\n", screenColor);
503 if (screenColor < 0 || screenColor >= MAX_ACTION_TEXT_HOME_COLORS)
506 screenColor = screenColor % MAX_ACTION_TEXT_HOME_COLORS;
509 SerialCall.printf(
"setScreenColor_displayModule = %d\n", screenColor);
520void incrementLoopTimer()
522 _loopTimer = (_loopTimer+1) % 100;
545String createSemanticAddress()
551 SerialTemp.print(
"createDynamicSemanticAddress: ");
555 _currentSemanticMarkerAddress = String((*_getStatusFunc)()) +
"&t=" + String(_loopTimer);
560 SerialCall.print(
"createSemanticAddress: ");
561 _currentSemanticMarkerAddress = _currentSemanticMarkerAddressBase;
565 int maxLenForIphone = 250;
568 if (_currentSemanticMarkerAddress.length() > maxLenForIphone)
570 SerialTemp.printf(
"1. Truncating chartacters to: %d\n", maxLenForIphone);
571 SerialTemp.println(_currentSemanticMarkerAddress);
572 _currentSemanticMarkerAddress = _currentSemanticMarkerAddress.substring(0,maxLenForIphone);
575 SerialTemp.println(_currentSemanticMarkerAddress);
576 return _currentSemanticMarkerAddress;
580#define USE_TIMER_DELAY_CLASS
582#ifdef USE_TIMER_DELAY_CLASS
584void startDelay(
int seconds)
586 _timerDelayClass_DisplayModule->
startDelay((
float)seconds);
588boolean delayFinished()
594 _timerDelayClass_DisplayModule->
stopDelay();
602unsigned long _delayStart;
604boolean _delayRunning =
false;
608void startDelay(
int seconds)
610 SerialCall.printf(
"startDelay_displayModule: %d\n", seconds);
613 _delayRunning =
true;
614 _delaySeconds = seconds;
618boolean delayFinished()
620 if (_delayRunning && ((
millis() - _delayStart) >= (_delaySeconds * 1000)))
622 _delayRunning =
false;
623 SerialCall.println(
"delayFinished..");
632 SerialCall.println(
"stopDelay _delayRunning=false");
634 _delayRunning =
false;
644#define BLK_PWM_CHANNEL 7
645void setBrightness_displayModule(
int brightness)
648 ledcWrite(BLK_PWM_CHANNEL, brightness);
655 SerialCall.println(
"blankScreen_displayModule");
662 _semanticMarkerShown =
false;
665 M5.Lcd.fillScreen(BLACK);
677 printTextAtTextPosition(
" CLICKER",_connectedStatusTextPositionZoomed);
681#define TRY_DEVICES_AND_PAIRED
682#ifdef TRY_DEVICES_AND_PAIRED
684 char infoString[150];
685 boolean multilineScreenType;
690 multilineScreenType =
true;
714 SerialCall.println(infoString);
717 setupTextPosition(multilineScreenType?_multilineStatusTextPositionZoomed:_sensorStatusTextPositionZoomed);
720 printText(infoString,multilineScreenType?_multilineStatusTextPosition.maxLen:_sensorStatusTextPosition.maxLen);
726 setupTextPosition(_sensorStatusTextPositionZoomed);
742 SerialCall.println(
"wakeupScreen_displayModule");
752 SerialCall.println(
"clearScreen_displayModule");
762 M5.Lcd.setRotation(0);
764 M5.Lcd.fillScreen(BLACK);
771 SerialLots.print(
"isBlankScreen_displayModule:");
772#ifdef USE_TIMER_DELAY_CLASS
773 boolean delayRunning = !_timerDelayClass_DisplayModule->
delayFinished();
776 boolean delayRunning = _delayRunning;
778 SerialLots.println(!delayRunning?
"BLANK":
"NOT BLANK");
781 return !delayRunning;
785boolean displayOnBlankScreen()
791int currentScreenTimeout()
801 SerialMin.println(
"setupESP_M5");
816 M5.begin(
true,
true,
true,
817 false, kMBusModeOutput,
843 M5.Lcd.setTextColor(WHITE);
848 SerialMin.println(
"M5CORE2_MODULE");
849 M5.Lcd.drawCircle(65,220, 10, WHITE);
850 M5.Lcd.drawCircle(155,220, 10, WHITE);
851 M5.Lcd.drawCircle(255,220, 10, WHITE);
857 M5.Lcd.setRotation(0);
863 M5.Lcd.setTextSize(2);
867 M5.Lcd.printf(
"%s", VERSION);
872 M5.Lcd.qrcode(
"https://iDogWatch.com/bot/help",0,100,135,SEMANTIC_MARKER_QR_VERSION);
874 printTextAtTextPosition(
"SM",_zoomedTextPositions[QRAVATAR_ACTION]);
898int _fullscreenLoopCount = 0;
904 if (_fullScreenMessageDisplayed)
906 _fullscreenLoopCount ++;
907 if (_fullscreenLoopCount > 10)
909 displayFullscreenMessage(
"",
false);
910 _fullscreenLoopCount = 0;
918 if (inAlternateDisplay_displayModule())
921 loop_Alternate_displayModule();
929 SerialCall.println(
"loop_displayModule: delayFinished");
942#define LOOP_COUNTER_MICROSECONDS 20
944 if (_markerTimer > LOOP_COUNTER_MICROSECONDS)
949#define TRY_BLANKSCREEN_IN_LOOP
950#ifdef TRY_BLANKSCREEN_IN_LOOP
954 SerialCall.println(
"loop_displayModule: isBlankScreen");
959 if (_semanticMarkerShown)
961 SerialCall.println(
"loop_displayModule: redrawSemanticMarker(KEEP_SAME)");
970 M5.Lcd.drawRect(50, 235, 10, 3, WHITE);
971 M5.Lcd.drawRect(155,235, 10, 3, WHITE);
972 M5.Lcd.drawRect(258,235, 10, 3, WHITE);
980void printText(String text,
int maxLen)
983 if (text.length() < maxLen)
989 M5.Lcd.print(text.substring(0,maxLen));
995void printTextPadSpaces(String text, TextPositionStruct textColor)
999 int maxLen = textColor.maxLen;
1000 printText(text, maxLen);
1004 M5.Lcd.setTextColor(textColor.textColor, textColor.textColorBackground);
1005 for (
int i=text.length(); i< maxLen; i++)
1013void drawAction(String title,
int screenType)
1016 SerialCall.print(
"drawAction: ");
1017 SerialCall.print(title);
1018 SerialCall.printf(
" screenType=%d\n",screenType);
1022 && (screenType != SCREEN_TYPE_HELP))
1025 title.replace(
" ",
"\r\n");
1029 int colorIndex = getScreenColor_displayModule();
1034 case SCREEN_TYPE_HOME_SIMPLE:
1038 case SCREEN_TYPE_HOME_SIMPLE_1:
1039 case SCREEN_TYPE_HOME_SIMPLE_2:
1040 case SCREEN_TYPE_AP:
1044 setupTextPosition(_actionTextHomeSimpleColor[colorIndex]);
1045 printText(
" MINI CLICKER", _actionTextHomeSimplePositionZoomed.maxLen);
1046#ifdef M5CORE2_MODULE
1047 setupTextPosition(_moduleDeviceNameTextPosition);
1053 case SCREEN_TYPE_HOME_SIMPLE_3:
1056 setupTextPosition(_actionTextHomeSimpleColor[colorIndex]);
1057 printText(
"CLICKER MENU ", _actionTextHomeSimplePositionZoomed.maxLen);
1061 case SCREEN_TYPE_HOME:
1064 setupTextPosition(_actionTextHomeSimpleColor[colorIndex]);
1065 printText(
" SMART CLICKER", _actionTextHomeSimplePositionZoomed.maxLen); }
1068 case SCREEN_TYPE_PAIRED_DEV:
1071 setupTextPosition(_actionTextHomeSimpleColor[colorIndex]);
1074 printText(
"PAIR DEVICE ", _actionTextPositionZoomed.maxLen);
1080 setupTextPosition(_actionTextHomeSimpleColor[colorIndex]);
1081 printText(title, _actionTextPositionZoomed.maxLen);
1087 if (screenType == SCREEN_TYPE_PAIRED_DEV)
1090 setupTextPosition(_actionTextPosition);
1092 printTextPadSpaces(
"PAIRDEV", _actionTextPosition);
1097 setupTextPosition(_actionTextPosition);
1100 printTextPadSpaces(title, _actionTextPosition);
1107void drawSensorStatus(
int screenType)
1109 char infoString[150];
1110 boolean multilineScreenType =
false;
1120 boolean isConnectedBLE =
1126 String gStatus =
"g";
1127 String gStatusHome =
"";
1128 if (isConnectedBLE && gatewayOn)
1142 case SCREEN_TYPE_HELP:
1143 multilineScreenType =
true;
1145 sprintf(infoString,
"Scan Image\nFor Help");
1148 case SCREEN_TYPE_WIFI:
1149 multilineScreenType =
true;
1155 sprintf(infoString,
"Swap WIFI");
1157 sprintf(infoString,
"Swap/Retry\nWIFI");
1162 sprintf(infoString,
"Scan to\nShare WIFI");
1165 case SCREEN_TYPE_AP:
1166 multilineScreenType =
true;
1169 sprintf(infoString,
"Enter AP\n192.168.4.1");
1171 sprintf(infoString,
"In AP\n192.168.4.1");
1173 case SCREEN_TYPE_GUEST_PAGE:
1174 multilineScreenType =
true;
1175 sprintf(infoString,
"Share WIFI with Feeder");
1178 case SCREEN_TYPE_TIMER:
1188 case SCREEN_TYPE_TIMER:
1189 case SCREEN_TYPE_DOC_FOLLOW:
1191 case SCREEN_TYPE_HOME_SIMPLE_2:
1192 case SCREEN_TYPE_HOME_SIMPLE_3:
1193 case SCREEN_TYPE_PAIRED_DEV:
1194 case SCREEN_TYPE_REBOOT:
1199 multilineScreenType =
true;
1225 case SCREEN_TYPE_FEED_GUEST:
1226 multilineScreenType =
true;
1227 sprintf(infoString,
"Feed Guest");
1231 case SCREEN_TYPE_HOME:
1232 case SCREEN_TYPE_HOME_SIMPLE:
1233 case SCREEN_TYPE_HOME_SIMPLE_1:
1239 case SCREEN_TYPE_STATUS:
1249 && !(screenType == SCREEN_TYPE_HELP))
1252 setupTextPosition(multilineScreenType?_multilineStatusTextPositionZoomed:_sensorStatusTextPositionZoomed);
1256 setupTextPosition(multilineScreenType?_multilineStatusTextPosition:_sensorStatusTextPosition);
1260 printText(infoString,multilineScreenType?_multilineStatusTextPosition.maxLen:_sensorStatusTextPosition.maxLen);
1264void drawStatusText(String text,
boolean isOn)
1268 M5.Lcd.setTextColor(BLUE, YELLOW);
1270 M5.Lcd.setTextColor(WHITE, BLACK);
1276boolean containsMode(
char *modesDesired,
char mode)
1280 else return index(modesDesired,mode) != NULL;
1284void drawModuleStatus(
char *modesDesired)
1290 setupTextPosition(_moduleStatusTextPositionZoomed);
1295 setupTextPosition(_moduleStatusTextPosition);
1300 if (containsMode(modesDesired,
'W'))
1302 if (containsMode(modesDesired,
'M'))
1306 if (containsMode(modesDesired,
'B'))
1309 if (containsMode(modesDesired,
'C'))
1313 if (containsMode(modesDesired,
'A'))
1315 if (containsMode(modesDesired,
'T'))
1319 if (containsMode(modesDesired,
'S'))
1323 drawStatusText(
"S",
true);
1326 if (containsMode(modesDesired,
'Z'))
1330 if (containsMode(modesDesired,
'R'))
1331 drawStatusText(
"R",
true);
1333 if (containsMode(modesDesired,
'X'))
1334 drawStatusText(
"X",
true);
1336 if (containsMode(modesDesired,
'H'))
1337 drawStatusText(
"H",
true);
1340 if (containsMode(modesDesired,
'P'))
1348void displaySimpleStatus()
1351 boolean isConnectedBLE =
1358 boolean isConnectedWIFI =
1363 String gStatus =
" ";
1364 if (isConnectedBLE && gatewayOn)
1368 else if (isConnectedBLE)
1375 printTextAtTextPosition(label,_connectedStatusTextPositionZoomed);
1379void displayZoomedSemanticMarker(
int screenType)
1381 SerialCall.print(
"displayZoomedSemanticMarker: ");
1382 SerialCall.println(_semanticTitle);
1392 case SCREEN_TYPE_WIFI:
1406 SerialTemp.println(wifi1);
1407 SerialTemp.println(wifi2);
1408 boolean wifi1Current = strcmp(json,wifi1)==0;
1410 SerialTemp.printf(
"wifi1Current == %d\n", wifi1Current);
1414 char *json1 = strstr(wifi1,
":");
1416 if (json1 && strlen(json1) > 3)
1424 char *comma = strchr(json1,
'\'');
1425 json1Len = comma?((int)(comma - json1)):strlen(json1);
1427 SerialTemp.println(json1);
1429 char *json2 = strstr(wifi2,
":");
1431 if (json2 && strlen(json2) > 3)
1439 char *comma = strchr(json2,
'\'');
1440 json2Len = comma?((int)(comma - json2)):strlen(json2);
1442 SerialTemp.println(json2);
1445 strncat(buffer, wifi1Current?json1:json2, wifi1Current?json1Len:json2Len );
1446 strcat(buffer,
"\n\r");
1447 printTextAtTextPosition(buffer,_zoomedTextPositions[SM_ACTION_SMALL]);
1450 strncat(buffer, !wifi1Current?json1:json2, !wifi1Current?json1Len:json2Len );
1452 M5.Lcd.setTextColor(WHITE, BLUE);
1453 M5.Lcd.print(buffer);
1455 SerialCall.println(buffer);
1460 case SCREEN_TYPE_HOME_SIMPLE:
1467 printTextAtTextPositionOverrideTextColor(
"TiltOn",_zoomedTextPositions[BIG_ACTION],_zoomedTextPositions[SM_ACTION] );
1469 printTextAtTextPositionOverrideTextColor(
"TiltOff",_zoomedTextPositions[BIG_ACTION], _zoomedTextPositions[SM_ACTION]);
1473 printTextAtTextPositionOverrideTextColor(
"BuzzOn",_zoomedTextPositions[SM_ACTION],_zoomedTextPositions[BIG_ACTION] );
1475 printTextAtTextPositionOverrideTextColor(
"BuzzOff",_zoomedTextPositions[SM_ACTION], _zoomedTextPositions[BIG_ACTION]);
1477 displaySimpleStatus();
1480 case SCREEN_TYPE_HOME_SIMPLE_1:
1488 printTextAtTextPosition(
"TiltOn",_zoomedTextPositions[BIG_ACTION]);
1490 printTextAtTextPosition(
"TiltOff",_zoomedTextPositions[BIG_ACTION]);
1493 printTextAtTextPosition(
"BuzzOn",_zoomedTextPositions[SM_ACTION]);
1495 printTextAtTextPosition(
"BuzzOff",_zoomedTextPositions[SM_ACTION]);
1497 displaySimpleStatus();
1500 case SCREEN_TYPE_HOME_SIMPLE_2:
1508 printTextAtTextPositionOverrideTextColor(tmpString,_zoomedTextPositions[BIG_ACTION], _zoomedTextPositions[SM_ACTION]);
1511 printTextAtTextPositionOverrideTextColor(tmpString,_zoomedTextPositions[SM_ACTION],_zoomedTextPositions[BIG_ACTION]);
1513 displaySimpleStatus();
1517 case SCREEN_TYPE_AP:
1521 printTextAtTextPositionOverrideTextColor(
"AP",_zoomedTextPositions[BIG_ACTION], _zoomedTextPositions[SM_ACTION]);
1522 printTextAtTextPositionOverrideTextColor(
"Mode...",_zoomedTextPositions[SM_ACTION],_zoomedTextPositions[SM_ACTION]);
1524 displaySimpleStatus();
1527 case SCREEN_TYPE_TIMER:
1528 case SCREEN_TYPE_HOME_SIMPLE_3:
1529 case SCREEN_TYPE_PAIRED_DEV:
1530 case SCREEN_TYPE_REBOOT:
1533 if (screenType == SCREEN_TYPE_REBOOT)
1535 else if (screenType == SCREEN_TYPE_PAIRED_DEV)
1537 else if (screenType == SCREEN_TYPE_HOME_SIMPLE_3)
1539 else if (screenType == SCREEN_TYPE_TIMER)
1542 SerialMin.println(
" *** INVALID screenType ***");
1555 M5.Lcd.fillRect(0, 80, 135, 130, BLACK);
1560 int textLength = 10;
1570 printTextAtTextPosition(buffer, (windowSize <= 4)?_menuTextPositionZoomed_4less:_menuTextPositionZoomed_4plus);
1580 if (currentItem >= windowSize)
1586 startItem = currentItem - windowSize + 1;
1588 maxItems = startItem + windowSize;
1589 for (
int i=startItem; i < maxItems; i++)
1595 M5.Lcd.setTextColor(WHITE, BLUE);
1599 M5.Lcd.setTextColor(ORANGE, BLACK);
1602 sprintf(buffer,
"-%.*s\n\r", textLength, menu);
1603 M5.Lcd.print(buffer);
1608 displaySimpleStatus();
1615 printTextAtTextPosition(
"+FEED",_zoomedTextPositions[BIG_ACTION]);
1617 String title =
"-" + _semanticTitle;
1618 title.replace(
" ",
"\r\n");
1622 case SCREEN_TYPE_HOME:
1623 printTextAtTextPosition(title,_zoomedTextPositions[SM_ACTION]);
1627 case SCREEN_TYPE_PAIRED_DEV:
1629 case SCREEN_TYPE_HELP:
1632 String title =
"-MINI\r\nCLICKER";
1633 printTextAtTextPosition(title,_zoomedTextPositions[SM_ACTION]);
1636 case SCREEN_TYPE_GUEST_PAGE:
1640 String title =
"-SHARE\r\nWIFI";
1641 printTextAtTextPosition(title,_zoomedTextPositions[SM_ACTION]);
1645 printTextAtTextPosition(title,_zoomedTextPositions[SM_ACTION]);
1655 int screenType = screenTypeForTitle_displayModule(_semanticTitle);
1657 SerialCall.printf(
"redrawSemanticMarker_displayModule(startNew:%d, ScreenType = %d)\n", startNew, screenType);;
1664 case SCREEN_TYPE_HOME_SIMPLE:
1670 case SCREEN_TYPE_HOME_SIMPLE_1:
1671 case SCREEN_TYPE_HOME_SIMPLE_2:
1672 case SCREEN_TYPE_HOME_SIMPLE_3:
1682#define TRY_CLEAR_WITH_RESET_TIMER
1684#ifdef TRY_CLEAR_WITH_RESET_TIMER
1692 _lastSemanticMarkerAddress = String(
"");
1697 incrementLoopTimer();
1702 if (screenType == SCREEN_TYPE_REBOOT)
1705 else if (screenType == SCREEN_TYPE_PAIRED_DEV)
1707 else if (screenType == SCREEN_TYPE_HOME_SIMPLE_3)
1709 else if (screenType == SCREEN_TYPE_TIMER)
1713 _semanticMarkerShown =
true;
1716 _currentSemanticMarkerAddress = createSemanticAddress();
1720 && (screenType != SCREEN_TYPE_HELP))
1722 displayZoomedSemanticMarker(screenType);
1724 else if (screenType == SCREEN_TYPE_DOC_FOLLOW)
1729#ifdef M5CORE2_MODULE
1732 M5.Lcd.setRotation(0);
1738 setBrightness_displayModule(0);
1743 printTextAtTextPosition(
"SM",_zoomedTextPositions[QRAVATAR_ACTION]);
1750#ifdef M5CORE2_MODULE
1753 M5.Lcd.setRotation(0);
1755 SerialLots.print(
"last vs current: ");
1756 SerialLots.print(_lastSemanticMarkerAddress);
1757 SerialLots.println(
" vs ");
1758 SerialLots.println(_currentSemanticMarkerAddress);
1760 if (!_lastSemanticMarkerAddress.compareTo(_currentSemanticMarkerAddress)==0)
1762 SerialLots.println(_currentSemanticMarkerAddress);
1764 setBrightness_displayModule(0);
1769 M5.Lcd.qrcode(_currentSemanticMarkerAddress,0,100,135, SEMANTIC_MARKER_QR_VERSION);
1772 String smChar = _semanticTitle.substring(0,1);
1773 printTextAtTextPosition(smChar,_zoomedTextPositions[QRAVATAR_ACTION]);
1779 _lastSemanticMarkerAddress = _currentSemanticMarkerAddress;
1783 drawAction(_semanticTitle, screenType);
1786 drawSensorStatus(screenType);
1791 case SCREEN_TYPE_HOME_SIMPLE_3:
1795 case SCREEN_TYPE_HOME_SIMPLE:
1796 case SCREEN_TYPE_HOME_SIMPLE_1:
1797 case SCREEN_TYPE_HOME_SIMPLE_2:
1798 case SCREEN_TYPE_AP:
1803 setupTextPosition(_homeSimpleStatusTextPositionZoomedRED);
1805 setupTextPosition(_homeSimpleStatusTextPositionZoomed);
1807 M5.Lcd.print(
"+FEED ");
1813 case SCREEN_TYPE_HOME:
1815 drawModuleStatus((
char*)
"WMCTZAS");
1817 case SCREEN_TYPE_TILT:
1819 drawModuleStatus((
char*)
"T");
1821 case SCREEN_TYPE_BUZZ:
1823 drawModuleStatus((
char*)
"Z");
1825 case SCREEN_TYPE_WIFI:
1826 drawModuleStatus((
char*)
"WM");
1831 case SCREEN_TYPE_HELP:
1834 setupTextPosition(_helpStatusTextPosition);
1837 printText((
char*)
"iDogWatch.com/bot/help",_helpStatusTextPosition.maxLen);
1840 case SCREEN_TYPE_RESET:
1841 drawModuleStatus((
char*)
"R");
1843 case SCREEN_TYPE_TIMER:
1845 case SCREEN_TYPE_REBOOT:
1847 case SCREEN_TYPE_PAIRED_DEV:
1850 case SCREEN_TYPE_GUEST_PAGE:
1851 drawModuleStatus((
char*)
"WMC");
1853 case SCREEN_TYPE_FEED_GUEST:
1854 drawModuleStatus((
char*)
"WMC");
1857 case SCREEN_TYPE_STATUS:
1861 drawModuleStatus((
char*)
"WMBCATS");
1870 startDelay(currentScreenTimeout());
1891 SerialTemp.print(
"showSemanticMarker(nulls func) ");
1892 SerialTemp.print(title);
1893 SerialTemp.print(
" SM=");
1894 SerialTemp.println(semanticMarkerAddress);
1898 _semanticTitle = title;
1901 _getStatusFunc = NULL;
1903 _currentSemanticMarkerAddressBase = semanticMarkerAddress;
1905 _lastSemanticMarkerAddress = String(
"");
1922 SerialCall.print(
"showSemanticMarkerFunc: ");
1923 SerialCall.print(title);
1924 SerialCall.print(
" SM=");
1925 SerialCall.println(semanticMarkerAddressBase);
1928 _getStatusFunc = getStatusFunc;
1929 _currentSemanticMarkerAddressBase = semanticMarkerAddressBase;
1930 _semanticTitle = title;
1931 _lastSemanticMarkerAddress = String(
"");
1946 drawAction(text, _currentScreenType);
1958 SerialLots.printf(
"addToTextMessages_displayModule:(%d)",displayOnBlankScreen());
1959 SerialLots.println(text);
1961#ifdef M5CORE2_MODULE
1964 if (_showScrollingTextWindow)
1966#ifdef SHOW_BIG_BUTTON
1969 addToScrollingText_displayModule(text);
1978 SerialLots.println(
"Not displaying since blank screen");
1984 switch (_currentScreenType)
1987 case SCREEN_TYPE_HOME_SIMPLE:
1988 case SCREEN_TYPE_HOME_SIMPLE_1:
1989 case SCREEN_TYPE_HOME_SIMPLE_2:
1990 case SCREEN_TYPE_AP:
1993 case SCREEN_TYPE_HOME_SIMPLE_3:
1997 setupTextPosition(_sensorStatusTextPositionZoomed);
2000 printText(text,_sensorStatusTextPosition.maxLen);
2003 drawAction(text, _currentScreenType);
2009 if (text.compareTo(
"FEED")==0)
2011 displayFullscreenMessage(text,
true);
2015#ifdef M5CORE2_MODULE
2017void loop_Alternate_displayModule()
2026void addToScrollingText_displayModule(String textString)
2028 if (_showScrollingTextWindow)
2030 M5.Lcd.setTextSize(1);
2031 M5.Lcd.println(textString);
2033 int X = M5.Lcd.getCursorX();
2034 int Y = M5.Lcd.getCursorY();
2035 SerialDebug.printf(
"cursor(%d,%d)\n", X, Y);
2038 M5.Lcd.setCursor(0,0);
2043void toggleShowingScrollingTextMode_displayModule()
2045 boolean flag = !_showScrollingTextWindow;
2046 setShowingScrollingTextMode_displayModule(flag);
2054boolean scrollingTextWindowVisible_displayModule()
2056 return _showScrollingTextWindow;
2060void showButtonTouched_displayModule()
2062#ifdef SHOW_BIG_BUTTON
2064 if (_showScrollingTextWindow)
2066 SerialDebug.println(
"showButtonTouched_displayModule");
2069 M5.Lcd.fillCircle(150,120,118, BLACK);
2070 M5.Lcd.drawCircle(150,120,118, WHITE);
2071 M5.Lcd.setTextColor(WHITE);
2072 M5.Lcd.setTextSize(5);
2073 M5.Lcd.setCursor(100, 110);
2074 M5.Lcd.print(
"Feed");
2077 M5.Lcd.fillCircle(150,120,118, GREEN);
2078 M5.Lcd.drawCircle(150,120,118, WHITE);
2079 M5.Lcd.setTextColor(BLACK);
2080 M5.Lcd.setTextSize(5);
2081 M5.Lcd.setCursor(100, 110);
2082 M5.Lcd.print(
"Feed");
2088void setShowingScrollingTextMode_displayModule(
boolean flag)
2090 SerialDebug.printf(
"setShowingScrollingTextMode_displayModule(%d, s=%d)\n", flag,_showScrollingTextWindow );
2093 _showScrollingTextWindow = flag;
2099 if (_showScrollingTextWindow)
2105#ifdef SHOW_BIG_BUTTON
2107 M5.Lcd.fillCircle(150,120,118, GREEN);
2108 M5.Lcd.drawCircle(150,120,118, WHITE);
2110 M5.Lcd.setTextColor(BLACK);
2111 M5.Lcd.setTextSize(5);
2112 M5.Lcd.setCursor(100, 110);
2113 M5.Lcd.print(
"Feed");
2119 M5.Lcd.setTextColor(WHITE, BLACK);
2120 M5.Lcd.setCursor(0, 0);
2121 M5.Lcd.setTextSize(1);
2122 M5.Lcd.println(
"Messages from the Network");
2132 M5.Lcd.fillScreen(BLACK);
2139void scrollText_displayModule()
2141 if (_showScrollingTextWindow)
2145 M5.Lcd.fillScreen(BLACK);
2146 M5.Lcd.setCursor(0, 0);
2230 return (
char*)
"unused";
boolean isConnectedBLEClient()
returns whether connected over BLE as a client to a server(like a ESP feeder)
boolean useBLEClient()
returns if the BLEClient is turned on.. note, if connected to a BLE device, then disconnect
void loop_displayModule()
called for the loop() of this plugin
void showSemanticMarkerFunc_displayModule(String semanticMarkerAddressBase, String title, const char *(*getStatusFunc)(void))
the function to call to get the 'status', return char*
void addToTextMessages_displayModule(String text)
void wakeupScreen_displayModule()
wakes up the screen
int _loopCounter_displayModule
void setup_displayModule()
for types: String, boolean ..
void clearScreen_displayModule()
clears the screen
void incrementScreenColor_displayModule()
boolean isBlankScreen_displayModule()
whether screen is blank (so the button can be a wake, vs action..)
void showText_displayModule(String text)
void redrawSemanticMarker_displayModule(boolean startNew)
redraws the Semantic Marker image..
void setScreenColor_displayModule(int screenColor)
cache for getting the screen color 0..n. Will reset the cache as well
void showSemanticMarker_displayModule(String semanticMarkerAddress, String title)
displays the Semantic Marker (a super QR code) on the M5 screen (title = to display)
void blankScreen_displayModule()
blanks the screen
const char * currentSemanticMarkerAddress_displayModule()
returns the current semantic marker (eg. guest page)
int getLoopTimer_displayModule()
returns the loop timer (just a timer..)
void resetLoopTimer_displayModule()
reset the loop timer .. useful for testing,
void showOTAUpdatingMessage()
show an OTA message..
char * getLastDocFollowSemanticMarker_MQTTNetworking()
boolean isConnectedMQTT_MQTTState()
value of MQTT connected
boolean isConnectedWIFI_MQTTState()
value of WIFI connected
char * deviceName_mainModule()
gets the device name
int getFeedCount_mainModule()
feedcount info..
char * main_JSONStringForWIFICredentials()
retrieve a JSON string for the ssid and ssid_password: {'ssid':<ssid>,'ssidPassword':<pass>"}
int feedCountMax_mainModule()
returns the max for this feeder
char * getPairedDeviceOrAddress_mainModule()
returns if the paired device is not NONE .. returns address or device
void refreshDelayButtonTouched_MainModule()
called by the feed operation to say the device is still running.. and count it as a button click.
char * connectedBLEDeviceName_mainModule()
returns the connected BLE Device name (the :NAME of advertisment, Address: 01:39:3f:33 part of name,...
float getTemperature_mainModule()
retrieves the temperature .
boolean isValidPairedDevice_mainModule()
returns if the paired device is not NONE. Note, the paired Name might be an address now (see below)
float getBatPercentage_mainModule()
start of the sensor updates ... TODO: tie these to the MQTT messaging as well..
void updateMenuState(ModelKindEnum modelKind)
updates the model for the menu state, this sets max etc
char * menuForState(ModelKindEnum modelKind, int item)
returns the menu string for the deviceState's item number (use woudl go 0..maxItems -1
ModelStateStruct * getModel(ModelKindEnum modelKind)
retrieves the state model for the modelKind
ModelKindEnum
a pseudo Class
@ pairedButNotConnectedEnum
@ notConnectedEnum
factory default but not connecte to anything..
@ pairableAndConnectedEnum
void savePreferenceInt_mainModule(int preferenceID, int val)
sets an int preference
boolean getPreferenceBoolean_mainModule(int preferenceID)
called to set a preference (which will be an identifier and a string, which can be converted to a num...
void setOnBootPreferences_mainModule()
set some defaults on boot - that override EPROM this can be called on the HOME screen to set back to ...
int getPreferenceInt_mainModule(int preferenceID)
called to set a preference (which will be an identifier and a string, which can be converted to a num...
char * getPreferenceString_mainModule(int preferenceID)
returns the preference but in it's own string buffer. As long as you use it before calling getPrefere...
#define PREFERENCE_SENSOR_TILT_VALUE
Sensor preferences.
#define PREFERENCE_ONLY_GEN3_CONNECT_SETTING
if true, only BLEClient connect to GEN3 feeders..
#define PREFERENCE_SEMANTIC_MARKER_ZOOMED_VALUE
Display preferences (SemanticMarker etc) - boolean.
#define PREFERENCE_WIFI_CREDENTIAL_2_SETTING
#define PREFERENCE_MAIN_BLE_SERVER_VALUE
#define PREFERENCE_STEPPER_BUZZER_VALUE
stepper preferences
#define PREFERENCE_WIFI_CREDENTIAL_1_SETTING
#define PREFERENCE_DISPLAY_SCREEN_TIMEOUT_VALUE
sets the timeout value
#define PREFERENCE_DISPLAY_ON_BLANK_SCREEN_VALUE
Display preferences - show messages on blank screen- boolean.
#define PREFERENCE_IS_MINIMAL_MENU_SETTING
sets the max temp for a poweroff
#define PREFERENCE_SCREEN_COLOR_SETTING
ithe color of the screen 0..n
#define PREFERENCE_MAIN_GATEWAY_VALUE
boolean doneWIFI_APModule_Credentials()
called to see if the WIFIModule has finished bootstrapping..
void startDelay(float delayAmountSeconds)
starts delay calculation
boolean delayFinished()
whether the currently delay is finished, false if not running at all
void stopDelay()
stops delay
the struct for the models. Since this isn't straight OO, we are overlaying information....
int currentItem
the current item
boolean perfersBigText
a preference to the View that big text is desired
PairedDeviceStateEnum pairedDeviceStateEnum
int delaySeconds
length of delay (changable..)
int maxItems
the number of items in the model