diff --git a/code/components/jomjol_controlcamera/ClassControllCamera.cpp b/code/components/jomjol_controlcamera/ClassControllCamera.cpp index 133c54bd0..716379512 100644 --- a/code/components/jomjol_controlcamera/ClassControllCamera.cpp +++ b/code/components/jomjol_controlcamera/ClassControllCamera.cpp @@ -242,10 +242,6 @@ esp_err_t CCamera::CaptureToBasisImage(CImageBasis *_Image, int delay) _Image->EmptyImage(); //Delete previous stored raw image -> black image - #ifdef ALGROI_LOAD_FROM_MEM_AS_JPG__SHOW_TAKE_IMAGE_PROCESS - tfliteflow.SetNewAlgROI(false); - #endif - LEDOnOff(true); if (delay > 0) @@ -321,10 +317,6 @@ esp_err_t CCamera::CaptureToBasisImage(CImageBasis *_Image, int delay) p_target[2] = p_source[2]; } - #ifdef DEBUG_DETAIL_ON - LogFile.WriteHeapInfo("CCamera::CaptureToBasisImage - After Copy To Target"); - #endif - delete _zwImage; #ifdef DEBUG_DETAIL_ON diff --git a/code/components/jomjol_flowcontroll/ClassFlowAlignment.cpp b/code/components/jomjol_flowcontroll/ClassFlowAlignment.cpp index 1b1646fec..4d4038b8d 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowAlignment.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowAlignment.cpp @@ -173,14 +173,12 @@ bool ClassFlowAlignment::doFlow(string time) { LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Can't allocate AlgROI"); LogFile.WriteHeapInfo("ClassFlowAlignment-doFlow"); - tfliteflow.SetNewAlgROI(false); // continue flow only with alg.jpg (no ROIs available) } } if (AlgROI) { ImageBasis->writeToMemoryAsJPG((ImageData*)AlgROI, 90); - tfliteflow.SetNewAlgROI(true); } #endif diff --git a/code/components/jomjol_flowcontroll/ClassFlowControll.cpp b/code/components/jomjol_flowcontroll/ClassFlowControll.cpp index 06e8ea1ec..3da1e39f1 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowControll.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowControll.cpp @@ -154,12 +154,6 @@ void ClassFlowControll::AnalogDrawROI(CImageBasis *_zw) if (flowanalog) flowanalog->DrawROI(_zw); } - - -void ClassFlowControll::SetNewAlgROI(bool _value) -{ - bNewAlgROI = _value; -} #endif @@ -195,7 +189,7 @@ void ClassFlowControll::SetInitialParameter(void) flowpostprocessing = NULL; disabled = false; aktRunNr = 0; - aktstatus = "Booting ..."; + aktstatus = "Flow task not yet created"; } @@ -270,8 +264,12 @@ ClassFlow* ClassFlowControll::CreateClassFlow(std::string _type) void ClassFlowControll::InitFlow(std::string config) { + aktstatus = "Initialization"; + //#ifdef ENABLE_MQTT + //MQTTPublish(mqttServer_getMainTopic() + "/" + "status", "Initialization", false); // Right now, not possible -> MQTT Service is going to be started later + //#endif //ENABLE_MQTT + string line; - flowpostprocessing = NULL; ClassFlow* cfc; @@ -318,6 +316,12 @@ std::string* ClassFlowControll::getActStatus() } +void ClassFlowControll::setActStatus(std::string _aktstatus) +{ + aktstatus = _aktstatus; +} + + void ClassFlowControll::doFlowMakeImageOnly(string time) { std::string zw_time; @@ -672,12 +676,6 @@ esp_err_t ClassFlowControll::GetJPGStream(std::string _fn, httpd_req_t *req) esp_err_t result = ESP_FAIL; bool _sendDelete = false; - if (flowalignment == NULL) - { - ESP_LOGD(TAG, "ClassFloDControll::GetJPGStream: FloDalignment is not (yet) initialized. Interrupt serving!"); - return ESP_OK; - } - if (_fn == "alg.jpg") { if (flowalignment && flowalignment->ImageBasis->ImageOkay()) { _send = flowalignment->ImageBasis; @@ -689,26 +687,119 @@ esp_err_t ClassFlowControll::GetJPGStream(std::string _fn, httpd_req_t *req) } else if (_fn == "alg_roi.jpg") { #ifdef ALGROI_LOAD_FROM_MEM_AS_JPG // no CImageBasis needed to create alg_roi.jpg (ca. 790kB less RAM) - if (bNewAlgROI) { + if (aktstatus.find("Initialization (delayed)") != -1) { + FILE* file = fopen("/sdcard/html/Flowstate_initialization_delayed.jpg", "rb"); + + if (!file) { + LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "File /sdcard/html/Flowstate_initialization_delayed.jpg not found"); + return ESP_FAIL; + } + + fseek(file, 0, SEEK_END); + long fileSize = ftell(file); /* how long is the file ? */ + fseek(file, 0, SEEK_SET); /* reset */ + + unsigned char* fileBuffer = (unsigned char*) malloc(fileSize); + + if (!fileBuffer) { + LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "ClassFlowControll::GetJPGStream: Not enough memory to create fileBuffer: " + std::to_string(fileSize)); + fclose(file); + return ESP_FAIL; + } + + fread(fileBuffer, fileSize, 1, file); + fclose(file); + + httpd_resp_set_type(req, "image/jpeg"); + result = httpd_resp_send(req, (const char *)fileBuffer, fileSize); + delete fileBuffer; + } + else if (aktstatus.find("Initialization") != -1) { + FILE* file = fopen("/sdcard/html/Flowstate_initialization.jpg", "rb"); + + if (!file) { + LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "File /sdcard/html/Flowstate_initialization.jpg not found"); + return ESP_FAIL; + } + + fseek(file, 0, SEEK_END); + long fileSize = ftell(file); /* how long is the file ? */ + fseek(file, 0, SEEK_SET); /* reset */ + + unsigned char* fileBuffer = (unsigned char*) malloc(fileSize); + + if (!fileBuffer) { + LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "ClassFlowControll::GetJPGStream: Not enough memory to create fileBuffer: " + std::to_string(fileSize)); + fclose(file); + return ESP_FAIL; + } + + fread(fileBuffer, fileSize, 1, file); + fclose(file); + + httpd_resp_set_type(req, "image/jpeg"); + result = httpd_resp_send(req, (const char *)fileBuffer, fileSize); + delete fileBuffer; + } + else if (aktstatus.find("Take Image") != -1) { if (flowalignment && flowalignment->AlgROI) { + FILE* file = fopen("/sdcard/html/Flowstate_take_image.jpg", "rb"); + + if (!file) { + LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "File /sdcard/html/Flowstate_take_image.jpg not found"); + return ESP_FAIL; + } + + fseek(file, 0, SEEK_END); + flowalignment->AlgROI->size = ftell(file); /* how long is the file ? */ + fseek(file, 0, SEEK_SET); /* reset */ + + if (flowalignment->AlgROI->size > MAX_JPG_SIZE) { + LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "File /sdcard/html/Flowstate_take_image.jpg too large: " + std::to_string(flowalignment->AlgROI->size)); + fclose(file); + return ESP_FAIL; + } + + fread(flowalignment->AlgROI->data, flowalignment->AlgROI->size, 1, file); + fclose(file); + httpd_resp_set_type(req, "image/jpeg"); result = httpd_resp_send(req, (const char *)flowalignment->AlgROI->data, flowalignment->AlgROI->size); } else { - LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "ClassFlowControll::GetJPGStream: alg_roi.jpg cannot be served"); - return ESP_FAIL; + LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "ClassFlowControll::GetJPGStream: alg_roi.jpg cannot be served -> alg.jpg is going to be served!"); + if (flowalignment && flowalignment->ImageBasis->ImageOkay()) { + _send = flowalignment->ImageBasis; + } + else { + httpd_resp_send(req, NULL, 0); + return ESP_OK; + } } } else { - if (flowalignment && flowalignment->ImageBasis->ImageOkay()) { - _send = flowalignment->ImageBasis; + if (flowalignment && flowalignment->AlgROI) { + httpd_resp_set_type(req, "image/jpeg"); + result = httpd_resp_send(req, (const char *)flowalignment->AlgROI->data, flowalignment->AlgROI->size); } else { - httpd_resp_send(req, NULL, 0); - return ESP_OK; + LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "ClassFlowControll::GetJPGStream: alg_roi.jpg cannot be served -> alg.jpg is going to be served!"); + if (flowalignment && flowalignment->ImageBasis->ImageOkay()) { + _send = flowalignment->ImageBasis; + } + else { + httpd_resp_send(req, NULL, 0); + return ESP_OK; + } } } #else + if (!flowalignment) { + ESP_LOGD(TAG, "ClassFloDControll::GetJPGStream: FlowAlignment is not (yet) initialized. Interrupt serving!"); + httpd_resp_send(req, NULL, 0); + return ESP_FAIL; + } + _send = new CImageBasis(flowalignment->ImageBasis); if (_send->ImageOkay()) { diff --git a/code/components/jomjol_flowcontroll/ClassFlowControll.h b/code/components/jomjol_flowcontroll/ClassFlowControll.h index 5bdeafb05..fdcad3110 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowControll.h +++ b/code/components/jomjol_flowcontroll/ClassFlowControll.h @@ -38,9 +38,6 @@ class ClassFlowControll : void SetInitialParameter(void); std::string aktstatus; int aktRunNr; - #ifdef ALGROI_LOAD_FROM_MEM_AS_JPG - bool bNewAlgROI = false; - #endif public: void InitFlow(std::string config); @@ -54,9 +51,6 @@ class ClassFlowControll : bool ReadParameter(FILE* pfile, string& aktparamgraph); string getJSON(); string getNumbersName(); - #ifdef ALGROI_LOAD_FROM_MEM_AS_JPG - void SetNewAlgROI(bool _value); - #endif string TranslateAktstatus(std::string _input); @@ -77,6 +71,7 @@ class ClassFlowControll : bool isAutoStart(long &_intervall); std::string* getActStatus(); + void setActStatus(std::string _aktstatus); std::vector GetAllDigital(); std::vector GetAllAnalog(); diff --git a/code/components/jomjol_tfliteclass/server_tflite.cpp b/code/components/jomjol_tfliteclass/server_tflite.cpp index 2938cc363..c6a181cda 100644 --- a/code/components/jomjol_tfliteclass/server_tflite.cpp +++ b/code/components/jomjol_tfliteclass/server_tflite.cpp @@ -27,7 +27,7 @@ ClassFlowControll tfliteflow; TaskHandle_t xHandletask_autodoFlow = NULL; -bool FlowInitDone = false; +bool bTaskAutoFlowCreated = false; bool flowisrunning = false; long auto_intervall = 0; @@ -104,7 +104,6 @@ void doInit(void) ESP_LOGD(TAG, "Start tfliteflow.InitFlow(config);"); #endif tfliteflow.InitFlow(CONFIG_FILE); - FlowInitDone = true; #ifdef DEBUG_DETAIL_ON ESP_LOGD(TAG, "Finished tfliteflow.InitFlow(config);"); #endif @@ -265,7 +264,7 @@ esp_err_t handler_json(httpd_req_t *req) ESP_LOGD(TAG, "handler_JSON uri: %s", req->uri); - if (FlowInitDone) + if (bTaskAutoFlowCreated) { httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); httpd_resp_set_type(req, "application/json"); @@ -300,7 +299,7 @@ esp_err_t handler_wasserzaehler(httpd_req_t *req) LogFile.WriteHeapInfo("handler water counter - Start"); #endif - if (FlowInitDone) + if (bTaskAutoFlowCreated) { bool _rawValue = false; bool _noerror = false; @@ -656,10 +655,11 @@ esp_err_t handler_statusflow(httpd_req_t *req) LogFile.WriteHeapInfo("handler_prevalue - Start"); #endif - if (FlowInitDone) - { - const char* resp_str; + const char* resp_str; + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + if (bTaskAutoFlowCreated) + { #ifdef DEBUG_DETAIL_ON ESP_LOGD(TAG, "handler_prevalue: %s", req->uri); #endif @@ -667,14 +667,13 @@ esp_err_t handler_statusflow(httpd_req_t *req) string* zw = tfliteflow.getActStatus(); resp_str = zw->c_str(); - httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); httpd_resp_send(req, resp_str, HTTPD_RESP_USE_STRLEN); } else { - httpd_resp_send_err(req, HTTPD_403_FORBIDDEN, "Flow not (yet) started: REST API /flowstatus not available!"); - return ESP_ERR_NOT_FOUND; - } + resp_str = "Flow task not yet created"; + httpd_resp_send(req, resp_str, HTTPD_RESP_USE_STRLEN); + } #ifdef DEBUG_DETAIL_ON LogFile.WriteHeapInfo("handler_prevalue - Done"); @@ -820,13 +819,18 @@ void task_autodoFlow(void *pvParameter) { int64_t fr_start, fr_delta_ms; + bTaskAutoFlowCreated = true; + if (!isPlannedReboot) { if (esp_reset_reason() == ESP_RST_PANIC) { LogFile.WriteToFile(ESP_LOG_WARN, TAG, "Restarted due to an Exception/panic! Postponing first round start by 5 minutes to allow for an OTA Update or to fetch the log!"); LogFile.WriteToFile(ESP_LOG_WARN, TAG, "Setting logfile level to DEBUG until the next reboot!"); LogFile.setLogLevel(ESP_LOG_DEBUG); - //MQTTPublish(GetMQTTMainTopic() + "/" + "status", "Postponing first round", false); + tfliteflow.setActStatus("Initialization (delayed)"); + //#ifdef ENABLE_MQTT + //MQTTPublish(mqttServer_getMainTopic() + "/" + "status", "Initialization (delayed)", false); // Right now, not possible -> MQTT Service is going to be started later + //#endif //ENABLE_MQTT vTaskDelay(60*5000 / portTICK_RATE_MS); // Wait 5 minutes to give time to do an OTA Update or fetch the log } } @@ -836,12 +840,14 @@ void task_autodoFlow(void *pvParameter) doInit(); auto_isrunning = tfliteflow.isAutoStart(auto_intervall); - if (isSetupModusActive()) { + + if (isSetupModusActive()) + { auto_isrunning = false; std::string zw_time = getCurrentTimeString(LOGFILE_TIME_FORMAT); tfliteflow.doFlowMakeImageOnly(zw_time); - } + while (auto_isrunning) { LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "----------------------------------------------------------------"); // Clear separation between runs diff --git a/images/Flowstate_initialization.xcf b/images/Flowstate_initialization.xcf new file mode 100644 index 000000000..6a54f159a Binary files /dev/null and b/images/Flowstate_initialization.xcf differ diff --git a/images/Flowstate_initialization_delayed.xcf b/images/Flowstate_initialization_delayed.xcf new file mode 100644 index 000000000..80e61e5d7 Binary files /dev/null and b/images/Flowstate_initialization_delayed.xcf differ diff --git a/images/Flowstate_take_image.xcf b/images/Flowstate_take_image.xcf new file mode 100644 index 000000000..961597d59 Binary files /dev/null and b/images/Flowstate_take_image.xcf differ diff --git a/sd-card/html/Flowstate_initialization.jpg b/sd-card/html/Flowstate_initialization.jpg new file mode 100644 index 000000000..b490fc47f Binary files /dev/null and b/sd-card/html/Flowstate_initialization.jpg differ diff --git a/sd-card/html/Flowstate_initialization_delayed.jpg b/sd-card/html/Flowstate_initialization_delayed.jpg new file mode 100644 index 000000000..4be8f74f2 Binary files /dev/null and b/sd-card/html/Flowstate_initialization_delayed.jpg differ diff --git a/sd-card/html/Flowstate_take_image.jpg b/sd-card/html/Flowstate_take_image.jpg new file mode 100644 index 000000000..dbc4feeed Binary files /dev/null and b/sd-card/html/Flowstate_take_image.jpg differ diff --git a/sd-card/html/overview.html b/sd-card/html/overview.html index 7f10c72bc..1b190e68c 100644 --- a/sd-card/html/overview.html +++ b/sd-card/html/overview.html @@ -55,8 +55,8 @@ -
+
@@ -126,7 +126,7 @@ xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var _rsp = xhttp.responseText; - $('#statusflow').html("Status: " + _rsp); + $('#statusflow').html("State: " + _rsp); } } xhttp.open("GET", url, true);