Просмотр исходного кода

Merge branch 'jomjol:rolling' into rolling

Frank Haverland 3 лет назад
Родитель
Сommit
8247580372

+ 47 - 0
.github/workflows/build.yaml

@@ -0,0 +1,47 @@
+name: Build and Pack
+
+on: [push]
+
+jobs:
+  build:
+
+    runs-on: ubuntu-latest
+
+    steps:
+    - uses: actions/checkout@v2
+
+    - name: Cache PlatformIO
+      uses: actions/cache@v2
+      with:
+        path: ~/.platformio
+        key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
+
+    - name: Set up Python
+      uses: actions/setup-python@v2
+    - name: Install PlatformIO
+      run: |
+        python -m pip install --upgrade pip
+        pip install --upgrade platformio
+
+    - name: Set outputs
+      id: vars
+      run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"
+
+    - name: Set Versions
+      run: echo "${{ github.ref_name }} / ${{ steps.vars.outputs.sha_short }}" > "sd-card/html/version.txt"
+
+    - name: Build Firmware
+#      run: touch firmware.bin # Testing
+      run: cd code; platformio run --environment esp32cam; cp .pio/build/esp32cam/firmware.bin ../firmware__${{ github.ref_name }}__${{ steps.vars.outputs.sha_short }}.bin
+
+    - name: Upload Firmware Artifact
+      uses: actions/upload-artifact@v3
+      with:
+        name: firmware__${{ github.ref_name }}__${{ steps.vars.outputs.sha_short }}
+        path: firmware__${{ github.ref_name }}__${{ steps.vars.outputs.sha_short }}.bin
+
+    - name: Upload Web interface Artifact
+      uses: actions/upload-artifact@v3
+      with:
+        name: web-interface__${{ github.ref_name }}__${{ steps.vars.outputs.sha_short }}
+        path: ./sd-card/html/*

+ 6 - 0
README.md

@@ -40,6 +40,12 @@ In other cases you can contact the developer via email: <img src="https://raw.gi
 
 ------
 
+##### Rolling (2022-09-10)
+
+- Internal preparations for improved update mechanism
+- Additional testcases (**[haverland](https://github.com/haverland)**)
+- HTML: Updates / improvements  (**[caco3](https://github.com/caco3)**)
+
 ##### Rolling (2022-09-04)
 
 - Improved Reboot (**[caco3](https://github.com/caco3)**)

+ 95 - 21
code/components/jomjol_fileserver_ota/server_file.cpp

@@ -120,16 +120,6 @@ esp_err_t get_tflite_file_handler(httpd_req_t *req)
 }
 
 
-/* Handler to redirect incoming GET request for /index.html to /
- * This can be overridden by uploading file with same name */
-// static esp_err_t index_html_get_handler(httpd_req_t *req)
-// {
-//     httpd_resp_set_status(req, "307 Temporary Redirect");
-//     httpd_resp_set_hdr(req, "Location", "/");
-//     httpd_resp_send(req, NULL, 0);  // Response body can be empty
-//     return ESP_OK;
-// }
-
 /* Send HTTP response with a run-time generated html consisting of
  * a list of all files and folders under the requested path.
  * In case of SPIFFS this returns empty list when path is any
@@ -716,6 +706,101 @@ void delete_all_in_directory(std::string _directory)
     closedir(dir);
 }
 
+std::string unzip_new(std::string _in_zip_file, std::string _target_zip, std::string _target_bin, std::string _main)
+{
+    int i, sort_iter;
+    mz_bool status;
+    size_t uncomp_size;
+    mz_zip_archive zip_archive;
+    void* p;
+    char archive_filename[64];
+    std::string zw, ret = "";
+//    static const char* s_Test_archive_filename = "testhtml.zip";
+
+    printf("miniz.c version: %s\n", MZ_VERSION);
+    printf("Zipfile: %s\n", _in_zip_file.c_str());
+    printf("Target Dir ZIP: %s\n", _target_zip.c_str());
+    printf("Target Dir BIN: %s\n", _target_bin.c_str());
+
+    // Now try to open the archive.
+    memset(&zip_archive, 0, sizeof(zip_archive));
+    status = mz_zip_reader_init_file(&zip_archive, _in_zip_file.c_str(), 0);
+    if (!status)
+    {
+        printf("mz_zip_reader_init_file() failed!\n");
+        return ret;
+    }
+
+    // Get and print information about each file in the archive.
+    int numberoffiles = (int)mz_zip_reader_get_num_files(&zip_archive);
+    for (sort_iter = 0; sort_iter < 2; sort_iter++)
+    {
+        memset(&zip_archive, 0, sizeof(zip_archive));
+        status = mz_zip_reader_init_file(&zip_archive, _in_zip_file.c_str(), sort_iter ? MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY : 0);
+        if (!status)
+        {
+            printf("mz_zip_reader_init_file() failed!\n");
+            return ret;
+        }
+
+        for (i = 0; i < numberoffiles; i++)
+        {
+            mz_zip_archive_file_stat file_stat;
+            mz_zip_reader_file_stat(&zip_archive, i, &file_stat);
+            sprintf(archive_filename, file_stat.m_filename);
+ 
+            // Try to extract all the files to the heap.
+            p = mz_zip_reader_extract_file_to_heap(&zip_archive, archive_filename, &uncomp_size, 0);
+            if (!p)
+            {
+                printf("mz_zip_reader_extract_file_to_heap() failed!\n");
+                mz_zip_reader_end(&zip_archive);
+                return ret;
+            }
+
+            // Save to File.
+            zw = std::string(archive_filename);
+            if (toUpper(zw) == "FIRMWARE.BIN")
+            {
+                zw = _target_bin + zw;
+                ret = zw;
+            }
+            else
+            {
+                std::string _dir = getDirectory(zw);
+
+                if (_dir.length() > 0)
+                {
+                    zw = _main + zw;
+                }
+                else
+                {
+                    zw = _target_zip + zw;
+                }
+
+            }
+
+            printf("Filename to extract: %s", zw.c_str());
+            DeleteFile(zw);
+            FILE* fpTargetFile = OpenFileAndWait(zw.c_str(), "wb");
+            fwrite(p, 1, (uint)uncomp_size, fpTargetFile);
+            fclose(fpTargetFile);
+
+            printf("Successfully extracted file \"%s\", size %u\n", archive_filename, (uint)uncomp_size);
+            //            printf("File data: \"%s\"\n", (const char*)p);
+
+            // We're done.
+            mz_free(p);
+        }
+
+        // Close the archive, freeing any resources it was using
+        mz_zip_reader_end(&zip_archive);
+    }
+
+    printf("Success.\n");
+    return ret;
+}
+
 void unzip(std::string _in_zip_file, std::string _target_directory){
     int i, sort_iter;
     mz_bool status;
@@ -860,15 +945,4 @@ void register_server_file_uri(httpd_handle_t server, const char *base_path)
     };
     httpd_register_uri_handler(server, &file_delete);
 
-
-    /* URI handler for getting tflite files from server */
-/*
-    httpd_uri_t file_tflite = {
-        .uri       = "/tflite",   // Match all URIs of type /delete/path/to/file
-        .method    = HTTP_GET,
-        .handler   = get_tflite_file_handler,
-        .user_ctx  = server_data    // Pass server data as context
-    };
-    httpd_register_uri_handler(server, &file_tflite);
-*/
 }

