Added WiFi list configured APs. Added offset to the menu rotary for large menus.

Tue, 12 Nov 2019 16:55:36 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Tue, 12 Nov 2019 16:55:36 +0100
changeset 32
7717ac1d2f7f
parent 31
1f507aba6561
child 33
331e7f700971

Added WiFi list configured APs. Added offset to the menu rotary for large menus.

main/config.h file | annotate | diff | comparison | revisions
main/task_user.c file | annotate | diff | comparison | revisions
main/task_wifi.c file | annotate | diff | comparison | revisions
--- a/main/config.h	Tue Nov 12 16:26:51 2019 +0100
+++ b/main/config.h	Tue Nov 12 16:55:36 2019 +0100
@@ -104,6 +104,9 @@
     ML2_ZERO_UNIT3,		///< Unit 3 set zero
     ML2_SETUP_NETWORK,		///< Network setup
     ML2_SETUP_MQTT,		///< MQTT setup
+    ML2_SETUP_WIFI,		///< WiFi setup
+    ML2_LIST_APS,		///< WiFi list APs
+    ML2_EDIT_AP,		///< WiFi edit AP
     ML2_INACTIVE,		///< Inactive reached, cleanup
     ML2_DONE			///< All done
 } ML2;
--- a/main/task_user.c	Tue Nov 12 16:26:51 2019 +0100
+++ b/main/task_user.c	Tue Nov 12 16:55:36 2019 +0100
@@ -15,12 +15,15 @@
 int					Main_Loop2 = -1;		///< Effective menu
 int					New_Loop2 = ML2_INIT;		///< New menu
 int					SubMenu = 0;			///< Submenu number
+int					SubOffset = 0;			///< Submenu offset
 u8g2_t					u8g2;				///< A structure which will contain all the data for one display
 rotary_encoder_info_t			rinfo = { 0 };			///< Rotary encoder record
 rotary_encoder_event_t			event = { 0 };
 QueueHandle_t				event_queue;
 static xQueueHandle                     gpio_evt_queue = NULL;          ///< Rotary pushbutton queue
 static int				PushDuration = 0;		///< Duration of the pushed button
+char					SSIDs[10][32];			///< List of SSIDs we know
+int					num_ssids = 0;			///< Number of SSIDs we know
 
 extern const esp_app_desc_t		*app_desc;
 extern unit_t				units[3];			///< Pressure test units
@@ -470,11 +473,51 @@
 
 void screen_wifi_setup(int sub)
 {
-    screen_top("WiFi Setup");
-    menu_line(sub == 0, 2, 25, "Connect");
-    menu_line(sub == 1, 2, 37, "New");
-    menu_line(sub == 2, 2, 49, "Delete");
-    menu_line(sub == 3, 2, 61, "Return");
+    screen_top("WiFi AP setup");
+    menu_line(sub == 0, 2, 25, "Lijst AP");
+    menu_line(sub == 1, 2, 37, "Nieuw AP");
+    menu_line(sub == 2, 2, 49, "Terug");
+    u8g2_SendBuffer(&u8g2);
+}
+
+
+
+void screen_list_aps(int sub, int offset)
+{
+    int			i;
+    struct strStations	ap;
+    uint8_t		*dst = (uint8_t *)&ap;
+    FILE		*f;
+    size_t		bytes;
+
+    num_ssids = 0;
+    memset(dst, 0, sizeof(ap));
+    f = fopen("/spiffs/etc/stations.conf", "r+");
+    if (f) {
+	while (1) {
+	    bytes = fread(dst, 1, sizeof(ap), f);
+	    if (bytes < sizeof(ap)) {
+		fclose(f);
+		break;
+	    }
+	    memcpy(SSIDs[num_ssids], ap.SSID, 32);
+	    num_ssids++;
+	}
+    }
+printf("loaded %d SSIDs sub %d  offset %d\n", num_ssids, sub, offset);
+
+    screen_top("WiFi AP lijst");
+    if (num_ssids == 0) {
+	menu_line(0, 1, 25, "Geen AP's");
+    } else {
+	for (i = 0; i < num_ssids; i++) {
+	    menu_line(sub == i, 1, 25 + (i * 12), SSIDs[i + offset]);
+	    if (i == 3)
+		break;
+	}
+	if (i < 4)
+	    menu_line(sub == i, 1, 25 + (i * 12), "Terug");
+    }
     u8g2_SendBuffer(&u8g2);
 }
 
