Browse Source

gpio handler works again
remove memory leak in FlowDigit

Zwer2k 5 years ago
parent
commit
8ca14a434c

+ 36 - 1
code/components/jomjol_controlGPIO/server_GPIO.cpp

@@ -14,13 +14,14 @@
 #include <vector>
 //#include <regex>
 
+#include "defines.h"
+
 #include "server_GPIO.h"
 
 #include "ClassLogFile.h"
 #include "configFile.h"
 #include "Helper.h"
 #include "interface_mqtt.h"
-#include "ClassFlowMQTT.h"
 
 static const char *TAG_SERVERGPIO = "server_GPIO";
 QueueHandle_t gpio_queue_handle = NULL;
@@ -481,3 +482,37 @@ gpio_int_type_t GpioHandler::resolveIntType(std::string input)
 
     return GPIO_INTR_DISABLE;
 }
+
+static GpioHandler *gpioHandler = NULL;
+
+void gpio_handler_create(httpd_handle_t server) 
+{
+    if (gpioHandler == NULL)
+        gpioHandler = new GpioHandler(CONFIG_FILE, server);
+}
+
+void gpio_handler_init() 
+{
+    if (gpioHandler != NULL) {
+        gpioHandler->init();
+    }
+}
+
+void gpio_handler_deinit() {
+    if (gpioHandler != NULL) {
+        gpioHandler->deinit();
+   }
+}
+
+void gpio_handler_destroy()
+{
+    if (gpioHandler != NULL) {
+        delete gpioHandler;
+        gpioHandler = NULL;
+    }
+}
+
+GpioHandler* gpio_handler_get()
+{
+    return gpioHandler;
+}

+ 7 - 1
code/components/jomjol_controlGPIO/server_GPIO.h

@@ -84,6 +84,12 @@ private:
     gpio_int_type_t resolveIntType(std::string input);
 };
 
-void GpioHandlerStart();
+void gpio_handler_create(httpd_handle_t server);
+void gpio_handler_init();
+void gpio_handler_deinit();
+void gpio_handler_destroy();
+GpioHandler* gpio_handler_get();
+
+
 
 #endif //SERVER_GPIO_H

+ 5 - 1
code/components/jomjol_flowcontroll/ClassFlowAnalog.cpp

@@ -284,7 +284,11 @@ bool ClassFlowAnalog::doNeuralNetwork(string time)
     string zwcnn = "/sdcard" + cnnmodelfile;
     zwcnn = FormatFileName(zwcnn);
     printf(zwcnn.c_str());printf("\n");
-    tflite->LoadModel(zwcnn); 
+    if (!tflite->LoadModel(zwcnn)) {
+        printf("Can't read model file /sdcard%s\n", cnnmodelfile.c_str());
+        delete tflite;
+        return false;
+    } 
     tflite->MakeAllocate();
 #endif
 

+ 2 - 2
code/components/jomjol_flowcontroll/ClassFlowControll.cpp

@@ -209,7 +209,7 @@ bool ClassFlowControll::doFlow(string time)
     int repeat = 0;
 
 #ifdef DEBUG_DETAIL_ON 
-    LogFile.WriteHeapInfo("ClassFlowAnalog::doFlow - Start");
+    LogFile.WriteHeapInfo("ClassFlowControll::doFlow - Start");
 #endif
 
     for (int i = 0; i < FlowControll.size(); ++i)
@@ -238,7 +238,7 @@ bool ClassFlowControll::doFlow(string time)
         }
         
 #ifdef DEBUG_DETAIL_ON  
-        LogFile.WriteHeapInfo("ClassFlowAnalog::doFlow");
+        LogFile.WriteHeapInfo("ClassFlowControll::doFlow");
 #endif
 
     }

+ 1 - 0
code/components/jomjol_flowcontroll/ClassFlowDigit.cpp

@@ -243,6 +243,7 @@ bool ClassFlowDigit::doNeuralNetwork(string time)
     printf(zwcnn.c_str());printf("\n");
     if (!tflite->LoadModel(zwcnn)) {
         printf("Can't read model file /sdcard%s\n", cnnmodelfile.c_str());
+        delete tflite;
         return false;
     } 
 

+ 1 - 1
code/components/jomjol_logfile/ClassLogFile.cpp