+ 2 - 0
code/components/jomjol_fileserver_ota/server_file.h

@@ -4,6 +4,8 @@
 void register_server_file_uri(httpd_handle_t server, const char *base_path);
 
 void unzip(std::string _in_zip_file, std::string _target_directory);
+std::string unzip_new(std::string _in_zip_file, std::string _target_zip, std::string _target_bin, std::string _main = "/sdcard/");
+
 
 void delete_all_in_directory(std::string _directory);
 

+ 87 - 19
code/components/jomjol_fileserver_ota/server_ota.cpp

@@ -207,24 +207,6 @@ static void print_sha256 (const uint8_t *image_hash, const char *label)
 
 static bool diagnostic(void)
 {
-/*
-    gpio_config_t io_conf;
-    io_conf.intr_type    = (gpio_int_type_t) GPIO_PIN_INTR_DISABLE;
-    io_conf.mode         = GPIO_MODE_INPUT;
-    io_conf.pin_bit_mask = (1ULL << CONFIG_EXAMPLE_GPIO_DIAGNOSTIC);
-    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
-    io_conf.pull_up_en   = GPIO_PULLUP_ENABLE;
-    gpio_config(&io_conf);
-
-    ESP_LOGI(TAGPARTOTA, "Diagnostics (5 sec)...");
-    vTaskDelay(5000 / portTICK_PERIOD_MS);
-
-    bool diagnostic_is_ok = gpio_get_level(CONFIG_EXAMPLE_GPIO_DIAGNOSTIC);
-
-    gpio_reset_pin(CONFIG_EXAMPLE_GPIO_DIAGNOSTIC);
-
-    return diagnostic_is_ok;
-*/
     return true;
 }
 
