13 uint32_t SecsCount = 0; ///< Seconds counter |
13 uint32_t SecsCount = 0; ///< Seconds counter |
14 uint32_t UserTimer = 0; ///< User inactive timeout |
14 uint32_t UserTimer = 0; ///< User inactive timeout |
15 int Main_Loop2 = -1; ///< Effective menu |
15 int Main_Loop2 = -1; ///< Effective menu |
16 int New_Loop2 = ML2_INIT; ///< New menu |
16 int New_Loop2 = ML2_INIT; ///< New menu |
17 int SubMenu = 0; ///< Submenu number |
17 int SubMenu = 0; ///< Submenu number |
|
18 int SubOffset = 0; ///< Submenu offset |
18 u8g2_t u8g2; ///< A structure which will contain all the data for one display |
19 u8g2_t u8g2; ///< A structure which will contain all the data for one display |
19 rotary_encoder_info_t rinfo = { 0 }; ///< Rotary encoder record |
20 rotary_encoder_info_t rinfo = { 0 }; ///< Rotary encoder record |
20 rotary_encoder_event_t event = { 0 }; |
21 rotary_encoder_event_t event = { 0 }; |
21 QueueHandle_t event_queue; |
22 QueueHandle_t event_queue; |
22 static xQueueHandle gpio_evt_queue = NULL; ///< Rotary pushbutton queue |
23 static xQueueHandle gpio_evt_queue = NULL; ///< Rotary pushbutton queue |
23 static int PushDuration = 0; ///< Duration of the pushed button |
24 static int PushDuration = 0; ///< Duration of the pushed button |
|
25 char SSIDs[10][32]; ///< List of SSIDs we know |
|
26 int num_ssids = 0; ///< Number of SSIDs we know |
24 |
27 |
25 extern const esp_app_desc_t *app_desc; |
28 extern const esp_app_desc_t *app_desc; |
26 extern unit_t units[3]; ///< Pressure test units |
29 extern unit_t units[3]; ///< Pressure test units |
27 extern SemaphoreHandle_t xSemaphoreUnits; ///< Units lock semaphore |
30 extern SemaphoreHandle_t xSemaphoreUnits; ///< Units lock semaphore |
28 extern DS18B20_State *ds18b20_state; ///< DS18B20 state |
31 extern DS18B20_State *ds18b20_state; ///< DS18B20 state |
468 |
471 |
469 |
472 |
470 |
473 |
471 void screen_wifi_setup(int sub) |
474 void screen_wifi_setup(int sub) |
472 { |
475 { |
473 screen_top("WiFi Setup"); |
476 screen_top("WiFi AP setup"); |
474 menu_line(sub == 0, 2, 25, "Connect"); |
477 menu_line(sub == 0, 2, 25, "Lijst AP"); |
475 menu_line(sub == 1, 2, 37, "New"); |
478 menu_line(sub == 1, 2, 37, "Nieuw AP"); |
476 menu_line(sub == 2, 2, 49, "Delete"); |
479 menu_line(sub == 2, 2, 49, "Terug"); |
477 menu_line(sub == 3, 2, 61, "Return"); |
480 u8g2_SendBuffer(&u8g2); |
|
481 } |
|
482 |
|
483 |
|
484 |
|
485 void screen_list_aps(int sub, int offset) |
|
486 { |
|
487 int i; |
|
488 struct strStations ap; |
|
489 uint8_t *dst = (uint8_t *)≈ |
|
490 FILE *f; |
|
491 size_t bytes; |
|
492 |
|
493 num_ssids = 0; |
|
494 memset(dst, 0, sizeof(ap)); |
|
495 f = fopen("/spiffs/etc/stations.conf", "r+"); |
|
496 if (f) { |
|
497 while (1) { |
|
498 bytes = fread(dst, 1, sizeof(ap), f); |
|
499 if (bytes < sizeof(ap)) { |
|
500 fclose(f); |
|
501 break; |
|
502 } |
|
503 memcpy(SSIDs[num_ssids], ap.SSID, 32); |
|
504 num_ssids++; |
|
505 } |
|
506 } |
|
507 printf("loaded %d SSIDs sub %d offset %d\n", num_ssids, sub, offset); |
|
508 |
|
509 screen_top("WiFi AP lijst"); |
|
510 if (num_ssids == 0) { |
|
511 menu_line(0, 1, 25, "Geen AP's"); |
|
512 } else { |
|
513 for (i = 0; i < num_ssids; i++) { |
|
514 menu_line(sub == i, 1, 25 + (i * 12), SSIDs[i + offset]); |
|
515 if (i == 3) |
|
516 break; |
|
517 } |
|
518 if (i < 4) |
|
519 menu_line(sub == i, 1, 25 + (i * 12), "Terug"); |
|
520 } |
478 u8g2_SendBuffer(&u8g2); |
521 u8g2_SendBuffer(&u8g2); |
479 } |
522 } |
480 |
523 |
481 |
524 |
482 |
525 |
618 |
661 |
619 |
662 |
620 /** |
663 /** |
621 * @brief Rotate subscreens numbers. |
664 * @brief Rotate subscreens numbers. |
622 * @param pos The new position, positive, negative or zero. |
665 * @param pos The new position, positive, negative or zero. |
623 * @param min The lowest number. If already at the lowest, select the highest. |
|
624 * @param max The highest number. If already at the highest, select the lowest. |
666 * @param max The highest number. If already at the highest, select the lowest. |
625 * @param cursub The subscreen number by reference. This is updated with the new number. |
667 * @param cursub The subscreen number by reference. This is updated with the new number. |
626 * @return Returns true if a new number is selected, false if nothing changed. |
668 * @return Returns true if a new number is selected, false if nothing changed. |
627 */ |
669 */ |
628 bool rotate_to_sub(rotary_encoder_position_t pos, int min, int max, int *cursub) |
670 bool rotate_to_sub(rotary_encoder_position_t pos, int max, int *cursub, int *curoffset) |
629 { |
671 { |
630 int sub = *cursub; |
672 int sub = *cursub; |
631 bool rc = false; |
673 int offset = *curoffset; |
|
674 bool rc = false; |
632 |
675 |
633 if (pos > 0) { |
676 if (pos > 0) { |
634 if (sub < max) |
677 if ((sub + offset) < max) { |
635 sub++; |
678 if (sub < 3) { |
636 else |
679 sub++; |
637 sub = min; |
680 } else { |
|
681 offset++; |
|
682 } |
|
683 } else { |
|
684 sub = offset = 0; |
|
685 } |
638 ESP_ERROR_CHECK(rotary_encoder_reset(&rinfo)); |
686 ESP_ERROR_CHECK(rotary_encoder_reset(&rinfo)); |
639 rc = true; |
687 rc = true; |
640 } else if (pos < 0) { |
688 } else if (pos < 0) { |
641 if (sub > min) |
689 if ((sub + offset) > 0) { |
642 sub--; |
690 if (offset > 0) { |
643 else |
691 offset--; |
644 sub = max; |
692 } else { |
|
693 sub--; |
|
694 } |
|
695 } else { |
|
696 if (max > 3) { |
|
697 offset = max - 3; |
|
698 sub = 3; |
|
699 } else { |
|
700 sub = max; |
|
701 offset = 0; |
|
702 } |
|
703 } |
645 ESP_ERROR_CHECK(rotary_encoder_reset(&rinfo)); |
704 ESP_ERROR_CHECK(rotary_encoder_reset(&rinfo)); |
646 rc = true; |
705 rc = true; |
647 } |
706 } |
648 |
707 |
|
708 printf("rotate_to_sub(%d, %d, %d, %d)\n", pos, max, sub, offset); |
649 *cursub = sub; |
709 *cursub = sub; |
|
710 *curoffset = offset; |
650 return rc; |
711 return rc; |
651 } |
712 } |
652 |
713 |
653 |
714 |
654 |
715 |
707 |
779 |
708 case ML2_SETUP_UNIT1: |
780 case ML2_SETUP_UNIT1: |
709 case ML2_SETUP_UNIT2: |
781 case ML2_SETUP_UNIT2: |
710 case ML2_SETUP_UNIT3: |
782 case ML2_SETUP_UNIT3: |
711 ESP_LOGI(TAG, "Loop user: Setup Unit %d", Main_Loop2 - ML2_SETUP_UNIT1); |
783 ESP_LOGI(TAG, "Loop user: Setup Unit %d", Main_Loop2 - ML2_SETUP_UNIT1); |
712 SubMenu = 0; |
784 SubMenu = SubOffset = 0; |
713 screen_unit_setup(Main_Loop2 - ML2_SETUP_UNIT1, SubMenu); |
785 screen_unit_setup(Main_Loop2 - ML2_SETUP_UNIT1, SubMenu); |
714 break; |
786 break; |
715 |
787 |
716 case ML2_ZERO_UNIT1: |
788 case ML2_ZERO_UNIT1: |
717 case ML2_ZERO_UNIT2: |
789 case ML2_ZERO_UNIT2: |
718 case ML2_ZERO_UNIT3: |
790 case ML2_ZERO_UNIT3: |
719 ESP_LOGI(TAG, "Loop user: Zero Unit %d", Main_Loop2 - ML2_ZERO_UNIT1); |
791 ESP_LOGI(TAG, "Loop user: Zero Unit %d", Main_Loop2 - ML2_ZERO_UNIT1); |
720 SubMenu = 0; |
792 SubMenu = SubOffset = 0; |
721 screen_unit_zero(Main_Loop2 - ML2_ZERO_UNIT1, SubMenu); |
793 screen_unit_zero(Main_Loop2 - ML2_ZERO_UNIT1, SubMenu); |
722 break; |
794 break; |
723 |
795 |
724 case ML2_INACTIVE: |
796 case ML2_INACTIVE: |
725 ESP_LOGI(TAG, "Loop user: Inactive"); |
797 ESP_LOGI(TAG, "Loop user: Inactive"); |
746 case ML2_NETWORK: rotate_to_menu(event.state.position, ML2_MQTT, ML2_WIFI); break; |
818 case ML2_NETWORK: rotate_to_menu(event.state.position, ML2_MQTT, ML2_WIFI); break; |
747 case ML2_MQTT: rotate_to_menu(event.state.position, ML2_UPDATE, ML2_NETWORK); break; |
819 case ML2_MQTT: rotate_to_menu(event.state.position, ML2_UPDATE, ML2_NETWORK); break; |
748 case ML2_UPDATE: rotate_to_menu(event.state.position, ML2_UPDATE, ML2_MQTT); break; |
820 case ML2_UPDATE: rotate_to_menu(event.state.position, ML2_UPDATE, ML2_MQTT); break; |
749 case ML2_SETUP_UNIT1: |
821 case ML2_SETUP_UNIT1: |
750 case ML2_SETUP_UNIT2: |
822 case ML2_SETUP_UNIT2: |
751 case ML2_SETUP_UNIT3: if (rotate_to_sub(event.state.position, 0, 3, &SubMenu)) |
823 case ML2_SETUP_UNIT3: if (rotate_to_sub(event.state.position, 3, &SubMenu, &SubOffset)) |
752 screen_unit_setup(Main_Loop2 - ML2_SETUP_UNIT1, SubMenu); |
824 screen_unit_setup(Main_Loop2 - ML2_SETUP_UNIT1, SubMenu); |
753 break; |
825 break; |
754 case ML2_ZERO_UNIT1: |
826 case ML2_ZERO_UNIT1: |
755 case ML2_ZERO_UNIT2: |
827 case ML2_ZERO_UNIT2: |
756 case ML2_ZERO_UNIT3: if (rotate_to_sub(event.state.position, 0, 1, &SubMenu)) |
828 case ML2_ZERO_UNIT3: if (rotate_to_sub(event.state.position, 1, &SubMenu, &SubOffset)) |
757 screen_unit_zero(Main_Loop2 - ML2_ZERO_UNIT1, SubMenu); |
829 screen_unit_zero(Main_Loop2 - ML2_ZERO_UNIT1, SubMenu); |
758 break; |
830 break; |
759 case ML2_SETUP_MQTT: if (rotate_to_sub(event.state.position, 0, 3, &SubMenu)) |
831 case ML2_SETUP_WIFI: if (rotate_to_sub(event.state.position, 2, &SubMenu, &SubOffset)) |
|
832 screen_wifi_setup(SubMenu); |
|
833 break; |
|
834 case ML2_LIST_APS: if (rotate_to_sub(event.state.position, num_ssids, &SubMenu, &SubOffset)) |
|
835 screen_list_aps(SubMenu, SubOffset); |
|
836 break; |
|
837 case ML2_SETUP_MQTT: if (rotate_to_sub(event.state.position, 3, &SubMenu, &SubOffset)) |
760 screen_mqtt_setup(SubMenu); |
838 screen_mqtt_setup(SubMenu); |
761 break; |
839 break; |
762 case ML2_SETUP_NETWORK: if (rotate_to_sub(event.state.position, 0, 2, &SubMenu)) |
840 case ML2_SETUP_NETWORK: if (rotate_to_sub(event.state.position, 2, &SubMenu, &SubOffset)) |
763 screen_network_setup(SubMenu); |
841 screen_network_setup(SubMenu); |
764 break; |
842 break; |
765 default: |
843 default: |
766 ESP_LOGI(TAG, "Event: position %d, direction %s", event.state.position, |
844 ESP_LOGI(TAG, "Event: position %d, direction %s", event.state.position, |
767 event.state.direction ? (event.state.direction == ROTARY_ENCODER_DIRECTION_CLOCKWISE ? "CW":"CCW"):"NOT_SET"); |
845 event.state.direction ? (event.state.direction == ROTARY_ENCODER_DIRECTION_CLOCKWISE ? "CW":"CCW"):"NOT_SET"); |
989 while (UserTimer) { |
1092 while (UserTimer) { |
990 |
1093 |
991 menu_change(); |
1094 menu_change(); |
992 |
1095 |
993 if (xEventGroupGetBits(xEventGroupUser) & TASK_USER_REFRESH) { |
1096 if (xEventGroupGetBits(xEventGroupUser) & TASK_USER_REFRESH) { |
|
1097 xEventGroupClearBits(xEventGroupUser, TASK_USER_REFRESH); |
994 switch (Main_Loop2) { |
1098 switch (Main_Loop2) { |
995 case ML2_USER: screen_main(); break; |
1099 case ML2_USER: screen_main(); break; |
996 case ML2_UNIT1: screen_unit(0); break; |
1100 case ML2_UNIT1: screen_unit(0); break; |
997 case ML2_UNIT2: screen_unit(1); break; |
1101 case ML2_UNIT2: screen_unit(1); break; |
998 case ML2_UNIT3: screen_unit(2); break; |
1102 case ML2_UNIT3: screen_unit(2); break; |
999 case ML2_WIFI: screen_wifi(); break; |
1103 case ML2_WIFI: screen_wifi(); break; |
1000 } |
1104 } |
1001 xEventGroupClearBits(xEventGroupUser, TASK_USER_REFRESH); |
|
1002 } |
1105 } |
1003 |
1106 |
1004 if (xQueueReceive(event_queue, &event, 100 / portTICK_PERIOD_MS) == pdTRUE) { |
1107 if (xQueueReceive(event_queue, &event, 100 / portTICK_PERIOD_MS) == pdTRUE) { |
1005 UserTimer = INACTIVITY; |
1108 UserTimer = INACTIVITY; |
1006 menu_rotary(); |
1109 menu_rotary(); |