mirror of
https://github.com/jomjol/AI-on-the-edge-device.git
synced 2025-12-11 22:16:56 +03:00
Merge branch 'jomjol:rolling' into rolling
This commit is contained in:
47
.github/workflows/build.yaml
vendored
Normal file
47
.github/workflows/build.yaml
vendored
Normal file
@@ -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/*
|
||||||
@@ -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)
|
##### Rolling (2022-09-04)
|
||||||
|
|
||||||
- Improved Reboot (**[caco3](https://github.com/caco3)**)
|
- Improved Reboot (**[caco3](https://github.com/caco3)**)
|
||||||
|
|||||||
@@ -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
|
/* Send HTTP response with a run-time generated html consisting of
|
||||||
* a list of all files and folders under the requested path.
|
* a list of all files and folders under the requested path.
|
||||||
* In case of SPIFFS this returns empty list when path is any
|
* 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);
|
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){
|
void unzip(std::string _in_zip_file, std::string _target_directory){
|
||||||
int i, sort_iter;
|
int i, sort_iter;
|
||||||
mz_bool status;
|
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);
|
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);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
void register_server_file_uri(httpd_handle_t server, const char *base_path);
|
void register_server_file_uri(httpd_handle_t server, const char *base_path);
|
||||||
|
|
||||||
void unzip(std::string _in_zip_file, std::string _target_directory);
|
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);
|
void delete_all_in_directory(std::string _directory);
|
||||||
|
|
||||||
|
|||||||
@@ -207,24 +207,6 @@ static void print_sha256 (const uint8_t *image_hash, const char *label)
|
|||||||
|
|
||||||
static bool diagnostic(void)
|
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;
|
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)
|
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);
|
_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)
|
if (_task.compare("unziphtml") == 0)
|
||||||
{
|
{
|
||||||
std::string in, out, zw;
|
std::string in, out, zw;
|
||||||
|
|||||||
@@ -209,6 +209,21 @@ size_t findDelimiterPos(string input, string delimiter)
|
|||||||
return pos;
|
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)
|
void CopyFile(string input, string output)
|
||||||
{
|
{
|
||||||
@@ -243,18 +258,48 @@ void CopyFile(string input, string output)
|
|||||||
// Close The Files
|
// Close The Files
|
||||||
fclose(fpSourceFile);
|
fclose(fpSourceFile);
|
||||||
fclose(fpTargetFile);
|
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)
|
string getFileType(string filename)
|
||||||
{
|
{
|
||||||
int lastpos = filename.find(".", 0);
|
size_t lastpos = filename.find(".", 0);
|
||||||
int neu_pos;
|
size_t neu_pos;
|
||||||
while ((neu_pos = filename.find(".", lastpos + 1)) > -1)
|
while ((neu_pos = filename.find(".", lastpos + 1)) > -1)
|
||||||
{
|
{
|
||||||
lastpos = neu_pos;
|
lastpos = neu_pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lastpos == string::npos)
|
||||||
|
return "";
|
||||||
|
|
||||||
string zw = filename.substr(lastpos + 1, filename.size() - lastpos);
|
string zw = filename.substr(lastpos + 1, filename.size() - lastpos);
|
||||||
zw = toUpper(zw);
|
zw = toUpper(zw);
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ std::string FormatFileName(std::string input);
|
|||||||
void FindReplace(std::string& line, std::string& oldString, std::string& newString);
|
void FindReplace(std::string& line, std::string& oldString, std::string& newString);
|
||||||
|
|
||||||
void CopyFile(string input, string output);
|
void CopyFile(string input, string output);
|
||||||
|
void DeleteFile(string fn);
|
||||||
|
|
||||||
FILE* OpenFileAndWait(const char* nm, const char* _mode, int _waitsec = 1);
|
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);
|
bool ctype_space(const char c, string adddelimiter);
|
||||||
|
|
||||||
string getFileType(string filename);
|
string getFileType(string filename);
|
||||||
|
string getFileFullFileName(string filename);
|
||||||
|
string getDirectory(string filename);
|
||||||
|
|
||||||
int mkdir_r(const char *dir, const mode_t mode);
|
int mkdir_r(const char *dir, const mode_t mode);
|
||||||
int removeFolder(const char* folderPath, const char* logTag);
|
int removeFolder(const char* folderPath, const char* logTag);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
const char* GIT_REV="47da2d6";
|
const char* GIT_REV="N/A";
|
||||||
const char* GIT_TAG="";
|
const char* GIT_TAG="N/A";
|
||||||
const char* GIT_BRANCH="rolling";
|
const char* GIT_BRANCH="N/A";
|
||||||
const char* BUILD_TIME="2022-09-04 18:01";
|
const char* BUILD_TIME="2022-09-10 23:06";
|
||||||
@@ -12,12 +12,12 @@
|
|||||||
[platformio]
|
[platformio]
|
||||||
src_dir = main
|
src_dir = main
|
||||||
|
|
||||||
|
|
||||||
[env:esp32cam]
|
[env:esp32cam]
|
||||||
platform = espressif32@4.4.0
|
platform = espressif32@4.4.0
|
||||||
;platform = espressif32@5.1.0
|
;platform = espressif32@5.1.0
|
||||||
;platform = espressif32
|
;platform = espressif32
|
||||||
board = esp32cam
|
board = esp32cam
|
||||||
|
;board = m5stack-core-esp32
|
||||||
framework = espidf
|
framework = espidf
|
||||||
|
|
||||||
;board_build.partitions = partitions_singleapp.csv
|
;board_build.partitions = partitions_singleapp.csv
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
const char* GIT_REV="47da2d6";
|
const char* GIT_REV="N/A";
|
||||||
const char* GIT_TAG="";
|
const char* GIT_TAG="N/A";
|
||||||
const char* GIT_BRANCH="rolling";
|
const char* GIT_BRANCH="N/A";
|
||||||
const char* BUILD_TIME="2022-09-04 18:01";
|
const char* BUILD_TIME="2022-09-10 23:06";
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -9,7 +9,7 @@ function LoadHostname() {
|
|||||||
xhttp.addEventListener('load', function(event) {
|
xhttp.addEventListener('load', function(event) {
|
||||||
if (xhttp.status >= 200 && xhttp.status < 300) {
|
if (xhttp.status >= 200 && xhttp.status < 300) {
|
||||||
hostname = xhttp.responseText;
|
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;
|
document.getElementById("id_title").innerHTML = "Digitizer - AI on the edge - " + hostname;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html style="width: fit-content">
|
<html style="width: fit-content">
|
||||||
<head>
|
<head>
|
||||||
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
<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 charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html style="width: fit-content">
|
<html style="width: fit-content">
|
||||||
<head>
|
<head>
|
||||||
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
<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 charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html style="width: fit-content">
|
<html style="width: fit-content">
|
||||||
<head>
|
<head>
|
||||||
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
<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 charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html style="width: fit-content">
|
<html style="width: fit-content">
|
||||||
<head>
|
<head>
|
||||||
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
<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 charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html style="width: fit-content">
|
<html style="width: fit-content">
|
||||||
<head>
|
<head>
|
||||||
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
<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 charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html style="width: fit-content">
|
<html style="width: fit-content">
|
||||||
<head>
|
<head>
|
||||||
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
<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 charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html style="width: fit-content">
|
<html style="width: fit-content">
|
||||||
<head>
|
<head>
|
||||||
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
<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 charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html style="width: fit-content">
|
<html style="width: fit-content">
|
||||||
<head>
|
<head>
|
||||||
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
<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 charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html style="width: fit-content">
|
<html style="width: fit-content">
|
||||||
<head>
|
<head>
|
||||||
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
<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 charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
<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 charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<!-- <link rel="stylesheet" href="style.css" type="text/css" > -->
|
<!-- <link rel="stylesheet" href="style.css" type="text/css" > -->
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
<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 charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<!-- <link rel="stylesheet" href="style.css" type="text/css" > -->
|
<!-- <link rel="stylesheet" href="style.css" type="text/css" > -->
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
||||||
<title>Set PreValue</title>
|
<title>Info</title>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
@@ -136,6 +136,8 @@ div {
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
<h3>Copyright</h3>
|
||||||
|
Copyright © 2020 - 2022 by <a href="https://github.com/jomjol/AI-on-the-edge-device" target=_blank>Jomjol</a> and others.
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ input[type=number] {
|
|||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body style="font-family: arial; padding: 0px 10px;">
|
<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>
|
<hr>
|
||||||
<h2>1. Firmware Update</h2>
|
<h2>1. Firmware Update</h2>
|
||||||
<table class="fixed" border="0">
|
<table class="fixed" border="0">
|
||||||
@@ -38,7 +39,7 @@ input[type=number] {
|
|||||||
<table border="0">
|
<table border="0">
|
||||||
<tr>
|
<tr>
|
||||||
<td style="width: 230px">
|
<td style="width: 230px">
|
||||||
<label for="newfile">Select the firmware file:</label>
|
<label for="newfile">Select the firmware file (firmware.bin):</label>
|
||||||
</td>
|
</td>
|
||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
<input id="newfile" type="file" onchange="setpath()" style="width:100%;">
|
<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>
|
<label for="filepath">Set path on server:</label>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input id="filepath" type="text" style="width:100%;" readonly>
|
<input id="filepath" type="text" style="width:100%; border: 0" readonly>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<button id="upload" type="button" onclick="upload()">Upload</button>
|
<button id="upload" type="button" onclick="upload()">Upload</button>
|
||||||
@@ -62,21 +63,20 @@ input[type=number] {
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<hr>
|
<h2>2. Web Interface Update</h2>
|
||||||
<h2>2. Update "/html" directory</h2>
|
|
||||||
<table class="fixed" border="0">
|
<table class="fixed" border="0">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<table border="0">
|
<table border="0">
|
||||||
<tr>
|
<tr>
|
||||||
<td style="width: 230px">
|
<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>
|
||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
<input id="newfilehtml" type="file" onchange="setpathhtml()" style="width:100%;">
|
<input id="newfilehtml" type="file" onchange="setpathhtml()" style="width:100%;">
|
||||||
</td>
|
</td>
|
||||||
<td rowspan="2" style="padding-left:50px">
|
<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>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -84,7 +84,7 @@ input[type=number] {
|
|||||||
<label for="filepathhtml">Set path on server:</label>
|
<label for="filepathhtml">Set path on server:</label>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input id="filepathhtml" type="text" style="width:100%;" readonly>
|
<input id="filepathhtml" type="text" style="width:100%; border: 0" readonly>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<button id="uploadhtml" type="button" onclick="uploadhtml()">Upload</button>
|
<button id="uploadhtml" type="button" onclick="uploadhtml()">Upload</button>
|
||||||
@@ -94,11 +94,11 @@ input[type=number] {
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<hr>
|
|
||||||
<h2>3. Reboot</h2>
|
<h2>3. Reboot</h2>
|
||||||
<button class="button" id="reboot" type="button" onclick="doReboot()">Reboot to activate updates</button>
|
<button class="button" id="reboot" type="button" onclick="doReboot()">Reboot to activate updates</button>
|
||||||
<hr>
|
<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">
|
<table class="fixed" border="0">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
@@ -116,7 +116,7 @@ input[type=number] {
|
|||||||
<label for="filepathtfl">Set path on server</label>
|
<label for="filepathtfl">Set path on server</label>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input id="filepathtfl" type="text" style="width:100%;" readonly>
|
<input id="filepathtfl" type="text" style="width:100%; border: 0" readonly>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<button id="uploadtfl" type="button" onclick="uploadtfl()" disabled>Upload</button>
|
<button id="uploadtfl" type="button" onclick="uploadtfl()" disabled>Upload</button>
|
||||||
@@ -125,8 +125,6 @@ input[type=number] {
|
|||||||
</table>
|
</table>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</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>
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<link rel="icon" href="data:,">
|
<link rel="icon" href="data:,">
|
||||||
<title>jomjol - AI on the edge</title>
|
<title>AI on the edge</title>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html style="width: fit-content">
|
<html style="width: fit-content">
|
||||||
<head>
|
<head>
|
||||||
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
<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 charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
16.3.4
|
16.4.0
|
||||||
|
|||||||
Reference in New Issue
Block a user