@@ -326,7 +308,7 @@ esp_err_t handler_ota_update(httpd_req_t *req)
         
         if (httpd_query_key_value(_query, "task", _valuechar, 30) == ESP_OK)
         {
-            printf("task is found"); printf(_valuechar); printf("\n"); 
+            printf("task is found: "); printf(_valuechar); printf("\n"); 
             _task = std::string(_valuechar);
         }
 
@@ -344,6 +326,92 @@ esp_err_t handler_ota_update(httpd_req_t *req)
 
     };
 
+    if (_task.compare("update") == 0)
+    {
+        std::string filetype = toUpper(getFileType(fn));
+        if (filetype.length() == 0)
+        {
+            std::string zw = "Update failed - no file specified (zip, bin, tfl, tlite)";
+            httpd_resp_sendstr_chunk(req, zw.c_str());
+            httpd_resp_sendstr_chunk(req, NULL);  
+            return ESP_OK;        
+        }
+
+
+        if ((filetype == "TFLITE") || (filetype == "TFL"))
+        {
+            std::string out = "/sdcard/config/" + getFileFullFileName(fn);
+            DeleteFile(out);
+            CopyFile(fn, out);
+            DeleteFile(fn);
+
+            const char*  resp_str = "Neural Network File copied.";
+            httpd_resp_sendstr_chunk(req, resp_str);
+            httpd_resp_sendstr_chunk(req, NULL);  
+            return ESP_OK;
+        }
+
+
+        if (filetype == "ZIP")
+        {
+            std::string in, out, outbin, zw, retfirmware;
+
+//            in = "/sdcard/firmware/html.zip";
+            out = "/sdcard/html";
+            outbin = "/sdcard/firmware";
+
+//            delete_all_in_directory(out);
+
+            retfirmware = unzip_new(fn, out+"/", outbin+"/");
+
+            if (retfirmware.length() > 0)
+            {
+                filetype = "BIN";
+                fn = retfirmware;
+                zw = "HTML Update Successfull!<br><br>Additioal firmware found in ZIP file.\n";
+                httpd_resp_sendstr_chunk(req, zw.c_str());
+            }
+            else
+            {
+                zw = "HTML Update Successfull!<br><br>No reboot necessary.\n";
+                httpd_resp_sendstr_chunk(req, zw.c_str());
+                httpd_resp_sendstr_chunk(req, NULL);  
+                return ESP_OK;        
+            }
+        }
+
+
+        if (filetype == "BIN")
+        {
+            const char* resp_str;    
+            KillTFliteTasks();
+            gpio_handler_deinit();
+            if (ota_update_task(fn))
+            {
+                resp_str = "Firmware Update Successfull!<br><br>You can restart now.";
+            }
+            else
+            {
+                resp_str = "Error during Firmware Update!!!<br><br>Please check output of console.";
+            }
+
+            httpd_resp_send(req, resp_str, strlen(resp_str));  
+
+            #ifdef DEBUG_DETAIL_ON 
+                LogFile.WriteHeapInfo("handler_ota_update - Done");    
+            #endif
+
+            return ESP_OK;
+        }
+
+
+        std::string zw = "Update failed - no valid file specified (zip, bin, tfl, tlite)";
+        httpd_resp_sendstr_chunk(req, zw.c_str());
+        httpd_resp_sendstr_chunk(req, NULL);  
+        return ESP_OK;        
+    }
+
+
     if (_task.compare("unziphtml") == 0)
     {
         std::string in, out, zw;

+ 47 - 2
code/components/jomjol_helper/Helper.cpp

@@ -209,6 +209,21 @@ size_t findDelimiterPos(string input, string delimiter)
 	return pos;
 }
 
+void DeleteFile(string fn)
+{
+//	ESP_LOGI(logTag, "Deleting file : %s", fn.c_str());
+	/* Delete file */
+	FILE* fpSourceFile = OpenFileAndWait(fn.c_str(), "rb");
+	if (!fpSourceFile)	// Sourcefile existiert nicht sonst gibt es einen Fehler beim Kopierversuch!
+	{
+		printf("DeleteFile: File %s existiert nicht!\n", fn.c_str());
+		return;
+	}
+	fclose(fpSourceFile);
+
+	unlink(fn.c_str());    
+}
+
 
 void CopyFile(string input, string output)
 {
@@ -243,18 +258,48 @@ void CopyFile(string input, string output)
 	// Close The Files
 	fclose(fpSourceFile);
 	fclose(fpTargetFile);
+	printf("File copied: %s to %s", input.c_str(), output.c_str());
 }
 