@@ -620,33 +663,51 @@
 /**
  * @brief Rotate subscreens numbers.
  * @param pos The new position, positive, negative or zero.
- * @param min The lowest number. If already at the lowest, select the highest.
  * @param max The highest number. If already at the highest, select the lowest.
  * @param cursub The subscreen number by reference. This is updated with the new number.
  * @return Returns true if a new number is selected, false if nothing changed.
  */
-bool rotate_to_sub(rotary_encoder_position_t pos, int min, int max, int *cursub)
+bool rotate_to_sub(rotary_encoder_position_t pos, int max, int *cursub, int *curoffset)
 {
-   int	sub = *cursub;
-   bool	rc = false;
+    int		sub = *cursub;
+    int		offset = *curoffset;
+    bool	rc = false;
 
    if (pos > 0) {
-	if (sub < max)
-	    sub++;
-	else
-	    sub = min;
+	if ((sub + offset) < max) {
+	    if (sub < 3) {
+	    	sub++;
+	    } else {
+		offset++;
+	    }
+	} else {
+	    sub = offset = 0;
+	}
 	ESP_ERROR_CHECK(rotary_encoder_reset(&rinfo));
 	rc = true;
     } else if (pos < 0) {
-	if (sub > min)
-	    sub--;
-	else
-	    sub = max;
+	if ((sub + offset) > 0) {
+	    if (offset > 0) {
+		offset--;
+	    } else {
+		sub--;
+	    }
+	} else {
+	    if (max > 3) {
+		offset = max - 3;
+		sub = 3;
+	    } else {
+	    	sub = max;
+		offset = 0;
+	    }
+	}
 	ESP_ERROR_CHECK(rotary_encoder_reset(&rinfo));
 	rc = true;
     }
 
+printf("rotate_to_sub(%d, %d, %d, %d)\n", pos, max, sub, offset);
     *cursub = sub;
+    *curoffset = offset;
     return rc;
 }
 
@@ -680,6 +741,17 @@
                 screen_wifi();
                 break;
 
+	    case ML2_SETUP_WIFI:
+		ESP_LOGI(TAG, "Loop user: WiFi setup");
+		screen_wifi_setup(SubMenu);
+		break;
+
+	    case ML2_LIST_APS:
+		ESP_LOGI(TAG, "Loop user: WiFi list APs");
+		SubMenu = SubOffset = 0;
+		screen_list_aps(SubMenu, SubOffset);
+		break;
+
             case ML2_NETWORK:
                 ESP_LOGI(TAG, "Loop user: Network");
                 screen_network();
@@ -709,7 +781,7 @@
             case ML2_SETUP_UNIT2:
             case ML2_SETUP_UNIT3:
                 ESP_LOGI(TAG, "Loop user: Setup Unit %d", Main_Loop2 - ML2_SETUP_UNIT1);
-                SubMenu = 0;
+                SubMenu = SubOffset = 0;
                 screen_unit_setup(Main_Loop2 - ML2_SETUP_UNIT1, SubMenu);
                 break;
 
@@ -717,7 +789,7 @@
             case ML2_ZERO_UNIT2:
             case ML2_ZERO_UNIT3:
                 ESP_LOGI(TAG, "Loop user: Zero Unit %d", Main_Loop2 - ML2_ZERO_UNIT1);
-                SubMenu = 0;
+                SubMenu = SubOffset = 0;
                 screen_unit_zero(Main_Loop2 - ML2_ZERO_UNIT1, SubMenu);
                 break;
 
@@ -748,18 +820,24 @@
 	case ML2_UPDATE:        rotate_to_menu(event.state.position, ML2_UPDATE, ML2_MQTT); break;
 	case ML2_SETUP_UNIT1:
 	case ML2_SETUP_UNIT2:
-	case ML2_SETUP_UNIT3:   if (rotate_to_sub(event.state.position, 0, 3, &SubMenu))
+	case ML2_SETUP_UNIT3:   if (rotate_to_sub(event.state.position, 3, &SubMenu, &SubOffset))
 				    screen_unit_setup(Main_Loop2 - ML2_SETUP_UNIT1, SubMenu);
 				break;
 	case ML2_ZERO_UNIT1:
 	case ML2_ZERO_UNIT2:
