diff --git a/README.md b/README.md index 1059c6b9..95d0bf83 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,12 @@ A 3d-printable housing can be found here: https://www.thingiverse.com/thing:4571 ## Change log - latest version -##### Rolling (2020-08-17) +##### Rolling (2020-08-23) +* Preparation for web configuration + +* Security Issue: Remove access to "wlan.ini" + * Only editor for config.ini * Implementation of Digital Consistency Check: check if Digit shows next number earlier, than previous number has gone through zero - Turn on/off - see updated config.ini `CheckDigitIncreaseConsistency = True`) diff --git a/code/lib/connect_wlan/Helper.h b/code/lib/connect_wlan/Helper._h_ similarity index 100% rename from code/lib/connect_wlan/Helper.h rename to code/lib/connect_wlan/Helper._h_ diff --git a/code/lib/connect_wlan/Helper.cpp b/code/lib/connect_wlan/Helper.cp_p similarity index 100% rename from code/lib/connect_wlan/Helper.cpp rename to code/lib/connect_wlan/Helper.cp_p diff --git a/code/lib/jomjol_fileserver_ota/server_file.cpp b/code/lib/jomjol_fileserver_ota/server_file.cpp index 642386ae..507c5572 100644 --- a/code/lib/jomjol_fileserver_ota/server_file.cpp +++ b/code/lib/jomjol_fileserver_ota/server_file.cpp @@ -30,6 +30,8 @@ #include "server_help.h" +#include "Helper.h" + /* Max length a file path can have on storage */ // #define FILE_PATH_MAX (ESP_VFS_PATH_MAX + CONFIG_SPIFFS_OBJ_NAME_LEN) #define FILE_PATH_MAX (255) @@ -154,36 +156,39 @@ static esp_err_t http_resp_dir_html(httpd_req_t *req, const char *dirpath) /* Iterate over all files / folders and fetch their names and sizes */ while ((entry = readdir(dir)) != NULL) { - entrytype = (entry->d_type == DT_DIR ? "directory" : "file"); + if (strcmp("wlan.ini", entry->d_name) != 0 ) // wlan.ini soll nicht angezeigt werden! + { + entrytype = (entry->d_type == DT_DIR ? "directory" : "file"); - strlcpy(entrypath + dirpath_len, entry->d_name, sizeof(entrypath) - dirpath_len); - printf("Entrypath: %s\n", entrypath); - if (stat(entrypath, &entry_stat) == -1) { - ESP_LOGE(TAG, "Failed to stat %s : %s", entrytype, entry->d_name); - continue; - } - sprintf(entrysize, "%ld", entry_stat.st_size); - ESP_LOGI(TAG, "Found %s : %s (%s bytes)", entrytype, entry->d_name, entrysize); + strlcpy(entrypath + dirpath_len, entry->d_name, sizeof(entrypath) - dirpath_len); + printf("Entrypath: %s\n", entrypath); + if (stat(entrypath, &entry_stat) == -1) { + ESP_LOGE(TAG, "Failed to stat %s : %s", entrytype, entry->d_name); + continue; + } + sprintf(entrysize, "%ld", entry_stat.st_size); + ESP_LOGI(TAG, "Found %s : %s (%s bytes)", entrytype, entry->d_name, entrysize); - /* Send chunk of HTML file containing table entries with file name and size */ - httpd_resp_sendstr_chunk(req, "uri); - httpd_resp_sendstr_chunk(req, entry->d_name); - if (entry->d_type == DT_DIR) { - httpd_resp_sendstr_chunk(req, "/"); + /* Send chunk of HTML file containing table entries with file name and size */ + httpd_resp_sendstr_chunk(req, "uri); + httpd_resp_sendstr_chunk(req, entry->d_name); + if (entry->d_type == DT_DIR) { + httpd_resp_sendstr_chunk(req, "/"); + } + httpd_resp_sendstr_chunk(req, "\">"); + httpd_resp_sendstr_chunk(req, entry->d_name); + httpd_resp_sendstr_chunk(req, ""); + httpd_resp_sendstr_chunk(req, entrytype); + httpd_resp_sendstr_chunk(req, ""); + httpd_resp_sendstr_chunk(req, entrysize); + httpd_resp_sendstr_chunk(req, ""); + httpd_resp_sendstr_chunk(req, "
uri + strlen("/fileserver")); + httpd_resp_sendstr_chunk(req, entry->d_name); + httpd_resp_sendstr_chunk(req, "\">
"); + httpd_resp_sendstr_chunk(req, "\n"); } - httpd_resp_sendstr_chunk(req, "\">"); - httpd_resp_sendstr_chunk(req, entry->d_name); - httpd_resp_sendstr_chunk(req, ""); - httpd_resp_sendstr_chunk(req, entrytype); - httpd_resp_sendstr_chunk(req, ""); - httpd_resp_sendstr_chunk(req, entrysize); - httpd_resp_sendstr_chunk(req, ""); - httpd_resp_sendstr_chunk(req, "
uri + strlen("/fileserver")); - httpd_resp_sendstr_chunk(req, entry->d_name); - httpd_resp_sendstr_chunk(req, "\">
"); - httpd_resp_sendstr_chunk(req, "\n"); } closedir(dir); @@ -214,7 +219,7 @@ static esp_err_t download_get_handler(httpd_req_t *req) const char *filename = get_path_from_uri(filepath, ((struct file_server_data *)req->user_ctx)->base_path, req->uri + sizeof("/fileserver") - 1, sizeof(filepath)); - printf("1 uri: %s, filename: %s, filepath: %s\n", req->uri, filename, filepath); + printf("uri: %s, filename: %s, filepath: %s\n", req->uri, filename, filepath); // filename = get_path_from_uri(filepath, ((struct file_server_data *)req->user_ctx)->base_path, // req->uri, sizeof(filepath)); @@ -231,7 +236,10 @@ static esp_err_t download_get_handler(httpd_req_t *req) return http_resp_dir_html(req, filepath); } - if (stat(filepath, &file_stat) == -1) { + std::string testwlan = toUpper(std::string(filename)); + + if ((stat(filepath, &file_stat) == -1) || (testwlan.compare("/WLAN.INI") == 0 )) { // wlan.ini soll nicht angezeigt werden! + /* If file not present on SPIFFS check if URI * corresponds to one of the hardcoded paths */ ESP_LOGE(TAG, "Failed to stat file : %s", filepath); @@ -248,6 +256,8 @@ static esp_err_t download_get_handler(httpd_req_t *req) return ESP_FAIL; } + esp_err_t res = httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + ESP_LOGI(TAG, "Sending file : %s (%ld bytes)...", filename, file_stat.st_size); set_content_type_from_file(req, filename); diff --git a/code/lib/jomjol_image_proc/Helper.cpp b/code/lib/jomjol_helper/Helper.cpp similarity index 91% rename from code/lib/jomjol_image_proc/Helper.cpp rename to code/lib/jomjol_helper/Helper.cpp index e399ced1..789fd077 100644 --- a/code/lib/jomjol_image_proc/Helper.cpp +++ b/code/lib/jomjol_helper/Helper.cpp @@ -113,8 +113,20 @@ void CopyFile(string input, string output) input = FormatFileName(input); output = FormatFileName(output); + if (toUpper(input).compare("/SDCARD/WLAN.INI") == 0) + { + printf("wlan.ini kann nicht kopiert werden!\n"); + return; + } + char cTemp; FILE* fpSourceFile = fopen(input.c_str(), "rb"); + if (!fpSourceFile) // Sourcefile existiert nicht sonst gibt es einen Fehler beim Kopierversuch! + { + printf("File %s existiert nicht!\n", input.c_str()); + return; + } + FILE* fpTargetFile = fopen(output.c_str(), "wb"); // Code Section diff --git a/code/lib/jomjol_image_proc/Helper.h b/code/lib/jomjol_helper/Helper.h similarity index 100% rename from code/lib/jomjol_image_proc/Helper.h rename to code/lib/jomjol_helper/Helper.h diff --git a/code/lib/jomjol_image_proc/CFindTemplate.cpp b/code/lib/jomjol_image_proc/CFindTemplate.cpp index 1f5368e4..db947129 100644 --- a/code/lib/jomjol_image_proc/CFindTemplate.cpp +++ b/code/lib/jomjol_image_proc/CFindTemplate.cpp @@ -384,6 +384,22 @@ CImageBasis::CImageBasis(uint8_t* _rgb_image, int _channels, int _width, int _he this->externalImage = true; } +void CImageBasis::Contrast(float _contrast) //input range [-100..100] +{ + stbi_uc* p_source; + + float contrast = (_contrast/100) + 1; //convert to decimal & shift range: [0..2] + float intercept = 128 * (1 - contrast); + + for (int x = 0; x < width; ++x) + for (int y = 0; y < height; ++y) + { + p_source = this->rgb_image + (this->channels * (y * this->width + x)); + for (int channels = 0; channels < this->channels; ++channels) + p_source[channels] = (uint8_t) std::min(255, std::max(0, (int) (p_source[channels] * contrast + intercept))); + } +} + CImageBasis::~CImageBasis() { if (!this->externalImage) diff --git a/code/lib/jomjol_image_proc/CFindTemplate.h b/code/lib/jomjol_image_proc/CFindTemplate.h index 41af0a2b..58e5e840 100644 --- a/code/lib/jomjol_image_proc/CFindTemplate.h +++ b/code/lib/jomjol_image_proc/CFindTemplate.h @@ -35,6 +35,7 @@ class CImageBasis void drawLine(int x1, int y1, int x2, int y2, int r, int g, int b, int thickness = 1); void drawCircle(int x1, int y1, int rad, int r, int g, int b, int thickness = 1); void setPixelColor(int x, int y, int r, int g, int b); + void Contrast(float _contrast); CImageBasis(); diff --git a/code/platformio.ini b/code/platformio.ini index c9ef8a18..b6f4c9fd 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -24,7 +24,7 @@ board_build.embed_files = ;board_build.partitions = partitions_singleapp.csv board_build.partitions = partition.csv -lib_deps = connect_wlan, conversions, driver, sensors, jomjol_image_proc, jomjol_controlcamera, jomjol_flowcontroll, jomjol_tfliteclass, tfmicro, jomjol_fileserver_ota, jomjol_time_sntp, jomjol_logfile +lib_deps = jomjol_helper, connect_wlan, conversions, driver, sensors, jomjol_image_proc, jomjol_controlcamera, jomjol_flowcontroll, jomjol_tfliteclass, tfmicro, jomjol_fileserver_ota, jomjol_time_sntp, jomjol_logfile monitor_speed = 115200 debug_tool = esp-prog diff --git a/code/src/server_main.cpp b/code/src/server_main.cpp index 52ea4bff..da2ffc6c 100644 --- a/code/src/server_main.cpp +++ b/code/src/server_main.cpp @@ -138,8 +138,12 @@ esp_err_t hello_main_handler(httpd_req_t *req) httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, "File does not exist"); return ESP_FAIL; } + esp_err_t res; + res = httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + if (res != ESP_OK) + return res; - esp_err_t res = send_file(req, filetosend, &file_stat); + res = send_file(req, filetosend, &file_stat); if (res != ESP_OK) return res; diff --git a/code/src/server_tflite.cpp b/code/src/server_tflite.cpp index b495ee80..fae8275c 100644 --- a/code/src/server_tflite.cpp +++ b/code/src/server_tflite.cpp @@ -8,6 +8,8 @@ #include #include +#include "Helper.h" + #include "esp_camera.h" #include "time_sntp.h" #include "ClassControllCamera.h" @@ -125,6 +127,7 @@ esp_err_t handler_doflow(httpd_req_t *req) + esp_err_t handler_wasserzaehler(httpd_req_t *req) { LogFile.WriteToFile("handler_wasserzaehler"); @@ -215,6 +218,121 @@ esp_err_t handler_wasserzaehler(httpd_req_t *req) + /* Respond with an empty chunk to signal HTTP response completion */ + httpd_resp_sendstr_chunk(req, NULL); + + return ESP_OK; +}; + + +esp_err_t handler_editflow(httpd_req_t *req) +{ + LogFile.WriteToFile("handler_editflow"); + const char* resp_str; + string zw; + bool _rawValue = false; + + printf("handler_editflow uri:\n"); printf(req->uri); printf("\n"); + + char _query[200]; + char _valuechar[30]; + string _task; + + if (httpd_req_get_url_query_str(req, _query, 200) == ESP_OK) + { + if (httpd_query_key_value(_query, "task", _valuechar, 30) == ESP_OK) + { + printf("task is found"); printf(_valuechar); printf("\n"); + _task = string(_valuechar); + } + } + + if (_task.compare("copy") == 0) + { + string in, out, zw; + + httpd_query_key_value(_query, "in", _valuechar, 30); + in = string(_valuechar); + printf("in: "); printf(in.c_str()); printf("\n"); + + httpd_query_key_value(_query, "out", _valuechar, 30); + out = string(_valuechar); + printf("out: "); printf(out.c_str()); printf("\n"); + + in = "/sdcard" + in; + out = "/sdcard" + out; + + CopyFile(in, out); + zw = "Copy Done"; + httpd_resp_sendstr_chunk(req, zw.c_str()); + } + + + if (_task.compare("cutref") == 0) + { + string in, out, zw; + int x, y, dx, dy; + bool enhance = false; + + httpd_query_key_value(_query, "in", _valuechar, 30); + in = string(_valuechar); + printf("in: "); printf(in.c_str()); printf("\n"); + + httpd_query_key_value(_query, "out", _valuechar, 30); + out = string(_valuechar); + printf("out: "); printf(out.c_str()); printf("\n"); + + httpd_query_key_value(_query, "x", _valuechar, 30); + zw = string(_valuechar); + x = stoi(zw); + printf("x: "); printf(zw.c_str()); printf("\n"); + + httpd_query_key_value(_query, "y", _valuechar, 30); + zw = string(_valuechar); + y = stoi(zw); + printf("y: "); printf(zw.c_str()); printf("\n"); + + httpd_query_key_value(_query, "dx", _valuechar, 30); + zw = string(_valuechar); + dx = stoi(zw); + printf("dx: "); printf(zw.c_str()); printf("\n"); + + httpd_query_key_value(_query, "dy", _valuechar, 30); + zw = string(_valuechar); + dy = stoi(zw); + printf("dy: "); printf(zw.c_str()); printf("\n"); + + if (httpd_query_key_value(_query, "enhance", _valuechar, 10) == ESP_OK) + { + zw = string(_valuechar); + if (zw.compare("true") == 0) + { + enhance = true; + } + } + + in = "/sdcard" + in; + out = "/sdcard" + out; + + string out2 = out.substr(0, out.length() - 4) + "_org.jpg"; + + CAlignAndCutImage *caic = new CAlignAndCutImage(in); + caic->CutAndSave(out2, x, y, dx, dy); + delete caic; + + CImageBasis *cim = new CImageBasis(out2); + if (enhance) + { + cim->Contrast(90); + } + + cim->SaveToFile(out); + delete cim; + + zw = "CutImage Done"; + httpd_resp_sendstr_chunk(req, zw.c_str()); + } + /* Respond with an empty chunk to signal HTTP response completion */ httpd_resp_sendstr_chunk(req, NULL); @@ -319,7 +437,13 @@ void register_server_tflite_uri(httpd_handle_t server) camuri.uri = "/doflow"; camuri.handler = handler_doflow; camuri.user_ctx = (void*) "Light Off"; - httpd_register_uri_handler(server, &camuri); + httpd_register_uri_handler(server, &camuri); + + + camuri.uri = "/editflow.html"; + camuri.handler = handler_editflow; + camuri.user_ctx = (void*) "EditFlow"; + httpd_register_uri_handler(server, &camuri); camuri.uri = "/wasserzaehler.html"; camuri.handler = handler_wasserzaehler; diff --git a/firmware/bootloader.bin b/firmware/bootloader.bin index 83f718db..d5e41e1f 100644 Binary files a/firmware/bootloader.bin and b/firmware/bootloader.bin differ diff --git a/firmware/firmware.bin b/firmware/firmware.bin index 7363d5fc..e81b0bf6 100644 Binary files a/firmware/firmware.bin and b/firmware/firmware.bin differ