+string getFileFullFileName(string filename)
+{
+	size_t lastpos = filename.find_last_of('/');
+
+	if (lastpos == string::npos)
+		return "";
+
+//	printf("Last position: %d\n", lastpos);
+
+	string zw = filename.substr(lastpos + 1, filename.size() - lastpos);
+
+	return zw;
+}
+
+string getDirectory(string filename)
+{
+	size_t lastpos = filename.find('/');
+
+	if (lastpos == string::npos)
+		return "";
+
+//	printf("Directory: %d\n", lastpos);
+
+	string zw = filename.substr(0, lastpos - 1);
+	return zw;
+}
 
 string getFileType(string filename)
 {
-	int lastpos = filename.find(".", 0);
-	int neu_pos;
+	size_t lastpos = filename.find(".", 0);
+	size_t neu_pos;
 	while ((neu_pos = filename.find(".", lastpos + 1)) > -1)
 	{
 		lastpos = neu_pos;
 	}
 
+	if (lastpos == string::npos)
+		return "";
+
 	string zw = filename.substr(lastpos + 1, filename.size() - lastpos);
 	zw = toUpper(zw);
 

+ 3 - 0
code/components/jomjol_helper/Helper.h

@@ -10,6 +10,7 @@ std::string FormatFileName(std::string input);
 void FindReplace(std::string& line, std::string& oldString, std::string& newString);
 
 void CopyFile(string input, string output);
+void DeleteFile(string fn);
 
 FILE* OpenFileAndWait(const char* nm, const char* _mode, int _waitsec = 1);
 
@@ -19,6 +20,8 @@ string trim(string istring, string adddelimiter = "");
 bool ctype_space(const char c, string adddelimiter);
 
 string getFileType(string filename);
+string getFileFullFileName(string filename);
+string getDirectory(string filename);
 
 int mkdir_r(const char *dir, const mode_t mode);
 int removeFolder(const char* folderPath, const char* logTag);

+ 4 - 4
code/main/version.cpp

@@ -1,4 +1,4 @@
-const char* GIT_REV="47da2d6";
-const char* GIT_TAG="";
-const char* GIT_BRANCH="rolling";
-const char* BUILD_TIME="2022-09-04 18:01";
+const char* GIT_REV="N/A";
+const char* GIT_TAG="N/A";
+const char* GIT_BRANCH="N/A";
+const char* BUILD_TIME="2022-09-10 23:06";

+ 1 - 1
code/platformio.ini

@@ -12,12 +12,12 @@
 [platformio]
 src_dir = main
 
-
 [env:esp32cam]
 platform = espressif32@4.4.0
 ;platform = espressif32@5.1.0
 ;platform = espressif32
 board = esp32cam
+;board = m5stack-core-esp32
 framework = espidf
 
 ;board_build.partitions = partitions_singleapp.csv

+ 4 - 4
code/version.cpp

@@ -1,4 +1,4 @@
-const char* GIT_REV="47da2d6";
-const char* GIT_TAG="";
-const char* GIT_BRANCH="rolling";
-const char* BUILD_TIME="2022-09-04 18:01";
+const char* GIT_REV="N/A";
+const char* GIT_TAG="N/A";
+const char* GIT_BRANCH="N/A";
+const char* BUILD_TIME="2022-09-10 23:06";

BIN
firmware/bootloader.bin


BIN
firmware/firmware.bin


BIN
firmware/html.zip


+ 1 - 1
sd-card/html/common.js

@@ -9,7 +9,7 @@ function LoadHostname() {
     xhttp.addEventListener('load', function(event) {
         if (xhttp.status >= 200 && xhttp.status < 300) {
             hostname = xhttp.responseText;
-                document.title = hostname + " - jomjol - AI on the edge";
+                document.title = hostname + " - AI on the edge";
                 document.getElementById("id_title").innerHTML  = "Digitizer - AI on the edge - " + hostname;
         } 
         else {

+ 1 - 1
sd-card/html/edit_explain_0.html

@@ -2,7 +2,7 @@
 <html style="width: fit-content">
 <head>
 <link rel="icon" href="favicon.ico" type="image/x-icon">
-<title>jomjol - AI on the edge</title>
+<title>AI on the edge</title>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 

+ 1 - 1
sd-card/html/edit_explain_6.html

@@ -2,7 +2,7 @@
 <html style="width: fit-content">
 <head>
 <link rel="icon" href="favicon.ico" type="image/x-icon">
-<title>jomjol - AI on the edge</title>
+<title>AI on the edge</title>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 

+ 1 - 1
sd-card/html/explain_0.html

@@ -2,7 +2,7 @@
 <html style="width: fit-content">
 <head>
 <link rel="icon" href="favicon.ico" type="image/x-icon">
-<title>jomjol - AI on the edge</title>
+<title>AI on the edge</title>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 

+ 1 - 1
sd-card/html/explain_1.html

@@ -2,7 +2,7 @@
 <html style="width: fit-content">
 <head>
 <link rel="icon" href="favicon.ico" type="image/x-icon">
-<title>jomjol - AI on the edge</title>
+<title>AI on the edge</title>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 

+ 1 - 1
sd-card/html/explain_2.html

@@ -2,7 +2,7 @@
 <html style="width: fit-content">
 <head>
 <link rel="icon" href="favicon.ico" type="image/x-icon">
-<title>jomjol - AI on the edge</title>
+<title>AI on the edge</title>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 

+ 1 - 1
sd-card/html/explain_3.html

@@ -2,7 +2,7 @@
 <html style="width: fit-content">
 <head>
 <link rel="icon" href="favicon.ico" type="image/x-icon">
-<title>jomjol - AI on the edge</title>
+<title>AI on the edge</title>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 

+ 1 - 1
sd-card/html/explain_4.html

@@ -2,7 +2,7 @@
 <html style="width: fit-content">
 <head>
 <link rel="icon" href="favicon.ico" type="image/x-icon">
-<title>jomjol - AI on the edge</title>
+<title>AI on the edge</title>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 

+ 1 - 1
sd-card/html/explain_5.html

@@ -2,7 +2,7 @@
 <html style="width: fit-content">
 <head>
 <link rel="icon" href="favicon.ico" type="image/x-icon">
-<title>jomjol - AI on the edge</title>
+<title>AI on the edge</title>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 

+ 1 - 1
sd-card/html/explain_6.html

@@ -2,7 +2,7 @@
 <html style="width: fit-content">
 <head>
 <link rel="icon" href="favicon.ico" type="image/x-icon">
-<title>jomjol - AI on the edge</title>
+<title>AI on the edge</title>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 

+ 1 - 1
sd-card/html/index.html

@@ -2,7 +2,7 @@
 <html>
 <head>
 <link rel="icon" href="favicon.ico" type="image/x-icon">
-<title>jomjol - AI on the edge</title>
+<title>AI on the edge</title>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <!-- <link rel="stylesheet" href="style.css" type="text/css" > -->

+ 1 - 1
sd-card/html/index_configure.html

@@ -2,7 +2,7 @@
 <html>
 <head>
 <link rel="icon" href="favicon.ico" type="image/x-icon">
-<title>jomjol - AI on the edge</title>
+<title>AI on the edge</title>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <!-- <link rel="stylesheet" href="style.css" type="text/css" > -->

+ 3 - 1
sd-card/html/info.html

@@ -2,7 +2,7 @@
 <html>
 <head>
 <link rel="icon" href="favicon.ico" type="image/x-icon">
-<title>Set PreValue</title>
+<title>Info</title>
 <meta charset="utf-8">
 
 <style>
@@ -136,6 +136,8 @@ div {
   </tr>
 </table>
 
+<h3>Copyright</h3>
+Copyright &copy; 2020 - 2022 by <a href="https://github.com/jomjol/AI-on-the-edge-device" target=_blank>Jomjol</a> and others.
 
 </body>
 </html>

+ 11 - 13
sd-card/html/ota_page.html

@@ -29,7 +29,8 @@ input[type=number] {
 </head>
 
 <body style="font-family: arial; padding: 0px 10px;">
-<h3>It is strongly recommended to update firmware and content of /html directory on SD-card at the same time!</h3>
+Check at <a href="https://github.com/jomjol/AI-on-the-edge-device/releases" target=_blank>https://github.com/jomjol/AI-on-the-edge-device/releases</a> to see if there is an update available.
+<h3>It is strongly recommended to update firmware and web interface (stored separately in the html directory on SD-card) at the same time!</h3>
 <hr>
 <h2>1. Firmware Update</h2>
 <table class="fixed" border="0">
@@ -38,7 +39,7 @@ input[type=number] {
             <table border="0">
                 <tr>
                     <td style="width: 230px">
-                        <label for="newfile">Select the firmware file:</label>
+                        <label for="newfile">Select the firmware file (firmware.bin):</label>
                     </td>
                     <td colspan="2">
                         <input id="newfile" type="file" onchange="setpath()" style="width:100%;">
@@ -52,7 +53,7 @@ input[type=number] {
                         <label for="filepath">Set path on server:</label>
                     </td>
                     <td>
-                        <input id="filepath" type="text" style="width:100%;" readonly>
+                        <input id="filepath" type="text" style="width:100%; border: 0" readonly>
                     </td>
                     <td>
                         <button id="upload" type="button" onclick="upload()">Upload</button>
@@ -62,21 +63,20 @@ input[type=number] {
         </td>
     </tr>
 </table>
-<hr>
-<h2>2. Update "/html" directory</h2>
+<h2>2. Web Interface Update</h2>
 <table class="fixed" border="0">
     <tr>
         <td>
             <table border="0">
                 <tr>
                     <td style="width: 230px">
-                        <label for="newfilehtml">Select the zipped /html content:</label>
+                        <label for="newfilehtml">Select the Web Interface file (html.zip):</label>
                     </td>
                     <td colspan="2">
                         <input id="newfilehtml" type="file" onchange="setpathhtml()" style="width:100%;">
                     </td>
                     <td rowspan="2" style="padding-left:50px">
-			<button class="button" id="doUpdatehtml" type="button" onclick="doUpdatehtml()">Update "/html" directory</button>
+			<button class="button" id="doUpdatehtml" type="button" onclick="doUpdatehtml()">Update Web Interface</button>
                     </td>
                 </tr>
                 <tr>
@@ -84,7 +84,7 @@ input[type=number] {
                         <label for="filepathhtml">Set path on server:</label>
                     </td>
                     <td>
-                        <input id="filepathhtml" type="text" style="width:100%;" readonly>
+                        <input id="filepathhtml" type="text" style="width:100%; border: 0" readonly>
                     </td>
                     <td>
                         <button id="uploadhtml" type="button" onclick="uploadhtml()">Upload</button>
@@ -94,11 +94,11 @@ input[type=number] {
         </td>
     </tr>
 </table>
-<hr>
 <h2>3. Reboot</h2>
 			<button class="button" id="reboot" type="button" onclick="doReboot()">Reboot to activate updates</button>
 <hr>
-<h2>4. Upload neural network definition (tfl/tflite file)</h2>
+<h2>Upload Neural Network Definition (tfl/tflite file)</h2>
+<b>The file must be set active afterwards on the <a href="index_configure.html" target="_parent">Config</a> page</b>!
 <table class="fixed" border="0">
     <tr>
         <td>
@@ -116,7 +116,7 @@ input[type=number] {
                         <label for="filepathtfl">Set path on server</label>
                     </td>
                     <td>
-                        <input id="filepathtfl" type="text" style="width:100%;" readonly>
+                        <input id="filepathtfl" type="text" style="width:100%; border: 0" readonly>
                     </td>
                     <td>
                         <button id="uploadtfl" type="button" onclick="uploadtfl()" disabled>Upload</button>
@@ -125,8 +125,6 @@ input[type=number] {
             </table>
         </td>
     </tr>
-    The file must be activated!
-    Use the <a href="index_configure.html" target="_parent">Config Page</a> or do it manually in the config.ini file.
 </table>
 
 

+ 1 - 1
sd-card/html/ota_page_v2.html

@@ -1,7 +1,7 @@
 <html>
 <head>
 <link rel="icon" href="data:,">
-	<title>jomjol - AI on the edge</title>
+	<title>AI on the edge</title>
 	<meta charset="utf-8">
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<script type="text/javascript">

+ 1 - 1
sd-card/html/setup.html

@@ -2,7 +2,7 @@
 <html style="width: fit-content">
 <head>
 <link rel="icon" href="favicon.ico" type="image/x-icon">
-<title>jomjol - AI on the edge</title>
+<title>AI on the edge</title>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 

+ 1 - 1
sd-card/html/version.txt

@@ -1 +1 @@
-16.3.4
+16.4.0