@@ -12,7 +12,7 @@ ClassLogFile LogFile("/sdcard/log/message", "log_%Y-%m-%d.txt");
 
 void ClassLogFile::WriteHeapInfo(std::string _id)
 {
-std::string _zw = "\t" + _id;
+    std::string _zw = "\t" + _id;
     if (loglevel > 0)
         _zw =  _zw + "\t" + getESPHeapInfo();
 

+ 1 - 1
code/components/jomjol_tfliteclass/CMakeLists.txt

@@ -2,6 +2,6 @@ FILE(GLOB_RECURSE app_sources ${CMAKE_CURRENT_SOURCE_DIR}/*.*)
 
 idf_component_register(SRCS ${app_sources}
                     INCLUDE_DIRS "."
-                    REQUIRES main jomjol_image_proc jomjol_logfile esp_http_server esp32-camera-master jomjol_controlcamera jomjol_flowcontroll jomjol_helper)
+                    REQUIRES jomjol_image_proc jomjol_logfile esp_http_server esp32-camera-master jomjol_controlcamera jomjol_flowcontroll jomjol_helper)
 
 

+ 1 - 1
code/components/jomjol_tfliteclass/server_tflite.cpp

@@ -18,7 +18,7 @@
 #include "ClassFlowControll.h"
 
 #include "ClassLogFile.h"
-#include "server_main.h"
+#include "server_GPIO.h"
 
 #define DEBUG_DETAIL_ON       
 

+ 1 - 3
code/main/main.cpp

@@ -137,9 +137,7 @@ void task_NoSDBlink(void *pvParameter)
 
 esp_err_t handler_gpio(httpd_req_t *req)
 {
-    printf("freemem -3-: %u\n", esp_get_free_heap_size());
     gpio_handler_init();
-    printf("freemem -4-: %u\n", esp_get_free_heap_size());
 
     char resp_str [30];
     sprintf(resp_str, "OK. freemem %u", esp_get_free_heap_size());
@@ -219,7 +217,7 @@ extern "C" void app_main(void)
     camuri.user_ctx  = (void*)server;    
     httpd_register_uri_handler(server, &camuri);
 
-    gpio_handler_create();
+    gpio_handler_create(server);
 
     printf("vor reg server main\n");
     register_server_main_uri(server, "/sdcard");

+ 0 - 35
code/main/server_main.cpp

@@ -25,9 +25,6 @@ std::string starttime = "";
 
 static const char *TAG_SERVERMAIN = "server-main";
 
-static GpioHandler *gpioHandler = NULL;
-
-
 /* An HTTP GET handler */
 esp_err_t info_get_handler(httpd_req_t *req)
 {
@@ -454,35 +451,3 @@ void connect_handler(void* arg, esp_event_base_t event_base,
         *server = start_webserver();
     }
 }
-
-void gpio_handler_create() 
-{
-    if (gpioHandler == NULL)
-        gpioHandler = new GpioHandler(CONFIG_FILE, server);
-}
-
-void gpio_handler_init() 
-{
-    if (gpioHandler != NULL) {
-        gpioHandler->init();
-    }
-}
-
-void gpio_handler_deinit() {
-    if (gpioHandler != NULL) {
-        gpioHandler->deinit();
-   }
-}
-
-void gpio_handler_destroy()
-{
-    if (gpioHandler != NULL) {
-        delete gpioHandler;
-        gpioHandler = NULL;
-    }
-}
-
-GpioHandler* gpio_handler_get()
-{
-    return gpioHandler;
-}

+ 0 - 6
code/main/server_main.h

@@ -16,12 +16,6 @@
 
 extern httpd_handle_t server;
 
-void gpio_handler_create();
-void gpio_handler_init();
-void gpio_handler_deinit();
-void gpio_handler_destroy();
-GpioHandler* gpio_handler_get();
-
 httpd_handle_t start_webserver(void);
 
 void register_server_main_uri(httpd_handle_t server, const char *base_path);

+ 2 - 2
code/main/version.cpp

@@ -1,4 +1,4 @@
-const char* GIT_REV="7b8f10a";
+const char* GIT_REV="b205326";
 const char* GIT_TAG="";
 const char* GIT_BRANCH="gpio-handler";
-const char* BUILD_TIME="2021-07-03 00:47";
+const char* BUILD_TIME="2021-07-05 23:02";

+ 2 - 2
code/version.cpp

@@ -1,4 +1,4 @@
-const char* GIT_REV="7b8f10a";
+const char* GIT_REV="b205326";
 const char* GIT_TAG="";
 const char* GIT_BRANCH="gpio-handler";
-const char* BUILD_TIME="2021-07-03 00:46";
+const char* BUILD_TIME="2021-07-05 23:02";

BIN
firmware/bootloader.bin


BIN
firmware/firmware.bin


BIN
firmware/html.zip


+ 7 - 1
sd-card/config/config.ini

@@ -59,7 +59,13 @@ CheckDigitIncreaseConsistency = false
 ;password = PASSWORD
 
 ;[GPIO]
-;IO16 = input 
+;MainTopicMQTT = watermeter2/GPIO
+;IO1 = input disabled  false false 
+;IO0 = input disabled  false false 
+;IO3 = input disabled  false false 
+;IO4 = built-in-led disabled 10 false false 
+;IO12 = input-pullup disabled 10 false false 
+;IO13 = input-pullup disabled 10 false false 
 
 [AutoTimer]
 AutoStart = true

+ 54 - 38
sd-card/html/edit_config_param.html

@@ -36,6 +36,10 @@ textarea {
 .invalid-input {
 	background-color: #FFAA00;
 }
+
+.hidden {
+	display: none;
+}
 </style>
 
 </head>
@@ -676,7 +680,7 @@ textarea {
 			</td>
 		</tr> 	
 		
-		<tr>
+		<tr class="GPIO_item">
 			<td width="20px"  style="padding-left: 40px;">
 				<input type="checkbox" id="GPIO_MainTopicMQTT_enabled" value="1"  onclick = 'InvertEnableItem("GPIO", "MainTopicMQTT")' unchecked >
 			</td>
@@ -692,7 +696,7 @@ textarea {
 		</tr>
 
 		<!------------- GPIO0 begin ------------------>
-		<tr class="GPIO_IO0">
+		<tr class="GPIO_IO0 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;">
 				<input type="checkbox" id="GPIO_IO0_enabled" value="1"  onclick = 'InvertEnableItem("GPIO", "IO0")' unchecked>
 			</td>
@@ -718,7 +722,7 @@ textarea {
 				<span style="color: red">Pin is used to activate flash mode and must therefore be HIGH when booting.</span>
 			</td>
 		</tr>
-		<tr class="GPIO_IO0">
+		<tr class="GPIO_IO0 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 0 use interrupt</span>
@@ -739,7 +743,7 @@ textarea {
 				GPIO 0 enable interrupt trigger
 			</td>
 		</tr>
-		<tr class="GPIO_IO0">
+		<tr class="GPIO_IO0 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 0 PWM duty resolution</span>
@@ -751,7 +755,7 @@ textarea {
 				GPIO 0 LEDC PWM duty resolution in bit
 			</td>
 		</tr>
-		<tr class="GPIO_IO0">
+		<tr class="GPIO_IO0 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 0 enable MQTT</span>
@@ -763,7 +767,7 @@ textarea {
 				GPIO 0 enable MQTT publishing/subscribing
 			</td>
 		</tr>
-		<tr class="GPIO_IO0">
+		<tr class="GPIO_IO0 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 0 enable HTTP</span>
@@ -775,7 +779,7 @@ textarea {
 				GPIO 0 enable HTTP write/read
 			</td>
 		</tr>
-		<tr class="GPIO_IO0">
+		<tr class="GPIO_IO0 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 0 name</span>
@@ -790,7 +794,7 @@ textarea {
 		<!------------- GPIO0 end ------------------>
 
 		<!------------- GPIO1 begin ------------------>
-		<tr class="GPIO_IO1">
+		<tr class="GPIO_IO1 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;">
 				<input type="checkbox" id="GPIO_IO1_enabled" value="1"  onclick = 'InvertEnableItem("GPIO", "IO1")' unchecked>
 			</td>
@@ -814,7 +818,7 @@ textarea {
 				GPIO 1 <br><span style="color: blue">Used by default for serial communication as TX pin.<br>Required for seriales monitor.</span>
 			</td>
 		</tr>
-		<tr class="GPIO_IO1">
+		<tr class="GPIO_IO1 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 1 use interrupt</span>
@@ -835,7 +839,7 @@ textarea {
 				GPIO 1 enable interrupt trigger
 			</td>
 		</tr>
-		<tr class="GPIO_IO1">
+		<tr class="GPIO_IO1 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 1 PWM duty resolution</span>
@@ -847,7 +851,7 @@ textarea {
 				GPIO 1 LEDC PWM duty resolution in bit
 			</td>
 		</tr>
-		<tr class="GPIO_IO1">
+		<tr class="GPIO_IO1 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 1 enable MQTT</span>
@@ -859,7 +863,7 @@ textarea {
 				GPIO 1 enable MQTT publishing/subscribing
 			</td>
 		</tr>
-		<tr class="GPIO_IO1">
+		<tr class="GPIO_IO1 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 1 enable HTTP</span>
@@ -871,7 +875,7 @@ textarea {
 				GPIO 1 enable HTTP write/read
 			</td>
 		</tr>
-		<tr class="GPIO_IO1">
+		<tr class="GPIO_IO1 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 1 name</span>
@@ -886,7 +890,7 @@ textarea {
 		<!------------- GPIO1 end ------------------>
 
 		<!------------- GPIO3 begin ------------------>
-		<tr class="GPIO_IO3">
+		<tr class="GPIO_IO3 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;">
 				<input type="checkbox" id="GPIO_IO3_enabled" value="1"  onclick = 'InvertEnableItem("GPIO", "IO3")' unchecked>
 			</td>
@@ -910,7 +914,7 @@ textarea {
 				GPIO 3 <span style="color: blue">Used by default for serial communication as RX pin.</span>
 			</td>
 		</tr>
-		<tr class="GPIO_IO3">
+		<tr class="GPIO_IO3 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 3 use interrupt</span>
@@ -931,7 +935,7 @@ textarea {
 				GPIO 3 Used by default for serial communication as RX pin.
 			</td>
 		</tr>
-		<tr class="GPIO_IO3">
+		<tr class="GPIO_IO3 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 3 PWM duty resolution</span>
@@ -943,7 +947,7 @@ textarea {
 				GPIO 3 LEDC PWM duty resolution in bit
 			</td>
 		</tr>
-		<tr class="GPIO_IO3">
+		<tr class="GPIO_IO3 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 3 enable MQTT</span>
@@ -955,7 +959,7 @@ textarea {
 				GPIO 3 enable MQTT publishing/subscribing
 			</td>
 		</tr>
-		<tr class="GPIO_IO3">
+		<tr class="GPIO_IO3 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 3 enable HTTP</span>
@@ -967,7 +971,7 @@ textarea {
 				GPIO 3 enable HTTP write/read
 			</td>
 		</tr>
-		<tr class="GPIO_IO3">
+		<tr class="GPIO_IO3 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 3 name</span>
@@ -982,9 +986,9 @@ textarea {
 		<!------------- GPIO3 end ------------------>
 
 		<!------------- GPIO4 begin ------------------>
-		<tr class="GPIO_IO4">
+		<tr class="GPIO_IO4 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;">
-				<input type="checkbox" id="GPIO_IO4_enabled" value="1"  onclick = 'InvertEnableItem("GPI4", "IO4")' unchecked>
+				<input type="checkbox" id="GPIO_IO4_enabled" value="1"  onclick = 'InvertEnableItem("GPIO", "IO4")' unchecked>
 			</td>
 			<td>
 				<span id="GPIO_IO4_text">GPIO 4 state</span>
@@ -1008,7 +1012,7 @@ textarea {
 				<span style="color: red">Pin is used for build-in flash light.</span>
 			</td>
 		</tr>
-		<tr class="GPIO_IO4">
+		<tr class="GPIO_IO4 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 4 use interrupt</span>
@@ -1029,7 +1033,7 @@ textarea {
 				GPIO 4 enable interrupt trigger
 			</td>
 		</tr>
-		<tr class="GPIO_IO4">
+		<tr class="GPIO_IO4 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 4 PWM duty resolution</span>
@@ -1041,7 +1045,7 @@ textarea {
 				GPIO 4 LEDC PWM duty resolution in bit
 			</td>
 		</tr>
-		<tr class="GPIO_IO4">
+		<tr class="GPIO_IO4 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 4 enable MQTT</span>
@@ -1053,7 +1057,7 @@ textarea {
 				GPIO 4 enable MQTT publishing/subscribing
 			</td>
 		</tr>
-		<tr class="GPIO_IO4">
+		<tr class="GPIO_IO4 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 4 enable HTTP</span>
@@ -1065,7 +1069,7 @@ textarea {
 				GPIO 4 enable HTTP write/read
 			</td>
 		</tr>
-		<tr class="GPIO_IO4">
+		<tr class="GPIO_IO4 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 4 name</span>
@@ -1080,7 +1084,7 @@ textarea {
 		<!------------- GPIO4 end ------------------>
 
 		<!------------- GPIO12 begin ------------------>
-		<tr class="GPIO_IO12">
+		<tr class="GPIO_IO12 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;">
 				<input type="checkbox" id="GPIO_IO12_enabled" value="1"  onclick = 'InvertEnableItem("GPIO", "IO12")' unchecked>
 			</td>
@@ -1104,7 +1108,7 @@ textarea {
 				GPIO 12 is usable without restrictions
 			</td>
 		</tr>
-		<tr class="GPIO_IO12">
+		<tr class="GPIO_IO12 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 12 use interrupt</span>
@@ -1125,7 +1129,7 @@ textarea {
 				GPIO 12 enable interrupt trigger
 			</td>
 		</tr>
-		<tr class="GPIO_IO12">
+		<tr class="GPIO_IO12 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 12 PWM duty resolution</span>
@@ -1137,7 +1141,7 @@ textarea {
 				GPIO 12 LEDC PWM duty resolution in bit
 			</td>
 		</tr>
-		<tr class="GPIO_IO12">
+		<tr class="GPIO_IO12 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 12 enable MQTT</span>
@@ -1149,7 +1153,7 @@ textarea {
 				GPIO 12 enable MQTT publishing/subscribing
 			</td>
 		</tr>
-		<tr class="GPIO_IO12">
+		<tr class="GPIO_IO12 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 12 enable HTTP</span>
@@ -1161,7 +1165,7 @@ textarea {
 				GPIO 12 enable HTTP write/read
 			</td>
 		</tr>
-		<tr class="GPIO_IO12">
+		<tr class="GPIO_IO12 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 12 name</span>
@@ -1176,7 +1180,7 @@ textarea {
 		<!------------- GPIO12 end ------------------>
 
 		<!------------- GPIO13 begin ------------------>
-		<tr class="GPIO_IO13">
+		<tr class="GPIO_IO13 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;">
 				<input type="checkbox" id="GPIO_IO13_enabled" value="1"  onclick = 'InvertEnableItem("GPIO", "IO13")' unchecked>
 			</td>
@@ -1200,7 +1204,7 @@ textarea {
 				GPIO 13 is usable without restrictions
 			</td>
 		</tr>
-		<tr class="GPIO_IO13">
+		<tr class="GPIO_IO13 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 13 use interrupt</span>
@@ -1221,7 +1225,7 @@ textarea {
 				GPIO 13 enable interrupt trigger
 			</td>
 		</tr>
-		<tr class="GPIO_IO13">
+		<tr class="GPIO_IO13 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 13 PWM duty resolution</span>
@@ -1233,7 +1237,7 @@ textarea {
 				GPIO 13 LEDC PWM duty resolution in bit
 			</td>
 		</tr>
-		<tr class="GPIO_IO13">
+		<tr class="GPIO_IO13 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 13 enable MQTT</span>
@@ -1245,7 +1249,7 @@ textarea {
 				GPIO 13 enable MQTT publishing/subscribing
 			</td>
 		</tr>
-		<tr class="GPIO_IO13">
+		<tr class="GPIO_IO13 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 13 enable HTTP</span>
@@ -1257,7 +1261,7 @@ textarea {
 				GPIO 13 enable HTTP write/read
 			</td>
 		</tr>
-		<tr class="GPIO_IO13">
+		<tr class="GPIO_IO13 GPIO_item">
 			<td width="20px"  style="padding-left: 40px;"></td>
 			<td>
 				<span>GPIO 13 name</span>
@@ -1518,6 +1522,17 @@ function setEnabled(className, enabled) {
 	}
 }
 
+function setVisible(className, visible) {
+	let elements = document.getElementsByClassName(className);
+	for (i = 0; i < elements.length; i++) {
+		if (visible) {
+			elements[i].classList.remove("hidden");
+		} else {
+			elements[i].classList.add("hidden");
+		}
+	}
+}
+
 function EnDisableItem(_status, _param, _category, _cat, _name, _optional)
 {
 	_status = _param[_cat][_name]["found"] && _category[_cat]["enabled"];
@@ -1582,6 +1597,7 @@ function UpdateInput() {
 	document.getElementById("Category_Digits_enabled").checked = category["Digits"]["enabled"];
 	document.getElementById("Category_MQTT_enabled").checked = category["MQTT"]["enabled"];
 	document.getElementById("Category_GPIO_enabled").checked = category["GPIO"]["enabled"];
+	setVisible("GPIO_item", category["GPIO"]["enabled"]);
 
 	WriteParameter(param, category, "MakeImage", "LogImageLocation", true);
 	WriteParameter(param, category, "MakeImage", "LogfileRetentionInDays", true);