/* * process.c * * Created on: 4 במרץ 2018 * Author: shlomo */ //******************************************************************************************************************** #include #include "include.h" #include "process.h" #include "heaters/heaters_ex.h" #include "PMR/Printing/ProcessParameters.pb-c.h" #include "PMR/Printing/UploadProcessParametersRequest.pb-c.h" #include "PMR/Printing/UploadProcessParametersResponse.pb-c.h" #include "PMR/Hardware/HardwarePidControlType.pb-c.h" #include "PMR/common/MessageContainer.pb-c.h" #include "drivers/Valves/Valve.h" #include "drivers/I2C_Communication/ADC_MUX/ADC_MUX.h" #include "modules/ids/ids_ex.h" #include "third_party/fatfs/src/ffconf.h" #include "Common/SWUpdate/FileSystem.h" #include "StateMachines/Initialization/PowerIdle.h" #include "drivers/Flash_ram/FlashProgram.h" double dyeingspeed = 0; double dryerbufferlength = 0; double mininkuptake = 0; double feedertension = 0; double pullertension = 0; double windertension = 0; double headairflow = 0; double dryerairflow = 0; int32_t tableindex = 0; double dryerbufferMeters = 0; double dryerbufferCentimeters = 0; #define MAX_ALLOWED_TEMPERATURE 280 char ProcessParamsConfigPath[50] = "0://SysInfo//ProcessP.cfg"; ProcessParameters ProcessParametersKeep; void HeatersStopControlOnHeatersOff(ProcessParameters* ProcessParams) { uint32_t temp_sum = 0; temp_sum += ProcessParams->dryerzone1temp; temp_sum += ProcessParams->dryerzone2temp; temp_sum += ProcessParams->dryerzone3temp; temp_sum += ProcessParams->mixertemp; temp_sum += ProcessParams->headzone1temp; temp_sum += ProcessParams->headzone2temp; temp_sum += ProcessParams->headzone3temp; temp_sum += ProcessParams->headzone4temp; temp_sum += ProcessParams->headzone5temp; temp_sum += ProcessParams->headzone6temp; if (temp_sum == 0)// heating off { HeatersControlStop(); REPORT_MSG(temp_sum,"Heating control off - temperatures off"); } } uint32_t HandleProcessParameters(ProcessParameters* ProcessParams) { uint32_t status = 0; if (ProcessParams==NULL) { status = ERROR_CODE__INVALID_PARAMETER; return status; } if (ProcessParams->dryerzone1temp > MAX_ALLOWED_TEMPERATURE) status = ERROR_CODE__INVALID_PARAMETER; if (ProcessParams->dryerzone2temp > MAX_ALLOWED_TEMPERATURE) status = ERROR_CODE__INVALID_PARAMETER; if (ProcessParams->dryerzone3temp > MAX_ALLOWED_TEMPERATURE) status = ERROR_CODE__INVALID_PARAMETER; if (ProcessParams->mixertemp > MAX_ALLOWED_TEMPERATURE) status = ERROR_CODE__INVALID_PARAMETER; if (ProcessParams->headzone1temp > MAX_ALLOWED_TEMPERATURE) status = ERROR_CODE__INVALID_PARAMETER; if (ProcessParams->headzone2temp > MAX_ALLOWED_TEMPERATURE) status = ERROR_CODE__INVALID_PARAMETER; if (ProcessParams->headzone3temp > MAX_ALLOWED_TEMPERATURE) status = ERROR_CODE__INVALID_PARAMETER; if (ProcessParams->headzone4temp > MAX_ALLOWED_TEMPERATURE) status = ERROR_CODE__INVALID_PARAMETER; if (ProcessParams->headzone5temp > MAX_ALLOWED_TEMPERATURE) status = ERROR_CODE__INVALID_PARAMETER; if (ProcessParams->headzone6temp > MAX_ALLOWED_TEMPERATURE) status = ERROR_CODE__INVALID_PARAMETER; if (status != 0) return status; if (ProcessParams) { memcpy (&ProcessParametersKeep,ProcessParams,sizeof(ProcessParameters)); } if (ProcessParams->mixertemp) status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__MixerHeater, true, ProcessParams->mixertemp); else status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__MixerHeater, false, ProcessParams->mixertemp); if (ProcessParams->headzone1temp) status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ1, true, ProcessParams->headzone1temp); else status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ1, false, ProcessParams->headzone1temp); if (ProcessParams->headzone2temp) status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ2, true, ProcessParams->headzone2temp); else status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ2, false, ProcessParams->headzone2temp); if (ProcessParams->headzone3temp) status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ3, true, ProcessParams->headzone3temp); else status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ3, false, ProcessParams->headzone3temp); if (ProcessParams->headzone4temp) status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ4, true, ProcessParams->headzone4temp); else status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ4, false, ProcessParams->headzone4temp); if (ProcessParams->headzone5temp) status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ5, true, ProcessParams->headzone5temp); else status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ5, false, ProcessParams->headzone5temp); if (ProcessParams->headzone6temp) status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ6, true, ProcessParams->headzone6temp); else status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ6, false, ProcessParams->headzone6temp); if (ProcessParams->dryerzone1temp) status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature, true, ProcessParams->dryerzone1temp); else status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature, false, ProcessParams->dryerzone1temp); /* if (ProcessParams->dryerzone2temp) status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain, true, ProcessParams->dryerzone2temp); else status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain, false, ProcessParams->dryerzone2temp); if (ProcessParams->dryerzone3temp) status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary, true, ProcessParams->dryerzone3temp); else status |= HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary, false, ProcessParams->dryerzone3temp); */ HeatersStopControlOnHeatersOff(ProcessParams); dyeingspeed = ProcessParams->dyeingspeed; dryerbufferlength = ProcessParams->dryerbufferlength; dryerbufferMeters = dryerbufferlength*0.76+0.9; dryerbufferCentimeters = dryerbufferlength*76+90; Report("drier buffer length",__FILE__,(int)dryerbufferlength,(int)dryerbufferMeters*100,RpWarning,(int)dryerbufferCentimeters,0); mininkuptake = ProcessParams->mininkuptake; feedertension = ProcessParams->feedertension; pullertension = ProcessParams->pullertension; windertension = ProcessParams->windertension; headairflow = ProcessParams->headairflow; dryerairflow = ProcessParams->dryerairflow; return status;//status; } void ProcessRequestFunc(MessageContainer* requestContainer) { MessageContainer responseContainer; uint8_t* container_buffer; uint32_t status = 0; uint32_t Bytes = 0; UploadProcessParametersRequest* request = upload_process_parameters_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); ProcessParameters* ProcessParams = request->processparameters; if ((ProcessParams->dryerzone1temp > 0.1)&&(ProcessParams->headzone2temp > 0.1)&&(ProcessParams->headzone3temp > 0.1)&&(ProcessParams->headzone4temp > 0.1))//NOT turning off heaters { FileWrite(requestContainer->data.data, requestContainer->data.len,ProcessParamsConfigPath,BIOS_WAIT_FOREVER); Bytes = sizeof(ProcessParameters); EraseFlashSection(PROCESS_PARAMETERS_MAP_IN_FLASH,Bytes+4); ReadAppAndProgram(PROCESS_PARAMETERS_MAP_IN_FLASH, 4,&Bytes); ReadAppAndProgram(PROCESS_PARAMETERS_MAP_IN_FLASH+4, Bytes, ProcessParams); REPORT_MSG(Bytes,"Bytes write to flash"); } //////////////////////////////////////////////////////////////////////// /*UploadProcessParametersRequest* requesttest; uint8_t* buffer = NULL; uint32_t Bytes = 0; ProcessParameters* ProcessParamsTest; FileRead(ProcessParamsConfigPath, &Bytes, &buffer); requesttest = upload_process_parameters_request__unpack(NULL, Bytes, buffer); // ProcessParameters* ProcessParams = process_parameters__unpack(NULL, Bytes, buffer); if (requesttest) { ProcessParamsTest = request->processparameters; } free (buffer); upload_process_parameters_request__free_unpacked(requesttest,NULL); */ ///////////////////////////////////////////////////////// UploadProcessParametersResponse response = UPLOAD_PROCESS_PARAMETERS_RESPONSE__INIT; responseContainer = createContainer(MESSAGE_TYPE__UploadProcessParametersResponse, requestContainer->token, true, &response, &upload_process_parameters_response__pack, &upload_process_parameters_response__get_packed_size); container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); //REPORT_MSG (ProcessParams->dryerzone1temp,"Process Params Dryer"); PowerIdleOutOfIdleState(); if (status == 0) status = HandleProcessParameters(ProcessParams); if (status) { responseContainer.has_error = true; responseContainer.error = (ErrorCode)status; } size_t container_size = message_container__pack(&responseContainer, container_buffer); my_free(responseContainer.data.data); SendChars(container_buffer, container_size); upload_process_parameters_request__free_unpacked(request,NULL); } uint32_t LoadProcessParamsFromFile(void) { FRESULT Fresult = FR_OK; uint8_t* buffer = NULL; uint32_t Bytes = 0; Fresult = FileRead(ProcessParamsConfigPath, &Bytes, &buffer); if (Fresult == FR_OK) { UploadProcessParametersRequest* request = upload_process_parameters_request__unpack(NULL, Bytes, buffer); ProcessParameters* ProcessParams = request->processparameters; if ((request!= NULL)&&(ProcessParams!=NULL)) { if ((ProcessParams->dryerzone1temp > 0.1)&&(ProcessParams->headzone2temp > 0.1)&&(ProcessParams->headzone3temp > 0.1)&&(ProcessParams->headzone4temp > 0.1))//NOT turning off heaters { Bytes = sizeof(ProcessParameters); EraseFlashSection(PROCESS_PARAMETERS_MAP_IN_FLASH,Bytes+4); ReadAppAndProgram(PROCESS_PARAMETERS_MAP_IN_FLASH, 4,&Bytes); ReadAppAndProgram(PROCESS_PARAMETERS_MAP_IN_FLASH+4, Bytes, ProcessParams); REPORT_MSG(Bytes,"ProcessParameters Bytes write to flash"); free (buffer); } } else { Report("process parameters not loaded",__FILE__,__LINE__,(int)request,RpWarning,(int)request,0); return ERROR; } } return Fresult; } uint32_t ProcessParamsInit(void) { FRESULT Fresult = FR_OK; uint32_t Bytes; memcpy(&Bytes,(void *)PROCESS_PARAMETERS_MAP_IN_FLASH,sizeof(Bytes)); REPORT_MSG(Bytes,"Bytes read from flash"); if ((Bytes)&&(Bytes < 1000)) { ProcessParameters* ProcessParams = (ProcessParameters *)(PROCESS_PARAMETERS_MAP_IN_FLASH+4); Fresult = HandleProcessParameters(ProcessParams); } else { if (LoadProcessParamsFromFile()==OK) { memcpy(&Bytes,(void *)PROCESS_PARAMETERS_MAP_IN_FLASH,sizeof(Bytes)); REPORT_MSG(Bytes,"ProcessParams Bytes read from flash"); if ((Bytes)&&(Bytes < 1000)) { ProcessParameters* ProcessParams = (ProcessParameters *)(PROCESS_PARAMETERS_MAP_IN_FLASH+4); Fresult = HandleProcessParameters(ProcessParams); } } } return Fresult; }