-	case ML2_ZERO_UNIT3:    if (rotate_to_sub(event.state.position, 0, 1, &SubMenu))
+	case ML2_ZERO_UNIT3:    if (rotate_to_sub(event.state.position, 1, &SubMenu, &SubOffset))
 				    screen_unit_zero(Main_Loop2 - ML2_ZERO_UNIT1, SubMenu);
 				break;
-	case ML2_SETUP_MQTT:	if (rotate_to_sub(event.state.position, 0, 3, &SubMenu))
+	case ML2_SETUP_WIFI:	if (rotate_to_sub(event.state.position, 2, &SubMenu, &SubOffset))
+				    screen_wifi_setup(SubMenu);
+				break;
+	case ML2_LIST_APS:	if (rotate_to_sub(event.state.position, num_ssids, &SubMenu, &SubOffset))
+				    screen_list_aps(SubMenu, SubOffset);
+				break;
+	case ML2_SETUP_MQTT:	if (rotate_to_sub(event.state.position, 3, &SubMenu, &SubOffset))
 				    screen_mqtt_setup(SubMenu);
 				break;
-	case ML2_SETUP_NETWORK:	if (rotate_to_sub(event.state.position, 0, 2, &SubMenu))
+	case ML2_SETUP_NETWORK:	if (rotate_to_sub(event.state.position, 2, &SubMenu, &SubOffset))
 				    screen_network_setup(SubMenu);
 				break;
 	default:
@@ -843,6 +921,31 @@
 		}
 		break;
 
+	case ML2_WIFI:
+		New_Loop2 = ML2_SETUP_WIFI;
+		break;
+
+	case ML2_SETUP_WIFI:
+		if (SubMenu == 0) {
+		    New_Loop2 = ML2_LIST_APS;
+		}
+		if (SubMenu == 1) {
+
+		}
+		if (SubMenu == 2) {
+		    New_Loop2 = ML2_WIFI;
+		}
+		break;
+
+	case ML2_LIST_APS:
+		if ((SubMenu + SubOffset) < num_ssids) {
+		    // Edit AP
+		} else {
+		    New_Loop2 = ML2_SETUP_WIFI;
+		    SubMenu = SubOffset = 0;
+		}
+		break;
+
 	case ML2_NETWORK:
 		New_Loop2 = ML2_SETUP_NETWORK;
 		break;
@@ -991,14 +1094,14 @@
 		menu_change();
 
 		if (xEventGroupGetBits(xEventGroupUser) & TASK_USER_REFRESH) {
+		    xEventGroupClearBits(xEventGroupUser, TASK_USER_REFRESH);
     		    switch (Main_Loop2) {
-        		case ML2_USER:  screen_main(); break;
+        		case ML2_USER:  screen_main();  break;
         		case ML2_UNIT1: screen_unit(0); break;
         		case ML2_UNIT2: screen_unit(1); break;
         		case ML2_UNIT3: screen_unit(2); break;
-        		case ML2_WIFI: screen_wifi(); break;
+        		case ML2_WIFI:  screen_wifi();  break;
     		    }
-		    xEventGroupClearBits(xEventGroupUser, TASK_USER_REFRESH);
 		}
 
 		if (xQueueReceive(event_queue, &event, 100 / portTICK_PERIOD_MS) == pdTRUE) {
--- a/main/task_wifi.c	Tue Nov 12 16:26:51 2019 +0100
+++ b/main/task_wifi.c	Tue Nov 12 16:55:36 2019 +0100
@@ -229,9 +229,10 @@
 
     xSemaphoreWiFi = xSemaphoreCreateMutex();
     wifi_state = malloc(sizeof(WIFI_State));
-    wifi_state->STA_connected = false;
-    wifi_state->STA_online = false;
-    wifi_state->STA_rssi = 0;
+    memset(wifi_state, 0x00, sizeof(WIFI_State));
+//    wifi_state->STA_connected = false;
+//    wifi_state->STA_online = false;
+//    wifi_state->STA_rssi = 0;
 
     /* stop dhcp server and start dhcp client */
     ESP_ERROR_CHECK(tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_AP));

mercurial