From d06662b0f8ae1457a59b1b3391c448408ecff49d Mon Sep 17 00:00:00 2001 From: Ronen Sberlo Date: Thu, 27 Aug 2020 15:01:52 +0300 Subject: arc head blowers and pressure sensor --- .../Embedded/Modules/Diagnostics/Diagnostics.c | 27 +++++----- .../Embedded/Modules/General/GeneralHardware.c | 14 ++++- .../Embedded/Modules/General/GeneralHardware.h | 1 + .../Embedded/Modules/Heaters/Heaters_ex.h | 5 ++ .../Embedded/Modules/Heaters/Heaters_print.c | 60 +++++++++++++++++++++- 5 files changed, 93 insertions(+), 14 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c index a76142b00..37d6b5ec1 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c @@ -23,6 +23,7 @@ #include "drivers/I2C_Communication/ADC_MUX/ADC_MUX.h" #include "drivers/I2C_Communication/Head_Card/ADC/Head_ADC.h" #include "drivers/I2C_Communication/DAC/Blower.h" +#include #include "drivers/valves/valve.h" #include "modules/ids/ids_ex.h" @@ -264,6 +265,7 @@ double MotorValue[MAX_THREAD_MOTORS_NUM][DIAGNOSTICS_LIMIT+1]; uint8_t SpeedCounterIndex= 0; double SpeedValue[DIAGNOSTICS_DANCER_LIMIT+1]; double headblowervoltage1 = 0.0, headblowervoltage2 = 0.0; +double headblower1airflow = 0.0, headblower2airflow = 0.0; void DiagnosticLoadMotor(int MotorId, int frequency) { @@ -496,21 +498,22 @@ void CopyTemperaturesToMonitor(void) HeaterCounterIndex[HEATER_TYPE__HeaterZone4]; DiagnosticsMonitor.n_headzone6temperature = HeaterCounterIndex[HEATER_TYPE__HeaterZone6]; + DiagnosticsMonitor.n_headblower1airflow = HeaterCounterIndex[HEATER_TYPE__HeaterZone5]; DiagnosticsMonitor.n_headblower2airflow = HeaterCounterIndex[HEATER_TYPE__HeaterZone7]; - DiagnosticsMonitor.headblower1airflow = HeaterTemperature[HEATER_TYPE__HeaterZone5]; - DiagnosticsMonitor.headblower2airflow = HeaterTemperature[HEATER_TYPE__HeaterZone7]; + headblower1airflow = PressureSensorGetPressure(HEAD_PT100_ZONE_5_0X84_0); + headblower2airflow = PressureSensorGetPressure(HEAD_PT100_ZONE_7_0X86_0); + DiagnosticsMonitor.headblower1airflow = &headblower1airflow; + DiagnosticsMonitor.headblower2airflow = &headblower2airflow; + + DiagnosticsMonitor.n_headblowervoltage1 = 1; + DiagnosticsMonitor.n_headblowervoltage2 = 1; + headblowervoltage1 = HeadBlowersGetRPM(HEAD_FAN_RIGHT); + headblowervoltage2 = HeadBlowersGetRPM(HEAD_FAN_LEFT); + DiagnosticsMonitor.headblowervoltage1 = &headblowervoltage1; + DiagnosticsMonitor.headblowervoltage2 = &headblowervoltage2; } - DiagnosticsMonitor.n_headblower1airflow = HeaterCounterIndex[HEATER_TYPE__HeaterZone5]; - DiagnosticsMonitor.n_headblower2airflow = HeaterCounterIndex[HEATER_TYPE__HeaterZone7]; - DiagnosticsMonitor.headblower1airflow = HeaterTemperature[HEATER_TYPE__HeaterZone5]; - DiagnosticsMonitor.headblower2airflow = HeaterTemperature[HEATER_TYPE__HeaterZone7]; - headblowervoltage1 =(double )Head_Fan_PWM_Command[HEAD_FAN_RIGHT]; - headblowervoltage2 =(double )Head_Fan_PWM_Command[HEAD_FAN_LEFT]; - DiagnosticsMonitor.headblowervoltage1 = &headblowervoltage1; - DiagnosticsMonitor.headblowervoltage2 = &headblowervoltage2; - DiagnosticsMonitor.n_headblowervoltage1 = 1; - DiagnosticsMonitor.n_headblowervoltage2 = 1; + DiagnosticsMonitor.dryerzone1temperature = HeaterTemperature[HEATER_TYPE__DryerAirHeater]; DiagnosticsMonitor.dryerzone2temperature = diff --git a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c index ac2009bcd..517217b39 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c +++ b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c @@ -65,6 +65,7 @@ bool GeneralHwReady = false; bool PP_Machine = false; HardwareBlower BlowerCfg; +HardwareBlower HeadBlowerCfg[2]; char *SW_INFO_DIR = "0://SysInfo"; char HwConfigPath[50] = "0://SysInfo//GenHwCfg.cfg"; @@ -568,7 +569,18 @@ uint32_t HWConfiguration(UploadHardwareConfigurationRequest* UploadRequest) { LargeFansCfg = request->blowers[Dispenser_i]->voltage; } - + if((request->blowers[Dispenser_i]->enabled)&&(request->blowers[Dispenser_i]->hardwareblowertype == HARDWARE_BLOWER_TYPE__HeadBlower1)) + { + HeadBlowerCfg[0].enabled = true; + HeadBlowerCfg[0].voltage = request->blowers[Dispenser_i]->voltage; + HeadBlowerCfg[0].heatingvoltage = request->blowers[Dispenser_i]->heatingvoltage; + } + if((request->blowers[Dispenser_i]->enabled)&&(request->blowers[Dispenser_i]->hardwareblowertype == HARDWARE_BLOWER_TYPE__HeadBlower2)) + { + HeadBlowerCfg[1].enabled = true; + HeadBlowerCfg[1].voltage = request->blowers[Dispenser_i]->voltage; + HeadBlowerCfg[1].heatingvoltage = request->blowers[Dispenser_i]->heatingvoltage; + } } } ControlStart(); diff --git a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.h b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.h index 55490a140..e99931acc 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.h +++ b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.h @@ -20,6 +20,7 @@ uint32_t LoadConfigurationParamsFromFile(bool); void HWConfigurationLoadFile(void); extern HardwareBlower BlowerCfg; +extern HardwareBlower HeadBlowerCfg[2]; extern bool DataUpdated; diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h index 0220d1a6c..015c5ea83 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h @@ -41,3 +41,8 @@ uint32_t HeatersEnd(void); void HeatersControlStart(void); void HeatersControlStop(void); uint32_t Heaters_Init(void); +double PressureSensorGetPressure(uint8_t SensorId); +int HeadBlowersGetRPM(uint8_t fanId); +double PressureSensorInit(); +void HeadBlowersInit(); +void HeadBlowersCfg(); diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c index ce3ced6ef..8fe3de207 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c @@ -8,6 +8,7 @@ /////////////////////////////////////////////////////////////////////////////////////////// #include "include.h" #include +#include #include "heaters.h" #include "Heaters_ex.h" @@ -38,6 +39,7 @@ #include "drivers/I2C_Communication/ADC_MUX/ADC_MUX.h" #include "drivers/I2C_Communication/Head_Card/ADC/Head_ADC.h" #include "Drivers/I2C_Communication/I2C.h" +#include #include #include "StateMachines/Printing/PrintingSTM.h" @@ -91,11 +93,15 @@ uint32_t UnderHeatCounter [HEATER_TYPE_MAX_HEATERS] = {0,0,0,0,0,0,0,0,0,0,0, uint32_t MainDryerHeaterMaxTempControl = 0xFF; uint32_t SecondDryerHeaterMaxTempControl = 0xFF; uint32_t DisasterControlId = 0xFF; +double PressureSensorV0[2] = {0.0, 0.0}; + #define DRYER_AIR_PT100 TEMP_SENSE_ANALOG_DRYER_TEMP1 #define DRYER_MAIN_PT100 TEMP_SENSE_ANALOG_DRYER_TEMP2 #define DRYER_SECONDARY_PT100 TEMP_SENSE_ANALOG_DRYER_TEMP3 #define MINIMUM_HEATER_READ 9.0 #define MAXIMUM_HEATER_READ 283 +#define PRESSURE_SENSOR_CP 0.225 +extern uint16_t Head_Fan_Tach[2]; bool UseSecondaryDrierHeater = true; @@ -237,7 +243,6 @@ uint32_t HeatersDisasterControl(uint32_t x,uint32_t y); uint32_t PrepareHeater(int HeaterId, uint32_t SetTemperatue); void HeatersStartControlTimer (void); - //********************************************************************** //******************** CODE *******************************************/ //********************************************************************** @@ -1843,3 +1848,56 @@ void HeatersControlTask(UArg arg0, UArg arg1) } } } + + +/******************************************************************************** + * Arc Head Pressure sensors + *******************************************************************************/ + +void HeadBlowersInit() +{ + Trigger_Head_Fan_Control(HEAD_FAN_RIGHT, 0); + Trigger_Head_Fan_Control(HEAD_FAN_LEFT, 0); +} + +void HeadBlowersCfg() +{ + if (HeadBlowerCfg[0].enabled) { + Trigger_Head_Fan_Control(HEAD_FAN_RIGHT, HeadBlowerCfg[0].voltage); + } + if (HeadBlowerCfg[1].enabled) { + Trigger_Head_Fan_Control(HEAD_FAN_LEFT, HeadBlowerCfg[1].voltage); + } +} + +double PressureSensorInit(int fanId) +{ + int sensorId; + sensorId = (fanId == HEAD_FAN_RIGHT)?(HEAD_PT100_ZONE_5_0X84_0):(HEAD_PT100_ZONE_7_0X86_0); + PressureSensorV0[fanId] = MillisecGetTemperatures(sensorId); + PressureSensorV0[fanId] *= 10; + return PressureSensorV0[fanId]; +} + +int HeadBlowersGetRPM(uint8_t fanId) +{ + Trigger_Head_Read_Tacho(fanId); + + if (Head_Fan_Tach[fanId] == 0x1FFE) { + return 0; + } else { + return 7864320/Head_Fan_Tach[fanId]; + } +} + +double PressureSensorGetPressure(uint8_t SensorId) +{ + double V0, Vm, Q, Cp; + + Cp = PRESSURE_SENSOR_CP; + V0 = (SensorId == HEAD_PT100_ZONE_5_0X84_0)?(PressureSensorV0[0]):(PressureSensorV0[1]); + Vm = MillisecGetTemperatures(SensorId); + Vm *= 10; + Q = sqrt(Vm - V0 + 22) * Cp; + return Q; +} -- cgit v1.3.1 From 0c038093d83f8e266f09f489cd93dda3dbc6ab3f Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Thu, 27 Aug 2020 16:08:47 +0300 Subject: 4 winders test; keep alive embedded==>management. procedures. --- .../Embedded/Communication/Connection.c | 46 +- .../Embedded/Communication/Connection.h | 1 + .../Embedded_SW/Embedded/Communication/Container.c | 6 +- .../Embedded/Drivers/FPGA/FPGA_SPI_Comm.c | 18 +- .../Embedded/Drivers/SSI_Comm/SSI_Comm.h | 4 +- .../Embedded/Drivers/flash_ram/MCU_E2Prom.h | 2 + .../Embedded/Modules/Control/MillisecTask.c | 9 +- .../Embedded/Modules/Diagnostics/Diagnostics.c | 24 + .../Embedded/Modules/General/GeneralHardware.c | 6 + .../Embedded_SW/Embedded/Modules/IDS/IDS_print.c | 4 +- Software/Embedded_SW/Embedded/Modules/IFS/ifs.h | 1 + .../Embedded_SW/Embedded/Modules/Thread/Thread.h | 2 +- .../Embedded/Modules/Thread/Thread_Winder.c | 22 +- .../Embedded/Modules/Thread/Thread_ex.h | 7 +- .../Embedded/Modules/Thread/Thread_init.c | 64 +- .../Embedded/Modules/Thread/Thread_print.c | 126 ++- .../Embedded/Modules/Waste/Waste_maint.c | 2 +- .../Procedures/Mid tank calibration.pproj | 478 ++++++++- .../Stubs Collection/Procedures/Priming1.pproj | 1015 ++++++++++++++++++++ .../WHS_waste_Tank_Calibration_Save_V0.pproj | 107 +++ 20 files changed, 1879 insertions(+), 65 deletions(-) create mode 100644 Software/Stubs Collection/Procedures/Priming1.pproj create mode 100644 Software/Stubs Collection/Procedures/WHS_waste_Tank_Calibration_Save_V0.pproj (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Communication/Connection.c b/Software/Embedded_SW/Embedded/Communication/Connection.c index aa0db0ea9..c7077124c 100644 --- a/Software/Embedded_SW/Embedded/Communication/Connection.c +++ b/Software/Embedded_SW/Embedded/Communication/Connection.c @@ -139,7 +139,7 @@ void DisconnectionRequest(MessageContainer* requestContainer) int KeepAliveOneSecondCounter = 0; #define KEEPALIVE_COMMUNICATION_ABORT_LIMIT 10 bool KeepAliveActive = false; -bool keepalivetest = false; +bool keepalivetest = true; void KeepAliveRequestFunc(MessageContainer* requestContainer) { MessageContainer responseContainer; @@ -158,12 +158,50 @@ void KeepAliveRequestFunc(MessageContainer* requestContainer) SendChars((char*)container_buffer, container_size); //keep_alive_request__free_unpacked(request,NULL); } + +int KARequestId = 0x01010101; +char KARequestToken[36+1]; +void KeepAliveResponseFunc(MessageContainer* requestContainer) +{ + //KeepAliveRequest* request = + KeepAliveResponse *response = keep_alive_response__unpack(NULL, requestContainer->data.len, requestContainer->data.data); + if (strcmp(requestContainer->token,KARequestToken)==0) + { + if (keepalivetest == false) + KeepAliveOneSecondCounter = 0; + KeepAliveActive = true; + //Report("keepalive response received",__FILE__,__LINE__,KARequestId,RpWarning,msec_millisecondCounter, 0); + } + keep_alive_response__free_unpacked(response,NULL); +} + +void KeepAliveRequest1Second(void) +{ + MessageContainer responseContainer; + + KeepAliveResponse request = KEEP_ALIVE_REQUEST__INIT; + + strcpy(KARequestToken,"Happy days are coming to us, soon"); + memcpy(&KARequestToken[32],&KARequestId,sizeof(KARequestId)); + KARequestId++; + //Report("keepalive request sent",__FILE__,__LINE__,KARequestId,RpWarning,msec_millisecondCounter, 0); + + if (keepalivetest == false) + KeepAliveOneSecondCounter = 0; + //KeepAliveActive = true; + responseContainer = createContainer(MESSAGE_TYPE__KeepAliveRequest, KARequestToken, true, &request, &keep_alive_request__pack, &keep_alive_request__get_packed_size); + //------------------------------------------------------------------------------------------- + uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); + size_t container_size = message_container__pack(&responseContainer, container_buffer); + SendChars((char*)container_buffer, container_size); +} void KeepAliveOneSecondCall(void) { - if (KeepAliveActive == false) - return; if (FileUploadGetState()==false) return; + KeepAliveRequest1Second(); + if (KeepAliveActive == false) + return; KeepAliveOneSecondCounter++; if (KeepAliveOneSecondCounter > (KEEPALIVE_COMMUNICATION_ABORT_LIMIT/2)) @@ -181,7 +219,7 @@ void KeepAliveOneSecondCall(void) JobStopReporting(); //AlarmHandlingStop(); //CommunicationMailboxFlush(); - keepalivetest = false; + //keepalivetest = false; //USBCDCD_init(); USBCDCD_Reinit(); //UART_ResetBuffers(); diff --git a/Software/Embedded_SW/Embedded/Communication/Connection.h b/Software/Embedded_SW/Embedded/Communication/Connection.h index 8089cd82f..c0a31344f 100644 --- a/Software/Embedded_SW/Embedded/Communication/Connection.h +++ b/Software/Embedded_SW/Embedded/Communication/Connection.h @@ -12,6 +12,7 @@ void ConnectionRequest(MessageContainer* requestContainer); void DisconnectionRequest(MessageContainer* requestContainer); void KeepAliveRequestFunc(MessageContainer* requestContainer); +void KeepAliveResponseFunc(MessageContainer* requestContainer); void KeepAliveOneSecondCall(void); extern int KeepAliveOneSecondCounter; diff --git a/Software/Embedded_SW/Embedded/Communication/Container.c b/Software/Embedded_SW/Embedded/Communication/Container.c index 64f06a8c5..b14efbd55 100644 --- a/Software/Embedded_SW/Embedded/Communication/Container.c +++ b/Software/Embedded_SW/Embedded/Communication/Container.c @@ -42,6 +42,7 @@ #include "Modules/General/process.h" #include "Modules/Thread/Thread_ex.h" #include "Modules/Ids/Ids_ex.h" +#include "Modules/Ifs/Ifs.h" #include "Common/SWUpdate/FileSystem.h" #include "Common/SWUpdate/FirmwareUpgrade.h" @@ -142,7 +143,7 @@ void receive_callback(char* buffer, size_t length) if (requestContainer == NULL) return; #ifndef DISPESER_TEST - if ((requestContainer->type>= MESSAGE_TYPE__StartDiagnosticsRequest)&&(requestContainer->type != MESSAGE_TYPE__KeepAliveRequest)) //user action resets the idle counter + if ((requestContainer->type>= MESSAGE_TYPE__StartDiagnosticsRequest)&&(requestContainer->type != MESSAGE_TYPE__KeepAliveRequest)&&(requestContainer->type != MESSAGE_TYPE__KeepAliveResponse)) //user action resets the idle counter { ReportWithPackageFilter(CommFilter,"Message received", __FILE__,__LINE__,requestContainer->type, RpMessage,length, 0); } @@ -411,6 +412,9 @@ void receive_callback(char* buffer, size_t length) case MESSAGE_TYPE__KeepAliveRequest: KeepAliveRequestFunc(requestContainer); break; + case MESSAGE_TYPE__KeepAliveResponse: + KeepAliveResponseFunc(requestContainer); + break; case MESSAGE_TYPE__FileUploadRequest: FileUploadRequestFunc(requestContainer); break; diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.c b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.c index fda349f69..9c5c52bb9 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.c +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.c @@ -335,13 +335,13 @@ void FPGA_GetBusy() F1MOTNBUSY1 F1_MOT_NBUSY1; F1MOTNBUSY2 F1_MOT_NBUSY2; F2MOTNBUSY1 F2_MOT_NBUSY1; - //F3MOTNBUSY1 F3_MOT_NBUSY1; - for spare motors + F3MOTNBUSY1 F3_MOT_NBUSY1; //- for spare motors F1SPIBUSY1 F1_SPI_BUSY1; F1SPIBUSY2 F1_SPI_BUSY2; F2SPIBUSY1 F2_SPI_BUSY1; F2SPIBUSY2 F2_SPI_BUSY2; - //F3SPIBUSY1 F3_SPI_BUSY1; - for spare motors + F3SPIBUSY1 F3_SPI_BUSY1;// - for spare motors //Read NBUSY from FPGA unsigned short readValue = 0; @@ -351,14 +351,15 @@ void FPGA_GetBusy() F1_MOT_NBUSY2.ushort = (uint16_t) ~((unsigned int) readValue); readValue = F2_Moto_Driver_NBUSY1_D; F2_MOT_NBUSY1.ushort = (uint16_t) ~((unsigned int) readValue); - //F3_MOT_NBUSY1.ushort = F3_Moto_Driver_NBUSY1_D; - for spare motors + readValue = F3_Moto_Driver_NBUSY1_D; + F3_MOT_NBUSY1.ushort = (uint16_t) ~((unsigned int) readValue);; // - for spare motors //Read SPI BUSY from FPGA F1_SPI_BUSY1.ushort = F1_SPI_Busy1_D; F1_SPI_BUSY2.ushort = F1_SPI_Busy2_D; F2_SPI_BUSY1.ushort = F2_SPI_Busy1_D; F2_SPI_BUSY2.ushort = F2_SPI_Busy2_D; - //F3_SPI_BUSY1.ushort = F3_SPI_Busy1_D; - for spare motors + F3_SPI_BUSY1.ushort = F3_SPI_Busy1_D; // - for spare motors MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD].Busy = (F1_MOT_NBUSY1.bits.F1_MOTO_DH_CLEANHEAD_A1_NBUSY) | F1_SPI_BUSY1.bits.F1_MOTO_DH_CLEANHEAD_A1_SDI_busy; MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH].Busy = (F1_MOT_NBUSY1.bits.F1_MOTO_DH_CLEANMECH_A1_NBUSY) | F1_SPI_BUSY1.bits.F1_MOTO_DH_CLEANMECH_A1_SDI_busy; @@ -381,10 +382,17 @@ void FPGA_GetBusy() MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_LDRIVING].Busy = (F1_MOT_NBUSY1.bits.F1_MOTO_LDRIVING_A1_NBUSY) | F1_SPI_BUSY1.bits.F1_MOTO_LDRIVING_A1_SDI_busy; MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_LLOADING].Busy = (F1_MOT_NBUSY1.bits.F1_MOTO_LLOADING_A1_NBUSY) | F1_SPI_BUSY1.bits.F1_MOTO_LLOADING_A1_SDI_busy; MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_LPIVOT1].Busy = (F1_MOT_NBUSY1.bits.F1_MOTO_LPIVOT1_A1_NBUSY) | F1_SPI_BUSY2.bits.F1_MOTO_LPIVOT1_A1_SDI_busy; - MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_RDANCER].Busy = (F1_MOT_NBUSY2.bits.F1_MOTO_RDANCER_A1_NBUSY) | F1_SPI_BUSY2.bits.F1_MOTO_RDANCER_A1_SDI_busy; + MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_RDANCER].Busy = (F1_MOT_NBUSY2.bits.F1_MOTO_RDANCER_A1_NBUSY) & F1_SPI_BUSY2.bits.F1_MOTO_RDANCER_A1_SDI_busy; MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_RDRIVING].Busy = (F1_MOT_NBUSY2.bits.F1_MOTO_RDRIVING_A1_NBUSY) | F1_SPI_BUSY1.bits.F1_MOTO_RDRIVING_A1_SDI_busy; MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_RLOADING].Busy = (F1_MOT_NBUSY2.bits.F1_MOTO_RLOADING_A1_NBUSY) | F1_SPI_BUSY1.bits.F1_MOTO_RLOADING_A1_SDI_busy; + MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_SPARE1_1].Busy = (F3_MOT_NBUSY1.bits.F3_MOTO_SPARE1_1_A1_NBUSY) | F3_SPI_BUSY1.bits.F3_MOTO_SPARE1_1_A1_SDI_busy; + MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_SPARE1_2].Busy = (F3_MOT_NBUSY1.bits.F3_MOTO_SPARE1_2_A1_NBUSY) | F3_SPI_BUSY1.bits.F3_MOTO_SPARE1_2_A1_SDI_busy; + MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_SPARE2_1].Busy = (F3_MOT_NBUSY1.bits.F3_MOTO_SPARE2_1_A1_NBUSY) | F3_SPI_BUSY1.bits.F3_MOTO_SPARE2_1_A1_SDI_busy; + MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_SPARE2_2].Busy = (F3_MOT_NBUSY1.bits.F3_MOTO_SPARE2_2_A1_NBUSY) | F3_SPI_BUSY1.bits.F3_MOTO_SPARE2_2_A1_SDI_busy; + + + TempSensorResponse[TEMP_SENSE_ANALOG_MIXCHIP_TEMP].Busy = F2_SPI_BUSY1.bits.F2_ANALOG_MIXCHIP_TEMP_1_BUSY; TempSensorResponse[TEMP_SENSE_ANALOG_DYEINGH_TEMP1].Busy = F2_SPI_BUSY1.bits.F2_ANALOG_DYEINGH_TEMP1_1_BUSY; TempSensorResponse[TEMP_SENSE_ANALOG_DYEINGH_TEMP2].Busy = F2_SPI_BUSY1.bits.F2_ANALOG_DYEINGH_TEMP2_1_BUSY; diff --git a/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/SSI_Comm.h b/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/SSI_Comm.h index f726baeb4..79239835f 100644 --- a/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/SSI_Comm.h +++ b/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/SSI_Comm.h @@ -27,8 +27,8 @@ typedef enum Dancers4Winders { - HARDWARE_DANCER_0 = 0, - HARDWARE_DANCER_1 = 1, + HARDWARE_DANCER_0 = 0, //winder + HARDWARE_DANCER_1 = 1, // puller HARDWARE_DANCER_2 = 2, HARDWARE_DANCER_3 = 3, HARDWARE_DANCER_4 = 4, diff --git a/Software/Embedded_SW/Embedded/Drivers/flash_ram/MCU_E2Prom.h b/Software/Embedded_SW/Embedded/Drivers/flash_ram/MCU_E2Prom.h index bbbc49c7d..3331241cb 100644 --- a/Software/Embedded_SW/Embedded/Drivers/flash_ram/MCU_E2Prom.h +++ b/Software/Embedded_SW/Embedded/Drivers/flash_ram/MCU_E2Prom.h @@ -42,6 +42,8 @@ typedef enum { EEPROM_PULLER_TENSION_POSITION, EEPROM_WINDER_TENSION_POSITION, EEPROM_INIT_FAILURE_COUNTER, + EEPROM_STORAGE_DANCER_3, + EEPROM_STORAGE_DANCER_4, MAX_EEPROM_STORAGE }EEPROM_STORAGE_USAGE_ENUM; #define MAX_SERIAL_NUM_LEN 5 //5*4 bytes diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index 327b5d19b..55148e655 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -496,9 +496,17 @@ uint32_t MillisecLoop(uint32_t tick) #ifdef test_RTFU_dancer test_dancer_responce_RTFU(); #else +#ifdef FOUR_WINDERS + Dancer_Data[HARDWARE_DANCER_0] = Read_Dancer_Position(HARDWARE_DANCER_0); + Dancer_Data[HARDWARE_DANCER_1] = Read_Dancer_Position(HARDWARE_DANCER_1); + Dancer_Data[HARDWARE_DANCER_2] = Read_Dancer_Position(HARDWARE_DANCER_2); + Dancer_Data[HARDWARE_DANCER_3] = Read_Dancer_Position(HARDWARE_DANCER_3); + Dancer_Data[HARDWARE_DANCER_4] = Read_Dancer_Position(HARDWARE_DANCER_4); +#else Dancer_Data[FEEDER_DANCER] = Read_Dancer_Position(FEEDER_DANCER); Dancer_Data[POOLER_DANCER] = Read_Dancer_Position(POOLER_DANCER); Dancer_Data[WINDER_DANCER] = Read_Dancer_Position(WINDER_DANCER); +#endif #endif #endif @@ -732,7 +740,6 @@ uint32_t MillisecLowLoop(uint32_t tick) //static int Counter = 0; MachineUpdateResponseFunc(); //KeepAliveOneSecondCall(); - //TemperatureListString(Lenstr); //ReportWithPackageFilter(ThreadFilter,Lenstr,__FILE__,__LINE__,(int)Counter++,RpWarning,(int) msec_millisecondCounter,0); for (Sensor_i = StartPT100;Sensor_i < MAX_HEAD_CARD_TEMP_SENS_ID;Sensor_i++) diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c index a76142b00..05987ee7f 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c @@ -17,6 +17,7 @@ #include "drivers/Motors/Motor.h" #include "drivers/Heater/TemperatureSensor.h" #include "drivers/SSI_Comm/Dancer/Dancer.h" +#include #include "drivers/FPGA/FPGA_SPI_Comm.h" #include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h" #include "drivers/FPGA/FPGA.h" @@ -407,6 +408,9 @@ void DiagnosticLoadDancerError(int DancerId, double value) // DancerErrorCounterIndex[DancerId] = 0; } +#ifdef FOUR_WINDERS + double dancer2,dancer3,dancer4; +#endif void CopyTemperaturesToMonitor(void) { DiagnosticsMonitor.mixertemperature = @@ -511,6 +515,18 @@ void CopyTemperaturesToMonitor(void) DiagnosticsMonitor.headblowervoltage2 = &headblowervoltage2; DiagnosticsMonitor.n_headblowervoltage1 = 1; DiagnosticsMonitor.n_headblowervoltage2 = 1; +#ifdef FOUR_WINDERS +// double dancer2,dancer3,dancer4; + dancer2 = Control_Read_Dancer_Position(HARDWARE_DANCER_2,0); + dancer3 = Control_Read_Dancer_Position(HARDWARE_DANCER_3,0); + dancer4 = Control_Read_Dancer_Position(HARDWARE_DANCER_4,0); + DiagnosticsMonitor.n_headblower1airflow = 1; + DiagnosticsMonitor.n_headblower2airflow = 1; + DiagnosticsMonitor.headblower1airflow = &dancer4; + DiagnosticsMonitor.headblower2airflow = &dancer3; + DiagnosticsMonitor.headblowervoltage1 = &dancer2; + DiagnosticsMonitor.n_headblowervoltage1 = 1; +#endif DiagnosticsMonitor.dryerzone1temperature = HeaterTemperature[HEATER_TYPE__DryerAirHeater]; DiagnosticsMonitor.dryerzone2temperature = @@ -975,11 +991,19 @@ void Diagnostic100msecCollection(void) { //if (JobIsActive()) { +#ifdef FOUR_WINDERS + DiagnosticLoadMotor(FEEDER_MOTOR, ThreadGetMotorSpeed (WINDER_2_MOTOR)); + DiagnosticLoadMotor(DRYER_MOTOR, ThreadGetMotorSpeed (WINDER_3_MOTOR)); + DiagnosticLoadMotor(POOLER_MOTOR, ThreadGetMotorSpeed (WINDER_4_MOTOR)); + DiagnosticLoadMotor(WINDER_MOTOR, ThreadGetMotorSpeed (WINDER_MOTOR)); + DiagnosticLoadMotor(SCREW_MOTOR, ThreadGetMotorSpeed (SCREW_MOTOR)); +#else DiagnosticLoadMotor(FEEDER_MOTOR, ThreadGetMotorSpeed (FEEDER_MOTOR)); DiagnosticLoadMotor(DRYER_MOTOR, ThreadGetMotorSpeed (DRYER_MOTOR)); DiagnosticLoadMotor(POOLER_MOTOR, ThreadGetMotorSpeed (POOLER_MOTOR)); DiagnosticLoadMotor(WINDER_MOTOR, ThreadGetMotorSpeed (WINDER_MOTOR)); DiagnosticLoadMotor(SCREW_MOTOR, ThreadGetMotorSpeed (SCREW_MOTOR)); +#endif } for (i=0;i +#include "drivers/FPGA/Full_Vme/FPGA_Programming_Up.h" #include "StateMachines/Printing/PrintingSTM.h" #include "StateMachines/Initialization/InitSequence.h" @@ -431,6 +432,11 @@ uint32_t HWConfiguration(UploadHardwareConfigurationRequest* UploadRequest) LOG_ERROR(1,"JobIsActive"); return ERROR; } + if (FPGABurningActive == true) + { + LOG_ERROR(1,"FPGABurningActive"); + return ERROR; + } if (watchdogCriticalAlarm == true) { LOG_ERROR(1,"Critical Alarm cleared - Watchdog de-activated"); diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c index 9c82cb1bf..c0ccefde1 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c @@ -1118,8 +1118,8 @@ uint32_t IDS_Cleaning_Stop_Cleaning_Solution (callback_fptr callback); if (CurrentDispenserSpeed[CLEANER_DISPENSER]>0) IDS_Cleaning_Stop_Cleaning_Solution (NULL); setRapidPressureRead(false); - if (JobEndSequence == true) - DistanceToSpoolReady(Module_IDS,ModuleDone); + //if (JobEndSequence == true) + // DistanceToSpoolReady(Module_IDS,ModuleDone); } if (EnableCleaning == true) { diff --git a/Software/Embedded_SW/Embedded/Modules/IFS/ifs.h b/Software/Embedded_SW/Embedded/Modules/IFS/ifs.h index 1edc03264..0f95fb2e2 100644 --- a/Software/Embedded_SW/Embedded/Modules/IFS/ifs.h +++ b/Software/Embedded_SW/Embedded/Modules/IFS/ifs.h @@ -27,5 +27,6 @@ void ResponseDemo(int MidtankId); bool IFS_MidTankFilling(void); MidTank_t IFS_MidTankIsActive(void); bool IFS_CartridgeLowerPresent(); +bool CartridgeValidationResponseFunc(MessageContainer* requestContainer); #endif /* MODULES_IFS_IFS_H_ */ diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h b/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h index 1f2da8dc0..13032f49d 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h @@ -54,7 +54,7 @@ typedef struct #define MAX_THREAD_FEED_MOTORS (WINDER_MOTOR+1) -#define MAX_SYSTEM_DANCERS (HARDWARE_DANCER_TYPE__RightDancer+1) +#define MAX_SYSTEM_DANCERS NUM_OF_ROTENC extern TimerMotors_t ThreadMotorIdToMotorId[MAX_THREAD_MOTORS_NUM]; diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c index 1ce27115d..852389001 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c @@ -347,10 +347,14 @@ int flipflop = 0; uint32_t motspeed; float speedf; int WinderCalculation = 0; +int MotorOrder[4] = {HARDWARE_MOTOR_TYPE__MOTO_SCREW,SCREW_2_Motor,SCREW_3_Motor,SCREW_4_Motor}; + + uint32_t Screw100msecDirectionChange(uint32_t deviceID, uint32_t BusyFlag) { //uint32_t Steps; double temp,tempScrewSpeed; + int i,tempmot; //double screw_horizontal_speed = 0; //double RotationsPerSecond; if (WinderMotorSpeedCounter++>=MAX_WINDER_SPEED_CALCULATION) @@ -369,6 +373,14 @@ uint32_t Screw100msecDirectionChange(uint32_t deviceID, uint32_t BusyFlag) ScrewCurrentDirection = 1-ScrewCurrentDirection; CalculationDirectionChangeCounter++; +#ifdef FOUR_WINDERS + tempmot = MotorOrder[0]; + MotorOrder[0] = MotorOrder[1]; + MotorOrder[1] = MotorOrder[2]; + MotorOrder[2] = MotorOrder[3]; + MotorOrder[3] = tempmot; + //Report("order change" ,__FILE__,MotorOrder[0],MotorOrder[1],RpWarning,MotorOrder[2], 0); +#endif if (SampleWinding) return OK; //double calcsteps = (ScrewRunningTime/SYS_CLK_FREQ)*ScrewSpeed; @@ -707,11 +719,13 @@ void ScrewTimerInterrupt(int ARG0) MotorSetDirection (SCREW_3_Motor, ScrewCurrentDirection); MotorSetDirection (SCREW_4_Motor, ScrewCurrentDirection); #endif - MotorSetSpeedDirect(HARDWARE_MOTOR_TYPE__MOTO_SCREW,ScrewSpeed); #ifdef FOUR_WINDERS - MotorSetSpeedDirect (SCREW_2_Motor, ScrewSpeed); - MotorSetSpeedDirect (SCREW_3_Motor, ScrewSpeed); - MotorSetSpeedDirect (SCREW_4_Motor, ScrewSpeed); + MotorSetSpeedDirect(MotorOrder[0],ScrewSpeed); + MotorSetSpeedDirect (MotorOrder[1], ScrewSpeed); + MotorSetSpeedDirect (MotorOrder[2], ScrewSpeed); + MotorSetSpeedDirect (MotorOrder[3], ScrewSpeed); +#else + MotorSetSpeedDirect(HARDWARE_MOTOR_TYPE__MOTO_SCREW,ScrewSpeed); #endif #ifdef READ_SCREW_ENCODER Read_Screw_Encoder(); diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h index 4339c5312..c3f181b52 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h @@ -9,7 +9,7 @@ #define WINDER_DANCER HARDWARE_DANCER_TYPE__LeftDancer #define POOLER_DANCER HARDWARE_DANCER_TYPE__MiddleDancer #define FEEDER_DANCER HARDWARE_DANCER_TYPE__RightDancer -#define NUM_OF_DANCERS (HARDWARE_DANCER_TYPE__RightDancer+1) +#define NUM_OF_DANCERS NUM_OF_ROTENC //} DANCER_ENUM; typedef enum threadMotorsEnum { @@ -17,6 +17,11 @@ typedef enum threadMotorsEnum DRYER_MOTOR, POOLER_MOTOR, WINDER_MOTOR, +#ifdef FOUR_WINDERS + WINDER_2_MOTOR, + WINDER_3_MOTOR, + WINDER_4_MOTOR, +#endif SCREW_MOTOR, MAX_THREAD_MOTORS_NUM }threadMotorsEnum; diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c index bbb3e4040..1920db03a 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c @@ -151,6 +151,39 @@ uint32_t MotorPidRequestMessage(HardwarePidControl* request) temp = temp*3/2; } DancerStopActivityLimit[Motor_i] = temp/(2*PI*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].armlength); +#ifdef FOUR_WINDERS + if (Motor_i == WINDER_MOTOR) + { + int j,winderMotorId; + for (j=0;j<3;j++) + { + winderMotorId = j+WINDER_2_MOTOR; + memcpy (&MotorsControl[winderMotorId],request,sizeof(HardwarePidControl)); + if (MotorsControl[winderMotorId].pvinputfilterfactormode > MAX_CONTROL_SAMPLES) + MotorsControl[winderMotorId].pvinputfilterfactormode = MAX_CONTROL_SAMPLES; + #ifdef TEST_LONGER_PID_THREAD + MotorsControl[Motor_i].pvinputfilterfactormode = 10; //test longer control + #endif + for (i = 0;i < (int)MotorsControl[winderMotorId].pvinputfilterfactormode; i++) + { + MotorSamples[winderMotorId][i] = 0; //reset the samples value for control beginning + MotorSpeedSamples[winderMotorId][i] = 0; + } + NormalizedErrorCoEfficient[winderMotorId] = (2*PI*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].armlength); + temp = 1<<(DancersCfg[ThreadMotorIdToDancerId[Motor_i]].resolutionbits); + temp=(NORMAL_COEF_DIVIDER*(temp-1)*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].maximalmovementmm); + NormalizedErrorCoEfficient[winderMotorId] = NormalizedErrorCoEfficient[winderMotorId] / temp; + // uint32_t MotorSamples[MAX_THREAD_MOTORS_NUM][MAX_CONTROL_SAMPLES]; + temp = 1<<(DancersCfg[ThreadMotorIdToDancerId[Motor_i]].resolutionbits); + temp = (temp*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].maximalmovementmm);//*3/2); + if (Motor_i == WINDER_MOTOR) + { + temp = temp*3/2; + } + DancerStopActivityLimit[winderMotorId] = temp/(2*PI*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].armlength); + } + } +#endif return OK; } char DancerConfigPath[50] = "0://SysInfo//DancCfg.cfg"; @@ -159,31 +192,37 @@ uint32_t StoreDancerConfigMessage() { uint32_t status = OK; // FRESULT Fresult = FR_OK; - HardwareConfiguration DancerConfig; + //HardwareConfiguration DancerConfig; HardwareDancer Dancers[MAX_SYSTEM_DANCERS]; // uint8_t* response_buffer; // size_t response_size = 0; int Dancer_i; - hardware_configuration__init(&DancerConfig); - DancerConfig.dancers = (HardwareDancer**)my_malloc(sizeof(HardwareDancer*)*MAX_SYSTEM_DANCERS); + //hardware_configuration__init(&DancerConfig); + //DancerConfig.dancers = (HardwareDancer**)my_malloc(sizeof(HardwareDancer*)*MAX_SYSTEM_DANCERS); for (Dancer_i = 0; Dancer_i < MAX_SYSTEM_DANCERS; Dancer_i++) { hardware_dancer__init(&Dancers[Dancer_i]); - DancerConfig.dancers[Dancer_i] = &Dancers[Dancer_i]; + //DancerConfig.dancers[Dancer_i] = &Dancers[Dancer_i]; Dancers[Dancer_i].has_zeropoint = true; Dancers[Dancer_i].hardwaredancertype = Dancer_i; Dancers[Dancer_i].has_hardwaredancertype = true; - DancerConfig.dancers[Dancer_i]->zeropoint=Control_Read_Dancer_Position(Dancer_i,0); - DancerConfig.n_dancers++; - DancersCfg[Dancer_i].zeropoint = DancerConfig.dancers[Dancer_i]->zeropoint; + Dancers[Dancer_i].zeropoint=Control_Read_Dancer_Position(Dancer_i,0); + //DancerConfig.n_dancers++; + DancersCfg[Dancer_i].zeropoint = Dancers[Dancer_i].zeropoint; + DancersCfg[Dancer_i].zeropoint = Control_Read_Dancer_Position(Dancer_i,0); } status |= MCU_E2PromProgram(EEPROM_STORAGE_DANCER_0,DancersCfg[0].zeropoint); status |= MCU_E2PromProgram(EEPROM_STORAGE_DANCER_1,DancersCfg[1].zeropoint); status |= MCU_E2PromProgram(EEPROM_STORAGE_DANCER_2,DancersCfg[2].zeropoint); Report("~~~~~~Store eeprom 0",__FILE__,DancersCfg[0].zeropoint,(int)DancersCfg[1].zeropoint,RpWarning,(int)DancersCfg[2].zeropoint,0); -/* +#ifdef FOUR_WINDERS + status |= MCU_E2PromProgram(EEPROM_STORAGE_DANCER_3,DancersCfg[HARDWARE_DANCER_3].zeropoint); + status |= MCU_E2PromProgram(EEPROM_STORAGE_DANCER_4,DancersCfg[HARDWARE_DANCER_4].zeropoint); + Report("~~~~~~Store eeprom 1",__FILE__,__LINE__,(int)DancersCfg[HARDWARE_DANCER_3].zeropoint,RpWarning,(int)DancersCfg[HARDWARE_DANCER_4].zeropoint,0); +#endif + /* response_buffer = my_malloc(hardware_configuration__get_packed_size(&DancerConfig)); if (response_buffer) { @@ -208,11 +247,18 @@ uint32_t LoadDancerConfigMessage() MCU_E2PromRead(EEPROM_STORAGE_DANCER_0,&DancersCfg[0].zeropoint); MCU_E2PromRead(EEPROM_STORAGE_DANCER_1,&DancersCfg[1].zeropoint); MCU_E2PromRead(EEPROM_STORAGE_DANCER_2,&DancersCfg[2].zeropoint); - +#ifdef FOUR_WINDERS + MCU_E2PromRead(EEPROM_STORAGE_DANCER_3,&DancersCfg[3].zeropoint); + MCU_E2PromRead(EEPROM_STORAGE_DANCER_4,&DancersCfg[4].zeropoint); +#endif status |= Report("Dancer 0 Store data eeprom ",__FILE__,__LINE__,0,RpWarning,(int)DancersCfg[0].zeropoint,0); status |= Report("Dancer 1 Store data eeprom ",__FILE__,__LINE__,1,RpWarning,(int)DancersCfg[1].zeropoint,0); status |= Report("Dancer 2 Store data eeprom ",__FILE__,__LINE__,2,RpWarning,(int)DancersCfg[2].zeropoint,0); +#ifdef FOUR_WINDERS + status |= Report("Dancer 3 Store data eeprom ",__FILE__,__LINE__,3,RpWarning,(int)DancersCfg[3].zeropoint,0); + status |= Report("Dancer 4 Store data eeprom ",__FILE__,__LINE__,4,RpWarning,(int)DancersCfg[4].zeropoint,0); +#endif return status; diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c index 79832120b..7ec0ed5e5 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c @@ -46,13 +46,15 @@ double CurrentControlledSpeed[MAX_THREAD_MOTORS_NUM] = {0}; -TimerMotors_t ThreadMotorIdToMotorId[MAX_THREAD_MOTORS_NUM] = {HARDWARE_MOTOR_TYPE__MOTO_RDRIVING,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,HARDWARE_MOTOR_TYPE__MOTO_LDRIVING,HARDWARE_MOTOR_TYPE__MOTO_WINDER,HARDWARE_MOTOR_TYPE__MOTO_SCREW}; #ifdef FOUR_WINDERS -Dancers_4_Winders ThreadMotorIdToDancerId[MAX_THREAD_MOTORS_NUM] = {FEEDER_DANCER,NUM_OF_DANCERS,POOLER_DANCER,WINDER_DANCER,NUM_OF_DANCERS}; +TimerMotors_t ThreadMotorIdToMotorId[MAX_THREAD_MOTORS_NUM] = {HARDWARE_MOTOR_TYPE__MOTO_RDRIVING,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,HARDWARE_MOTOR_TYPE__MOTO_LDRIVING,HARDWARE_MOTOR_TYPE__MOTO_WINDER,Winder_2_Motor,Winder_3_Motor,Winder_4_Motor,HARDWARE_MOTOR_TYPE__MOTO_SCREW}; +Dancers_4_Winders ThreadMotorIdToDancerId[MAX_THREAD_MOTORS_NUM] = {NUM_OF_DANCERS,NUM_OF_DANCERS,HARDWARE_DANCER_1,HARDWARE_DANCER_0,HARDWARE_DANCER_4,HARDWARE_DANCER_3,HARDWARE_DANCER_2,NUM_OF_DANCERS}; +uint32_t ControlIdtoMotorId [MAX_THREAD_MOTORS_NUM] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; #else +TimerMotors_t ThreadMotorIdToMotorId[MAX_THREAD_MOTORS_NUM] = {HARDWARE_MOTOR_TYPE__MOTO_RDRIVING,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,HARDWARE_MOTOR_TYPE__MOTO_LDRIVING,HARDWARE_MOTOR_TYPE__MOTO_WINDER,HARDWARE_MOTOR_TYPE__MOTO_SCREW}; HardwareDancerType ThreadMotorIdToDancerId[MAX_THREAD_MOTORS_NUM] = {FEEDER_DANCER,NUM_OF_DANCERS,POOLER_DANCER,WINDER_DANCER,NUM_OF_DANCERS}; -#endif uint32_t ControlIdtoMotorId [MAX_THREAD_MOTORS_NUM] = {0xFF,0xFF,0xFF,0xFF,0xFF}; +#endif uint32_t SpeedControlId=0xFF; uint32_t PoolerSpeedControlId=0xFF; @@ -432,7 +434,10 @@ uint32_t ThreadControlSpeedReadFunction(uint32_t IfIndex, uint32_t ReadValue) uint16_t BreakSensorCounter = 0; uint16_t BreakSensorLatchCounter = 0; char TMessage[150]; - +#ifdef FOUR_WINDERS +char ATMessage[MAX_THREAD_MOTORS_NUM][150]; +int c = 0; +#endif uint32_t checkBreakSensor(uint32_t index) { if (BreakSensorenabled == true) @@ -550,7 +555,6 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) //#define MAX_CONTROL_SAMPLES 6 //extern uint32_t MotorSamples[MAX_THREAD_MOTORS_NUM][MAX_CONTROL_SAMPLES]; //extern int MotorSamplePointer[MAX_THREAD_MOTORS_NUM]; - //read value is the dancer angle int i,index=MAX_THREAD_MOTORS_NUM; int len; @@ -621,6 +625,29 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) //pooler dancer is right sided: data is opposite TranslatedReadValue = (-1*TranslatedReadValue); } +#ifdef FOUR_WINDERS + if (index == WINDER_MOTOR) + { + c++; + } + if (index == WINDER_2_MOTOR) + { + c++; + } + if (index == WINDER_3_MOTOR) + { + c++; + } + if (index == WINDER_4_MOTOR) + { + c++; + } + if ((index == WINDER_2_MOTOR)||(index == WINDER_3_MOTOR)) + { + //pooler dancer is right sided: data is opposite + TranslatedReadValue = (-1*TranslatedReadValue); + } +#endif if (index == POOLER_MOTOR) { //pooler dancer is right sided: data is opposite @@ -650,6 +677,10 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) ThreadControlActive = false; //MotorGetStatusFromFPGA(ThreadMotorIdToMotorId[index]); JobEndReason = JOB_WINDER_DANCER_FAIL+DancerId; +#ifdef FOUR_WINDERS + if (DancerId>HARDWARE_DANCER_2) + JobEndReason = JOB_WINDER_DANCER_FAIL+HARDWARE_DANCER_0; +#endif SendJobProgress(0.0,0,false, TMessage); //EndState(CurrentJob,TMessage ); SendSegmentFail(); @@ -702,24 +733,26 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) }*`/ }*/ calculated_speed = (1-MotorControlConfig[index].m_calculatedError)*OriginalMotorSpd_2PPS[index]; - if (index != WINDER_MOTOR) + if (index < WINDER_MOTOR) calculated_speed = calculated_speed*InitialDryerSpeed/OriginalMotorSpd_2PPS[DRYER_MOTOR]; //calculated_speed = (1-MotorControlConfig[index].m_calculatedError)*CurrentControlledSpeed[index]; - if (0)//(JobCounter % 1000 == 0) - //if (JobCounter < 100)//(FirstCalcInJob == true) + //if (0)//(JobCounter % 1000 == 0) +#ifdef FOUR_WINDERS + if (JobCounter % 500 < 4)//(FirstCalcInJob == true) { - if (index == FEEDER_MOTOR) + if (index >= WINDER_MOTOR) { // FirstCalcInJob = false; - len = usnprintf(TMessage, 150, "read %d avg %d error(6) %d integral(9) %d,delta(9) %d, calc(3) %d speed %d %d", + len = usnprintf(ATMessage[index], 150, "index %d read %d avg %d error(6) %d integral(9) %d,delta(9) %d, calc(3) %d speed %d %d",index, TranslatedReadValue,avreageSampleValue,(int)(MotorControlConfig[index].m_mesuredParam*1000000), (int)(MotorControlConfig[index].m_integral*1000000000),(int)((MotorControlConfig[index].m_mesuredParam*MotorControlConfig[index].m_params.dt)*1000000000), (int)(MotorControlConfig[index].m_calculatedError*1000),(int)calculated_speed, (int)(InitialDryerSpeed*100/OriginalMotorSpd_2PPS[DRYER_MOTOR])); - ReportWithPackageFilter(ThreadFilter,TMessage,__FILE__,MotorSamplePointer[index],JobCounter,RpError,ReadValue,0); + ReportWithPackageFilter(ThreadFilter,ATMessage[index],__FILE__,MotorSamplePointer[index],JobCounter,RpError,ReadValue,0); } + JobCounter++; } - +#endif #ifndef TEST_PID_THREAD if (fabs(calculated_speed-CurrentControlledSpeed[index])> MotorControlConfig[index].m_ingnoreValue) #else @@ -735,14 +768,6 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) }*/ CurrentControlledSpeed[index] = calculated_speed; MotorSetSpeed(ThreadMotorIdToMotorId[index], calculated_speed); -#ifdef FOUR_WINDERS - if (index == WINDER_MOTOR) - { - MotorSetSpeed(Winder_2_Motor, calculated_speed); - MotorSetSpeed(Winder_3_Motor, calculated_speed); - MotorSetSpeed(Winder_4_Motor, calculated_speed); - } -#endif } else { @@ -832,11 +857,32 @@ uint32_t HandleJobThreadControlParameters(ThreadParameters* ThreadParams) MotorControlConfig[POOLER_MOTOR].m_params.Kd = ThreadParams->pullerd; if(ThreadParams->winderp) + { MotorControlConfig[WINDER_MOTOR].m_params.Kp = ThreadParams->winderp; +#ifdef FOUR_WINDERS + MotorControlConfig[WINDER_2_MOTOR].m_params.Kp = ThreadParams->winderp; + MotorControlConfig[WINDER_3_MOTOR].m_params.Kp = ThreadParams->winderp; + MotorControlConfig[WINDER_4_MOTOR].m_params.Kp = ThreadParams->winderp; +#endif + } if(ThreadParams->winderi) + { MotorControlConfig[WINDER_MOTOR].m_params.Ki = ThreadParams->winderi; +#ifdef FOUR_WINDERS + MotorControlConfig[WINDER_2_MOTOR].m_params.Ki = ThreadParams->winderi; + MotorControlConfig[WINDER_3_MOTOR].m_params.Ki = ThreadParams->winderi; + MotorControlConfig[WINDER_4_MOTOR].m_params.Ki = ThreadParams->winderi; +#endif + } if(ThreadParams->winderd) + { MotorControlConfig[WINDER_MOTOR].m_params.Kd = ThreadParams->winderd; +#ifdef FOUR_WINDERS + MotorControlConfig[WINDER_2_MOTOR].m_params.Kd = ThreadParams->winderd; + MotorControlConfig[WINDER_3_MOTOR].m_params.Kd = ThreadParams->winderd; + MotorControlConfig[WINDER_4_MOTOR].m_params.Kd = ThreadParams->winderd; +#endif + } ReportWithPackageFilter(ThreadFilter,"Rockers activity",__FILE__,__LINE__,(int)Thread_Rockers_Bypass,RpWarning,(int)ThreadParams->bypassrockers,0); if(ThreadParams->bypassrockers) Thread_Rockers_Bypass = true; @@ -1032,13 +1078,14 @@ uint32_t ThreadPrepareState(void *JobDetails) IntersegmentLength = JobTicket->intersegmentlength; PrepareWaitCount = 0; +#ifndef FOUR_WINDERS status = ThreadPrepare_Tension (HARDWARE_DANCER_TYPE__LeftDancer, windertension); ReportWithPackageFilter(ThreadFilter,"ThreadPrepare_Tension Winder",__FILE__,HARDWARE_DANCER_TYPE__LeftDancer,PrepareWaitCount,RpWarning,(int)windertension,0); status = ThreadPrepare_Tension (HARDWARE_DANCER_TYPE__MiddleDancer, pullertension); ReportWithPackageFilter(ThreadFilter,"ThreadPrepare_Tension Puller",__FILE__,HARDWARE_DANCER_TYPE__MiddleDancer,PrepareWaitCount,RpWarning,(int)pullertension,0); status = ThreadPrepare_Tension (HARDWARE_DANCER_TYPE__RightDancer, feedertension); ReportWithPackageFilter(ThreadFilter,"ThreadPrepare_Tension Feeder",__FILE__,HARDWARE_DANCER_TYPE__RightDancer,PrepareWaitCount,RpWarning,(int)feedertension,0); - +#endif FirstCalcInJob = true; if(MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_RDRIVING].speedmaster == false) { @@ -1098,6 +1145,11 @@ uint32_t ThreadPrepareState(void *JobDetails) { HW_Motor_Id = ThreadMotorIdToMotorId[Motor_i]; Pid_Id = Motor_i;/*ThreadMotorIdToControlId[Motor_i];*/ +#ifdef FOUR_WINDERS + if (Motor_i == WINDER_2_MOTOR) Pid_Id = WINDER_MOTOR; + if (Motor_i == WINDER_3_MOTOR) Pid_Id = WINDER_MOTOR; + if (Motor_i == WINDER_4_MOTOR) Pid_Id = WINDER_MOTOR; +#endif MotorControlConfig[Motor_i].m_params.MAX = 1; MotorControlConfig[Motor_i].m_params.MIN = MotorsControl[Pid_Id].outputproportionalpowerlimit*-1; MotorControlConfig[Motor_i].m_params.Kd = MotorsControl[Pid_Id].derivativetime; @@ -1116,7 +1168,6 @@ uint32_t ThreadPrepareState(void *JobDetails) MotorControlConfig[Motor_i].m_preError = 0; MotorControlConfig[Motor_i].m_SetParam = 0;//need to update SetParams on presegment stage - HandleJobThreadControlParameters(JobTicket->threadparameters); //OVERRIDES CONFIGURATION PARAMETERS!!! temp_dt = MotorControlConfig[Motor_i].m_params.dt/0.001; MotorTiming[Motor_i] = (int)temp_dt; @@ -1208,9 +1259,26 @@ uint32_t ThreadPrepareState(void *JobDetails) } #ifndef TEST_PID_THREAD ControlIdtoMotorId[Motor_i] = AddControlCallback(NULL,ThreadControlCBFunction, eOneMillisecond,Control_Read_Dancer_Position,(IfTypeThread*0x100+Motor_i),ThreadMotorIdToDancerId[Motor_i],Motor_i); +#endif + } +#ifdef FOUR_WINDERS + if ((Motor_i == WINDER_2_MOTOR)||(Motor_i == WINDER_3_MOTOR)||(Motor_i == WINDER_4_MOTOR)) // dryer motor is speed controlled. later a speed sensor will be utilized, but for now it will n//ot be controlled + { + ReportWithPackageFilter(ThreadFilter,"Winder 2/3/4 Control",__FILE__,Motor_i,MotorControlConfig[WINDER_MOTOR].m_params.Kp,RpWarning,MotorControlConfig[WINDER_MOTOR].m_params.Ki,0); + if (ControlIdtoMotorId[Motor_i] != 0xFF) + { + if(RemoveControlCallback(ControlIdtoMotorId[Motor_i],ThreadControlCBFunction)!=OK) + ReportWithPackageFilter(ThreadFilter,"Remove Control Failed.",__FILE__,__LINE__,(int)Motor_i,RpError,(int)PoolerSpeedControlId,0); + CurrentControlledSpeed[Motor_i] = 0; + ControlIdtoMotorId[Motor_i] = 0xFF; + } +#ifndef TEST_PID_THREAD + ControlIdtoMotorId[Motor_i] = AddControlCallback(NULL,ThreadControlCBFunction, eOneMillisecond,Control_Read_Dancer_Position,(IfTypeThread*0x100+Motor_i),ThreadMotorIdToDancerId[Motor_i],Motor_i); +#endif #endif } } + HandleJobThreadControlParameters(JobTicket->threadparameters); //OVERRIDES CONFIGURATION PARAMETERS!!! #ifdef TEST_PID_THREAD testDancersControl(); @@ -1274,7 +1342,7 @@ uint32_t UpdatePidDuringRun(HardwarePidControl *request) void SetOriginMotorSpeed(float process_speed) { int Motor_i, HW_Motor_Id; - for (Motor_i = 0; Motor_i <= WINDER_MOTOR; Motor_i++) + for (Motor_i = 0; Motor_i < SCREW_MOTOR; Motor_i++) { HW_Motor_Id = ThreadMotorIdToMotorId[Motor_i]; //(Speed*uStep*PPR)/((2*PI*motor_Radius) @@ -1509,7 +1577,7 @@ char Endstr[150]; PoolerSpeedControlId = 0xFF; } - for ( Motor_i = 0;Motor_i <= WINDER_MOTOR;Motor_i++) + for ( Motor_i = 0;Motor_i < SCREW_MOTOR;Motor_i++) { if (ControlIdtoMotorId[Motor_i] != 0xFF) { @@ -1522,17 +1590,9 @@ char Endstr[150]; } Task_sleep(100); - for ( Motor_i = 0;Motor_i <= WINDER_MOTOR;Motor_i++) + for ( Motor_i = 0;Motor_i < SCREW_MOTOR;Motor_i++) { MotorStop(ThreadMotorIdToMotorId[Motor_i],Hard_Hiz); -#ifdef FOUR_WINDERS - if (Motor_i == WINDER_MOTOR) - { - MotorStop(Winder_2_Motor, Hard_Hiz); - MotorStop(Winder_3_Motor, Hard_Hiz); - MotorStop(Winder_4_Motor, Hard_Hiz); - } -#endif } MotorStop(HARDWARE_MOTOR_TYPE__MOTO_RLOADING,Hard_Hiz); diff --git a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c index 222b618d2..7c29a909b 100644 --- a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c +++ b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c @@ -76,7 +76,7 @@ void cartCART_EXTRACTED(WasteCartridgeEnum CartId) //{called from polling functi } WasteCartridgeEnum cartSELECT_CART(void) //{ if there is no SELECTED cartridge select the first cartridge in IN state. If there is none, return -1} { - Report("Cartridges select cart", __FILE__, __LINE__, CartState[WasteCartridge_middle], RpMessage, CartState[WasteCartridge_lower], 0); + //Report("Cartridges select cart", __FILE__, __LINE__, CartState[WasteCartridge_middle], RpMessage, CartState[WasteCartridge_lower], 0); if ((CartState[WasteCartridge_middle] == CartridgeStateSELECTED)||(CartState[WasteCartridge_middle] == CartridgeStateACTIVE)) return WasteCartridge_middle; if ((CartState[WasteCartridge_lower] == CartridgeStateSELECTED)||(CartState[WasteCartridge_lower] == CartridgeStateACTIVE)) diff --git a/Software/Stubs Collection/Procedures/Mid tank calibration.pproj b/Software/Stubs Collection/Procedures/Mid tank calibration.pproj index 0bb05e75b..655bbd099 100644 --- a/Software/Stubs Collection/Procedures/Mid tank calibration.pproj +++ b/Software/Stubs Collection/Procedures/Mid tank calibration.pproj @@ -1 +1,477 @@ -{"$id":"1","Inputs":{"$id":"2","$values":[{"$id":"3","Type":"Default","SelectionInputs":{"$id":"4","$values":[]},"DisplayName":"Check Tamper / Fan alarms","Description":"Check Tamper / Fan alarms","Key":"CheckTampers","Value":"1.0"},{"$id":"5","Type":"Default","SelectionInputs":{"$id":"6","$values":[]},"DisplayName":"Initial Heating on startup","Description":"Initial Heating on startup","Key":"InitialHeating","Value":"true"},{"$id":"7","Type":"Default","SelectionInputs":{"$id":"8","$values":[]},"DisplayName":"WCF Value","Description":"WCF Value","Key":"WCF_Value","Value":"40"},{"$id":"9","Type":"Default","SelectionInputs":{"$id":"10","$values":[]},"DisplayName":"AutoFill Mode","Description":"Controls the AutoFill Mode","Key":"AutoFillMode","Value":"3.0"}]},"Variables":{"$id":"11","$values":[]},"Resources":{"$id":"12","$values":[]},"Dialogs":{"$id":"13","$values":[]},"ID":"2bd29884-5eb9-4d27-be4e-6cfa31dc9f66","Name":"Mid tank calibration","Description":"This procedure lets the FSE to define values for cleaning, tamper alarms, initial heating, WCF value and automatic dispenser filling.","ApartmentState":"MTA","ReferenceAssemblies":{"$id":"14","$values":[{"$id":"15","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"16","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"17","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"18","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"19","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"20","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"21","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"22","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"23","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"24","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"25","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Scripts":{"$id":"26","$values":[{"$id":"27","Name":"Program.csx","IsEntryPoint":true,"Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.IO;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Entities;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.PMR.EmbeddedParameters;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\n\r\npublic class Program\r\n{\r\n\r\nprivate IProcedureContext context;\r\n\r\n\t//----------------------\r\n\tconst double \tSlop=0.92;\r\n\tconst double\tMIN_SLOP=0.7;\r\n\tconst double\tMAX_SLOP=1.4;\r\n\tconst double\tERROR_SLOP=-1;\r\n\tconst double\tMIN_50cc_on_volt=2.3;\r\n\tconst double\tMAX_50cc_on_volt=3.2;\r\n\tconst double\tERROR_50cc_on_volt=-1;\r\n\tdouble CartSizeLiter = 1.0;\r\n\t\r\n\tint [] Convert_Midtank_No = new Int32 [8] {1,3,5,7,2,4,6,8};\r\n\tuint [,] ADC_Add_Chnl = new uint [8,2]\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x44,0x20},\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x44,0x08},\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x46,0x80},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x46,0x20},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x44,0x10},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x44,0x04},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x46,0x40},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x46,0x10},\r\n\t\t\t\t\t\t\t\t\t\t\t};\r\n\t\r\n\t\r\n\tconst Int32\tF3_VALVE_OUT\t=\t0x600008E2\t;\r\n\tstring Machine_SN\t;\r\n\tprivate const string FILE_PATH = @\"C:\\MidTankLog\\\";\r\n\tstring File_name;\r\n\tdouble [,] voltage_array = new double[9,9];\r\n\tstring [] Parameter = new string[5] {\"\\t\",\"Empty [V]\",\"100cc [V]\",\"800cc [V]\",\" b [L/V] \"};\r\n\t\tdouble Full_Cartridge=1;\t// 1 litter less 100 cc\r\n\t\r\n\t//----------------------\r\n\tconst Int32 I2C_ID = 2;\r\n\t//const Int32 I2C_Slave_Add = 0x46; //must be 0x40, 0x44 or 0x46\r\n\t//----------------------\r\n\t\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\tthis.context = context;\r\n\t\r\n\tInt32 midtankno = 0;\r\n\tdouble Full_Point=0;\t\t\t//on Voltage\r\n\tdouble resualt;\r\n\tdouble Sum=0 ;\r\n\tdouble Old_Sum=0 ;\r\n\t\r\n\r\n\tif (!Directory.Exists(FILE_PATH))\r\n\t\t{\r\n\t\t\tDirectory.CreateDirectory(FILE_PATH);\r\n\t\t}\t\t\t\r\n\r\n\r\n \t//Machine_SN = context.GetInput(\"Midtank_SN\");\r\n var response = context.RequestUserInputFor(\"Mid Tank Serial Number\", \"Enter Midtank S/N:\");\r\n\tcontext.Write(\"\\n\");\r\n\tMachine_SN = response;\r\n\tcontext.WriteLine(Machine_SN);\r\n\tFile_name= FILE_PATH +Machine_SN + DateTime.Now.ToString(\"MM_dd_yyyy_HH_mm_ss\")+\".csv\";\r\n\tcontext.Write(File_name);\r\n \tcontext.WriteToFile(File_name,\"MidTank S/N:,\" + Machine_SN); \r\n\t\r\n\t\r\n\r\n\t//midtankno = context.GetInput(\"MidTankId\");\r\n\tvar response1 = context.RequestUserInputFor(\"Mid Tank Number\", \"Enter Midtank number to calibrate (1-8):\");\r\n\tcontext.WriteLine(response1);\r\n\tmidtankno = Int32.Parse(response1);\r\n \tcontext.AppendToFile(File_name,\"MidTank Number:\\t\" + response1);\r\n\r\n\r\n\tvar response2 = context.RequestUserInputFor(\"Cartridge size\", \"Enter enter cartridge size in ml (1000/700/500):\");\r\n\tcontext.WriteLine(response2);\r\n\tint Cart_size = response2;\r\n \tcontext.AppendToFile(File_name,\"Cartrideg size:\\t\" + response2);\r\n\r\n\r\n string box_msg = \"Please Insert cartridge with\" +Cart_size+\"cc (Lubbricant add 500cc only) \";\r\n// string box_title = \"Midatnk empty\";\r\n// context.ShowInfo(box_msg, box_title);\r\n\tcontext.ShowInfo(box_msg);\r\n\r\n\t//int CartInserted = 0;\r\n\t//while (CartInserted == 0)\r\n\t//\tCartInserted = context.GetInput(\"insertCartridge\");\r\n\t\r\n\tCartSizeLiter = Cart_size/1000;\r\n\t\r\n\topen_valve(midtankno,1,1)\t\t;\t//open Air valve\r\n\topen_valve(midtankno,0,1)\t\t;\t//open Ink valve\r\n\tInt32 i=0; \r\n\twhile (i<60*15)\t\t\t\t\t//check for 15 minitus \r\n\t{\r\n\t\tSum=0;\r\n\t\tfor (Int32 j=0;j<30;j++)\r\n\t\t{\r\n\t\t\tresualt=read_pressure_sensor(midtankno);\r\n\t\t\tcontext.AppendToFile(File_name,resualt+\",mV\");\r\n\t\t\tSum=Sum+resualt;\r\n\t\t\tThread.Sleep(1000);\r\n\t\t}\r\n\t\ti=i+1;\r\n\t\tif (Sum>Old_Sum)\r\n\t\t\tOld_Sum=Sum-Old_Sum;\r\n\t\telse\r\n\t\t\tOld_Sum=Old_Sum-Sum;\r\n\t\t\t\r\n\t\tif ( Old_Sum <0.02)\t\r\n\t\t\ti=60*15;\t\t//end \r\n\t\tOld_Sum=Sum;\r\n\t}\r\n\tFull_Point=Sum/30;\r\n\t\r\n\tbox_msg = \"Send file\" + File_name +\"to Mati\"; \r\n\tcontext.ShowInfo(box_msg);\r\n\t\r\n\t\r\n\t//\tcontext.Send(\"StubFpgaWriteRegRequest\" ,F3_VALVE_OUT, 0x000f);\t\t// open all valve air of midtank and close all ink of midtank\r\n\t//\tThread.Sleep(500);\r\n\t//\tcontext.Send(\"StubFpgaWriteRegRequest\" ,F3_VALVE_OUT, 0x00ff);\t\t// open all valve air of midtank and close all ink of midtank\r\n\t//\tThread.Sleep(500);\r\n\t//\tcontext.Send(\"StubFpgaWriteRegRequest\" ,F3_VALVE_OUT, 0x0fff);\t\t// open all valve air of midtank and close all ink of midtank\r\n\t//\tThread.Sleep(500);\r\n\t//\tcontext.Send(\"stubFpgaWriteRegRequest\" ,F3_VALVE_OUT, 0xffff);\t\t// open all valve air and ink of midtank\r\n\t//\r\n\t//\tThread.Sleep(2500);\r\n\r\n\t//\tThread.Sleep(1000);\t\r\n\t\t\r\n\t//\tread_pressure_sensor(1);\r\n \t\t\r\n\t//\tbox_msg =\"Insert 100cc of appropriate ink/lube to each midtank\\n\\t1.black ink\\n\\t2. Magenta ink\\n\\t3. Transparent ink\\n\\t4. Cleaner\\n\\t5. Cyan ink\\n\\t6. Yellow ink\\n\\t7. Spot color\\n\\t8. Lubricant/n\";\r\n // context.ShowInfo(box_msg);\r\n//\r\n\t//\tread_pressure_sensor(2);\r\n\r\n\t\t\t\t\t//\tvoltage_array[3,2]=2.5;\r\n\t\t\r\n//\t\tbox_msg = \"Add another 700cc for ink and TI \\nFor Lubbricant add 500cc only.\"; \r\n//\t\tcontext.ShowInfo(box_msg);\r\n//\t\tread_pressure_sensor(3);\r\n//\t\t\t\tcontext.Send(\"stubFpgaWriteRegRequest\" ,F3_VALVE_OUT, 0x0000);\t\t// close all valve air and ink of midtank\r\n\t\t\t\t\t\t\t\t\t//\t\t\tvoltage_array[3,3]=4.5;\r\n\tclose_valve(midtankno,1,1)\t\t;\t//close Air valve\r\n\tclose_valve(midtankno,0,1)\t\t;\t//close Ink valve\r\n\r\n//\t\tcalc_slop();\r\n//\t\tprint_table();\r\n\t\t\r\n//\t\tinsert_slop_t_eeprom(Full_Point, midtankno);\r\n\t\tinsert_slop_t_eeprom(Full_Point, midtankno);\r\n\t\tbox_msg =\"Turn Power Off and On to finish the calibration.\";\r\n context.ShowInfo(box_msg);\r\n\t\r\n\t}\r\n\r\nint calc_slop()\r\n\t{\r\n\tcontext.Write(\"\\n \");\r\n\t\t\r\n\tdouble delta;\r\n\tfor (uint i=1;i<9;i++)\r\n\t\t{\r\n\t\t\tdelta=voltage_array[i,3]-voltage_array[i,2];\r\n\t\t\r\n\t\t\tcontext.Write(\"\\nMidtank No:\"+i +\"=\"+delta);\r\n//\t\t\tif (i==8)\r\n\t\t\t\tdelta=CartSizeLiter/delta;\t\t\t\t\t\t\t\t\t\t\t\t//0.5 litter on lubricant\t\t\t\r\n//\t\t\telse \r\n//\t\t\t\tdelta=CartSizeLiter/delta;\t\t\t\t\t\t\t\t\t\t\t\t//0.7 litter\r\n\t\t\t\t\r\n\t\t\tif ((deltaMAX_SLOP)) \r\n\t\t\t{\r\n\t\t\t\tvoltage_array[i,4]=ERROR_SLOP;\r\n\t\t//\t\tcontext.Write(\"123\");\r\n\t\t\t}\r\n\t\telse if\t((voltage_array[i,2]MAX_50cc_on_volt ))\r\n\t\t\t\t\tvoltage_array[i,4]=ERROR_SLOP;\r\n\t\telse\r\n\t\tvoltage_array[i,4]=delta;\r\n\t\t}\r\n\treturn 1;\r\n\t}\r\n\r\n\r\n\tint\tinsert_slop_t_eeprom( double FullPoint,Int32 midtankno)\r\n{\r\n//\tcontext.Write(\"\\n \");\r\n\r\n\tMidTankDataSetupRequest midTankDataSetupRequest = new MidTankDataSetupRequest();\r\n\r\n\r\n//\tfor (uint i=1;i<9;i++)\r\n//\t{\r\n//\t\tif (voltage_array[i,4]!= ERROR_SLOP)\r\n//\t\t{\r\n\t\tMidTankData midTankData = new MidTankData();\r\n\t\tmidTankData.MidTankId = Convert.ToUInt32 (midtankno-1);\r\n\t\tmidTankData.InitialOffsetA =FullPoint - (Full_Cartridge-0.1)/Slop;\r\n\t\tmidTankData.SlopeB = Slop;\r\n\t\t\r\n\t\tcontext.Write(\"\\nMidtank No:\" + midtankno + \"=\\tVoltage Zero is =\"+(FullPoint - (Full_Cartridge-0.1)/Slop)+\"\\tSlop=\"+ Slop);\r\n\t\tcontext.AppendToFile(File_name,\"\\nMidtank No:\" + midtankno + \"=\\tVoltage Zero is =\"+(FullPoint - (Full_Cartridge-0.1)/Slop)+\"\\tSlop=\"+ Slop);\r\n\r\n\t\t\r\n\t\tmidTankDataSetupRequest.MidTankInfo.Add(midTankData);\r\n\t\r\n\t//\t}\r\nvar response = context.Send(midTankDataSetupRequest);\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t//}\r\n\r\n\r\nreturn\t1;\r\n}\r\n\r\n//\r\n//\r\n//int\t\tprint_table()\r\n//\t\t{\r\n//\r\n//\t\tfor (uint i=0;i<5;i++)\r\n//\t\t\t{\r\n//\t\t\t\tcontext.AppendToFile(File_name,Parameter[i]+\"\\t\"+voltage_array[1,i]+\"\\t\"+voltage_array[2,i]+\"\\t\"+voltage_array[3,i]+\"\\t\"+voltage_array[4,i]+\"\\t\"+voltage_array[5,i]+\"\\t\"+voltage_array[6,i]+\"\\t\"+voltage_array[7,i]+\"\\t\"+voltage_array[8,i]) ;\r\n// } \r\n// \r\n//\t\r\n//\t\t\treturn 1;\r\n//\r\n//\t\t}\r\n\r\n//start mat\r\n\r\nint adc_configuration(uint I2C_Slave_Add,uint channel ) \r\n\t{\r\n\tStubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();\r\n\tstubI2CWriteBytesRequest.I2CId = I2C_ID;\r\n\tstubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add;\r\n\t\r\n\tUInt32 uInt32 = new UInt32();\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(0x00);//Byte 0 to write\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(channel);//Byte 1 to Write, must be 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02 or 0x01 for different channels\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(0x80);//Byte 2 to Write\r\n\t\r\n\tvar response = context.Send(stubI2CWriteBytesRequest);\r\n\t\r\n\treturn 1;\r\n\t}\r\n\r\n\r\nint adc_set_for_read_ch(uint I2C_Slave_Add) \r\n\t{\r\n\tStubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();\r\n\tstubI2CWriteBytesRequest.I2CId = I2C_ID;\r\n\tstubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add;\r\n\t\r\n\tUInt32 uInt32 = new UInt32();\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(0x01);//Byte 0 to write\r\n\r\n\tvar response = context.Send(stubI2CWriteBytesRequest);\r\n\t\r\n\treturn 1;\r\n\t}\r\n\r\n\r\n\r\n\r\ndouble adc_read_ch(uint I2C_Slave_Add) \r\n\t{\r\n\tStubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest();\r\n\tstubI2CReadBytesRequest.I2CId = I2C_ID;\r\n\tstubI2CReadBytesRequest.SlaveAddress = I2C_Slave_Add;\r\n\tstubI2CReadBytesRequest.NumberOfBytesToRead = 2; // Number of bytes to read\r\n\r\n\tvar response1 = context.Send(stubI2CReadBytesRequest);\r\n\tuint temph=0;\r\n\tuint templ=0;\r\n\tuint temp;\r\n\tdouble calc;\r\n\tdouble calc1;\r\n\tdouble calc2;\r\n\t\t\ttemph=response1.ReadBytes[0];\r\n\t\t\ttempl=response1.ReadBytes[1];\r\n\t\t\ttemp = (temph << 8) | templ;\r\n\t\t\ttemp=temp & 0x0fff;\r\n\t\t\t\t\r\n\t\t\tcalc = (double)temp *2.5 / 4096.0;\r\n//\t\t\tcontext.Write(\"ADC [volts]:\\t\");\r\n//\t\t\tcontext.Write(calc+\"\\t\");\r\n\t\t\r\n\t\t\tcalc1 = (1.96- calc) * 4.64 + 1.96;\r\n\t\t\tcontext.Write(\"Vsensor [volts]:\\t\");\r\n\t\t\tcontext.Write(calc1 + \"\\n\");\r\n\r\n\t//\t\tvoltage_array[table_index_x,table_index_y]=calc1;\r\n\t\r\n\treturn calc1;\r\n\t}\r\n\r\ndouble\t\tread_pressure_sensor(Int32 i )\r\n\t{\r\ndouble resualt =0 ;\r\n\t\t switch (i)\r\n {\r\n case 1:\r\n\t\t\tadc_configuration(0x44,0x20);\t\t//a2d_address 0x44 channel channel 2\r\n\t\t\tadc_set_for_read_ch(0x44);\r\n\t\t\tresualt=adc_read_ch(0x44);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 2:\r\n\t\t\tadc_configuration(0x44,0x08);\t\t//a2d_address 0x44 channel channel 4\r\n\t\t\tadc_set_for_read_ch(0x44);\r\n\t\t\tresualt=adc_read_ch(0x44);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 3:\r\n\t\t\tadc_configuration(0x46,0x80);\t\t//a2d_address 0x46 channel channel 0\r\n\t\t\tadc_set_for_read_ch(0x46);\r\n\t\t\tresualt=adc_read_ch(0x46);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 4:\r\n\t\t\tadc_configuration(0x46,0x20);\t\t//a2d_address 0x46 channel channel 2\r\n\t\t\tadc_set_for_read_ch(0x46);\r\n\t\t\tresualt=adc_read_ch(0x46);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 5:\r\n\t\t\tadc_configuration(0x44,0x10);\t\t//a2d_address 0x44 channel channel 3\r\n\t\t\tadc_set_for_read_ch(0x44);\r\n\t\t\tresualt=adc_read_ch(0x44);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 6:\r\n\t\t\tadc_configuration(0x44,0x04);\t\t//a2d_address 0x44 channel channel 5\r\n\t\t\tadc_set_for_read_ch(0x44);\r\n\t\t\tresualt=adc_read_ch(0x44);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 7:\r\n\t\t\tadc_configuration(0x46,0x40);\t\t//a2d_address 0x46 channel channel 1\r\n\t\t\tadc_set_for_read_ch(0x46);\r\n\t\t\tresualt=adc_read_ch(0x46);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 8:\r\n\t\t\tadc_configuration(0x46,0x10);\t\t//a2d_address 0x46 channel channel 3\r\n\t\t\tadc_set_for_read_ch(0x46);\r\n\t\t\tresualt=adc_read_ch(0x46);\r\n\t\tbreak;\r\n\t\t\r\n default:\r\n context.Write(\"Error\");\r\n\r\n break;\r\n\t }\t\r\n\t\t\r\n\t\treturn resualt;\r\n\t}\t\r\n\r\n\r\n//--------------------------------\r\nint open_valve (int valve_nm,int valve_type,int check_valve)\t\t//valve_type=0 is Air ,1 is Ink ; check_valve=1 send feedbak\r\n{\r\n\tint temp1=Convert_Midtank_No[valve_nm-1]\t;\r\n\r\n\tstring temp;\r\n\tSetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 1);\t\r\n\t\r\n\t\tif (check_valve!=0)\r\n\t\t{\r\n\t\t\ttemp=\"Air\";\r\n\t\t\tif (valve_type==1)\r\n\t\t\ttemp=\"Ink\";\r\n\t\t\t\t\r\n\t\t\tif(!context.ShowWarningQuestion(\"Did \" + temp + \"Valve of Midtank \" + valve_nm +\" open?\"))\r\n\t\t\t\t{\r\n//\t\t\t\t\tUnits_status[(valve_nm-1)*3+valve_type,1]=\"Fail\";\r\n\t\t\t\t\tcontext.Write(temp +\"Valve\\tFail\\n\");\t\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\telse \r\n\t\t\t\t{\r\n//\t\t\t\t\tUnits_status[(valve_nm-1)*3+valve_type,1]=\"Pass\";\r\n\t\t\t\t\tcontext.Write(temp +\"Valve\\tOpen\\n\");\t\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t}\r\n\t\t\t\r\n\t\t}\r\n\t\treturn 1;\r\n\r\n}\r\n//--------------------------------\t\r\nint close_valve (int valve_nm,int valve_type,int check_valve)\r\n{\r\n\tint temp1=Convert_Midtank_No[valve_nm-1];\t\r\n\r\n\tstring temp;\r\n\tSetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 0);\r\n\tif (check_valve!=0)\r\n\t\t{\r\n\t\t\ttemp=\"Air\";\r\n\t\t\tif (valve_type==1)\r\n\t\t\ttemp=\"Ink\";\r\n\t\t\t\t\r\n\t\t\tif(!context.ShowWarningQuestion(\"Did \" + temp +\" Valve of Midtank \" + valve_nm +\" close?\"))\r\n\t\t\t\t{\r\n//\t\t\t\t\tUnits_status[(valve_nm-1)*3+valve_type,1]=\"Fail\";\r\n\t\t\t\t\tcontext.Write(temp +\"Valve\\tFail\\n\");\t\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\telse \r\n\t\t\t\t{\r\n//\t\t\t\t\tUnits_status[(valve_nm-1)*3+valve_type,1]=\"Pass\";\r\n\t\t\t\t\tcontext.Write(temp +\"Valve\\tclose\\n\");\t\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t}\t\t\t\r\n\t\t}\r\n\treturn 1;\r\n\r\n}\r\n\r\npublic Int32 SetBit(Int32 Adr, Int32 BitNo, Int32 Bit)\r\n{\r\n\tInt32 BitMask;\r\n\tvar RetVal = Fpga_Read_Reg(Adr);\r\n\tInt32 RV = (Int32) RetVal.Value;\r\n\t\r\n\tif (Bit == 0x1) \r\n\t{\r\n\t\tBitMask = 0x1 << BitNo;\r\n\t\tRV = RV | BitMask;\r\n\t\tFpga_Write_Reg( Adr, RV );\r\n\t}\r\n\telse if (Bit == 0x0)\r\n\t{\r\n\t\tBitMask = ~(0x1 << BitNo);\r\n\t\tRV = RV & BitMask;\r\n\t\tFpga_Write_Reg(Adr, RV );\t\r\n\t}\r\n\treturn 1;\r\n}\r\n\r\nint Fpga_Write_Reg(Int32 Addr, Int32 Data)\r\n{\r\n\tvar response = context.Send(\"StubFpgaWriteRegRequest\" ,Addr, Data);\r\n\t\r\n\treturn 1;\r\n}\r\n\r\n\r\n\r\nStubFpgaReadRegResponse Fpga_Read_Reg(Int32 Addr)\r\n{\r\n var response = context.Send(\"StubFpgaReadRegRequest\" ,Addr);\r\n\tresponse.Value = response.Value & 0xffff;\r\n\t\r\n\treturn response;\r\n}\r\n}"},{"$id":"28","Name":"Service.csx","IsEntryPoint":false,"Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}"}]}} \ No newline at end of file +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Drawing; +using Google.Protobuf; +using Tango.BL.Entities; +using Tango.BL.Enumerations; +using Tango.PMR.Stubs; +using Tango.PMR.Diagnostics; +using Tango.FSE.Common.Connection; +using Tango.FSE.Common.Diagnostics; +using Tango.FSE.Procedures; +using System.IO; +using System.Windows.Forms; +using Tango.PMR.EmbeddedParameters; + +public class Program +{ +const double MIN_SLOP=0.7; +const double MAX_SLOP=1.4; +const double ERROR_SLOP=-1; +const double MIN_50cc_on_volt=2.3; +const double MAX_50cc_on_volt=3.2; +const double ERROR_50cc_on_volt=-1; + +int [] Convert_Midtank_No = new Int32 [8] {1,3,5,7,2,4,6,8}; +uint [,] ADC_Add_Chnl = new uint [8,2] { + {0x44,0x20}, + {0x44,0x08}, + {0x46,0x80}, + {0x46,0x20}, + {0x44,0x10}, + {0x44,0x04}, + {0x46,0x40}, + {0x46,0x10}, + }; + + +const Int32 F3_VALVE_OUT = 0x600008E2 ; +string Machine_SN ; +private const string FILE_PATH = @"C:\MidTankLog\"; +string File_name; +double Full_Cartridge=1000; // on CC +double Slop=0.92; +//---------------------- +const Int32 I2C_ID = 2; +//const Int32 I2C_Slave_Add = 0x46; //must be 0x40, 0x44 or 0x46 +//---------------------- + + +private IProcedureContext context; + + + + + public void OnExecute(IProcedureContext context) + { + + + Int32 Timout ; + Int32 Interval; + Int32 midtankno = 0; + double Full_Point=0; //on Voltage + double resualt; + double Sum=0 ; + double Old_Sum=0 ; + double Start_Point=0; + + + if (!Directory.Exists(FILE_PATH)) + { + Directory.CreateDirectory(FILE_PATH); + } + + + + var response =context.RequestUserInputFor("Enter Midtank S/N: ", ""); + context.Write("\n"); + Machine_SN = response; + context.WriteLine(Machine_SN); + File_name= FILE_PATH +Machine_SN + DateTime.Now.ToString("MM_dd_yyyy_HH_mm_ss")+".csv"; + context.Write(File_name); + context.WriteToFile(File_name,"MidTank S/N:," + Machine_SN); + + + var response1 =context.RequestUserInputFor("Enter Midtank number to calibrate (1-8):", ""); + context.WriteLine(response1); + midtankno = Int32.Parse(response1); + context.AppendToFile(File_name,"MidTank Number:\t" + response1); + if (midtankno==8) + { + Slop=1; + Timout=60; //60 minutes + Interval=60; //60 second + } + else + { + Slop=0.92; + Timout=10*2; //10 minutes + Interval=30; //30 second + + } + var response10 =context.RequestUserInputFor("Enter Cartridge Valume on CC (500-1500):", ""); + context.WriteLine(response10); + Full_Cartridge = double.Parse(response10); + context.AppendToFile(File_name,"Cartridge Valume:\t" + response10); + context.AppendToFile(File_name,"Slop value:\t" + Slop); + + + DialogResult result = MessageBox.Show("Are you sure to calibrate Midtank No: "+ midtankno + " with "+ Full_Cartridge +" CC" , "Warning",MessageBoxButtons.YesNo); + if(result == DialogResult.Yes) + { + + + + string box_msg = "Please Insert cartridge "; + + MessageBox.Show(box_msg); + + open_valve(midtankno,1,1) ; //open Air valve + open_valve(midtankno,0,1) ; //open Ink valve + Int32 i=0; + while (iOld_Sum) + Old_Sum=Sum-Old_Sum; + else + Old_Sum=Old_Sum-Sum; + + + if ((check_valve(midtankno,1) != 0) && (check_valve(midtankno,0) != 0)) + { + i++; + if ( Old_Sum <0.02) + i=Timout+1; //end + Old_Sum=Sum; + } + else + { + open_valve(midtankno,1,0) ; //open Air valve + open_valve(midtankno,0,0) ; //open Ink valve + Old_Sum=0; + + } + } + Full_Point=Sum/Interval; + + + close_valve(midtankno,1,1) ; //close Air valve + close_valve(midtankno,0,1) ; //close Ink valve + + + if (insert_slop_t_eeprom(Full_Point, midtankno,Start_Point)==0) + { + box_msg ="Turn Power Off and On to finish the calibration."; + MessageBox.Show(box_msg); + + + context.AddResult(ResultType.Passed, "Test passed", "Test passed."); + + } + else + { + box_msg ="Calibration error"; + MessageBox.Show(box_msg); + + + context.AddResult(ResultType.Failed, "Test Fail", "Test Fail."); + + } + } + +} + + + int insert_slop_t_eeprom( double FullPoint,Int32 midtankno, double StartPoint) +{ +// context.Write("\n "); + + StartPoint=FullPoint-StartPoint; + StartPoint=StartPoint/Full_Cartridge; + if ((StartPoint>0.7 ) && (StartPoint>1.3 )) + { + MidTankDataSetupRequest midTankDataSetupRequest = new MidTankDataSetupRequest(); + + MidTankData midTankData = new MidTankData(); + midTankData.MidTankId = Convert.ToUInt32 (midtankno-1); + midTankData.InitialOffsetA =FullPoint - (Full_Cartridge/1000-0.1)/Slop; + midTankData.SlopeB = Slop; + + context.Write("\nMidtank No:" + midtankno + "=\tVoltage Zero is ="+(FullPoint - (Full_Cartridge/1000-0.1)/Slop)+"\tSlop="+ Slop); + context.AppendToFile(File_name,"\nMidtank No:" + midtankno + "=\tVoltage Zero is ="+(FullPoint - (Full_Cartridge/1000-0.1)/Slop)+"\tSlop="+ Slop); + + + midTankDataSetupRequest.MidTankInfo.Add(midTankData); + + + var response =context.Send(midTankDataSetupRequest); + + return 0; + } + else + context.Write("\nError"); + context.AppendToFile(File_name,"\n Slop Error"); + return 1; + + + } + + + +int adc_configuration(uint I2C_Slave_Add,uint channel ) + { + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add; + + UInt32 uInt32 = new UInt32(); + stubI2CWriteBytesRequest.BytesTWrite.Add(0x00);//Byte 0 to write + stubI2CWriteBytesRequest.BytesTWrite.Add(channel);//Byte 1 to Write, must be 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02 or 0x01 for different channels + stubI2CWriteBytesRequest.BytesTWrite.Add(0x80);//Byte 2 to Write + + var response =context.Send(stubI2CWriteBytesRequest); + + return 1; + } + + +int adc_set_for_read_ch(uint I2C_Slave_Add) + { + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add; + + UInt32 uInt32 = new UInt32(); + stubI2CWriteBytesRequest.BytesTWrite.Add(0x01);//Byte 0 to write + + var response =context.Send(stubI2CWriteBytesRequest); + + return 1; + } + + + + +double adc_read_ch(uint I2C_Slave_Add) + { + StubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest(); + stubI2CReadBytesRequest.I2CId = I2C_ID; + stubI2CReadBytesRequest.SlaveAddress = I2C_Slave_Add; + stubI2CReadBytesRequest.NumberOfBytesToRead = 2; // Number of bytes to read + + var response1 =context.Send(stubI2CReadBytesRequest); + uint temph=0; + uint templ=0; + uint temp; + double calc; + double calc1; + double calc2; + temph=response1.ReadBytes[0]; + templ=response1.ReadBytes[1]; + temp = (temph << 8) | templ; + temp=temp & 0x0fff; + + calc = (double)temp *2.5 / 4096.0; + + calc1 = (1.96- calc) * 4.64 + 1.96; + context.Write("Vsensor [volts]:\t"); + context.Write(calc1 + "\n"); + + + return calc1; + } + +double read_pressure_sensor(Int32 i ) + { +double resualt =0 ; + switch (i) + { + case 1: + adc_configuration(0x44,0x20); //a2d_address 0x44 channel channel 2 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 2: + adc_configuration(0x44,0x08); //a2d_address 0x44 channel channel 4 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 3: + adc_configuration(0x46,0x80); //a2d_address 0x46 channel channel 0 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + case 4: + adc_configuration(0x46,0x20); //a2d_address 0x46 channel channel 2 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + case 5: + adc_configuration(0x44,0x10); //a2d_address 0x44 channel channel 3 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 6: + adc_configuration(0x44,0x04); //a2d_address 0x44 channel channel 5 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 7: + adc_configuration(0x46,0x40); //a2d_address 0x46 channel channel 1 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + case 8: + adc_configuration(0x46,0x10); //a2d_address 0x46 channel channel 3 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + default: + context.Write("Error"); + + break; + } + + return resualt; + } + + +//-------------------------------- +int open_valve (int valve_nm,int valve_type,int check_valve) //valve_type=0 is Air ,1 is Ink ; check_valve=1 send feedbak +{ + int temp1=Convert_Midtank_No[valve_nm-1] ; + + string temp; + SetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 1); + + if (check_valve!=0) + { + temp="Air"; + if (valve_type==1) + temp="Ink"; + + DialogResult result = MessageBox.Show("Did " + temp + "Valve of Midtank " + valve_nm +" open?", "Warning",MessageBoxButtons.YesNo); + if(result == DialogResult.No) + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Fail"; + context.Write(temp +"Valve\tFail\n"); + return 0; + } + else + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Pass"; + context.Write(temp +"Valve\tOpen\n"); + return 1; + } + + } + return 1; + +} +//-------------------------------- +int close_valve (int valve_nm,int valve_type,int check_valve) +{ + int temp1=Convert_Midtank_No[valve_nm-1]; + + string temp; + SetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 0); + if (check_valve!=0) + { + temp="Air"; + if (valve_type==1) + temp="Ink"; + + DialogResult result = MessageBox.Show("Did " + temp +" Valve of Midtank " + valve_nm +" close?", "Warning",MessageBoxButtons.YesNo); + if(result == DialogResult.No) + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Fail"; + context.Write(temp +"Valve\tFail\n"); + return 0; + } + else + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Pass"; + context.Write(temp +"Valve\tclose\n"); + return 1; + } + } + return 1; + +} + +public Int32 SetBit(Int32 Adr, Int32 BitNo, Int32 Bit) +{ + Int32 BitMask; + Int32 RetVal; + RetVal = Fpga_Read_Reg(Adr); + Int32 RV = RetVal ; + + if (Bit == 0x1) + { + BitMask = 0x1 << BitNo; + RV = RV | BitMask; + Fpga_Write_Reg( Adr, RV ); + } + else if (Bit == 0x0) + { + BitMask = ~(0x1 << BitNo); + RV = RV & BitMask; + Fpga_Write_Reg(Adr, RV ); + } + return 1; +} + +int Fpga_Write_Reg(Int32 Addr, Int32 Data) +{ + var response =context.Send("StubFpgaWriteRegRequest" ,Addr, Data); + + return 1; +} + + +Int32 check_valve (Int32 valve_nm,int valve_type) +{ + Int32 temp1=Convert_Midtank_No[valve_nm-1]; + + var response =context.Send("StubFpgaReadRegRequest" ,F3_VALVE_OUT); + Int32 RV =(Int32) response.Value & 0xffff ; + RV = RV & ( 0x1 << (((valve_type+1)*8)- temp1)); + return RV; + +} + + +Int32 Fpga_Read_Reg(Int32 Addr) +{ + +context.Write("123"); + + var response =context.Send("StubFpgaReadRegRequest" ,Addr); + context.Write("456"); + + Int32 RV= (Int32) response.Value & 0xffff; + context.Write("789"); + + return RV; +} + + + +} \ No newline at end of file diff --git a/Software/Stubs Collection/Procedures/Priming1.pproj b/Software/Stubs Collection/Procedures/Priming1.pproj new file mode 100644 index 000000000..adfed3f3e --- /dev/null +++ b/Software/Stubs Collection/Procedures/Priming1.pproj @@ -0,0 +1,1015 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Drawing; +using Google.Protobuf; +using Tango.BL.Entities; +using Tango.BL.Enumerations; +using Tango.PMR.Stubs; +using Tango.PMR.Diagnostics; +using Tango.FSE.Common.Connection; +using Tango.FSE.Common.Diagnostics; +using Tango.FSE.Procedures; +using System.IO; +using System.Diagnostics; +using System.Windows.Forms; + + +public class Program +{ + + +private IProcedureContext context; + +//---------------------Start Command ---------------- +const Int32 CMD_RUN = 0; //Run on Pulse Per Secound .positive run Up and negative run Down b +const Int32 CMD_STOP= 1; //0;Hard stop(Defualt);1-Soft stop;2-Hard Hiz;3-Soft Hiz +const Int32 CMD_VALVE= 2; //0-to Midtank ,1-to head +const Int32 CMD_DLY = 3; //delay in Seconds . +const Int32 CMD_TIME= 4; //Print Time . +const Int32 CMD_PRESS= 5; //return from Delay loop when pressure is high (on mBAR) . +const Int32 CMD_LOOP_NM=6; //NUMBER OF counter +const Int32 CMD_LOOP= 7; //jump up(+) or down(-) command u +const Int32 CMD_MTV_OPEN = 8; //0 Air ; 1 Ink +const Int32 CMD_MTV_CLOSE= 9; //0 Air ; 1 Ink +const Int32 CMD_LBL= 10; //label for user +const Int32 CMD_SMP= 11; //sample rate ,defualt 100msec (1); for 1 second is 10. +const Int32 CMD_PRESL= 12; //return from Delay loop when pressure is low (on mBAR) . + +const Int32 CMD_END = 13; //end loop . + + +Int32[] BuildUp_Table = new int [] +{ + CMD_VALVE,1, + CMD_PRESL,200, + CMD_DLY,200, + + CMD_LOOP_NM,3, + + CMD_VALVE,0, + CMD_DLY,1, + CMD_VALVE,1, + CMD_DLY,1, + CMD_LOOP,-4, + + CMD_VALVE,0, + CMD_RUN,1068, + CMD_PRESS,1000, //mbar --> 1000 = 100% work, 4000 = 200% work, 350 = 20% work + CMD_DLY,150, + CMD_LBL,1, + CMD_PRESS,2000, //mbar --> 2000 = 100% work, 4000 = 200% work, 350 = 20% work + CMD_DLY,60, + CMD_LBL,2, + CMD_PRESS,3000, + CMD_DLY,60, // to limit + CMD_STOP,0, + CMD_VALVE,1, + CMD_END,3, +}; + + +Int32[] Up_Table = new int [] +{ + CMD_VALVE,1, + CMD_PRESL,200, + CMD_DLY,200, + + CMD_PRESS,3000, //mbar --> 1000 = 100% work, 4000 = 200% work, 350 = 20% work + CMD_RUN,534, // 100% + CMD_DLY,120, + CMD_STOP,0, + CMD_END,3, +}; +Int32 Dispenser_sample_rate= 1; + + string path = @"C:\Dispenser_setup\Log\"; +//---------------------- +const UInt32 I2C_ID = 4; //MCU_I2C4 +const UInt32 TCA9548A_address = 0xE2; +const UInt32 I2C_Slave_Low_Add = 0xA0; //eeprom address - 64k low +const UInt32 I2C_Slave_High_Add = 0xA2; //eeprom address - 64k High +//---------------------- +byte [] EEPROM_Data = new byte [128]; + + +//---------------------End Command ---------------- + +const Int32 Dispenser_Motor1 = 6; +const Int32 Dispenser_Motor2 = 7; +const Int32 Dispenser_Motor3 = 8; +const Int32 Dispenser_Motor4 = 9; +const Int32 Dispenser_Motor5 = 10; +const Int32 Dispenser_Motor6 = 11; +const Int32 Dispenser_Motor7 = 12; +const Int32 Dispenser_Motor8 = 13; + +const Int32 AN_IDS_PRESSENS_1 = 2; +const Int32 AN_IDS_PRESSENS_2 = 3; +const Int32 AN_IDS_PRESSENS_3 = 4; +const Int32 AN_IDS_PRESSENS_4 = 5; +const Int32 AN_IDS_PRESSENS_5 = 6; +const Int32 AN_IDS_PRESSENS_6 = 7; +const Int32 AN_IDS_PRESSENS_7 = 8; +const Int32 AN_IDS_PRESSENS_8 = 9; + +const Int32 F2_LS_01_Direct = 0x60000420 ; // Reads the direct values that are currently being sent to the fpga. rsv rsv rsv rsv F2_LS_DISPENSER_UP_2 F2_LS_DISPENSER_25_2 F2_LS_DISPENSER_75_2 F2_LS_DISPENSER_DOWN_2 F2_LS_DISPENSER_50_2 F2_LS_DISPENSER_SPARE_2 F2_LS_DISPENSER_UP_1 F2_LS_DISPENSER_25_1 F2_LS_DISPENSER_75_1 F2_LS_DISPENSER_DOWN_1 F2_LS_DISPENSER_50_1 F2_LS_DISPENSER_SPARE_1 +const Int32 F2_LS_02_Direct = 0x60000430 ; // Reads the direct values that are currently being sent to the fpga. rsv rsv rsv rsv F2_LS_DISPENSER_UP_4 F2_LS_DISPENSER_25_4 F2_LS_DISPENSER_75_4 F2_LS_DISPENSER_DOWN_4 F2_LS_DISPENSER_50_4 F2_LS_DISPENSER_SPARE_4 F2_LS_DISPENSER_UP_3 F2_LS_DISPENSER_25_3 F2_LS_DISPENSER_75_3 F2_LS_DISPENSER_DOWN_3 F2_LS_DISPENSER_50_3 F2_LS_DISPENSER_SPARE_3 +const Int32 F2_LS_03_Direct = 0x60000440 ; // Reads the direct values that are currently being sent to the fpga. rsv rsv rsv rsv F2_LS_DISPENSER_UP_6 F2_LS_DISPENSER_25_6 F2_LS_DISPENSER_75_6 F2_LS_DISPENSER_DOWN_6 F2_LS_DISPENSER_50_6 F2_LS_DISPENSER_SPARE_6 F2_LS_DISPENSER_UP_5 F2_LS_DISPENSER_25_5 F2_LS_DISPENSER_75_5 F2_LS_DISPENSER_DOWN_5 F2_LS_DISPENSER_50_5 F2_LS_DISPENSER_SPARE_5 +const Int32 F2_LS_04_Direct = 0x60000480 ; // Reads the direct values that are currently being sent to the fpga. rsv rsv rsv rsv F2_LS_DISPENSER_UP_8 F2_LS_DISPENSER_25_8 F2_LS_DISPENSER_75_8 F2_LS_DISPENSER_DOWN_8 F2_LS_DISPENSER_50_8 F2_LS_DISPENSER_SPARE_8 F2_LS_DISPENSER_UP_7 F2_LS_DISPENSER_25_7 F2_LS_DISPENSER_75_7 F2_LS_DISPENSER_DOWN_7 F2_LS_DISPENSER_50_7 F2_LS_DISPENSER_SPARE_7 + +const Int32 Dispenser_Valve1 = 0; +const Int32 Dispenser_Valve2 = 1; +const Int32 Dispenser_Valve3 = 2; +const Int32 Dispenser_Valve4 = 3; +const Int32 Dispenser_Valve5 = 4; +const Int32 Dispenser_Valve6 = 5; +const Int32 Dispenser_Valve7 = 6; +const Int32 Dispenser_Valve8 = 7; + +const ushort MinPress_Mbar_Add =0x5c ; +const ushort MaxPress_Mbar_Add =0x60 ; + +const Int32 F3_VALVE_OUT = 0x600000e2; + +//string path = "C:\\Dispenser_setup\\Log\\"; + + +//Int32[] Start_Table; + +Int32[] Start_Table = new Int32 [10000]; + +UInt32 [] Motor_Dir=new UInt32 [8] {0,0,0,0,0,0,0,0}; + +string Dispenser_Fname ; + +Int32 Dispenser_ptr =-1; + +Int32 [] Dispenser_press= new Int32[8]{0,0,0,0,0,0,0,0}; +Int32 max_pressure_level = 20000; +Int32 min_pressure_level = -20000; + +Int32 [] A2D_Dispenser= new Int32[8]{0,0,0,0,0,0,0,0}; +Int32 Loop_cnt= 1; +Int32 Loop_length=1; + +Int32 PressureSensorType= 1; //1- new -1up +10 . 0-old 0 to +10 +Int32 Temp_Delay=0; + + +UInt32 RD_LS_01_Direct; +UInt32 RD_LS_02_Direct; +UInt32 RD_LS_03_Direct; +UInt32 RD_LS_04_Direct; + +long Lebel1_time; +long Lebel2_time; + +long time_Table; + +Int32 msec_index=0; + +Int32 MaxPress_Mbar; +Int32 MinPress_Mbar; +string state; + + public Int32 OnExecute(IProcedureContext context) + { + long Max_PBU; + Int32 Index=0; + Int32 speed=0; + Int32 Dispenser_Nm; + this.context = context; + + string box_msg = "Make sure Mixer Hot "; + MessageBox.Show(box_msg); + + var response1 = context.RequestUserInputFor("Dispenser Number", "Enter Dispenser number to make priming (1-8):"); + context.WriteLine(response1); + Dispenser_Nm = Int32.Parse(response1); + + check_Min_Max_Mbar(Dispenser_Nm); + + if (Dispenser_Nm==8) + Max_PBU=6000; + else + Max_PBU=4000; + + + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + context.WriteLine(path); + + context.Send("ProgressRequest" ,0xe0, 1); + + Dispenser_Fname=path + "Dispenser_Nm_" + Dispenser_Nm+"_" + DateTime.Now.ToString("MM-dd-yy hh-mm")+ ".csv" ; + + context.WriteLine(Dispenser_Fname); + + context.WriteToFile(Dispenser_Fname,"Dispenser Nm," + Dispenser_Nm + "\n" ); + context.AppendToFile(Dispenser_Fname,"Pressure,Command,Value,DateTime,Remark\n" ); + for(int j=0; j<2;j++) + { + for(int i=0; i<4;i++) + { + state="PBU No. "+ (4*j+i+1 ); + Start_Table=BuildUp_Table; + Table_Run(Dispenser_Nm ); + if (time_Table>300000) + { + context.AddResult(ResultType.Failed,"PBU", "PBU No."+ (4*j+i+1 ) + " Fail"); + return 0; + } + context.AddResult(ResultType.Passed,"PBU","PBU No."+ (4*j+i+1 ) + " Pass"); + + } + state="Flow No."+ (j+1 ) ; + Start_Table=Up_Table; + Table_Run(Dispenser_Nm ); + if (time_Table<115000) + { + context.WriteLine("time_Table= " +time_Table); + context.AddResult(ResultType.Failed,"Flow", "Flow No."+ (j+1) + " Fail"); + return 0; + } + context.AddResult(ResultType.Passed,"Flow","Flow No."+ (j+1 ) + " Pass"); + + } + state="Last PBU " ; + Start_Table=BuildUp_Table; + Table_Run(Dispenser_Nm ); + long Time=Lebel2_time-Lebel1_time; + if (Time>Max_PBU) + { + context.AddResult(ResultType.Failed,"PBU", "PBU = " +Time + "msec "); + state="PBU = " +Time + "msec \tFail"; + } + else + { + context.AddResult(ResultType.Passed,"PBU", "PBU = " +Time + "msec "); + state="PBU = " +Time + "msec \tPass"; + } + return 0; + + } + +///////////////////////////////////////////// +void check_Min_Max_Mbar(Int32 i ) +{ + int k; + string s ; + i--; + + context.WriteLine("-------------- write Enable Channel ------------"); //debug + enable_channel(i); // Chanel 0-7 => Disp0enser 0-7 + context.WriteLine("-------------- Read_header ------------"); //debug + + context.WriteLine("-------------- write_address_eeprom ------------"); //debug + write_address_eeprom (I2C_Slave_Low_Add,MinPress_Mbar_Add); + context.WriteLine("-------------- read_data_from_eeprom ------------"); //debug + read_data_from_eeprom (I2C_Slave_Low_Add,1); + if (EEPROM_Data[0]==0 ) + { PressureSensorType=0; + context.WriteLine("PressureSensorType=0" ); //debug + } + else + { + PressureSensorType=1; + context.WriteLine("PressureSensorType=1" ); //debug + } + +} +//----------------write address eeprom ------------------------- +public void write_address_eeprom (UInt32 I2C_Add, UInt32 Eeprom_Add) +{ + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = I2C_Add; + + UInt32 uInt32 = new UInt32(); + stubI2CWriteBytesRequest.BytesTWrite.Add(Convert.ToByte( (Eeprom_Add & 0xff00) >>8)); //Byte High add to write + stubI2CWriteBytesRequest.BytesTWrite.Add(Convert.ToByte(Eeprom_Add & 0xff)); //Byte Low add to write + context.WriteLine( (Eeprom_Add & 0xff00) >>8) ; //debug + context.WriteLine( Eeprom_Add & 0xff); //debug + + context.Send(stubI2CWriteBytesRequest); +} +//------------------- read Data from EEprom-------------------------- + +public void read_data_from_eeprom ( UInt32 I2C_Add, UInt32 cnt ) +{ + StubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest(); + stubI2CReadBytesRequest.I2CId = I2C_ID; + stubI2CReadBytesRequest.SlaveAddress = (I2C_Add + 1); + stubI2CReadBytesRequest.NumberOfBytesToRead = cnt; // Number of bytes to read + + var response1 = context.Send(stubI2CReadBytesRequest); + + for(int i=0; i(stubI2CWriteBytesRequest); + + return 1; +} + + +////////////////////////////////////////////////////////////// +Int32 Table_Run(Int32 Dispenser ) + +{ + Int32 COMMAND=0; + Int32 Data=0; + Int32 count=0; + + Dispenser--; //check from 0-7 + + int j=0; + var stopwatch = new Stopwatch(); + stopwatch.Start(); + + long elapsed_time = stopwatch.ElapsedMilliseconds; + context.WriteLine(elapsed_time); + + while (count!=-1) + { + msec_index=msec_index+1; + + if (Dispenser<2) + { + var response1 = context.Send("StubFpgaReadRegRequest" ,F2_LS_01_Direct); + RD_LS_01_Direct=response1.Value ; + } + else if ( (Dispenser<4) ) + { + var response1 = context.Send("StubFpgaReadRegRequest" ,F2_LS_02_Direct); + RD_LS_02_Direct=response1.Value ; + } + else if ( (Dispenser<6) ) + { + var response1 = context.Send("StubFpgaReadRegRequest" ,F2_LS_03_Direct); + RD_LS_03_Direct=response1.Value ; + } + else + { + var response1 = context.Send("StubFpgaReadRegRequest" ,F2_LS_04_Direct); + RD_LS_04_Direct=response1.Value ; + } + if (Dispenser<4) + { + var response2 = context.Send("StubIntADCReadRequest" ,0x8000 + AN_IDS_PRESSENS_1); + A2D_Dispenser[0]=(response2.SamplingInBits)>>16; + A2D_Dispenser[1] =(response2.SamplingInBits) & 0x0000ffff; + A2D_Dispenser[2] =(response2.VoltageSamplingMv)>>16; + A2D_Dispenser[3] =(response2.VoltageSamplingMv) & 0x0000ffff; + } + else + { + var response3 = context.Send("StubIntADCReadRequest" ,0x8000 + AN_IDS_PRESSENS_5); + A2D_Dispenser[4] =(response3.SamplingInBits)>>16; + A2D_Dispenser[5] =(response3.SamplingInBits)& 0x0000ffff; + A2D_Dispenser[6] =(response3.VoltageSamplingMv)>>16; + A2D_Dispenser[7] =(response3.VoltageSamplingMv)& 0x0000ffff; + } + + COMMAND=Start_Table[count]; + Data=Start_Table[(count+1)]; + //Index=Index+2; + switch (COMMAND) + { + case CMD_RUN: + Motor_Run(Data,Dispenser); + count = count+2; + break; + + case CMD_VALVE: + Valve_3W(Data,Dispenser); + count = count+2; + break; + + case CMD_STOP: + Motor_Stop(Data,Dispenser); + count = count+2; + break; + + case CMD_DLY: + Delay_on_second(Data,Dispenser); + if (Temp_Delay ==0) + { + max_pressure_level=20000; + min_pressure_level=-20000; + count = count+2; + } + break; + + case CMD_TIME: + Print_Time(); + count = count+2; + break; + + case CMD_PRESS: + max_pressure_level=Data; + context.AppendToFile(Dispenser_Fname,",Max_pressure_level is, " + Data +","+DateTime.Now+"\n"); + count = count+2; + break; + + case CMD_PRESL: + min_pressure_level=Data; + context.AppendToFile(Dispenser_Fname,",Min_pressure_level is, " + Data +","+DateTime.Now+"\n"); + count = count+2; + break; + + case CMD_LBL: + context.AppendToFile(Dispenser_Fname,",Label," + Data+","+DateTime.Now+"\n"); + if(Data==1) + Lebel1_time=stopwatch.ElapsedMilliseconds; + if(Data==2) + Lebel2_time=stopwatch.ElapsedMilliseconds; + count = count+2; + break; + + + case CMD_SMP: + context.AppendToFile(Dispenser_Fname,",SampleRate," + Data+","+DateTime.Now+"\n"); + Dispenser_sample_rate =Data; + count = count+2; + break; + + case CMD_END: + count=-1; + context.AppendToFile(Dispenser_Fname,",End testing,,"+DateTime.Now+"\n"); + break; + + case CMD_MTV_OPEN: + open_midtank_valve(Data,Dispenser); + context.AppendToFile(Dispenser_Fname,",OPEN MIDTANK, " + Dispenser+","+DateTime.Now+"\n"); + count = count+2; + break; + + case CMD_MTV_CLOSE: + close_midtank_valve(Data,Dispenser); + context.AppendToFile(Dispenser_Fname,",CLOSE MIDTANK, " + Dispenser+","+DateTime.Now+"\n"); + count = count+2; + break; + + case CMD_LOOP_NM: + + Loop_cnt=Data-1; + context.AppendToFile(Dispenser_Fname,",Counter Loop,"+ Data+","+DateTime.Now +"\n"); + count = count+2; + break; + + case CMD_LOOP: + + if (Loop_cnt!=0) + { + context.AppendToFile(Dispenser_Fname,"Counter Loop,"+ Loop_cnt+","+DateTime.Now+"\n" ); + count = count+2*Data; + Loop_cnt--; + + } + else + { + context.AppendToFile(Dispenser_Fname,",End loop,,"+DateTime.Now +"\n"); + count = count+2; + } + break; + + default: + break; + + } + + long elapsed_time1 = stopwatch.ElapsedMilliseconds; + long elapsed_time2= elapsed_time1-elapsed_time; + if (elapsed_time2>95) + elapsed_time2=95; //minimum time + Thread.Sleep(100-(int )(elapsed_time2)); + + elapsed_time = stopwatch.ElapsedMilliseconds; + + + j++; + if (j==10) + { + j=0; + context.WriteLine(Dispenser_press[Dispenser]+ " mBar\t"+state + "\tTime-" + (elapsed_time/1000)); + } + } + time_Table=elapsed_time; + return 0; +} + +/////////////////////////////////////////////////////////////////// +Int32 Motor_Run(Int32 speed,Int32 Dispenser) + +{ + + switch (Dispenser) + { + case 0: + if ( speed<0) + { + Motor_Dir[0]=2; + if ((RD_LS_01_Direct & 0x04)!=0x04) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n"); + return 0; + } + + context.Send("StubMotorRunRequest" ,Dispenser_Motor1, false, (-speed)); + } + else + { + Motor_Dir[0]=1; + if ((RD_LS_01_Direct & 0x20)!=0x20) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n"); + return 0; + } + context.Send("StubMotorRunRequest" ,Dispenser_Motor1, true, (speed)); + } + break; + + case 1: + if ( speed<0) + { + Motor_Dir[1]=2; + if ((RD_LS_01_Direct & 0x100)!=0x100) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n"); + return 0; + } + context.Send("StubMotorRunRequest" ,Dispenser_Motor2, false, (-speed)); + } + else + { + Motor_Dir[1]=1; + if ((RD_LS_01_Direct & 0x800)!=0x800) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n"); + return 0; + } + context.Send("StubMotorRunRequest" ,Dispenser_Motor2, true, (speed)); + } + break; + + case 2: + if ( speed<0) + { + Motor_Dir[2]=2; + if ((RD_LS_02_Direct & 0x04)!=0x04) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n"); + return 0; + } + context.Send("StubMotorRunRequest" ,Dispenser_Motor3, false, (-speed)); + } + else + { + Motor_Dir[2]=1; + if ((RD_LS_02_Direct & 0x20)!=0x20) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n"); + return 0; + } + context.Send("StubMotorRunRequest" ,Dispenser_Motor3, true, (speed)); + } + break; + + case 3: + if ( speed<0) + { + Motor_Dir[3]=2; + + if ((RD_LS_02_Direct & 0x100)!=0x100) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n"); + return 0; + } + context.Send("StubMotorRunRequest" ,Dispenser_Motor4, false, (-speed)); + } + else + { + Motor_Dir[3]=1; + + if ((RD_LS_02_Direct & 0x800)!=0x800) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n"); + return 0; + } + context.Send("StubMotorRunRequest" ,Dispenser_Motor4, true, (speed)); + } + break; + + case 4: + if ( speed<0) + { + Motor_Dir[4]=2; + if ((RD_LS_03_Direct & 0x04)!=0x04) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n"); + return 0; + } + + context.Send("StubMotorRunRequest" ,Dispenser_Motor5, false, (-speed)); + } + else + { + Motor_Dir[4]=1; + if ((RD_LS_03_Direct & 0x20)!=0x20) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n"); + return 0; + } + context.Send("StubMotorRunRequest" ,Dispenser_Motor5, true, (speed)); + } + break; + + case 5: + if ( speed<0) + { + Motor_Dir[5]=2; + if ((RD_LS_03_Direct & 0x100)!=0x100) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n"); + return 0; + } + context.Send("StubMotorRunRequest" ,Dispenser_Motor6, false, (-speed)); + } + else + { + Motor_Dir[5]=1; + if ((RD_LS_03_Direct & 0x800)!=0x800) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n"); + return 0; + } + context.Send("StubMotorRunRequest" ,Dispenser_Motor6, true, (speed)); + } + break; + + case 6: + if ( speed<0) + { + Motor_Dir[6]=2; + if ((RD_LS_04_Direct & 0x04)!=0x04) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n"); + return 0; + } + context.Send("StubMotorRunRequest" ,Dispenser_Motor7, false, (-speed)); + } + else + { + Motor_Dir[6]=1; + if ((RD_LS_04_Direct & 0x20)!=0x20) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n"); + return 0; + } + context.Send("StubMotorRunRequest" ,Dispenser_Motor7, true, (speed)); + } + break; + + case 7: + if ( speed<0) + { + Motor_Dir[7]=2; + + if ((RD_LS_04_Direct & 0x100)!=0x100) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n"); + return 0; + } + context.Send("StubMotorRunRequest" ,Dispenser_Motor8, false, (-speed)); + } + else + { + Motor_Dir[7]=1; + + if ((RD_LS_04_Direct & 0x800)!=0x800) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n"); + return 0; + } + context.Send("StubMotorRunRequest" ,Dispenser_Motor8, true, (speed)); + } + break; + + default: + break; + + } + context.AppendToFile(Dispenser_Fname,",Run," +speed+","+DateTime.Now +"\n" ); + + return 1; +} + + + Int32 Valve_3W(Int32 Valve_Value,Int32 Dispenser) +{ + if ( Valve_Value==1) + context.Send("StubValveRequest" ,Dispenser_Valve1+Dispenser, 3, true); //3 3Way + else + context.Send("StubValveRequest" ,Dispenser_Valve1+Dispenser, 3, false); //3 3Way + + context.AppendToFile(Dispenser_Fname,",Dispenser Valve position is, " + Valve_Value+","+DateTime.Now +"\n" ); + + return 1; +} +//--------------------------------------- + + Int32 Motor_Stop(Int32 Stop_Value,Int32 Dispenser ) +{ + context.Send("StubMotorStopRequest" ,Dispenser_Motor1+Dispenser, Stop_Value); + + context.AppendToFile(Dispenser_Fname,",Motor Stop," + Stop_Value+","+DateTime.Now +"\n"); + Motor_Dir[Dispenser]=0; + return 1; +} + +//--------------------------------------- + + Int32 Delay_on_second(Int32 Delay,Int32 Dispenser ) +{ +//Int32 temp1; +Int32 pressure_om_mBAR=0; + if (Temp_Delay ==0) + { + context.AppendToFile(Dispenser_Fname,",DLY, " + Delay +","+DateTime.Now+"\n"); + Temp_Delay = Delay *10 -1; +// context.Write("A"); //debug + } + else + Temp_Delay--; + + if ( LimitSW_Dispenser(Dispenser)==0) + { + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+",Warning Motor on Limit\n"); + MotorStop(Dispenser); + Temp_Delay =0; //end delay +// context.Write("C"); //debug + + return 0 ; + } + + pressure_om_mBAR=Calc_mBAR(Dispenser,true); + if (pressure_om_mBAR > max_pressure_level) + { + // MotorStop(Dispenser); + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Pressure too high\n"); + Temp_Delay =0; //end delay +// context.Write("D"); //debug + + return 0; + } + if (pressure_om_mBAR < min_pressure_level) + { + // MotorStop(Dispenser); + context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Pressure too low\n"); + Temp_Delay =0; //end delay +// context.Write("D"); //debug + + return 0; + } + + + return 1; +} + +Int32 LimitSW_Dispenser(Int32 Dispenser) +{ + + if (Dispenser==0) + + { + +// var response1 = context.Send("StubFpgaReadRegRequest" ,F2_LS_01_Direct); + + if (((RD_LS_01_Direct & 0x04)!=0x04) && (Motor_Dir[0]==2)) + return 0; + else + if (((RD_LS_01_Direct & 0x20)!=0x20) && (Motor_Dir[0]==1)) + return 0; + else + return 1; + } + + if (Dispenser==1) + + { +// var response2 = context.Send("StubFpgaReadRegRequest" ,F2_LS_01_Direct); + if (((RD_LS_01_Direct & 0x100)!=0x100) && (Motor_Dir[1]==2)) + return 0; + else + if (((RD_LS_01_Direct & 0x800)!=0x800) && (Motor_Dir[1]==1)) + return 0; + else + return 1; + } + + + if (Dispenser==2) + + { + + //var response3 = context.Send("StubFpgaReadRegRequest" ,F2_LS_02_Direct); + if (((RD_LS_02_Direct & 0x04)!=0x04) && (Motor_Dir[2]==2)) + return 0; + else + if (((RD_LS_02_Direct & 0x20)!=0x20) && (Motor_Dir[2]==1)) + return 0; + else + return 1; + + } + + if (Dispenser==3) + + { + var response4 = context.Send("StubFpgaReadRegRequest" ,F2_LS_02_Direct); + if (((RD_LS_02_Direct & 0x100)!=0x100) && (Motor_Dir[3]==2)) + return 0; + else + if (((RD_LS_02_Direct & 0x800)!=0x800) && (Motor_Dir[3]==1)) + return 0; + else + return 1; + } + + + + + if (Dispenser==4) + + { + +// var response1 = context.Send("StubFpgaReadRegRequest" ,F2_LS_01_Direct); + if (((RD_LS_03_Direct & 0x04)!=0x04) && (Motor_Dir[4]==2)) + return 0; + else + if (((RD_LS_03_Direct & 0x20)!=0x20) && (Motor_Dir[4]==1)) + return 0; + else + return 1; + } + + if (Dispenser==5) + + { +// var response2 = context.Send("StubFpgaReadRegRequest" ,F2_LS_01_Direct); + if (((RD_LS_03_Direct & 0x100)!=0x100) && (Motor_Dir[5]==2)) + return 0; + else + if (((RD_LS_03_Direct & 0x800)!=0x800) && (Motor_Dir[5]==1)) + return 0; + else + return 1; + } + + + if (Dispenser==6) + + { + + //var response3 = context.Send("StubFpgaReadRegRequest" ,F2_LS_02_Direct); + if (((RD_LS_04_Direct & 0x04)!=0x04) && (Motor_Dir[6]==2)) + return 0; + else + if (((RD_LS_04_Direct & 0x20)!=0x20) && (Motor_Dir[6]==1)) + return 0; + else + return 1; + + } + + if (Dispenser==7) + + { +// var response4 = context.Send("StubFpgaReadRegRequest" ,F2_LS_02_Direct); + if (((RD_LS_04_Direct & 0x100)!=0x100) && (Motor_Dir[7]==2)) + return 0; + else + if (((RD_LS_04_Direct & 0x800)!=0x800) && (Motor_Dir[7]==1)) + return 0; + else + return 1; + } + + + return 0; +} + + +Int32 Print_Time() +{ + context.AppendToFile(Dispenser_Fname,",Time is\t,,"+ DateTime.Now +"\n" ); + + return 1; +} + + + +Int32 Calc_mBAR(Int32 Dispenser, bool save_press) +{ +Int32 Data; +Int32 Sense1; +Int32 temp=0; + + Data =A2D_Dispenser[Dispenser]; + if (Data<100) + temp=-1; + Data=Data-710; + if (Data<0) + Data=0; + + Data=Data*(10000+PressureSensorType*1000)/2840; // for -1 to 10 bar Press_Sensor_Type=1 else 0 + Data=Data-1000*PressureSensorType; // for -1 to 10 bar + + if (temp==-1) //if SamplingInBits <100 then No pressure sensor exist + Sense1=-9999 ; + else + Sense1=Data ; + if ( ((msec_index) % (Dispenser_sample_rate)) == 0) + { + context.AppendToFile(Dispenser_Fname,"" + Sense1+"\n"); + } + Dispenser_press[Dispenser]=Sense1; + return Sense1; + + } + + +//-------------------------------- +int open_midtank_valve (Int32 valve_type,Int32 valve_nm) //valve_type=0 is Air ,1 is Ink ; valve_nm 0-7 +{ + SetBit (F3_VALVE_OUT,((valve_type+1)*8)- valve_nm-1, 1); + return 1; + +} +//-------------------------------- +int close_midtank_valve (Int32 valve_type,Int32 valve_nm) //valve_type=0 is Air ,1 is Ink ; valve_nm 0-7 +{ + SetBit (F3_VALVE_OUT,((valve_type+1)*8)- valve_nm-1, 0); + return 1; +} +//-------------------------------- +Int32 SetBit(Int32 Adr, Int32 BitNo, Int32 Bit) +{ + Int32 BitMask; + + var response = context.Send("StubFpgaReadRegRequest" , F3_VALVE_OUT); + Int32 RV = (Int32) response.Value & 0xffff; + + + if (Bit == 0x1) + { + BitMask = 0x1 << BitNo; + RV = RV | BitMask; + context.Send("StubFpgaWriteRegRequest" ,F3_VALVE_OUT , RV); + } + else if (Bit == 0x0) + { + BitMask = ~(0x1 << BitNo); + RV = RV & BitMask; + context.Send("StubFpgaWriteRegRequest" ,F3_VALVE_OUT , RV); + } + return 1; +} +//---------------------------------- + void MotorStop(Int32 i) +{ + +context.Send("StubMotorStopRequest" ,Dispenser_Motor1+i, 2); +Motor_Dir[i]=0; //0 stop 1- up 2-dn + +} + +} \ No newline at end of file diff --git a/Software/Stubs Collection/Procedures/WHS_waste_Tank_Calibration_Save_V0.pproj b/Software/Stubs Collection/Procedures/WHS_waste_Tank_Calibration_Save_V0.pproj new file mode 100644 index 000000000..3bd4b1f84 --- /dev/null +++ b/Software/Stubs Collection/Procedures/WHS_waste_Tank_Calibration_Save_V0.pproj @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Drawing; +using Google.Protobuf; +using Tango.BL.Entities; +using Tango.BL.Enumerations; +using Tango.PMR.Stubs; +using Tango.PMR.Diagnostics; +using Tango.FSE.Common.Connection; +using Tango.FSE.Common.Diagnostics; +using Tango.FSE.Procedures; + + +public class Program +{ + double V0_default_ml = 8.7433; + + public void OnExecute(IProcedureContext context) + { + + var response1 = context.RequestUserInputFor("Warning - you are going to change the value of Vo in the eeprom !!!\nPlease Enter Password to confirme:",""); + if (response1=="Aa123456") + { + context.WriteLine(response1); + + //Write_0_Vo_in_ml_to_eeprom + context.WriteLine("\nWrite_0_Vo_in_ml_to_eeprom"); + StubWhsEEpromRequest stubWhsEEpromRequest = new StubWhsEEpromRequest(); + stubWhsEEpromRequest.BurnRequest = true; //write + StubWhsEEpromData stubWhsEEpromData = new StubWhsEEpromData(); + stubWhsEEpromData.Orifice1Flow = 0; + stubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData; + var response = context.Send(stubWhsEEpromRequest); + + //wait_10mSec + context.WriteLine("\nwait_10mSec"); + Thread.Sleep(100); //Sleep for 10 milli. + + //Read_Vo_in_ml_from_eeprom & verify it is 0 + context.WriteLine("\nRead_Vo_in_ml_from_eeprom & verify it is 0"); + stubWhsEEpromRequest.BurnRequest = false; //write + stubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData; + var response2 = context.Send(stubWhsEEpromRequest); + + //Read_Vo_in_mV + context.WriteLine("\nRead_Vo_in_mV"); + var response3 = context.Send("ProgressRequest" ,0x3EC, 0x01); + //Print_Vo_in_mV + context.WriteLine(response3.Progress); + + //check validity + context.WriteLine("\ncheck validity"); + if((response3.Progress <= 800) || (response3.Progress >=1200)) + { + response3.Progress = 1076; //default + context.Write("\nERROR ------ Vreading value outside the defined range !!! ------"); + context.AddResult(ResultType.Failed , "Error", "ERROR ------ Vreading value outside the defined range !!! ------"); + } + else + { + //calculate_V0_in_ml + context.WriteLine("\ncalculate_V0_in_ml"); + V0_default_ml = V0_default_ml * response3.Progress; + + //print_Vo_in_ml + context.WriteLine("\nprint_Vo_in_ml"); + context.WriteLine(V0_default_ml); + context.WriteLine(""); + + //Write_Vo_in_ml_to_eeprom + context.WriteLine("\nWrite_Vo_in_ml_to_eeprom"); + stubWhsEEpromRequest.BurnRequest = true; //write + + stubWhsEEpromData.Orifice1Flow = V0_default_ml; + stubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData; + var response4 = context.Send(stubWhsEEpromRequest); + + //wait_10mSec + context.WriteLine("\nwait_10mSec"); + Thread.Sleep(100); //Sleep for 10 milli. + + //Read_Vo_in_ml_from_eeprom + context.WriteLine("\nRead_Vo_in_ml_from_eeprom"); + stubWhsEEpromRequest.BurnRequest = false; //write + stubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData; + var response5 = context.Send(stubWhsEEpromRequest); + + //Check if we read the correct value + context.WriteLine("\nVerify that we read the correct value of Orifice1Flow!!"); + context.AddResult(ResultType.Passed , "Pass", "Calibration Pass."); + + } + } + else + { + context.AddResult(ResultType.Failed , "Error", "Password Fail."); + } + context.WriteLine("\n -- END OF SCRIPT -- "); + } +} + -- cgit v1.3.1 From b91e38b4265ffe413d9b54aabb3e17d8cd150570 Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Sun, 30 Aug 2020 09:21:15 +0300 Subject: advanced merge + additional debug log filters --- .../Embedded/Modules/Diagnostics/Diagnostics.c | 24 ++++++++++++++++++++++ .../Messages/Debugging/DebugDistributorType.proto | 2 ++ .../Messages/Debugging/StartDebugLogResponse.proto | 1 + 3 files changed, 27 insertions(+) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c index 37d6b5ec1..18793ce28 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c @@ -17,6 +17,7 @@ #include "drivers/Motors/Motor.h" #include "drivers/Heater/TemperatureSensor.h" #include "drivers/SSI_Comm/Dancer/Dancer.h" +#include #include "drivers/FPGA/FPGA_SPI_Comm.h" #include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h" #include "drivers/FPGA/FPGA.h" @@ -409,6 +410,9 @@ void DiagnosticLoadDancerError(int DancerId, double value) // DancerErrorCounterIndex[DancerId] = 0; } +#ifdef FOUR_WINDERS + double dancer2,dancer3,dancer4; +#endif void CopyTemperaturesToMonitor(void) { DiagnosticsMonitor.mixertemperature = @@ -513,6 +517,18 @@ void CopyTemperaturesToMonitor(void) DiagnosticsMonitor.headblowervoltage1 = &headblowervoltage1; DiagnosticsMonitor.headblowervoltage2 = &headblowervoltage2; } +#ifdef FOUR_WINDERS +// double dancer2,dancer3,dancer4; + dancer2 = Control_Read_Dancer_Position(HARDWARE_DANCER_2,0); + dancer3 = Control_Read_Dancer_Position(HARDWARE_DANCER_3,0); + dancer4 = Control_Read_Dancer_Position(HARDWARE_DANCER_4,0); + DiagnosticsMonitor.n_headblower1airflow = 1; + DiagnosticsMonitor.n_headblower2airflow = 1; + DiagnosticsMonitor.headblower1airflow = &dancer4; + DiagnosticsMonitor.headblower2airflow = &dancer3; + DiagnosticsMonitor.headblowervoltage1 = &dancer2; + DiagnosticsMonitor.n_headblowervoltage1 = 1; +#endif DiagnosticsMonitor.dryerzone1temperature = HeaterTemperature[HEATER_TYPE__DryerAirHeater]; @@ -978,11 +994,19 @@ void Diagnostic100msecCollection(void) { //if (JobIsActive()) { +#ifdef FOUR_WINDERS + DiagnosticLoadMotor(FEEDER_MOTOR, ThreadGetMotorSpeed (WINDER_2_MOTOR)); + DiagnosticLoadMotor(DRYER_MOTOR, ThreadGetMotorSpeed (WINDER_3_MOTOR)); + DiagnosticLoadMotor(POOLER_MOTOR, ThreadGetMotorSpeed (WINDER_4_MOTOR)); + DiagnosticLoadMotor(WINDER_MOTOR, ThreadGetMotorSpeed (WINDER_MOTOR)); + DiagnosticLoadMotor(SCREW_MOTOR, ThreadGetMotorSpeed (SCREW_MOTOR)); +#else DiagnosticLoadMotor(FEEDER_MOTOR, ThreadGetMotorSpeed (FEEDER_MOTOR)); DiagnosticLoadMotor(DRYER_MOTOR, ThreadGetMotorSpeed (DRYER_MOTOR)); DiagnosticLoadMotor(POOLER_MOTOR, ThreadGetMotorSpeed (POOLER_MOTOR)); DiagnosticLoadMotor(WINDER_MOTOR, ThreadGetMotorSpeed (WINDER_MOTOR)); DiagnosticLoadMotor(SCREW_MOTOR, ThreadGetMotorSpeed (SCREW_MOTOR)); +#endif } for (i=0;i Date: Sun, 30 Aug 2020 11:01:07 +0300 Subject: replace report with filter report --- .../Modules/Diagnostics/DiagnosticsHoming.c | 48 ++--- .../Embedded/Modules/IDS/IDS_Cleaning.c | 20 +-- .../Embedded/Modules/IDS/IDS_dispenser.c | 62 +++---- .../Embedded_SW/Embedded/Modules/IDS/IDS_maint.c | 56 +++--- .../Embedded_SW/Embedded/Modules/IDS/IDS_print.c | 199 +++++++++++---------- 5 files changed, 199 insertions(+), 186 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticsHoming.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticsHoming.c index d9f8d30fd..04e333459 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticsHoming.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticsHoming.c @@ -64,11 +64,11 @@ uint32_t MotorHomingProgressReport(uint32_t deviceID, uint32_t ReadValue) { last = true; SafeRemoveControlCallback(HomingControlId[deviceID],MotorHomingProgressReport); - Report("MotorHomingProgressReport stopped 1000",__FILE__,__LINE__,deviceID,RpMessage,HomingCounter[deviceID],0); + ReportWithPackageFilter(DiagnosticsFilter,"MotorHomingProgressReport stopped 1000",__FILE__,__LINE__,deviceID,RpMessage,HomingCounter[deviceID],0); HomingControlId[deviceID] = 0xff; } response.progress = HomingCounter[deviceID]++; - Report("MotorHomingProgressReport",__FILE__,__LINE__,deviceID,RpMessage,HomingCounter[deviceID],0); + ReportWithPackageFilter(DiagnosticsFilter,"MotorHomingProgressReport",__FILE__,__LINE__,deviceID,RpMessage,HomingCounter[deviceID],0); responseContainer = createContainer(MESSAGE_TYPE__MotorHomingResponse, HomingToken[deviceID], last, &response, &motor_homing_response__pack, &motor_homing_response__get_packed_size); responseContainer.has_continuous = true; responseContainer.continuous = true; @@ -107,7 +107,7 @@ uint32_t MotorHomingRequestCallback(uint32_t deviceID, uint32_t ReadValue) } if (HomingControlId[deviceID] != 0xff) { - Report("MotorHomingProgressReport stopped",__FILE__,__LINE__,deviceID,RpMessage,HomingCounter[deviceID],0); + ReportWithPackageFilter(DiagnosticsFilter,"MotorHomingProgressReport stopped",__FILE__,__LINE__,deviceID,RpMessage,HomingCounter[deviceID],0); RemoveControlCallback(HomingControlId[deviceID],MotorHomingProgressReport); HomingControlId[deviceID] = 0xff; } @@ -177,7 +177,7 @@ uint32_t MotorHomingRequestFunc(MessageContainer* requestContainer) { direction = DRIER_LID_OPEN; } - Report("MotorHomingRequestFunc Dryer lid open",__FILE__,MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID].DriverType,DRIER_LID_OPEN,RpMessage,GPI_LS_DRYER_LID_OPEN,0); + ReportWithPackageFilter(DiagnosticsFilter,"MotorHomingRequestFunc Dryer lid open",__FILE__,MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID].DriverType,DRIER_LID_OPEN,RpMessage,GPI_LS_DRYER_LID_OPEN,0); MotorGotoWithCallback(HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID, direction, GPI_LS_DRYER_LID_OPEN, MotorHomingRequestCallback,10000); status = OK; } @@ -226,7 +226,7 @@ uint32_t MotorHomingRequestFunc(MessageContainer* requestContainer) { direction = DRIER_LID_CLOSE; } - Report("MotorHomingRequestFunc Dryer lid close",__FILE__,MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID].DriverType,DRIER_LID_CLOSE,RpMessage,GPI_LS_DRYER_LID_CLOSED,0); + ReportWithPackageFilter(DiagnosticsFilter,"MotorHomingRequestFunc Dryer lid close",__FILE__,MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID].DriverType,DRIER_LID_CLOSE,RpMessage,GPI_LS_DRYER_LID_CLOSED,0); MotorGotoWithCallback(HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID, direction, GPI_LS_DRYER_LID_CLOSED, MotorHomingRequestCallback,10000); status = OK; } @@ -260,7 +260,7 @@ uint32_t MotorHomingRequestFunc(MessageContainer* requestContainer) { HomingControlId[MotorId] = AddControlCallback(NULL, MotorHomingProgressReport, 2*eOneSecond, TemplateDataReadCBFunction,MotorId, 0, 0 ); HomingCounter[MotorId] = 0; - Report("MotorHomingProgressReport started",__FILE__,__LINE__,MotorId,RpMessage,HomingControlId[MotorId],0); + ReportWithPackageFilter(DiagnosticsFilter,"MotorHomingProgressReport started",__FILE__,__LINE__,MotorId,RpMessage,HomingControlId[MotorId],0); } else { @@ -338,7 +338,7 @@ uint32_t DispenserHomingProgressReport(uint32_t deviceID, uint32_t ReadValue) response.progress = IDS_Dispenser_Data[deviceID].consumedinnanolitter; responseContainer = createContainer(MESSAGE_TYPE__DispenserHomingResponse, HomingToken[MotorId], last, &response, &dispenser_homing_response__pack, &dispenser_homing_response__get_packed_size); - Report("DispenserHomingProgressReport",__FILE__,__LINE__,deviceID,RpMessage,IDS_Dispenser_Data[deviceID].consumedinnanolitter,0); + ReportWithPackageFilter(DiagnosticsFilter,"DispenserHomingProgressReport",__FILE__,__LINE__,deviceID,RpMessage,IDS_Dispenser_Data[deviceID].consumedinnanolitter,0); responseContainer.has_continuous = true; responseContainer.continuous = true; uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); @@ -359,7 +359,7 @@ uint32_t DispenserHomingRequestCallback(uint32_t deviceID, uint32_t ReadValue) { RemoveControlCallback(HomingControlId[MotorId],DispenserHomingProgressReport); HomingControlId[MotorId] = 0xff; - Report("DispenserHomingProgressReport stopped",__FILE__,__LINE__,deviceID,RpMessage,HomingControlId[MotorId],0); + ReportWithPackageFilter(DiagnosticsFilter,"DispenserHomingProgressReport stopped",__FILE__,__LINE__,deviceID,RpMessage,HomingControlId[MotorId],0); } //close dry air valve in the dispenser @@ -412,7 +412,7 @@ uint32_t DispenserHomingRequestFunc(MessageContainer* requestContainer) if (status == OK) { HomingControlId[MotorId] = AddControlCallback(NULL, DispenserHomingProgressReport, 2*eOneSecond, TemplateDataReadCBFunction,request->index, 0, 0 ); - Report("DispenserHomingProgressReport started",__FILE__,__LINE__,request->index,RpMessage,HomingControlId[MotorId],0); + ReportWithPackageFilter(DiagnosticsFilter,"DispenserHomingProgressReport started",__FILE__,__LINE__,request->index,RpMessage,HomingControlId[MotorId],0); } } else @@ -445,7 +445,7 @@ uint32_t DispenserAbortHomingRequestFunc(MessageContainer* requestContainer) { RemoveControlCallback(HomingControlId[MotorId],DispenserHomingProgressReport); HomingControlId[MotorId] = 0xff; - Report("DispenserHomingProgressReport stopped",__FILE__,__LINE__,request->index,RpMessage,HomingControlId[MotorId],0); + ReportWithPackageFilter(DiagnosticsFilter,"DispenserHomingProgressReport stopped",__FILE__,__LINE__,request->index,RpMessage,HomingControlId[MotorId],0); } /* TimerMotors_t MotorId = (request->index)+HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1; @@ -467,7 +467,7 @@ uint32_t Diagnostics_Set_Load_Arm_To_Stopper_Callback(uint32_t deviceID, uint32_ MessageContainer responseContainer; MotorHomingResponse response = MOTOR_HOMING_RESPONSE__INIT; - Report("Diagnostics_Set_Load_Arm_To_Stopper time",__FILE__,__LINE__,msec_millisecondCounter,RpMessage,0,0); + ReportWithPackageFilter(DiagnosticsFilter,"Diagnostics_Set_Load_Arm_To_Stopper time",__FILE__,__LINE__,msec_millisecondCounter,RpMessage,0,0); //NumberOfDrierLoaderCycles=0; //storeLoadArmParameters(); @@ -488,13 +488,13 @@ uint32_t Diagnostics_Dryer_UnLoading_Callback(uint32_t MotorId, uint32_t ReadVal { D_numberOfCycles++; uint32_t temp = Read_Dryer_ENC_Position(); - Report("Diagnostics_Dryer_UnLoading_Callback",__FILE__,ReadValue,temp,RpMessage,D_DrierPrevLocation,0); - //Report("Diagnostics_Dryer_UnLoading_Callback details",__FILE__,(int)(TotalLoadedLen),D_numberOfCycles,RpMessage,CallbackCounter,0); + ReportWithPackageFilter(DiagnosticsFilter,"Diagnostics_Dryer_UnLoading_Callback",__FILE__,ReadValue,temp,RpMessage,D_DrierPrevLocation,0); + //ReportWithPackageFilter(DiagnosticsFilter,"Diagnostics_Dryer_UnLoading_Callback details",__FILE__,(int)(TotalLoadedLen),D_numberOfCycles,RpMessage,CallbackCounter,0); if ((abs (temp -D_DrierPrevLocation)>1000 )&&(ReadValue == NOTBUSY)) // OK - take another round // if (ReadValue == NOTBUSY) // OK - take another round { D_DrierPrevLocation = temp; - Report("Diagnostics_Dryer_UnLoading cycles",__FILE__,D_numberOfCycles,LoadArmRounds,RpMessage,0,0); + ReportWithPackageFilter(DiagnosticsFilter,"Diagnostics_Dryer_UnLoading cycles",__FILE__,D_numberOfCycles,LoadArmRounds,RpMessage,0,0); if (D_numberOfCyclesdispenserinfo[i]->microsteps; IDS_Dispenser_Data[i].numberofrefills = StoredDispenserData->dispenserinfo[i]->numberofrefills; IDS_Dispenser_Data[i].nanolitterperpulse = StoredDispenserData->dispenserinfo[i]->nanolitterperpulse; - Report("IDS_Dispenser load data ",__FILE__,i,(int)IDS_Dispenser_Data[i].totalconsumedinnanolitter,RpWarning,(int)IDS_Dispenser_Data[i].consumedinnanolitter,0); + ReportWithPackageFilter(IDSFilter,"IDS_Dispenser load data ",__FILE__,i,(int)IDS_Dispenser_Data[i].totalconsumedinnanolitter,RpWarning,(int)IDS_Dispenser_Data[i].consumedinnanolitter,0); } dispenser_data__free_unpacked(StoredDispenserData,NULL); } - //Report("IDS_Dispenser load data ",__FILE__,__LINE__,(int)Bytes,RpWarning,(int)IDS_Dispenser_Data[0].nanolitterperpulse*100,0); + //ReportWithPackageFilter(IDSFilter,"IDS_Dispenser load data ",__FILE__,__LINE__,(int)Bytes,RpWarning,(int)IDS_Dispenser_Data[0].nanolitterperpulse*100,0); return; //================================== @@ -314,11 +314,11 @@ uint32_t IDS_Dispenser_Store_Data (void) for(i=0;inanolitterperpulse *100,0); + //ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_Store ",__FILE__,__LINE__,(int)response_size,RpWarning,(int)StoreDispenserData.dispenserinfo[4]->nanolitterperpulse *100,0); /*Status = FileWrite(IDS_Dispenser_Data,response_size,DispenserStorePath,BIOS_NO_WAIT); if (Status == FR_OK) @@ -362,7 +362,7 @@ void IDS_Dispenser_Content_Calculation (char DispenserId) IDS_Dispenser_Data[DispenserId].totalconsumedinnanolitter += (CurrentDispenserSpeed[DispenserId]/10); if (seconds_counter%1500 == 0) //1500*400MILI = 600000 { - Report("IDS_Dispenser_Data ",__FILE__,DispenserId,(int)IDS_Dispenser_Data[DispenserId].consumedinnanolitter,RpWarning,(int)CurrentDispenserSpeed[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_Data ",__FILE__,DispenserId,(int)IDS_Dispenser_Data[DispenserId].consumedinnanolitter,RpWarning,(int)CurrentDispenserSpeed[DispenserId],0); } } if (DispenserId == 0) @@ -394,7 +394,7 @@ void IDS_Dispenser_RefillStarted (char DispenserId,char MicroSteps) IDS_Dispenser_Data[DispenserId].nanolitterperpulse = assumedFlow; IDS_Dispenser_Data[DispenserId].microsteps = 1; IDS_Dispenser_Data[DispenserId].direction = 0;*/ - Report("IDS_Dispenser_RefillStarted",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)(CurrentDispenserSpeed[DispenserId]),0); + ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_RefillStarted",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)(CurrentDispenserSpeed[DispenserId]),0); } void IDS_Dispenser_RefillEnded (char DispenserId,char MicroSteps) { @@ -403,7 +403,7 @@ void IDS_Dispenser_RefillEnded (char DispenserId,char MicroSteps) IDS_Dispenser_Data[DispenserId].numberofrefills++; //IDS_Dispenser_Data[DispenserId].direction = 1; IDS_Dispenser_Data[DispenserId].consumedinnanolitter = 0; - Report("IDS_Dispenser_RefillEnded",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)IDS_Dispenser_Data[DispenserId].numberofrefills,0); + ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_RefillEnded",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)IDS_Dispenser_Data[DispenserId].numberofrefills,0); } void DispenserDataRequestFunc(MessageContainer* requestContainer) { @@ -418,7 +418,7 @@ void DispenserDataRequestFunc(MessageContainer* requestContainer) for(i=0;itotalconsumedinnanolitter,RpWarning,(int)IDS_Dispenser_Data[i].totalconsumedinnanolitter,0); + ReportWithPackageFilter(IDSFilter,"DispenserDataRequestFunc",__FILE__,__LINE__,(int)response.dispenserinfo[i]->totalconsumedinnanolitter,RpWarning,(int)IDS_Dispenser_Data[i].totalconsumedinnanolitter,0); } responseContainer = createContainer(MESSAGE_TYPE__DispenserDataResponse, requestContainer->token, true, &response, &dispenser_data_response__pack, &dispenser_data_response__get_packed_size); diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c index 14bb59661..663a6713f 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c @@ -89,7 +89,7 @@ uint32_t IDS_StopHomeDispenserBuildPressure (uint32_t deviceID); AutoHoming_Config_enum AutoHoming_Config = AutoHoming_off; void IDS_Dispenser_SetAutoHoming_Config(AutoHoming_Config_enum Config) { - Report("IDS_Dispenser_SetAutoHoming_Config ",__FILE__,__LINE__,Config,RpWarning,AutoHoming_Config,0); + ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_SetAutoHoming_Config ",__FILE__,__LINE__,Config,RpWarning,AutoHoming_Config,0); if (Special_Dispensers == false) { AutoHoming_Config = Config; @@ -110,7 +110,7 @@ void IDS_Dispenser_SetBackLashValues(double initialdispenserpressure, uint32 InitialDispenserTimeLag = initialdispensertimelag; InitialDispenserSpeed = initialdispenserspeed; - Report("IDS_Dispenser_SetBackLashValues ",__FILE__,InitialDispenserPressure*100,InitialDispenserTimeout,RpWarning,(int)InitialDispenserTimeLag,0); + ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_SetBackLashValues ",__FILE__,InitialDispenserPressure*100,InitialDispenserTimeout,RpWarning,(int)InitialDispenserTimeLag,0); } uint32_t IDS_HomeDispenserWaitForHomingEndCallback(uint32_t DispenserId, uint32_t ReadValue) { @@ -173,11 +173,11 @@ uint32_t IDS_HomeDispenserWaitForHomingEnd(uint32_t DispenserId, uint32_t timeo Valve_Set(IDS_Id_to_AirValve[DispenserId], Atm_MidTank_OFF); Disable_MidTank_Pressure_Reading(DispenserId); - Report("End backlash",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)DispenserHomingTime[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"End backlash",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)DispenserHomingTime[DispenserId],0); if (SafeRemoveControlCallback(DispenserHomingControlId[DispenserId], IDS_HomeDispenserBackMoveCallback )==OK) DispenserHomingControlId[DispenserId] = 0xFF; else - Report("Remove control callback failed",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)DispenserHomingControlId[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"Remove control callback failed",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)DispenserHomingControlId[DispenserId],0); DispenserHomingTime[DispenserId]=0; } else @@ -202,7 +202,7 @@ uint32_t IDS_HomeDispenserCallback(uint32_t motorId, uint32_t ReadValue) } // HomingActive[DispenserId]= false; IDS_Dispenser_RefillEnded ( DispenserId, MotorsCfg[motorId].microstep); - Report("Homing ended",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)DispenserHomingTime[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"Homing ended",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)DispenserHomingTime[DispenserId],0); // DispenserHomingControlId[DispenserId] = AddControlCallback( IDS_HomeDispenserBackMoveCallback, InitialDispenserTimeLag, GetDispenserPressure,motorId, motorId, 0 ); MotorSetDirection(motorId,MotorsCfg[motorId].directionthreadwize); Task_sleep(10); @@ -236,25 +236,25 @@ uint32_t IDS_HomeDispenser (uint32_t DispenserId, uint32_t speed , callback_fptr double midTankContent = 0.0; if (FPGA_Read_limit_Switches(Dispenser_Id_to_LS_Id[DispenserId]) == LIMIT) { - Report("IDS_HomeDispenser - Disp is full",__FILE__,Dispenser_Id_to_LS_Id[DispenserId],(int)DispenserId,RpWarning,LIMIT,0); + ReportWithPackageFilter(IDSFilter,"IDS_HomeDispenser - Disp is full",__FILE__,Dispenser_Id_to_LS_Id[DispenserId],(int)DispenserId,RpWarning,LIMIT,0); return ERROR; } if (Get_MidTank_Pressure_Sensor(DispenserId)<0.2) { - Report("IDS_HomeDispenser - Midtank is empty",__FILE__,Get_MidTank_Int1000_Sensor(DispenserId),(int)DispenserId,RpWarning,LIMIT,0); + ReportWithPackageFilter(IDSFilter,"IDS_HomeDispenser - Midtank is empty",__FILE__,Get_MidTank_Int1000_Sensor(DispenserId),(int)DispenserId,RpWarning,LIMIT,0); return ERROR; } midTankContent = Read_MidTank_Pressure_Sensor(DispenserId); if (midTankContent < 0.2) //midtank is empty - abort!!!! { - Report("IDS_HomeDispenser - Mid Tank Empty!!! ",__FILE__,__LINE__,(int)(midTankContent * 1000),RpWarning,DispenserId,0); + ReportWithPackageFilter(IDSFilter,"IDS_HomeDispenser - Mid Tank Empty!!! ",__FILE__,__LINE__,(int)(midTankContent * 1000),RpWarning,DispenserId,0); return ERROR; } //if Safety is active //if safety is upper position or if ((HomingActive[DispenserId] == true)||(PrimingActive[DispenserId] == true)) { - Report("IDS_HomeDispenser - Homing/priming already active",__FILE__,HomingActive[DispenserId],(int)DispenserId,RpWarning,PrimingActive[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"IDS_HomeDispenser - Homing/priming already active",__FILE__,HomingActive[DispenserId],(int)DispenserId,RpWarning,PrimingActive[DispenserId],0); return ERROR; } @@ -262,7 +262,7 @@ uint32_t IDS_HomeDispenser (uint32_t DispenserId, uint32_t speed , callback_fptr { if ((Get_Notification_Disp_UP(DispenserId) == false)||(Get_Notification_Over_Press(DispenserId) == false)) { - Report("IDS_HomeDispenser - Bypassing safety",__FILE__,HomingActive[DispenserId],(int)DispenserId,RpWarning,PrimingActive[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"IDS_HomeDispenser - Bypassing safety",__FILE__,HomingActive[DispenserId],(int)DispenserId,RpWarning,PrimingActive[DispenserId],0); Control_TCA9534ByPass(DispenserId,ENABLE);// use ENABLE or DISABLE } } @@ -287,13 +287,13 @@ uint32_t IDS_HomeDispenser (uint32_t DispenserId, uint32_t speed , callback_fptr { MotorMovetoLimitSwitch (MotorId,1-MotorsCfg[MotorId].directionthreadwize, speed/4, Dispenser_Id_to_LS_Id[DispenserId], IDS_HomeDispenserCallback,0); CurrentDispenserSpeed[DispenserId] = speed/4; - Report("IDS_HomeDispenser ",__FILE__,(int)(midTankContent*1000),(int)DispenserId,RpWarning,speed/4,0); + ReportWithPackageFilter(IDSFilter,"IDS_HomeDispenser ",__FILE__,(int)(midTankContent*1000),(int)DispenserId,RpWarning,speed/4,0); } else { MotorMovetoLimitSwitch (MotorId,1-MotorsCfg[MotorId].directionthreadwize, speed, Dispenser_Id_to_LS_Id[DispenserId], IDS_HomeDispenserCallback,0); CurrentDispenserSpeed[DispenserId] = speed; - Report("IDS_HomeDispenser ",__FILE__,(int)(midTankContent*1000),(int)DispenserId,RpWarning,speed,0); + ReportWithPackageFilter(IDSFilter,"IDS_HomeDispenser ",__FILE__,(int)(midTankContent*1000),(int)DispenserId,RpWarning,speed,0); } CurrentDispenserSpeed[DispenserId] = (-1*CurrentDispenserSpeed[DispenserId]); DispenserLastMovementDown[DispenserId] = true; @@ -306,10 +306,10 @@ uint32_t IDS_StopHomeDispenser (uint32_t DispenserId) { assert(DispenserId < MAX_SYSTEM_DISPENSERS); - Report("IDS_StopHomeDispenser",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)HomingActive[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"IDS_StopHomeDispenser",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)HomingActive[DispenserId],0); if ((HomingActive[DispenserId] == false)&&( PrimingActive[DispenserId] == false)) { - LOG_ERROR (DispenserId,"Homing not active"); + ReportWithPackageFilter(IDSFilter,"Homing not active",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)HomingActive[DispenserId],0); return OK; } @@ -344,10 +344,10 @@ uint32_t IDS_StopHomeDispenserBuildPressure (uint32_t DispenserId) { assert(DispenserId < MAX_SYSTEM_DISPENSERS); - Report("IDS_StopHomeDispenser and build pressure",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)HomingActive[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"IDS_StopHomeDispenser and build pressure",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)HomingActive[DispenserId],0); if (HomingActive[DispenserId] != true) { - LOG_ERROR (DispenserId,"Homing not active"); + ReportWithPackageFilter(IDSFilter,"Homing not active",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)HomingActive[DispenserId],0); return ERROR; } else @@ -369,10 +369,10 @@ uint32_t IDS_StopHomeDispenserBuildPressure (uint32_t DispenserId) HomingRequestCallback[DispenserId] = NULL; } // HomingActive[DispenserId]= false; - Report("End homing for job start",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)DispenserHomingTime[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"End homing for job start",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)DispenserHomingTime[DispenserId],0); /* else { - Report("homing aborted,start backlash",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)DispenserHomingTime[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"homing aborted,start backlash",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)DispenserHomingTime[DispenserId],0); DispenserHomingControlId[DispenserId] = AddControlCallback( IDS_HomeDispenserBackMoveCallback, InitialDispenserTimeLag, GetDispenserPressure,motorId, motorId, 0 ); Task_sleep(10); MotorSetDirection(motorId,MotorsCfg[motorId].directionthreadwize); @@ -421,7 +421,7 @@ uint32_t IDS_EmptyDispenserCallback(uint32_t motorId, uint32_t ReadValue) { Lubricant_2Way_Valve (STOP); } - Report("End Priming",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)DispenserHomingTime[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"End Priming",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)DispenserHomingTime[DispenserId],0); // MotorSetMicroStep(motorId, KeepMicrostep[DispenserId]); if (HomingRequestCallback[DispenserId]) { @@ -439,14 +439,14 @@ uint32_t IDS_EmptyDispenser (uint32_t DispenserId, uint32_t speed , callback_fpt // return ERROR; if ((HomingActive[DispenserId] == true)||(PrimingActive[DispenserId] == true)) { - Report("IDS_HomeDispenser - Homing/priming already active",__FILE__,HomingActive[DispenserId],(int)DispenserId,RpWarning,PrimingActive[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"IDS_HomeDispenser - Homing/priming already active",__FILE__,HomingActive[DispenserId],(int)DispenserId,RpWarning,PrimingActive[DispenserId],0); return ERROR; } if (Check_Disp_Safety_Stop_Indication(DispenserId) == true) { if ((Get_Notification_Disp_Down(DispenserId) == false)||(Get_Notification_Over_Press(DispenserId) == false)) { - Report("IDS_EmptyDispenser - Bypassing safety",__FILE__,HomingActive[DispenserId],(int)DispenserId,RpWarning,PrimingActive[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"IDS_EmptyDispenser - Bypassing safety",__FILE__,HomingActive[DispenserId],(int)DispenserId,RpWarning,PrimingActive[DispenserId],0); Control_TCA9534ByPass(DispenserId,ENABLE);// use ENABLE or DISABLE } } @@ -478,7 +478,7 @@ uint32_t IDS_EmptyDispenser (uint32_t DispenserId, uint32_t speed , callback_fpt uint32_t IDS_Dispenser_Alarm_On (uint8_t DispenserId) { uint32_t status = OK; - Report("IDS_Dispenser_Alarm_On",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,0,0); + ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_Alarm_On",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,0,0); assert(DispenserId < MAX_SYSTEM_DISPENSERS); DispensersAlarmState[DispenserId] = true; TimerMotors_t MotorId = HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1 + DispenserId; @@ -498,12 +498,12 @@ uint32_t IDS_Dispenser_Alarm_Off (uint8_t DispenserId) uint32_t status = OK; assert(DispenserId < MAX_SYSTEM_DISPENSERS); DispensersAlarmState[DispenserId] = false; - Report("IDS_Dispenser_Alarm_Off",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,0,0); + ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_Alarm_Off",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,0,0); return status; } uint32_t IDS_ReCheck_Pressure_Callback(uint32_t DispenserId, uint32_t ReadValue) { - Report("Pulling dispenser down result",__FILE__,DispenserId,(int)(GetDispenserPressure(DispenserId)*100),RpWarning,200,0); + ReportWithPackageFilter(IDSFilter,"Pulling dispenser down result",__FILE__,DispenserId,(int)(GetDispenserPressure(DispenserId)*100),RpWarning,200,0); SafeRemoveControlCallback(GetControlLowDevice_i(), IDS_ReCheck_Pressure_Callback ); return OK; @@ -524,7 +524,6 @@ uint32_t IDS_Check_Pressure_Callback(uint32_t DispenserId, uint32_t ReadValue) { if (DispenserUsedInJob[DispenserId] == true) { - //LOG_ERROR(DispenserId,"IDS_Check_Pressure_Callback active in a job"); return ERROR; } } @@ -534,11 +533,10 @@ uint32_t IDS_Check_Pressure_Callback(uint32_t DispenserId, uint32_t ReadValue) if (GetDispenserPressure(DispenserId)>3.0) { //10/8/2020 pulling down 2000 steps - Report("Pulling dispenser down to reduce pressure",__FILE__,DispenserId,(int)(GetDispenserPressure(DispenserId)*100),RpWarning,2000,0); + ReportWithPackageFilter(IDSFilter,"Pulling dispenser down to reduce pressure",__FILE__,DispenserId,(int)(GetDispenserPressure(DispenserId)*100),RpWarning,2000,0); if ((HomingActive[DispenserId] == true)||(PrimingActive[DispenserId] == true)) { - Report("Dispenser in pressure but homing active",__FILE__,DispenserId,(int)HomingActive[DispenserId],RpWarning,PrimingActive[DispenserId],0); - LOG_ERROR(DispenserId,"IDS_Check_Pressure_Callback homing active"); + ReportWithPackageFilter(IDSFilter,"Dispenser in pressure but homing active",__FILE__,DispenserId,(int)HomingActive[DispenserId],RpWarning,PrimingActive[DispenserId],0); return ERROR; } MotorMove(HW_Motor_Id,1-MotorsCfg[HW_Motor_Id].directionthreadwize,2000*MotorsCfg[HW_Motor_Id].microstep); @@ -559,7 +557,7 @@ uint32_t IDS_Check_Pressure_Callback(uint32_t DispenserId, uint32_t ReadValue) void IDS_Dispenser_Init(uint8_t DispenserId) { assert(DispenserId < MAX_SYSTEM_DISPENSERS); - Report("IDS_Dispenser_Init",__FILE__,DispenserId,HomingActive[DispenserId],RpWarning,PrimingActive[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_Init",__FILE__,DispenserId,HomingActive[DispenserId],RpWarning,PrimingActive[DispenserId],0); CurrentDispenserSpeed[DispenserId] = 0; HomingActive[DispenserId]= false; PrimingActive[DispenserId]= false; diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c index c0ccefde1..8ee0b507e 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c @@ -103,7 +103,7 @@ void IDS_Dispenser_SetPreSegmentWFCFValues(double dispenserpresegmentwfcf, doubl InterSegmentStartWFCFDispensers = ids_presegment_wfcf_timebeforesegment; if (dispenserpresegmentwfcf) WFCF = dispenserpresegmentwfcf; - Report("IDS_Dispenser_SetPreSegmentWFCFValues ",__FILE__,__LINE__,dispenserpresegmentwfcf,RpWarning,(int)ids_presegment_wfcf_timebeforesegment,0); + ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_SetPreSegmentWFCFValues ",__FILE__,__LINE__,dispenserpresegmentwfcf,RpWarning,(int)ids_presegment_wfcf_timebeforesegment,0); } void IDS_Dispenser_SetPreSegmentCleaningValues(double ids_cleaningspeed,double ids_cleaningstartspraypresegmenttime ,double ids_cleaningstopbeforesegmenttime,double ids_leftcleaningmotorspeed,double ids_rightcleaningmotorspeed) @@ -122,9 +122,9 @@ void IDS_Dispenser_SetPreSegmentWFCFValues(double dispenserpresegmentwfcf, doubl if ( ids_rightcleaningmotorspeed) RightRockerSpeed = ids_rightcleaningmotorspeed; minimal_intersegment_length = ids_cleaningstopbeforesegmenttime+ids_cleaningstartspraypresegmenttime+2000; - Report("IDS_Dispenser_SetPreSegmentCleaningValues ",__FILE__,__LINE__,RightRockerSpeed,RpWarning,(int)LeftRockerSpeed,0); - Report("IDS_Dispenser_SetPreSegmentCleaningValues ",__FILE__,minimal_intersegment_length,InterSegmentStartSprayCleaner,RpWarning,(int)InterSegmentCenterRockers,0); - Report("IDS_Dispenser actuator times ",__FILE__,(int)LeftRockerSpeed/100*IDS_PRESEGMENT_TIME_STEP,(int)LeftRockerSpeed%100*IDS_PRESEGMENT_TIME_STEP,RpWarning,(int)RightRockerSpeed*IDS_PRESEGMENT_TIME_STEP,0); + ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_SetPreSegmentCleaningValues ",__FILE__,__LINE__,RightRockerSpeed,RpWarning,(int)LeftRockerSpeed,0); + ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_SetPreSegmentCleaningValues ",__FILE__,minimal_intersegment_length,InterSegmentStartSprayCleaner,RpWarning,(int)InterSegmentCenterRockers,0); + ReportWithPackageFilter(IDSFilter,"IDS_Dispenser actuator times ",__FILE__,(int)LeftRockerSpeed/100*IDS_PRESEGMENT_TIME_STEP,(int)LeftRockerSpeed%100*IDS_PRESEGMENT_TIME_STEP,RpWarning,(int)RightRockerSpeed*IDS_PRESEGMENT_TIME_STEP,0); } uint32_t DispenserPreSegmentControlId = 0xFF; @@ -189,21 +189,21 @@ uint32_t IDS_Pid_Testing_Func(uint32_t DispenserId, uint32_t ReadValue) &DispenserControlConfig[DispenserId].m_params, &DispenserControlConfig[DispenserId].m_preError, &DispenserControlConfig[DispenserId].m_integral); DispenserControlConfig[DispenserId].m_calculatedError = (-1*DispenserControlConfig[DispenserId].m_calculatedError); calculated_speed = (1-DispenserControlConfig[DispenserId].m_calculatedError)*CurrentDispenserSpeed[DispenserId]; - Report("IDS_Pid_Testing_Func ",__FILE__,DispenserId,(int)(DispenserControlConfig[DispenserId].m_mesuredParam*1000),RpWarning,(int)calculated_speed,0); + ReportWithPackageFilter(IDSFilter,"IDS_Pid_Testing_Func ",__FILE__,DispenserId,(int)(DispenserControlConfig[DispenserId].m_mesuredParam*1000),RpWarning,(int)calculated_speed,0); return OK; } void IDS_Start_Pid_Testing(int DispenserId) { DispenserPidControlId[DispenserId] = AddControlCallback(NULL, IDS_Pid_Testing_Func,eOneSecond , TemplateDataReadCBFunction,DispenserId,DispenserId, DispenserId ); - Report("IDS_Start_Pid_Testing ",__FILE__,__LINE__,DispenserId,RpWarning,(int)DispenserPidControlId[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"IDS_Start_Pid_Testing ",__FILE__,__LINE__,DispenserId,RpWarning,(int)DispenserPidControlId[DispenserId],0); } void IDS_Stop_Pid_Testing(int DispenserId) { //stop this control loop RemoveControlCallback(DispenserPidControlId[DispenserId], IDS_Pid_Testing_Func ); DispenserPidControlId[DispenserId] = 0xFF; - Report("IDS_Stop_Pid_Testing ",__FILE__,__LINE__,DispenserId,RpWarning,(int)DispenserPidControlId[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"IDS_Stop_Pid_Testing ",__FILE__,__LINE__,DispenserId,RpWarning,(int)DispenserPidControlId[DispenserId],0); } /* * IDS Printing support @@ -291,7 +291,7 @@ JobDescriptionFileBrushStop *FirstBrushStop = NULL; if ((brushCounter % 1000)==900) { Task_sleep(200); - Report("Sleep in file parsing",__FILE__, BrushStop->index, brushCounter, RpWarning, Segment->brushstopscount, 0); + ReportWithPackageFilter(IDSFilter,"Sleep in file parsing",__FILE__, BrushStop->index, brushCounter, RpWarning, Segment->brushstopscount, 0); Control_WD(ENABLE,55); //activate heaters/dispenser watchdog, 0.5 seconds } brushCounter++; @@ -329,7 +329,7 @@ JobDescriptionFileBrushStop *FirstBrushStop = NULL; }//if dispensers else { - LOG_ERROR (BrushStop->index, "no dispensers in brushstop"); + ReportWithPackageFilter(IDSFilter,"no dispensers in brushstop",__FILE__,__LINE__,(int)BrushStop->index,RpError,(int)BrushStop->n_dispensers,0); } if (FirstBrushStop!= BrushStop) FreeBrushStopFileData(BrushStop); @@ -337,7 +337,7 @@ JobDescriptionFileBrushStop *FirstBrushStop = NULL; } else { - LOG_ERROR (BrushStop, "malloc error"); + ReportWithPackageFilter(IDSFilter,"malloc error",__FILE__,__LINE__,(int)0,RpError,(int)0,0); status = ERROR; } }//for brushstops @@ -357,7 +357,7 @@ JobDescriptionFileBrushStop *FirstBrushStop = NULL; ActiveDispensers++; } } - Report("Finished checking the file", __FILE__, __LINE__, n_segments, RpWarning, ActiveDispensers, 0); + ReportWithPackageFilter(IDSFilter,"Finished checking the file", __FILE__, __LINE__, n_segments, RpWarning, ActiveDispensers, 0); return status; } @@ -462,12 +462,12 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) { if ((HomingActive[DispenserId] == false)&&(PrimingActive[DispenserId] == false)) { - Report("Homing Inactive dispenser",__FILE__,DispenserId,HomingActive[DispenserId],RpWarning,PrimingActive[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"Homing Inactive dispenser",__FILE__,DispenserId,HomingActive[DispenserId],RpWarning,PrimingActive[DispenserId],0); IDS_HomeDispenser (DispenserId, 1000 , NULL); } else { - Report("Inactive dispenser already homing",__FILE__,DispenserId,HomingActive[DispenserId],RpWarning,PrimingActive[DispenserId],0); + ReportWithPackageFilter(IDSFilter,"Inactive dispenser already homing",__FILE__,DispenserId,HomingActive[DispenserId],RpWarning,PrimingActive[DispenserId],0); } } return OK; @@ -490,7 +490,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) { if ((HomingActive[i] == false)&&(PrimingActive[i] == false)) { - Report("Inactive dispenser close valve",__FILE__,i,HomingActive[i],RpWarning,PrimingActive[i],0); + ReportWithPackageFilter(IDSFilter,"Inactive dispenser close valve",__FILE__,i,HomingActive[i],RpWarning,PrimingActive[i],0); Control3WayValvesWithCallback (i, MidTank_Dispenser, InactiveDispenserHome); //direction: MidTank_Dispenser or Dispenser_Mixer } } @@ -560,13 +560,13 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) #endif { NumofReadyDispensers++; - Report("Dispenser total prepare steps ready",__FILE__,DispenserTotalPrepareSteps[i],(int)(DispenserPreparePressure*100),RpWarning,IDS_Dispenser_Data[i].consumedinnanolitter,0); + ReportWithPackageFilter(IDSFilter,"Dispenser total prepare steps ready",__FILE__,DispenserTotalPrepareSteps[i],(int)(DispenserPreparePressure*100),RpWarning,IDS_Dispenser_Data[i].consumedinnanolitter,0); } if (Special_Dispensers == true) { MotorStop(HW_Motor_Id, Hard_Hiz); CurrentDispenserSpeed[i] = 0; - //Report("IDS stopped ready",__FILE__,i,(int)(DispenserPreparePressure*100),RpWarning,(int)NumofReadyDispensers,0); + //ReportWithPackageFilter(IDSFilter,"IDS stopped ready",__FILE__,i,(int)(DispenserPreparePressure*100),RpWarning,(int)NumofReadyDispensers,0); } else { @@ -574,7 +574,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) updatedSpeed = (tempSpeed*0.992>100)?tempSpeed*0.992:100; MotorSetSpeed(HW_Motor_Id, updatedSpeed); CurrentDispenserSpeed[i] = updatedSpeed; - //Report("IDS reduce speed",__FILE__,i,(int)tempSpeed,RpWarning,(int)updatedSpeed,0); + //ReportWithPackageFilter(IDSFilter,"IDS reduce speed",__FILE__,i,(int)tempSpeed,RpWarning,(int)updatedSpeed,0); } } else @@ -600,31 +600,31 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) HW_Motor_Id = DispenserIdToMotorId[CLEANER_DISPENSER]; MotorStop(HW_Motor_Id, Hard_Hiz); if (CurrentDispenserSpeed[CLEANER_DISPENSER]) - Report("IDS stop cleaner",__FILE__,CLEANER_DISPENSER,(int)(GetDispenserPressure(CLEANER_DISPENSER)*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); + ReportWithPackageFilter(IDSFilter,"IDS stop cleaner",__FILE__,CLEANER_DISPENSER,(int)(GetDispenserPressure(CLEANER_DISPENSER)*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); CurrentDispenserSpeed[CLEANER_DISPENSER] = 0; } if ((NumofReadyDispensers)&&(DispenserBuildTimeCounter%1000 == 0)) { - Report("IDS_Prepare_Callback",__FILE__,DispenserBuildTimeCounter,NumofReadyDispensers,RpWarning,(int)NumOfActiveDispensers,0); + ReportWithPackageFilter(IDSFilter,"IDS_Prepare_Callback",__FILE__,DispenserBuildTimeCounter,NumofReadyDispensers,RpWarning,(int)NumOfActiveDispensers,0); } if (NumofReadyDispensers>=NumOfActiveDispensers) { pressureReady = true; - Report("pressureReady = true;",__FILE__,DispenserBuildTimeCounter,NumofReadyDispensers,RpWarning,(int)NumOfActiveDispensers,0); + ReportWithPackageFilter(IDSFilter,"pressureReady = true;",__FILE__,DispenserBuildTimeCounter,NumofReadyDispensers,RpWarning,(int)NumOfActiveDispensers,0); } if ((DispenserBuildTimeCounter >= DispenserPrepareTimeout)||(pressureReady == true)) { DispenserBuildTimeCounter = 0; pressureReady = true; - Report("pressureReady = true or timeout;",__FILE__,DispenserBuildTimeCounter,NumofReadyDispensers,RpWarning,(int)(DispenserPreparePressure*100),0); + ReportWithPackageFilter(IDSFilter,"pressureReady = true or timeout;",__FILE__,DispenserBuildTimeCounter,NumofReadyDispensers,RpWarning,(int)(DispenserPreparePressure*100),0); } } else if (endOfPrepareWCF == false) { if ((DispenserBuildTimeCounter == PRESSURE_READ_TIME_GAP)&&(FirstBrushStop)) { - Report("start prepare dispensers at rate * WFCF",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); + ReportWithPackageFilter(IDSFilter,"start prepare dispensers at rate * WFCF",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); if (FirstBrushStop) { REPORT_MSG(FirstBrushStop->index,"WFCFBrushStopRead Index"); @@ -673,7 +673,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) } CurrentDispenserSpeed[Dispenser_i] = segmentfirst_speed; - usnprintf(IdMessage, 80, + /*usnprintf(IdMessage, 80, "WFCF Dispenser %d nl/sec %d nl/pulse %d Pulse/sec %d speed %d", DispenserId, (int) Dispensers[Dispenser_i]->nanolitterpersecond, @@ -681,8 +681,8 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) (int) Dispensers[Dispenser_i]->pulsepersecond*1000, (int) segmentfirst_speed*1000); //REPORT_MSG(segmentfirst_speed,IdsMessage); - Report(IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, segmentfirst_speed, 0); - //SendJobProgress(0.0, 0, false, IdsMessage); + ReportWithPackageFilter(IDSFilter,IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, segmentfirst_speed, 0); + //SendJobProgress(0.0, 0, false, IdsMessage);*/ } else { @@ -690,11 +690,15 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) { MotorStop(HW_Motor_Id, Hard_Hiz); CurrentDispenserSpeed[Dispenser_i] = 0; - usnprintf(IdsMessage, 80,"Presegment Prepare Dispenser %d stopped",DispenserId,(int) segmentfirst_speed); - Report(IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, segmentfirst_speed, 0); + //usnprintf(IdsMessage, 80,"WFCF Prepare Dispenser %d stopped",DispenserId,(int) segmentfirst_speed); + //ReportWithPackageFilter(IDSFilter,IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, segmentfirst_speed, 0); } } }//for + usnprintf(IdMessage, 80,"WFCF %d D1 %d,D2 %d,D3 %d,D4 %d,D5 %d",WFCF,CurrentDispenserSpeed[0], + CurrentDispenserSpeed[1],CurrentDispenserSpeed[2],CurrentDispenserSpeed[3],CurrentDispenserSpeed[4]); + ReportWithPackageFilter(IDSFilter,IdsMessage, __FILE__, __LINE__, DispenserBuildTimeCounter, RpWarning, WFCF, 0); + }//if n_dis } } @@ -708,7 +712,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) endOfPrepareWCF = true; FreeBrushStopFileData(FirstBrushStop); FirstBrushStop =NULL; - Report("endOfPrepareWCF = true;",__FILE__,DispenserBuildTimeCounter,NumofReadyDispensers,RpWarning,(int)NumOfActiveDispensers,0); + ReportWithPackageFilter(IDSFilter,"endOfPrepareWCF = true;",__FILE__,DispenserBuildTimeCounter,NumofReadyDispensers,RpWarning,(int)NumOfActiveDispensers,0); } } @@ -720,11 +724,11 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) HW_Motor_Id = DispenserIdToMotorId[CLEANER_DISPENSER]; MotorStop(HW_Motor_Id, Hard_Hiz); CurrentDispenserSpeed[CLEANER_DISPENSER] = 0; - Report("IDS stop cleaner",__FILE__,CLEANER_DISPENSER,(int)(GetDispenserPressure(CLEANER_DISPENSER)*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); + ReportWithPackageFilter(IDSFilter,"IDS stop cleaner",__FILE__,CLEANER_DISPENSER,(int)(GetDispenserPressure(CLEANER_DISPENSER)*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); } SafeRemoveControlCallback(DispenserPrepareControlId, IDS_Prepare_Callback ); DispenserPrepareControlId = 0xFF; - Report("IDS_Prepare_Callback SafeRemoveControlCallback",__FILE__,DispenserBuildTimeCounter,NumofReadyDispensers,RpWarning,(int)NumOfActiveDispensers,0); + ReportWithPackageFilter(IDSFilter,"IDS_Prepare_Callback SafeRemoveControlCallback",__FILE__,DispenserBuildTimeCounter,NumofReadyDispensers,RpWarning,(int)NumOfActiveDispensers,0); setRapidPressureRead(false); pressureReady = false; endOfPrepareWCF = false; @@ -749,7 +753,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) JobEndSequence = false; if ((pressurebuildup>0.1)&&(pressurebuildup<4.0)) { - Report("Setting pressure from RML feeder tension",__FILE__,__LINE__,(int)(pressurebuildup*100),RpWarning,(int)(DispenserPreparePressure*100),0); + ReportWithPackageFilter(IDSFilter,"Setting pressure from RML feeder tension",__FILE__,__LINE__,(int)(pressurebuildup*100),RpWarning,(int)(DispenserPreparePressure*100),0); DispenserPreparePressure = pressurebuildup; } if (JobTicket->headcleaningparameters) @@ -759,7 +763,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) } if ((cleanerFlow>200)&&(cleanerFlow<1150)) { - Report("Setting cleanerFlow from RML cleanerFlow",__FILE__,__LINE__,(int)(cleanerFlow),RpWarning,(int)CleaningDispenserSpeed,0); + ReportWithPackageFilter(IDSFilter,"Setting cleanerFlow from RML cleanerFlow",__FILE__,__LINE__,(int)(cleanerFlow),RpWarning,(int)CleaningDispenserSpeed,0); CleaningDispenserSpeed = cleanerFlow; } else if (cleanerFlow <= 10) @@ -811,7 +815,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) if (IDS_Active == false) { - LOG_ERROR(IDS_Active,"IDSPrepareStart Not in a job"); + ReportWithPackageFilter(IDSFilter,"IDSPrepareStart Not in a job",__FILE__,__LINE__,(int)0,RpError,(int)0,0); return; } @@ -827,11 +831,11 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) NumOfActiveDispensers++; if (HomingActive[i] == true) { - Report("Stop active dispenser homing ",__FILE__,i,HomingActive[i],RpWarning,CurrentDispenserSpeed[i],0); + ReportWithPackageFilter(IDSFilter,"Stop active dispenser homing ",__FILE__,i,HomingActive[i],RpWarning,CurrentDispenserSpeed[i],0); IDS_StopHomeDispenser(i); } DispenserTotalPrepareSteps[i] = 0; - Report("Dispenser total prepare steps zero",__FILE__,i,DispenserTotalPrepareSteps[i],RpWarning,IDS_Dispenser_Data[i].consumedinnanolitter,0); + ReportWithPackageFilter(IDSFilter,"Dispenser total prepare steps zero",__FILE__,i,DispenserTotalPrepareSteps[i],RpWarning,IDS_Dispenser_Data[i].consumedinnanolitter,0); } else { @@ -839,12 +843,12 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) { if ((HomingActive[i] == false)&&(PrimingActive[i] == false)) { - Report("Homing Inactive dispenser",__FILE__,i,HomingActive[i],RpWarning,PrimingActive[i],0); + ReportWithPackageFilter(IDSFilter,"Homing Inactive dispenser",__FILE__,i,HomingActive[i],RpWarning,PrimingActive[i],0); IDS_HomeDispenser (i, 1000 , NULL); } else { - Report("Inactive dispenser already homing",__FILE__,i,HomingActive[i],RpWarning,PrimingActive[i],0); + ReportWithPackageFilter(IDSFilter,"Inactive dispenser already homing",__FILE__,i,HomingActive[i],RpWarning,PrimingActive[i],0); } } } @@ -865,7 +869,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) { //if (HomingActive[i] == false) { - Report("Prepare Speed",__FILE__,HomingActive[i],i,RpWarning,(int)dispenserspeed,0); + ReportWithPackageFilter(IDSFilter,"Prepare Speed",__FILE__,HomingActive[i],i,RpWarning,(int)dispenserspeed,0); MotorSetDirection((TimerMotors_t)HW_Motor_Id,MotorsCfg[HW_Motor_Id].directionthreadwize); //set the dispenser to the if (Special_Dispensers == true) { @@ -878,7 +882,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) } /*else { - Report("IDSPrepare Stop Dispenser Homing",__FILE__,__LINE__,i,RpWarning,(int)HomingActive[i],0); + ReportWithPackageFilter(IDSFilter,"IDSPrepare Stop Dispenser Homing",__FILE__,__LINE__,i,RpWarning,(int)HomingActive[i],0); IDS_HomeDispenserWaitForHomingEnd(i, DispenserPrepareTimeout/2 , IDSPrepareStartDispenserAfterHoming); }*/ } @@ -886,7 +890,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) TimerMotors_t HW_Motor_Id = DispenserIdToMotorId[CLEANER_DISPENSER]; MotorSetSpeed((TimerMotors_t)HW_Motor_Id,INITIAL_CLEANER_SPEED ); //set the dispenser to the CurrentDispenserSpeed[CLEANER_DISPENSER] = INITIAL_CLEANER_SPEED; - Report("IDS start cleaner",__FILE__,CLEANER_DISPENSER,(int)(GetDispenserPressure(CLEANER_DISPENSER)*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); + ReportWithPackageFilter(IDSFilter,"IDS start cleaner",__FILE__,CLEANER_DISPENSER,(int)(GetDispenserPressure(CLEANER_DISPENSER)*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); } @@ -939,7 +943,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) updatedSpeed = (tempSpeed*0.98>100)?tempSpeed*0.98:100; MotorSetSpeed(HW_Motor_Id, updatedSpeed); CurrentDispenserSpeed[i] = updatedSpeed; - //Report("IDS PreSegment reduce speed",__FILE__,i,(int)tempSpeed,RpWarning,(int)updatedSpeed,0); + //ReportWithPackageFilter(IDSFilter,"IDS PreSegment reduce speed",__FILE__,i,(int)tempSpeed,RpWarning,(int)updatedSpeed,0); } else { @@ -947,20 +951,20 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) updatedSpeed = (tempSpeed*1.04<1100)?tempSpeed*1.04:1100; MotorSetSpeed(HW_Motor_Id, updatedSpeed); CurrentDispenserSpeed[i] = updatedSpeed; - //Report("IDS PreSegment accelerate speed",__FILE__,i,(int)tempSpeed,RpWarning,(int)updatedSpeed,0); + //ReportWithPackageFilter(IDSFilter,"IDS PreSegment accelerate speed",__FILE__,i,(int)tempSpeed,RpWarning,(int)updatedSpeed,0); } } } if ((NumofReadyDispensers)&&(DispenserBuildTimeCounter%1000 == 0)) - Report("IDS_PreSegmentPrepare_Callback",__FILE__,DispenserBuildTimeCounter,InterSegmentStepsCount,RpWarning,(int)NumOfActiveDispensers,0); + ReportWithPackageFilter(IDSFilter,"IDS_PreSegmentPrepare_Callback",__FILE__,DispenserBuildTimeCounter,InterSegmentStepsCount,RpWarning,(int)NumOfActiveDispensers,0); if (NumofReadyDispensers>=NumOfActiveDispensers) pressureReady = true; if ((DispenserBuildTimeCounter >= DispenserPrepareTimeout)||(pressureReady == true)) { - Report("IDS_PreSegmentPrepare_Callback SafeRemoveControlCallback",__FILE__,DispenserPrepareControlId,InterSegmentStepsCount,RpWarning,(int)NumOfActiveDispensers,0); + ReportWithPackageFilter(IDSFilter,"IDS_PreSegmentPrepare_Callback SafeRemoveControlCallback",__FILE__,DispenserPrepareControlId,InterSegmentStepsCount,RpWarning,(int)NumOfActiveDispensers,0); SafeRemoveControlCallback(DispenserPrepareControlId, IDS_Prepare_Callback ); DispenserPrepareControlId = 0xFF; PreSegmentWCFStarted = true; @@ -983,7 +987,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) } if (FileBrushStop) { - Report("start dispensers pre segment pressure build",__FILE__,__LINE__,FileBrushStop->index,RpWarning,(int)FileBrushStop->n_dispensers,0); + ReportWithPackageFilter(IDSFilter,"start dispensers pre segment pressure build",__FILE__,__LINE__,FileBrushStop->index,RpWarning,(int)FileBrushStop->n_dispensers,0); NumOfActiveDispensers = FileBrushStop->n_dispensers; Dispensers = FileBrushStop->dispensers; n_dispensers = FileBrushStop->n_dispensers; @@ -1008,9 +1012,9 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) DispenserUsedInSegment[Dispenser_i] = true; MotorSetSpeed(HW_Motor_Id, DispenserPrepareSpeed); CurrentDispenserSpeed[Dispenser_i] = DispenserPrepareSpeed; - usnprintf(IdsMessage, 80,"Presegment Prepare Dispenser %d speed %d",DispenserId,(int) DispenserPrepareSpeed); + //usnprintf(IdsMessage, 80,"Presegment Prepare Dispenser %d speed %d",DispenserId,(int) DispenserPrepareSpeed); //REPORT_MSG(segmentfirst_speed,IdsMessage); - Report(IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, DispenserPrepareSpeed, 0); + //ReportWithPackageFilter(IDSFilter,IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, DispenserPrepareSpeed, 0); //SendJobProgress(0.0, 0, false, IdsMessage); } else @@ -1026,11 +1030,15 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) MotorStop(HW_Motor_Id, Hard_Hiz); } CurrentDispenserSpeed[Dispenser_i] = 0; - usnprintf(IdsMessage, 80,"Presegment Prepare Dispenser %d stopped",DispenserId,(int) segmentfirst_speed); - Report(IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, segmentfirst_speed, 0); + //usnprintf(IdsMessage, 80,"Presegment Prepare Dispenser %d stopped",DispenserId,(int) segmentfirst_speed); + //ReportWithPackageFilter(IDSFilter,IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, segmentfirst_speed, 0); } } - } + }//for + usnprintf(IdMessage, 80,"Presegment Prepare D1 %d,D2 %d,D3 %d,D4 %d,D5 %d",CurrentDispenserSpeed[0], + CurrentDispenserSpeed[1],CurrentDispenserSpeed[2],CurrentDispenserSpeed[3],CurrentDispenserSpeed[4]); + ReportWithPackageFilter(IDSFilter,IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, segmentfirst_speed, 0); + DispenserBuildTimeCounter = 0; //DispenserPrepareControlId = AddControlCallback( IDS_PreSegmentPrepare_Callback, PRESSURE_READ_TIME_GAP,TemplateDataReadCBFunction ,0, 0, 0 ); setRapidPressureRead(true); @@ -1112,7 +1120,7 @@ uint32_t IDS_Cleaning_Stop_Cleaning_Solution (callback_fptr callback); if (InterSegmentStepsCount >= lInterSegmentLength) { //IDS_Valve_PresegmentReady(1,0); - Report("End of Pre-segment Handling",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); + ReportWithPackageFilter(IDSFilter,"End of Pre-segment Handling",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); //PreSegmentReady(Module_IDS,ModuleDone); SafeRemoveControlCallback(DispenserPreSegmentControlId,IDSPreSegmentStateCallbackRunner); if (CurrentDispenserSpeed[CLEANER_DISPENSER]>0) @@ -1125,12 +1133,12 @@ uint32_t IDS_Cleaning_Stop_Cleaning_Solution (callback_fptr callback); { if (( InterSegmentStartSprayCleaner )&&(InterSegmentStartSprayCleaner == InterSegmentStepsCount)) { - Report("Start Spray Cleaner",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); + ReportWithPackageFilter(IDSFilter,"Start Spray Cleaner",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); IDS_Cleaning_Spray_Cleaning_Solution (CleaningDispenserSpeed,NULL); } /*if (InterSegmentStartRocking == InterSegmentStepsCount) { - Report("Start cleaning rockers",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); + ReportWithPackageFilter(IDSFilter,"Start cleaning rockers",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); //IDS_Cleaning_Move_Rockers (int LeftRockerSpeed,int RightRockerSpeed); }*/ if (( InterSegmentStartSprayCleaner )&& @@ -1141,7 +1149,7 @@ uint32_t IDS_Cleaning_Stop_Cleaning_Solution (callback_fptr callback); } if (( InterSegmentCenterRockers)&&(InterSegmentCenterRockers == (lInterSegmentLength-InterSegmentStepsCount))) { - Report("Stop spray and center rockers",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); + ReportWithPackageFilter(IDSFilter,"Stop spray and center rockers",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); IDS_Cleaning_Stop_Cleaning_Solution (NULL); //IDS_Cleaning_Center_And_Stop_Rockers (int timeout,callback_fptr callback); } @@ -1163,7 +1171,7 @@ uint32_t IDS_Cleaning_Stop_Cleaning_Solution (callback_fptr callback); } if ((InterSegmentStartWFCFDispensers > 0)&&(InterSegmentStartWFCFDispensers == InterSegmentStepsCount)) { - Report("start dispensers at rate * WFCF",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); + ReportWithPackageFilter(IDSFilter,"start dispensers at rate * WFCF",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); PreSegmentWCFStarted = true; // stop any presegment prepare stages, if still exist PreSegmentPrepareStarted = false; setRapidPressureRead(false); @@ -1210,7 +1218,7 @@ uint32_t IDS_Cleaning_Stop_Cleaning_Solution (callback_fptr callback); MotorSetSpeed(HW_Motor_Id, segmentfirst_speed); CurrentDispenserSpeed[Dispenser_i] = segmentfirst_speed; - usnprintf(IdMessage, 80, + /*usnprintf(IdMessage, 80, "WFCF Dispenser %d nl/sec %d nl/pulse %d Pulse/sec %d speed %d", DispenserId, (int) Dispensers[Dispenser_i]->nanolitterpersecond, @@ -1218,10 +1226,13 @@ uint32_t IDS_Cleaning_Stop_Cleaning_Solution (callback_fptr callback); (int) Dispensers[Dispenser_i]->pulsepersecond*1000, (int) segmentfirst_speed*1000); //REPORT_MSG(segmentfirst_speed,IdsMessage); - Report(IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, segmentfirst_speed, 0); - //SendJobProgress(0.0, 0, false, IdsMessage); + ReportWithPackageFilter(IDSFilter,IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, segmentfirst_speed, 0); + //SendJobProgress(0.0, 0, false, IdsMessage);*/ } - } + }//for + usnprintf(IdMessage, 80,"Presegment WFCF %d D1 %d,D2 %d,D3 %d,D4 %d,D5 %d",WFCF,CurrentDispenserSpeed[0], + CurrentDispenserSpeed[1],CurrentDispenserSpeed[2],CurrentDispenserSpeed[3],CurrentDispenserSpeed[4]); + ReportWithPackageFilter(IDSFilter,IdsMessage, __FILE__, __LINE__, FileBrushStop->index, RpWarning, lInterSegmentLength, 0); } } //startDispensersAtSegmentSpeed*1=WFCFClenerSpray(speed); @@ -1248,7 +1259,7 @@ uint32_t IDSCheckSegmentData(void *SegmentDetails, int SegmentId) { if (JobBrushStopIdbrushstopscount) //we did not finish reading the brushstops of the previous segment { - Report("Unhandled brushstops remained",__FILE__,__LINE__,(int)JobBrushStopId,RpWarning,(int)PrevSegment->brushstopscount,0); + ReportWithPackageFilter(IDSFilter,"Unhandled brushstops remained",__FILE__,__LINE__,(int)JobBrushStopId,RpWarning,(int)PrevSegment->brushstopscount,0); //REPORT_MSG (Segment->brushstopscount, "Segment->brushstopscount"); //for (Brush_i=JobBrushStopId;Brush_ibrushstopscount;Brush_i++) #bug 3348 - unhandled jobstops stops too soon for (Brush_i=JobBrushStopId;Brush_ibrushstopscount;Brush_i++) @@ -1259,22 +1270,22 @@ uint32_t IDSCheckSegmentData(void *SegmentDetails, int SegmentId) if (tFileBrushStop) { FreeBrushStopFileData(tFileBrushStop); - Report("Unhandled brushstops handled",__FILE__,__LINE__,(int)Brush_i,RpWarning,(int)PrevSegment->brushstopscount,0); + ReportWithPackageFilter(IDSFilter,"Unhandled brushstops handled",__FILE__,__LINE__,(int)Brush_i,RpWarning,(int)PrevSegment->brushstopscount,0); } else { Task_stat(Task_self(),&statbuf); - Report("Unhandled BrushStopRead Error",__FILE__,statbuf.used,(int)statbuf.stackSize,RpWarning,(int)statbuf.stackHeap,0); + ReportWithPackageFilter(IDSFilter,"Unhandled BrushStopRead Error",__FILE__,statbuf.used,(int)statbuf.stackSize,RpWarning,(int)statbuf.stackHeap,0); //JobEndReason = JOB_OUT_OF_DYE; //SegmentReady(Module_IDS,ModuleFail); - Report("Unhandled brushstops ERROR",__FILE__,__LINE__,(int)tFileBrushStop,RpWarning,(int)PrevSegment->brushstopscount,0); + ReportWithPackageFilter(IDSFilter,"Unhandled brushstops ERROR",__FILE__,__LINE__,(int)tFileBrushStop,RpWarning,(int)PrevSegment->brushstopscount,0); status = ERROR; break; } }//for brushstops } } - Report("Unhandled brushstops result",__FILE__,__LINE__,(int)Brush_i,RpWarning,(int)PrevSegment->brushstopscount,0); + ReportWithPackageFilter(IDSFilter,"Unhandled brushstops result",__FILE__,__LINE__,(int)Brush_i,RpWarning,(int)PrevSegment->brushstopscount,0); return OK; } uint32_t IDSPreSegmentState(void *SegmentDetails, int SegmentId) @@ -1294,7 +1305,7 @@ uint32_t IDSPreSegmentState(void *SegmentDetails, int SegmentId) REPORT_MSG(Segment->n_brushstops,"IDSPreSegmentState"); if (JobBrushStopId>=Segment->n_brushstops) { - LOG_ERROR(Segment->n_brushstops,"Error JobBrushStopId"); + ReportWithPackageFilter(IDSFilter,"Error JobBrushStopId",__FILE__,__LINE__,(int)Segment->n_brushstops,RpError,(int)0,0); JobEndReason = JOB_OUT_OF_DYE; PreSegmentReady(Module_IDS,ModuleFail); return ERROR; @@ -1318,10 +1329,10 @@ uint32_t IDSPreSegmentState(void *SegmentDetails, int SegmentId) DispenserPreSegmentControlId = AddControlCallback(NULL,IDSPreSegmentStateCallbackRunner, IDS_PRESEGMENT_TIME_STEP,TemplateDataReadCBFunction ,0, 0, 0 ); if (DispenserPreSegmentControlId == 0xFF) { - Report("Add control callback failed",__FILE__,__LINE__,(int)100,RpWarning,(int)0,0); + ReportWithPackageFilter(IDSFilter,"Add control callback failed",__FILE__,__LINE__,(int)100,RpWarning,(int)0,0); return ERROR; } - Report("Add control callback ",__FILE__,__LINE__,(int)100,RpWarning,(int)lInterSegmentLength,0); + ReportWithPackageFilter(IDSFilter,"Add control callback ",__FILE__,__LINE__,(int)100,RpWarning,(int)lInterSegmentLength,0); } /*if (EnableCleaning == true) { @@ -1352,10 +1363,10 @@ uint32_t IDSPreSegmentState(void *SegmentDetails, int SegmentId) DispenserPreSegmentControlId = AddControlCallback( IDSPreSegmentStateCallbackRunner, IDS_PRESEGMENT_TIME_STEP,TemplateDataReadCBFunction ,0, 0, 0 ); if (DispenserPreSegmentControlId == 0xFF) { - Report("Add control callback failed",__FILE__,__LINE__,(int)100,RpWarning,(int)0,0); + ReportWithPackageFilter(IDSFilter,"Add control callback failed",__FILE__,__LINE__,(int)100,RpWarning,(int)0,0); return ERROR; } - Report("Add control callback ",__FILE__,__LINE__,(int)100,RpWarning,(int)lInterSegmentLength,0); + ReportWithPackageFilter(IDSFilter,"Add control callback ",__FILE__,__LINE__,(int)100,RpWarning,(int)lInterSegmentLength,0); if (EnableCleaning == true) { InterSegmentStartSprayCleaner = 500; @@ -1386,7 +1397,7 @@ uint32_t IDSPreSegmentState(void *SegmentDetails, int SegmentId) } else { - LOG_ERROR(FileBrushStop,"End run - BrushStopReadError"); + ReportWithPackageFilter(IDSFilter,"End run - BrushStopReadError",__FILE__,__LINE__,(int)FileBrushStop,RpError,(int)0,0); JobEndReason = JOB_OUT_OF_DYE; PreSegmentReady(Module_IDS,ModuleFail); } @@ -1468,7 +1479,7 @@ void IDS_StartBrushStop(int n_dispensers, JobDispenser** Dispensers) int Dispenser_i,DispenserId; TimerMotors_t HW_Motor_Id; double segmentfirst_speed; - Report("IDS_StartBrushStop",__FILE__,__LINE__,(int)JobBrushStopId,RpWarning,(int)0,0); + //ReportWithPackageFilter(IDSFilter,"IDS_StartBrushStop",__FILE__,__LINE__,(int)JobBrushStopId,RpWarning,(int)0,0); if (n_dispensers) { @@ -1513,7 +1524,7 @@ void IDS_StartBrushStop(int n_dispensers, JobDispenser** Dispensers) MotorSetSpeed(HW_Motor_Id, segmentfirst_speed); } CurrentDispenserSpeed[DispenserId] = segmentfirst_speed; - usnprintf(IdsMessage, 80, + /*usnprintf(IdsMessage, 80, "Dispenser %d nl/sec %d nl/pulse %d Pulse/sec %d speed %d steps %d/%d", DispenserId, (int) Dispensers[Dispenser_i]->nanolitterpersecond, @@ -1521,8 +1532,8 @@ void IDS_StartBrushStop(int n_dispensers, JobDispenser** Dispensers) (int) Dispensers[Dispenser_i]->pulsepersecond*1000, (int) (segmentfirst_speed*1000),Dispensers[Dispenser_i]->dispenserstepdivision,MotorsCfg[HW_Motor_Id].microstep); //REPORT_MSG(segmentfirst_speed,IdsMessage); - Report(IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, segmentfirst_speed, 0); - //SendJobProgress(0.0, 0, false, IdsMessage); + ReportWithPackageFilter(IDSFilter,IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, segmentfirst_speed, 0); + //SendJobProgress(0.0, 0, false, IdsMessage);*/ } else { @@ -1540,10 +1551,14 @@ void IDS_StartBrushStop(int n_dispensers, JobDispenser** Dispensers) } CurrentDispenserSpeed[DispenserId] = 0; } - //Report("inActive dispenser stopped", __FILE__, __LINE__, DispenserId, RpWarning, segmentfirst_speed, 0); + //ReportWithPackageFilter(IDSFilter,"inActive dispenser stopped", __FILE__, __LINE__, DispenserId, RpWarning, segmentfirst_speed, 0); } - } + } //for } + usnprintf(IdMessage, 80,"IDS_StartBrushStop %d D1 %d,D2 %d,D3 %d,D4 %d,D5 %d",WFCF,CurrentDispenserSpeed[0], + CurrentDispenserSpeed[1],CurrentDispenserSpeed[2],CurrentDispenserSpeed[3],CurrentDispenserSpeed[4]); + ReportWithPackageFilter(IDSFilter,IdsMessage, __FILE__, __LINE__, FileBrushStop->index, RpWarning,n_dispensers, 0); + } uint32_t IDSBrushStopRestartCallback(uint32_t IfIndex, uint32_t readValue) { @@ -1553,7 +1568,7 @@ uint32_t IDSBrushStopRestartCallback(uint32_t IfIndex, uint32_t readValue) Task_Stat statbuf; if(BrushStopStartTime+BrushStopLength+100 < msec_millisecondCounter ) { - Report("!!!!!!!!!!!!Overtime!",__FILE__,msec_millisecondCounter,(int)BrushStopStartTime,RpWarning,(int)BrushStopLength,0); + ReportWithPackageFilter(IDSFilter,"!!!!!!!!!!!!Overtime!",__FILE__,msec_millisecondCounter,(int)BrushStopStartTime,RpWarning,(int)BrushStopLength,0); } if(++BrushStopCounter < BrushStopTime) @@ -1565,13 +1580,13 @@ uint32_t IDSBrushStopRestartCallback(uint32_t IfIndex, uint32_t readValue) if (BrushStopControlId == 0xFF) { - Report("!!!BrushStopControlId = 0xFF",__FILE__,msec_millisecondCounter,(int)BrushStopStartTime,RpWarning,(int)BrushStopLength,0); + ReportWithPackageFilter(IDSFilter,"!!!BrushStopControlId = 0xFF",__FILE__,msec_millisecondCounter,(int)BrushStopStartTime,RpWarning,(int)BrushStopLength,0); return OK; } if (JobEndSequence == true) { - Report("JobEndSequence",__FILE__,__LINE__,(int)JobBrushStopId,RpWarning,(int)SegmentNumOfBrushStops,0); + ReportWithPackageFilter(IDSFilter,"JobEndSequence",__FILE__,__LINE__,(int)JobBrushStopId,RpWarning,(int)SegmentNumOfBrushStops,0); SafeRemoveControlCallback(BrushStopControlId,IDSBrushStopRestartCallback); BrushStopControlId = 0Xff; return OK; @@ -1590,14 +1605,14 @@ uint32_t IDSBrushStopRestartCallback(uint32_t IfIndex, uint32_t readValue) { Task_stat(Control_Task_Handle,&statbuf); //REPORT_MSG(FileBrushStop->index,"BrushStopRead Index"); - Report("BrushStopRead Index",__FILE__,BrushStopTime,(int)FileBrushStop->index,RpWarning,(int)BrushStopStartTime,0); + //ReportWithPackageFilter(IDSFilter,"BrushStopRead Index",__FILE__,BrushStopTime,(int)FileBrushStop->index,RpWarning,(int)BrushStopStartTime,0); Dispensers = FileBrushStop->dispensers; n_dispensers = FileBrushStop->n_dispensers; } else { Task_stat(Task_self(),&statbuf); - Report("BrushStopRead Error",__FILE__,statbuf.used,(int)statbuf.stackSize,RpWarning,(int)statbuf.stackHeap,0); + ReportWithPackageFilter(IDSFilter,"BrushStopRead Error",__FILE__,statbuf.used,(int)statbuf.stackSize,RpWarning,(int)statbuf.stackHeap,0); JobEndReason = JOB_OUT_OF_DYE; SegmentReady(Module_IDS,ModuleFail); } @@ -1607,10 +1622,10 @@ uint32_t IDSBrushStopRestartCallback(uint32_t IfIndex, uint32_t readValue) IDS_StartBrushStop(n_dispensers, Dispensers); } JobBrushStopId++; - Report("brushstop",__FILE__,__LINE__,(int)JobBrushStopId,RpWarning,(int)SegmentNumOfBrushStops,0); + ReportWithPackageFilter(IDSFilter,"brushstop",__FILE__,__LINE__,(int)JobBrushStopId,RpMessage,(int)SegmentNumOfBrushStops,0); if (JobBrushStopId >= SegmentNumOfBrushStops) { - Report("last brushstop",__FILE__,__LINE__,(int)JobBrushStopId,RpWarning,(int)SegmentNumOfBrushStops,0); + ReportWithPackageFilter(IDSFilter,"last brushstop",__FILE__,__LINE__,(int)JobBrushStopId,RpWarning,(int)SegmentNumOfBrushStops,0); SafeRemoveControlCallback(BrushStopControlId,IDSBrushStopRestartCallback); BrushStopControlId = 0Xff; } @@ -1624,7 +1639,7 @@ uint32_t IDSSegmentStateSetValve(uint32_t IfIndex, uint32_t BusyFlag) { SafeRemoveControlCallback(IDSValveControlId,IDSSegmentStateSetValve); Valve_Set(VALVE_MIXCHIP_WASTECH, Mixer_Head); - Report("IDSSegmentState set valve after 1 second",__FILE__,__LINE__,(int)0,RpWarning,(int)0,0); + ReportWithPackageFilter(IDSFilter,"IDSSegmentState set valve after 1 second",__FILE__,__LINE__,(int)0,RpWarning,(int)0,0); return OK; } #endif @@ -1646,7 +1661,7 @@ uint32_t IDSSegmentState(void *SegmentDetails, int SegmentId) BrushStopTime = Segment->length*1000/(double)SegmentNumOfBrushStops; //brushstop in meters //brushstop in millisecond BrushStopTime = ((BrushStopTime*100)/dyeingspeed);//brushstop in seconds //BrushStopTime *= 1000; - Report("IDSSegmentState bss time, num of bss",__FILE__,__LINE__,(int)(BrushStopTime),RpWarning,(int)SegmentNumOfBrushStops,0); + ReportWithPackageFilter(IDSFilter,"IDSSegmentState bss time, num of bss",__FILE__,__LINE__,(int)(BrushStopTime),RpWarning,(int)SegmentNumOfBrushStops,0); if (uploadstrategy == JOB_UPLOAD_STRATEGY__Default) { Dispensers = Segment->brushstops[JobBrushStopId]->dispensers; @@ -1661,13 +1676,13 @@ uint32_t IDSSegmentState(void *SegmentDetails, int SegmentId) } else { - LOG_ERROR(FileBrushStop,"BrushStopReadError"); + ReportWithPackageFilter(IDSFilter,"BrushStopRead Error",__FILE__,__LINE__,(int)FileBrushStop,RpError,(int)0,0); } } //handle ending of presegment if (DispenserPreSegmentControlId != 0xFF) { - Report("IDS presegment not yet ended!!",__FILE__,DispenserPreSegmentControlId,(int)InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); + ReportWithPackageFilter(IDSFilter,"IDS presegment not yet ended!!",__FILE__,DispenserPreSegmentControlId,(int)InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); RemoveControlCallback(DispenserPreSegmentControlId, IDSPreSegmentStateCallbackRunner ); DispenserPreSegmentControlId = 0xFF; } @@ -1682,10 +1697,10 @@ uint32_t IDSSegmentState(void *SegmentDetails, int SegmentId) BrushStopLength = BrushStopTime; if (BrushStopControlId == 0xFF) { - Report("Add control callback failed",__FILE__,__LINE__,(int)BrushStopTime,RpWarning,(int)0,0); + ReportWithPackageFilter(IDSFilter,"Add control callback failed",__FILE__,__LINE__,(int)BrushStopTime,RpWarning,(int)0,0); return ERROR; } - Report("Add control callback ",__FILE__,__LINE__,(int)BrushStopTime,RpWarning,(int)n_dispensers,0); + ReportWithPackageFilter(IDSFilter,"Add control callback ",__FILE__,__LINE__,(int)BrushStopTime,RpWarning,(int)n_dispensers,0); } else @@ -1761,10 +1776,10 @@ uint32_t IDSSegmentState(void *SegmentDetails, int SegmentId) DispenserPreSegmentControlId = AddControlCallback("IDS DTS", IDSPreSegmentStateCallbackRunner, IDS_PRESEGMENT_TIME_STEP,TemplateDataReadCBFunction ,0, 0, 0 ); if (DispenserPreSegmentControlId == 0xFF) { - Report("Add control callback failed",__FILE__,__LINE__,(int)100,RpWarning,(int)0,0); + ReportWithPackageFilter(IDSFilter,"Add control callback failed",__FILE__,__LINE__,(int)100,RpWarning,(int)0,0); return ERROR; } - Report("Add control callback ",__FILE__,__LINE__,(int)100,RpWarning,(int)lInterSegmentLength,0); + ReportWithPackageFilter(IDSFilter,"Add control callback ",__FILE__,__LINE__,(int)100,RpWarning,(int)lInterSegmentLength,0); /*if (EnableCleaning == true) { InterSegmentStartSprayCleaner = 500; @@ -1784,7 +1799,7 @@ uint32_t IDSSegmentState(void *SegmentDetails, int SegmentId) //MotorStop(HW_Motor_Id,Hard_Hiz); if (AutoHoming_Config >= AutoHoming_JobEnd_PowerOn_off) { - Report("IDS_Valve_EndValveReady start homing",__FILE__,deviceID,(int)AutoHoming_Config,RpWarning,(int)AutoHoming_JobEnd_PowerOn_off,0); + ReportWithPackageFilter(IDSFilter,"IDS_Valve_EndValveReady start homing",__FILE__,deviceID,(int)AutoHoming_Config,RpWarning,(int)AutoHoming_JobEnd_PowerOn_off,0); if (deviceID!=LUBRICANT_DISPENSER) IDS_HomeDispenser (deviceID, 1000 , NULL); -- cgit v1.3.1 From 916b852f7ad8018f883f3ae8a5b119be0cc12883 Mon Sep 17 00:00:00 2001 From: Ronen Sberlo Date: Sun, 30 Aug 2020 11:10:48 +0300 Subject: Tunnel entrances temperature read --- .../Embedded/Modules/Diagnostics/Diagnostics.c | 18 +++++---- .../Embedded/Modules/Heaters/Heaters_print.c | 47 +++++++++++++++++++++- .../Embedded/Modules/Thread/Thread_Winder.c | 3 +- .../Embedded/Modules/Thread/Thread_print.c | 2 +- 4 files changed, 58 insertions(+), 12 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c index 18793ce28..2ebd21dd5 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c @@ -494,14 +494,14 @@ void CopyTemperaturesToMonitor(void) HeaterCounterIndex[HEATER_TYPE__HeadCoverHeater1]; DiagnosticsMonitor.n_headcoverheater2temperature = HeaterCounterIndex[HEATER_TYPE__HeadCoverHeater2]; - DiagnosticsMonitor.headzone4temperature = - HeaterTemperature[HEATER_TYPE__HeaterZone4]; - DiagnosticsMonitor.headzone6temperature = - HeaterTemperature[HEATER_TYPE__HeaterZone6]; - DiagnosticsMonitor.n_headzone4temperature = - HeaterCounterIndex[HEATER_TYPE__HeaterZone4]; - DiagnosticsMonitor.n_headzone6temperature = - HeaterCounterIndex[HEATER_TYPE__HeaterZone6]; + DiagnosticsMonitor.headzone11temperature = + HeaterTemperature[HEATER_TYPE__HeaterZone11]; + DiagnosticsMonitor.headzone12temperature = + HeaterTemperature[HEATER_TYPE__HeaterZone12]; + DiagnosticsMonitor.n_headzone11temperature = + HeaterCounterIndex[HEATER_TYPE__HeaterZone11]; + DiagnosticsMonitor.n_headzone12temperature = + HeaterCounterIndex[HEATER_TYPE__HeaterZone12]; DiagnosticsMonitor.n_headblower1airflow = HeaterCounterIndex[HEATER_TYPE__HeaterZone5]; DiagnosticsMonitor.n_headblower2airflow = HeaterCounterIndex[HEATER_TYPE__HeaterZone7]; @@ -960,6 +960,8 @@ void DiagnosticOneSecCollection(void) //DiagnosticLoadTemperature(HEATER_TYPE__HeaterZone6, MillisecGetTemperatures(HEAD_PT100_ZONE_6_0X84_1)); DiagnosticLoadTemperature(HEATER_TYPE__HeaterZone7, MillisecGetTemperatures(HEAD_PT100_ZONE_7_0X86_0)); //DiagnosticLoadTemperature(HEATER_TYPE__HeaterZone8, MillisecGetTemperatures(HEAD_PT100_ZONE_8_0X86_1)); + DiagnosticLoadTemperature(HEATER_TYPE__HeaterZone11, MillisecGetTemperatures(HEAD_PT100_ZONE_11_0X8A_0)); + DiagnosticLoadTemperature(HEATER_TYPE__HeaterZone12, MillisecGetTemperatures(HEAD_PT100_ZONE_12_0X8A_1)); } DiagnosticLoadTemperature(HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature, MillisecGetTemperatures(TEMP_SENSE_ANALOG_DRYER_TEMP1)); DiagnosticLoadTemperature(HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain, MillisecGetTemperatures(TEMP_SENSE_ANALOG_DRYER_TEMP2)); diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c index 8fe3de207..54e552684 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c @@ -119,7 +119,7 @@ void initializeArrays(void) HeaterId2PT100Id[i] = 0xFF; HeaterId2CurrentId[i] = NUM_OF_CURRENT_HEATERS; } - if (Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) + if (Head_Type == HEAD_TYPE_FLAT) { HeaterId2PT100Id[HEATER_TYPE__DryerAirHeater] = DRYER_AIR_PT100; HeaterId2PT100Id[HEATER_TYPE__DryerMainHeater] = DRYER_MAIN_PT100; @@ -160,7 +160,7 @@ void initializeArrays(void) HeaterId2CurrentId[HEATER_TYPE__HeadCoverHeater2] = HEAD_CURRENT_HTOT_1; } - else + else if (Head_Type == HEAD_TYPE_FLAT_WITHOUT_CARD) { HeaterId2PT100Id[HEATER_TYPE__DryerAirHeater] = DRYER_AIR_PT100; HeaterId2PT100Id[HEATER_TYPE__DryerMainHeater] = DRYER_MAIN_PT100; @@ -191,7 +191,50 @@ void initializeArrays(void) HeaterId2CurrentId[HEATER_TYPE__HeaterZone5] = HEATER_HEAD_CURRENT_ZONE_5_6; HeaterId2CurrentId[HEATER_TYPE__HeaterZone6] = HEATER_HEAD_CURRENT_ZONE_5_6; HeaterId2CurrentId[HEATER_TYPE__MixerHeater] = HEATER_MIXCHIP_CURRENT; + } + else if (Head_Type == HEAD_TYPE_ARC) + { + HeaterId2PT100Id[HEATER_TYPE__DryerAirHeater] = DRYER_AIR_PT100; + HeaterId2PT100Id[HEATER_TYPE__DryerMainHeater] = DRYER_MAIN_PT100; + HeaterId2PT100Id[HEATER_TYPE__DryerSecondaryHeater] = DRYER_SECONDARY_PT100; + HeaterId2PT100Id[HEATER_TYPE__HeaterZone1] = HEAD_PT100_ZONE_1_0X80_0; + HeaterId2PT100Id[HEATER_TYPE__HeaterZone2] = HEAD_PT100_ZONE_2_0X80_1; + HeaterId2PT100Id[HEATER_TYPE__HeaterZone3] = HEAD_PT100_ZONE_3_0X82_0; + /* + HeaterId2PT100Id[HEATER_TYPE__HeaterZone4] = HEAD_PT100_ZONE_4_0X82_1; + HeaterId2PT100Id[HEATER_TYPE__HeaterZone5] = HEAD_PT100_ZONE_5_0X84_0; + HeaterId2PT100Id[HEATER_TYPE__HeaterZone6] = HEAD_PT100_ZONE_6_0X84_1; + HeaterId2PT100Id[HEATER_TYPE__MixerHeater] = HEAD_PT100_MIXER_0X8E_0; + HeaterId2PT100Id[HEATER_TYPE__HeaterZone7] = HEAD_PT100_ZONE_7_0X86_0; + HeaterId2PT100Id[HEATER_TYPE__HeaterZone8] = HEAD_PT100_ZONE_8_0X86_1; + HeaterId2PT100Id[HEATER_TYPE__HeaterZone9] = HEAD_PT100_ZONE_9_0X88_0; + HeaterId2PT100Id[HEATER_TYPE__HeaterZone10] = HEAD_PT100_ZONE_10_0X88_1; + HeaterId2PT100Id[HEATER_TYPE__HeaterZone11] = HEAD_PT100_ZONE_11_0X8A_0; + HeaterId2PT100Id[HEATER_TYPE__HeaterZone12] = HEAD_PT100_ZONE_12_0X8A_1; + */ + HeaterId2PT100Id[HEATER_TYPE__HeadCoverHeater1] = HEAD_PT100_ZONE_11_0X8A_0; //HEAD_PT100_AIR_HEATER_2_0X8C_1; + HeaterId2PT100Id[HEATER_TYPE__HeadCoverHeater2] = HEAD_PT100_ZONE_12_0X8A_1; //HEAD_PT100_AIR_HEATER_1_0X8C_0 ; + HeaterId2CurrentId[HEATER_TYPE__DryerAirHeater] = NUM_OF_CURRENT_HEATERS; + HeaterId2CurrentId[HEATER_TYPE__DryerMainHeater] = HEATER_DRYER_CURRENT_1; + HeaterId2CurrentId[HEATER_TYPE__DryerSecondaryHeater] = HEATER_DRYER_CURRENT_2; + HeaterId2CurrentId[HEATER_TYPE__HeaterZone1] = HEAD_CURRENT_ZONE_1; + HeaterId2CurrentId[HEATER_TYPE__HeaterZone2] = HEAD_CURRENT_ZONE_2; + HeaterId2CurrentId[HEATER_TYPE__HeaterZone3] = HEAD_CURRENT_ZONE_3; + /* + HeaterId2CurrentId[HEATER_TYPE__HeaterZone4] = HEAD_CURRENT_ZONE_4; + HeaterId2CurrentId[HEATER_TYPE__HeaterZone5] = HEAD_CURRENT_ZONE_5; + HeaterId2CurrentId[HEATER_TYPE__HeaterZone6] = HEAD_CURRENT_ZONE_6; + HeaterId2CurrentId[HEATER_TYPE__MixerHeater] = HEAD_CURRENT_MIXER; + HeaterId2CurrentId[HEATER_TYPE__HeaterZone7] = HEAD_CURRENT_ZONE_7; + HeaterId2CurrentId[HEATER_TYPE__HeaterZone8] = HEAD_CURRENT_ZONE_8; + HeaterId2CurrentId[HEATER_TYPE__HeaterZone9] = HEAD_CURRENT_ZONE_9; + HeaterId2CurrentId[HEATER_TYPE__HeaterZone10] = HEAD_CURRENT_ZONE_10; + HeaterId2CurrentId[HEATER_TYPE__HeaterZone11] = HEAD_CURRENT_ZONE_11; + HeaterId2CurrentId[HEATER_TYPE__HeaterZone12] = HEAD_CURRENT_ZONE_12; + */ + HeaterId2CurrentId[HEATER_TYPE__HeadCoverHeater1] = HEAD_CURRENT_HTIN_1; + HeaterId2CurrentId[HEATER_TYPE__HeadCoverHeater2] = HEAD_CURRENT_HTOT_1; } } uint32_t DryerInternalPT100Id = DRYER_AIR_PT100; diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c index 852389001..2b6492dab 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c @@ -347,8 +347,9 @@ int flipflop = 0; uint32_t motspeed; float speedf; int WinderCalculation = 0; +#ifdef FOUR_WINDERS int MotorOrder[4] = {HARDWARE_MOTOR_TYPE__MOTO_SCREW,SCREW_2_Motor,SCREW_3_Motor,SCREW_4_Motor}; - +#endif uint32_t Screw100msecDirectionChange(uint32_t deviceID, uint32_t BusyFlag) { diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c index 7ec0ed5e5..ab1ab77e6 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c @@ -1274,9 +1274,9 @@ uint32_t ThreadPrepareState(void *JobDetails) } #ifndef TEST_PID_THREAD ControlIdtoMotorId[Motor_i] = AddControlCallback(NULL,ThreadControlCBFunction, eOneMillisecond,Control_Read_Dancer_Position,(IfTypeThread*0x100+Motor_i),ThreadMotorIdToDancerId[Motor_i],Motor_i); -#endif #endif } +#endif } HandleJobThreadControlParameters(JobTicket->threadparameters); //OVERRIDES CONFIGURATION PARAMETERS!!! -- cgit v1.3.1 From d5c3c24d71202353596dd7d28048ecf7ff74bd5c Mon Sep 17 00:00:00 2001 From: Avi Levkovich Date: Sun, 30 Aug 2020 14:25:17 +0300 Subject: Calculate WHS fan tacho [RPM] + Update the stub --- .../I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c | 17 ++++++++++++++++- .../I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.h | 3 +++ .../Embedded/Modules/Stubs_Handler/Progress.c | 11 +++++++++-- 3 files changed, 28 insertions(+), 3 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c index 6cb64262c..895c8f73e 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c @@ -144,18 +144,33 @@ uint16_t WHS_Get_fan_tach(WHS_fan_num fan_number) fan_driver = Select_Fan_Driver(fan_number); tach = D_EMC2302_Read[fan_driver].Reg.TACHReading_High[(fan_number & 0x01)]; tach = ((tach << 8) | D_EMC2302_Read[fan_driver].Reg.TACHReading_Low[(fan_number & 0x01)]); + tach = (tach >> 3);//see data-sheet return tach; } +uint16_t WHS_Fan_Tach[maxFAN] = {0,0,0,0,0,0}; +uint16_t WHS_Fan_Tach_RPM[maxFAN] = {0,0,0,0,0,0}; void Read_All_WHS_Fans_Tach() { WHS_fan_num fan_number = FAN1; + uint16_t tach = 0; + uint16_t m = 2; //Range bit. See data-sheet, table range decode: since the deafualt range is 01 (reported minimum RPM = 1000) the tach count multiplier is 2 for (fan_number = FAN1 ; fan_number < maxFAN; fan_number++) { - WHS_Read_fan_tach(fan_number); + tach = WHS_Read_fan_tach(fan_number); + if (tach < 0x1FFE) + { + WHS_Fan_Tach[fan_number] = tach; + WHS_Fan_Tach_RPM[fan_number] = (3932160 * m) / tach;//see data-sheet + } + else + { + WHS_Fan_Tach[fan_number] = 0; + WHS_Fan_Tach_RPM[fan_number] = 0; + } } } diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.h b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.h index a15248866..d88cdd1f8 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.h +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.h @@ -101,6 +101,9 @@ typedef union uint8_t Buf[D_EMC2302_Size]; }D_EMC2302_WRITE; +extern uint16_t WHS_Fan_Tach[maxFAN]; +extern uint16_t WHS_Fan_Tach_RPM[maxFAN]; + bool Read_WHS_fan_info(WHS_fan_num fan_number); bool Test_WHS_Fan(void); bool init_WHS_fan(void); diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c index 853f6913a..4cae0f786 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c @@ -830,12 +830,19 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) if ((request->amount & 0x0000FFF0) == 0xFAC0) //WHS Fan control { uint16_t fan_tacho = 0; + WHS_fan_num Fan_Id; + uint8_t Fan_Speed; if (WHS_Type == WHS_TYPE_NEW) { - Trigger_SetWHSFanSpeed(((request->amount & 0x0000000F)-2) , request->delay & 0x000000FF); + Fan_Id = (request->amount & 0x0000000F)-2;//0-5 + Fan_Speed = request->delay & 0x000000FF; + Trigger_SetWHSFanSpeed(Fan_Id, Fan_Speed); Task_sleep(2000); - fan_tacho = WHS_Get_fan_tach( (request->amount & 0x0000000F)-2); + Trigger_WHSReadAllFanTacho(); + Task_sleep(1000); + //fan_tacho = WHS_Get_fan_tach( (request->amount & 0x0000000F)-2); + fan_tacho = WHS_Fan_Tach_RPM[Fan_Id]; } response.progress = fan_tacho; response.has_progress = true; -- cgit v1.3.1 From f35997d7f19ffbc4f4f99dbe32ca83207e570e9c Mon Sep 17 00:00:00 2001 From: Avi Levkovich Date: Sun, 30 Aug 2020 15:22:53 +0300 Subject: Send RPM in head fan's stub --- Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c index 4cae0f786..d983144f3 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c @@ -814,7 +814,8 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) Task_sleep(2000); //response.progress = Fan_Click_Info.Product_ID; - response.progress = Head_Fan_Tach[0]; + //response.progress = Head_Fan_Tach[0]; + response.progress = HeadBlowersGetRPM(HEAD_FAN_RIGHT); response.has_progress = true; } @@ -823,7 +824,8 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) { Trigger_Head_Fan_Control(HEAD_FAN_LEFT, request->delay & 0xFF); Task_sleep(2000); - response.progress = Head_Fan_Tach[1]; + //response.progress = Head_Fan_Tach[1]; + response.progress = HeadBlowersGetRPM(HEAD_FAN_LEFT); response.has_progress = true; } else -- cgit v1.3.1 From d4ae04f8922ce04c1dbaf375176677a91afba386 Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Sun, 30 Aug 2020 20:29:58 +0300 Subject: improve firmware activation, diagnostics, job end reasons according to the new PROTOBUF --- .../Embedded/Common/SWUpdate/FirmwareUpgrade.c | 13 +- .../Communication/PMR/Common/ErrorCode.pb-c.c | 22 ++- .../Communication/PMR/Common/ErrorCode.pb-c.h | 2 + .../Communication/PMR/Common/MessageType.pb-c.c | 214 +++++++++++---------- .../Communication/PMR/Common/MessageType.pb-c.h | 2 + .../PMR/Diagnostics/DiagnosticsMonitors.pb-c.c | 6 +- .../PMR/Diagnostics/DiagnosticsMonitors.pb-c.h | 4 +- .../FirmwareUpgrade/ActivateVersionResponse.pb-c.c | 43 ++++- .../FirmwareUpgrade/ActivateVersionResponse.pb-c.h | 6 +- .../Embedded/Modules/AlarmHandling/AlarmHandling.c | 4 +- .../Embedded/Modules/Diagnostics/Diagnostics.c | 27 ++- .../Embedded/Modules/Waste/Waste_maint.c | 4 +- .../Embedded/StateMachines/Printing/JobSTM.c | 3 +- .../Embedded/StateMachines/Printing/PrintingSTM.c | 6 +- .../Embedded/StateMachines/Printing/PrintingSTM.h | 3 + 15 files changed, 221 insertions(+), 138 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c b/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c index 3a1a4ab83..dbbe47ddb 100644 --- a/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c +++ b/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c @@ -60,8 +60,14 @@ uint32_t ActivateVersionCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) { last = false; } + response.has_progress = true; + response.has_total = true; + response.progress = CurrentRunningFile+(vme_index/CurrentFileSize); + response.total = NumberOfFiles; - usnprintf(activateString, 1000, "file %d of %d bytes %d of %d last %d",CurrentRunningFile+1,NumberOfFiles,vme_index,CurrentFileSize,last); + + usnprintf(activateString, 1000, "file %d of %d bytes %d of %d last %d progress*1000 %d", + CurrentRunningFile+1,NumberOfFiles,vme_index,CurrentFileSize,last,(int)(response.progress*1000)); Report(activateString,__FILE__,__LINE__,(int)CurrentRunningFile,RpWarning,CurrentFileSize,0); @@ -196,6 +202,11 @@ uint32_t ActivateVersionRequestFunc(MessageContainer* requestContainer) } } } + response.has_progress = true; + response.has_total = true; + response.progress = CurrentRunningFile; + response.total = NumberOfFiles; + Report("Activate Version Request progress",__FILE__,__LINE__,(int)NumberOfFiles,RpWarning,CurrentRunningFile,0); responseContainer = createContainer(MESSAGE_TYPE__ActivateVersionResponse, requestContainer->token, false, &response, &activate_version_response__pack, &activate_version_response__get_packed_size); responseContainer.has_continuous = true; responseContainer.continuous = true; diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/Common/ErrorCode.pb-c.c b/Software/Embedded_SW/Embedded/Communication/PMR/Common/ErrorCode.pb-c.c index f1b6cfb48..304a9b6d4 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/Common/ErrorCode.pb-c.c +++ b/Software/Embedded_SW/Embedded/Communication/PMR/Common/ErrorCode.pb-c.c @@ -7,7 +7,7 @@ #endif #include "ErrorCode.pb-c.h" -static const ProtobufCEnumValue error_code__enum_values_by_number[55] = +static const ProtobufCEnumValue error_code__enum_values_by_number[57] = { { "", "", 0 }, { "", "", 1 }, @@ -57,6 +57,8 @@ static const ProtobufCEnumValue error_code__enum_values_by_number[55] = { "", "", 2014 }, { "", "", 2015 }, { "", "", 2016 }, + { "", "", 2017 }, + { "", "", 2018 }, { "", "", 3000 }, { "", "", 3001 }, { "", "", 3002 }, @@ -66,9 +68,9 @@ static const ProtobufCEnumValue error_code__enum_values_by_number[55] = { "", "", 3006 }, }; static const ProtobufCIntRange error_code__value_ranges[] = { -{0, 0},{1000, 8},{2000, 31},{3000, 48},{0, 55} +{0, 0},{1000, 8},{2000, 31},{3000, 50},{0, 57} }; -static const ProtobufCEnumValueIndex error_code__enum_values_by_name[55] = +static const ProtobufCEnumValueIndex error_code__enum_values_by_name[57] = { { "", 2 }, { "", 5 }, @@ -102,6 +104,7 @@ static const ProtobufCEnumValueIndex error_code__enum_values_by_name[55] = { "", 42 }, { "", 6 }, { "", 35 }, + { "", 48 }, { "", 44 }, { "", 40 }, { "", 43 }, @@ -114,16 +117,17 @@ static const ProtobufCEnumValueIndex error_code__enum_values_by_name[55] = { "", 39 }, { "", 32 }, { "", 31 }, + { "", 49 }, { "", 33 }, { "", 0 }, { "", 38 }, - { "", 50 }, { "", 52 }, - { "", 49 }, - { "", 51 }, - { "", 48 }, { "", 54 }, + { "", 51 }, { "", 53 }, + { "", 50 }, + { "", 56 }, + { "", 55 }, { "", 4 }, }; const ProtobufCEnumDescriptor error_code__descriptor = @@ -133,9 +137,9 @@ const ProtobufCEnumDescriptor error_code__descriptor = "", "", "", - 55, + 57, error_code__enum_values_by_number, - 55, + 57, error_code__enum_values_by_name, 4, error_code__value_ranges, diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/Common/ErrorCode.pb-c.h b/Software/Embedded_SW/Embedded/Communication/PMR/Common/ErrorCode.pb-c.h index 53f7b9662..93b17520c 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/Common/ErrorCode.pb-c.h +++ b/Software/Embedded_SW/Embedded/Communication/PMR/Common/ErrorCode.pb-c.h @@ -68,6 +68,8 @@ typedef enum _ErrorCode { ERROR_CODE__JOB_ABORTED_BY_USER = 2014, ERROR_CODE__JOB_SAFETY_ALARM = 2015, ERROR_CODE__JOB_NO_ALARM_FILE = 2016, + ERROR_CODE__JOB_FILE_PROBLEM = 2017, + ERROR_CODE__JOB_WASTE_HANDLING_PROBLEM = 2018, ERROR_CODE__POWER_UP_NO_CFG_FILE = 3000, ERROR_CODE__POWER_UP_HW_CONFIG_FAILED = 3001, ERROR_CODE__POWER_UP_BUILT_IN_FAILED = 3002, diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/Common/MessageType.pb-c.c b/Software/Embedded_SW/Embedded/Communication/PMR/Common/MessageType.pb-c.c index 4ecd0fbf2..d6c0259e2 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/Common/MessageType.pb-c.c +++ b/Software/Embedded_SW/Embedded/Communication/PMR/Common/MessageType.pb-c.c @@ -7,7 +7,7 @@ #endif #include "MessageType.pb-c.h" -static const ProtobufCEnumValue message_type__enum_values_by_number[261] = +static const ProtobufCEnumValue message_type__enum_values_by_number[263] = { { "", "", 0 }, { "", "", 1 }, @@ -140,6 +140,8 @@ static const ProtobufCEnumValue message_type__enum_values_by_number[261] = { "", "", 1016 }, { "", "", 1017 }, { "", "", 1018 }, + { "", "", 1019 }, + { "", "", 1020 }, { "", "", 2000 }, { "", "", 2001 }, { "", "", 2002 }, @@ -272,149 +274,151 @@ static const ProtobufCEnumValue message_type__enum_values_by_number[261] = { "", "", 11007 }, }; static const ProtobufCIntRange message_type__value_ranges[] = { -{0, 0},{3, 2},{1000, 112},{2000, 131},{3000, 177},{4000, 191},{5000, 199},{6000, 203},{7000, 209},{8000, 233},{9000, 241},{10000, 245},{11000, 253},{0, 261} +{0, 0},{3, 2},{1000, 112},{2000, 133},{3000, 179},{4000, 193},{5000, 201},{6000, 205},{7000, 211},{8000, 235},{9000, 243},{10000, 247},{11000, 255},{0, 263} }; -static const ProtobufCEnumValueIndex message_type__enum_values_by_name[261] = +static const ProtobufCEnumValueIndex message_type__enum_values_by_name[263] = { - { "", 189 }, - { "", 190 }, - { "", 179 }, - { "", 180 }, - { "", 247 }, - { "", 248 }, - { "", 251 }, - { "", 252 }, - { "", 231 }, - { "", 232 }, + { "", 191 }, + { "", 192 }, + { "", 181 }, + { "", 182 }, + { "", 249 }, + { "", 250 }, + { "", 253 }, + { "", 254 }, + { "", 233 }, + { "", 234 }, { "", 2 }, { "", 3 }, - { "", 175 }, - { "", 176 }, + { "", 177 }, + { "", 178 }, { "", 125 }, { "", 126 }, - { "", 205 }, - { "", 206 }, - { "", 255 }, - { "", 256 }, - { "", 217 }, - { "", 218 }, - { "", 183 }, - { "", 184 }, + { "", 131 }, + { "", 132 }, + { "", 207 }, + { "", 208 }, + { "", 257 }, + { "", 258 }, { "", 219 }, { "", 220 }, + { "", 185 }, + { "", 186 }, + { "", 221 }, + { "", 222 }, { "", 117 }, { "", 118 }, - { "", 207 }, - { "", 208 }, - { "", 141 }, - { "", 142 }, - { "", 147 }, - { "", 148 }, - { "", 233 }, - { "", 234 }, + { "", 209 }, + { "", 210 }, { "", 143 }, { "", 144 }, + { "", 149 }, + { "", 150 }, + { "", 235 }, + { "", 236 }, { "", 145 }, { "", 146 }, + { "", 147 }, + { "", 148 }, { "", 1 }, - { "", 213 }, - { "", 214 }, + { "", 215 }, + { "", 216 }, { "", 113 }, { "", 114 }, { "", 115 }, { "", 116 }, { "", 112 }, + { "", 229 }, + { "", 230 }, + { "", 213 }, + { "", 214 }, { "", 227 }, { "", 228 }, { "", 211 }, { "", 212 }, - { "", 225 }, - { "", 226 }, - { "", 209 }, - { "", 210 }, { "", 129 }, { "", 130 }, + { "", 225 }, + { "", 226 }, { "", 223 }, { "", 224 }, - { "", 221 }, - { "", 222 }, - { "", 177 }, - { "", 178 }, - { "", 203 }, - { "", 204 }, - { "", 215 }, - { "", 216 }, - { "", 237 }, - { "", 238 }, + { "", 179 }, + { "", 180 }, + { "", 205 }, + { "", 206 }, + { "", 217 }, + { "", 218 }, { "", 239 }, { "", 240 }, - { "", 235 }, - { "", 236 }, - { "", 133 }, - { "", 134 }, - { "", 139 }, - { "", 140 }, + { "", 241 }, + { "", 242 }, + { "", 237 }, + { "", 238 }, { "", 135 }, { "", 136 }, + { "", 141 }, + { "", 142 }, { "", 137 }, { "", 138 }, + { "", 139 }, + { "", 140 }, { "", 0 }, { "", 119 }, { "", 120 }, { "", 4 }, { "", 5 }, - { "", 157 }, - { "", 158 }, - { "", 185 }, - { "", 186 }, - { "", 167 }, - { "", 168 }, - { "", 155 }, - { "", 156 }, - { "", 195 }, - { "", 196 }, - { "", 149 }, - { "", 150 }, - { "", 165 }, - { "", 166 }, + { "", 159 }, + { "", 160 }, + { "", 187 }, + { "", 188 }, { "", 169 }, { "", 170 }, + { "", 157 }, + { "", 158 }, { "", 197 }, { "", 198 }, - { "", 121 }, - { "", 122 }, + { "", 151 }, + { "", 152 }, + { "", 167 }, + { "", 168 }, { "", 171 }, { "", 172 }, - { "", 191 }, - { "", 192 }, - { "", 131 }, - { "", 132 }, - { "", 161 }, - { "", 162 }, - { "", 187 }, - { "", 188 }, - { "", 241 }, - { "", 242 }, - { "", 245 }, - { "", 246 }, - { "", 249 }, - { "", 250 }, - { "", 253 }, - { "", 254 }, - { "", 123 }, - { "", 124 }, + { "", 199 }, + { "", 200 }, + { "", 121 }, + { "", 122 }, { "", 173 }, { "", 174 }, { "", 193 }, { "", 194 }, - { "", 159 }, - { "", 160 }, + { "", 133 }, + { "", 134 }, { "", 163 }, { "", 164 }, + { "", 189 }, + { "", 190 }, { "", 243 }, { "", 244 }, - { "", 257 }, - { "", 258 }, + { "", 247 }, + { "", 248 }, + { "", 251 }, + { "", 252 }, + { "", 255 }, + { "", 256 }, + { "", 123 }, + { "", 124 }, + { "", 175 }, + { "", 176 }, + { "", 195 }, + { "", 196 }, + { "", 161 }, + { "", 162 }, + { "", 165 }, + { "", 166 }, + { "", 245 }, + { "", 246 }, + { "", 259 }, + { "", 260 }, { "", 100 }, { "", 101 }, { "", 6 }, @@ -521,22 +525,22 @@ static const ProtobufCEnumValueIndex message_type__enum_values_by_name[261] = { "", 31 }, { "", 106 }, { "", 107 }, - { "", 201 }, - { "", 202 }, + { "", 203 }, + { "", 204 }, + { "", 155 }, + { "", 156 }, { "", 153 }, { "", 154 }, - { "", 151 }, - { "", 152 }, - { "", 259 }, - { "", 260 }, + { "", 261 }, + { "", 262 }, { "", 127 }, { "", 128 }, - { "", 199 }, - { "", 200 }, - { "", 181 }, - { "", 182 }, - { "", 229 }, - { "", 230 }, + { "", 201 }, + { "", 202 }, + { "", 183 }, + { "", 184 }, + { "", 231 }, + { "", 232 }, }; const ProtobufCEnumDescriptor message_type__descriptor = { @@ -545,9 +549,9 @@ const ProtobufCEnumDescriptor message_type__descriptor = "", "", "", - 261, + 263, message_type__enum_values_by_number, - 261, + 263, message_type__enum_values_by_name, 13, message_type__value_ranges, diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/Common/MessageType.pb-c.h b/Software/Embedded_SW/Embedded/Communication/PMR/Common/MessageType.pb-c.h index dc3f94b0a..58bd2112c 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/Common/MessageType.pb-c.h +++ b/Software/Embedded_SW/Embedded/Communication/PMR/Common/MessageType.pb-c.h @@ -151,6 +151,8 @@ typedef enum _MessageType { MESSAGE_TYPE__UpdateStatusResponse = 1016, MESSAGE_TYPE__GenericRequest = 1017, MESSAGE_TYPE__GenericResponse = 1018, + MESSAGE_TYPE__ConfigureProtocolRequest = 1019, + MESSAGE_TYPE__ConfigureProtocolResponse = 1020, MESSAGE_TYPE__StartDiagnosticsRequest = 2000, MESSAGE_TYPE__StartDiagnosticsResponse = 2001, MESSAGE_TYPE__MotorAbortHomingRequest = 2002, diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DiagnosticsMonitors.pb-c.c b/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DiagnosticsMonitors.pb-c.c index 14b93a98c..4801e2e35 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DiagnosticsMonitors.pb-c.c +++ b/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DiagnosticsMonitors.pb-c.c @@ -791,8 +791,8 @@ static const ProtobufCFieldDescriptor diagnostics_monitors__field_descriptors[90 62, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_DOUBLE, - offsetof(DiagnosticsMonitors, n_headzone5_6heatercurrent), - offsetof(DiagnosticsMonitors, headzone5_6heatercurrent), + offsetof(DiagnosticsMonitors, n_headzone56heatercurrent), + offsetof(DiagnosticsMonitors, headzone56heatercurrent), NULL, NULL, 0, /* flags */ @@ -1196,8 +1196,8 @@ static const unsigned diagnostics_monitors__field_indices_by_name[] = { 12, /* field[12] = HeadZone3Temperature */ 60, /* field[60] = HeadZone4HeaterCurrent */ 35, /* field[35] = HeadZone4Temperature */ + 61, /* field[61] = HeadZone56HeaterCurrent */ 36, /* field[36] = HeadZone5Temperature */ - 61, /* field[61] = HeadZone5_6HeaterCurrent */ 37, /* field[37] = HeadZone6Temperature */ 66, /* field[66] = HeadZone7HeaterCurrent */ 67, /* field[67] = HeadZone7Temperature */ diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DiagnosticsMonitors.pb-c.h b/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DiagnosticsMonitors.pb-c.h index a6a28e4d0..737f71d4f 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DiagnosticsMonitors.pb-c.h +++ b/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DiagnosticsMonitors.pb-c.h @@ -149,8 +149,8 @@ struct _DiagnosticsMonitors double *headzone3heatercurrent; size_t n_headzone4heatercurrent; double *headzone4heatercurrent; - size_t n_headzone5_6heatercurrent; - double *headzone5_6heatercurrent; + size_t n_headzone56heatercurrent; + double *headzone56heatercurrent; size_t n_mixer1heatercurrent; double *mixer1heatercurrent; size_t n_dispensersinklevel; diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/FirmwareUpgrade/ActivateVersionResponse.pb-c.c b/Software/Embedded_SW/Embedded/Communication/PMR/FirmwareUpgrade/ActivateVersionResponse.pb-c.c index 8730d2280..63aeabfa6 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/FirmwareUpgrade/ActivateVersionResponse.pb-c.c +++ b/Software/Embedded_SW/Embedded/Communication/PMR/FirmwareUpgrade/ActivateVersionResponse.pb-c.c @@ -52,9 +52,42 @@ void activate_version_response__free_unpacked assert(message->base.descriptor == &activate_version_response__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } -#define activate_version_response__field_descriptors NULL -#define activate_version_response__field_indices_by_name NULL -#define activate_version_response__number_ranges NULL +static const ProtobufCFieldDescriptor activate_version_response__field_descriptors[2] = +{ + { + "", + 1, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_DOUBLE, + offsetof(ActivateVersionResponse, has_progress), + offsetof(ActivateVersionResponse, progress), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "", + 2, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_DOUBLE, + offsetof(ActivateVersionResponse, has_total), + offsetof(ActivateVersionResponse, total), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned activate_version_response__field_indices_by_name[] = { + 0, /* field[0] = Progress */ + 1, /* field[1] = Total */ +}; +static const ProtobufCIntRange activate_version_response__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; const ProtobufCMessageDescriptor activate_version_response__descriptor = { PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, @@ -63,10 +96,10 @@ const ProtobufCMessageDescriptor activate_version_response__descriptor = "", "", sizeof(ActivateVersionResponse), - 0, + 2, activate_version_response__field_descriptors, activate_version_response__field_indices_by_name, - 0, activate_version_response__number_ranges, + 1, activate_version_response__number_ranges, (ProtobufCMessageInit) activate_version_response__init, NULL,NULL,NULL /* reserved[123] */ }; diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/FirmwareUpgrade/ActivateVersionResponse.pb-c.h b/Software/Embedded_SW/Embedded/Communication/PMR/FirmwareUpgrade/ActivateVersionResponse.pb-c.h index 10dc41bcb..4227d7e50 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/FirmwareUpgrade/ActivateVersionResponse.pb-c.h +++ b/Software/Embedded_SW/Embedded/Communication/PMR/FirmwareUpgrade/ActivateVersionResponse.pb-c.h @@ -26,10 +26,14 @@ typedef struct _ActivateVersionResponse ActivateVersionResponse; struct _ActivateVersionResponse { ProtobufCMessage base; + protobuf_c_boolean has_progress; + double progress; + protobuf_c_boolean has_total; + double total; }; #define ACTIVATE_VERSION_RESPONSE__INIT \ { PROTOBUF_C_MESSAGE_INIT (&activate_version_response__descriptor) \ - } + , 0, 0, 0, 0 } /* ActivateVersionResponse methods */ diff --git a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c index 07df07309..e8e2e4ed0 100644 --- a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c +++ b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c @@ -838,7 +838,7 @@ JobEndReasonEnum AlarmHandlingPrepareJob(void *CurrentJob) { ReportWithPackageFilter(AlarmFilter,"missing alarm file", __FILE__,__LINE__,0, DEBUG_LOG_CATEGORY__Warning, 223, 0); usnprintf(AlarmReasonStr, 100, "No alarm file in the machine",111); - return JOB_UNSPECIFIED_ERROR; + return JOB_NO_ALARM_FILE; } /*for (Segment_i=0;Segment_in_segments;Segment_i++) @@ -982,7 +982,7 @@ JobEndReasonEnum AlarmHandlingPrepareJob(void *CurrentJob) case EVENT_TYPE__VOC_SENSOR_ALARM_TIME: case EVENT_TYPE__VOC_SENSOR_ALARM_SLOPE: //case EVENT_TYPE__POWER_UP_BIT_FAILURE: - FoundReason = JOB_UNSPECIFIED_ERROR; + FoundReason = JOB_WASTE_HANDLING_PROBLEM; AlarmId = Alarm_i; ReportWithPackageFilter(AlarmFilter,"an alarm preventing job", __FILE__,__LINE__,AlarmItem[Alarm_i].EventType, AlarmItem[Alarm_i].Severity, AlarmItem[Alarm_i].DeviceId, 0); break; diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c index 2ebd21dd5..80c85c3ea 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c @@ -410,6 +410,19 @@ void DiagnosticLoadDancerError(int DancerId, double value) // DancerErrorCounterIndex[DancerId] = 0; } +double Shinko_Sv = 12,Shinko_Pv = 15; +void LoadChillerState(HeaterType HeaterType,HeaterState *HeaterState) +{ + int HeaterId = HeaterType; + HeaterState->has_heatertype = true; + HeaterState->heatertype = HeaterType; + HeaterState->has_setpoint = true; + HeaterState->setpoint = Shinko_Sv; + HeaterState->has_currentvalue = true; + HeaterState->currentvalue = Shinko_Pv;//MillisecGetTemperatures(HeaterId2PT100Id[HeaterId])/100; + return; +} + #ifdef FOUR_WINDERS double dancer2,dancer3,dancer4; #endif @@ -667,8 +680,8 @@ void DiagnosticOneMinuteCollection(void) DiagnosticsMonitor.headzone4heatercurrent = HeadCurrent[HEAD_CURRENT_ZONE_4]; break; case HEAD_CURRENT_ZONE_5: - DiagnosticsMonitor.n_headzone5_6heatercurrent = 1; - DiagnosticsMonitor.headzone5_6heatercurrent = HeadCurrent[HEAD_CURRENT_ZONE_5]; + DiagnosticsMonitor.n_headzone56heatercurrent = 1; + DiagnosticsMonitor.headzone56heatercurrent = HeadCurrent[HEAD_CURRENT_ZONE_5]; break; /* case HEAD_CURRENT_ZONE_6: DiagnosticsMonitor.n_headzone6heatercurrent = 1; @@ -825,8 +838,8 @@ void DiagnosticOneMinuteCollection(void) DiagnosticsMonitor.headzone4heatercurrent = HeatersCurrent[HEATER_HEAD_CURRENT_ZONE_4]; break; case HEATER_HEAD_CURRENT_ZONE_5_6: - DiagnosticsMonitor.n_headzone5_6heatercurrent = 1; - DiagnosticsMonitor.headzone5_6heatercurrent = HeatersCurrent[HEATER_HEAD_CURRENT_ZONE_5_6]; + DiagnosticsMonitor.n_headzone56heatercurrent = 1; + DiagnosticsMonitor.headzone56heatercurrent = HeatersCurrent[HEATER_HEAD_CURRENT_ZONE_5_6]; break; default: break; @@ -1059,6 +1072,7 @@ void SendDiagnostics(void) //MessageContainer responseContainer; StartDiagnosticsResponse response = START_DIAGNOSTICS_RESPONSE__INIT; //int i; + int chillerHeaterId = 0; if (DiagnosticsActive == false) { @@ -1267,6 +1281,11 @@ void SendDiagnostics(void) LoadHeaterState(HEATER_TYPE__HeadCoverHeater1,&HeaterInfo[i++]); LoadHeaterState(HEATER_TYPE__HeadCoverHeater2,&HeaterInfo[i++]); } + if(WHS_Type == WHS_TYPE_NEW) + { + chillerHeaterId = (Head_Type == HEAD_TYPE_ARC)?HEATER_TYPE__HeaterZone12:HEATER_TYPE__HeadCoverHeater1; + LoadChillerState(chillerHeaterId,&HeaterInfo[i++]); + } response.n_heatersstates = i; response.heatersstates = heatersstates; diff --git a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c index 7c29a909b..6de20a567 100644 --- a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c +++ b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c @@ -520,10 +520,10 @@ uint32_t Waste_Prepare(void) else { Report("cannot start a job with cartridges in the IFS", __FILE__, __LINE__, wasteLevel, RpMessage, wasteLevelOverflow, 0); - JobEndReason = JOB_OTHER_ALARM; + JobEndReason = JOB_WASTE_HANDLING_PROBLEM; AlarmHandlingSetAlarm( EVENT_TYPE__ALL_WASTE_CARTRIDGES_FULL, true); usnprintf(AlarmReasonStr, 100, "cannot start a job with cartridges in the IFS"); //PrepareReady(Module_Waste,ModuleFail); - return JOB_OTHER_ALARM; + return JOB_WASTE_HANDLING_PROBLEM; } } diff --git a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c index 8bce76ccf..14da2e78a 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c @@ -89,7 +89,8 @@ JobEndReasonEnum JobEndReason = JOB_OK; ErrorCode JobError_to_ErrorCode[JOB_ERRORS_MAX+1] = {ERROR_CODE__NONE,ERROR_CODE__JOB_UNSPECIFIED_ERROR,ERROR_CODE__JOB_THREAD_BREAK,ERROR_CODE__JOB_WINDER_DANCER_FAIL, ERROR_CODE__JOB_POOLER_DANCER_FAIL,ERROR_CODE__JOB_FEEDER_DANCER_FAIL,ERROR_CODE__JOB_OUT_OF_DYE,ERROR_CODE__JOB_OTHER_ALARM, ERROR_CODE__JOB_TEMPERATURE_ALARM,ERROR_CODE__JOB_LS_ALARM,ERROR_CODE__JOB_PRESSURE_ALARM,ERROR_CODE__JOB_CURRENT_ALARM, - ERROR_CODE__JOB_MOTOR_ALARM,ERROR_CODE__JOB_LIDS_OPEN,ERROR_CODE__JOB_LIDS_OPEN,ERROR_CODE__JOB_ABORTED_BY_USER,ERROR_CODE__JOB_SAFETY_ALARM}; + ERROR_CODE__JOB_MOTOR_ALARM,ERROR_CODE__JOB_LIDS_OPEN,ERROR_CODE__JOB_LIDS_OPEN,ERROR_CODE__JOB_ABORTED_BY_USER,ERROR_CODE__JOB_SAFETY_ALARM, ERROR_CODE__JOB_NO_ALARM_FILE, + ERROR_CODE__JOB_FILE_PROBLEM,ERROR_CODE__JOB_WASTE_HANDLING_PROBLEM}; JobTicket *CurrentJob = NULL; JobRequest *CurrentRequest = NULL; diff --git a/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.c b/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.c index 52aac94f5..177fac0b2 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.c @@ -751,7 +751,7 @@ void PrintSTMMsgHandler(void * msg) //rewind file if (RewindJobFile() != FR_OK) { - JobEndReason = JOB_OTHER_ALARM; + JobEndReason = JOB_FILE_PROBLEM; if (dryerbufferlength <= 0.1) EndState(CurrentJob, "Job Ended"); else @@ -790,7 +790,7 @@ void PrintSTMMsgHandler(void * msg) } else { - JobEndReason = JOB_OTHER_ALARM; + JobEndReason = JOB_FILE_PROBLEM; if (dryerbufferlength <= 0.1) EndState(CurrentJob, "Job Ended"); else @@ -809,7 +809,7 @@ void PrintSTMMsgHandler(void * msg) if ((Segment == NULL)||(Segment->length <0.1)) { Report("SegmentLoading failed",__FILE__,__LINE__, Segment,RpMessage,(int)(Segment->length*100),0); - JobEndReason = JOB_OTHER_ALARM; + JobEndReason = JOB_FILE_PROBLEM; if (dryerbufferlength <= 0.1) EndState(CurrentJob, "Job Ended"); else diff --git a/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.h b/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.h index 9c282d0f0..9fdd7b85f 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.h +++ b/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.h @@ -100,6 +100,9 @@ typedef enum JOB_LIDS_OPEN, JOB_ABORTED_BY_USER, JOB_SAFETY_CRITICAL_ALARM, + JOB_NO_ALARM_FILE, + JOB_FILE_PROBLEM, + JOB_WASTE_HANDLING_PROBLEM, JOB_ERRORS_MAX }JobEndReasonEnum; extern JobEndReasonEnum JobEndReason; -- cgit v1.3.1 From 29b08a41f29655561ab83d8b454ea5fb6227ad7a Mon Sep 17 00:00:00 2001 From: Avi Levkovich Date: Mon, 31 Aug 2020 12:02:40 +0300 Subject: Read WHS Shinko Temperature --- .../Embedded_SW/Embedded/Common/Utilities/ASCII.c | 48 ++++++++++++++ .../Embedded_SW/Embedded/Common/Utilities/ASCII.h | 15 +++++ Software/Embedded_SW/Embedded/DataDef.h | 6 ++ .../WHS_Controller_Comm/Shinko/ACS-13AC5E3.c | 18 +++-- .../WHS_Controller_Comm/Shinko/ACS-13AC5E3.h | 6 +- .../WHS_Controller_Comm/WHS_UART/WHS_Uart.c | 76 +++++++++++++++++----- .../WHS_Controller_Comm/WHS_UART/WHS_Uart.h | 4 ++ .../Embedded/Modules/Control/MillisecTask.c | 6 ++ .../Embedded/Modules/General/GeneralHardware.c | 5 ++ 9 files changed, 160 insertions(+), 24 deletions(-) create mode 100644 Software/Embedded_SW/Embedded/Common/Utilities/ASCII.c create mode 100644 Software/Embedded_SW/Embedded/Common/Utilities/ASCII.h (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Common/Utilities/ASCII.c b/Software/Embedded_SW/Embedded/Common/Utilities/ASCII.c new file mode 100644 index 000000000..403db1460 --- /dev/null +++ b/Software/Embedded_SW/Embedded/Common/Utilities/ASCII.c @@ -0,0 +1,48 @@ +/* + * ASCII.c + * + * Created on: 31 Aug 2020 + * Author: avi + */ + + +// Convert ASCII HEX to decimal +int ASCII_Hex_To_Decimal(char hexVal[], int len) +{ + int i = 0; + + // Initializing base value to 1, i.e 16^0 + int base = 1; + + int dec_val = 0; + + // Extracting characters as digits from last character + for (i = 0; i < len - 1; i++) + { + // if character lies in '0'-'9', converting + // it to integral 0-9 by subtracting 48 from + // ASCII value. + if (hexVal[i] >= '0' && hexVal[i] <= '9') + { + dec_val += (hexVal[i] - 48)*base; + + // incrementing base by power + base = base * 16; + } + + // if character lies in 'A'-'F' , converting + // it to integral 10 - 15 by subtracting 55 + // from ASCII value + else if (hexVal[i] >= 'A' && hexVal[i] <= 'F') + { + dec_val += (hexVal[i] - 55)*base; + + // incrementing base by power + base = base * 16; + } + } + + return dec_val; +} + + diff --git a/Software/Embedded_SW/Embedded/Common/Utilities/ASCII.h b/Software/Embedded_SW/Embedded/Common/Utilities/ASCII.h new file mode 100644 index 000000000..05bd967a3 --- /dev/null +++ b/Software/Embedded_SW/Embedded/Common/Utilities/ASCII.h @@ -0,0 +1,15 @@ +/* + * ASCII.h + * + * Created on: 31 Aug 2020 + * Author: avi + */ + +#ifndef COMMON_UTILITIES_ASCII_H_ +#define COMMON_UTILITIES_ASCII_H_ + +int ASCII_Hex_To_Decimal(char hexVal[], int len); + + + +#endif /* COMMON_UTILITIES_ASCII_H_ */ diff --git a/Software/Embedded_SW/Embedded/DataDef.h b/Software/Embedded_SW/Embedded/DataDef.h index cf917c846..25c8c8933 100644 --- a/Software/Embedded_SW/Embedded/DataDef.h +++ b/Software/Embedded_SW/Embedded/DataDef.h @@ -443,6 +443,12 @@ typedef enum DISABLE_MAGNET }MAGNET_COMMAND_ENUM; +typedef union +{ + uint8_t Byte[4]; + uint32_t Word; +}Word_to_Bytes; + /* typedef union { diff --git a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.c b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.c index 2ec0fa014..467bf1b5b 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.c +++ b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.c @@ -8,6 +8,10 @@ #include "ACS-13AC5E3.h" #include "drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h" +#include + +uint32_t Shinko_Temperature = 0; + /* RTU_REQUEST RTU_Request; RTU_RESPONSE RTU_Response; @@ -102,7 +106,7 @@ uint32_t shinko_clac_checksum(uint8_t * Uart3_Tx_Buff, uint32_t Length) return checksum; } -void Test_Reading_Shinko_Request_PV() +void Reading_Shinko_Request_PV() { Shinko_Request.Bytes.Header = Shinko_Header_Asccii_STX; //0x02 Shinko_Request.Bytes.Address = Shinko_ddress_Asccii; //0x20 @@ -117,8 +121,10 @@ void Test_Reading_Shinko_Request_PV() Uart3_Transmit(Shinko_Request.buf,Size_Shinko_Req); } -uint8_t Test_Reading_Shinko_Response_PV() +uint8_t Reading_Shinko_Response_PV() { + Word_to_Bytes Word2Bytes; + Uart3_Receive(Shinko_Response.buf, Size_Shinko_Res -1 ); if( (Shinko_Response.Bytes.Header == Shinko_Header_Asccii_ACK) && //0X06 @@ -127,12 +133,16 @@ uint8_t Test_Reading_Shinko_Response_PV() (Shinko_Response.Bytes.Command_Type == Read_Single) && //0x20 (Shinko_Response.Bytes.Data_Item == 0x30303830) && //0x30303830 - (Shinko_Response.Bytes.Data == 0x30303030) && //0x30303030 (Shinko_Response.Bytes.Checksum == shinko_clac_checksum(Shinko_Response.buf, sizeof(Shinko_Response.buf))) && //0x3138 (Shinko_Response.Bytes.Delimiter == Shinko_Delimiter_Asccii_ETX) )//0x03 - return OK; + { + Word2Bytes.Word = Shinko_Response.Bytes.Data; + + Shinko_Temperature = ASCII_Hex_To_Decimal(Word2Bytes.Byte, sizeof(Word2Bytes)); + return OK; + } return ERROR; } diff --git a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.h b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.h index b98abb9f2..14ef20214 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.h +++ b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.h @@ -136,8 +136,10 @@ SHINKO_RESPONSE Shinko_Response; #define Size_Shinko_Req sizeof(Shinko_Request.buf) #define Size_Shinko_Res sizeof(Shinko_Response.buf) -void Test_Reading_Shinko_Request_PV(); -uint8_t Test_Reading_Shinko_Response_PV(); +extern uint32_t Shinko_Temperature; + +void Reading_Shinko_Request_PV(); +uint8_t Reading_Shinko_Response_PV(); void Test_Reading_Shinko_Request_SV(); uint8_t Test_Reading_Shinko_Response_SV(); diff --git a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c index 2868ea4b2..f60a2632f 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c +++ b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c @@ -136,9 +136,9 @@ uint8_t Uart3_Receive(uint8_t * Uart3_Rx_Buff, uint32_t RX_Length) -uint8_t Test_Uart3(uint8_t test_number) +uint32_t Test_Uart3(uint8_t test_number) { - uint8_t Status = OK; + uint32_t RetVal = OK; //static uint8_t first_time = 0; //uint8_t i,Uart3_Tx_Buff[100]; @@ -169,61 +169,65 @@ uint8_t Test_Uart3(uint8_t test_number) switch(test_number) { case 0: //---------------------------------- test Shinko ----------------------- - WHS_IO_Init(); + WHS_IO_Init();// Done in HWConfigurationInit delayms(1); - InitConsole_WHS_UART3(); + InitConsole_WHS_UART3();// Done in HWConfigurationInit delayms(1); break; - case 1: //---------------------------------- test Shinko ----------------------- + case 1: //---------------------------------- Shinko reading temperature ----------------------- RS485_Direction(TX); delayms(1); - Test_Reading_Shinko_Request_PV(); + Reading_Shinko_Request_PV(); delayms(15); RS485_Direction(RX); delayms(5); - Status|=Test_Reading_Shinko_Response_PV(); + RetVal|=Reading_Shinko_Response_PV(); break; case 2: //---------------------------------- test Shinko ----------------------- - RS485_Direction(TX); + + RS485_Direction(TX);//done in MilisecTask delayms(1); - Test_Reading_Shinko_Request_SV(); + Test_Reading_Shinko_Request_SV();//done in MilisecTask delayms(15); - RS485_Direction(RX); + RS485_Direction(RX);//done in MilisecTask delayms(5); - Status|=Test_Reading_Shinko_Response_SV(); + RetVal|=Test_Reading_Shinko_Response_SV();//done in MilisecTask + break; + case 3: //---------------------------------- test Shinko ----------------------- + RetVal = Shinko_Temperature; break; /* - case 3://---------------------------------- test modbus ----------------------- + case 4://---------------------------------- test modbus ----------------------- RS485_Direction(TX); Test_Reading_modbus_Request_PV(); delayUs(4); RS485_Direction(RX); delayUs(1); - Status|=Test_Reading_modbus_Response_PV_SV(); + RetVal|=Test_Reading_modbus_Response_PV_SV(); break; - case 4://---------------------------------- test modbus ----------------------- + case 5://---------------------------------- test modbus ----------------------- RS485_Direction(TX); Test_Reading_modbus_Request_SV(); delayUs(4); RS485_Direction(RX); delayUs(1); - Status|=Test_Reading_modbus_Response_PV_SV(); + RetVal|=Test_Reading_modbus_Response_PV_SV(); break; - case 5://---------------------------------- test modbus ----------------------- + case 6://---------------------------------- test modbus ----------------------- RS485_Direction(TX); Test_Reading_modbus_Request_SV(); delayUs(4); RS485_Direction(RX); delayUs(1); - Status|=Test_Reading_modbus_Response_Error_SV(); + RetVal|=Test_Reading_modbus_Response_Error_SV(); break; */ default: break; } - return Status; + return RetVal; } @@ -267,4 +271,40 @@ unsigned short Calculate_CRC16 ( int Message_Length, char *Message) // for modbu } */ +uint8_t WHS_Shinko_Communication() //reading every fourth cycle (Set HW, Request, Set HW, Response) +{ + uint8_t Status = OK; + static uint8_t Shinko_Comm_Stage = 0; + const uint8_t Stage1_Delay_From_PowerUp = 10; //10 * 400mSec + + if(Shinko_Comm_Stage == Stage1_Delay_From_PowerUp) //start after few sec from power up + { + RS485_Direction(TX);//Set HW for TX + Shinko_Comm_Stage++; + } + else + if(Shinko_Comm_Stage == Stage1_Delay_From_PowerUp + 1) + { + Reading_Shinko_Request_PV();//Send Command + Shinko_Comm_Stage++; + } + else + if(Shinko_Comm_Stage == Stage1_Delay_From_PowerUp + 2) + { + RS485_Direction(RX);//Set HW for RX + Shinko_Comm_Stage++; + } + else + if(Shinko_Comm_Stage == + 3) + { + Status|=Reading_Shinko_Response_PV();//Get Response + Shinko_Comm_Stage = Stage1_Delay_From_PowerUp; + } + else + { + Shinko_Comm_Stage = Stage1_Delay_From_PowerUp; + } + + return Status; // check header, checksum... +} diff --git a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h index b46bc899e..a9e9e4d59 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h +++ b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h @@ -13,4 +13,8 @@ uint8_t Uart3_Transmit(uint8_t * Uart3_Tx_Buff, uint32_t Length); uint8_t Uart3_Receive(uint8_t * Uart3_Rx_Buff, uint32_t RX_Length); uint8_t Test_Uart3(uint8_t test_number); +void InitConsole_WHS_UART3(void); + +uint8_t WHS_Shinko_Communication(); + #endif /* DRIVERS_UART_COMM_WHS_UART_WHS_UART_H_ */ diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index 55148e655..7e3118c13 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -65,6 +65,8 @@ #include #include +#include "drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h" + Task_Handle Millisecond_Task_Handle; /******************** Definitions ********************************************/ @@ -717,6 +719,10 @@ uint32_t MillisecLowLoop(uint32_t tick) if (isMotorConfigured(Motor_i)) MotorGetStatusFromFPGA(Motor_i); } + if (WHS_Type == WHS_TYPE_NEW) + { + WHS_Shinko_Communication(); // Reading every fourth cycle (Set HW, Request, Set HW, Response) + } } if ((O500Millisecond_Tick)&&(RapidPressureRead == false)) { diff --git a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c index 011e25317..4938035e6 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c +++ b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c @@ -56,6 +56,7 @@ #include "Drivers/I2C_Communication/Main_Board_EEPROM/Main_EEPROM.h" #include #include +#include "drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h" uint32_t EmbeddedParametersInit(void); uint32_t EmbeddedParametersWrite(void * buffer, uint16_t size); @@ -185,6 +186,10 @@ uint32_t HWConfigurationInit(void) //WHS_init(); // remove call to old WHS #endif + if (WHS_Type == WHS_TYPE_NEW) + { + InitConsole_WHS_UART3();//WHS Shinko communication + } // Waste Init (WHS) Waste_Init(); -- cgit v1.3.1 From ac87d8609897ff115261fb6995bb6e46d962015c Mon Sep 17 00:00:00 2001 From: Ronen Sberlo Date: Mon, 31 Aug 2020 15:51:06 +0300 Subject: arc head blowers PID --- .../Embedded/Drivers/Heater/TemperatureSensor.c | 4 +- .../Embedded/Modules/Control/MillisecTask.c | 3 + .../Embedded/Modules/General/GeneralHardware.c | 4 + .../Embedded_SW/Embedded/Modules/General/process.c | 5 +- .../Embedded_SW/Embedded/Modules/General/process.h | 1 + .../Embedded/Modules/Heaters/Heaters_ex.h | 1 + .../Embedded/Modules/Heaters/Heaters_print.c | 153 +++++++++++++++++++-- .../Embedded/Modules/Stubs_Handler/Progress.c | 17 +-- 8 files changed, 161 insertions(+), 27 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c b/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c index e06962ca5..abbfcb4db 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c +++ b/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c @@ -469,12 +469,12 @@ uint32_t CalculateTemperatures(TEMPERATURE_SENSOR_ID_ENUM SensorId, uint32_t Dat //bits to mvolts float temp1 = 3.3;//3.3V ref float temp2 = 8388608.0;//2^23 (24bit) - float temp3 = 100.0;// V_mult_by_100 + float temp3 = 10000.0;// V_mult_by_100 temp = Data & 0x00FFFFFF;//24bit temp *= temp1; - temp /= temp2; temp *= temp3; + temp /= temp2; Current_Measurement_C = (int32_t)(temp);///V_mult_by_100 } diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index 7e3118c13..f8868a67b 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -780,6 +780,9 @@ uint32_t MillisecLowLoop(uint32_t tick) } */ } + if (Head_Type == HEAD_TYPE_ARC) { + HeadBlowersControlLoop(); + } //call waste state machine Waste_StateMachine_OneSecond_Call(); diff --git a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c index 4938035e6..4ff2e546c 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c +++ b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c @@ -506,6 +506,10 @@ uint32_t HWConfiguration(UploadHardwareConfigurationRequest* UploadRequest) status += IDS_DispenserPidRequestMessage(request->pidcontrols[PID_i]); else if (request->pidcontrols[PID_i]->hardwarepidcontroltype == HARDWARE_PID_CONTROL_TYPE__WasteControl) WHS_PidRequestMessage(request->pidcontrols[PID_i]); + else if (request->pidcontrols[PID_i]->hardwarepidcontroltype == HARDWARE_PID_CONTROL_TYPE__HeadBlower_1) + HeadBlowerPidRequestMessage(request->pidcontrols[PID_i], HEAD_FAN_RIGHT); + else if (request->pidcontrols[PID_i]->hardwarepidcontroltype == HARDWARE_PID_CONTROL_TYPE__HeadBlower_2) + HeadBlowerPidRequestMessage(request->pidcontrols[PID_i], HEAD_FAN_LEFT); } } else diff --git a/Software/Embedded_SW/Embedded/Modules/General/process.c b/Software/Embedded_SW/Embedded/Modules/General/process.c index d41b3c1a0..7490cef69 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/process.c +++ b/Software/Embedded_SW/Embedded/Modules/General/process.c @@ -41,6 +41,7 @@ double dryerairflow = 5.0; double pressurebuildup = 0; double dryerzone1temp = 0; int32_t tableindex = 0; +double headBlowersFlow[2] = {1.5,1.5}; double dryerbufferMeters = 0; double dryerbufferCentimeters = 0; @@ -303,9 +304,9 @@ uint32_t HandleProcessParameters(ProcessParameters* ProcessParams,bool saveData) { status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__HeadCoverHeater2, false,ProcessParams->lblowertemp); } + headBlowersFlow[HEAD_FAN_RIGHT] = ProcessParams->rblowerflow; + headBlowersFlow[HEAD_FAN_LEFT] = ProcessParams->lblowerflow; Trigger_HeaterWriting(); - Trigger_Head_Fan_Control(HEAD_FAN_RIGHT,ProcessParams->rblowerflow); - Trigger_Head_Fan_Control(HEAD_FAN_LEFT,ProcessParams->lblowerflow); } if (status) diff --git a/Software/Embedded_SW/Embedded/Modules/General/process.h b/Software/Embedded_SW/Embedded/Modules/General/process.h index 7cd592aad..f7f16d11e 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/process.h +++ b/Software/Embedded_SW/Embedded/Modules/General/process.h @@ -19,6 +19,7 @@ extern double headairflow; extern double dryerairflow; extern double pressurebuildup; extern double dryerzone1temp; +extern double headBlowersFlow[2]; extern int32_t tableindex; diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h index 015c5ea83..00d5a2a65 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h @@ -46,3 +46,4 @@ int HeadBlowersGetRPM(uint8_t fanId); double PressureSensorInit(); void HeadBlowersInit(); void HeadBlowersCfg(); +void HeadBlowersControlLoop (); diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c index 54e552684..e59d2e223 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c @@ -51,6 +51,8 @@ /******************** Data Structures ********************************************/ #define OVERHEAT_COUNT_LIMIT 3 #define UNDERHEAT_COUNT_LIMIT 3 +#define MIN_ALLOWED_PWM 0 +#define MAX_ALLOWED_PWM 255 int Overheat_Count_Limit = OVERHEAT_COUNT_LIMIT; int Underheat_Count_Limit = UNDERHEAT_COUNT_LIMIT; @@ -84,6 +86,20 @@ typedef struct HeaterControlConfig_t HeaterPIDConfig[HEATER_TYPE_MAX_HEATERS] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //PID_Config_Params temp_params; +typedef struct +{ + bool m_isEnabled; + float m_SetParam; + float m_mesuredParam; + float m_preError; + float m_integral; + float m_calculatedError; + bool m_isReady; + int SamplesFilterSize; + PID_Config_Params m_params; +}HeadBlowerConfig; +HeadBlowerConfig HeadBlowerControl[2] = {0,0}; + /******************** GLOBAL PARAMETERS ********************************************/ HeaterCommand HeaterCmd[HEATER_TYPE_MAX_HEATERS]; uint32_t ControlIdtoHeaterId [HEATER_TYPE_MAX_HEATERS] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; @@ -94,6 +110,7 @@ uint32_t MainDryerHeaterMaxTempControl = 0xFF; uint32_t SecondDryerHeaterMaxTempControl = 0xFF; uint32_t DisasterControlId = 0xFF; double PressureSensorV0[2] = {0.0, 0.0}; +uint8_t HeadBlowersCloseLoopTime[2] = {2, 2}; #define DRYER_AIR_PT100 TEMP_SENSE_ANALOG_DRYER_TEMP1 #define DRYER_MAIN_PT100 TEMP_SENSE_ANALOG_DRYER_TEMP2 @@ -102,6 +119,7 @@ double PressureSensorV0[2] = {0.0, 0.0}; #define MAXIMUM_HEATER_READ 283 #define PRESSURE_SENSOR_CP 0.225 extern uint16_t Head_Fan_Tach[2]; +extern uint8_t Head_Fan_PWM_Command[2]; bool UseSecondaryDrierHeater = true; @@ -285,6 +303,7 @@ uint32_t HeatersDisasterControl(uint32_t x,uint32_t y); uint32_t PrepareHeater(int HeaterId, uint32_t SetTemperatue); void HeatersStartControlTimer (void); +int HeadBlowersGetPWM(uint8_t blowerId); //********************************************************************** //******************** CODE *******************************************/ @@ -1901,6 +1920,115 @@ void HeadBlowersInit() { Trigger_Head_Fan_Control(HEAD_FAN_RIGHT, 0); Trigger_Head_Fan_Control(HEAD_FAN_LEFT, 0); + + //PID parameters init + HeadBlowerControl[0].m_params.MAX = 200; + HeadBlowerControl[0].m_params.MIN = -200; + HeadBlowerControl[0].m_params.Kd = 0; + HeadBlowerControl[0].m_params.Kp = 350; + HeadBlowerControl[0].m_params.Ki = 600; + HeadBlowerControl[0].m_params.IntegralErrorMultiplier = 100; + HeadBlowerControl[0].m_params.ProportionalErrorMultiplier = 100; + HeadBlowerControl[0].m_params.epsilon = 0.2; + HeadBlowerControl[0].m_params.dt = 2; + //HeadBlowerControl[0].m_ingnoreValue = PID_Request->sensorcorrectionadjustment; // the minimal change required to change the motor speed in pulses + HeadBlowerControl[0].m_calculatedError = 0; + HeadBlowerControl[0].m_integral = 0; + HeadBlowerControl[0].m_isEnabled = true; + HeadBlowerControl[0].m_isReady = true; + HeadBlowerControl[0].m_mesuredParam = 0; + HeadBlowerControl[0].m_preError = 0; + HeadBlowerControl[0].m_SetParam = 5.0;//need to update SetParams on presegment stage + + HeadBlowerControl[1].m_params.MAX = 200; + HeadBlowerControl[1].m_params.MIN = -200; + HeadBlowerControl[1].m_params.Kd = 0; + HeadBlowerControl[1].m_params.Kp = 350; + HeadBlowerControl[1].m_params.Ki = 600; + HeadBlowerControl[1].m_params.IntegralErrorMultiplier = 100; + HeadBlowerControl[1].m_params.ProportionalErrorMultiplier = 100; + HeadBlowerControl[1].m_params.epsilon = 0.2; + HeadBlowerControl[1].m_params.dt = 2; + //HeadBlowerControl[0].m_ingnoreValue = PID_Request->sensorcorrectionadjustment; // the minimal change required to change the motor speed in pulses + HeadBlowerControl[1].m_calculatedError = 0; + HeadBlowerControl[1].m_integral = 0; + HeadBlowerControl[1].m_isEnabled = true; + HeadBlowerControl[1].m_isReady = true; + HeadBlowerControl[1].m_mesuredParam = 0; + HeadBlowerControl[1].m_preError = 0; + HeadBlowerControl[1].m_SetParam = 5.0;//need to update SetParams on presegment stage +} + +uint32_t HeadBlowerPidRequestMessage(void* request, int BlowerId) +{ + HardwarePidControl * PID_Request = request; + + HeadBlowerControl[BlowerId].m_params.MAX = 200; + HeadBlowerControl[BlowerId].m_params.MIN = -200; + HeadBlowerControl[BlowerId].m_params.Kd = PID_Request->derivativetime; + HeadBlowerControl[BlowerId].m_params.Kp = PID_Request->proportionalgain; + HeadBlowerControl[BlowerId].m_params.Ki = PID_Request->integraltime; + HeadBlowerControl[BlowerId].m_params.IntegralErrorMultiplier = PID_Request->setpointramprateorsoftstartramp; + HeadBlowerControl[BlowerId].m_params.ProportionalErrorMultiplier = PID_Request->outputonoffhysteresisvalue; + HeadBlowerControl[BlowerId].m_params.epsilon = PID_Request->epsilon; + HeadBlowerControl[BlowerId].m_params.dt = PID_Request->controloutputtype; + //HeadBlowerControl.m_ingnoreValue = PID_Request->sensorcorrectionadjustment; // the minimal change required to change the motor speed in pulses + HeadBlowerControl[BlowerId].m_calculatedError = 0; + HeadBlowerControl[BlowerId].m_integral = 0; + HeadBlowerControl[BlowerId].m_isEnabled = true; + HeadBlowerControl[BlowerId].m_isReady = true; + HeadBlowerControl[BlowerId].m_mesuredParam = 0; + HeadBlowerControl[BlowerId].m_preError = 0; + HeadBlowerControl[BlowerId].m_SetParam = PID_Request->outputproportionalcycletime;//need to update SetParams on presegment stage + return OK; +} + +uint32_t HeadBlowerPidFunc(double setParam,double measuredParam, int blowerId) +{ + int calculatedPwm; + + HeadBlowerControl[blowerId].m_mesuredParam = measuredParam; + HeadBlowerControl[blowerId].m_SetParam = setParam; + HeadBlowerControl[blowerId].m_calculatedError = PIDAlgorithmCalculation((float)HeadBlowerControl[blowerId].m_SetParam , (float)HeadBlowerControl[blowerId].m_mesuredParam, + &HeadBlowerControl[blowerId].m_params, &HeadBlowerControl[blowerId].m_preError, &HeadBlowerControl[blowerId].m_integral); + calculatedPwm = HeadBlowersGetPWM(blowerId) + HeadBlowerControl[blowerId].m_calculatedError; + + HeadBlowersCloseLoopTime[blowerId] = HeadBlowerControl[blowerId].m_params.dt; + Trigger_Head_Fan_Control(blowerId, calculatedPwm); + if (calculatedPwm < MIN_ALLOWED_PWM) + HeadBlowerControl[blowerId].m_integral = 0; + if (calculatedPwm > MAX_ALLOWED_PWM) + HeadBlowerControl[blowerId].m_integral = 0; + + return OK; +} + +bool HeadBlowerFlowControl(double Q_value, uint8_t blowerId) +{ + double currentFlow = 0.0; + int sensorId; + + sensorId = (blowerId == HEAD_FAN_RIGHT)?(HEAD_PT100_ZONE_5_0X84_0):(HEAD_PT100_ZONE_7_0X86_0); + currentFlow = PressureSensorGetPressure(sensorId); + HeadBlowerPidFunc(Q_value,currentFlow, blowerId); + return OK; +} + +void HeadBlowersControlLoop () +{ + int blowerId; + static int count[2] = {0, 0}; + if (GetMachineState() < MACHINE_STATE_WAIT_FOR_COOLER) + return; //do not start before controller is initialized and running + + for (blowerId = 0; blowerId <= 1; blowerId++) { + if (count[blowerId] == HeadBlowersCloseLoopTime[blowerId]) { + count[blowerId] = 0; + HeadBlowerFlowControl(headBlowersFlow[blowerId], blowerId); + } else { + count[blowerId] += 1; + } + } } void HeadBlowersCfg() @@ -1913,26 +2041,31 @@ void HeadBlowersCfg() } } -double PressureSensorInit(int fanId) +double PressureSensorInit(int blowerId) { int sensorId; - sensorId = (fanId == HEAD_FAN_RIGHT)?(HEAD_PT100_ZONE_5_0X84_0):(HEAD_PT100_ZONE_7_0X86_0); - PressureSensorV0[fanId] = MillisecGetTemperatures(sensorId); - PressureSensorV0[fanId] *= 10; - return PressureSensorV0[fanId]; + sensorId = (blowerId == HEAD_FAN_RIGHT)?(HEAD_PT100_ZONE_5_0X84_0):(HEAD_PT100_ZONE_7_0X86_0); + PressureSensorV0[blowerId] = MillisecGetTemperatures(sensorId); + PressureSensorV0[blowerId] /= 10; + return PressureSensorV0[blowerId]; } -int HeadBlowersGetRPM(uint8_t fanId) +int HeadBlowersGetRPM(uint8_t blowerId) { - Trigger_Head_Read_Tacho(fanId); + Trigger_Head_Read_Tacho(blowerId); - if (Head_Fan_Tach[fanId] == 0x1FFE) { + if (Head_Fan_Tach[blowerId] == 0x1FFE) { return 0; } else { - return 7864320/Head_Fan_Tach[fanId]; + return 7864320/Head_Fan_Tach[blowerId]; } } +int HeadBlowersGetPWM(uint8_t blowerId) +{ + return Head_Fan_PWM_Command[blowerId]; +} + double PressureSensorGetPressure(uint8_t SensorId) { double V0, Vm, Q, Cp; @@ -1940,7 +2073,7 @@ double PressureSensorGetPressure(uint8_t SensorId) Cp = PRESSURE_SENSOR_CP; V0 = (SensorId == HEAD_PT100_ZONE_5_0X84_0)?(PressureSensorV0[0]):(PressureSensorV0[1]); Vm = MillisecGetTemperatures(SensorId); - Vm *= 10; + Vm /= 10; Q = sqrt(Vm - V0 + 22) * Cp; return Q; } diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c index d983144f3..853f6913a 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c @@ -814,8 +814,7 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) Task_sleep(2000); //response.progress = Fan_Click_Info.Product_ID; - //response.progress = Head_Fan_Tach[0]; - response.progress = HeadBlowersGetRPM(HEAD_FAN_RIGHT); + response.progress = Head_Fan_Tach[0]; response.has_progress = true; } @@ -824,27 +823,19 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) { Trigger_Head_Fan_Control(HEAD_FAN_LEFT, request->delay & 0xFF); Task_sleep(2000); - //response.progress = Head_Fan_Tach[1]; - response.progress = HeadBlowersGetRPM(HEAD_FAN_LEFT); + response.progress = Head_Fan_Tach[1]; response.has_progress = true; } else if ((request->amount & 0x0000FFF0) == 0xFAC0) //WHS Fan control { uint16_t fan_tacho = 0; - WHS_fan_num Fan_Id; - uint8_t Fan_Speed; if (WHS_Type == WHS_TYPE_NEW) { - Fan_Id = (request->amount & 0x0000000F)-2;//0-5 - Fan_Speed = request->delay & 0x000000FF; - Trigger_SetWHSFanSpeed(Fan_Id, Fan_Speed); + Trigger_SetWHSFanSpeed(((request->amount & 0x0000000F)-2) , request->delay & 0x000000FF); Task_sleep(2000); - Trigger_WHSReadAllFanTacho(); - Task_sleep(1000); - //fan_tacho = WHS_Get_fan_tach( (request->amount & 0x0000000F)-2); - fan_tacho = WHS_Fan_Tach_RPM[Fan_Id]; + fan_tacho = WHS_Get_fan_tach( (request->amount & 0x0000000F)-2); } response.progress = fan_tacho; response.has_progress = true; -- cgit v1.3.1 From bd4581645434385407abdc13ae47a8faf2726078 Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Mon, 31 Aug 2020 17:04:09 +0300 Subject: fix IDS presegment handling, Shinko PV display --- Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c | 5 +++-- Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c | 4 ++-- Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c index 80c85c3ea..b09347628 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c @@ -56,6 +56,7 @@ #include "diagnostics.h" #include #include +#include "drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.h" #include "Modules/IFS/ifs.h" extern F2_CTRL_REG F2_CTRL_Reg; @@ -419,7 +420,7 @@ void LoadChillerState(HeaterType HeaterType,HeaterState *HeaterState) HeaterState->has_setpoint = true; HeaterState->setpoint = Shinko_Sv; HeaterState->has_currentvalue = true; - HeaterState->currentvalue = Shinko_Pv;//MillisecGetTemperatures(HeaterId2PT100Id[HeaterId])/100; + HeaterState->currentvalue = Shinko_Temperature;//MillisecGetTemperatures(HeaterId2PT100Id[HeaterId])/100; return; } @@ -918,7 +919,7 @@ void DiagnosticOneSecCollection(void) } else { - DiagnosticsMonitor.chillertemperature = &WasteLevel; + DiagnosticsMonitor.chillertemperature = &Shinko_Temperature; } DiagnosticsMonitor.n_chillertemperature = 1; DiagnosticsMonitor.n_wastelevel = 1; diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c index e59d2e223..e6a01c560 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c @@ -2072,8 +2072,8 @@ double PressureSensorGetPressure(uint8_t SensorId) Cp = PRESSURE_SENSOR_CP; V0 = (SensorId == HEAD_PT100_ZONE_5_0X84_0)?(PressureSensorV0[0]):(PressureSensorV0[1]); - Vm = MillisecGetTemperatures(SensorId); - Vm /= 10; + Vm = (double)(MillisecGetTemperatures(SensorId)); + Vm /= 10.0; Q = sqrt(Vm - V0 + 22) * Cp; return Q; } diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c index 8ee0b507e..b15f70267 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c @@ -916,7 +916,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) float updatedSpeed,tempSpeed; //REPORT_MSG((int)DispenserPrepareControlId, "Prepare Callback"); - DispenserBuildTimeCounter+=PRESSURE_READ_TIME_GAP; + DispenserBuildTimeCounter+=IDS_PRESEGMENT_TIME_STEP; if (DispenserBuildTimeCounter<(1*eOneSecond)) { @@ -1040,7 +1040,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) ReportWithPackageFilter(IDSFilter,IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, segmentfirst_speed, 0); DispenserBuildTimeCounter = 0; - //DispenserPrepareControlId = AddControlCallback( IDS_PreSegmentPrepare_Callback, PRESSURE_READ_TIME_GAP,TemplateDataReadCBFunction ,0, 0, 0 ); + //DispenserPrepareControlId = AddControlCallback( IDS_PreSegmentPrepare_Callback, IDS_PRESEGMENT_TIME_STEP,TemplateDataReadCBFunction ,0, 0, 0 ); setRapidPressureRead(true); } -- cgit v1.3.1 From e1532f3ce008c7c3d149f89fa80e74962d8cf2ca Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Tue, 1 Sep 2020 08:57:54 +0300 Subject: tests and prints for thread parameters in jog bugs --- Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c | 12 +++++++++++- .../Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c | 5 ++++- 2 files changed, 15 insertions(+), 2 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c index ab1ab77e6..275e7e5b7 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c @@ -842,6 +842,16 @@ uint32_t HandleJobThreadControlParameters(ThreadParameters* ThreadParams) { return OK; } + if((ThreadParams->bypassrockers != true)&&(ThreadParams->bypassrockers != false)) + { + ReportWithPackageFilter(ThreadFilter,"incorrect Thread parameters ",__FILE__,__LINE__,(int)ThreadParams->feederp,RpWarning,(int)ThreadParams->bypassrockers,0); + return OK; + } + if ((ThreadParams->feederp>100000)||(ThreadParams->feederi>100000)) + { + ReportWithPackageFilter(ThreadFilter,"incorrect Thread parameters ",__FILE__,__LINE__,(int)ThreadParams->feederp,RpWarning,(int)ThreadParams->bypassrockers,0); + return OK; + } if(ThreadParams->feederp) MotorControlConfig[FEEDER_MOTOR].m_params.Kp = ThreadParams->feederp; if(ThreadParams->feederi) @@ -1168,6 +1178,7 @@ uint32_t ThreadPrepareState(void *JobDetails) MotorControlConfig[Motor_i].m_preError = 0; MotorControlConfig[Motor_i].m_SetParam = 0;//need to update SetParams on presegment stage + HandleJobThreadControlParameters(JobTicket->threadparameters); //OVERRIDES CONFIGURATION PARAMETERS!!! temp_dt = MotorControlConfig[Motor_i].m_params.dt/0.001; MotorTiming[Motor_i] = (int)temp_dt; @@ -1278,7 +1289,6 @@ uint32_t ThreadPrepareState(void *JobDetails) } #endif } - HandleJobThreadControlParameters(JobTicket->threadparameters); //OVERRIDES CONFIGURATION PARAMETERS!!! #ifdef TEST_PID_THREAD testDancersControl(); diff --git a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c index 14da2e78a..da2e416b8 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c @@ -962,7 +962,10 @@ void JobRequestFunc(MessageContainer* requestContainer) { Report("Job Request ",__FILE__,__LINE__,Ticket->processparameters->dyeingspeed,RpWarning,n_segments, Ticket->intersegmentlength); memcpy(&Configured,&JobConfigured,sizeof(JobConfigured)); - memcpy(&SavedThreadParameters,&Ticket->threadparameters,sizeof(SavedThreadParameters)); + if (Ticket->threadparameters) + memcpy(&SavedThreadParameters,&Ticket->threadparameters,sizeof(SavedThreadParameters)); + else + Report("Job Request empty thread parameters ",__FILE__,__LINE__,Ticket->processparameters->dyeingspeed,RpWarning,n_segments, Ticket->intersegmentlength); StartJob(CurrentJob); } } -- cgit v1.3.1 From 8c03f133697306627f8ceb7a73abc922a28f7ab6 Mon Sep 17 00:00:00 2001 From: Avi Levkovich Date: Tue, 1 Sep 2020 14:14:18 +0300 Subject: update shinko logic --- .../WHS_Controller_Comm/WHS_UART/WHS_Uart.c | 100 ++++++++++++++------- .../WHS_Controller_Comm/WHS_UART/WHS_Uart.h | 10 ++- .../Embedded/Modules/Control/MillisecTask.c | 16 +++- .../Embedded/Modules/Diagnostics/Diagnostics.c | 4 +- 4 files changed, 93 insertions(+), 37 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c index 22d3cf836..365275b2d 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c +++ b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c @@ -19,9 +19,10 @@ #include "driverlib/interrupt.h" #include "utils/uartstdio.h" #include "driverlib/uart.h" -#include "Drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.h" + #include #include "drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.h" +#include "drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h" #include //uint8_t Uart3_Tx_Buff[100]; @@ -175,7 +176,7 @@ uint32_t Test_Uart3(uint8_t test_number) delayms(1); break; case 1: //---------------------------------- Shinko reading temperature ----------------------- - + //Read_value RS485_Direction(TX); delayms(1); Reading_Shinko_Request_PV(); @@ -185,7 +186,7 @@ uint32_t Test_Uart3(uint8_t test_number) RetVal|=Reading_Shinko_Response_PV(); break; case 2: //---------------------------------- test Shinko ----------------------- - + //Read_Setup RS485_Direction(TX);//done in MilisecTask delayms(1); Reading_Shinko_Request_SV();//done in MilisecTask @@ -277,40 +278,75 @@ unsigned short Calculate_CRC16 ( int Message_Length, char *Message) // for modbu } */ -uint8_t WHS_Shinko_Communication() //reading every fourth cycle (Set HW, Request, Set HW, Response) +typedef enum +{ + Stage_0 = 10, //to start after few sec from power up + Stage_1, + Stage_2, + Stage_3, + Stage_4 +}SHINKO_RW_STAGES_ENUM; + +uint8_t WHS_Shinko_Communication(SHINKO_RW_OPTIONS_ENUM RWOption) //reading every fourth cycle (Set HW, Request, Set HW, Response) { uint8_t Status = OK; - static uint8_t Shinko_Comm_Stage = 0; - const uint8_t Stage1_Delay_From_PowerUp = 10; //10 * 400mSec + static SHINKO_RW_STAGES_ENUM Shinko_Comm_Stage = Stage_0; + static uint8_t Option = 0; - if(Shinko_Comm_Stage == Stage1_Delay_From_PowerUp) //start after few sec from power up + switch(RWOption) { - RS485_Direction(TX);//Set HW for TX - Shinko_Comm_Stage++; - } - else - if(Shinko_Comm_Stage == Stage1_Delay_From_PowerUp + 1) - { - Reading_Shinko_Request_PV();//Send Command - Shinko_Comm_Stage++; - } - else - if(Shinko_Comm_Stage == Stage1_Delay_From_PowerUp + 2) - { - RS485_Direction(RX);//Set HW for RX - Shinko_Comm_Stage++; - } - else - if(Shinko_Comm_Stage == + 3) - { - Status|=Reading_Shinko_Response_PV();//Get Response - Shinko_Comm_Stage = Stage1_Delay_From_PowerUp; - } - else - { - Shinko_Comm_Stage = Stage1_Delay_From_PowerUp; + case Stage_0: + RS485_Direction(TX);//Set HW for TX + Option = RWOption;//change the read write option only in stage 0 ! + Shinko_Comm_Stage++; + break; + case Stage_1: + if(Option == R_SETUP) + { + Reading_Shinko_Request_SV();//Send Command + } + else + if(Option == R_Value) + { + Reading_Shinko_Request_PV();//Send Command + } + else + if((Option == W_SETUP) && (ShinkoTempDeg.Setup!= 0x00)) + { + Setting_Shinko_Request_SV();//Send Command + } + Shinko_Comm_Stage++; + break; + case Stage_2: + RS485_Direction(RX);//Set HW for RX + Shinko_Comm_Stage++; + break; + case Stage_3: + if(Option == R_SETUP) + { + Status|=Reading_Shinko_Response_SV();//Get Response + } + else + if(Option == R_Value) + { + Status|=Reading_Shinko_Response_PV();//Get Response + } + else + if((Option == W_SETUP) && (ShinkoTempDeg.Setup!= 0x00)) + { + Status|=Setting_Shinko_Response_SV();//Get Response + } + else + { + Status = ERROR; + } + + Shinko_Comm_Stage = Stage_0; + break; + default: + Shinko_Comm_Stage = Stage_0; + break; } return Status; // check header, checksum... } - diff --git a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h index a9e9e4d59..0f0b759ac 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h +++ b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h @@ -8,13 +8,19 @@ #ifndef DRIVERS_UART_COMM_WHS_UART_WHS_UART_H_ #define DRIVERS_UART_COMM_WHS_UART_WHS_UART_H_ +typedef enum +{ + R_Value, + R_SETUP, + W_SETUP +}SHINKO_RW_OPTIONS_ENUM; uint8_t Uart3_Transmit(uint8_t * Uart3_Tx_Buff, uint32_t Length); uint8_t Uart3_Receive(uint8_t * Uart3_Rx_Buff, uint32_t RX_Length); -uint8_t Test_Uart3(uint8_t test_number); +uint32_t Test_Uart3(uint8_t test_number); void InitConsole_WHS_UART3(void); -uint8_t WHS_Shinko_Communication(); +uint8_t WHS_Shinko_Communication(SHINKO_RW_OPTIONS_ENUM RWOption); #endif /* DRIVERS_UART_COMM_WHS_UART_WHS_UART_H_ */ diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index f8868a67b..8117c4d81 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -66,6 +66,7 @@ #include #include "drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h" +#include "Drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.h" Task_Handle Millisecond_Task_Handle; /******************** Definitions ********************************************/ @@ -721,7 +722,20 @@ uint32_t MillisecLowLoop(uint32_t tick) } if (WHS_Type == WHS_TYPE_NEW) { - WHS_Shinko_Communication(); // Reading every fourth cycle (Set HW, Request, Set HW, Response) + if(ShinkoTempDeg.Read_Setup == 0x00)//didn't read it yet + { + WHS_Shinko_Communication(R_SETUP); + } + else + if(0)//TBD - need stop condition to write only once (all the steps) , Read_Setup != setup, Read_Setup != 0, Read_Setup != Prev_Read_Setup + { + // option to wrte + read setup and stop when read = write + WHS_Shinko_Communication(W_SETUP); + } + else + { + WHS_Shinko_Communication(R_Value); // Reading every fourth cycle (Set HW, Request, Set HW, Response) + } } } if ((O500Millisecond_Tick)&&(RapidPressureRead == false)) diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c index b09347628..30ff55f36 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c @@ -420,7 +420,7 @@ void LoadChillerState(HeaterType HeaterType,HeaterState *HeaterState) HeaterState->has_setpoint = true; HeaterState->setpoint = Shinko_Sv; HeaterState->has_currentvalue = true; - HeaterState->currentvalue = Shinko_Temperature;//MillisecGetTemperatures(HeaterId2PT100Id[HeaterId])/100; + HeaterState->currentvalue = ShinkoTempDeg.Read_value;//Shinko_Temperature;//MillisecGetTemperatures(HeaterId2PT100Id[HeaterId])/100; return; } @@ -919,7 +919,7 @@ void DiagnosticOneSecCollection(void) } else { - DiagnosticsMonitor.chillertemperature = &Shinko_Temperature; + DiagnosticsMonitor.chillertemperature = &ShinkoTempDeg.Read_value;//Shinko_Temperature; } DiagnosticsMonitor.n_chillertemperature = 1; DiagnosticsMonitor.n_wastelevel = 1; -- cgit v1.3.1 From f8588504c5953ff39b36c113c7443c4dedbd4d1e Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Tue, 1 Sep 2020 15:08:58 +0300 Subject: shinko reading and display changes --- .../Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c | 3 +++ Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c | 5 +++-- Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h | 2 +- Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c | 4 ++-- Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c index 365275b2d..1d7d180f7 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c +++ b/Software/Embedded_SW/Embedded/Drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.c @@ -23,6 +23,7 @@ #include #include "drivers/Uart_Comm/WHS_Controller_Comm/Shinko/ACS-13AC5E3.h" #include "drivers/Uart_Comm/WHS_Controller_Comm/WHS_UART/WHS_Uart.h" +#include "Modules/Control/MillisecTask.h" #include //uint8_t Uart3_Tx_Buff[100]; @@ -342,9 +343,11 @@ uint8_t WHS_Shinko_Communication(SHINKO_RW_OPTIONS_ENUM RWOption) //reading ever } Shinko_Comm_Stage = Stage_0; + Shinko_Read = false; break; default: Shinko_Comm_Stage = Stage_0; + Shinko_Read = false; break; } diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index 8117c4d81..c2b4f5298 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -593,7 +593,7 @@ void setRapidPressureRead(bool value) if (GetDiagnosticMode() == Diagnostic_Extreme_Mode) RapidPressureRead = true; } - +bool Shinko_Read = true; uint16_t PumpCounter = 0; uint16_t realtimetest[101]; uint32_t MillisecLowLoop(uint32_t tick) @@ -720,7 +720,7 @@ uint32_t MillisecLowLoop(uint32_t tick) if (isMotorConfigured(Motor_i)) MotorGetStatusFromFPGA(Motor_i); } - if (WHS_Type == WHS_TYPE_NEW) + if ((WHS_Type == WHS_TYPE_NEW)&&(Shinko_Read == true)) { if(ShinkoTempDeg.Read_Setup == 0x00)//didn't read it yet { @@ -838,6 +838,7 @@ uint32_t MillisecLowLoop(uint32_t tick) { waste_seq_step1();// include 1Sec delay <- to open !!!! }*/ + Shinko_Read = true; } if (OneHourTick) { diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h index 226d0d57a..f7351d0b1 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h @@ -50,7 +50,7 @@ void MillisecLogClose(void); #endif - +extern bool Shinko_Read; extern bool watchdogCriticalAlarm; extern Task_Handle Millisecond_Task_Handle; diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c index 30ff55f36..9977c5305 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c @@ -418,7 +418,7 @@ void LoadChillerState(HeaterType HeaterType,HeaterState *HeaterState) HeaterState->has_heatertype = true; HeaterState->heatertype = HeaterType; HeaterState->has_setpoint = true; - HeaterState->setpoint = Shinko_Sv; + HeaterState->setpoint = ShinkoTempDeg.Read_Setup; HeaterState->has_currentvalue = true; HeaterState->currentvalue = ShinkoTempDeg.Read_value;//Shinko_Temperature;//MillisecGetTemperatures(HeaterId2PT100Id[HeaterId])/100; return; @@ -1276,7 +1276,7 @@ void SendDiagnostics(void) LoadHeaterState(HEATER_TYPE__HeaterZone11,&HeaterInfo[i++]); LoadHeaterState(HEATER_TYPE__HeaterZone12,&HeaterInfo[i++]); } - if ((Head_Type == HEAD_TYPE_FLAT)||(Head_Type == HEAD_TYPE_ARC)) + if (Head_Type == HEAD_TYPE_ARC) //if (Head_Type == HEAD_TYPE_STAPLE_SPUN) { LoadHeaterState(HEATER_TYPE__HeadCoverHeater1,&HeaterInfo[i++]); diff --git a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c index da2e416b8..e16909c45 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c @@ -963,7 +963,7 @@ void JobRequestFunc(MessageContainer* requestContainer) Report("Job Request ",__FILE__,__LINE__,Ticket->processparameters->dyeingspeed,RpWarning,n_segments, Ticket->intersegmentlength); memcpy(&Configured,&JobConfigured,sizeof(JobConfigured)); if (Ticket->threadparameters) - memcpy(&SavedThreadParameters,&Ticket->threadparameters,sizeof(SavedThreadParameters)); + memcpy(&SavedThreadParameters,Ticket->threadparameters,sizeof(SavedThreadParameters)); else Report("Job Request empty thread parameters ",__FILE__,__LINE__,Ticket->processparameters->dyeingspeed,RpWarning,n_segments, Ticket->intersegmentlength); StartJob(CurrentJob); -- cgit v1.3.1 From d20e512124158edf23d97d17ddb66881e73baabf Mon Sep 17 00:00:00 2001 From: Avi Levkovich Date: Tue, 1 Sep 2020 15:45:19 +0300 Subject: Fixing bug in function Read_All_WHS_Fans_Tach + changing the stub --- .../I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c | 3 ++- .../Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c | 12 +++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c index 895c8f73e..f22d53a77 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_EMC2302_Fan/WHS_Fan.c @@ -160,7 +160,8 @@ void Read_All_WHS_Fans_Tach() for (fan_number = FAN1 ; fan_number < maxFAN; fan_number++) { - tach = WHS_Read_fan_tach(fan_number); + WHS_Read_fan_tach(fan_number); + tach = WHS_Get_fan_tach(fan_number);// if (tach < 0x1FFE) { WHS_Fan_Tach[fan_number] = tach; diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c index 853f6913a..7ff0a9364 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c @@ -833,9 +833,15 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) if (WHS_Type == WHS_TYPE_NEW) { - Trigger_SetWHSFanSpeed(((request->amount & 0x0000000F)-2) , request->delay & 0x000000FF); - Task_sleep(2000); - fan_tacho = WHS_Get_fan_tach( (request->amount & 0x0000000F)-2); + if(request->delay <= 0xFF) + { + Trigger_SetWHSFanSpeed(((request->amount & 0x0000000F)-2) , request->delay & 0x000000FF); + } + else + { + //reading the tacho in msectask + fan_tacho = WHS_Fan_Tach_RPM[(request->amount & 0x0000000F)-2];//WHS_Get_fan_tach( (request->amount & 0x0000000F)-2); + } } response.progress = fan_tacho; response.has_progress = true; -- cgit v1.3.1 From 1eb9fc645cf7ac5fc97192419760956bb5219b83 Mon Sep 17 00:00:00 2001 From: Ronen Sberlo Date: Tue, 1 Sep 2020 16:03:56 +0300 Subject: remove old whs module --- .../Embedded/Common/Utilities/RFIDTagHandling.c | 3 - Software/Embedded_SW/Embedded/Main.c | 1 - .../Embedded_SW/Embedded/Modules/Waste/Waste.h | 207 --- .../Embedded/Modules/Waste/Waste_init.c | 1455 -------------------- .../Embedded/Modules/Waste/newWHS_init.c | 1 + .../StateMachines/Initialization/InitSequence.c | 1 - .../Initialization/PowerOffSequence.c | 1 - 7 files changed, 1 insertion(+), 1668 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Common/Utilities/RFIDTagHandling.c b/Software/Embedded_SW/Embedded/Common/Utilities/RFIDTagHandling.c index 39c2592ee..b210d79fc 100644 --- a/Software/Embedded_SW/Embedded/Common/Utilities/RFIDTagHandling.c +++ b/Software/Embedded_SW/Embedded/Common/Utilities/RFIDTagHandling.c @@ -5,8 +5,6 @@ * Author: shlomo */ #include "include.h" - -#include "Modules/Waste/Waste.h" #include "Modules/IFS/ifs.h" #include "Modules/AlarmHandling/AlarmHandling.h" #include "PMR/Diagnostics/CartridgeValidationRequest.pb-c.h" @@ -16,7 +14,6 @@ #include #include #include "drivers/Valves/Valve.h" -#include "Modules/Waste/Waste.h" #include "CartridgeSlot.pb-c.h" #include "CartridgeTagContent.pb-c.h" #include "Cartridge.pb-c.h" diff --git a/Software/Embedded_SW/Embedded/Main.c b/Software/Embedded_SW/Embedded/Main.c index d6f74dd48..8a66e89c8 100644 --- a/Software/Embedded_SW/Embedded/Main.c +++ b/Software/Embedded_SW/Embedded/Main.c @@ -78,7 +78,6 @@ #include "drivers/Flash_Memory/FATFS/Control_File_System.h" #include "Modules/General/buttons.h" -#include "Modules/Waste/Waste.h" #include #include "Drivers/I2C_Communication/Main_Board_EEPROM/Main_EEPROM.h" #include "Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.h" diff --git a/Software/Embedded_SW/Embedded/Modules/Waste/Waste.h b/Software/Embedded_SW/Embedded/Modules/Waste/Waste.h index 0da3530a9..e69de29bb 100644 --- a/Software/Embedded_SW/Embedded/Modules/Waste/Waste.h +++ b/Software/Embedded_SW/Embedded/Modules/Waste/Waste.h @@ -1,207 +0,0 @@ -#ifndef WASTE_H -#define WASTE_H -#if 0 -#include "drivers/I2C_Communication/ADC_MUX/ADC_MUX.h" - - -#define temp_funcion 0 -#define notOK 1 - - -/* -#define SENSORFULL 1 -#define SENSOROVERFLOW 1 -#define SENSOREMPTY 0 - - -#define SENSORnotFULL 0 -#define SENSORnotOVERFLOW 0 -#define SENSORnotEMPTY 1 -*/ -#define PUMPON 1 -#define PUMPOFF 0 - -#define PRECENSE 1 -#define NOTPRECENSE 0 - - - -typedef unsigned char U8; - - -typedef enum -{ - BLACK, - CYAN, - MAGENTA, - YELLOW, - TRANSPARENT, - SP_1, - CLEANER, - LUBRICANT -} CMYK_color; - -typedef enum -{ - CarteidgeNotPrecense = 0, - CarteidgePrecense -} CarteidgPrecenseSensorStatus; //WHS_CarteidgPrecenseSensorStatus; - -typedef enum -{ - WHS_CartridgeCoverCLOSE = 0, - WHS_CartridgeCoverOPEN -} WHS_CarteidgeCoverSensorStatus; - -typedef enum -{ - SENSORFULL = 0, - SENSORnotFULL -} WHS_FullSensorStatus; - -typedef enum -{ - SENSORnotEMPTY = 0, - SENSOREMPTY -} WHS_EmptySensorStatus; - -typedef enum -{ - WHS_empty = 0, - WHS_filling, - WHS_emptying, - WHS_full, - WHS_overflow, - WHS_sttError -} WHS_sttMachin; - -typedef enum -{ - WHS_no_event = 0, - WHS_overflow_sensor, - WHS_full_sensor, - WHS_empty_sensor, - IFS_INK_presence_sensor, - IFS_INK_authentication_pass, - IFS_INK_authentication_fail, - WHS_waste1_presence_sensor, - WHS_waste2_presence_sensor, - WHS_filter_sensor, - WHS_cartridge_cover_sensor, - WHS_Timeout, - IFS_Timeout, - IFS_Timeout_Second, - IFS_MidTankFull -} WHS_sensor; - -typedef enum -{ - // WasteEmpty = 0, - // WasteFilling, - // WasteFail, - ColorFull = 0, - ColorUsed, - WasteEmpty, - WasteFilling, - WasteFull, - WasteFail -} cartridge_status; - - -typedef enum -{ - led_on = 0, - led_off, - led_blink, - led_panic -} led_status; - -typedef enum -{ - no_waste_cartridge = 0, - INK_cartridge , - waste_cartridge1 , - waste_cartridge2 -} cartridge_name; - -typedef enum -{ - VALVE_DIR_WASTE_CARTRIDGE1 = 0, - VALVE_DIR_WASTE_CARTRIDGE2 -} valve_cartridge_name; - - -struct WHS_sensors_status -{ - WHS_CarteidgeCoverSensorStatus cartridge_cover; /*open(1) ,close(0) */ -// WHS_CarteidgPrecenseSensorStatus IFS_Ink_precense_sensor; /*presence(1) ,not_precense(0) */ -// bool IFS_Ink_precense_sensor_flag; /* 1=event 0=no enent */ - CarteidgPrecenseSensorStatus waste_cartridge1_precense_sensor; /*presence(1) ,not_precense(0) */ - bool waste_cartridge1_precense_sensor_flag; /* 1=event 0=no enent */ - CarteidgPrecenseSensorStatus waste_cartridge2_precense_sensor; /*presence(1) ,not_precense(0) */ - bool waste_cartridge2_precense_sensor_flag; /* 1=event 0=no enent */ - bool waste_tank_filter_sensor; /*presence(1) ,not_precense(0) */ - WHS_EmptySensorStatus waste_tank_empty_sensor; /*enpty(1) ,not_empty(0) */ - WHS_FullSensorStatus waste_tank_full_sensor; /*full(1) ,not_full(0) */ - bool waste_tank_over_flow_sensor; /*over_flow(1) ,not_over_flow(0) */ -}; - -struct cartridge_params -{ - uint32_t serial_number; - cartridge_status status; /*WasteEmpty, WasteFilling, WasteFail, WasteFull....... */ - MidTank_t cart_color; - bool autheticate; - uint32_t time_out; -}; - -struct pump_params -{ - bool status; - uint32_t time; -}; - -struct WHS_information -{ - WHS_sttMachin sttMachine; - struct cartridge_params cartridge_1, cartridge_2; - struct WHS_sensors_status WHS_sensors; - struct pump_params WHS_pump; - valve_cartridge_name WHS_valve; - WHS_sensor event; - cartridge_name active_cartridge; - uint32_t Cartridge_Ink_device_Id; - uint32_t Cartridge_Ink_TimeOut_device_Id; - uint32_t Cartridge_Waste1_device_Id; - uint32_t Cartridge_Waste2_device_Id; - uint32_t Cartridge_Cover_device_Id; - //PBcolor Ink_Led, cartridge_1_Led, cartridge_2_Led; - double MidTank_capacity; -}; -struct WHS_information WHS_info; - -U8 WHS_init(void); -U8 WHS_HW_test(void); -bool WHS_IsEmptying(); - -bool WHS_IsContainerFull(); -bool WHS_IsContainerEmpty(); -bool WHS_IsContainerOverflow(); -bool WHS_WasteCartridgeLowerPresent(); -bool WHS_WasteCartridgeMiddlePresent(); -bool WHS_IsPumpActive(); -bool WHS_IsValveOpen(); - -bool SetWastePump( bool power); - -void midtanktest6_ON(); -void midtanktest6_OFF(); - -//bool CartridgeValidationResponseFunc(MessageContainer* requestContainer); -//void ResponseDemo(int MidtankId); - -bool RdInkCartridgeSensor(); -bool WasteTankCBFunction(); -#endif -#endif - diff --git a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_init.c b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_init.c index 870463321..e69de29bb 100644 --- a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_init.c +++ b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_init.c @@ -1,1455 +0,0 @@ -/* ---- WHS */ -#if 0 -#include -#include -#include "include.h" -#include "Modules/Control/control.h" // use for FPGA IO -#include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h"//#include "FPGA_GPIO.h" // use for FPGA IO -#include "drivers/Valves/Valve.h" -#include "Common/report/report.h" -#include "Modules/Waste/Waste.h" -#include - -#include -#include "Modules/AlarmHandling/AlarmHandling.h" -#include "StateMachines/Initialization/PowerOffSequence.h" -#include "drivers/I2C_Communication/ADC_MUX/ADC_MUX.h" -#include "CartridgeValidationRequest.pb-c.h" -#include "CartridgeValidationResponse.pb-c.h" -#include "Modules/General/buttons.h" -#include "Modules/IFS/ifs.h" -#include -#include -#include -#include -// -//#define CARTRIDGE_INK_TIMEOUT 60 -//#define CARTRIDGE_INK_TIMEOUTx2 120 -//#define CartridgeInkTimeOutCallBackTime eOneSecond -//#define MidTank_Pressure_EMPTY 1000 //todo get from Moti the correct number -//#define CARTRIDGE_CAPATICY 1500 //liters -//#define FULL 1000 - -#define WasteTankCallBackTime eOneSecond -#define CartridgeCoverCallBackTime eOneSecond -#define CartridgeCoverCallBackFastTime eTenMillisecond -#define CartridgeWaste1CallBackTime eOneSecond -#define CartridgeWaste2CallBackTime eOneSecond -//#define CartridgeInkCallBackTime eOneSecond -#define STARTCOUNT 1 -#define STOPCOUNT 0 -#define PUMPTIMEOUT 1200 // seconds; 20 minutes, per Moty, 15/4/19 - -float MidTankEmptyLimit = MidTank_Pressure_EMPTY; - -/*------------Waste Tank function-----------------------*/ -bool initWHS_WasteTank(); -bool InitCartStatus(); - -//bool CartridgeCoverCBFunction(); -U8 CartridgeCoverCallBackFunction(); -// WHS_sensor CartridgeInkCallBackFunction(); -WHS_sensor CartridgeWaste1CallBackFunction(); -WHS_sensor CartridgeWaste2CallBackFunction(); -WHS_sensor WasteTankCallBackFunction(); -U8 CartridgeWasteFilling(bool status); -//bool WasteTankCBFunction(); -//WHS_sensor CartridgeInkTimeOutCallBackFunction(); - - -U8 CartridgePrecenceCBFunction(); -//U8 SetCartridgeLED(cartridge_name name,led_status led); - -bool SetWastePump( bool power); -bool SetValveDirection(); -bool RdCartridgeCoverSensor(); - -bool RdWasteCartridge1Sensor(); -bool RdWasteCartridge2Sensor(); -bool RdWasteTankFilterSensor(); -bool RdWasteTankOverFlowSensor(); -bool RdWasteTankFullSensor(); -bool RdWasteTankEmptySensor(); -bool RdCartridgeParam(cartridge_name cart_name); -bool CartridgeAuthentication(cartridge_name cart_name); -bool SetActiveWastCartridge(); -void SetWasteLevelEmptyingLimit(double value); - - - -NFCTag_t cartridge_info; - -// function for RFID: -bool WrRFIDStatus(cartridge_name active_cartridge, cartridge_status status); -cartridge_status RdRFIDStatus (cartridge_name active_cartridge); -bool RD_MID_TANK_Level(); - -//bool PowerOffInProcessGetState() {return OK;}; //todo -bool WrRFIDStatus(cartridge_name active_cartridge, cartridge_status status) { return OK;} //todo -cartridge_status RdRFIDStatus (cartridge_name active_cartridge) { return WasteEmpty; } //todo - -bool WHS_IsContainerFull(){return WHS_info.WHS_sensors.waste_tank_full_sensor;} -bool WHS_IsContainerEmpty(){return WHS_info.WHS_sensors.waste_tank_empty_sensor;} - -bool WHS_IsContainerOverflow(){return WHS_info.WHS_sensors.waste_tank_over_flow_sensor;} -bool WHS_WasteCartridgeLowerPresent(){return WHS_info.WHS_sensors.waste_cartridge1_precense_sensor;} -bool WHS_WasteCartridgeMiddlePresent(){return WHS_info.WHS_sensors.waste_cartridge2_precense_sensor;} -bool WHS_IsPumpActive(){return WHS_info.WHS_pump.status;} -bool WHS_IsValveOpen(){return WHS_info.WHS_valve;} -bool RD_MID_TANK_Level(){return 0 /* FULL*/ ;} -//bool ColorMatch(); -//bool MidTankValvesAction(bool action); - - - -//bool MidTankValvesAction(bool action) //Cartridge_MidTank_ON of Cartridge_MidTank_OFF -//{ -// bool ret = false; -// -// Valve_Set(IDS_Id_to_AirValve[WHS_info.Ink.cart_color], action ); //Atm_MidTank_OFF/ON -// Valve_Set(IDS_Id_to_CartrideValve[WHS_info.Ink.cart_color], action ); //Atm_MidTank_OFF/ON -// -// ret = true; -// return ret; -//} -// -//bool ColorMatch() -//{ -// bool ret = false; -// -// ret = true; -// return ret; -//} - -bool WHS_IsEmptying() -{ - bool ret = false; - if ( WHS_info.sttMachine == WHS_emptying ) - { - ret = true; - } - return ret; -} - -//char CartridgeRequestToken[36+1]; -//int CartridgeRequestId = 0x01010101; -///* -------- cartridge function ----*/ -//uint32_t ReadCartridgeData(cartridge_name cart_name) -//{ -// //this function triggers reading and validation of the cartridge information -// // for now it sends a request to the tablet to inquire for the ink color/midtank id -// MessageContainer responseContainer; -// CartridgeValidationRequest ValidationReq = CARTRIDGE_VALIDATION_REQUEST__INIT; -// Cartridge CartridgeData; -// -// strcpy(CartridgeRequestToken,"Happy days are coming to us, soon"); -// memcpy(&CartridgeRequestToken[32],&CartridgeRequestId,sizeof(CartridgeRequestId)); -// CartridgeRequestId++; -// -// cartridge__init(&CartridgeData); -// CartridgeData.has_slot = true; -// CartridgeData.slot = CARTRIDGE_SLOT__Ink; -// CartridgeData.tag = 0; -// CartridgeData.has_index = false; -// -// ValidationReq.has_action = true; -// ValidationReq.action = CARTRIDGE_ACTION__Inserted; -// -// ValidationReq.cartridge = &CartridgeData; -// -// responseContainer = createContainer(MESSAGE_TYPE__CartridgeValidationRequest, CartridgeRequestToken, true, &ValidationReq, &cartridge_validation_request__pack, &cartridge_validation_request__get_packed_size); -// //------------------------------------------------------------------------------------------- -// uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); -// size_t container_size = message_container__pack(&responseContainer, container_buffer); -// my_free(responseContainer.data.data); -// //SendChars((char*)container_buffer, container_size); -// -// return OK; -//} -//void ResponseDemo(int MidtankId) -//{ -// WHS_info.event = IFS_INK_authentication_pass; -// //global mid tank id = MidtankId; -// WHS_info.Ink.cart_color = MidtankId; -// WasteTankCBFunction();//call cart is ok -//} -//bool CartridgeValidationResponseFunc(MessageContainer* requestContainer) -//{ -// bool ret = notOK; -// CartridgeValidationResponse* response = cartridge_validation_response__unpack(NULL, requestContainer->data.len, requestContainer->data.data); -// -// Cartridge *cartridge; -// uint32_t midtankId; -// cartridge_name cart_name; -// -// // chack the massege: -// // 1. the cartridge is valid ( autantication) -// // 2. the pointer is not 0 !!! -// if (response->cartridge == 0 ) -// { -// REPORT_MSG(WHS_filling," ------------ IFS_filling message from PPC is null!!! ----------------- "); // write to log error -// return ret; -// } -// -// if (response->isvalid == true) -// { -// REPORT_MSG(WHS_filling," ------------ IFS_filling INK cartridge is valid ----------------- "); // write to log error -// cartridge = response->cartridge; -// midtankId = cartridge->index; // midtank 1-8 -// cart_name = cartridge->slot; //cart1(INK),cart2(WASTE1),cart3(WASTE1) -// if (cartridge->slot == INK_cartridge) -// { -// WHS_info.Ink.cart_color = cartridge->index; // midtank 1-8 -// WHS_info.event = IFS_INK_authentication_pass; -// } -// WasteTankCBFunction();//call cart is ok -// ret = OK; -// } -// else -// { -// REPORT_MSG(WHS_filling," ------------ IFS_filling INK cartridge is not valid !!!----------------- "); // write to log error -//// cartridge = response->cartridge; -//// mimidtankId = cartridge->index; -//// cart_name = cartridge->slot; -// WHS_info.event = IFS_INK_authentication_fail; -// WasteTankCBFunction();// call cart is INVALID -// ret = OK; -// } -//return ret; -//} - - - -bool RdCartridgeParam(cartridge_name cart_name) -{ - /* - read all parameters from RFid cartridge: - serial number, cartridge_status... - waste_cartridge 1 or 1 - update waste_cartridge struct - */ - bool ret = notOK; - switch (cart_name) - { - case waste_cartridge1: - WHS_info.cartridge_1.serial_number = temp_funcion; //to do - WHS_info.cartridge_1.status = WasteEmpty; // to do - break; - case waste_cartridge2: - WHS_info.cartridge_2.serial_number = temp_funcion; - WHS_info.cartridge_2.status = WasteEmpty; - break; - case INK_cartridge: - ReadCartridgeData(cart_name); - //memcpy(cartridge_info.ColorName,RED); -// add call back!! WasteTankCallBackTime -// state - wait for cartridge validation -// //WHS_info.Ink.serial_number = temp_funcion; - //WHS_info.Ink.status = temp_funcion; - break; - default: - break; - } - ret = OK; - return ret; -} - -bool CartridgeAuthentication(cartridge_name cart_name) -{ - bool ret = notOK; - // TBD; - switch (cart_name) - { -// case INK_cartridge: -// WHS_info.Ink.autheticate = PASSED; //todo -// //Pannel_Leds(CART_1, MODE_ON); -// break; - case waste_cartridge1: - WHS_info.cartridge_1.autheticate = PASSED; //todo - //Pannel_Leds(CART_2, MODE_ON); - break; - case waste_cartridge2: - WHS_info.cartridge_2.autheticate = PASSED; //todo - //Pannel_Leds(CART_3, MODE_ON); - break; - default: - WHS_info.cartridge_1.autheticate = FAILED; //todo - WHS_info.cartridge_2.autheticate = FAILED; //todo - //Pannel_Leds(CART_2, MODE_OFF); - //Pannel_Leds(CART_3, MODE_OFF); - break; - } - ret = OK; - return ret; -} - -/* -bool check_RFID_authentication() -{ - bool ret = notOK; - // rd_waste_cartridge_param(); - if ( 1 ) - ret = OK; - return ret; -} - - -U8 Wr_cartridge_RFid(cartridge_name cartridge, cartridge_status status) -{ - bool ret = notOK; - // TBD; - ret = OK; - return ret; -} - -U8 set_cartridge_2(U8 cartridge_status) -{ - bool ret = notOK; - WHS_info.cartridge_2.status = temp_funcion; - return ret; -} -*/ - -/* ------------------------------*/ - - -bool SetWastePump( bool power) -{ - if ((IFS_Availability[1] == IFS_RECOGNIZED)&&(IFS_Availability[2] == IFS_RECOGNIZED)) //ifs installed -check cartridges - { - if ((WHS_WasteCartridgeLowerPresent() == false)&&(WHS_WasteCartridgeMiddlePresent() == false)) - return ERROR; - } - - /* - set the waste pump on/off - off - : - 1. when waste tank is empty - 2. when empting is time out - 3. cartrigde cover is open - 4. when waste1 is not precense AND valve3way==1 - 5. when waste2 is not precense AND valve3way==2 - 6. when autentication with waste cartige is disable - on : - 1. when waste_tank_full - - void Pumps_Control(PUMPS_ENUM Pump_Id, bool Direction) //1 - OPEN, 0 - CLOSE ?? WHS_WTANKPUMP2 or WASTECH_PUMP2 - */ - bool ret = notOK; -// if (( power == OPEN ) && (WHS_info.WHS_sensors.cartridge_cover == CLOSE)) - if ( power == OPEN ) - { - if (WHS_Type == WHS_TYPE_UNKNOWN) - { - Pumps_Control(WHS_WTANKPUMP2, OPEN); //waste_pump_power_on(); - } - else //new WHS - { - Trigger_SetWHSPump(OPEN); - } - WHS_info.WHS_pump.status = OPEN; - ReportWithPackageFilter(WasteFilter,"------------ WHS WHS_empty start PUMP -----------------", __FILE__, __LINE__, WHS_info.WHS_pump.status, RpMessage, 0, 0); - WHS_info.WHS_pump.time = STARTCOUNT; - ret = OPEN; - } - else - { - if (WHS_Type == WHS_TYPE_UNKNOWN) - { - Pumps_Control(WHS_WTANKPUMP2, CLOSE); //waste_pump_power_on(); - } - else //new WHS - { - Trigger_SetWHSPump(CLOSE); - } - WHS_info.WHS_pump.status = CLOSE; - ReportWithPackageFilter(WasteFilter,"------------ WHS WHS_empty stop PUMP -----------------", __FILE__, __LINE__, WHS_info.WHS_pump.status, RpMessage, 0, 0); - WHS_info.WHS_pump.time = STOPCOUNT; - ret = CLOSE; - } - return ret; -} - - - - -bool SetValveDirection() -{ - /* - * waste_cartridge = 1- OPEN, 0 - CLOSE - * VALVE_WASTE_TANK - * - * */ - bool ret = OK; - //if (WHS_info.WHS_valve != no_waste_cartridge) - if (WHS_info.active_cartridge == waste_cartridge1) - { - WHS_info.WHS_valve = VALVE_DIR_WASTE_CARTRIDGE1; - ReportWithPackageFilter(WasteFilter,"------------WHS_info.WHS_valve VALVE_DIR_WASTE_CARTRIDGE1 -----------------", __FILE__, __LINE__, WHS_info.WHS_valve, RpMessage, 0 ,0); -} - else - { - WHS_info.WHS_valve = VALVE_DIR_WASTE_CARTRIDGE2; - ReportWithPackageFilter(WasteFilter,"------------WHS_info.WHS_valve VALVE_DIR_WASTE_CARTRIDGE2 -----------------", __FILE__, __LINE__, WHS_info.WHS_valve, RpMessage, 0 ,0); - } - - - if (WHS_Type == WHS_TYPE_UNKNOWN) - Valve_Set(VALVE_WASTE_TANK, WHS_info.WHS_valve); - else //new WHS - Trigger_SetWHSValveWatseCartridge(WHS_info.WHS_valve); - - //ret = OK; - - return ret; -} - - -/*-------------------------- function for WHS ------------------------------- */ - -U8 CartridgeWasteFilling(bool status) -{ - bool ret = notOK; - //SetValveDirection(); - if ((status == ON) && (WHS_info.active_cartridge != no_waste_cartridge)) - { - SetValveDirection();//Valve_Set(VALVE_WASTE_TANK, WHS_info.active_cartridge); //set the valve direction - //Pannel_Leds(PANEL_BUTTON_OR_CRAT_ID Pannel_Led_Id, OPERATION_MODE LED_Mode); //set cartridge led color slow blink - SetWastePump(OPEN); - //WHS_info.WHS_pump.time = 0; - AlarmHandlingSetAlarm( EVENT_TYPE__NO_WASTE_CARTRIDGE_AVAILABLE, false); - if (WHS_Type == WHS_TYPE_NEW) - { - SetWasteLevelEmptyingLimit(GetWHSWasteTankLevelMiliLiter()); - waste_seq_step1_cont(); - } - switch (WHS_info.active_cartridge) - { - case waste_cartridge1: - Pannel_Leds( CART_2, MODE_ON); //set led color - cart2.color = BLINK; - ReportWithPackageFilter(WasteFilter,"------------ WHS waste_cartridge1 is used please replace it -----------------", __FILE__, __LINE__, 0, RpMessage, 0, 0); - break; - case waste_cartridge2: - Pannel_Leds( CART_3, MODE_ON); //set led color - cart3.color = BLINK; - ReportWithPackageFilter(WasteFilter,"------------ WHS waste_cartridge2 is used please replace it -----------------", __FILE__, __LINE__, 0, RpMessage, 0, 0); - break; - case no_waste_cartridge: - ReportWithPackageFilter(WasteFilter,"------------ !!!!!WHS No waste cartridge !!!!! -----------------", __FILE__, __LINE__, 0, RpMessage, 0, 0); - ReportWithPackageFilter(WasteFilter,"------------ !!!! WHS insert cartridge!!!! -----------------", __FILE__, __LINE__, 0, RpMessage, 0, 0); - SetWastePump(CLOSE); - //WHS_info.WHS_pump.time = 0; - AlarmHandlingSetAlarm( EVENT_TYPE__NO_WASTE_CARTRIDGE_AVAILABLE, true); - ret = ERROR; - break; - default: - break; - } - ret=OK; - } - else // stop Waste cartridge filling - { - SetWastePump(CLOSE); - WHS_info.WHS_valve = VALVE_DIR_WASTE_CARTRIDGE1; - if (WHS_Type == WHS_TYPE_UNKNOWN) - Valve_Set(VALVE_WASTE_TANK, WHS_info.WHS_valve); - else //new WHS - { - Trigger_SetWHSValveWatseCartridge(WHS_info.WHS_valve); - waste_seq_cont_stop(); - } - - AlarmHandlingSetAlarm( EVENT_TYPE__ALL_WASTE_CARTRIDGES_FULL, true); - - switch (WHS_info.active_cartridge) - { - case waste_cartridge1: - Pannel_Leds( CART_2, MODE_OFF); //set led color - cart2.color = colorOFF; - ReportWithPackageFilter(WasteFilter,"------------ WHS waste_cartridge1 is used please replace it -----------------", __FILE__, __LINE__, 0, RpMessage, 0, 0); - break; - case waste_cartridge2: - Pannel_Leds( CART_3, MODE_OFF); //set led color - cart3.color = colorOFF; - ReportWithPackageFilter(WasteFilter,"------------ WHS waste_cartridge2 is used please replace it -----------------", __FILE__, __LINE__, 0, RpMessage, 0, 0); - break; - case no_waste_cartridge: - ReportWithPackageFilter(WasteFilter,"------------ !!!!!WHS No waste cartridge !!!!! -----------------", __FILE__, __LINE__, 0, RpMessage, 0, 0); - ReportWithPackageFilter(WasteFilter,"------------ !!!! WHS insert cartridge!!!! -----------------", __FILE__, __LINE__, 0, RpMessage, 0, 0); - ret = ERROR; - break; - default: - break; - } - - - //write RFID status - } - return ret; -} - -/* ------read waste tank sensors ----------- */ -#define WASTE_CARTRIDGE_SIZE 1500 -#define WASTE_LEVEL_OVERFLOW 2700 -#define WASTE_LEVEL_FULL 2300 -#define WASTE_LEVEL_EMPTY 900 -double WasteLevelOverflow = WASTE_LEVEL_OVERFLOW; -double WasteLevelFull = WASTE_LEVEL_FULL; -double WasteLevelEmpty = WASTE_LEVEL_EMPTY; -void SetWasteLevelEmptyingLimit(double value) -{ - WasteLevelEmpty = value - WASTE_CARTRIDGE_SIZE; - ReportWithPackageFilter(WasteFilter,"------------ SetWasteLevelEmptyingLimit -----------------", __FILE__, __LINE__, (int)(value*100), RpMessage, (int)(WasteLevelEmpty*100), 0); -} -bool RdWasteTankEmptySensor() -{ - double WasteLevel = 0.0; - bool ret = notOK; - //WHS_Read_GPI_Registers(); - //WHS_info.WHS_sensors.waste_tank_empty_sensor = WHS_GPI_WCONTAINER_WARN(); - //ret = WHS_info.WHS_sensors.waste_tank_empty_sensor; - if (WHS_Type == WHS_TYPE_UNKNOWN) - { - ret = WHS_GPI_WCONTAINER_WARN(); - } - else //new WHS - { - WasteLevel = GetWHSWasteTankLevelMiliLiter(); - if (WasteLevel < WasteLevelEmpty) - ret = OK; - } - return ret; -} - -bool RdWasteTankFullSensor() -{ - double WasteLevel = 0.0; - bool ret = SENSORnotFULL; - //WHS_Read_GPI_Registers(); - //WHS_info.WHS_sensors.waste_tank_full_sensor = WHS_GPI_WCONTAINER_FULL(); - //ret = WHS_info.WHS_sensors.waste_tank_full_sensor; - if (WHS_Type == WHS_TYPE_UNKNOWN) - { - ret = WHS_GPI_WCONTAINER_FULL(); - } - else //new WHS - { - WasteLevel = GetWHSWasteTankLevelMiliLiter(); - if (WasteLevel >= WasteLevelFull) - ret = SENSORFULL; - } - return ret; -} - -bool RdWasteTankOverFlowSensor() -{ - bool ret = notOK; - double WasteLevel = 0.0; - //WHS_Read_GPI_Registers(); - //WHS_info.WHS_sensors.waste_tank_over_flow_sensor = WHS_GPI_WASTE_OVERFULL(); - //ret = WHS_info.WHS_sensors.waste_tank_over_flow_sensor; - if (WHS_Type == WHS_TYPE_UNKNOWN) - { - ret = WHS_GPI_WASTE_OVERFULL(); - } - else //new WHS - { - WasteLevel = GetWHSWasteTankLevelMiliLiter(); - if (WasteLevel > WasteLevelOverflow) - ret = OK; - } - return ret; -} - -/*-------------*/ - - -WHS_sttMachin UpdateStateMachine() -{ - //WHS_sttMachin ret = WHS_sttError ; - - if ( WHS_info.WHS_sensors.waste_tank_full_sensor == SENSORnotFULL) - { - WHS_info.sttMachine = WHS_empty ; - ReportWithPackageFilter(WasteFilter,"------------ WHS WHS_empty -----------------", __FILE__, __LINE__, WHS_info.WHS_sensors.waste_tank_full_sensor, RpMessage, WHS_info.WHS_sensors.waste_tank_empty_sensor, 0); - } - else if ((WHS_info.WHS_sensors.waste_tank_full_sensor == SENSORFULL) && - (WHS_info.WHS_sensors.waste_tank_empty_sensor == SENSORnotEMPTY)) - { - WHS_info.sttMachine = WHS_full ; - ReportWithPackageFilter(WasteFilter,"------------ WHS WHS_full -----------------", __FILE__, __LINE__, WHS_info.WHS_sensors.waste_tank_full_sensor, RpMessage, WHS_info.WHS_sensors.waste_tank_empty_sensor, 0); - } - else - { - WHS_info.sttMachine = WHS_sttError ; - ReportWithPackageFilter(WasteFilter,"------------ WHS sensor Error -----------------", __FILE__, __LINE__, WHS_info.WHS_sensors.waste_tank_full_sensor, RpMessage, WHS_info.WHS_sensors.waste_tank_empty_sensor, 0); - } - return WHS_info.sttMachine; -} - - -bool initWHS_WasteTank() -{ - WHS_info.WHS_sensors.waste_tank_empty_sensor = RdWasteTankEmptySensor(); - WHS_info.WHS_sensors.waste_tank_full_sensor = SENSORnotFULL; - Task_sleep(15); - UpdateStateMachine(); - AddControlCallback("Waste tank",WasteTankCBFunction, WasteTankCallBackTime , WasteTankCallBackFunction, 0,0,0);//eOneMinute - return OK; -} - - -WHS_sensor EmptySensorEvent() -{ - WHS_sensor ret = WHS_no_event; - if (RdWasteTankEmptySensor() != WHS_info.WHS_sensors.waste_tank_empty_sensor) - { - WHS_info.event = WHS_empty_sensor; - ret = WHS_empty_sensor; - WHS_info.WHS_sensors.waste_tank_empty_sensor = !WHS_info.WHS_sensors.waste_tank_empty_sensor; - ReportWithPackageFilter(WasteFilter,"------------ WHS EmptySensorEvent (status) -----------------", __FILE__, __LINE__, WHS_info.WHS_sensors.waste_tank_full_sensor, RpMessage, WHS_info.WHS_sensors.waste_tank_empty_sensor, 0); - } - return ret; -} - -WHS_sensor FullSensorEvent() -{ - WHS_sensor ret = WHS_no_event; - if ( RdWasteTankFullSensor() != WHS_info.WHS_sensors.waste_tank_full_sensor ) - { - WHS_info.event = WHS_full_sensor; - ret = WHS_full_sensor; - WHS_info.WHS_sensors.waste_tank_full_sensor = 1-WHS_info.WHS_sensors.waste_tank_full_sensor; - ReportWithPackageFilter(WasteFilter,"------------ WHS FullSensorEvent (status) -----------------", __FILE__, __LINE__, WHS_info.WHS_sensors.waste_tank_full_sensor, RpMessage, WHS_info.WHS_sensors.waste_tank_empty_sensor, 0); - } - return ret; -} - -WHS_sensor WasteTankCallBackFunction() -{ - /* detect waste tank sensor event */ - WHS_sensor ret = WHS_no_event; -/* if ( OverflowSensorEvent()) - { - return WHS_info.event; - } - else */ - if (WHS_info.WHS_pump.time) WHS_info.WHS_pump.time += 1; - if (WHS_info.WHS_pump.time == PUMPTIMEOUT) - { - WHS_info.WHS_pump.time = 0; - AlarmHandlingSetAlarm( EVENT_TYPE__WASTE_CONTAINER_EMPTYING_TIMEOUT, false); - ReportWithPackageFilter(WasteFilter,"------------ WHS PUMPTIMEOUT -----------------", __FILE__, __LINE__, PUMPTIMEOUT, RpMessage, 0, 0); - return WHS_info.event = WHS_Timeout; - } - if ( FullSensorEvent()) - { - return WHS_info.event; - } - else if ( EmptySensorEvent()) - { - return WHS_info.event; - } - - return ret; -} - -bool WasteTankCBFunction() -{ - - bool ret = notOK; - static bool pump_on_flag = CLOSE; - //uint32_t Cartridge_Cover_device_Id = 0; - double MidTank_Pressure = 0; - - switch (WHS_info.event) - { - case WHS_empty_sensor: - if (WHS_info.WHS_sensors.waste_tank_empty_sensor == SENSORnotEMPTY) - { - if (WHS_info.sttMachine == WHS_empty) - { - WHS_info.sttMachine = WHS_filling; - ReportWithPackageFilter(WasteFilter,"------------ WHS WHS_filling ------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, 0, 0); - } - else - { - ReportWithPackageFilter(WasteFilter,"------------ WHS WHS EMPTY sensor failed !!!!!!! ------------", __FILE__, __LINE__, 0, RpMessage, 0, 0); - } - } - else //SENSOREMPTY - { - if (WHS_info.sttMachine == WHS_emptying) - { - WHS_info.sttMachine = WHS_empty; - ReportWithPackageFilter(WasteFilter,"------------ WHS WHS_empty -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, 0, 0); - ret = CartridgeWasteFilling(OFF); - WHS_info.Cartridge_Cover_device_Id = RemoveControlCallback(WHS_info.Cartridge_Cover_device_Id, WasteTankCBFunction ); - WHS_info.Cartridge_Cover_device_Id = AddControlCallback("Cartridge Cover Door", WasteTankCBFunction, CartridgeCoverCallBackTime, CartridgeCoverCallBackFunction, 0,0,0 );//eOneSecond - WrRFIDStatus(WHS_info.active_cartridge, WasteFull);//write RFID status todo - } - else - { - ReportWithPackageFilter(WasteFilter,"------------ WHS WHS EMPTY sensor failed !!!!!!! -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, 0, 0); - } - } - break; - case WHS_full_sensor: - /* if the machine status is power down : don't start the waste emptying sequence !!!*/ - if ( PowerOffInProcessGetState() ) - break; - if ((WHS_info.WHS_sensors.cartridge_cover == OPEN) && (WHS_info.WHS_sensors.waste_tank_full_sensor == SENSORFULL)) - { - ReportWithPackageFilter(WasteFilter,"------------ WHS_full , cartridge cover is open cant start the pump!!!! -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, WHS_info.WHS_sensors.cartridge_cover, 0); - ReportWithPackageFilter(WasteFilter,"------------ WHS, close the cartridge cover to start the pump!!!! -------------" , __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, WHS_info.WHS_sensors.cartridge_cover, 0); - - AlarmHandlingSetAlarm( EVENT_TYPE__NO_WASTE_CARTRIDGE_AVAILABLE, true); - - WHS_info.WHS_sensors.waste_tank_full_sensor = SENSORnotFULL; - break; - } - if (WHS_info.WHS_sensors.waste_tank_full_sensor == SENSORFULL) - { - WHS_info.sttMachine = WHS_full; - ReportWithPackageFilter(WasteFilter,"------------ WHS, WHS_full -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, WHS_info.WHS_sensors.waste_tank_full_sensor, 0); - WHS_info.Cartridge_Cover_device_Id = RemoveControlCallback(WHS_info.Cartridge_Cover_device_Id, WasteTankCBFunction ); - WHS_info.Cartridge_Cover_device_Id = AddControlCallback("Cartridge Cover Door", WasteTankCBFunction, CartridgeCoverCallBackFastTime , CartridgeCoverCallBackFunction, 0,0,0 );//eTenMillisecond - if (RdRFIDStatus (WHS_info.active_cartridge) == WasteEmpty) - { - ret = WrRFIDStatus(WHS_info.active_cartridge, WasteFilling);//write RFID status todo - if (ret == OK) - { - ret = CartridgeWasteFilling(ON); - } - else - { - WrRFIDStatus(WHS_info.active_cartridge, WasteFail);//write RFID status todo - } - } - - if (ret != OK) - { - //recreate the full event until cartridge is inserted or authentication - WHS_info.WHS_sensors.waste_tank_full_sensor = 1-WHS_info.WHS_sensors.waste_tank_full_sensor; - } - - // cant start a new Job - } - else - { - if (WHS_info.sttMachine == WHS_full) - { - WHS_info.sttMachine = WHS_emptying; - ReportWithPackageFilter(WasteFilter,"------------ WHS, WHS_emptying -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, WHS_info.WHS_sensors.waste_tank_full_sensor, 0); - // can start a new JOB - } - else - { - ReportWithPackageFilter(WasteFilter,"------------ WHS, WHS FULL sensor failed !!!!!!! -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, WHS_info.WHS_sensors.waste_tank_full_sensor, 0); - } - } - break; - - case WHS_cartridge_cover_sensor: - - if ( WHS_info.WHS_sensors.cartridge_cover == OPEN ) - { - ReportWithPackageFilter(WasteFilter,"------------ WHS, Cartridge cover open -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, WHS_info.WHS_sensors.cartridge_cover, 0);//popup message :"Cartridge cover open" //todo - if ( WHS_info.WHS_pump.status == OPEN) - { - CartridgeWasteFilling(OFF); - pump_on_flag = OPEN; - } - -// if (cart1.color != colorOFF) -// { -// -// } - - if ( !PowerOffInProcessGetState() ) - { - IFS_info.Cartridge_Ink_device_Id = AddControlCallback("Ink_Cartridge", WasteTankCBFunction, CartridgeInkCallBackTime , CartridgeInkCallBackFunction , 0,0,0 ); //eOneSecond - WHS_info.Cartridge_Waste1_device_Id = AddControlCallback("Waste1 Cartridge", WasteTankCBFunction, CartridgeWaste1CallBackTime, CartridgeWaste1CallBackFunction, 0,0,0 ); //eOneSecond - WHS_info.Cartridge_Waste2_device_Id = AddControlCallback("Waste2 Cartridge", WasteTankCBFunction, CartridgeWaste2CallBackTime, CartridgeWaste2CallBackFunction, 0,0,0 ); //eOneSecond - } - else - { - ReportWithPackageFilter(WasteFilter,"------------ WHS, Power down in process -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, WHS_info.WHS_sensors.cartridge_cover, 0);//popup message :"Cartridge cover open" //todo - } - - - - //if (WHS_info.WHS_pump == ON) - //{ - // SetWastePump(OFF); //pump OFF - //} - // prevent NEW Job - // Display "Close cartridge cover" - // pop up message in GUI - } - else // CLOSE - { - if (WHS_info.sttMachine == WHS_full) CartridgeWasteFilling(ON); - SetActiveWastCartridge(); - if (pump_on_flag == OPEN ) - { - WHS_info.WHS_sensors.waste_tank_full_sensor = SENSORnotFULL; // todo - CartridgeWasteFilling(OPEN); - pump_on_flag = CLOSE; - } - IFS_info.Cartridge_Ink_device_Id = RemoveControlCallback(IFS_info.Cartridge_Ink_device_Id , WasteTankCBFunction ); - WHS_info.Cartridge_Waste1_device_Id = RemoveControlCallback(WHS_info.Cartridge_Waste1_device_Id, WasteTankCBFunction ); - WHS_info.Cartridge_Waste2_device_Id = RemoveControlCallback(WHS_info.Cartridge_Waste2_device_Id, WasteTankCBFunction ); - if ( IFS_info.INK_isOK_flag ) - { - IFS_info.INK_isOK_flag = false;//0 - ReportWithPackageFilter(WasteFilter,"------------ WHS, change INK cartridge status to color Used -------------", __FILE__, __LINE__, IFS_info.INK_isOK_flag, RpMessage, 0, 0); - // test the Mid-tank capacity is not at Nadav sequence - MidTank_Pressure = Get_MidTank_Pressure_Sensor(IFS_info.Ink.cart_color); - if ( MidTank_Pressure > MidTankEmptyLimit ) - { - ReportWithPackageFilter(WasteFilter,"------------ close door MidTank_Pressure > MidTankEmptyLimit -----------------", __FILE__,__LINE__,(int)(MidTankEmptyLimit*1000), RpMessage, (int)(MidTank_Pressure*1000), 0); - MidTankValvesAction(Cartridge_MidTank_OFF); - //Disable_MidTank_Pressure_Reading(IFS_info.Ink.cart_color); - ReportWithPackageFilter(WasteFilter,"------------ WHS, Mid-tank not empty -------------", __FILE__, __LINE__, 0, RpMessage, 0, 0); - break; - } - IFS_info.MidTank_capacity = MidTank_Pressure; - ReportWithPackageFilter(WasteFilter,"------------ Mid-tank filling in process -----------------", __FILE__,__LINE__,(int)(MidTankEmptyLimit*1000), RpMessage, (int)(MidTank_Pressure*1000), 0); - Pannel_Leds(CART_1, MODE_ON); - cart1.color = BLINK; - MidTankValvesAction(Cartridge_MidTank_ON); - //add timeout - IFS_TimeOutAlarm(false); - IFS_info.Ink.time_out = 1; - IFS_info.Cartridge_Ink_TimeOut_device_Id = AddControlCallback("Ink Cartridge TimeOut", WasteTankCBFunction, CartridgeInkTimeOutCallBackTime, CartridgeInkTimeOutCallBackFunction, 0,0,0 ); //eOneSecond - - -// //add callback for midtank status is full -// IFS_info.Cartridge_Ink_TimeOut_device_Id = AddControlCallback(NULL, WasteTankCBFunction, CartridgeInkTimeOutCallBackTime, CartridgeInkTimeOutCallBackFunction, 0,0,0 ); //eOneSecond -// Enable_MidTank_Pressure_Reading(IFS_info.Ink.cart_color); -// Read_MidTank_Pressure_Sensor(IFS_info.Ink.cart_color); -// if ( Get_MidTank_Pressure_Sensor(IFS_info.Ink.cart_color) > MidTank_Pressure_FULL ) -// { -// Disable_MidTank_Pressure_Reading(IFS_info.Ink.cart_color); -// REPORT_MSG(WHS_full," ------------ Mid-tank not empty ----------------- "); -// break; -// } - - } - } - break; - - case IFS_INK_presence_sensor: - if (IFS_info.IFS_Ink_precense_sensor == CarteidgePrecense) - { - // is power down in process?? //todo - if ( !PowerOffInProcessGetState() ) // not in power down process - { - Pannel_Leds(CART_1, MODE_ON); - cart1.color = colorON; - RdCartridgeParam(INK_cartridge); //todo - } - else - { - // print: "power down in process"; - ReportWithPackageFilter(WasteFilter,"------------ WHS, Power down in process -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, IFS_info.IFS_Ink_precense_sensor, 0); - } - } - else // Cartridge is out - { - IFS_info.INK_isOK_flag = false;//0 - Pannel_Leds(CART_1, MODE_OFF); - cart1.color = colorOFF; - if (IFS_info.Ink.time_out != 0) - { - MidTankValvesAction(Cartridge_MidTank_OFF); - IFS_info.Ink.time_out = 0; - IFS_info.Cartridge_Ink_TimeOut_device_Id = RemoveControlCallback(IFS_info.Cartridge_Ink_TimeOut_device_Id, WasteTankCBFunction ); - WHS_Set_IFS_Clearing_Suction(IFS_info.Ink.cart_color); - } - } - break; - - case IFS_INK_authentication_pass: - if (!ColorMatch()) - { - ReportWithPackageFilter(WasteFilter,"------------ WHS, cartridge color does not match -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, 0, 0); - Pannel_Leds(CART_1, MODE_ON); - cart1.color = BLINK; - break; - } -#warning The messege removed (close cartridge cover) - //REPORT_MSG(WHS_full," ------------ close cartridge cover ----------------- "); - IFS_info.INK_isOK_flag = true; // 1 - - break; - - case IFS_INK_authentication_fail: - break; - - - case WHS_waste1_presence_sensor : - if (WHS_info.WHS_sensors.waste_cartridge1_precense_sensor == CarteidgePrecense ) // waste cartridge 1 is inserted . - { - //SetCartridgeLED(waste_cartridge1, led_on); - Pannel_Leds(CART_2, MODE_ON); - cart2.color = colorON; - RdCartridgeParam(waste_cartridge1); -// SetActiveWastCartridge(); -// SetValveDirection(); - if ( CartridgeAuthentication(waste_cartridge1) == PASSED) // to define authentication - { - //WHS_info.cartridge_1.autheticate = PASSED; //='0' - //???WHS_info.WHS_valve = waste_cartridge1; // or we should do it only before pumping???? - AlarmHandlingSetAlarm( EVENT_TYPE__ALL_WASTE_CARTRIDGES_FULL, false); - } - else - { - //WHS_info.cartridge_1.autheticate = FAILED; //='1' - //SetCartridgeLED(waste_cartridge1, led_off); - Pannel_Leds(CART_2, MODE_OFF); - cart2.color = colorOFF; - } - } - else // waste cartridge 1 take out - { - Pannel_Leds(CART_2, MODE_OFF); - cart2.color = colorOFF; - WHS_info.cartridge_1.autheticate = FAILED; - WHS_Set_IFS_Clearing_Suction(NUM_OF_MIDTANKS); - } - //SetActiveWastCartridge(); - break; - case WHS_waste2_presence_sensor : - if (WHS_info.WHS_sensors.waste_cartridge2_precense_sensor == CarteidgePrecense ) // waste cartridge is inserted . - { - Pannel_Leds(CART_3, MODE_ON);//SetCartridgeLED(waste_cartridge2, led_on); - cart3.color = colorON; - RdCartridgeParam(waste_cartridge2); - if ( CartridgeAuthentication(waste_cartridge2) == PASSED) // to define authentication - { - //WHS_info.cartridge_2.autheticate = PASSED; //='0' - //???WHS_info.WHS_valve = waste_cartridge2; // or we should do it only before pumping???? - //???SetValveDirection(); // or we should do it only before pumping???? - AlarmHandlingSetAlarm( EVENT_TYPE__ALL_WASTE_CARTRIDGES_FULL, false); - } - else - { - //WHS_info.cartridge_2.autheticate = FAILED; //='1' - Pannel_Leds(CART_3, MODE_OFF);//SetCartridgeLED(waste_cartridge2, led_off); - cart3.color = colorON; - } - } - else // waste cartridge 2 take out - { - Pannel_Leds(CART_3, MODE_OFF); - cart3.color = colorOFF; - WHS_info.cartridge_2.autheticate = FAILED; - /* - if (WHS_info.cartridge_2.autheticate == PASSED) // or we should do it only before pumping???? - { - WHS_info.WHS_valve = waste_cartridge; - SetValveDirection(); - } - else - { - - } - RdCartridgeParam(waste_cartridge2); - WHS_info.WHS_valve = waste_cartridge1; - */ - } - WHS_Set_IFS_Clearing_Suction(NUM_OF_MIDTANKS); - //SetActiveWastCartridge(); - break; - - case WHS_Timeout: - ReportWithPackageFilter(WasteFilter,"------------ WHS, WHS_Timeout -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, 0, 0); - AlarmHandlingSetAlarm( EVENT_TYPE__WASTE_CONTAINER_EMPTYING_TIMEOUT, true); - CartridgeWasteFilling(OFF); - break; - -// case IFS_Timeout: -// REPORT_MSG(WHS_emptying," ------------ IFS_Timeout ----------------- "); -// // try again : -// // start timeout -// // close and open the correct valves -// REPORT_MSG(WHS_full," ------------ IFS_Timeout_Second_Time ----------------- "); -// MidTankValvesAction(Cartridge_MidTank_OFF); -// MidTankValvesAction(Cartridge_MidTank_ON); -// -// IFS_TimeOutAlarm(); -// -// break; - case IFS_Timeout_Second: -// Disable_MidTank_Pressure_Reading(IFS_info.Ink.cart_color); - IFS_info.Cartridge_Ink_TimeOut_device_Id = RemoveControlCallback(IFS_info.Cartridge_Ink_TimeOut_device_Id, WasteTankCBFunction ); - ReportWithPackageFilter(WasteFilter,"------------ WHS, Change cartridge status to Fail -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, 0, 0); - - MidTankValvesAction(Cartridge_MidTank_OFF); - cart1.color = fastBILNK; - ReportWithPackageFilter(WasteFilter,"------------ Display Mid-tank # filling fail -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, 0, 0); - ReportWithPackageFilter(WasteFilter,"------------ call customer support -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, 0, 0); - Pannel_Leds(CART_1, MODE_ON); - cart1.color = fastBILNK; - IFS_TimeOutAlarm(true); - break; - - case IFS_MidTankFull: -// Disable_MidTank_Pressure_Reading(IFS_info.Ink.cart_color); - IFS_info.Cartridge_Ink_TimeOut_device_Id = RemoveControlCallback(IFS_info.Cartridge_Ink_TimeOut_device_Id, WasteTankCBFunction ); - ReportWithPackageFilter(WasteFilter,"------------ Change cartridge status to Waste Empty -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, 0, 0); - Pannel_Leds(CART_1, MODE_OFF); - cart1.color = colorOFF; - MidTankValvesAction(Cartridge_MidTank_OFF); - ReportWithPackageFilter(WasteFilter,"------------ Display Mid-tank # filling done -------------", __FILE__, __LINE__, WHS_info.sttMachine, RpMessage, 0, 0); - break; - - - - case WHS_no_event: - break; - default: //error state - break; - } - WHS_info.event = WHS_no_event; - return ret; -} - - - - -/*------------------------------- Cartridge Cover -----------------------------------------*/ - -bool RdCartridgeCoverSensor() -{ - - //REPORT_MSG(parameter," ------------ RD Cartridge Cover Sensor ----------------- "); - bool ret = notOK; - //WHS_Read_GPI_Registers(); - // WHS_info.WHS_sensors.cartridge_cover = Get_COVER_1_State(CartridgesDoor); - // ret = WHS_info.WHS_sensors.cartridge_cover; - ret = Get_COVER_1_State(CartridgesDoor); - if ((ret == OPEN ) && (ret != WHS_info.WHS_sensors.cartridge_cover)) - { - ReportWithPackageFilter(WasteFilter,"------------ RD Cartridge Cover Sensor is = OPEN(1) -------------", __FILE__, __LINE__, ret, RpMessage, 0, 0); - } - if ((ret == CLOSE ) && (ret != WHS_info.WHS_sensors.cartridge_cover)) - { - ReportWithPackageFilter(WasteFilter,"------------ RD Cartridge Cover Sensor is = CLOSE(0) -------------", __FILE__, __LINE__, ret, RpMessage, 0, 0); - } - return ret; -} - - - - -WHS_sensor CartridgeCoverCallBackFunction() -{ - WHS_sensor ret = WHS_no_event; - //ret = RdCartridgeCoverSensor(); - if ( WHS_info.WHS_sensors.cartridge_cover != RdCartridgeCoverSensor() ) - { - WHS_info.event = WHS_cartridge_cover_sensor; - WHS_info.WHS_sensors.cartridge_cover = !WHS_info.WHS_sensors.cartridge_cover; - ReportWithPackageFilter(WasteFilter,"------------ find : WHS_cartridge_cover_sensor event -------------", __FILE__, __LINE__, WHS_info.WHS_sensors.cartridge_cover, RpMessage, 0, 0); - ret = WHS_cartridge_cover_sensor; //todo - } - else if (( IFS_info.INK_isOK_flag ) && ( WHS_info.WHS_sensors.cartridge_cover == WHS_CartridgeCoverOPEN))// for Mid-tank filling - { - ReportWithPackageFilter(WasteFilter,"------------ Mid-tank Filling : Close cartridge cover -------------", __FILE__, __LINE__, WHS_info.WHS_sensors.cartridge_cover, RpMessage, 0, 0); - } - /*else if(WHS_info.WHS_sensors.cartridge_cover == WHS_CartridgeCoverOPEN) - { - REPORT_MSG(parameter," ------------ Mid-tank Filling : Cartridge door open ----------------- "); - }*/ - return ret; -} - - - -//WHS_sensor CartridgeInkTimeOutCallBackFunction() -//{ -// WHS_sensor ret = WHS_no_event; -//// uint32_t time_out_second = 0 ; -// -// if (WHS_info.Ink.time_out) WHS_info.Ink.time_out += 1; -// Read_MidTank_Pressure_Sensor(WHS_info.Ink.cart_color); -// if (Get_MidTank_Pressure_Sensor(WHS_info.Ink.cart_color) >= WHS_info.MidTank_capacity + CARTRIDGE_CAPATICY) -// { -// WHS_info.Ink.time_out = 0; -// WHS_info.event = IFS_MidTankFull; -// return IFS_MidTankFull; -// } -// if (WHS_info.Ink.time_out == CARTRIDGE_INK_TIMEOUT) -// { -// //WHS_info.Ink.time_out = 0; -// //return WHS_info.event = IFS_Timeout; -// -// REPORT_MSG(WHS_emptying," ------------ IFS_Timeout ----------------- "); -// // try again : -// // start timeout -// // close and open the correct valves -// REPORT_MSG(WHS_full," ------------ IFS_Timeout_Second_Time ----------------- "); -// MidTankValvesAction(Cartridge_MidTank_OFF); -// } -// -// if (WHS_info.Ink.time_out == (CARTRIDGE_INK_TIMEOUT+1)) //need to open the valve for second chance -// { -// MidTankValvesAction(Cartridge_MidTank_ON); -// } -// -// if (WHS_info.Ink.time_out == CARTRIDGE_INK_TIMEOUTx2) -// { -// WHS_info.Ink.time_out = 0; -// WHS_info.event = IFS_Timeout_Second; -// return IFS_Timeout_Second; -// } -// return ret; -//} - - - -//WHS_sensor CartridgeInkCallBackFunction() -//{ -// uint32_t parameter = 6 ; -// -// WHS_sensor ret = WHS_no_event; -// if (WHS_info.WHS_sensors.IFS_Ink_precense_sensor != RdInkCartridgeSensor()) -// { -// REPORT_MSG(parameter," ------------ find : IFS_Ink_presence_sensor event ----------------- "); -// WHS_info.event = IFS_INK_presence_sensor; -// WHS_info.WHS_sensors.IFS_Ink_precense_sensor = !WHS_info.WHS_sensors.IFS_Ink_precense_sensor; -// ret = IFS_INK_presence_sensor; -// } -// return ret; -//} - - - -WHS_sensor CartridgeWaste1CallBackFunction() -{ - WHS_sensor ret = WHS_no_event; - //ret = RdCartridgeCoverSensor(); - if (WHS_info.WHS_sensors.waste_cartridge1_precense_sensor != RdWasteCartridge1Sensor()) - { - WHS_info.event = WHS_waste1_presence_sensor; - WHS_info.WHS_sensors.waste_cartridge1_precense_sensor = !WHS_info.WHS_sensors.waste_cartridge1_precense_sensor; - ReportWithPackageFilter(WasteFilter,"------------ find : WHS_waste1_presence_sensor event -------------", __FILE__, __LINE__, WHS_info.WHS_sensors.waste_cartridge1_precense_sensor, RpMessage, 0, 0); - ret = WHS_waste1_presence_sensor; - } - return ret; -} - -WHS_sensor CartridgeWaste2CallBackFunction() -{ - WHS_sensor ret = WHS_no_event; - - if (WHS_info.WHS_sensors.waste_cartridge2_precense_sensor != RdWasteCartridge2Sensor()) - { - WHS_info.event = WHS_waste2_presence_sensor; - WHS_info.WHS_sensors.waste_cartridge2_precense_sensor = !WHS_info.WHS_sensors.waste_cartridge2_precense_sensor; - ReportWithPackageFilter(WasteFilter,"------------ find : WHS_waste2_presence_sensor event -------------", __FILE__, __LINE__, WHS_info.WHS_sensors.waste_cartridge2_precense_sensor, RpMessage, 0, 0); - ret = WHS_waste2_presence_sensor; - } - return ret; -} - -/*------------------------------- Waste Cartridge + IFS Cartridge -----------------------------------------*/ -bool InitCartStatus() -{ - WHS_info.WHS_sensors.cartridge_cover = RdCartridgeCoverSensor(); - - /* INK => CART_1 */ - ReportWithPackageFilter(WasteFilter,"------------------------------------------------------------------------------------------", __FILE__,__LINE__,0, RpMessage, 0, 0); - ReportWithPackageFilter(WasteFilter,"------------ !!!!!!! at INIT what to do if IFS_INK is presence !!!!!!! -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); - ReportWithPackageFilter(WasteFilter,"------------------------------------------------------------------------------------------", __FILE__,__LINE__,0, RpMessage, 0, 0); - - if (RdInkCartridgeSensor()) - { - IFS_info.IFS_Ink_precense_sensor = CarteidgePrecense; - ReportWithPackageFilter(WasteFilter,"------------ INIT : IFS_INK is presence -----------------", __FILE__,__LINE__, IFS_info.IFS_Ink_precense_sensor, RpMessage, 0, 0); - Pannel_Leds( CART_1, MODE_ON); - cart1.color = colorON; - } - else - { - IFS_info.IFS_Ink_precense_sensor = CarteidgeNotPrecense; - ReportWithPackageFilter(WasteFilter,"------------ INIT : IFS_INK is NOT presence -----------------", __FILE__,__LINE__, IFS_info.IFS_Ink_precense_sensor, RpMessage, 0, 0); - Pannel_Leds( CART_1, MODE_OFF); - cart1.color = colorOFF; - } - - /* waste_cartridge1 => CART_2 */ - if (RdWasteCartridge1Sensor()) - { - WHS_info.WHS_sensors.waste_cartridge1_precense_sensor = CarteidgePrecense; - ReportWithPackageFilter(WasteFilter,"------------ INIT : WHS_waste1 cart is presence -----------------", __FILE__,__LINE__, WHS_info.WHS_sensors.waste_cartridge1_precense_sensor, RpMessage, 0, 0); - Pannel_Leds( CART_2, MODE_ON); - cart2.color = colorON; - } - else - { - WHS_info.WHS_sensors.waste_cartridge1_precense_sensor = CarteidgeNotPrecense; - ReportWithPackageFilter(WasteFilter,"------------ INIT : WHS_waste1 cart is NOT presence !!! -----------------", __FILE__,__LINE__,WHS_info.WHS_sensors.waste_cartridge1_precense_sensor, RpMessage, 0, 0); - Pannel_Leds( CART_2, MODE_OFF); - cart2.color = colorOFF; - } - - /* waste_cartridge2 => CART_3 */ - if (RdWasteCartridge2Sensor()) - { - WHS_info.WHS_sensors.waste_cartridge2_precense_sensor = CarteidgePrecense; - ReportWithPackageFilter(WasteFilter,"------------ INIT : WHS_waste2 cart is presence -----------------", __FILE__,__LINE__, WHS_info.WHS_sensors.waste_cartridge2_precense_sensor, RpMessage, 0, 0); - Pannel_Leds( CART_3, MODE_ON); - cart3.color = colorON; - } - else - { - WHS_info.WHS_sensors.waste_cartridge2_precense_sensor = CarteidgeNotPrecense; - ReportWithPackageFilter(WasteFilter,"------------ INIT : WHS_waste2 cart is NOT presence_sensor !!! -----------------", __FILE__,__LINE__, WHS_info.WHS_sensors.waste_cartridge2_precense_sensor, RpMessage, 0, 0); - Pannel_Leds( CART_3, MODE_OFF); - cart3.color = colorOFF; - } - - if (IFS_info.IFS_Ink_precense_sensor == CarteidgePrecense) CartridgeAuthentication(INK_cartridge); - if (WHS_info.WHS_sensors.waste_cartridge1_precense_sensor == CarteidgePrecense) CartridgeAuthentication(waste_cartridge1); - if (WHS_info.WHS_sensors.waste_cartridge2_precense_sensor == CarteidgePrecense) CartridgeAuthentication(waste_cartridge2); - SetActiveWastCartridge(); - - if (WHS_info.WHS_sensors.cartridge_cover == WHS_CartridgeCoverOPEN) - { - ReportWithPackageFilter(WasteFilter,"------------ WHS_CartridgeCoverOPEN : add callback for cart1 and cart 2 -----------------", __FILE__,__LINE__, WHS_info.WHS_sensors.cartridge_cover, RpMessage, 0, 0); - IFS_info.Cartridge_Ink_device_Id = AddControlCallback("Ink Cartridge CB" , WasteTankCBFunction, eOneSecond, CartridgeInkCallBackFunction , 0,0,0 ); - WHS_info.Cartridge_Waste1_device_Id = AddControlCallback("Waste1 Cartridge CB", WasteTankCBFunction, eOneSecond, CartridgeWaste1CallBackFunction, 0,0,0 ); - WHS_info.Cartridge_Waste2_device_Id = AddControlCallback("Waste2 Cartridge CB", WasteTankCBFunction, eOneSecond, CartridgeWaste2CallBackFunction, 0,0,0 ); - } - WHS_info.Cartridge_Cover_device_Id = AddControlCallback("Cartridge Cover Door", WasteTankCBFunction, eOneSecond, CartridgeCoverCallBackFunction, 0,0,0 ); - - return OK; -} - -bool RdInkCartridgeSensor() -{ - bool ret = notOK; - //WHS_Read_GPI_Registers(); - ret = Is_Cartridge_Present(CART_1); - return ret; -} - -bool RdWasteCartridge1Sensor() -{ - bool ret = notOK; - //WHS_Read_GPI_Registers(); - ret = Is_Cartridge_Present(CART_2); - return ret; -} - -bool RdWasteCartridge2Sensor() -{ - bool ret = notOK; - //WHS_Read_GPI_Registers(); - ret = Is_Cartridge_Present(CART_3); - return ret; -} - -bool SetActiveWastCartridge() -{ - bool ret = notOK; - - if (( WHS_info.WHS_sensors.waste_cartridge1_precense_sensor == PRECENSE ) - && (WHS_info.cartridge_1.autheticate == PASSED) - && (WHS_info.cartridge_1.status == WasteEmpty)) - { - WHS_info.active_cartridge = waste_cartridge1; - ReportWithPackageFilter(WasteFilter,"------------ WHS : active_cartridge = waste_cartridge 1 -----------------", __FILE__,__LINE__, WHS_info.active_cartridge, RpMessage, 0, 0); - AlarmHandlingSetAlarm( EVENT_TYPE__NO_WASTE_CARTRIDGE_AVAILABLE, false); - } - else if (( WHS_info.WHS_sensors.waste_cartridge2_precense_sensor == PRECENSE) - && (WHS_info.cartridge_2.autheticate == PASSED) - && (WHS_info.cartridge_2.status == WasteEmpty)) - { - WHS_info.active_cartridge = waste_cartridge2; - ReportWithPackageFilter(WasteFilter,"------------ WHS : active_cartridge = waste_cartridge 2 -----------------", __FILE__,__LINE__, WHS_info.active_cartridge, RpMessage, 0, 0); - AlarmHandlingSetAlarm( EVENT_TYPE__NO_WASTE_CARTRIDGE_AVAILABLE, false); - } - else - { - WHS_info.active_cartridge = no_waste_cartridge; - ReportWithPackageFilter(WasteFilter,"------------ WHS : NO active_cartridge -----------------", __FILE__,__LINE__, WHS_info.active_cartridge, RpMessage, 0, 0); - AlarmHandlingSetAlarm( EVENT_TYPE__NO_WASTE_CARTRIDGE_AVAILABLE, true); - } - return ret; - -} - - - -/*------------------------------------------------------------------------------------------------*/ - - - -U8 WHS_init(void) -{ - SetWastePump(CLOSE); - WHS_info.WHS_valve = VALVE_DIR_WASTE_CARTRIDGE1; - if (WHS_Type == WHS_TYPE_UNKNOWN) - Valve_Set(VALVE_WASTE_TANK, WHS_info.WHS_valve); - else //new WHS - Trigger_SetWHSValveWatseCartridge(WHS_info.WHS_valve); - //Valve_Set(VALVE_WASTE_TANK, VALVE_DIR_WASTE_CARTRIDGE1); - InitCartStatus(); - initWHS_WasteTank(); - - if (Is_PP_Machine()) - { - MidTankEmptyLimit = MidTank_PP_Pressure_EMPTY; - } - else - { - MidTankEmptyLimit = MidTank_Pressure_EMPTY; - } - - return 0; -} - - -//void midtanktest6_ON(void) -//{ -// Valve_Set( VALVE_2W_CART_MID_1, Cartridge_MidTank_ON); -// Valve_Set( VALVE_2W_MID_AIR_1 , Cartridge_MidTank_ON); -//} -// -//void midtanktest6_OFF(void) -//{ -// Valve_Set( VALVE_2W_CART_MID_1, Cartridge_MidTank_OFF); -// Valve_Set( VALVE_2W_MID_AIR_1 , Cartridge_MidTank_OFF); -//} - - - - - - - - - - - -/*---------------------------------- HW Test --------------------------------------------------------------*/ - - - -bool RdWasteTankFilterSensor() -{ - bool ret = notOK; - //WHS_Read_GPI_Registers(); - WHS_info.WHS_sensors.waste_tank_filter_sensor = WHS_GPI_SW_FILTER_PRES(); - ret = WHS_info.WHS_sensors.waste_tank_filter_sensor; - return ret; -} - - -U8 RdCartridgeDoor() -{ - bool ret = notOK; - ret = RdCartridgeCoverSensor(); - return ret; -} -U8 RdWaste1() -{ - bool ret = notOK; - ret = RdWasteCartridge1Sensor(); - return ret; -} -U8 RdWaste2() -{ - bool ret = notOK; - ret = RdWasteCartridge2Sensor(); - return ret; -} -U8 SetValve(bool value) -{ - bool ret = OK; - WHS_info.WHS_valve = value; - if (WHS_Type == WHS_TYPE_UNKNOWN) - Valve_Set(VALVE_WASTE_TANK, WHS_info.WHS_valve); - else //new WHS - Trigger_SetWHSValveWatseCartridge(WHS_info.WHS_valve); - return ret; -} - -U8 SetPump(bool value) -{ - bool ret = notOK; - ret = SetWastePump(value); - return ret; -} - -U8 RdFilter() -{ - bool ret = notOK; - ret = RdWasteTankFilterSensor(); - return ret; -} -U8 RdEmpty() -{ - bool ret = notOK; - ret = RdWasteTankEmptySensor(); - return ret; -} -U8 RdFull() -{ - bool ret = notOK; - ret = RdWasteTankFullSensor(); - return ret; -} -U8 RdOverFlow() -{ - bool ret = notOK; - RdWasteTankOverFlowSensor(); - return ret; -} - - - -U8 WHS_HW_test() -{ - bool ret = notOK; -/* ret = RdCartridgeDoor(); - while (ret == RdCartridgeDoor()); -*/ -/* --- connect JO271 cable ---*/ - ret = RdWaste1(); - while (ret == RdWaste1());// blue = waste1 - ret = RdWaste2(); - while (ret == RdWaste2());// yellow = waste2 - - /* --- connect JO71 JO72 JO121 cable ---*/ - - ret = SetValve(1); //red LED On - ret = SetValve(0); //red LED Off - - - ret = SetPump(1); // led green (backplan) On - ret = SetPump(0); // led green (backplan) Off - - ret = RdFilter(); - while (ret == RdFilter()); - ret = RdEmpty(); - while (ret == RdEmpty()); - ret = RdFull(); - while (ret == RdFull()); -// ret = RdOverFlow(); -// while (ret == RdOverFlow()); - return ret; -} - -#endif -/*------------------------------------------------------------------------------------------------*/ - - - - diff --git a/Software/Embedded_SW/Embedded/Modules/Waste/newWHS_init.c b/Software/Embedded_SW/Embedded/Modules/Waste/newWHS_init.c index c8169ebef..3a84a1bbd 100644 --- a/Software/Embedded_SW/Embedded/Modules/Waste/newWHS_init.c +++ b/Software/Embedded_SW/Embedded/Modules/Waste/newWHS_init.c @@ -148,3 +148,4 @@ bool WHS_I2C_EEprom_Write_Ch_shai_taest() // status |= I2C_Read(I2C_ID_WHS_CARD, I2CEEPROM_ADDRESS + 1, WHS_Read_Buf, 7); return status; } + diff --git a/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c b/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c index f6d825c20..45f80f913 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c @@ -27,7 +27,6 @@ #include "modules/heaters/heaters_ex.h" #include "modules/Diagnostics/Diagnostics.h" #include "Modules/General/process.h" -#include "Modules/Waste/Waste.h" #include "modules/General/process.h" #include "StateMachines/Printing/PrintingSTM.h" diff --git a/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.c b/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.c index 4577a7c55..15f363b9a 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.c @@ -15,7 +15,6 @@ #include "modules/General/GeneralHardware.h" #include "modules/General/Safety.h" #include "modules/thread/thread.h" -#include "modules/waste/waste.h" #include "modules/ids/ids.h" #include "modules/control/control.h" #include "modules/AlarmHandling/AlarmHandling.h" -- cgit v1.3.1 From 392851874232580303301b9c5a6a6e5096b0a18a Mon Sep 17 00:00:00 2001 From: Avi Levkovich Date: Tue, 1 Sep 2020 16:10:55 +0300 Subject: update Head's fans stubs --- .../Embedded/Modules/Stubs_Handler/Progress.c | 26 ++++++++++++++++------ 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c index 7ff0a9364..7295084e3 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c @@ -809,21 +809,32 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) { //Head_Fan_PWM_Command[0] = (request->delay & 0xFF) ; //Test_Head_fan_Click(); - - Trigger_Head_Fan_Control(HEAD_FAN_RIGHT, request->delay & 0xFF); - Task_sleep(2000); + if(request->delay <= 0xFF) + { + Trigger_Head_Fan_Control(HEAD_FAN_RIGHT, request->delay & 0xFF); + response.progress = 7864320/Head_Fan_Tach[0]; + } + else + { + response.progress = 7864320/Head_Fan_Tach[0]; + } //response.progress = Fan_Click_Info.Product_ID; - response.progress = Head_Fan_Tach[0]; response.has_progress = true; } else if((request->amount == 0xFAC1) /*&& (request->delay == 0xFAC)*/) //Head Fan control { - Trigger_Head_Fan_Control(HEAD_FAN_LEFT, request->delay & 0xFF); - Task_sleep(2000); - response.progress = Head_Fan_Tach[1]; + if(request->delay <= 0xFF) + { + Trigger_Head_Fan_Control(HEAD_FAN_LEFT, request->delay & 0xFF); + response.progress = 7864320/Head_Fan_Tach[1]; + } + else + { + response.progress = 7864320/Head_Fan_Tach[1]; + } response.has_progress = true; } else @@ -836,6 +847,7 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) if(request->delay <= 0xFF) { Trigger_SetWHSFanSpeed(((request->amount & 0x0000000F)-2) , request->delay & 0x000000FF); + fan_tacho = WHS_Fan_Tach_RPM[(request->amount & 0x0000000F)-2]; } else { -- cgit v1.3.1 From b2977e51824febd45cfb7d33e8c4c8aa6514666c Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Wed, 2 Sep 2020 10:34:05 +0300 Subject: version 1.4.6.44 p1 IDS pre-run and remove integral on thread loading feeder control --- .../Embedded_SW/Embedded/Common/SW_Info/SW_Info.c | 2 +- Software/Embedded_SW/Embedded/Modules/IDS/IDS.h | 4 + .../Embedded_SW/Embedded/Modules/IDS/IDS_maint.c | 10 +- .../Embedded_SW/Embedded/Modules/IDS/IDS_print.c | 103 +++++++++++---------- .../Embedded/Modules/Thread/ThreadLoad.c | 2 +- .../stubs/embeddedparametersbuild_w_cleaning.cs | 4 +- 6 files changed, 69 insertions(+), 56 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c b/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c index 64002276c..bf2c4e98d 100644 --- a/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c +++ b/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c @@ -20,7 +20,7 @@ typedef struct } TangoVersion_t; -TangoVersion_t _gTangoVersion = {1,4,6,43}; +TangoVersion_t _gTangoVersion = {1,4,6,44}; #define BUILD_DATE __DATE__ char Dat[50] = BUILD_DATE; char _gTangoName [MAX_STRING_LEN] = "Tango01 ";//e diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h b/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h index ee308ce62..1c17c4f6b 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h @@ -13,6 +13,10 @@ extern double DispenserPreparePressure ; extern uint32_t DispenserPrepareTimeout ; extern uint32_t DispenserPrepareTimeLag ; extern uint32_t InitialDispenserSpeed; +extern double InitialDispenserPressure; +extern uint32_t InitialDispenserTimeout; + + extern uint32_t DispenserIdToMotorId[MAX_SYSTEM_DISPENSERS]; extern float DispenserPressure[MAX_SYSTEM_DISPENSERS]; diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c index 663a6713f..79418a8d8 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c @@ -72,8 +72,8 @@ bool PrimingActive[MAX_SYSTEM_DISPENSERS] = {false,false,false,false,false,false uint32_t DispenserHomingControlId[MAX_SYSTEM_DISPENSERS] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; uint32_t DispenserBacklashControlId[MAX_SYSTEM_DISPENSERS] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; uint32_t DispenserHomingTime[MAX_SYSTEM_DISPENSERS] = {0,0,0,0,0,0,0,0}; -#define INITIAL_DISPENSER_PRESSURE 2.10 -#define INITIAL_DISPENSER_TIMEOUT_LIMIT 60000 +#define INITIAL_DISPENSER_PRESSURE 3.85 +#define INITIAL_DISPENSER_TIMEOUT_LIMIT 120000 #define INITIAL_DISPENSER_TIMEOUT 100 #define INITIAL_DISPENSER_SPEED 1000 @@ -105,8 +105,10 @@ void IDS_Dispenser_SetAutoHoming_Config(AutoHoming_Config_enum Config) void IDS_Dispenser_SetBackLashValues(double initialdispenserpressure, uint32_t initialdispensertimeout, uint32_t initialdispensertimelag, uint32_t initialdispenserspeed) { - InitialDispenserPressure = initialdispenserpressure; - InitialDispenserTimeout = initialdispensertimeout; + if (initialdispenserpressure>2) + InitialDispenserPressure = initialdispenserpressure; + if (initialdispensertimeout>70000) + InitialDispenserTimeout = initialdispensertimeout; InitialDispenserTimeLag = initialdispensertimelag; InitialDispenserSpeed = initialdispenserspeed; diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c index b15f70267..327d80eb1 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c @@ -514,6 +514,37 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) char IdMessage[100]; int SegmentPrepareWFCFCounter = 0; bool pressureReady = false,endOfPrepareWCF = false; + +bool AdjustDispenserSpeedToPressure(int DispenserId, double RefMaxPressure,double pressure) +{ + TimerMotors_t HW_Motor_Id = DispenserIdToMotorId[DispenserId]; + float updatedSpeed,tempSpeed; + + if (pressure > RefMaxPressure*1.03) + { + tempSpeed = CurrentDispenserSpeed[DispenserId]; + //updatedSpeed = (tempSpeed * 0.992 > 100) ? tempSpeed * 0.992 : 100; + updatedSpeed = tempSpeed*0.98; + MotorSetSpeed(HW_Motor_Id, updatedSpeed); + CurrentDispenserSpeed[DispenserId] = updatedSpeed; + ReportWithPackageFilter(IDSFilter,"IDS decrease speed",__FILE__,DispenserId,(int)updatedSpeed,RpWarning,(int)(pressure*100),0); + //return true; //ready + } + else if (pressure < RefMaxPressure*0.97) + { + tempSpeed = CurrentDispenserSpeed[DispenserId]; + if (tempSpeed<50) tempSpeed = 50; + updatedSpeed = (tempSpeed * 1.02 < InitialDispenserSpeed) ? tempSpeed * 1.02 : InitialDispenserSpeed; + MotorSetSpeed(HW_Motor_Id, updatedSpeed); + CurrentDispenserSpeed[DispenserId] = updatedSpeed; + ReportWithPackageFilter(IDSFilter,"IDS increase speed",__FILE__,DispenserId,(int)updatedSpeed,RpWarning,(int)(pressure*100),0); + //return false; //not ready + } + if ((pressure>RefMaxPressure)&&(pressure<(RefMaxPressure+0.1))) + return true; + return false; +} + //******************************************************************************************************************** uint32_t IDS_Prepare_Callback(uint32_t DispenserId, uint32_t ReadValue) { @@ -525,6 +556,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) //set the speed only before the first segment, speed is constant accros job int Dispenser_i,n_dispensers; double segmentfirst_speed; + double pressure; //REPORT_MSG((int)DispenserPrepareControlId, "Prepare Callback"); @@ -532,75 +564,50 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) if (pressureReady == false) { - if (Special_Dispensers == false) + if (DispenserBuildTimeCounter<(2*eOneSecond)) { - if (DispenserBuildTimeCounter<(2*eOneSecond)) + for (i = 0; i < MAX_DYE_DISPENSERS; i++) { - for (i = 0; i < MAX_DYE_DISPENSERS; i++) - { - DispenserTotalPrepareSteps[i]+=(CurrentDispenserSpeed[i]*PRESSURE_READ_TIME_GAP/eOneSecond); - DispenserLastMovementDown[i] = false; - } - //REPORT_MSG(DispenserBuildTimeCounter,"waiting 2 seconds for pressure changes"); - return OK; + DispenserTotalPrepareSteps[i]+=(CurrentDispenserSpeed[i]*PRESSURE_READ_TIME_GAP/eOneSecond); + DispenserLastMovementDown[i] = false; } + //REPORT_MSG(DispenserBuildTimeCounter,"waiting 2 seconds for pressure changes"); + return OK; } for (i = 0; i < MAX_DYE_DISPENSERS; i++) { + pressure = GetDispenserPressure(i); //IDS_StopHomeDispenser(i); if (DispenserUsedInJob[i] == true) //we actually should check for all dispensers { DispenserTotalPrepareSteps[i]+=(CurrentDispenserSpeed[i]*PRESSURE_READ_TIME_GAP/eOneSecond); - HW_Motor_Id = DispenserIdToMotorId[i]; - if (GetDispenserPressure(i) > DispenserPreparePressure*1.05) +//#ifdef DISPENSER_UP_MOVEMENT + if (DispenserTotalPrepareSteps[i]120000) -#endif - { - NumofReadyDispensers++; - ReportWithPackageFilter(IDSFilter,"Dispenser total prepare steps ready",__FILE__,DispenserTotalPrepareSteps[i],(int)(DispenserPreparePressure*100),RpWarning,IDS_Dispenser_Data[i].consumedinnanolitter,0); - } - if (Special_Dispensers == true) - { - MotorStop(HW_Motor_Id, Hard_Hiz); - CurrentDispenserSpeed[i] = 0; - //ReportWithPackageFilter(IDSFilter,"IDS stopped ready",__FILE__,i,(int)(DispenserPreparePressure*100),RpWarning,(int)NumofReadyDispensers,0); - } - else - { - tempSpeed = CurrentDispenserSpeed[i]; - updatedSpeed = (tempSpeed*0.992>100)?tempSpeed*0.992:100; - MotorSetSpeed(HW_Motor_Id, updatedSpeed); - CurrentDispenserSpeed[i] = updatedSpeed; - //ReportWithPackageFilter(IDSFilter,"IDS reduce speed",__FILE__,i,(int)tempSpeed,RpWarning,(int)updatedSpeed,0); - } + AdjustDispenserSpeedToPressure(i,InitialDispenserPressure,pressure); + } + else if (pressure > DispenserPreparePressure*1.2) + { + MotorStop(HW_Motor_Id, Hard_Hiz); + CurrentDispenserSpeed[i] = 1; } else { - if (Special_Dispensers == true) - { - tempSpeed = (DispenserPreparePressure-GetDispenserPressure(i))*InitialDispenserSpeed; - if (tempSpeed<300) - tempSpeed = 300; - } - else - { - tempSpeed = CurrentDispenserSpeed[i]; - } - updatedSpeed = (tempSpeed*1.03 0.02) + pressure = GetDispenserPressure(CLEANER_DISPENSER); + if (pressure > 0.02) { HW_Motor_Id = DispenserIdToMotorId[CLEANER_DISPENSER]; MotorStop(HW_Motor_Id, Hard_Hiz); if (CurrentDispenserSpeed[CLEANER_DISPENSER]) - ReportWithPackageFilter(IDSFilter,"IDS stop cleaner",__FILE__,CLEANER_DISPENSER,(int)(GetDispenserPressure(CLEANER_DISPENSER)*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); + ReportWithPackageFilter(IDSFilter,"IDS stop cleaner",__FILE__,CLEANER_DISPENSER,(int)(pressure*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); CurrentDispenserSpeed[CLEANER_DISPENSER] = 0; } @@ -724,7 +731,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) HW_Motor_Id = DispenserIdToMotorId[CLEANER_DISPENSER]; MotorStop(HW_Motor_Id, Hard_Hiz); CurrentDispenserSpeed[CLEANER_DISPENSER] = 0; - ReportWithPackageFilter(IDSFilter,"IDS stop cleaner",__FILE__,CLEANER_DISPENSER,(int)(GetDispenserPressure(CLEANER_DISPENSER)*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); + ReportWithPackageFilter(IDSFilter,"IDS stop cleaner",__FILE__,CLEANER_DISPENSER,(int)(pressure*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); } SafeRemoveControlCallback(DispenserPrepareControlId, IDS_Prepare_Callback ); DispenserPrepareControlId = 0xFF; diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c index c478b82de..84cc5cf20 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c @@ -717,7 +717,7 @@ MotorControlConfig[FEEDER_MOTOR].m_params.MIN = MotorsControl[FEEDER_MOTOR].outputproportionalpowerlimit*-1; MotorControlConfig[FEEDER_MOTOR].m_params.Kd = MotorsControl[FEEDER_MOTOR].derivativetime; MotorControlConfig[FEEDER_MOTOR].m_params.Kp = MotorsControl[FEEDER_MOTOR].proportionalgain; - MotorControlConfig[FEEDER_MOTOR].m_params.Ki = MotorsControl[FEEDER_MOTOR].integraltime; + MotorControlConfig[FEEDER_MOTOR].m_params.Ki = 0;//MotorsControl[FEEDER_MOTOR].integraltime; MotorControlConfig[FEEDER_MOTOR].m_params.IntegralErrorMultiplier = MotorsControl[FEEDER_MOTOR].setpointramprateorsoftstartramp; MotorControlConfig[FEEDER_MOTOR].m_params.ProportionalErrorMultiplier = MotorsControl[FEEDER_MOTOR].outputonoffhysteresisvalue; MotorControlConfig[FEEDER_MOTOR].m_params.epsilon = MotorsControl[FEEDER_MOTOR].epsilon; diff --git a/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs b/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs index ee610b445..5b2cfdc0d 100644 --- a/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs +++ b/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs @@ -35,8 +35,8 @@ configurationParameters.CloseValveTimeout = 20; configurationParameters.OpenValveTimeout = 20; //backlash after filling - target pressure, timoeout, time staps (speed will be added in general parameters) -configurationParameters.InitialDispenserPressure = 0.25; -configurationParameters.InitialDispenserTimeout = 60000; //20 seconds +configurationParameters.InitialDispenserPressure = 3.85; //used for initial pre-run pressure +configurationParameters.InitialDispenserTimeout = 120000; ////used for initial pre-run number of steps configurationParameters.InitialDispenserTimeLag = 100; //job prepare - build pressure in dispensers - target pressure, timoeout, time staps, speed -- cgit v1.3.1 From bb8b2a7fac772ceb2a163aecb9c854f4fa9013c7 Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Wed, 2 Sep 2020 12:38:57 +0300 Subject: thread load: handle safety alarm on head cover better, prevent RTFU arm raising on final jog --- .../Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c index 84cc5cf20..eb422875f 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c @@ -346,14 +346,6 @@ //HARDWARE_MOTOR_TYPE__MOTO_DH_LID = 2, //HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID = 4, //DeActivateHeadMagnet(); - if (Head_Type != HEAD_TYPE_ARC) - { - CallbackCounter++; - if (MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_LID,1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_LID].directionthreadwize, 300, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_LID], Thread_Load_HomingCallback,20000)==ERROR) - { - Thread_Load_HomingCallback(HARDWARE_MOTOR_TYPE__MOTO_DH_LID,NO_LIMIT); - } - } CallbackCounter++; //MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID,1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID].directionthreadwize, 200, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID], Thread_Load_HomingCallback,10000); int direction; @@ -366,6 +358,14 @@ direction = DRIER_LID_OPEN; } MotorGotoWithCallback(HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID, direction, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID], Thread_Load_HomingCallback,10000); + if (Head_Type != HEAD_TYPE_ARC) + { + CallbackCounter++; + if (MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_LID,1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_LID].directionthreadwize, 300, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_LID], Thread_Load_HomingCallback,20000)==ERROR) + { + Thread_Load_HomingCallback(HARDWARE_MOTOR_TYPE__MOTO_DH_LID,NO_LIMIT); + } + } if (Head_Type == HEAD_TYPE_FLAT) { Report("Thread_Load_Lift_actuators",__FILE__,__LINE__,LOW,RpMessage,false,0); @@ -754,6 +754,7 @@ numberOfSteps-800, Thread_Load_Dryer_Loading_Callback, 10000); return OK; } + double keepfeedertension = 0; uint32_t Thread_Load_Jog_ThreadStop(uint32_t index, uint32_t ReadValue) { REPORT_MSG(LoadStages, "Thread Load State Machine step Thread_Load_Jog_ThreadStop"); @@ -761,6 +762,7 @@ LoadingControlId = 0xFF; ThreadAbortJoggingFunc(); LoadStages++; + ProcessParametersKeep.feedertension = keepfeedertension; ThreadLoadStateMachine(LoadStages); return OK; } @@ -768,6 +770,8 @@ //Jog Thread Shortly To Make Sure Spool Is Running. Report End Of Loading { REPORT_MSG(LoadStages, "Thread Load State Machine step Thread_Load_Jog_Thread"); + keepfeedertension = feedertension; + ProcessParametersKeep.feedertension = 0.0; ThreadJoggingFunc(20); LoadingControlId = AddControlCallback("Load jog",Thread_Load_Jog_ThreadStop, eOneSecond*25,Control_Read_Dancer_Position,(IfTypeThread*0x100+FEEDER_MOTOR),FEEDER_DANCER,FEEDER_MOTOR); return OK; -- cgit v1.3.1 From 665d43a1b557e61d94ef194cfb99ef1b4686b2e0 Mon Sep 17 00:00:00 2001 From: Ronen Sberlo Date: Wed, 2 Sep 2020 16:34:33 +0300 Subject: blower bug fix --- .../Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c index e6a01c560..56e71b345 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c @@ -1992,14 +1992,17 @@ uint32_t HeadBlowerPidFunc(double setParam,double measuredParam, int blowerId) HeadBlowerControl[blowerId].m_calculatedError = PIDAlgorithmCalculation((float)HeadBlowerControl[blowerId].m_SetParam , (float)HeadBlowerControl[blowerId].m_mesuredParam, &HeadBlowerControl[blowerId].m_params, &HeadBlowerControl[blowerId].m_preError, &HeadBlowerControl[blowerId].m_integral); calculatedPwm = HeadBlowersGetPWM(blowerId) + HeadBlowerControl[blowerId].m_calculatedError; - HeadBlowersCloseLoopTime[blowerId] = HeadBlowerControl[blowerId].m_params.dt; - Trigger_Head_Fan_Control(blowerId, calculatedPwm); - if (calculatedPwm < MIN_ALLOWED_PWM) + + if (calculatedPwm < MIN_ALLOWED_PWM) { HeadBlowerControl[blowerId].m_integral = 0; - if (calculatedPwm > MAX_ALLOWED_PWM) + calculatedPwm = MIN_ALLOWED_PWM; + } + if (calculatedPwm > MAX_ALLOWED_PWM) { HeadBlowerControl[blowerId].m_integral = 0; - + calculatedPwm = MAX_ALLOWED_PWM; + } + Trigger_Head_Fan_Control(blowerId, calculatedPwm); return OK; } -- cgit v1.3.1 From 7390afe73ac4844291632ae89b5ab1fbe7ab9271 Mon Sep 17 00:00:00 2001 From: Avi Levkovich Date: Wed, 2 Sep 2020 16:40:26 +0300 Subject: Change actuators logic on loading (move to Trigger_Head_Actuators_Control) --- .../Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.c | 6 +++--- Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.c index 33d888b14..6bde7ec11 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.c @@ -517,7 +517,7 @@ uint32_t HeadCard_ActControlCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag Global_Act_Cmd_flag++;//Sync the callback to the command //3sec delay - Timeout - ActControlId = AddControlCallback("ActuatorControl", HeadCard_ActuatorsCallBackFunction, (3* eOneSecond), TemplateDataReadCBFunction,Act_ID,0, 0 ); + ActControlId = AddControlCallback("ActuatorControl", HeadCard_ActuatorsCallBackFunction, (2* eOneSecond), TemplateDataReadCBFunction,Act_ID,0, 0 ); return status; } @@ -640,8 +640,8 @@ uint32_t HeadCard_Actuators_Stub(ACTUATORS Act_ID, bool Enable, bool Direction)/ } } - status |= Head_Write_IO_Reg(0x42,HIGH); - status |= Head_Write_IO_Reg(0x46,LOW_AND_HIGH); + //status |= Head_Write_IO_Reg(0x42,HIGH); + //status |= Head_Write_IO_Reg(0x46,LOW_AND_HIGH); return status; } diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c index c478b82de..e986c1756 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c @@ -370,7 +370,9 @@ { Report("Thread_Load_Lift_actuators",__FILE__,__LINE__,LOW,RpMessage,false,0); Trigger_Head_Actuators_Stub(ACTOT, ENABLE, UP); - Trigger_Head_Actuators_Stub(ACTIN, ENABLE, UP); + //Trigger_Head_Actuators_Stub(ACTIN, ENABLE, UP); + //Trigger_Head_Actuators_Control(ACTOT, LOW,true);//UP + Trigger_Head_Actuators_Control(ACTIN, LOW,true);//UP } return OK; } @@ -504,7 +506,10 @@ if (Head_Type == HEAD_TYPE_FLAT) { Report("Thread_Load_Close_actuators",__FILE__,__LINE__,LOW,RpMessage,true,0); - Trigger_Head_Actuators_Stub(ACTOT, ENABLE, DOWN); + + Trigger_Head_Actuators_Control(ACTIN, LOW,false);//DOWN + //Trigger_Head_Actuators_Stub(ACTOT, ENABLE, DOWN); + //Trigger_Head_Actuators_Stub(ACTIN, ENABLE, DOWN); HeadCard_Actuators_Relocate(); } -- cgit v1.3.1 From 09df687f1d804afab0e2515bd29df1152d619f9e Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Sun, 6 Sep 2020 00:16:07 +0300 Subject: extended tracing in dispenser 3 consumption. improvements in thread loading --- .../Embedded_SW/Embedded/Drivers/Motors/Motor.h | 2 + .../Embedded/Drivers/Motors/MotorActions.c | 78 +++++++++++++-- .../Embedded/Drivers/flash_ram/MCU_E2Prom.h | 1 + .../Modules/Diagnostics/DiagnosticsHoming.c | 31 +++++- .../Embedded/Modules/IDS/IDS_dispenser.c | 7 +- .../Embedded/Modules/Thread/ThreadLoad.c | 110 ++++++++++++++++----- 6 files changed, 189 insertions(+), 40 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.h b/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.h index fdfb99561..e6947a8d4 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.h +++ b/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.h @@ -305,6 +305,8 @@ typedef enum Soft_Hiz, }STOP_TYPE_ENUM; +extern int32_t AccumulatedArmMovement; + uint32_t MotorStop(TimerMotors_t _motorId, STOP_TYPE_ENUM StopType); uint32_t MotorMove(TimerMotors_t _motorId,bool direction, uint32_t Steps); diff --git a/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c b/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c index f500104f4..8c12b4ea3 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c +++ b/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c @@ -203,6 +203,9 @@ uint32_t MotorGotoWithBusyCallback (TimerMotors_t MotorId,bool direction, uint32 MotorControlCallback[MotorId] = MotorMoveCallBackFunction; return MotorControlId[MotorId]; } +int32_t AccumulatedArmMovement = 0; +int32_t InitialArmLocation = 0; +bool ArmDirection = true; uint32_t MotorMoveWithCallback (TimerMotors_t MotorId,bool direction, uint32_t Steps, callback_fptr callback,uint32_t timeout) //TODO { @@ -219,12 +222,18 @@ uint32_t MotorMoveWithCallback (TimerMotors_t MotorId,bool direction, uint32_t S //SetMotorSpeed (deviceId, parameter); MotorCallback[MotorId] = callback; MotorTimeout[MotorId] = 0; - MotorTimeLag[MotorId] = 20; + MotorTimeLag[MotorId] = 40; MotorTimeLimit[MotorId] = timeout; + if (MotorId ==HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM) + { + InitialArmLocation = Read_Dryer_ENC_Position(0,0); + AccumulatedArmMovement = 0; + ArmDirection = direction; + } //MotorStop(MotorId,Hard_Hiz ); MotorMove(MotorId,direction,Steps ); - MotorControlId[MotorId] = AddControlCallback(NULL, MotorMoveCallBackFunction, /*eTenMillisecond*/20, MotorControlGetnBusyState,(IfTypeMotors*0x100+MotorId), MotorId, 0 ); + MotorControlId[MotorId] = AddControlCallback(NULL, MotorMoveCallBackFunction, /*eTenMillisecond*/40, MotorControlGetnBusyState,(IfTypeMotors*0x100+MotorId), MotorId, 0 ); MotorControlCallback[MotorId] = MotorMoveCallBackFunction; return MotorControlId[MotorId]; } @@ -471,7 +480,7 @@ uint32_t MotorSetSpeedWithCallback (TimerMotors_t MotorId, uint32_t _freq, callb } uint32_t MotorMoveCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) //TODO { - uint32_t MotorId,encoder; + uint32_t MotorId,encoder,temp = 0,tt; uint32_t Busy = BusyFlag; if (IfIndex>>8 != IfTypeMotors) { @@ -483,14 +492,66 @@ uint32_t MotorMoveCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) //TODO CallbackCalls++; if (MotorId ==HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM) { - if (CallbackCalls%200 == 0) + encoder = Read_Dryer_ENC_Position(0,0); + tt=InitialArmLocation; + if (ArmDirection == 1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM].directionthreadwize) //unloading - numbers going down + { + //previous number is bigger than current + if (InitialArmLocation>encoder) + { + temp = InitialArmLocation-encoder; + if ((temp>25)&&(temp<1000)) + { + AccumulatedArmMovement+=temp; + InitialArmLocation=encoder; + } + } + else if (InitialArmLocation25)&&(temp<1000)) + { + AccumulatedArmMovement+=temp; + InitialArmLocation=encoder; + InitialArmLocation=encoder; + } + } + } + else //loading - going up + { + //previous number is smaller than current + if (InitialArmLocation25)&&(temp<1000)) + { + AccumulatedArmMovement+=temp; + InitialArmLocation=encoder; + } + } + else if (InitialArmLocation>encoder)//rollover + { + temp = 0x3FFF + encoder -InitialArmLocation; + if ((temp>25)&&(temp<1000)) + { + AccumulatedArmMovement+=temp; + InitialArmLocation=encoder; + } + } + } + /*if (temp>1000) + { + Report("MotorMoveCallBackFunction temp curr prev total",__FILE__,encoder,tt,RpWarning,temp,0); + }*/ + if (CallbackCalls%50 == 0) { - Read_Dryer_ENC_Position(); + //encoder = Read_Dryer_ENC_Position(0,0); + Report("MotorMoveCallBackFunction periodic curr prev total",__FILE__,encoder,temp,RpWarning,AccumulatedArmMovement,0); } - if (CallbackCalls%200 == 1) + if (CallbackCalls%200 == 0) { - encoder = Read_Dryer_ENC_Position(0,0); - Report("MotorMoveCallBackFunction",__FILE__,__LINE__,DrierZeroPosition,RpWarning,MotorId,0); + //encoder = Read_Dryer_ENC_Position(0,0); + Report("MotorMoveCallBackFunction",__FILE__,__LINE__,encoder,RpWarning,CallbackCalls,0); } } else @@ -520,6 +581,7 @@ uint32_t MotorMoveCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) //TODO Report("motor timeout",__FILE__,__LINE__,MotorId,RpMessage,MotorTimeout[MotorId],0); Busy = BUSY; } + Report("MotorMoveCallBackFunction curr prev total",__FILE__,encoder,temp,RpWarning,AccumulatedArmMovement,0); //call the module callback if (MotorCallback[MotorId]) { diff --git a/Software/Embedded_SW/Embedded/Drivers/flash_ram/MCU_E2Prom.h b/Software/Embedded_SW/Embedded/Drivers/flash_ram/MCU_E2Prom.h index 3691b41bd..bb171dda4 100644 --- a/Software/Embedded_SW/Embedded/Drivers/flash_ram/MCU_E2Prom.h +++ b/Software/Embedded_SW/Embedded/Drivers/flash_ram/MCU_E2Prom.h @@ -46,6 +46,7 @@ typedef enum { EEPROM_STORAGE_DANCER_4, EEPROM_PRESSURE_SENSOR_V0_0, EEPROM_PRESSURE_SENSOR_V0_1, + EEPROM_DRIER_LOADING_ARM_ANGLE, MAX_EEPROM_STORAGE }EEPROM_STORAGE_USAGE_ENUM; #define MAX_SERIAL_NUM_LEN 5 //5*4 bytes diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticsHoming.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticsHoming.c index 04e333459..b40bbe4c7 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticsHoming.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticsHoming.c @@ -462,6 +462,23 @@ uint32_t DispenserAbortHomingRequestFunc(MessageContainer* requestContainer) return OK; } +/******************************************************************************** + * Drier Loading Arm Homing + ********************************************************************************/ +uint32_t Drier_Center = 0; +float Calculate_Arm_Angle(uint32_t Current_Angle) +{ + uint32_t angle; + float Calc_angle; + if (Current_Angle >= Drier_Center) + angle = Current_Angle - Drier_Center; + else + angle = Current_Angle + 0x3FFF - Drier_Center; + Calc_angle = angle/0x3FFF; + MCU_E2PromProgram(EEPROM_DRIER_LOADING_ARM_ANGLE,Calc_angle); + ReportWithPackageFilter(DiagnosticsFilter,"Calculate_Arm_Angle",__FILE__,(int)(Calc_angle*1000),Current_Angle,RpMessage,Drier_Center,0); + return Calc_angle; +} uint32_t Diagnostics_Set_Load_Arm_To_Stopper_Callback(uint32_t deviceID, uint32_t BusyFlag) { MessageContainer responseContainer; @@ -490,7 +507,7 @@ uint32_t Diagnostics_Dryer_UnLoading_Callback(uint32_t MotorId, uint32_t ReadVal uint32_t temp = Read_Dryer_ENC_Position(); ReportWithPackageFilter(DiagnosticsFilter,"Diagnostics_Dryer_UnLoading_Callback",__FILE__,ReadValue,temp,RpMessage,D_DrierPrevLocation,0); //ReportWithPackageFilter(DiagnosticsFilter,"Diagnostics_Dryer_UnLoading_Callback details",__FILE__,(int)(TotalLoadedLen),D_numberOfCycles,RpMessage,CallbackCounter,0); - if ((abs (temp -D_DrierPrevLocation)>1000 )&&(ReadValue == NOTBUSY)) // OK - take another round + if ((AccumulatedArmMovement>8000 )&&(ReadValue == NOTBUSY)) // OK - take another round // if (ReadValue == NOTBUSY) // OK - take another round { D_DrierPrevLocation = temp; @@ -510,7 +527,7 @@ uint32_t Diagnostics_Dryer_UnLoading_Callback(uint32_t MotorId, uint32_t ReadVal } else //timeout or no movement { - ReportWithPackageFilter(DiagnosticsFilter,"Store Number of cycles in drier - halted",__FILE__,__LINE__,D_numberOfCycles,RpMessage,LoadArmRounds,0); + ReportWithPackageFilter(DiagnosticsFilter,"Unloading drier - halted",__FILE__,__LINE__,D_numberOfCycles,RpMessage,LoadArmRounds,0); MCU_E2PromProgram(EEPROM_STORAGE_DRYER_CYCLES,LoadArmRounds-(D_numberOfCycles-2));//it takes two cycles to identify a stop of the arm ReportWithPackageFilter(DiagnosticsFilter,"Drier unloading timeout(1) or no movement",__FILE__,temp,D_DrierPrevLocation,RpWarning,ReadValue,0); @@ -533,6 +550,7 @@ uint32_t Diagnostics_Dryer_UnLoading(void) MCU_E2PromRead(EEPROM_STORAGE_DRYER_CYCLES,&LoadArmRounds); MCU_E2PromRead(EEPROM_STORAGE_DRYER_CENTER,&temp); + Drier_Center = temp; D_DrierPrevLocation = temp; ReportWithPackageFilter(DiagnosticsFilter,"Diagnostics_Set_Load_Arm_To_Start_Position",__FILE__,__LINE__,D_DrierPrevLocation,RpMessage, LoadArmRounds,0); MotorSetMaxSpeed (HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM, MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM].pulseperround/6*MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM].pulleyradius); @@ -548,6 +566,7 @@ uint32_t Diagnostics_Dryer_MovetoEncoderPosition_Callback(uint32_t MotorId, uint MessageContainer responseContainer; MotorHomingResponse response = MOTOR_HOMING_RESPONSE__INIT; + ReportWithPackageFilter(DiagnosticsFilter,"Store angle of arm drier - ended",__FILE__,__LINE__,(int)(Calculate_Arm_Angle(ReadValue)*360),RpMessage,D_numberOfCycles,0); //ReportWithPackageFilter(DiagnosticsFilter,"Diagnostics_Dryer_MovetoEncoderPosition_Callback",__FILE__,__LINE__,0,RpMessage,CallbackCounter,0); MotorSetMaxSpeed (HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM, 200); responseContainer = createContainer(MESSAGE_TYPE__MotorHomingResponse, HomingToken[MotorId], true, &response, &motor_homing_response__pack, &motor_homing_response__get_packed_size); @@ -586,7 +605,8 @@ uint32_t Diagnostics_Dryer_Loading_Callback(uint32_t MotorId, uint32_t ReadValue } else { - ReportWithPackageFilter(DiagnosticsFilter,"Store Number of cycles in drier - halted",__FILE__,__LINE__,D_numberOfCycles,RpMessage,LoadArmRounds,0); + ReportWithPackageFilter(DiagnosticsFilter,"Loading drier - halted",__FILE__,__LINE__,D_numberOfCycles,RpMessage,LoadArmRounds,0); + ReportWithPackageFilter(DiagnosticsFilter,"Store angle of arm drier - halted",__FILE__,__LINE__,(int)(Calculate_Arm_Angle(ReadValue)*360),RpMessage,D_numberOfCycles,0); MotorSetMaxSpeed (HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM, 200); } return OK; @@ -594,9 +614,14 @@ uint32_t Diagnostics_Dryer_Loading_Callback(uint32_t MotorId, uint32_t ReadValue uint32_t Diagnostics_Dryer_Loading(void) { + //float Calc_angle; +#warning assuming loading starts from 0 if (dryerbufferlength) LoadArmRounds = (int)dryerbufferlength; MCU_E2PromRead(EEPROM_STORAGE_DRYER_CENTER,&D_DrierPrevLocation); + //MCU_E2PromProgram(EEPROM_DRIER_LOADING_ARM_ANGLE,Calc_angle); + //ReportWithPackageFilter(DiagnosticsFilter,"Diagnostics_Dryer_Loading request: current ",__FILE__,__LINE__,D_numberOfCycles,RpMessage,LoadArmRounds,0); + Drier_Center = D_DrierPrevLocation; D_numberOfCycles = 0; D_numberOfSteps = MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM].pulseperround/**LoadArmRounds*/*MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM].microstep*MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM].pulleyradius; diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c index 3c9e4ef05..b35259ad9 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c @@ -353,7 +353,10 @@ void IDS_Dispenser_Content_Calculation (char DispenserId) // IDS_Dispenser_Data[DispenserId].nanolitterperpulse ;//* dir; //double consumedintimeframe = (double)(CurrentDispenserSpeed[DispenserId]); //pulses only //consumedintimeframe = 10+DispenserId; - IDS_Dispenser_Data[DispenserId].consumedinnanolitter += (CurrentDispenserSpeed[DispenserId]*4/10);//100 milliseconds ==> speed/10 + IDS_Dispenser_Data[DispenserId].consumedinnanolitter += (CurrentDispenserSpeed[DispenserId]*4/10);//400 milliseconds ==> speed*4/10 + if ((DispenserId == 2)&&(CurrentDispenserSpeed[DispenserId]>0)) + ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_Data ",__FILE__,DispenserId,(int)IDS_Dispenser_Data[DispenserId].consumedinnanolitter,RpWarning,(int)CurrentDispenserSpeed[DispenserId],0); + if (IDS_Dispenser_Data[DispenserId].consumedinnanolitter<0) IDS_Dispenser_Data[DispenserId].consumedinnanolitter = 0; if (CurrentDispenserSpeed[DispenserId]>0.1) @@ -367,7 +370,7 @@ void IDS_Dispenser_Content_Calculation (char DispenserId) } if (DispenserId == 0) { - if ((seconds_counter++>=9000)&&(DispenserDataUpdated == true))//9000)// - one hour) + if ((seconds_counter++>=600)&&(DispenserDataUpdated == true))//9000)// - one hour) { seconds_counter = 0; if (IDS_Dispenser_Data[DispenserId].consumedinnanolitter) diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c index bc240cd0f..a4172185a 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c @@ -103,7 +103,7 @@ uint32_t UnloadingStart = 0; uint8_t NumberOfDrierLoaderCycles = 0; uint32_t status = OK; - uint32_t LoadingControlId = 0xFF,PullerControlId = 0xFF,WinderControlId = 0xFF, SpeedTControlId = 0xFF; + uint32_t LoadingControlId = 0xFF,PullerControlId = 0xFF,WinderControlId = 0xFF, SpeedTControlId = 0xFF,ThreadLoadControlId = 0xFF; uint32_t previousPosition = 0, currentPosition = 0,Tinitialpos = 0xFFFF; uint32_t LoadCounter = 0; double TotalLoadedLen = 0.0; @@ -111,6 +111,7 @@ float numberOfSteps = 0; float numberOfCycles = 0; double DrierPrevLocation = 0; + int DrierCenterLocation = 0; FPGA_GPI_ENUM screw[2] = {GPI_LS_SCREW_RIGHT,GPI_LS_SCREW_LEFT}; int Screw_Dir = false; bool InitCalled = false; @@ -120,6 +121,9 @@ uint32_t ThreadLoadStateMachine( THREAD_LOAD_STAGES_ENUM LoadStages); uint32_t ThreadLoadControlCBFunction(uint32_t index, uint32_t ReadValue); uint32_t ThreadLoadLengthCBFunction(uint32_t IfIndex, uint32_t ReadValue); + uint32_t ThreadUpdateCallBackFunction(uint32_t IfIndex, uint32_t ReadValue); + + uint32_t Thread_Load_Dryer_UnLoading(void); uint32_t ThreadLoadingReport(void); bool ThreadLoaded(void); @@ -200,6 +204,7 @@ { LOG_ERROR (LoadStages, "Thread_Load_Reduce_Heat failed"); strcpy(LoadErrorMsg,"Thread_Load_Reduce_Heat failed"); + load.color = fastBILNK; LoadStatus = ERROR; TryAgain = true; //ThreadLoadButton(LoadStages); @@ -369,7 +374,7 @@ if (Head_Type == HEAD_TYPE_FLAT) { Report("Thread_Load_Lift_actuators",__FILE__,__LINE__,LOW,RpMessage,false,0); - Trigger_Head_Actuators_Stub(ACTOT, ENABLE, UP); + //Trigger_Head_Actuators_Stub(ACTOT, ENABLE, UP); //Trigger_Head_Actuators_Stub(ACTIN, ENABLE, UP); //Trigger_Head_Actuators_Control(ACTOT, LOW,true);//UP Trigger_Head_Actuators_Control(ACTIN, LOW,true);//UP @@ -393,6 +398,15 @@ status |= MCU_E2PromProgram(EEPROM_PULLER_TENSION_POSITION,1); } + if (Head_Type == HEAD_TYPE_FLAT) + { + Report("Thread_Load_Lift_ OT actuator",__FILE__,__LINE__,LOW,RpMessage,false,0); + Trigger_Head_Actuators_Stub(ACTOT, ENABLE, UP); + //Trigger_Head_Actuators_Stub(ACTIN, ENABLE, UP); + //Trigger_Head_Actuators_Control(ACTOT, LOW,true);//UP + //Trigger_Head_Actuators_Control(ACTIN, LOW,true);//UP + } + return OK; } uint32_t Thread_Load_Lift_Rockers(void) @@ -460,6 +474,11 @@ MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_RLOADING,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_RLOADING].directionthreadwize, 250, Motor_Id_to_LS_IdDown[HARDWARE_MOTOR_TYPE__MOTO_RLOADING], Thread_Load_HomingCallback,25000); CallbackCounter++; MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_LLOADING,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_LLOADING].directionthreadwize, 250, Motor_Id_to_LS_IdDown[HARDWARE_MOTOR_TYPE__MOTO_LLOADING], Thread_Load_HomingCallback,25000); + if (Head_Type == HEAD_TYPE_FLAT) + { + Report("Thread_Load_Close_ OT actuator",__FILE__,__LINE__,LOW,RpMessage,true,0); + Trigger_Head_Actuators_Stub(ACTOT, ENABLE, DOWN); + } return OK; } @@ -495,29 +514,24 @@ }*/ } - return OK; - } - uint32_t Thread_Load_Close_Lids(void) - { - REPORT_MSG(LoadStages, "Thread Load State Machine step Thread_Load_Close_Lids"); - //Close Dyeing Head Cover And Dryer Lid - //HARDWARE_MOTOR_TYPE__MOTO_DH_LID = 2, - //HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID = 4, if (Head_Type == HEAD_TYPE_FLAT) { Report("Thread_Load_Close_actuators",__FILE__,__LINE__,LOW,RpMessage,true,0); - Trigger_Head_Actuators_Control(ACTIN, LOW,false);//DOWN + //Trigger_Head_Actuators_Control(ACTIN, LOW,false);//DOWN //Trigger_Head_Actuators_Stub(ACTOT, ENABLE, DOWN); //Trigger_Head_Actuators_Stub(ACTIN, ENABLE, DOWN); HeadCard_Actuators_Relocate(); } - if (Head_Type != HEAD_TYPE_ARC) - { - CallbackCounter++; - MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_LID,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_LID].directionthreadwize, 300, Motor_Id_to_LS_IdDown[HARDWARE_MOTOR_TYPE__MOTO_DH_LID], Thread_Load_HomingCallback,20000); - } + return OK; + } + uint32_t Thread_Load_Close_Lids(void) + { + REPORT_MSG(LoadStages, "Thread Load State Machine step Thread_Load_Close_Lids"); + //Close Dyeing Head Cover And Dryer Lid + //HARDWARE_MOTOR_TYPE__MOTO_DH_LID = 2, + //HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID = 4, CallbackCounter++; // MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID].directionthreadwize, 200, Motor_Id_to_LS_IdDown[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID], Thread_Load_HomingCallback,10000); int direction; @@ -530,6 +544,15 @@ direction = DRIER_LID_CLOSE; } MotorGotoWithCallback(HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID, direction, Motor_Id_to_LS_IdDown[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID], Thread_Load_HomingCallback,10000); + if (Head_Type != HEAD_TYPE_ARC) + { + CallbackCounter++; + if(MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_LID,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_LID].directionthreadwize, 300, Motor_Id_to_LS_IdDown[HARDWARE_MOTOR_TYPE__MOTO_DH_LID], Thread_Load_HomingCallback,20000)==ERROR) + { + Thread_Load_HomingCallback(HARDWARE_MOTOR_TYPE__MOTO_DH_LID,NO_LIMIT); + } + } + return OK; } uint32_t Thread_Load_Resume_Heating(void) @@ -662,7 +685,7 @@ { TryAgain = true; SecondTry = false; - Report("Store Number of cycles in drier - halted",__FILE__,__LINE__,numberOfCycles,RpMessage,LoadArmRounds,0); + Report("Loading drier - halted",__FILE__,__LINE__,numberOfCycles,RpMessage,LoadArmRounds,0); MCU_E2PromProgram(EEPROM_STORAGE_DRYER_CYCLES,numberOfCycles+CurrentlyLoaded); TimeoutsCounter = 0; CallbackCounter = 0; @@ -808,6 +831,11 @@ RemoveControlCallback(SpeedTControlId, ThreadLoadLengthCBFunction ); SpeedTControlId = 0xFF; } + if (ThreadLoadControlId != 0xFF) + { + RemoveControlCallback(ThreadLoadControlId, ThreadUpdateCallBackFunction ); + ThreadLoadControlId = 0xFF; + } MotorStopAction(HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM); MotorStopAction(HARDWARE_MOTOR_TYPE__MOTO_RLOADING); @@ -816,7 +844,10 @@ MotorStopAction(HARDWARE_MOTOR_TYPE__MOTO_LDANCER1); MotorStopAction(HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID); MotorStopAction(HARDWARE_MOTOR_TYPE__MOTO_DH_LID); - MotorStop(HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM,Hard_Stop); + MotorStop(HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,Hard_Stop); + MotorStop(HARDWARE_MOTOR_TYPE__MOTO_WINDER,Hard_Hiz); + MotorStop(HARDWARE_MOTOR_TYPE__MOTO_SCREW,Hard_Hiz); + MotorStop(HARDWARE_MOTOR_TYPE__MOTO_RDRIVING,Hard_Hiz); if (LoadStages!=THREAD_LOAD_END) { usnprintf(LoadErrorMsg, 100, "Load sequence stopped by user on stage %d",LoadStages); @@ -845,14 +876,14 @@ bool direction; numberOfCycles++; uint32_t temp = Read_Dryer_ENC_Position(); - Report("Thread_Load_Dryer_UnLoading_Callback",__FILE__,ReadValue,temp,RpMessage,DrierPrevLocation,0); + Report("Thread_Load_Dryer_UnLoading_Callback",__FILE__,AccumulatedArmMovement,temp,RpMessage,DrierPrevLocation,0); //Report("Thread_Load_Dryer_UnLoading_Callback details",__FILE__,(int)(TotalLoadedLen),numberOfCycles,RpMessage,CallbackCounter,0); if (LoadStages != THREAD_LOAD_SET_LOAD_ARM_TO_START_POSITION) { Report("Thread_Load_Dryer_UnLoading_Callback wrong state",__FILE__,__LINE__,LoadStages,RpMessage,DrierPrevLocation,0); return OK; } - if ((abs (temp -DrierPrevLocation)>1000 )&&(ReadValue == NOTBUSY)) // OK - take another round + if ((AccumulatedArmMovement>8000 )&&(ReadValue == NOTBUSY)) // OK - take another round { DrierPrevLocation = temp; Report("Thread_Load_Dryer_UnLoading cycles",__FILE__,numberOfCycles,LoadArmRounds,RpMessage,0,0); @@ -871,14 +902,14 @@ } else //timeout or no movement { - Report("Store Number of cycles in drier - halted",__FILE__,__LINE__,numberOfCycles,RpMessage,LoadArmRounds,0); + Report("Unloading drier - halted",__FILE__,__LINE__,numberOfCycles,RpMessage,LoadArmRounds,0); if (SecondTry == true) MCU_E2PromProgram(EEPROM_STORAGE_DRYER_CYCLES,0); else MCU_E2PromProgram(EEPROM_STORAGE_DRYER_CYCLES,LoadArmRounds-numberOfCycles); - if (abs(temp -DrierPrevLocation)<200) + if (abs(temp -DrierCenterLocation)<200) { - if (tempdata.len, requestContainer->data.data); ustrncpy (ThreadLoadingToken, requestContainer->token,36); //MessageState = 1; + ThreadLoadControlId = AddControlCallback("ThreadLoad", ThreadUpdateCallBackFunction, 4* eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); Report("StartThreadLoadingFunc",__FILE__,__LINE__,0,RpWarning,(int)LoadStages,0); ThreadLoadingReport(); return OK; -- cgit v1.3.1 From b68b34d6247175678f76cc40bb60019685740dd9 Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Sun, 6 Sep 2020 08:50:55 +0300 Subject: remove a debug code --- Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c index b35259ad9..75acec0b6 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c @@ -354,8 +354,8 @@ void IDS_Dispenser_Content_Calculation (char DispenserId) //double consumedintimeframe = (double)(CurrentDispenserSpeed[DispenserId]); //pulses only //consumedintimeframe = 10+DispenserId; IDS_Dispenser_Data[DispenserId].consumedinnanolitter += (CurrentDispenserSpeed[DispenserId]*4/10);//400 milliseconds ==> speed*4/10 - if ((DispenserId == 2)&&(CurrentDispenserSpeed[DispenserId]>0)) - ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_Data ",__FILE__,DispenserId,(int)IDS_Dispenser_Data[DispenserId].consumedinnanolitter,RpWarning,(int)CurrentDispenserSpeed[DispenserId],0); + //if ((DispenserId == 2)&&(CurrentDispenserSpeed[DispenserId]>0)) + // ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_Data ",__FILE__,DispenserId,(int)IDS_Dispenser_Data[DispenserId].consumedinnanolitter,RpWarning,(int)CurrentDispenserSpeed[DispenserId],0); if (IDS_Dispenser_Data[DispenserId].consumedinnanolitter<0) IDS_Dispenser_Data[DispenserId].consumedinnanolitter = 0; @@ -370,7 +370,7 @@ void IDS_Dispenser_Content_Calculation (char DispenserId) } if (DispenserId == 0) { - if ((seconds_counter++>=600)&&(DispenserDataUpdated == true))//9000)// - one hour) + if ((seconds_counter++>=9000)&&(DispenserDataUpdated == true))//9000)// - one hour) { seconds_counter = 0; if (IDS_Dispenser_Data[DispenserId].consumedinnanolitter) -- cgit v1.3.1 From dc3e9a8e3936f24d01d85652ff2fb9b8c320261c Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Sun, 6 Sep 2020 15:24:39 +0300 Subject: some fixes in dispenser handling, implement setheaterstate, procedures and stubs updated --- .../Embedded_SW/Embedded/Communication/Container.c | 3 + .../Embedded/Drivers/Motors/MotorActions.c | 4 +- .../Embedded/Modules/AlarmHandling/AlarmHandling.c | 9 +- .../Embedded/Modules/Heaters/Heaters_ex.h | 2 + .../Embedded/Modules/Heaters/Heaters_print.c | 36 + .../Embedded/Modules/IDS/IDS_dispenser.c | 8 +- .../Embedded_SW/Embedded/Modules/IDS/IDS_print.c | 19 +- .../Embedded/Modules/Stubs_Handler/Progress.c | 2 + .../Embedded/Modules/Thread/ThreadLoad.c | 19 +- .../Embedded/StateMachines/Printing/JobSTM.c | 1 + .../Procedures/EmbeddedParametersBuild.pproj | 2 +- .../Stubs Collection/Procedures/FFS Rebuild.pproj | 1 + Software/Stubs Collection/stubs/1.tpf | 3084 -- .../Scripts/Assemblies/ArcHead/clean_motor_ls.cs | 278 + .../Scripts/Assemblies/Dryer/Blowe_RMO_LOG.CSV | 5399 ---- .../Scripts/Assemblies/Dryer/Dryer_Encoder.cs | 55 + .../stubs/Scripts/Assemblies/Dryer/Dryer_SSR.cs | 28 +- .../stubs/Scripts/Assemblies/Dryer/Dryer_Tset.CSV | 24579 ++++++++++++++- .../stubs/Scripts/Assemblies/Dryer/Dryer_Tset1.CSV | 1600 + .../Scripts/Assemblies/Dryer/Dryer_Tset111.CSV | 29654 +++++++++++++++++++ .../stubs/Scripts/Assemblies/Dryer/blower_rpm.cs | 62 + .../Scripts/Assemblies/Dryer/test_dryer_heater.cs | 2 +- .../Dye head/Actuator_In_new set point.cs | 34 + .../Dye head/Write SYLKO to head eeprom.cs | 118 + .../ElectricalEnclosure_Fans1.cs | 80 +- ..._WORK_New_Calibrate_Midtank_pressure_sensors.cs | 272 +- .../New_Calibrate_Midtank_pressure_sensors.cs | 393 + .../New_Calibrate_Midtank_pressure_sensors1.cs | 423 + .../New_Calibrate_Midtank_pressure_sensors2.cs | 447 + .../Scripts/Assemblies/MidTank/midtanksetparams.cs | 79 +- .../Assemblies/New_DyeHead/Test_Actuator.cs | 42 + .../Scripts/Assemblies/New_DyeHead/Test_Lid.cs | 145 + .../PowerStep01/Get_PowerStep01_Parameters.cs | 227 + .../Motor_GMotor_Get_Param_Powerstep01_rev3.cs | 237 + .../stubs/Scripts/Assemblies/WHS/fan1-4.cs | 3 +- .../stubs/Scripts/Head_Type_Indification_2.cs | 25 + .../stubs/Scripts/Jig_Tester/JIG_TESTER.cs | 291 +- .../stubs/Scripts/Jig_Tester/Jig-TesterV 1.0.docx | Bin 0 -> 2159500 bytes .../stubs/Scripts/Jig_Tester/Jig-TesterV 1.1.docx | Bin 0 -> 3989402 bytes .../stubs/Scripts/Jig_Tester/LTFU_Jig.cs | 10 +- .../stubs/Scripts/Jig_Tester/MidTank_Jig.cs | 4 +- .../stubs/Scripts/Jig_Tester/RTFU_Jig.cs | 4 +- .../stubs/Scripts/Main card Watchdog test.cs | 24 + .../stubs/Scripts/MidTank Calibration.pproj | 1 + .../Stubs Collection/stubs/Scripts/Priming.pproj | 1 + .../stubs/Scripts/Set cleaning sequence.cs | 23 + .../WHS_waste_Tank_Calibration_Save_V0.pproj | 1 + .../stubs/Scripts/Write SYLKO to head eeprom.cs | 118 - .../Scripts/config head type to hed card eeprom.cs | 118 + .../stubs/Scripts/progress_test.pproj | 1 + .../Stubs Collection/stubs/Scripts/test halt.cs | 24 + .../stubs/embeddedparametersbuild_w_cleaning.cs | 6 +- 52 files changed, 59074 insertions(+), 8924 deletions(-) create mode 100644 Software/Stubs Collection/Procedures/FFS Rebuild.pproj delete mode 100644 Software/Stubs Collection/stubs/1.tpf create mode 100644 Software/Stubs Collection/stubs/Scripts/Assemblies/ArcHead/clean_motor_ls.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Encoder.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Tset1.CSV create mode 100644 Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Tset111.CSV create mode 100644 Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/blower_rpm.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/Assemblies/Dye head/Actuator_In_new set point.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/Assemblies/Dye head/Write SYLKO to head eeprom.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/New_Calibrate_Midtank_pressure_sensors.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/New_Calibrate_Midtank_pressure_sensors1.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/New_Calibrate_Midtank_pressure_sensors2.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/Assemblies/New_DyeHead/Test_Actuator.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/Assemblies/New_DyeHead/Test_Lid.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/Assemblies/PowerStep01/Get_PowerStep01_Parameters.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/Assemblies/PowerStep01/Motor_GMotor_Get_Param_Powerstep01_rev3.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/Head_Type_Indification_2.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/Jig_Tester/Jig-TesterV 1.0.docx create mode 100644 Software/Stubs Collection/stubs/Scripts/Jig_Tester/Jig-TesterV 1.1.docx create mode 100644 Software/Stubs Collection/stubs/Scripts/Main card Watchdog test.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/MidTank Calibration.pproj create mode 100644 Software/Stubs Collection/stubs/Scripts/Priming.pproj create mode 100644 Software/Stubs Collection/stubs/Scripts/Set cleaning sequence.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/WHS_waste_Tank_Calibration_Save_V0.pproj delete mode 100644 Software/Stubs Collection/stubs/Scripts/Write SYLKO to head eeprom.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/config head type to hed card eeprom.cs create mode 100644 Software/Stubs Collection/stubs/Scripts/progress_test.pproj create mode 100644 Software/Stubs Collection/stubs/Scripts/test halt.cs (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Communication/Container.c b/Software/Embedded_SW/Embedded/Communication/Container.c index b14efbd55..307e4eecb 100644 --- a/Software/Embedded_SW/Embedded/Communication/Container.c +++ b/Software/Embedded_SW/Embedded/Communication/Container.c @@ -349,6 +349,9 @@ void receive_callback(char* buffer, size_t length) case MESSAGE_TYPE__StartEventsNotificationRequest: StartEventsNotificationRequestFunc(requestContainer); break; + case MESSAGE_TYPE__SetHeaterStateRequest: + SetHeaterStateRequestFunc(requestContainer); + break; case MESSAGE_TYPE__StopEventsNotificationRequest: StopEventsNotificationRequestFunc(requestContainer); break; diff --git a/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c b/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c index 8c12b4ea3..f33edee50 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c +++ b/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c @@ -222,7 +222,7 @@ uint32_t MotorMoveWithCallback (TimerMotors_t MotorId,bool direction, uint32_t S //SetMotorSpeed (deviceId, parameter); MotorCallback[MotorId] = callback; MotorTimeout[MotorId] = 0; - MotorTimeLag[MotorId] = 40; + MotorTimeLag[MotorId] = 20; MotorTimeLimit[MotorId] = timeout; if (MotorId ==HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM) { @@ -233,7 +233,7 @@ uint32_t MotorMoveWithCallback (TimerMotors_t MotorId,bool direction, uint32_t S //MotorStop(MotorId,Hard_Hiz ); MotorMove(MotorId,direction,Steps ); - MotorControlId[MotorId] = AddControlCallback(NULL, MotorMoveCallBackFunction, /*eTenMillisecond*/40, MotorControlGetnBusyState,(IfTypeMotors*0x100+MotorId), MotorId, 0 ); + MotorControlId[MotorId] = AddControlCallback(NULL, MotorMoveCallBackFunction, /*eTenMillisecond*/20, MotorControlGetnBusyState,(IfTypeMotors*0x100+MotorId), MotorId, 0 ); MotorControlCallback[MotorId] = MotorMoveCallBackFunction; return MotorControlId[MotorId]; } diff --git a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c index e8e2e4ed0..78398119b 100644 --- a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c +++ b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c @@ -446,6 +446,7 @@ uint16_t FluidLevelWarning = 20,FluidLevelError = 50; int NumOfSystemAlarms = MAX_SYSTEM_ALARMS; //bool DispenserInUse[MAX_SYSTEM_DISPENSERS] = {false,false,false,false,false,false,false,false}; bool EventsNotificationRequestAccepted = false; +char AlarmReasonStr[100]; //read dispensers limit switches. 25 - send warning. up - stop job and send alarm //Cone missing //Dyeing head over temperature @@ -594,7 +595,8 @@ void AlarmHandlingLoadFlags(void) CheckCurrentAlarms = (AlarmhandlingFlags && 0x0002); CheckTamperAlarms = (AlarmhandlingFlags && 0x0004); CheckMotorAlarms = (AlarmhandlingFlags && 0x0008); - ReportWithPackageFilter(AlarmFilter,"Alarm group setting", __FILE__,__LINE__,0, RpMessage, 1*CheckHardLimitAlarms+2*CheckCurrentAlarms+3*CheckTamperAlarms+4*CheckMotorAlarms, 0); + usnprintf(AlarmReasonStr, 100, "Alarm group from EEPPROM Current %d Motor %d Tamper %d",CheckCurrentAlarms,CheckMotorAlarms,CheckTamperAlarms); + ReportWithPackageFilter(AlarmFilter,AlarmReasonStr, __FILE__,__LINE__,0, RpMessage, 1*CheckHardLimitAlarms+2*CheckCurrentAlarms+3*CheckTamperAlarms+4*CheckMotorAlarms, 0); } void AlarmHandlingSetFlags(bool checkHardLimitAlarms,bool checkCurrentAlarms, bool checkTamperAlarms, bool checkMotorAlarms) @@ -604,7 +606,9 @@ void AlarmHandlingSetFlags(bool checkHardLimitAlarms,bool checkCurrentAlarms CheckCurrentAlarms = checkCurrentAlarms; CheckTamperAlarms = checkTamperAlarms; CheckMotorAlarms = checkMotorAlarms; - ReportWithPackageFilter(AlarmFilter,"Alarm group setting", __FILE__,__LINE__,0, RpMessage, 1*CheckHardLimitAlarms+2*CheckCurrentAlarms+3*CheckTamperAlarms+4*CheckMotorAlarms, 0); + usnprintf(AlarmReasonStr, 100, "Alarm group setting Current %d Motor %d Tamper %d",CheckCurrentAlarms,CheckMotorAlarms,CheckTamperAlarms); + ReportWithPackageFilter(AlarmFilter,AlarmReasonStr, __FILE__,__LINE__,0, RpMessage, 1*CheckHardLimitAlarms+2*CheckCurrentAlarms+3*CheckTamperAlarms+4*CheckMotorAlarms, 0); + if (CheckHardLimitAlarms) flags |= 0x1; if (CheckCurrentAlarms) flags |= 0x2; if (CheckTamperAlarms) flags |= 0x4; @@ -615,7 +619,6 @@ void AlarmHandlingSetFlags(bool checkHardLimitAlarms,bool checkCurrentAlarms AlarmhandlingFlags = flags; } } -char AlarmReasonStr[100]; JobEndReasonEnum getEndReason(uint32_t AlarmId) { switch (AlarmItem[AlarmId].AlarmSource) diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h index 00d5a2a65..c428faea3 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h @@ -22,6 +22,8 @@ void HeatingTestSendResonse(uint32_t status, bool last,bool heater1Active,bool h uint32_t HeaterCommandRequestMessage(int HeaterId, bool OnOff, int Temperature); void HeatingTestRequest(MessageContainer* requestContainer); void HeatingTestPollRequest(MessageContainer* requestContainer); +void SetHeaterStateRequestFunc(MessageContainer* requestContainer); + bool HeaterCheckReady(void); bool isHeaterReady(uint8_t HeaterId); diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c index 56e71b345..783e337cc 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c @@ -15,6 +15,8 @@ #include "PMR/Hardware/HardwarePidControlType.pb-c.h" #include "PMR/Hardware/HardwarePidControl.pb-c.h" #include "PMR/Hardware/HardwareBlower.pb-c.h" +#include "PMR/Diagnostics/SetHeaterStateRequest.pb-c.h" +#include "PMR/Diagnostics/SetHeaterStateResponse.pb-c.h" #include "PMR/Diagnostics/HeaterType.pb-c.h" #include "PMR/Diagnostics/HeaterState.pb-c.h" #include "PMR/common/MessageContainer.pb-c.h" @@ -638,6 +640,40 @@ int GetFilteredHeaterRead(int HeaterId) * initialized all global data *************************************************************************************/ bool HeaterRestarted[HEATER_TYPE_MAX_HEATERS] = {false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false}; + +void SetHeaterStateRequestFunc(MessageContainer* requestContainer) +{ + + uint32_t status = PASSED; + MessageContainer responseContainer; + + SetHeaterStateRequest* request = set_heater_state_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); + + SetHeaterStateResponse response = SET_HEATER_STATE_RESPONSE__INIT; + + if (request->has_heatertype) + { + if ((request->has_isactive)&&(request->has_setpoint)) + status = HeaterCommandRequestMessage(request->heatertype,true,request->setpoint); + else + status = HeaterCommandRequestMessage(request->heatertype,false,request->setpoint); + } + + responseContainer = createContainer(MESSAGE_TYPE__SetHeaterStateResponse, requestContainer->token, true, &response, &set_heater_state_response__pack, &set_heater_state_response__get_packed_size); + if (status) + { + responseContainer.has_error = true; + responseContainer.error = (ErrorCode)status; + } + //------------------------------------------------------------------------------------------- + uint8_t* container_buffer = malloc(message_container__get_packed_size(&responseContainer)); + size_t container_size = message_container__pack(&responseContainer, container_buffer); + free(responseContainer.data.data); + SendChars((char*)container_buffer, container_size); + + set_heater_state_request__free_unpacked(request,NULL); + +} uint32_t HeaterCommandRequestMessage(int HeaterNum, bool OnOff, int Temperature) { //uint32_t status = NOT_SUPPORTED; diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c index 75acec0b6..c8f435cb9 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c @@ -354,12 +354,16 @@ void IDS_Dispenser_Content_Calculation (char DispenserId) //double consumedintimeframe = (double)(CurrentDispenserSpeed[DispenserId]); //pulses only //consumedintimeframe = 10+DispenserId; IDS_Dispenser_Data[DispenserId].consumedinnanolitter += (CurrentDispenserSpeed[DispenserId]*4/10);//400 milliseconds ==> speed*4/10 + if (IDS_Dispenser_Data[DispenserId].consumedinnanolitter<0) + IDS_Dispenser_Data[DispenserId].consumedinnanolitter = 0; //if ((DispenserId == 2)&&(CurrentDispenserSpeed[DispenserId]>0)) - // ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_Data ",__FILE__,DispenserId,(int)IDS_Dispenser_Data[DispenserId].consumedinnanolitter,RpWarning,(int)CurrentDispenserSpeed[DispenserId],0); + // ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_Data info",__FILE__,DispenserId,(int)IDS_Dispenser_Data[DispenserId].consumedinnanolitter,RpWarning,(int)CurrentDispenserSpeed[DispenserId],0); + //if ((DispenserId == 2)&&(CurrentDispenserSpeed[DispenserId]<0)) + // ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_Data fill",__FILE__,DispenserId,(int)IDS_Dispenser_Data[DispenserId].consumedinnanolitter,RpWarning,(int)(-1*CurrentDispenserSpeed[DispenserId]),0); if (IDS_Dispenser_Data[DispenserId].consumedinnanolitter<0) IDS_Dispenser_Data[DispenserId].consumedinnanolitter = 0; - if (CurrentDispenserSpeed[DispenserId]>0.1) + if (abs(CurrentDispenserSpeed[DispenserId])>0) { DispenserDataUpdated = true; IDS_Dispenser_Data[DispenserId].totalconsumedinnanolitter += (CurrentDispenserSpeed[DispenserId]/10); diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c index 327d80eb1..d40f3c00b 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c @@ -452,10 +452,12 @@ c. Go to step 2.a x Segment.BrushStopsCount. uint32_t DispenserPrepareControlId = 0xFF; int NumOfActiveDispensers = 0; int DispenserBuildTimeCounter = 0; -#define DISPENSER_UP_MOVEMENT + double TargetNumberOfStepsPreRun,MaximalPressurePreRun; int DispenserTotalPrepareSteps[MAX_SYSTEM_DISPENSERS]; bool DispenserLastMovementDown[MAX_SYSTEM_DISPENSERS]; -#define PRESSURE_READ_TIME_GAP 100 + + #define PRESSURE_READ_TIME_GAP 100 + uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) { if (AutoHoming_Config >= AutoHoming_JobEnd_PowerOn_off) @@ -582,10 +584,10 @@ bool AdjustDispenserSpeedToPressure(int DispenserId, double RefMaxPressure,doubl { DispenserTotalPrepareSteps[i]+=(CurrentDispenserSpeed[i]*PRESSURE_READ_TIME_GAP/eOneSecond); HW_Motor_Id = DispenserIdToMotorId[i]; -//#ifdef DISPENSER_UP_MOVEMENT - if (DispenserTotalPrepareSteps[i] DispenserPreparePressure*1.2) { @@ -597,7 +599,6 @@ bool AdjustDispenserSpeedToPressure(int DispenserId, double RefMaxPressure,doubl if (AdjustDispenserSpeedToPressure(i,DispenserPreparePressure,pressure) == true) NumofReadyDispensers++; } -//#endif ReportWithPackageFilter(IDSFilter,"IDS prepare",__FILE__,i,(int)DispenserTotalPrepareSteps[i],RpWarning,(int)(CurrentDispenserSpeed[i]*100),0); } } @@ -758,7 +759,7 @@ bool AdjustDispenserSpeedToPressure(int DispenserId, double RefMaxPressure,doubl JobTicket* JobTicket = JobDetails; JobEndSequence = false; - if ((pressurebuildup>0.1)&&(pressurebuildup<4.0)) + if ((pressurebuildup>0.1)&&(pressurebuildup<4.5)) { ReportWithPackageFilter(IDSFilter,"Setting pressure from RML feeder tension",__FILE__,__LINE__,(int)(pressurebuildup*100),RpWarning,(int)(DispenserPreparePressure*100),0); DispenserPreparePressure = pressurebuildup; @@ -778,6 +779,8 @@ bool AdjustDispenserSpeedToPressure(int DispenserId, double RefMaxPressure,doubl CleaningDispenserSpeed = 0; EnableCleaning = false; } + TargetNumberOfStepsPreRun = InitialDispenserTimeout; + MaximalPressurePreRun = InitialDispenserPressure; for (Motor_i = 0;Motor_i < MAX_SYSTEM_DISPENSERS;Motor_i++) { @@ -1840,7 +1843,7 @@ uint32_t IDSSegmentState(void *SegmentDetails, int SegmentId) DispenserPreSegmentControlId = 0xFF; } - IDS_Dispenser_Store_Data (); + //IDS_Dispenser_Store_Data (); for ( Dispenser_i = 0;Dispenser_i < MAX_SYSTEM_DISPENSERS;Dispenser_i++) { diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c index 7295084e3..8856d873a 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c @@ -898,6 +898,7 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) uint32_t timeout = 0xFFFFFFFFU; ROM_WatchdogReloadSet(WATCHDOG0_BASE, timeout); #endif + HeatersEnd(); FRESULT iFResult = Init_Flash_File_System(true); if(iFResult != FR_OK) { @@ -930,6 +931,7 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) if((request->amount == 0x0CE) && (request->delay == 0x0CE)) //Get Gas Sensor { LOG_ERROR(request->delay,"FlashInit"); + HeatersEnd(); FlashInit(); response.progress = (double)OK; response.has_progress = true; diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c index a4172185a..cd7c146fe 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c @@ -373,10 +373,7 @@ } if (Head_Type == HEAD_TYPE_FLAT) { - Report("Thread_Load_Lift_actuators",__FILE__,__LINE__,LOW,RpMessage,false,0); - //Trigger_Head_Actuators_Stub(ACTOT, ENABLE, UP); - //Trigger_Head_Actuators_Stub(ACTIN, ENABLE, UP); - //Trigger_Head_Actuators_Control(ACTOT, LOW,true);//UP + Report("Thread_Load_Lift right actuator",__FILE__,__LINE__,LOW,RpMessage,false,0); Trigger_Head_Actuators_Control(ACTIN, LOW,true);//UP } return OK; @@ -400,11 +397,8 @@ } if (Head_Type == HEAD_TYPE_FLAT) { - Report("Thread_Load_Lift_ OT actuator",__FILE__,__LINE__,LOW,RpMessage,false,0); + Report("Thread_Load_Lift left actuator",__FILE__,__LINE__,LOW,RpMessage,false,0); Trigger_Head_Actuators_Stub(ACTOT, ENABLE, UP); - //Trigger_Head_Actuators_Stub(ACTIN, ENABLE, UP); - //Trigger_Head_Actuators_Control(ACTOT, LOW,true);//UP - //Trigger_Head_Actuators_Control(ACTIN, LOW,true);//UP } return OK; @@ -476,7 +470,7 @@ MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_LLOADING,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_LLOADING].directionthreadwize, 250, Motor_Id_to_LS_IdDown[HARDWARE_MOTOR_TYPE__MOTO_LLOADING], Thread_Load_HomingCallback,25000); if (Head_Type == HEAD_TYPE_FLAT) { - Report("Thread_Load_Close_ OT actuator",__FILE__,__LINE__,LOW,RpMessage,true,0); + Report("Thread_Load_Close left actuator",__FILE__,__LINE__,LOW,RpMessage,true,0); Trigger_Head_Actuators_Stub(ACTOT, ENABLE, DOWN); } @@ -516,12 +510,7 @@ } if (Head_Type == HEAD_TYPE_FLAT) { - Report("Thread_Load_Close_actuators",__FILE__,__LINE__,LOW,RpMessage,true,0); - - //Trigger_Head_Actuators_Control(ACTIN, LOW,false);//DOWN - //Trigger_Head_Actuators_Stub(ACTOT, ENABLE, DOWN); - - //Trigger_Head_Actuators_Stub(ACTIN, ENABLE, DOWN); + Report("Thread_Load_Close right actuators",__FILE__,__LINE__,LOW,RpMessage,true,0); HeadCard_Actuators_Relocate(); } return OK; diff --git a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c index e16909c45..c217a68b3 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c @@ -1401,6 +1401,7 @@ Void jobTask(UArg arg0, UArg arg1) JobResumed = false; setmachineActive(false); SetMachineStatus(MACHINE_STATE__Ready); + IDS_Dispenser_Store_Data(); resetIdleCounter(); CurrentJob = NULL; if (IFS_Clearing_SuctionWaiting == true) diff --git a/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.pproj b/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.pproj index 408dfea72..d15843b99 100644 --- a/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.pproj +++ b/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.pproj @@ -1 +1 @@ -{"$id":"1","Name":"EmbeddedParametersBuild","Description":"This procedure lets the FSE to define values for cleaning, tamper alarms, initial heating, WCF value and automatic dispenser filling.","Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.PMR.EmbeddedParameters;\r\nusing Tango.PMR.IO;\r\nusing Tango.FSE.Procedures;\r\n\r\n\r\npublic class Cleaning\r\n{\r\n\t[Description(\"Actuator Going up time\")]\r\n\tpublic int Tup;\r\n\t[Description(\"Actuator Wait up time\")]\r\n\tpublic int Tdelay1;\r\n\t[Description(\"Actuator Wait Down time\")]\r\n\tpublic int Tdelay2;\r\n}\r\npublic class Advanced\r\n{\r\n\t[Description(\"Automatic heating on machine StartUp\")]\r\n\tpublic bool InitialHeating;\r\n\t[Description(\"Waste pressure buildup factor\")]\r\n\tpublic int WFCF;\r\n\t[Description(\"Auto fill mode on/off\")]\r\n\tpublic bool Autofill;\r\n}\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\r\n context.AddResult(ResultType.Passed, \"My Value Name\", \"Test for this value has passed.\");\r\n\t\tConfigurationParameters configurationParameters = new ConfigurationParameters();\r\n\r\n\t\tbool AdvancedParams = context.GetInput(\"AdvancedParameters\");\r\n\t\tAdvanced Advancedparam = new Advanced();\r\n\t\tAdvancedparam.InitialHeating = true;\r\n\t\tAdvancedparam.WFCF = 40;\r\n\t\tAdvancedparam.Autofill = true;\r\n\t\tif (AdvancedParams == true)\r\n \tAdvancedparam =\tcontext.RequestUserInputFor(Advancedparam,\"Advanced parameters input Required\",\"Please fill in the form\");\r\n\r\n\t\tconfigurationParameters.BreakSensorLimit = 10;\r\n\r\n\t\t//how many samples to collect in diagnostics before sending\r\n\t\tconfigurationParameters.DiagnosticCollectionLimit = 3;\r\n\r\n\t\t//how many consecutive readout before declaring DC over/underheat alarm\r\n\t\tconfigurationParameters.OverHeatCountLimit = 3;\r\n\t\tconfigurationParameters.UnderHeatCountLimit = 3;\r\n\r\n\t\t// time of motor activity before opening the valve or after closing the valve, in milliseconds\r\n\t\tconfigurationParameters.CloseValveTimeout = 20;\r\n\t\tconfigurationParameters.OpenValveTimeout = 20;\r\n\r\n\t\t//backlash after filling - target pressure, timoeout, time staps (speed will be added in general parameters)\r\n\t\tconfigurationParameters.InitialDispenserPressure = 0.25; \r\n\t\tconfigurationParameters.InitialDispenserTimeout = 60000; //20 seconds\r\n\t\tconfigurationParameters.InitialDispenserTimeLag = 100;\r\n\r\n\t\t//job prepare - build pressure in dispensers - target pressure, timoeout, time staps, speed\r\n\t\tconfigurationParameters.DispenserBuildPressureSpeed = 950; //no more than 1000\r\n\t\tconfigurationParameters.DispenserBuildPressureLimit = 0.85; \r\n\t\tconfigurationParameters.DispenserBuildPressureTimeout = 180000;\r\n\t\tconfigurationParameters.DispenserBuildPressureLag = 100;\r\n\r\n\t\t//temperature band 1000 = 100% - thresholds for job start around target temprature - AC\r\n\t\tconfigurationParameters.ACHeatersLowerOperationLimit = 995;\r\n\t\tconfigurationParameters.ACHeatersUpperOperationLimit = 1005;\r\n\r\n\t\t//temperature band 1000 = 100% - thresholds for job start around target temprature - DC\r\n\t\tconfigurationParameters.DCHeatersLowerOperationLimit = 978;\r\n\t\tconfigurationParameters.DCHeatersUpperOperationLimit = 1005;\r\n\r\n\t\t// mid tank reading offset to add to the readout (OBSOLETE!)\r\n\t\tconfigurationParameters.MidTankPressureCorrection = 0.0;\r\n\r\n\t\t//waste factor for intersegment pressure building\r\n\t\tconfigurationParameters.DispenserPresegmentWFCF = Advancedparam.WFCF;\r\n\r\n\t\t//how much time to start the WFCF process (pressure buildup) before segment start\r\n\t\tconfigurationParameters.IDSPreSegmentWFCFTimeBeforeSegment = 12000;\r\n\r\n\t\t//flag: start heaters according to saved process parameters upon init?\r\n\t\tconfigurationParameters.StartHeatingOnInitSequence = Advancedparam.InitialHeating;\r\n\r\n\t\t// current test for the heaters - alarm thresholds\r\n\t\tconfigurationParameters.CurrentAlarmLowLimit = 0.78;\r\n\t\tconfigurationParameters.CurrentAlarmHighLimit = 1.07;\r\n\r\n\t\t//currently not in use\r\n\t\tconfigurationParameters.IDSSegmentRefillTimeout = 5000;\r\n\t\tconfigurationParameters.IDSPreSegmentBuildupTime = 5000;\r\n\t\t//cleaning!!!!!!!!!!\r\n\t\tconfigurationParameters.IDSCleaningSpeed = 800;\r\n\t\tconfigurationParameters.IDSCleaningStopBeforeSegmentTime = 10000; //end of presegemnt\r\n\t\tconfigurationParameters.IDSCleaningStartSprayPreSegmentTime =2000; //beginning of presegment\r\n\r\n\t\tbool SetCleaning = context.GetInput(\"SetCleaningValues\");\r\n Cleaning Clean = new Cleaning();\r\n\t\tClean.Tup = 10;\r\n\t\tClean.Tdelay1 = 98;\r\n\t\tClean.Tdelay2 = 198;//300 milli up, stay 1 sec, stay down 2 sec\r\n\t\tif (SetCleaning == true)\r\n \tClean =\tcontext.RequestUserInputFor(Clean,\"Cleaning Input Required\",\"Please fill in the form\");\r\n\r\n\t\t// Tup = LeftRockerSpeed/100;\r\n\t\t// Tdelay1 = LeftRockerSpeed%100;\r\n\t\t// Tdelay2 = RightRockerSpeed;\r\n\t\tint LeftRockerSpeed = Clean.Tup*100+Clean.Tdelay1;\r\n\t\tint RightRockerSpeed = Clean.Tdelay2;\r\n\r\n\t\tconfigurationParameters.IDSLeftCleaningMotorSpeed = LeftRockerSpeed;\r\n\t\tconfigurationParameters.IDSRightCleaningMotorSpeed = RightRockerSpeed;\r\n\r\n\t\tconfigurationParameters.SwitchToIdleTimeinSeconds = 3600;\r\n\t\tconfigurationParameters.IdleDrierTemperature = 80;\r\n\t\tconfigurationParameters.IdleHeadTemperature = 80;\r\n\t\tconfigurationParameters.IdleMixerTemperature = 0;\r\n\t\tconfigurationParameters.PowerOffTemperatureLimit = 60;\r\n\r\n\t\t//general parameters, ORDER MUST BE PRESERVED!!!!\r\n\t\t//check the dispensers hard limit alarms\r\n\t\t/*1*/\r\n\t\tDouble checkHardLimitAlarms = new Double();\r\n\t\tcheckHardLimitAlarms = 1.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkHardLimitAlarms);\r\n\r\n\t\t/*2*/\r\n\t\tDouble checkCurrentAlarms = new Double();\r\n\t\tcheckCurrentAlarms = 0.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkCurrentAlarms);\r\n\t\t//check the tamper alarms\r\n\r\n\t\t/*3*/\r\n\t\tDouble checkTamperAlarms = new Double();\r\n\t\tcheckTamperAlarms = context.GetInput(\"CheckTampers\");\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkTamperAlarms);\r\n\r\n\t\t/*4*/\r\n\t\tDouble checkMotorAlarms = new Double();\r\n\t\tcheckMotorAlarms = 1.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkMotorAlarms);\r\n\r\n\t\t/*5*/\r\n\t\tDouble WinderBackToBaseTime = new Double();\r\n\t\tWinderBackToBaseTime = 820.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(WinderBackToBaseTime);\r\n\t\t/*6*/\r\n\t\tDouble DispenserInitialPressureSpeed = new Double();\r\n\t\tDispenserInitialPressureSpeed = 1050.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(DispenserInitialPressureSpeed);\r\n\r\n\t\t/*7*/\r\n\t\tDouble SetDiagnosticMode = new Double();\r\n\t\tSetDiagnosticMode = 3.0;\t\t\r\n\t\tconfigurationParameters.GeneralParameters.Add(SetDiagnosticMode);\r\n\r\n\t\t/*8*/\t\t\r\n\t\tDouble SetAutoFill = new Double();\r\n\t\tSetAutoFill = 3.0;\t\t\r\n\t\tif (Advancedparam.Autofill == false)\r\n\t\t\tSetAutoFill = 0.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(SetAutoFill);\r\n\r\n\t\t//configurationParameters\t= context.RequestUserInputFor(configurationParameters,\"ConfigurationParameters Input Required\",\"Please fill in the form\");\r\n\t\t/*Directory.CreateDirectory (\"C:/Temp\");\r\n\t\tFile.WriteAllBytes(\"C:/temp/EmbParam.cfg\",configurationParameters.ToBytes());\r\n\r\n\t\tbyte[] fileBytes1 = File.ReadAllBytes(\"C:/temp/EmbParam.cfg\");*/\r\n\t\tbyte[] fileBytes = configurationParameters.ToBytes();\r\n\r\n\r\n\t\tvar config = ConfigurationParameters.Parser.ParseFrom(fileBytes);\r\n\r\n\t\tcontext.Write( config);\r\n\t\tThread.Sleep(1000);\r\n\r\n\t\r\n\t\tcontext.Write(\"\\n\\n Deleting old file\");\r\n\r\n\t\tDeleteRequest deleteRequest = new DeleteRequest();\r\n\t\tdeleteRequest.Path = \"SYSINFO//EmbParam.cfg\";\r\n\t\tdeleteRequest.Attribute = Tango.PMR.IO.FileAttribute.Unspecified;\r\n\t\tDeleteResponse response5 = context.Send(deleteRequest);\r\n\r\n\r\n\t\tThread.Sleep(1000);\r\n\t\tcontext.Write(\"\\n\\n Loading new file file\");\r\n\r\n\t\tFileUploadRequest fileUploadRequest = new FileUploadRequest();\r\n\t\tfileUploadRequest.Path = \"SYSINFO//EmbParam.cfg\";\r\n\t\tfileUploadRequest.Length = (int)fileBytes.Length;\r\n\t\tFileUploadResponse response2 = context.Send(fileUploadRequest);\r\n\t\tThread.Sleep(1000);\r\n\t\tlong chunk_size = response2.MaxChunkLength;\r\n\r\n\t\tcontext.Write(\"Chunk size \"+ chunk_size + \" file size \"+ fileBytes.Length +\"\\n\\n\");\r\n\t\tif (chunk_size < fileBytes.Length)\r\n\t\t{\r\n\t\t\tcontext.AddResult(ResultType.Failed, \"Chunk size too small\", chunk_size);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tFileChunkUploadRequest fileChunkUploadRequest = new FileChunkUploadRequest();\r\n\t\t\tfileChunkUploadRequest.UploadID = response2.UploadID;\r\n\t\t\tfileChunkUploadRequest.Buffer = ByteString.CopyFrom(fileBytes);\t\r\n\t\t\tvar response3 = context.Send(fileChunkUploadRequest);\r\n\t\t\r\n\t\t\t//if (response3.\r\n\r\n\t\t\t// activating the new file\r\n\t\t\tProgressRequest progressRequest = new ProgressRequest();\r\n\t\t\tprogressRequest.Amount = 0xCD;\r\n\t\t\tprogressRequest.Delay = 0xCD;\r\n\t\t\tvar response1 = context.Send(progressRequest);\r\n\t\t\tcontext.AddResult(ResultType.Passed, \"parameters loaded\", chunk_size);\r\n\t\t}\r\n\r\n }\r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[{"$id":"6","Type":"Selection","SelectionInputs":{"$id":"7","$values":[{"$id":"8","Name":"Enable Tamper Check","Value":"1.0"},{"$id":"9","Name":"Disable Tamper Check","Value":"0.0"}]},"DisplayName":"Check Tamper / Fan alarms","Description":"Check Tamper / Fan alarms (1 -true, 0 - false)","Key":"CheckTampers","Value":"1.0"},{"$id":"10","Type":"Default","SelectionInputs":{"$id":"11","$values":[]},"DisplayName":"Set advanced parameters","Description":"Set advanced parameters","Key":"AdvancedParameters","Value":"false"},{"$id":"12","Type":"Default","SelectionInputs":{"$id":"13","$values":[]},"DisplayName":"Set Cleaning Values","Description":"Set to 1 if you want to update the cleaning values","Key":"SetCleaningValues","Value":"false"}]},"Variables":{"$id":"14","$values":[]},"ReferenceAssemblies":{"$id":"15","$values":[{"$id":"16","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"17","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"18","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"19","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"20","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"21","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"22","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"23","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"24","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"25","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"26","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Resources":{"$id":"27","$values":[]},"Dialogs":{"$id":"28","$values":[]},"ID":"2bd29884-5eb9-4d27-be4e-6cfa31dc9f66","ApartmentState":"MTA"} \ No newline at end of file +{"$id":"1","Name":"EmbeddedParametersBuild","Description":"This procedure lets the FSE to define values for cleaning, tamper alarms, initial heating, WCF value and automatic dispenser filling.","Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.PMR.EmbeddedParameters;\r\nusing Tango.PMR.IO;\r\nusing Tango.FSE.Procedures;\r\n\r\n\r\npublic class Cleaning\r\n{\r\n\t[Description(\"Actuator Going up time\")]\r\n\tpublic int Tup;\r\n\t[Description(\"Actuator Wait up time\")]\r\n\tpublic int Tdelay1;\r\n\t[Description(\"Actuator Wait Down time\")]\r\n\tpublic int Tdelay2;\r\n}\r\npublic class Advanced\r\n{\r\n\t[Description(\"Automatic heating on machine StartUp\")]\r\n\tpublic bool InitialHeating;\r\n\t[Description(\"Waste pressure buildup factor\")]\r\n\tpublic int WFCF;\r\n\t[Description(\"Auto fill mode on/off\")]\r\n\tpublic bool Autofill;\r\n}\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\r\n context.AddResult(ResultType.Passed, \"My Value Name\", \"Test for this value has passed.\");\r\n\t\tConfigurationParameters configurationParameters = new ConfigurationParameters();\r\n\r\n\t\tbool AdvancedParams = context.GetInput(\"AdvancedParameters\");\r\n\t\tAdvanced Advancedparam = new Advanced();\r\n\t\tAdvancedparam.InitialHeating = true;\r\n\t\tAdvancedparam.WFCF = 40;\r\n\t\tAdvancedparam.Autofill = true;\r\n\t\tif (AdvancedParams == true)\r\n \tAdvancedparam =\tcontext.RequestUserInputFor(Advancedparam,\"Advanced parameters input Required\",\"Please fill in the form\");\r\n\r\n\t\tconfigurationParameters.BreakSensorLimit = 10;\r\n\r\n\t\t//how many samples to collect in diagnostics before sending\r\n\t\tconfigurationParameters.DiagnosticCollectionLimit = 3;\r\n\r\n\t\t//how many consecutive readout before declaring DC over/underheat alarm\r\n\t\tconfigurationParameters.OverHeatCountLimit = 3;\r\n\t\tconfigurationParameters.UnderHeatCountLimit = 3;\r\n\r\n\t\t// time of motor activity before opening the valve or after closing the valve, in milliseconds\r\n\t\tconfigurationParameters.CloseValveTimeout = 20;\r\n\t\tconfigurationParameters.OpenValveTimeout = 20;\r\n\r\n\t\t//backlash after filling - target pressure, timoeout, time staps (speed will be added in general parameters)\r\n\t\tconfigurationParameters.InitialDispenserPressure = 3.85; //used for initial pre-run maximal pressure\r\n\t\tconfigurationParameters.InitialDispenserTimeout = 120000; ////used for initial pre-run target number of steps\r\n\t\tconfigurationParameters.InitialDispenserTimeLag = 100;\r\n\r\n\t\t//job prepare - build pressure in dispensers - target pressure, timoeout, time staps, speed\r\n\t\tconfigurationParameters.DispenserBuildPressureSpeed = 950; //no more than 1000\r\n\t\tconfigurationParameters.DispenserBuildPressureLimit = 0.85; \r\n\t\tconfigurationParameters.DispenserBuildPressureTimeout = 180000;\r\n\t\tconfigurationParameters.DispenserBuildPressureLag = 100;\r\n\r\n\t\t//temperature band 1000 = 100% - thresholds for job start around target temprature - AC\r\n\t\tconfigurationParameters.ACHeatersLowerOperationLimit = 995;\r\n\t\tconfigurationParameters.ACHeatersUpperOperationLimit = 1005;\r\n\r\n\t\t//temperature band 1000 = 100% - thresholds for job start around target temprature - DC\r\n\t\tconfigurationParameters.DCHeatersLowerOperationLimit = 978;\r\n\t\tconfigurationParameters.DCHeatersUpperOperationLimit = 1005;\r\n\r\n\t\t// mid tank reading offset to add to the readout (OBSOLETE!)\r\n\t\tconfigurationParameters.MidTankPressureCorrection = 0.0;\r\n\r\n\t\t//waste factor for intersegment pressure building\r\n\t\tconfigurationParameters.DispenserPresegmentWFCF = Advancedparam.WFCF;\r\n\r\n\t\t//how much time to start the WFCF process (pressure buildup) before segment start\r\n\t\tconfigurationParameters.IDSPreSegmentWFCFTimeBeforeSegment = 12000;\r\n\r\n\t\t//flag: start heaters according to saved process parameters upon init?\r\n\t\tconfigurationParameters.StartHeatingOnInitSequence = Advancedparam.InitialHeating;\r\n\r\n\t\t// current test for the heaters - alarm thresholds\r\n\t\tconfigurationParameters.CurrentAlarmLowLimit = 0.78;\r\n\t\tconfigurationParameters.CurrentAlarmHighLimit = 1.07;\r\n\r\n\t\t//currently not in use\r\n\t\tconfigurationParameters.IDSSegmentRefillTimeout = 5000;\r\n\t\tconfigurationParameters.IDSPreSegmentBuildupTime = 5000;\r\n\t\t//cleaning!!!!!!!!!!\r\n\t\tconfigurationParameters.IDSCleaningSpeed = 800;\r\n\t\tconfigurationParameters.IDSCleaningStopBeforeSegmentTime = 10000; //end of presegemnt\r\n\t\tconfigurationParameters.IDSCleaningStartSprayPreSegmentTime =2000; //beginning of presegment\r\n\r\n\t\tbool SetCleaning = context.GetInput(\"SetCleaningValues\");\r\n Cleaning Clean = new Cleaning();\r\n\t\tClean.Tup = 10;\r\n\t\tClean.Tdelay1 = 98;\r\n\t\tClean.Tdelay2 = 198;//300 milli up, stay 1 sec, stay down 2 sec\r\n\t\tif (SetCleaning == true)\r\n \tClean =\tcontext.RequestUserInputFor(Clean,\"Cleaning Input Required\",\"Please fill in the form\");\r\n\r\n\t\t// Tup = LeftRockerSpeed/100;\r\n\t\t// Tdelay1 = LeftRockerSpeed%100;\r\n\t\t// Tdelay2 = RightRockerSpeed;\r\n\t\tint LeftRockerSpeed = Clean.Tup*100+Clean.Tdelay1;\r\n\t\tint RightRockerSpeed = Clean.Tdelay2;\r\n\r\n\t\tconfigurationParameters.IDSLeftCleaningMotorSpeed = LeftRockerSpeed;\r\n\t\tconfigurationParameters.IDSRightCleaningMotorSpeed = RightRockerSpeed;\r\n\r\n\t\tconfigurationParameters.SwitchToIdleTimeinSeconds = 3600;\r\n\t\tconfigurationParameters.IdleDrierTemperature = 80;\r\n\t\tconfigurationParameters.IdleHeadTemperature = 80;\r\n\t\tconfigurationParameters.IdleMixerTemperature = 0;\r\n\t\tconfigurationParameters.PowerOffTemperatureLimit = 60;\r\n\r\n\t\t//general parameters, ORDER MUST BE PRESERVED!!!!\r\n\t\t//check the dispensers hard limit alarms\r\n\t\t/*1*/\r\n\t\tDouble checkHardLimitAlarms = new Double();\r\n\t\tcheckHardLimitAlarms = 1.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkHardLimitAlarms);\r\n\r\n\t\t/*2*/\r\n\t\tDouble checkCurrentAlarms = new Double();\r\n\t\tcheckCurrentAlarms = 0.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkCurrentAlarms);\r\n\t\t//check the tamper alarms\r\n\r\n\t\t/*3*/\r\n\t\tDouble checkTamperAlarms = new Double();\r\n\t\tcheckTamperAlarms = context.GetInput(\"CheckTampers\");\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkTamperAlarms);\r\n\r\n\t\t/*4*/\r\n\t\tDouble checkMotorAlarms = new Double();\r\n\t\tcheckMotorAlarms = 1.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkMotorAlarms);\r\n\r\n\t\t/*5*/\r\n\t\tDouble WinderBackToBaseTime = new Double();\r\n\t\tWinderBackToBaseTime = 820.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(WinderBackToBaseTime);\r\n\t\t/*6*/\r\n\t\tDouble DispenserInitialPressureSpeed = new Double();\r\n\t\tDispenserInitialPressureSpeed = 1050.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(DispenserInitialPressureSpeed);\r\n\r\n\t\t/*7*/\r\n\t\tDouble SetDiagnosticMode = new Double();\r\n\t\tSetDiagnosticMode = 3.0;\t\t\r\n\t\tconfigurationParameters.GeneralParameters.Add(SetDiagnosticMode);\r\n\r\n\t\t/*8*/\t\t\r\n\t\tDouble SetAutoFill = new Double();\r\n\t\tSetAutoFill = 3.0;\t\t\r\n\t\tif (Advancedparam.Autofill == false)\r\n\t\t\tSetAutoFill = 0.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(SetAutoFill);\r\n\r\n\t\t//configurationParameters\t= context.RequestUserInputFor(configurationParameters,\"ConfigurationParameters Input Required\",\"Please fill in the form\");\r\n\t\t/*Directory.CreateDirectory (\"C:/Temp\");\r\n\t\tFile.WriteAllBytes(\"C:/temp/EmbParam.cfg\",configurationParameters.ToBytes());\r\n\r\n\t\tbyte[] fileBytes1 = File.ReadAllBytes(\"C:/temp/EmbParam.cfg\");*/\r\n\t\tbyte[] fileBytes = configurationParameters.ToBytes();\r\n\r\n\r\n\t\tvar config = ConfigurationParameters.Parser.ParseFrom(fileBytes);\r\n\r\n\t\tcontext.Write( config);\r\n\t\tThread.Sleep(1000);\r\n\r\n\t\r\n\t\tcontext.Write(\"\\n\\n Deleting old file\");\r\n\r\n\t\tDeleteRequest deleteRequest = new DeleteRequest();\r\n\t\tdeleteRequest.Path = \"SYSINFO//EmbParam.cfg\";\r\n\t\tdeleteRequest.Attribute = Tango.PMR.IO.FileAttribute.Unspecified;\r\n\t\tDeleteResponse response5 = context.Send(deleteRequest);\r\n\r\n\r\n\t\tThread.Sleep(1000);\r\n\t\tcontext.Write(\"\\n\\n Loading new file file\");\r\n\r\n\t\tFileUploadRequest fileUploadRequest = new FileUploadRequest();\r\n\t\tfileUploadRequest.Path = \"SYSINFO//EmbParam.cfg\";\r\n\t\tfileUploadRequest.Length = (int)fileBytes.Length;\r\n\t\tFileUploadResponse response2 = context.Send(fileUploadRequest);\r\n\t\tThread.Sleep(1000);\r\n\t\tlong chunk_size = response2.MaxChunkLength;\r\n\r\n\t\tcontext.Write(\"Chunk size \"+ chunk_size + \" file size \"+ fileBytes.Length +\"\\n\\n\");\r\n\t\tif (chunk_size < fileBytes.Length)\r\n\t\t{\r\n\t\t\tcontext.AddResult(ResultType.Failed, \"Chunk size too small\", chunk_size);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tFileChunkUploadRequest fileChunkUploadRequest = new FileChunkUploadRequest();\r\n\t\t\tfileChunkUploadRequest.UploadID = response2.UploadID;\r\n\t\t\tfileChunkUploadRequest.Buffer = ByteString.CopyFrom(fileBytes);\t\r\n\t\t\tvar response3 = context.Send(fileChunkUploadRequest);\r\n\t\t\r\n\t\t\t//if (response3.\r\n\r\n\t\t\t// activating the new file\r\n\t\t\tProgressRequest progressRequest = new ProgressRequest();\r\n\t\t\tprogressRequest.Amount = 0xCD;\r\n\t\t\tprogressRequest.Delay = 0xCD;\r\n\t\t\tvar response1 = context.Send(progressRequest);\r\n\t\t\tcontext.AddResult(ResultType.Passed, \"parameters loaded\", chunk_size);\r\n\t\t}\r\n\r\n }\r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[{"$id":"6","Type":"Selection","SelectionInputs":{"$id":"7","$values":[{"$id":"8","Name":"Enable Tamper Check","Value":"1.0"},{"$id":"9","Name":"Disable Tamper Check","Value":"0.0"}]},"DisplayName":"Check Tamper / Fan alarms","Description":"Check Tamper / Fan alarms (1 -true, 0 - false)","Key":"CheckTampers","Value":"1.0"},{"$id":"10","Type":"Default","SelectionInputs":{"$id":"11","$values":[]},"DisplayName":"Set advanced parameters","Description":"Set advanced parameters","Key":"AdvancedParameters","Value":"false"},{"$id":"12","Type":"Default","SelectionInputs":{"$id":"13","$values":[]},"DisplayName":"Set Cleaning Values","Description":"Set to 1 if you want to update the cleaning values","Key":"SetCleaningValues","Value":"false"}]},"Variables":{"$id":"14","$values":[]},"ReferenceAssemblies":{"$id":"15","$values":[{"$id":"16","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"17","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"18","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"19","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"20","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"21","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"22","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"23","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"24","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"25","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"26","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Resources":{"$id":"27","$values":[]},"Dialogs":{"$id":"28","$values":[]},"ID":"2bd29884-5eb9-4d27-be4e-6cfa31dc9f66","ApartmentState":"MTA"} \ No newline at end of file diff --git a/Software/Stubs Collection/Procedures/FFS Rebuild.pproj b/Software/Stubs Collection/Procedures/FFS Rebuild.pproj new file mode 100644 index 000000000..2dca7e072 --- /dev/null +++ b/Software/Stubs Collection/Procedures/FFS Rebuild.pproj @@ -0,0 +1 @@ +{"$id":"1","Name":"FFS Rebuild","Description":"This procedure formats the flash file system of the embedded system. use it if the embedded storage looks malfunctioning. this call disconnects the tablet and holds the system for one minute.","Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\t\tStubDancerPositionRequest stubDancerPositionRequest = new StubDancerPositionRequest();\r\n\t\tstring response1 = context.GetInput(\"ValidationPassword\");\r\n List list = new List();\r\n\t\tif (response1 == \"Aa123456\")\r\n\t\t{\r\n\t\t\t//CF - initialize FFS\r\n\t\t\tProgressRequest progressRequest = new ProgressRequest();\r\n\t\t\tprogressRequest.Amount = 0xCF;\r\n\t\t\tprogressRequest.Delay = 0xCF;\r\n\t\t\t\r\n\t\t\t\tvar response = context.Send(progressRequest);\r\n\t }\r\n\r\n }\r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[{"$id":"6","Type":"Default","SelectionInputs":{"$id":"7","$values":[]},"DisplayName":"Validation Password","Description":"Validation Password","Key":"ValidationPassword","Value":"0"}]},"Variables":{"$id":"8","$values":[]},"ReferenceAssemblies":{"$id":"9","$values":[{"$id":"10","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"11","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"12","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"13","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"14","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"15","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"16","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"17","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"18","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"19","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"20","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Resources":{"$id":"21","$values":[]},"Dialogs":{"$id":"22","$values":[]},"ID":"23b690b1-bd08-45ba-807b-3faa244ed8c3","ApartmentState":"MTA"} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/1.tpf b/Software/Stubs Collection/stubs/1.tpf deleted file mode 100644 index 25215919f..000000000 --- a/Software/Stubs Collection/stubs/1.tpf +++ /dev/null @@ -1,3084 +0,0 @@ - - - - - - Temperatures - - - e4892498-fa1a-413c-9dd8-633efaade51c - 415 - 692.74336283185824 - 160 - 102.34070796460173 - 0 - 6b9cba1d-4acf-4992-97ad-e422bca6ada2 - -1 - - - a15665e3-af39-42d8-8c06-97d770632e10 - 928 - 593.77433628318579 - 207 - 184.4159292035398 - 0 - 6D6CFA18-5922-4AFE-84B3-2721CE128681 - -1 - - DryerAirHeater - 0 - 69.85 - false - false - true - - 0 - - - 0ac64716-d30c-489b-939e-a26d06445866 - 828 - 682.88053097345 - 130 - 100.31415929203541 - 0 - A5DFC2DB-3B36-4377-96A0-D492CE785C00 - -1 - - DryerMainHeater - 0 - 92.97 - false - false - true - - 0 - - - 181796d8-64f6-420a-8f37-9af9df67d6a9 - 717 - 684.46902654867324 - 127 - 101.3274336283186 - 0 - 86808B48-B7F9-43AD-840E-2A6A5987C305 - -1 - - DryerSecondaryHeater - 0 - 92.94 - true - false - true - - 0 - - - fd2bb3a3-a411-470d-bde7-0beaf84da059 - 931 - 83.08407079646031 - 186 - 195.56194690265494 - 0 - 8E764A14-0F84-4FEC-928B-32A2509CAD57 - -1 - - HeaterZone3 - 0 - 39.55 - false - false - true - - 0 - - - 7e8dd386-cca6-4d07-8a3e-af5403756002 - 1106 - 88.1504424778762 - 200 - 187.45575221238937 - 0 - B4EE8CC0-EE2B-4ABE-BF09-9226860E756B - -1 - - HeaterZone2 - 0 - 37.29 - false - false - true - - 0 - - - 32a91e5f-27c8-490d-b187-8e39b6626a13 - 1311 - 89.163716814159329 - 157 - 194.54867256637175 - 0 - 27E7BB74-81C3-4EF2-80AE-962F111C441F - -1 - - HeaterZone1 - 0 - 34.27 - false - false - true - - 0 - - - c844235a-8a29-4c2e-a964-e8f546d2ced7 - 1140 - 588.70796460177 - 173 - 183.40265486725662 - 0 - 42A62A48-F1D5-4BB6-AFEA-6A7DF6DCF626 - -1 - - MixerHeater - 0 - 54.669999999999995 - false - false - true - - 0 - - - 45b121b5-cf7c-41f7-8089-6d4d6b1ed2c8 - 751 - 80.420353982302458 - 169 - 197.27876106194645 - 0 - 94574D69-46E1-4144-A8B5-D4BF0DA96D18 - -1 - - HeaterZone4 - 0 - 40.71 - false - false - true - - 0 - - - e6b3eb18-482b-450e-b8a8-d2ac6bba4fd4 - 547 - 85.482300884952679 - 186 - 195.56194690265494 - 0 - D6771DF4-771E-4D62-B6BA-BDE361C0A0F3 - -1 - - HeaterZone5 - 0 - 43.389999999999993 - false - false - true - - 0 - - - efff2e67-e3a3-4667-9208-4704707d7cda - 353 - 86.69911504424698 - 186 - 195.56194690265494 - 0 - D2B6CAA0-055E-4871-8D91-A5370F1ACB22 - -1 - - HeaterZone6 - 0 - 46.809999999999995 - false - false - true - - 0 - - - f9936dba-cef8-41e3-a715-eb629dca1870 - 265 - 683.95575221238948 - 131 - 109.43362831858394 - 0 - 1778C1A7-AFB5-42F9-9E00-E80D30D9FC0A - -1 - 10 - 0 - - - 5f2610dc-3b9d-4302-b8f5-77a5e1c73b8c - 1027.9999999999973 - 291.07079646017547 - 44 - 42.557522123893705 - 0 - -14774017 - D - - - eadb5257-47a2-4336-a72a-f2d157fe70cb - 907.99999999999909 - 295.35840707964616 - 44 - 42.557522123893705 - 0 - -14774017 - F - - - 6c59af66-169a-46e0-89ae-a81e3e619043 - 785.00000000000159 - 288.5000000000004 - 44 - 42.557522123893705 - 0 - -14774017 - I - - - 3b32b9a8-f300-443f-950e-c49f81678bac - 624.99999999999966 - 285.86725663716874 - 44 - 42.557522123893705 - 0 - -14774017 - L - - - f6d44793-ed44-46ed-8854-eacbc11af10c - 569 - 688.00884955752213 - 155 - 96.261061946902714 - 0 - df38139e-0026-46bc-b72f-df5f9eec80f7 - -1 - - - 43793f93-da64-4409-b583-bca498f641e6 - 1308 - 656.59734513274338 - 203 - 107.40707964601774 - 0 - -1 - - - - be9db1fd-d408-4f1c-a15a-d6ffe58fafb6 - 1292 - 343.56637168141606 - 186 - 195.56194690265494 - 0 - 188285E5-1493-4BED-8269-91743770A631 - -1 - - HeaterZone7 - 0 - 50.449999999999996 - false - false - true - - 0 - - - f129ea0d-9abb-437f-928e-1cd1f569db2a - 1190.0000000000025 - 294.69026548672929 - 39 - 38.504424778760836 - 0 - -14774017 - C - - - 217c677a-3e11-4a7c-959b-616dae1259dd - 1369 - 295.87168141592934 - 44 - 42.557522123893705 - 0 - -14774017 - A - - - 381f67cf-b7c6-4f6d-b089-37130798a5d8 - 1107 - 342.55309734513293 - 186 - 195.56194690265494 - 0 - 461FA2D7-1918-4958-AAA7-37A1A329FA12 - -1 - - HeaterZone8 - 0 - 48.22 - false - false - true - - 0 - - - 3c923a93-4d15-4bbc-b1b3-be1876a77cfc - 924 - 343.56637168141606 - 186 - 195.56194690265494 - 0 - 63E2AFE0-0746-4AAB-AA74-C26EC1F282AE - -1 - - HeaterZone9 - 0 - 47.269999999999996 - false - false - true - - 0 - - - 26e078e6-df8c-4fbf-b10e-4b3f7c7e9500 - 359 - 342.55309734513304 - 186 - 195.56194690265494 - 0 - 2D578A37-D808-40D0-ACE4-4A868EDD6BDC - -1 - - HeaterZone12 - 0 - 39.64 - false - false - true - - 0 - - - 7a8c3948-bb3d-4eb1-9276-315d34038f91 - 550 - 343.56637168141611 - 186 - 195.56194690265494 - 0 - D41BBB23-6EB5-4743-89DB-9191000B475F - -1 - - HeaterZone11 - 0 - 45.449999999999996 - false - false - true - - 0 - - - f7d4c8ac-28cb-4779-83ef-3ede5e5a612c - 738 - 344.57964601769908 - 186 - 195.56194690265494 - 0 - B4D0A1C8-711C-49A9-82A3-B5B9F35FC131 - -1 - - HeaterZone10 - 0 - 48.459999999999994 - false - false - true - - 0 - - - 120a9bea-5b5a-4ba4-92f5-40135f49a344 - 6 - 535.07522123893818 - 338 - 137.80530973451323 - 0 - -14774017 - - 0 - 674d92c5-e6f8-4a62-bc62-b8e2fe0882a0 - 2020-01-14T07:44:15.1425366Z - Process parameters 2 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 7 - 0 - 0 - 0 - 0 - 7 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - Name - 0 - - - Dyeing Speed - 1 - - - Min Ink Uptake - 2 - - - Max Ink Uptake - 3 - - - Feeder Tension - 4 - - - Puller Tension - 5 - - - Winder Tension - 6 - - - Mixer Temp - 7 - - - Head Zone 1 Temp - 8 - - - Head Zone 2 Temp - 9 - - - Head Zone 3 Temp - 10 - - - Head Zone 4 Temp - 11 - - - Head Zone 5 Temp - 12 - - - Head Zone 6 Temp - 13 - - - Dryer Air Flow - 14 - - - Dryer Zone 1 Temp - 15 - - - Dryer Zone 2 Temp - 16 - - - Dryer Zone 3 Temp - 17 - - - Dryer Buffer Length - 18 - - - Head Air Flow - 19 - - - Process Parameters Tables Group Guid - 20 - - - Table Index - 21 - - - - - e502555c-95b0-4688-b5e3-8becb30fc62c - 1458.875 - 91.7821782178217 - 200 - 187.45575221238937 - 0 - F8C1BA7F-F6DF-414D-BAF5-D4CB292F91F6 - -1 - - HeadCoverHeater1 - 0 - 283.75 - false - false - true - - 0 - - - 0f7a35fc-e363-45b2-948d-ba66f91e4f0d - 1457.8333333333333 - 344.58910891089096 - 200 - 187.45575221238937 - 0 - F39B952A-6194-4055-A5CB-A3421BFE0F9B - -1 - - HeadCoverHeater2 - 0 - 283.75 - false - false - true - - 0 - - - 0214c2bd-98e2-4435-b55f-ec165b0782dd - 532 - 587.69469026548677 - 163 - 77.008849557522126 - 0 - FE0D0A56-5795-4C5A-8E09-939FBB35C441 - -1 - 10 - 2 - - - 387e9a45-e608-47b8-9f3c-5572d0544e41 - 708 - 584.65486725663732 - 168 - 84.101769911504334 - 0 - 94F3E5A1-413E-4EA0-BDE1-F0625BFF7910 - -1 - 10 - 2 - - - 18f62f2f-dbc0-4a3e-8af6-efdffc9562a5 - 12 - 699.86283185840716 - 234 - 96.2610619469026 - 0 - B6FE07F8-2435-495D-ABFE-358C76812413 - -1 - - - cb7b89a1-cdb4-408e-acc8-40e8dcb8d6ac - 7 - 5.995575221238937 - 142 - 84.101769911504391 - 0 - 9F98B9D3-F989-4D03-90E8-721671835E0B - -1 - 10 - 2 - - - 6be6ca7d-3ca6-4206-9c67-415174b71ace - 168 - 7.3893805309738809 - 146 - 83.088495575221259 - 0 - D59EFB38-79D9-446C-BCB5-92D8FDA900E4 - -1 - 10 - 2 - - - 2dca972d-3c41-4b07-a047-b63a23470a7e - 347 - 574.92035398230325 - 160 - 102.34070796460173 - 0 - 75f69efe-1c7e-4015-a6eb-2686d4f67a67 - -1 - - - 38e5d1ac-40a5-4c5f-822c-51813cb15b7b - 31 - 144.3584070796461 - 310 - 315.12831858407088 - 0 - -14774017 - - 0 - ce709f03-59be-410d-a928-e942c0c46ce3 - 2020-02-09T12:45:24.1272815Z - Process parameters 6 - 50 - 0 - 0 - 0 - 5000 - 5000 - 80 - 80 - 90 - 110 - 120 - 120 - 135 - 7 - 190 - 0 - 0 - 0 - 12 - 0 - 135 - 125 - 135 - 135 - 140 - 140 - 0 - 0 - 0 - 0 - 0 - - - - Process Parameters Tables Group Guid - 0 - - - Name - 1 - - - Table Index - 2 - - - Dyeing Speed - 3 - - - Min Ink Uptake - 4 - - - Max Ink Uptake - 5 - - - Feeder Tension - 6 - - - Puller Tension - 7 - - - Winder Tension - 8 - - - Mixer Temp - 9 - - - Head Zone 1 Temp - 10 - - - Head Zone 2 Temp - 11 - - - Head Zone 3 Temp - 12 - - - Head Zone 4 Temp - 13 - - - Head Zone 5 Temp - 14 - - - Head Zone 6 Temp - 15 - - - Head Zone 7 Temp - 16 - - - Head Zone 8 Temp - 17 - - - Head Zone 9 Temp - 18 - - - Head Zone 10 Temp - 19 - - - Head Zone 11 Temp - 20 - - - Head Zone 12 Temp - 21 - - - St Sp Zone 1 Temp - 22 - - - St Sp Zone 2 Temp - 23 - - - Dryer Zone 1 Temp - 24 - - - Dryer Zone 2 Temp - 25 - - - Dryer Zone 3 Temp - 26 - - - Dryer Air Flow - 27 - - - Head Air Flow - 28 - - - Dryer Buffer Length - 29 - - - - - d2e09fbf-2ac8-4c32-a4f5-45e50e305098 - 1016 - 821.96460176991263 - 361 - 233.95575221238948 - 0 - -14774017 - - 0 - 9b265a7c-cc48-4c5a-abed-dfa8c8e3099f - 2020-02-09T13:11:03.3185652Z - Process parameters 2 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 100 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - Name - 0 - - - Dyeing Speed - 1 - - - Min Ink Uptake - 2 - - - Max Ink Uptake - 3 - - - Feeder Tension - 4 - - - Puller Tension - 5 - - - Winder Tension - 6 - - - Mixer Temp - 7 - - - Head Zone 1 Temp - 8 - - - Head Zone 2 Temp - 9 - - - Head Zone 3 Temp - 10 - - - Head Zone 4 Temp - 11 - - - Head Zone 5 Temp - 12 - - - Head Zone 6 Temp - 13 - - - Dryer Air Flow - 14 - - - Dryer Zone 1 Temp - 15 - - - Dryer Zone 2 Temp - 16 - - - Dryer Zone 3 Temp - 17 - - - Dryer Buffer Length - 18 - - - Head Air Flow - 19 - - - Process Parameters Tables Group Guid - 20 - - - Table Index - 21 - - - - - 11f4748e-ed30-48d6-a08a-afeaa0277e2e - 330 - 12.154867256637203 - 205 - 90.181415929203524 - 0 - 1778C1A7-AFB5-42F9-9E00-E80D30D9FC02 - -1 - 10 - 2 - - - dcf78507-ea09-4529-b635-ec1eeed31141 - 145 - 842.58849557522137 - 357 - 215.82743362831855 - 0 - FE0D0A56-5795-4C5A-8E09-939FBB35C441 - -14774017 - 1275 - 0 - 100 - true - 2 - - - 85762a06-25d4-457a-9974-7eab916d65c5 - 540 - 4.0486725663717493 - 205 - 90.181415929203524 - 0 - 055D0A38-09BD-490D-9852-12B06A4B22F2 - -1 - 10 - 0 - - - - - Thread - - - 50bae43f-8b1a-4279-9238-b976a0c72af3 - 1530 - 193.19911504424795 - 169 - 181.37610619469029 - 0 - A8DB1D27-6B25-4FB4-A3F5-46A29BA51955 - -1 - 10 - 2 - - - 68eef943-2151-4df5-be61-044c3865606e - 1172 - 145.78318584070678 - 175 - 167.827433628319 - 0 - 96B89605-F999-43FE-A1CD-2645BFB33A36 - -1 - 10 - 0 - - - 6be024c6-3d1b-4267-9b77-44473aba56b7 - 988 - 143.32300884955998 - 190 - 167.09734513274049 - 0 - FC60060A-3736-4910-B41A-FF6DABDF0E9E - -1 - 10 - 0 - - - 7c720f3b-00e1-49dd-92f9-fdd1e9686623 - 817 - 142.42035398230098 - 169 - 168.31858407079625 - 0 - 4CE6A82E-D841-4D33-BBB2-11F0743A441C - -1 - 10 - 0 - - - 3ebd6759-521b-4ed1-a353-ee1ad7801f28 - 922 - 516.43362831858417 - 439 - 304.995575221239 - 0 - D126DB23-784B-4F0C-8F88-D89A65A7549F - -14774017 - 1460 - 0 - 16384 - true - 1 - - - 984b4126-3dda-4624-a79f-0646eb0e1358 - 465 - 515.420353982301 - 439 - 304.995575221239 - 0 - 10102BC3-0EAE-47FF-A8E5-8640780CAA3D - -14774017 - 1516 - 0 - 16384 - true - 1 - - - 8ebc3ab7-a02d-4b12-93b3-2563443831d7 - 15 - 518.46017699115032 - 439 - 304.995575221239 - 0 - C0BCCD5C-346B-4C4A-A080-39D28E9E1A0C - -14774017 - 1398 - 0 - 16384 - true - 1 - - - acafb268-5e97-4277-8dc8-173250a9e3f8 - 12 - 13.849557522123973 - 439 - 304.995575221239 - 0 - 9FBC5460-BA59-486B-8D85-BD7D8A959F98 - -14774017 - 1273 - 0 - 100 - true - 1 - - - be4cb8d9-b516-4604-a6a5-1638cbc50251 - 860 - -24.18584070796669 - 345 - 169.21681415929209 - 0 - 4CE6A82E-D841-4D33-BBB2-11F0743A441C - -14774017 - 514 - 0 - 100000 - true - 1 - - - 75b99507-4eba-4b11-b52e-26732d4c5479 - 19 - 324.14159292035305 - 429 - 193.26548672566258 - 0 - F1DF490B-0577-4FA7-ACA1-0EEF4F934E8F - -14774017 - 1398 - 0 - 100 - true - 4 - - - a30e48de-be76-4230-92d0-d27d6f37b940 - 474 - 320.03097345132551 - 429 - 193.26548672566258 - 0 - 5F12B974-2C9E-4DDD-9B20-733251A5D7E6 - -14774017 - 1398 - 0 - 100 - true - 4 - - - 5ac4b368-093a-4192-98d4-e9d24f229b13 - 928 - 321.64601769912122 - 429 - 193.26548672566258 - 0 - 84CF23C9-D20D-4C08-BE1D-80201FC43C06 - -14774017 - 1398 - 0 - 100 - true - 4 - - - 9c34dc69-cfaa-48b4-9d02-8f0d9bba79dd - 1303 - 34.380530973454768 - 176 - 83.05309734512457 - 0 - -1 - - 89B7B89D-8050-4188-B568-35B1910CFB6F - 96B89605-F999-43FE-A1CD-2645BFB33A36 - 84CF23C9-D20D-4C08-BE1D-80201FC43C06 - FC60060A-3736-4910-B41A-FF6DABDF0E9E - 5F12B974-2C9E-4DDD-9B20-733251A5D7E6 - 9ADF7823-B293-4275-9999-F62474D246AA - 4CE6A82E-D841-4D33-BBB2-11F0743A441C - F1DF490B-0577-4FA7-ACA1-0EEF4F934E8F - - - - be5b2c37-4481-4293-b957-bf65d8516fee - 464 - 21.274336283185846 - 315 - 177.3230088495576 - 0 - -1 - 20 - - - aace77b8-02ca-4c88-abc1-590fc2592b99 - 1355 - 146.70796460176933 - 175 - 167.827433628319 - 0 - 89B7B89D-8050-4188-B568-35B1910CFB6F - -1 - 10 - 0 - - - - - Dispensers - - - dce78f33-c966-4848-8c6e-a4a01dbc7577 - 1322.1428571428571 - 214.15929203538531 - 159 - 215.8274336283186 - 0 - 2CC8E461-E91F-4D4C-A402-922477F06C87 - -1 - 800 - Dispenser 1 - - - 2d03fc19-0502-43e1-a3ff-4012a612112b - 1149 - 218.48230088495342 - 159 - 215.8274336283186 - 0 - C8D8FE90-0375-44A2-A6D1-E997789E065C - -16724737 - 1200 - Dispenser 2 - - - 81958374-3fa3-48b3-a554-5653fe1934b1 - 959 - 210.32743362830422 - 156 - 215.8274336283186 - 0 - 08ED9044-CAD6-4492-94B2-C07206E0164B - -65325 - 1200 - Dispenser 3 - - - 8fead411-7198-4428-a364-e32f3035ed94 - 775 - 206.42920353980952 - 159 - 215.8274336283186 - 0 - 179F34BB-3252-4D3A-965C-E6EB43D6FE7C - -524544 - 1200 - Dispenser 4 - - - 31bfa89f-e64d-4a3b-8585-c4a1b2e5a139 - 585 - 208.47345132741418 - 159 - 215.8274336283186 - 0 - 716B35CF-46E0-47D5-AF85-5233D212568F - -2108246 - 1200 - Dispenser 5 - - - c2bff5f3-6dc9-4b07-87ba-9e3a5814804e - 372 - 216.75221238937439 - 159 - 215.8274336283186 - 0 - 99528449-4D76-4874-AB95-522951560E01 - -263685 - 1200 - Dispenser 6 - - - 071281a5-3569-4a62-8b68-7bea850a3c07 - 217 - 211.63716814158107 - 159 - 215.8274336283186 - 0 - E8ED07E2-7C36-459C-B9E5-6A23A1E24F03 - -723724 - 1200 - Dispenser 7 - - - 7b703b9a-a626-4ae5-8e31-fa1cfe5718f4 - 45 - 216.04867256635521 - 159 - 215.8274336283186 - 0 - 8A957565-4165-49F7-854D-D21F95FFBE1B - -724238 - 1200 - Dispenser 8 - - - caca40a2-310c-452e-adcf-c28ee38f6bdc - 1305 - 31.606194690259713 - 150 - 156.04424778761069 - 0 - 1F0F907A-EC16-4386-AFC8-B2B156F2A822 - -15856114 - 10 - 2 - - - af52d36f-27a2-4a31-8ceb-9c43fedbed22 - 1127 - 32.535398230081626 - 150 - 156.04424778761069 - 0 - A499E5E0-A812-4032-8F96-B38C6762C4BD - -15293470 - 10 - 2 - - - d40eada8-d22a-4521-bd2a-d998ed93106f - 955 - 32.61946902653176 - 150 - 156.04424778761069 - 0 - 6B1DF4B0-BCC2-400C-A3B7-31C5119A55BB - -1570857 - 10 - 2 - - - b2d6364d-8b5c-43d2-8838-927c85b017b1 - 774 - 31.960176991142362 - 150 - 156.04424778761069 - 0 - F33667BD-D9FA-4DC7-BC2C-0E89E60AE4BE - -1379575 - 10 - 2 - - - 3980e685-73b3-4af1-9593-9235be147322 - 596 - 32.889380530964274 - 150 - 156.04424778761069 - 0 - 19645882-6587-4A50-BD85-AF06617DC654 - -7763381 - 10 - 2 - - - 51465293-58d5-40a4-8302-81856f8b4f47 - 424 - 32.973451327414409 - 150 - 156.04424778761069 - 0 - AF3FD56C-95BF-4DE1-8EDC-8426B0DB2A26 - -1 - 10 - 2 - - - c2a8c5b2-891b-4f9f-862c-c1c294366c78 - 252 - 31.703539823006281 - 150 - 156.04424778761069 - 0 - 60DA9EA3-C8A6-4D41-8AD8-3EB1BAA79CC9 - -8391822 - 10 - 2 - - - 9618e441-8973-4e16-a90b-06ce5798bd29 - 80 - 31.787610619456416 - 150 - 156.04424778761069 - 0 - EF66F95A-E166-4FA2-B1AF-D6F55621817A - -2186185 - 10 - 2 - - - bce8c8e8-a317-4991-9aa7-cd99a45d1509 - 28.22352941176473 - 682.03174474303751 - 247 - 122.24778761061873 - 0 - 66cc8510-db9c-4e13-9151-01e705ec04de - -1 - - - 72a23702-31bb-4ab8-aee5-2a02bcb1270b - 235.16470588235291 - 699.99460095802579 - 200 - 94.15929203539747 - 0 - 36ba0ba4-e41d-45ff-8f68-1699e00c7107 - -1 - - - 2dd6ff17-e515-4d8f-814f-a9683f404a8e - 140 - 867.73893805310092 - 160 - 85.49115044247776 - 0 - 78482AA4-3DF6-421F-944C-64328D3C3EF2 - -14774017 - 10 - 0 - 70 - true - - - 06843009-1da0-4811-8e77-50576d0edcb1 - 507 - 792.77433628318749 - 219 - 125.75221238938025 - 0 - 0c5dc1e9-da17-4ff8-86aa-6b39fd796ba9 - -16777216 - - - 935dddd0-0c6f-4766-8173-f9118006a12b - 1303 - 475.87168141593065 - 160 - 124.6504424778754 - 0 - B2164815-FBF3-4CF8-81D8-20F719626664 - -15856114 - 10 - 2 - - - 97e39a59-dba8-4e42-a124-b37de9453baf - 370 - 781.46902654866153 - 710 - 401.24778761063465 - 0 - D023F15D-3555-48E9-A9E9-5DF99F60D791 - 0 - 1956 - 0 - 100 - true - 2 - - - 46bdfce3-1c69-45dd-bbe9-582d1ac1e6f2 - 1128 - 482.80530973451141 - 140 - 117.32300884955743 - 0 - 0FE216B2-A097-4F2C-B465-08593F2532B3 - -15293470 - 10 - 2 - - - 429154a5-9a16-4423-85ca-ee4bae9aec3c - 968 - 481.35398230088504 - 140 - 117.32300884955743 - 0 - 3271FD82-46D3-4789-B612-564967826C75 - -1570857 - 10 - 2 - - - 0f6ab8e8-99a7-4468-bde8-690a63467688 - 766 - 476.07964601769811 - 140 - 117.32300884955743 - 0 - FBB806E7-42FA-4BAA-BDA1-3B8B07913AAD - -1379575 - 10 - 2 - - - bc0ac903-9c1f-4580-8b9e-670a76350473 - 586 - 474.38938053097161 - 140 - 117.32300884955743 - 0 - 436A22BB-AF79-4CB2-8A7D-DD4D9E54A81E - -7763381 - 10 - 2 - - - f9c960b2-b93e-46d5-b892-30337c0b55af - 391 - 474.87168141592781 - 140 - 117.32300884955743 - 0 - 89EA6CC8-5363-4BEC-A370-D906611087A7 - -1 - 10 - 2 - - - 5ac157ab-2d53-4307-bf0b-b069854701ac - 226 - 471.66814159292005 - 140 - 117.32300884955743 - 0 - D5EBE52B-E2DF-4C97-80B1-F111F6B15854 - -8391822 - 10 - 2 - - - 65a19d7e-c524-48a0-bd70-28b99b113dd1 - 69 - 473.97787610619389 - 140 - 117.32300884955743 - 0 - FE521D1B-A0EA-4FEA-AE64-33998A6CE138 - -1 - 10 - 2 - - - 5bf7a681-ee47-477e-8b47-ba7a2eb6e115 - 1130 - 624.9557522123913 - 144 - 80.495575221237516 - 0 - 3174ADCF-5793-4B5A-A3C6-B96E146A903D - -1 - 10 - 0 - - - 29b17a4b-fd4e-49cc-a3cd-418730176bf7 - 969 - 625.95575221239 - 144 - 80.495575221237516 - 0 - AD50C358-5BAF-4A2F-8593-51A22C85B3D1 - -1 - 10 - 0 - - - 21a5429f-c3a2-4e3b-ae77-c5538f30130d - 775 - 623.66814159292062 - 144 - 82.535398230087083 - 0 - E2F0FC31-CE7E-416B-ACEA-8EB6CA9B850B - -1 - 10 - 0 - - - 96a46b0c-37b1-4457-93fb-b3dc301c5743 - 588 - 625.06637168141322 - 144 - 80.495575221237516 - 0 - 37872FE8-D68A-45BC-A441-372B7805C09F - -1 - 10 - 0 - - - d4ad8603-9929-415f-9990-1869fcff36e4 - 1310 - 628.69469026548632 - 144 - 80.495575221237516 - 0 - 84682E90-6926-42AA-BF8C-2CCCF5C26C97 - -1 - 10 - 0 - - - 25249d78-ee37-42a8-b5aa-96f60e97c3ea - 20.870588235294122 - 784.26605504587133 - 327 - 108.53097345133028 - 0 - 8B1FCBC3-FEEA-4F87-B56F-CE5D28B7ACA4 - -1 - - - fc1d62f7-d13b-4a7b-8f9f-c687c987c7a9 - 1065 - 788.41592920352355 - 370 - 362.10619469026585 - 0 - 1F0F907A-EC16-4386-AFC8-B2B156F2A822 - -14774017 - 1426 - 0 - 100 - true - 3 - - - cc99a514-1498-4b93-a4eb-4e0a2a2e9de6 - 628 - 765.4469026548752 - 394 - 372.88495575221242 - 0 - A499E5E0-A812-4032-8F96-B38C6762C4BD - -14774017 - 1282 - 0 - 100 - true - 1 - - - cdddd48e-422d-48f4-8397-5032c3705fdb - 1069 - 698.04867256637226 - 382 - 136.79203539823016 - 0 - 04C58CA0-9719-4BB0-8D3B-D4C71129D8E4 - -1 - - - ee6d4c5a-ca5b-4557-8012-dacf700cdc08 - 231 - 624.06637168142413 - 144 - 80.495575221237516 - 0 - 37872FE8-D68A-45BC-A441-372B7805C010 - -8391822 - 10 - 0 - - - 20576bb2-202f-4170-9af5-f3c18b410112 - 77 - 624.46460176991513 - 144 - 80.495575221237516 - 0 - 37872FE8-D68A-45BC-A441-372B7805C011 - -2186185 - 10 - 0 - - - - - Thread insertion - - - 443a977c-8e89-4a56-82e4-684bac7945c9 - 25 - 22.761061946902203 - 247 - 172.25663716814159 - 0 - 08d15ca1-d7d1-460f-8f37-42c37c287cd1 - -1 - 500 - - - a821b716-cb7d-4951-84ee-e56955431099 - 355 - 20.592920353981697 - 260 - 153.00442477876106 - 0 - b90a4e78-ebbf-44db-829b-949517d6400b - -1 - 350 - - - e36e321b-d48d-4199-a1ee-75ac18e9de1e - 694 - 19.367256637167998 - 217 - 155.26106194690203 - 0 - b7c1aea4-32c1-41cb-bca3-4aa665529b49 - -1 - 350 - - - 8790db03-4dfd-4d49-aec0-706babb55af9 - 396 - 244.37610619468319 - 240 - 172.30973451327589 - 0 - 2d3eaca5-4dfd-40d9-9d1f-aa4ae794eddc - -1 - 500 - - - 69ebcb28-13d9-41b3-a9ef-b2be51584141 - 36 - 245.4955752212249 - 255 - 170.15044247787392 - 0 - c6099065-a735-4cc5-b575-c31a45bb9262 - -1 - 400 - - - 4d562029-3fdf-40a4-a5a7-9a322253c912 - 1168 - 47.305309734517039 - 304 - 167.26548672566202 - 0 - -1 - 40 - - - 92607e12-2dd6-41c9-8f89-f051f386b734 - 1316 - 380.876106194693 - 240 - 144.699115044238 - 0 - DCE08A06-6711-43AE-AB7C-EADD5AB70EE0 - -1 - - - 7b5b6896-f626-4e59-a5cf-2600e603c0f6 - 723 - 241.30530973452125 - 237 - 179.22123893805463 - 0 - 7b6d0a93-5a91-4e1f-af47-353afd8b5ea6 - -1 - 20 - - - 2052a2d3-843c-4a1c-87fd-acd0832fd1b9 - 85 - 589.09734513273827 - 220 - 168.473451327436 - 0 - c9482395-35e6-4340-8dab-83d5dfe907a7 - -1 - 2200 - - - 339b7d00-d688-41cf-926a-8171d5e62740 - 403 - 591.712389380534 - 240 - 159.84070796460173 - 0 - f3b5076e-cba3-4ad2-b3cc-0c4e907bd9ef - -1 - 400 - - - 7644a8f9-00a2-4e37-8f48-0667b1541114 - 1047 - 251.86283185840875 - 233 - 159.57079646017985 - 0 - bda5aa4d-13aa-4259-92e5-b969276cb2b1 - -1 - 500 - - - c706d31b-48b0-44cc-a9c4-11d3acdcf667 - 535 - 441.07493391564333 - 269 - 127.67256637168134 - 0 - 2a454081-bd5e-41de-ae5d-97aefe1d76de - -1 - - - 7ccff69d-50f9-4e9b-a997-72a67917df5e - 727 - 590.61504424779025 - 241 - 154.99115044247867 - 0 - 7c03f12f-ab2a-4421-8575-aefd6dec0001 - -1 - 500 - - - a88a74cb-418b-4ed0-89ec-c42ff560528e - 1073 - 593.7123893805292 - 227 - 145.08849557522183 - 0 - 4d097acc-df45-46af-bb7e-3d177ab27a9b - -1 - 2 - - - 37267035-ae9d-4c72-a04f-215f754d0900 - 283 - 451.07079646016848 - 240 - 116.10176991150968 - 0 - 8a65badb-3d7d-4b7b-8dcd-783e443b0689 - -1 - - - ca4a5397-68a1-4a2f-b614-80132cd513ee - 52 - 452.20353982301083 - 240 - 116.10176991150968 - 0 - 6f48e18c-d472-425a-ba7e-633630605e11 - -1 - - - - - Head graphs - - - ffe980da-dbbe-4bac-9595-46f587e9df00 - 3 - 5.8097345132742362 - 363 - 157.76991150442467 - 0 - 0E4783A1-B8DE-451E-B357-322C39E448FB - -14774017 - 2962 - 0 - 300 - true - 2 - - - 81b78212-14d8-4a66-bf3a-eeea9900e0d6 - 371 - 21.075221238938013 - 128 - 91.469026548670342 - 0 - AA1CF164-76FE-49C6-AA73-0EBA29816E92 - -1 - - - 3941a557-05e6-4c1b-bb98-4f2a59892431 - 517 - 11.517699115044195 - 103 - 113.4867256637167 - 0 - 188285E5-1493-4BED-8269-91743770A631 - -1 - - HeaterZone7 - 0 - 77.96 - false - false - true - - 0 - - - 7e0942e7-a87a-402a-b580-5091ed6b29ee - 8 - 276.6194690265491 - 357 - 143.58407079645986 - 0 - 0E4783A1-B8DE-451E-B357-322C39E44809 - -14774017 - 2962 - 0 - 300 - true - 2 - - - 064bd571-4250-4ea3-8ed5-96f1ddc8fe6b - 374 - 280.73893805309746 - 128 - 91.469026548670342 - 0 - 8FEB7F10-E1FB-465A-A987-6E8659C2186A - -1 - - - 4845ec5b-067b-43c2-aaf1-314dcb358a7c - 519 - 283.3407079646019 - 103 - 121.59292035398221 - 0 - 63E2AFE0-0746-4AAB-AA74-C26EC1F282AE - -1 - - HeaterZone9 - 0 - 78.1 - false - false - true - - 0 - - - 85b25b0b-cd3d-4a8a-88f5-f832623d7ec2 - 8.75 - 704.87334618417651 - 350 - 152.70353982300856 - 0 - 0E4783A1-B8DE-451E-B357-322C39E44812 - -14774017 - 2962 - 0 - 300 - true - 2 - - - 85e9ecc2-3bce-4055-89a9-1712752898a9 - 375.66666666666663 - 902.19714360816624 - 128 - 91.469026548670342 - 0 - 500698E0-5623-4A47-9537-FCAAF5D0B725 - -1 - - - 8d9b0d4b-ac5e-4c17-b7eb-4d59825064c7 - 523.04166666666652 - 895.90015771488663 - 103 - 121.59292035398221 - 0 - F39B952A-6194-4055-A5CB-A3421BFE0F9B - -1 - - HeadCoverHeater2 - 0 - 283.75 - false - false - true - - 0 - - - 63ccee8d-ce38-4c69-b8d1-141f320d11f9 - 6 - 563.37610619469046 - 358 - 141.55752212389359 - 0 - 0E4783A1-B8DE-451E-B357-322C39E44811 - -14774017 - 2962 - 0 - 300 - true - 2 - - - 5ed86083-bdd6-4648-b7ca-f17fa97f034a - 379 - 573.57522123893818 - 128 - 91.469026548670342 - 0 - C113AA1D-25F5-4095-A1F3-18BEDFC0EEEE - -1 - - - 8269194e-5348-4367-8ae9-e6c0647febaf - 523 - 571.1106194690268 - 103 - 116.52654867256626 - 0 - D41BBB23-6EB5-4743-89DB-9191000B475F - -1 - - HeaterZone11 - 0 - 74.32 - false - false - true - - 0 - - - 182492d7-b240-4162-b8ec-39996eec3cc7 - 9 - 418.47787610619497 - 353 - 145.61061946902635 - 0 - 0E4783A1-B8DE-451E-B357-322C39E44810 - -14774017 - 2962 - 0 - 300 - true - 2 - - - e8130372-e0ee-4c1c-a43d-4ab15ff57bd8 - 378 - 430.703539823009 - 128 - 91.469026548670342 - 0 - DCCCCF68-5895-40BE-9E90-1FA35E44D2E4 - -1 - - - af0d953f-45de-4c0d-9eeb-d7a5c17681e4 - 519 - 428.23893805309746 - 103 - 121.59292035398221 - 0 - B4D0A1C8-711C-49A9-82A3-B5B9F35FC131 - -1 - - HeaterZone10 - 0 - 74.7 - false - false - true - - 0 - - - 00dda04e-1853-422f-ac47-29bdbab642d7 - 7 - 142.86725663716828 - 357 - 152.70353982300867 - 0 - 0E4783A1-B8DE-451E-B357-322C39E44808 - -14774017 - 2962 - 0 - 300 - true - 2 - - - e7935033-56c6-42a4-a2b3-f5eedb0a11e7 - 382 - 151.03982300884968 - 128 - 91.469026548670342 - 0 - E772ECA1-24EB-446A-AB28-F5E3D853B9F6 - -1 - - - b339a7c0-7555-4e54-9834-6193ed7c2b7a - 519 - 147.561946902655 - 104 - 109.43362831858406 - 0 - 461FA2D7-1918-4958-AAA7-37A1A329FA12 - -1 - - HeaterZone8 - 0 - 79.4 - false - false - true - - 0 - - - 40d16753-8448-4af9-8fbd-98c1ed301de5 - 623 - 117.5353982300885 - 363 - 157.76991150442467 - 0 - D7585119-4A42-4370-8F1E-F3E62553E588 - -14774017 - 2962 - 0 - 300 - true - 2 - - - b3826c8e-1d82-4f4f-ad9f-d88f257dffb2 - 1005 - 12.221238938053205 - 128 - 91.469026548670342 - 0 - d59b64f7-a8cf-4a2b-935a-943ae35fb78c - -1 - - - d3631074-68c4-4377-b0c5-9213a6b1b2c0 - 1148 - 293.47345132743362 - 103 - 113.4867256637167 - 0 - 8E764A14-0F84-4FEC-928B-32A2509CAD57 - -1 - - HeaterZone3 - 0 - 70.97 - false - false - true - - 0 - - - 99af8946-4971-4913-9382-705c4e05b7ce - 621 - 275.60619469026591 - 363 - 157.76991150442467 - 0 - 098F7CAB-030C-46B0-B2B8-A85AF2253032 - -14774017 - 2962 - 0 - 100 - true - 2 - - - 233f0076-7595-4ecb-8496-41eeb7b457ea - 993 - 279.72566371681404 - 128 - 91.469026548670342 - 0 - 9de55ec4-201f-4f62-9003-f63ebea06f8f - -1 - - - f815ebb5-61af-45ff-8109-5f5e717a5c4d - 1146 - 14.823008849557596 - 103 - 113.4867256637167 - 0 - 27E7BB74-81C3-4EF2-80AE-962F111C441F - -1 - - HeaterZone1 - 0 - 57.9 - false - false - true - - 0 - - - 7b7d9bea-29df-4f94-8ab6-2a6d7105bccf - 627 - 6.07522123893807 - 363 - 157.76991150442467 - 0 - A8DB1D27-6B25-4FB4-A3F5-46A29BA51955 - -14774017 - 2962 - 0 - 300 - true - 2 - - - 72d7192b-dd27-4064-9f5f-90062388a81c - 1003 - 151.03982300884974 - 128 - 91.469026548670342 - 0 - df38139e-0026-46bc-b72f-df5f9eec80f7 - -1 - - - 915f8dfc-5407-43ca-a0c7-d774867dfb5f - 1145 - 153.64159292035396 - 103 - 113.4867256637167 - 0 - B4EE8CC0-EE2B-4ABE-BF09-9226860E756B - -1 - - HeaterZone2 - 0 - 67.04 - false - false - true - - 0 - - - 64fba32f-3c03-42b3-b1ed-e2bdbe454bd6 - 630 - 535.00442477876129 - 363 - 157.76991150442467 - 0 - 246C2551-5EFD-48E9-94F6-6313C5E5018F - -14774017 - 2962 - 0 - 300 - true - 2 - - - 5f451443-fab2-4bf6-8f21-5e038ca2c726 - 1008 - 707.327433628319 - 128 - 91.469026548670342 - 0 - 16D0DEF7-A2E0-4163-9F4B-FBEC2573BCC7 - -1 - - - e5c1becb-1402-45fa-b252-60a03d4401cc - 1150 - 716.00884955752235 - 103 - 113.4867256637167 - 0 - D2B6CAA0-055E-4871-8D91-A5370F1ACB22 - -1 - - HeaterZone6 - 0 - 73.69 - false - false - true - - 0 - - - 4f3b4ecd-759a-4ba5-80f3-74cc485d7085 - 629 - 387.066371681416 - 363 - 157.76991150442467 - 0 - 6C0C1AB0-3EE9-40D7-8424-A79436FBC804 - -14774017 - 2962 - 0 - 300 - true - 2 - - - 665593d6-e689-459e-94f9-2cdcce6150ac - 1004 - 562.42920353982311 - 128 - 91.469026548670342 - 0 - d28bfa3c-edce-4f19-a296-3da251fcc0e2 - -1 - - - 42b4b029-e8bc-4156-b6c1-bb64aae83f9e - 1149 - 571.1106194690268 - 103 - 113.4867256637167 - 0 - D6771DF4-771E-4D62-B6BA-BDE361C0A0F3 - -1 - - HeaterZone5 - 0 - 72.69 - false - false - true - - 0 - - - 60dff2b2-7ddc-47a9-90b1-3f45968c1790 - 630 - 692.06194690265511 - 363 - 157.76991150442467 - 0 - DACEBF90-E2B4-4CC9-A973-B8B429AA0089 - -14774017 - 2962 - 0 - 300 - true - 2 - - - b53a74f3-8e91-40ce-b980-c5b237baeee9 - 1002 - 413.47787610619491 - 128 - 91.469026548670342 - 0 - 81a3ae80-f4ea-4857-bc4e-2055d3b5fbc7 - -1 - - - 8c438e59-d87c-46d2-8050-acc8a0c455d7 - 1148 - 434.31858407079636 - 103 - 113.4867256637167 - 0 - 94574D69-46E1-4144-A8B5-D4BF0DA96D18 - -1 - - HeaterZone4 - 0 - 73.54 - false - false - true - - 0 - - - f786b4da-3291-4ccb-a280-196fd8697ac1 - 5.7499999999999858 - 866.06435643564362 - 350 - 152.70353982300856 - 0 - 0E4783A1-B8DE-451E-B357-322C39E448DD - -14774017 - 2962 - 0 - 300 - true - 2 - - - 584c7f29-49cc-4845-a7ab-09239bd3a986 - 377.875 - 735.75944098834611 - 128 - 91.469026548670342 - 0 - 96A8AF31-B489-4FA2-BF99-C66D7DEC94C8 - -1 - - - 5c6da8d4-bd2e-44cc-8d99-a6b8bca7df3f - 524.20833333333337 - 721.52681153071046 - 103 - 121.59292035398221 - 0 - 2D578A37-D808-40D0-ACE4-4A868EDD6BDC - -1 - - HeaterZone12 - 0 - 72.72 - false - false - true - - 0 - - - 05eab3d7-3af6-4d3f-b3b3-468eeb77a503 - 644.29166666666674 - 874.00000000000011 - 350 - 152.70353982300856 - 0 - 0E4783A1-B8DE-451E-B357-322C39E448CC - -14774017 - 2962 - 0 - 300 - true - 2 - - - c1f48bf1-9cb3-475a-b152-e8b9a211b694 - 1010.1666666666667 - 895.60597564181194 - 128 - 91.469026548670342 - 0 - 7FCA67CB-785B-49F7-B9F2-191E3ACC6CB7 - -1 - - - c5fbeda2-230d-40e4-9d52-5b3236e0c561 - 1161.708333333333 - 885.907999649522 - 103 - 121.59292035398221 - 0 - F8C1BA7F-F6DF-414D-BAF5-D4CB292F91F6 - -1 - - HeadCoverHeater1 - 0 - 283.75 - false - false - true - - 0 - - - - - waste - - - bb9bf273-0a3d-4202-98ce-37a5f206ed75 - 119 - 68.898230088495609 - 339 - 184.4159292035398 - 0 - 7e1f53ec-8176-4efa-ac3d-c8f2436e60d1 - -1 - - - 59678a51-f995-4952-b250-e449f1fcbeac - 468 - 80.336283185839477 - 280 - 166.17699115044252 - 0 - 78db28d0-0407-4942-bb62-c44da81c4f9e - -1 - - - 8f9ff579-0e9d-4f48-8ed0-6fa563f2aba7 - 873 - 63.831858407079665 - 174 - 133.75221238938059 - 0 - 06bd7c0b-5aef-445a-86c0-853becf8594b - -1 - - - 70d1bd1e-acdb-436a-b205-6eeb9d137120 - 1070 - 70.106194690265909 - 221 - 123.61946902654864 - 0 - 4048bf02-27dc-4049-9284-fe913a7e0ebe - -1 - - - dcc7ce16-5b89-4ff8-acd5-7fb0b9ebb6d1 - 877 - 248.24778761061947 - 186 - 126.65929203539827 - 0 - 00ea1771-efee-4f3e-a0d2-8b2a4214e9fd - -1 - - - 2b99bbf7-94da-4bb2-acc9-91b35e543c5d - 897 - 358.69469026548683 - 147 - 69.9159292035398 - 0 - -14774017 - Waste lower presence - - - c150533c-abe4-4edf-b6ad-fa475b133142 - 1112 - 253.66814159291806 - 186 - 126.65929203539827 - 0 - d2f266e3-779b-4dfe-b513-26ce61c529a4 - -1 - - - d96f2a6d-0ccb-401e-8931-09086ca81fae - 1143 - 366.78318584070507 - 147 - 69.9159292035398 - 0 - -14774017 - Waste middle presence - - - bb9847ba-9671-4613-bf23-a0c637ebc79d - 151 - 271.55309734513281 - 200 - 63.836283185840671 - 0 - -14774017 - pump - - - d13a2df4-3f54-4c31-8f9a-ee7810fb6af5 - 504 - 283.71238938053096 - 192 - 67.88938053097354 - 0 - -14774017 - valve - - - a79322a7-fbb8-469b-a4d9-a0ffb3c17a5d - 639 - 358.69469026548683 - 134 - 99.300884955752167 - 0 - 94F3E5A1-413E-4EA0-BDE1-F0625BFF7910 - -1 - 10 - 2 - - - 979459b4-b609-487f-b6d7-55f435659658 - 1027 - 391.93362831858775 - 118 - 93.221238938053034 - 0 - FE0D0A56-5795-4C5A-8E09-939FBB35C441 - -1 - 10 - 2 - - - 8b11bfca-091d-4461-8713-ba2fd9c8484e - 432 - 511.69911504424789 - 461 - 250.27876106194691 - 0 - 94F3E5A1-413E-4EA0-BDE1-F0625BFF7910 - -14774017 - 419 - 0 - 100 - true - 2 - - - 8aa4b451-71d6-429c-94e4-2581e3c62a7a - 956 - 513.80973451327361 - 461 - 250.27876106194691 - 0 - FE0D0A56-5795-4C5A-8E09-939FBB35C441 - -14774017 - 419 - 0 - 100 - true - 2 - - - 1f85047c-0b3e-49c6-a80a-c2585de00a81 - 288 - 366.80088495575222 - 217 - 97.2743362831859 - 0 - B6FE07F8-2435-495D-ABFE-358C76812413 - -1 - - - c296a84d-7af4-4a26-9a35-0b82d378edce - 41 - 351.6017699115045 - 209 - 120.57964601769913 - 0 - 1778C1A7-AFB5-42F9-9E00-E80D30D9FC0A - -1 - 10 - 2 - - - ab6714cc-04d8-471f-a263-db28c30e229d - 59 - 550.2035398230089 - 294 - 171.24336283185835 - 0 - 78482AA4-3DF6-421F-944C-64328D3C3EF2 - -14774017 - 10 - 0 - 7000 - true - - - cde1d5a8-7238-44b8-8d4e-30a2dba70c12 - 1294 - 166.17256637168146 - 217 - 132.73893805309734 - 0 - 2a454081-bd5e-41de-ae5d-97aefe1d76de - -1 - - - - - disp - - - f9531a72-3742-47a7-86bb-b589f8b3eb55 - 123 - 128.33628318584061 - 390 - 249.67699115047321 - 0 - A499E5E0-A812-4032-8F96-B38C6762C4BD - -14774017 - 3600 - 0 - 100 - true - 3 - - - aae29286-81b3-476a-9f58-c0fd246cae96 - 880 - 158.81415929204155 - 442 - 241.88495575221771 - 0 - F33667BD-D9FA-4DC7-BC2C-0E89E60AE4BE - -14774017 - 3600 - 0 - 100 - true - 3 - - - 7d94c7c4-1288-4f9d-b0e6-a06794829642 - 1055 - 14.181415929203524 - 161 - 111.46017699115049 - 0 - -14774017 - Y - - - c95f9ad1-b607-4606-8217-400bea76f3d6 - 384 - 23.991150442480944 - 161 - 111.46017699115049 - 0 - -14774017 - C - - - 8f141fa5-fb24-4557-adcf-a6aa55a28fb4 - 121 - -8.8495575221214722 - 169 - 132.73893805309734 - 0 - A499E5E0-A812-4032-8F96-B38C6762C4BD - -1 - 10 - 3 - - - 7eab018a-ef43-4bca-a6cf-857d69767bba - 839 - -4.7079646017762684 - 169 - 132.73893805309734 - 0 - F33667BD-D9FA-4DC7-BC2C-0E89E60AE4BE - -1 - 10 - 3 - - - 2a9e89d4-5d60-4a83-9527-cb77fdf35c14 - 1276 - 22.287610619469035 - 187 - 102.34070796460179 - 0 - -1 - - 1F0F907A-EC16-4386-AFC8-B2B156F2A822 - A499E5E0-A812-4032-8F96-B38C6762C4BD - 6B1DF4B0-BCC2-400C-A3B7-31C5119A55BB - F33667BD-D9FA-4DC7-BC2C-0E89E60AE4BE - 19645882-6587-4A50-BD85-AF06617DC654 - 96B89605-F999-43FE-A1CD-2645BFB33A36 - 84CF23C9-D20D-4C08-BE1D-80201FC43C06 - C0BCCD5C-346B-4C4A-A080-39D28E9E1A0C - 10102BC3-0EAE-47FF-A8E5-8640780CAA3D - FC60060A-3736-4910-B41A-FF6DABDF0E9E - 5F12B974-2C9E-4DDD-9B20-733251A5D7E6 - D126DB23-784B-4F0C-8F88-D89A65A7549F - - - - 6d2e7962-b3ae-4682-b20e-9654f48dcffe - 587 - 5.0619469026548813 - 155 - 131.72566371681415 - 0 - 2CC8E461-E91F-4D4C-A402-922477F06C87 - -1 - 500 - Dispenser 1 - - - 5ee2718f-f068-427b-a31e-d586c7d7682c - 131 - 552.94690265486338 - 390 - 249.67699115047321 - 0 - 1F0F907A-EC16-4386-AFC8-B2B156F2A822 - -14774017 - 3600 - 0 - 100 - true - 3 - - - 1c254a92-c075-453f-9667-cdcc91cf8e6a - 399 - 455.67256637168265 - 161 - 111.46017699115049 - 0 - -14774017 - K - - - d1087b1a-c36b-4242-96f5-07c2bb602cc4 - 145 - 409.52212389380446 - 169 - 132.73893805309734 - 0 - 1F0F907A-EC16-4386-AFC8-B2B156F2A822 - -1 - 10 - 3 - - - 53fe93a2-88a5-4d4d-9cd5-eb4d8a8fefae - 604 - 561.16371681414739 - 390 - 249.67699115047321 - 0 - 6B1DF4B0-BCC2-400C-A3B7-31C5119A55BB - -14774017 - 3600 - 0 - 100 - true - 3 - - - 0bef6e9d-6da0-4f06-9e1a-c00142bde4c1 - 832 - 440.91150442477635 - 161 - 111.46017699115049 - 0 - -14774017 - M - - - 762c5a97-a3bc-45b4-aa9f-0b50afa9cb9b - 633 - 434.0132743362783 - 169 - 132.73893805309734 - 0 - 6B1DF4B0-BCC2-400C-A3B7-31C5119A55BB - -1 - 10 - 3 - - - be584f80-3250-494c-87fc-250d6deae051 - 1045 - 559.4070796459921 - 390 - 249.67699115047321 - 0 - 19645882-6587-4A50-BD85-AF06617DC654 - -14774017 - 3600 - 0 - 100 - true - 3 - - - 39f6a02c-c4d9-47d0-b92d-bdea0ed5d3ce - 1056 - 435.43805309733875 - 169 - 132.73893805309734 - 0 - 19645882-6587-4A50-BD85-AF06617DC654 - -1 - 10 - 3 - - - 5b924929-9b16-4598-94cc-b2f4bca26798 - 1304 - 448.0884955752224 - 161 - 111.46017699115049 - 0 - -14774017 - TI - - - 89ae1fa5-1ad1-469e-ae76-0a29c35805cd - 588 - 317.1504424778762 - 283 - 74.982300884955748 - 0 - E144A221-4859-4DC3-9A7E-4A2969FB0826 - -1 - - - c218cf34-74c2-41bb-8c3b-3030abce451a - 1363 - 384.02654867256643 - 156 - 94.234513274336337 - 0 - E144A221-4859-4DC3-9A7E-4A2969FB0826 - -1 - - - 75af30c6-d7f8-4745-bfb5-d6dc5d50479a - 767 - 362.74778761061958 - 283 - 74.982300884955748 - 0 - E144A221-4859-4DC3-9A7E-4A2969FB0826 - -1 - - - df1fd958-fd8a-4b00-98e1-679455494d60 - 309 - 13.168141592920392 - 112 - 107.40707964601768 - 0 - 3174ADCF-5793-4B5A-A3C6-B96E146A903D - -1 - 10 - 0 - - - f07225b3-1522-4cb6-9ba8-5b9697f05467 - 1180 - 60.7920353982301 - 102 - 88.1548672566372 - 0 - E2F0FC31-CE7E-416B-ACEA-8EB6CA9B850B - -1 - 10 - 0 - - - 45b87322-e1f5-42eb-88c6-71c2eeb2899a - 1258 - 463.06194690265494 - 88 - 75.995575221239 - 0 - 37872FE8-D68A-45BC-A441-372B7805C09F - -1 - 10 - 0 - - - 0c1c25e8-3ce3-4994-bbb9-bd6b2367a413 - 810 - 462.04867256637175 - 77 - 80.048672566371636 - 0 - AD50C358-5BAF-4A2F-8593-51A22C85B3D1 - -1 - 10 - 0 - - - fa2f697e-b229-418a-bae6-78b92bf0458b - 336 - 428.61061946902663 - 95 - 96.261061946902657 - 0 - 84682E90-6926-42AA-BF8C-2CCCF5C26C97 - -1 - 10 - 0 - - - - - Priming - - - ea45a516-9dac-4c9a-9261-0c44e22aa065 - 808 - 155.02654867256638 - 219 - 200.62831858407088 - 0 - A499E5E0-A812-4032-8F96-B38C6762C4BD - -1 - 10 - 2 - - - 3e2cb7dc-a5f3-4ba6-a520-2bae8ff0e4a8 - 832 - 451.91592920353986 - 332 - 326.27433628318596 - 0 - C8D8FE90-0375-44A2-A6D1-E997789E065C - -1 - 1200 - Dispenser 2 - - - 6f8dfd8d-ed50-4923-b908-e0b5bc5d6ae5 - 154 - 131.72123893805315 - 474 - 410.37610619469024 - 0 - A499E5E0-A812-4032-8F96-B38C6762C4BD - -14774017 - 1942 - 0 - 100 - true - 1 - - - 604e031b-89c3-4c9d-90ef-7b861a77e5e0 - 243 - 595.80088495575228 - 497 - 189.48230088495575 - 0 - 8B1FCBC3-FEEA-4F87-B56F-CE5D28B7ACA4 - -1 - - - c414ae0e-323a-48c1-9165-2c05cc4234c6 - 1291 - 584.65486725663732 - 200 - 171.24336283185835 - 0 - 0bd10306-2944-4cda-bc59-0264da2883d2 - -1 - - - - - 0 - \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/ArcHead/clean_motor_ls.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/ArcHead/clean_motor_ls.cs new file mode 100644 index 000000000..2a0fc12cf --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/ArcHead/clean_motor_ls.cs @@ -0,0 +1,278 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + + +const Int32 LS_FRONT=0X460110; +const Int32 LS_REAR=0X460120; +const Int32 LS_UPPER=0X460140; +const Int32 LS_SPARE=0X460180; + +const Int32 DyeingHeadLid_Motor = 2; + +const Int32 F1_MOTO_DH_LID_A1_TX_00 = 0x600002F0 ; +const Int32 F1_MOTO_DH_LID_A1_TX_01 = 0x600002F2 ; +const Int32 F1_MOTO_DH_LID_A1_RX_00 = 0x600002F4 ; +const Int32 F1_MOTO_DH_LID_A1_RX_01 = 0x600002F6 ; + +//---------------------Start Command ---------------- +const Int32 CMD_RUN = 0; //Run on Pulse Per Secound .positive run Up and negative run Down +const Int32 CMD_STOP= 1; //0;Hard stop(Defualt);1-Soft stop;2-Hard Hiz;3-Soft Hiz +const Int32 CMD_HOME= 2; //Run until home .positive run Up and negative run Down +const Int32 CMD_DLY = 3; //delay in Seconds . +const Int32 CMD_MOVE= 4; //Move step. positive move Up and negative move Down +const Int32 CMD_MAX_SPEED = 5; //set Maximum speed.motor will stop before that command + +const Int32 CMD_LOOP_NM=6; //NUMBER OF counter +const Int32 CMD_LOOP= 7; //jump up(+) or down(-) command u +const Int32 CMD_END = 13; //end loop . + + +const Int32 x_STEP_MODE = 0x16; +const Int32 x_STATUS = 0x19; +const Int32 x_GET_PARAM = 0x20; +const Int32 x_POWERSTEP01_STATUS = 0x1B; + + +//-------------------------------------------- Flow Test Double PBU ------------------------------------------------ + +Int32[] Start_Table = new int [] +{ + CMD_RUN,-40, + CMD_DLY,200, + CMD_STOP,0, + CMD_DLY,10, + CMD_HOME,40, + CMD_END,3, +}; + +//////////////////////////////////// + +public void OnExecute(StubManager stubManager) +{ +Int32 COMMAND=0; +Int32 Data=0; +Int32 Index=0; +Int32 speed=0; +Int32 Loop_cnt=1; +Int32 j=0; + + + + var stopwatch = new Stopwatch(); + stopwatch.Start(); + + long elapsed_time = stopwatch.ElapsedMilliseconds; + stubManager.WriteLine(elapsed_time); + + while (j!=-1) + { + { + COMMAND=Start_Table[j]; + Data=Start_Table[j+1]; + + switch (COMMAND) + { + case CMD_RUN: + stubManager.WriteLine("CMD_RUN"); + Motor_Run(Data); + break; + + case CMD_STOP: + stubManager.WriteLine("CMD_stop"); + Motor_Stop(Data); + break; + + case CMD_DLY: + stubManager.WriteLine("CMD_delay"); + + for (;Data>0;Data--) + { + Thread.Sleep(100); //100msec delay + stubManager.WriteLine("CMD_delay " + Data ); + } + break; + + + case CMD_MOVE: + stubManager.WriteLine("CMD_move"); + + Motor_Move(Data); + break; + + case CMD_END: + stubManager.WriteLine("CMD_end"); + + j=-3; + break; + + case CMD_MAX_SPEED: + stubManager.WriteLine("CMD_MAX_SPEED"); + + Motor_Max_speed(Data); + break; + + case CMD_HOME: + stubManager.WriteLine("CMD_home"); + + Move_Home(Data); + break; + + + case CMD_LOOP_NM: + stubManager.WriteLine("LOOP_NM" + Data ); + + Loop_cnt=Data-1; + break; + + case CMD_LOOP: + stubManager.WriteLine("CMD_loop"); + + if (Loop_cnt!=0) + { + j = j+2*Data; + Loop_cnt-- ; + } + break; + + default: + break; + + } + + j = j + 2; + + + } + + } + +} +Int32 Motor_Max_speed(Int32 speed) +{ + UInt32 i=Convert.ToUInt32((speed *4/61)*256*256 ) ; + stubManager.WriteHex(i,8); + + stubManager.Run("StubMotorStopRequest" ,DyeingHeadLid_Motor,0); //hold motor + + + Motor_SetParam(F1_MOTO_DH_LID_A1_TX_01,F1_MOTO_DH_LID_A1_TX_00,0x07,i); //set max speed + + return 1; +} + + +int Motor_SetParam(Int32 HighAdr, Int32 LowAdr, Int32 ParaAddr, uint ParaData1) +{ + + Int32 Temp = 0; + Temp = (ParaAddr << 8 ) + ( (Int32) ParaData1 >> 24); + + stubManager.Run("StubFpgaWriteRegRequest" ,HighAdr, (Temp & 0xffff)); + Temp = ((Int32)ParaData1 >> 8) & 0xffff; + stubManager.Run("StubFpgaWriteRegRequest" ,LowAdr, (Temp)); + + return 1; +} + +Int32 Move_Home(Int32 speed) +{ + Int32 Bit = 1; + if (speed <0 ) + stubManager.Run("StubMotorRunRequest" ,DyeingHeadLid_Motor, false, (-speed) ); + else + stubManager.Run("StubMotorRunRequest" ,DyeingHeadLid_Motor, true, speed); + int i=0; + while ((Bit != 0x0)&& (i<20000) ) //wait until Limit Switch or timeout 200*50msec=10sec + { + Bit=read_pio (LS_FRONT); // read LS_FRONT + Thread.Sleep(20); + i++; + } + stubManager.Run("StubMotorStopRequest" ,DyeingHeadLid_Motor,0); //hold motor + return 0; +} + +Int32 read_pio(Int32 i2c_input) +{ + Int32 temp=0; + var response = stubManager.Run("ProgressRequest" ,0x0EAD,i2c_input); // read break + + temp = (Int32) (response.Progress); + stubManager.WriteHex(temp, 4); + stubManager.WriteLine(" "); + temp =temp & (i2c_input& 0xff); //if break ok + + return temp; +} + + + +////////////////////////////////////////////////////////////// +Int32 Motor_Move (Int32 position) + + { + Int32 x=16; + var response = stubManager.Run("StubMotorRequest" ,DyeingHeadLid_Motor, (x_GET_PARAM | x_STEP_MODE)<<8, 0, 0); + + response.RecivedData=response.RecivedData & 0x0007; + if (response.RecivedData == 0) + x=1; + if (response.RecivedData == 1) + x=2; + if (response.RecivedData == 2) + x=4; + if (response.RecivedData == 3) + x=8; + + + int i=0; + if (position<0 ) + stubManager.Run("StubMotorMovRequest" ,DyeingHeadLid_Motor, false, (-position * x) ); + else + stubManager.Run("StubMotorMovRequest" ,DyeingHeadLid_Motor, true, position * x); + + Thread.Sleep(100); //100msec delay + + while (i==0) + { + response = stubManager.Run("StubMotorRequest" ,DyeingHeadLid_Motor, (x_GET_PARAM | x_POWERSTEP01_STATUS)<<16, 0, 0); + + stubManager.WriteHex(response.RecivedData,4); + response.RecivedData=response.RecivedData & 0x0002; + if (response.RecivedData==0x0002) + i=1; + Thread.Sleep(100); //100msec delay + + + } + return 0; + } + +////////////////////////////////////////////////////////////// +Int32 Motor_Run (Int32 speed) + + { + if (speed<0 ) + stubManager.Run("StubMotorRunRequest" ,DyeingHeadLid_Motor, false, (-speed) ); + else + stubManager.Run("StubMotorRunRequest" ,DyeingHeadLid_Motor, true, speed); + return 0; + } + +//--------------------------------------- + + Int32 Motor_Stop(Int32 Stop_Value ) +{ + stubManager.Run("StubMotorStopRequest" ,DyeingHeadLid_Motor, Stop_Value); + return 1; +} + diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Blowe_RMO_LOG.CSV b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Blowe_RMO_LOG.CSV index 414b0f976..c6461ea3e 100644 --- a/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Blowe_RMO_LOG.CSV +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Blowe_RMO_LOG.CSV @@ -1,5401 +1,2 @@ ,RPM 0,2688 -1,2688 -2,2675 -3,2688 -4,2688 -5,2688 -6,2688 -7,2688 -8,2688 -9,2688 -10,2688 -11,2688 -12,2700 -13,2688 -14,2675 -15,2688 -16,2688 -17,2688 -18,2688 -19,2688 -20,2688 -21,2688 -22,2688 -23,2675 -24,2688 -25,2688 -26,2688 -27,2688 -28,2688 -29,2688 -30,2688 -31,2688 -32,2688 -33,2688 -34,2688 -35,2688 -36,2688 -37,2688 -38,2688 -39,2675 -40,2688 -41,2688 -42,2688 -43,2675 -44,2688 -45,2688 -46,2688 -47,2688 -48,2688 -49,2688 -50,2688 -51,2688 -52,2688 -53,2688 -54,2688 -55,2688 -56,2675 -57,2675 -58,2688 -59,2688 -60,2688 -61,2688 -62,2688 -63,2688 -64,2688 -65,2675 -66,2688 -67,2688 -68,2688 -69,2688 -70,2675 -71,2688 -72,2688 -73,2688 -74,2688 -75,2688 -76,2688 -77,2688 -78,2688 -79,2688 -80,2688 -81,2688 -82,2688 -83,2688 -84,2688 -85,2688 -86,2688 -87,2688 -88,2688 -89,2688 -90,2688 -91,2688 -92,2688 -93,2688 -94,2675 -95,2688 -96,2688 -97,2688 -98,2688 -99,2688 -100,2688 -101,2688 -102,2688 -103,2688 -104,2688 -105,2688 -106,2688 -107,2688 -108,2688 -109,2688 -110,2688 -111,2688 -112,2688 -113,2688 -114,2675 -115,2688 -116,2688 -117,2688 -118,2675 -119,2688 -120,2688 -121,2675 -122,2688 -123,2688 -124,2688 -125,2688 -126,2688 -127,2688 -128,2688 -129,2688 -130,2688 -131,2675 -132,2688 -133,2688 -134,2688 -135,2688 -136,2688 -137,2688 -138,2688 -139,2688 -140,2688 -141,2688 -142,2688 -143,2688 -144,2688 -145,2688 -146,2688 -147,2688 -148,2688 -149,2688 -150,2675 -151,2688 -152,2688 -153,2675 -154,2688 -155,2688 -156,2688 -157,2688 -158,2688 -159,2675 -160,2688 -161,2688 -162,2688 -163,2688 -164,2675 -165,2688 -166,2688 -167,2688 -168,2688 -169,2688 -170,2688 -171,2688 -172,2688 -173,2688 -174,2688 -175,2675 -176,2688 -177,2688 -178,2688 -179,2688 -180,2688 -181,2675 -182,2688 -183,2688 -184,2688 -185,2688 -186,2688 -187,2675 -188,2675 -189,2688 -190,2688 -191,2688 -192,2688 -193,2675 -194,2688 -195,2688 -196,2688 -197,2688 -198,2675 -199,2688 -200,2688 -201,2700 -202,2688 -203,2688 -204,2688 -205,2688 -206,2675 -207,2688 -208,2675 -209,2688 -210,2675 -211,2688 -212,2688 -213,2675 -214,2688 -215,2688 -216,2688 -217,2688 -218,2675 -219,2688 -220,2688 -221,2688 -222,2688 -223,2688 -224,2688 -225,2688 -226,2675 -227,2688 -228,2688 -229,2675 -230,2688 -231,2675 -232,2688 -233,2688 -234,2688 -235,2688 -236,2688 -237,2688 -238,2688 -239,2688 -240,2688 -241,2688 -242,2688 -243,2688 -244,2688 -245,2688 -246,2688 -247,2688 -248,2688 -249,2688 -250,2675 -251,2688 -252,2688 -253,2688 -254,2688 -255,2688 -256,2675 -257,2688 -258,2688 -259,2688 -260,2688 -261,2688 -262,2688 -263,2688 -264,2688 -265,2688 -266,2688 -267,2688 -268,2688 -269,2688 -270,2688 -271,2688 -272,2688 -273,2688 -274,2688 -275,2688 -276,2688 -277,2688 -278,2688 -279,2688 -280,2688 -281,2688 -282,2688 -283,2688 -284,2675 -285,2675 -286,2688 -287,2688 -288,2688 -289,2688 -290,2688 -291,2688 -292,2688 -293,2688 -294,2688 -295,2688 -296,2675 -297,2688 -298,2688 -299,2688 -300,2688 -301,2688 -302,2688 -303,2688 -304,2688 -305,2688 -306,2688 -307,2688 -308,2688 -309,2688 -310,2675 -311,2688 -312,2688 -313,2688 -314,2675 -315,2688 -316,2688 -317,2688 -318,2688 -319,2688 -320,2688 -321,2688 -322,2688 -323,2688 -324,2688 -325,2688 -326,2688 -327,2688 -328,2688 -329,2688 -330,2688 -331,2688 -332,2688 -333,2688 -334,2700 -335,2688 -336,2688 -337,2688 -338,2688 -339,2688 -340,2700 -341,2688 -342,2688 -343,2688 -344,2688 -345,2700 -346,2688 -347,2675 -348,2688 -349,2688 -350,2675 -351,2688 -352,2688 -353,2688 -354,2688 -355,2688 -356,2688 -357,2688 -358,2688 -359,2688 -360,2688 -361,2688 -362,2688 -363,2688 -364,2688 -365,2688 -366,2688 -367,2688 -368,2688 -369,2688 -370,2688 -371,2675 -372,2700 -373,2688 -374,2688 -375,2675 -376,2688 -377,2688 -378,2688 -379,2688 -380,2688 -381,2688 -382,2688 -383,2688 -384,2688 -385,2688 -386,2688 -387,2688 -388,2688 -389,2675 -390,2688 -391,2688 -392,2675 -393,2688 -394,2688 -395,2688 -396,2700 -397,2688 -398,2688 -399,2688 -400,2688 -401,2688 -402,2688 -403,2688 -404,2688 -405,2688 -406,2688 -407,2688 -408,2688 -409,2688 -410,2688 -411,2688 -412,2688 -413,2688 -414,2688 -415,2688 -416,2688 -417,2688 -418,2688 -419,2688 -420,2688 -421,2688 -422,2688 -423,2688 -424,2688 -425,2688 -426,2688 -427,2688 -428,2688 -429,2675 -430,2700 -431,2675 -432,2688 -433,2688 -434,2688 -435,2688 -436,2688 -437,2688 -438,2688 -439,2688 -440,2688 -441,2688 -442,2675 -443,2688 -444,2688 -445,2688 -446,2688 -447,2688 -448,2675 -449,2675 -450,2675 -451,2688 -452,2688 -453,2688 -454,2688 -455,2688 -456,2688 -457,2688 -458,2688 -459,2688 -460,2688 -461,2688 -462,2688 -463,2688 -464,2688 -465,2688 -466,2688 -467,2688 -468,2688 -469,2688 -470,2688 -471,2688 -472,2688 -473,2688 -474,2688 -475,2688 -476,2688 -477,2675 -478,2688 -479,2688 -480,2688 -481,2688 -482,2688 -483,2688 -484,2688 -485,2688 -486,2688 -487,2688 -488,2688 -489,2688 -490,2688 -491,2688 -492,2688 -493,2688 -494,2688 -495,2688 -496,2688 -497,2688 -498,2688 -499,2688 -500,2675 -501,2688 -502,2675 -503,2688 -504,2688 -505,2688 -506,2688 -507,2688 -508,2688 -509,2688 -510,2688 -511,2688 -512,2688 -513,2688 -514,2688 -515,2688 -516,2700 -517,2688 -518,2688 -519,2688 -520,2688 -521,2688 -522,2688 -523,2688 -524,2675 -525,2688 -526,2688 -527,2675 -528,2688 -529,2675 -530,2688 -531,2688 -532,2688 -533,2688 -534,2688 -535,2688 -536,2688 -537,2688 -538,2688 -539,2688 -540,2688 -541,2688 -542,2688 -543,2688 -544,2688 -545,2688 -546,2688 -547,2688 -548,2688 -549,2688 -550,2688 -551,2688 -552,2688 -553,2688 -554,2688 -555,2688 -556,2688 -557,2675 -558,2688 -559,2688 -560,2700 -561,2688 -562,2688 -563,2688 -564,2688 -565,2688 -566,2688 -567,2688 -568,2675 -569,2688 -570,2688 -571,2688 -572,2688 -573,2688 -574,2688 -575,2688 -576,2688 -577,2688 -578,2688 -579,2688 -580,2688 -581,2688 -582,2675 -583,2675 -584,2688 -585,2675 -586,2688 -587,2688 -588,2688 -589,2688 -590,2688 -591,2688 -592,2688 -593,2688 -594,2688 -595,2688 -596,2688 -597,2688 -598,2688 -599,2688 -600,2688 -601,2675 -602,2688 -603,2688 -604,2688 -605,2688 -606,2688 -607,2688 -608,2688 -609,2688 -610,2688 -611,2688 -612,2688 -613,2688 -614,2688 -615,2688 -616,2688 -617,2688 -618,2688 -619,2688 -620,2688 -621,2688 -622,2688 -623,2688 -624,2675 -625,2688 -626,2688 -627,2688 -628,2688 -629,2675 -630,2688 -631,2675 -632,2688 -633,2688 -634,2688 -635,2675 -636,2675 -637,2688 -638,2688 -639,2688 -640,2688 -641,2688 -642,2688 -643,2688 -644,2688 -645,2688 -646,2688 -647,2675 -648,2688 -649,2688 -650,2688 -651,2688 -652,2688 -653,2675 -654,2688 -655,2688 -656,2688 -657,2688 -658,2688 -659,2688 -660,2688 -661,2688 -662,2688 -663,2688 -664,2688 -665,2675 -666,2688 -667,2675 -668,2688 -669,2688 -670,2688 -671,2688 -672,2688 -673,2688 -674,2688 -675,2688 -676,2675 -677,2688 -678,2688 -679,2688 -680,2675 -681,2675 -682,2688 -683,2688 -684,2688 -685,2688 -686,2688 -687,2688 -688,2688 -689,2688 -690,2688 -691,2688 -692,2688 -693,2688 -694,2688 -695,2688 -696,2688 -697,2688 -698,2688 -699,2688 -700,2688 -701,2688 -702,2688 -703,2688 -704,2688 -705,2688 -706,2688 -707,2675 -708,2688 -709,2688 -710,2688 -711,2688 -712,2688 -713,2675 -714,2688 -715,2688 -716,2688 -717,2675 -718,2688 -719,2688 -720,2688 -721,2688 -722,2688 -723,2688 -724,2688 -725,2688 -726,2688 -727,2688 -728,2675 -729,2688 -730,2688 -731,2688 -732,2675 -733,2675 -734,2675 -735,2688 -736,2688 -737,2675 -738,2688 -739,2688 -740,2688 -741,2688 -742,2688 -743,2688 -744,2688 -745,2688 -746,2688 -747,2688 -748,2688 -749,2688 -750,2688 -751,2688 -752,2688 -753,2688 -754,2688 -755,2688 -756,2688 -757,2688 -758,2688 -759,2688 -760,2688 -761,2688 -762,2688 -763,2688 -764,2688 -765,2675 -766,2688 -767,2688 -768,2688 -769,2688 -770,2688 -771,2688 -772,2688 -773,2688 -774,2688 -775,2675 -776,2688 -777,2688 -778,2688 -779,2688 -780,2700 -781,2688 -782,2688 -783,2688 -784,2688 -785,2688 -786,2688 -787,2688 -788,2688 -789,2675 -790,2688 -791,2688 -792,2688 -793,2688 -794,2688 -795,2688 -796,2675 -797,2688 -798,2688 -799,2688 -800,2675 -801,2688 -802,2688 -803,2688 -804,2688 -805,2675 -806,2688 -807,2688 -808,2688 -809,2688 -810,2688 -811,2688 -812,2688 -813,2688 -814,2688 -815,2688 -816,2688 -817,2688 -818,2688 -819,2688 -820,2688 -821,2688 -822,2688 -823,2688 -824,2675 -825,2688 -826,2688 -827,2688 -828,2688 -829,2688 -830,2688 -831,2675 -832,2688 -833,2688 -834,2688 -835,2688 -836,2688 -837,2688 -838,2688 -839,2688 -840,2688 -841,2688 -842,2688 -843,2688 -844,2675 -845,2688 -846,2675 -847,2688 -848,2688 -849,2675 -850,2688 -851,2688 -852,2688 -853,2688 -854,2688 -855,2688 -856,2688 -857,2688 -858,2688 -859,2688 -860,2688 -861,2688 -862,2688 -863,2688 -864,2688 -865,2688 -866,2688 -867,2688 -868,2688 -869,2675 -870,2688 -871,2688 -872,2688 -873,2688 -874,2688 -875,2688 -876,2688 -877,2688 -878,2688 -879,2688 -880,2688 -881,2688 -882,2700 -883,2688 -884,2675 -885,2688 -886,2675 -887,2688 -888,2688 -889,2688 -890,2688 -891,2688 -892,2688 -893,2688 -894,2688 -895,2688 -896,2688 -897,2688 -898,2688 -899,2675 -900,2688 -901,2688 -902,2675 -903,2688 -904,2688 -905,2688 -906,2675 -907,2688 -908,2688 -909,2688 -910,2688 -911,2688 -912,2688 -913,2688 -914,2688 -915,2675 -916,2688 -917,2675 -918,2688 -919,2688 -920,2688 -921,2688 -922,2675 -923,2688 -924,2688 -925,2688 -926,2688 -927,2688 -928,2688 -929,2688 -930,2688 -931,2688 -932,2675 -933,2688 -934,2688 -935,2688 -936,2688 -937,2688 -938,2688 -939,2688 -940,2688 -941,2688 -942,2688 -943,2688 -944,2675 -945,2688 -946,2688 -947,2688 -948,2688 -949,2688 -950,2688 -951,2688 -952,2688 -953,2688 -954,2688 -955,2688 -956,2688 -957,2688 -958,2688 -959,2688 -960,2688 -961,2688 -962,2688 -963,2688 -964,2688 -965,2688 -966,2688 -967,2688 -968,2688 -969,2675 -970,2688 -971,2688 -972,2688 -973,2688 -974,2688 -975,2688 -976,2688 -977,2688 -978,2688 -979,2688 -980,2675 -981,2688 -982,2688 -983,2688 -984,2688 -985,2688 -986,2688 -987,2688 -988,2688 -989,2688 -990,2688 -991,2688 -992,2688 -993,2688 -994,2688 -995,2688 -996,2688 -997,2688 -998,2688 -999,2688 -1000,2688 -1001,2688 -1002,2688 -1003,2688 -1004,2688 -1005,2688 -1006,2688 -1007,2688 -1008,2688 -1009,2688 -1010,2688 -1011,2688 -1012,2688 -1013,2688 -1014,2688 -1015,2675 -1016,2688 -1017,2688 -1018,2688 -1019,2675 -1020,2675 -1021,2688 -1022,2675 -1023,2675 -1024,2688 -1025,2688 -1026,2675 -1027,2688 -1028,2688 -1029,2688 -1030,2688 -1031,2688 -1032,2688 -1033,2688 -1034,2688 -1035,2688 -1036,2688 -1037,2688 -1038,2688 -1039,2688 -1040,2688 -1041,2688 -1042,2688 -1043,2688 -1044,2688 -1045,2688 -1046,2688 -1047,2688 -1048,2688 -1049,2688 -1050,2688 -1051,2688 -1052,2688 -1053,2688 -1054,2688 -1055,2675 -1056,2688 -1057,2688 -1058,2688 -1059,2675 -1060,2675 -1061,2688 -1062,2675 -1063,2688 -1064,2688 -1065,2688 -1066,2688 -1067,2688 -1068,2688 -1069,2688 -1070,2675 -1071,2688 -1072,2688 -1073,2688 -1074,2688 -1075,2688 -1076,2688 -1077,2688 -1078,2688 -1079,2688 -1080,2688 -1081,2688 -1082,2688 -1083,2688 -1084,2675 -1085,2688 -1086,2688 -1087,2688 -1088,2688 -1089,2688 -1090,2688 -1091,2688 -1092,2688 -1093,2688 -1094,2688 -1095,2688 -1096,2688 -1097,2688 -1098,2688 -1099,2688 -1100,2675 -1101,2688 -1102,2688 -1103,2688 -1104,2688 -1105,2675 -1106,2688 -1107,2688 -1108,2675 -1109,2688 -1110,2688 -1111,2688 -1112,2688 -1113,2688 -1114,2688 -1115,2675 -1116,2688 -1117,2688 -1118,2688 -1119,2688 -1120,2688 -1121,2688 -1122,2688 -1123,2688 -1124,2688 -1125,2688 -1126,2688 -1127,2688 -1128,2688 -1129,2688 -1130,2688 -1131,2688 -1132,2688 -1133,2688 -1134,2688 -1135,2675 -1136,2688 -1137,2688 -1138,2688 -1139,2688 -1140,2688 -1141,2688 -1142,2688 -1143,2688 -1144,2688 -1145,2688 -1146,2688 -1147,2688 -1148,2675 -1149,2688 -1150,2688 -1151,2688 -1152,2688 -1153,2688 -1154,2688 -1155,2688 -1156,2688 -1157,2688 -1158,2688 -1159,2688 -1160,2688 -1161,2688 -1162,2688 -1163,2688 -1164,2688 -1165,2688 -1166,2688 -1167,2675 -1168,2688 -1169,2688 -1170,2688 -1171,2688 -1172,2688 -1173,2688 -1174,2688 -1175,2688 -1176,2675 -1177,2688 -1178,2675 -1179,2675 -1180,2688 -1181,2688 -1182,2688 -1183,2688 -1184,2688 -1185,2688 -1186,2688 -1187,2675 -1188,2688 -1189,2688 -1190,2675 -1191,2688 -1192,2675 -1193,2688 -1194,2688 -1195,2688 -1196,2688 -1197,2688 -1198,2688 -1199,2688 -1200,2688 -1201,2688 -1202,2688 -1203,2688 -1204,2688 -1205,2688 -1206,2688 -1207,2675 -1208,2688 -1209,2688 -1210,2688 -1211,2688 -1212,2688 -1213,2688 -1214,2688 -1215,2688 -1216,2688 -1217,2688 -1218,2688 -1219,2688 -1220,2688 -1221,2688 -1222,2688 -1223,2700 -1224,2688 -1225,2688 -1226,2688 -1227,2675 -1228,2688 -1229,2688 -1230,2688 -1231,2688 -1232,2688 -1233,2688 -1234,2688 -1235,2688 -1236,2688 -1237,2688 -1238,2688 -1239,2688 -1240,2675 -1241,2688 -1242,2688 -1243,2688 -1244,2688 -1245,2675 -1246,2675 -1247,2688 -1248,2688 -1249,2688 -1250,2688 -1251,2688 -1252,2688 -1253,2688 -1254,2675 -1255,2688 -1256,2688 -1257,2700 -1258,2688 -1259,2688 -1260,2688 -1261,2688 -1262,2688 -1263,2688 -1264,2688 -1265,2688 -1266,2688 -1267,2688 -1268,2688 -1269,2688 -1270,2688 -1271,2688 -1272,2688 -1273,2688 -1274,2688 -1275,2675 -1276,2688 -1277,2688 -1278,2688 -1279,2688 -1280,2688 -1281,2688 -1282,2688 -1283,2688 -1284,2675 -1285,2688 -1286,2688 -1287,2675 -1288,2688 -1289,2688 -1290,2688 -1291,2688 -1292,2688 -1293,2688 -1294,2675 -1295,2688 -1296,2688 -1297,2688 -1298,2688 -1299,2688 -1300,2688 -1301,2688 -1302,2688 -1303,2688 -1304,2688 -1305,2688 -1306,2688 -1307,2688 -1308,2688 -1309,2688 -1310,2675 -1311,2688 -1312,2688 -1313,2700 -1314,2688 -1315,2675 -1316,2688 -1317,2688 -1318,2688 -1319,2688 -1320,2688 -1321,2688 -1322,2675 -1323,2688 -1324,2688 -1325,2688 -1326,2688 -1327,2688 -1328,2688 -1329,2688 -1330,2688 -1331,2688 -1332,2688 -1333,2688 -1334,2688 -1335,2688 -1336,2688 -1337,2688 -1338,2688 -1339,2688 -1340,2688 -1341,2688 -1342,2688 -1343,2688 -1344,2688 -1345,2688 -1346,2688 -1347,2688 -1348,2688 -1349,2688 -1350,2688 -1351,2688 -1352,2675 -1353,2688 -1354,2675 -1355,2688 -1356,2688 -1357,2688 -1358,2688 -1359,2688 -1360,2688 -1361,2688 -1362,2688 -1363,2688 -1364,2688 -1365,2688 -1366,2675 -1367,2675 -1368,2675 -1369,2688 -1370,2675 -1371,2688 -1372,2688 -1373,2688 -1374,2688 -1375,2688 -1376,2688 -1377,2688 -1378,2688 -1379,2688 -1380,2688 -1381,2688 -1382,2688 -1383,2688 -1384,2688 -1385,2688 -1386,2688 -1387,2688 -1388,2688 -1389,2688 -1390,2688 -1391,2688 -1392,2688 -1393,2688 -1394,2688 -1395,2688 -1396,2675 -1397,2688 -1398,2688 -1399,2688 -1400,2675 -1401,2688 -1402,2688 -1403,2688 -1404,2688 -1405,2688 -1406,2688 -1407,2688 -1408,2688 -1409,2688 -1410,2700 -1411,2688 -1412,2675 -1413,2688 -1414,2688 -1415,2688 -1416,2700 -1417,2688 -1418,2688 -1419,2688 -1420,2688 -1421,2688 -1422,2688 -1423,2688 -1424,2688 -1425,2688 -1426,2688 -1427,2688 -1428,2688 -1429,2688 -1430,2688 -1431,2688 -1432,2688 -1433,2675 -1434,2688 -1435,2688 -1436,2675 -1437,2688 -1438,2688 -1439,2688 -1440,2688 -1441,2688 -1442,2688 -1443,2688 -1444,2688 -1445,2688 -1446,2688 -1447,2688 -1448,2688 -1449,2688 -1450,2688 -1451,2688 -1452,2688 -1453,2688 -1454,2688 -1455,2688 -1456,2675 -1457,2688 -1458,2688 -1459,2688 -1460,2688 -1461,2688 -1462,2675 -1463,2688 -1464,2688 -1465,2688 -1466,2675 -1467,2688 -1468,2688 -1469,2688 -1470,2688 -1471,2688 -1472,2688 -1473,2688 -1474,2675 -1475,2688 -1476,2688 -1477,2675 -1478,2675 -1479,2688 -1480,2688 -1481,2688 -1482,2688 -1483,2688 -1484,2688 -1485,2688 -1486,2688 -1487,2688 -1488,2688 -1489,2688 -1490,2688 -1491,2688 -1492,2688 -1493,2688 -1494,2688 -1495,2688 -1496,2688 -1497,2688 -1498,2688 -1499,2688 -1500,2688 -1501,2688 -1502,2688 -1503,2688 -1504,2688 -1505,2688 -1506,2688 -1507,2688 -1508,2688 -1509,2688 -1510,2688 -1511,2675 -1512,2688 -1513,2688 -1514,2688 -1515,2688 -1516,2688 -1517,2688 -1518,2688 -1519,2688 -1520,2688 -1521,2688 -1522,2688 -1523,2688 -1524,2688 -1525,2688 -1526,2688 -1527,2688 -1528,2688 -1529,2688 -1530,2688 -1531,2688 -1532,2688 -1533,2688 -1534,2688 -1535,2675 -1536,2675 -1537,2688 -1538,2688 -1539,2688 -1540,2688 -1541,2688 -1542,2675 -1543,2688 -1544,2688 -1545,2688 -1546,2688 -1547,2688 -1548,2688 -1549,2688 -1550,2688 -1551,2688 -1552,2688 -1553,2688 -1554,2688 -1555,2688 -1556,2688 -1557,2688 -1558,2688 -1559,2688 -1560,2688 -1561,2688 -1562,2688 -1563,2675 -1564,2675 -1565,2688 -1566,2688 -1567,2688 -1568,2688 -1569,2688 -1570,2688 -1571,2688 -1572,2688 -1573,2688 -1574,2675 -1575,2688 -1576,2688 -1577,2675 -1578,2688 -1579,2688 -1580,2688 -1581,2688 -1582,2675 -1583,2688 -1584,2688 -1585,2688 -1586,2688 -1587,2688 -1588,2688 -1589,2688 -1590,2688 -1591,2688 -1592,2675 -1593,2688 -1594,2688 -1595,2688 -1596,2688 -1597,2688 -1598,2688 -1599,2688 -1600,2688 -1601,2688 -1602,2688 -1603,2688 -1604,2675 -1605,2688 -1606,2688 -1607,2688 -1608,2688 -1609,2688 -1610,2675 -1611,2688 -1612,2688 -1613,2688 -1614,2675 -1615,2688 -1616,2688 -1617,2688 -1618,2688 -1619,2688 -1620,2688 -1621,2688 -1622,2688 -1623,2688 -1624,2688 -1625,2688 -1626,2688 -1627,2688 -1628,2688 -1629,2688 -1630,2688 -1631,2688 -1632,2675 -1633,2688 -1634,2688 -1635,2675 -1636,2688 -1637,2688 -1638,2688 -1639,2688 -1640,2688 -1641,2688 -1642,2675 -1643,2688 -1644,2688 -1645,2688 -1646,2688 -1647,2688 -1648,2688 -1649,2688 -1650,2688 -1651,2688 -1652,2688 -1653,2688 -1654,2688 -1655,2688 -1656,2688 -1657,2688 -1658,2688 -1659,2688 -1660,2688 -1661,2688 -1662,2688 -1663,2688 -1664,2688 -1665,2688 -1666,2688 -1667,2688 -1668,2688 -1669,2688 -1670,2688 -1671,2688 -1672,2688 -1673,2688 -1674,2688 -1675,2688 -1676,2688 -1677,2688 -1678,2688 -1679,2688 -1680,2688 -1681,2688 -1682,2688 -1683,2688 -1684,2675 -1685,2688 -1686,2688 -1687,2688 -1688,2688 -1689,2688 -1690,2688 -1691,2688 -1692,2675 -1693,2688 -1694,2688 -1695,2688 -1696,2688 -1697,2688 -1698,2688 -1699,2688 -1700,2688 -1701,2675 -1702,2688 -1703,2688 -1704,2700 -1705,2688 -1706,2688 -1707,2688 -1708,2688 -1709,2688 -1710,2688 -1711,2688 -1712,2675 -1713,2688 -1714,2688 -1715,2688 -1716,2688 -1717,2688 -1718,2688 -1719,2688 -1720,2688 -1721,2688 -1722,2688 -1723,2688 -1724,2675 -1725,2688 -1726,2688 -1727,2688 -1728,2688 -1729,2688 -1730,2688 -1731,2688 -1732,2688 -1733,2688 -1734,2688 -1735,2688 -1736,2688 -1737,2688 -1738,2688 -1739,2688 -1740,2688 -1741,2688 -1742,2700 -1743,2688 -1744,2688 -1745,2688 -1746,2688 -1747,2688 -1748,2688 -1749,2688 -1750,2688 -1751,2688 -1752,2688 -1753,2688 -1754,2688 -1755,2688 -1756,2675 -1757,2688 -1758,2688 -1759,2688 -1760,2688 -1761,2675 -1762,2688 -1763,2688 -1764,2688 -1765,2675 -1766,2688 -1767,2688 -1768,2688 -1769,2688 -1770,2688 -1771,2688 -1772,2688 -1773,2688 -1774,2688 -1775,2688 -1776,2675 -1777,2688 -1778,2688 -1779,2688 -1780,2688 -1781,2688 -1782,2688 -1783,2688 -1784,2675 -1785,2688 -1786,2688 -1787,2688 -1788,2675 -1789,2688 -1790,2688 -1791,2688 -1792,2675 -1793,2675 -1794,2688 -1795,2688 -1796,2688 -1797,2688 -1798,2675 -1799,2688 -1800,2688 -1801,2688 -1802,2688 -1803,2688 -1804,2688 -1805,2688 -1806,2688 -1807,2688 -1808,2688 -1809,2688 -1810,2688 -1811,2688 -1812,2688 -1813,2688 -1814,2688 -1815,2688 -1816,2688 -1817,2688 -1818,2688 -1819,2675 -1820,2688 -1821,2688 -1822,2688 -1823,2688 -1824,2688 -1825,2688 -1826,2688 -1827,2688 -1828,2688 -1829,2688 -1830,2688 -1831,2688 -1832,2688 -1833,2688 -1834,2688 -1835,2688 -1836,2688 -1837,2688 -1838,2688 -1839,2688 -1840,2688 -1841,2688 -1842,2688 -1843,2688 -1844,2688 -1845,2688 -1846,2675 -1847,2688 -1848,2688 -1849,2688 -1850,2688 -1851,2688 -1852,2688 -1853,2688 -1854,2688 -1855,2688 -1856,2688 -1857,2688 -1858,2688 -1859,2688 -1860,2688 -1861,2688 -1862,2688 -1863,2688 -1864,2688 -1865,2688 -1866,2688 -1867,2688 -1868,2688 -1869,2688 -1870,2688 -1871,2688 -1872,2688 -1873,2688 -1874,2688 -1875,2688 -1876,2688 -1877,2700 -1878,2675 -1879,2688 -1880,2675 -1881,2688 -1882,2688 -1883,2688 -1884,2688 -1885,2688 -1886,2688 -1887,2688 -1888,2688 -1889,2700 -1890,2688 -1891,2688 -1892,2688 -1893,2675 -1894,2688 -1895,2688 -1896,2688 -1897,2688 -1898,2688 -1899,2688 -1900,2688 -1901,2688 -1902,2688 -1903,2688 -1904,2688 -1905,2688 -1906,2688 -1907,2688 -1908,2688 -1909,2688 -1910,2675 -1911,2688 -1912,2688 -1913,2675 -1914,2688 -1915,2688 -1916,2688 -1917,2688 -1918,2688 -1919,2688 -1920,2688 -1921,2688 -1922,2688 -1923,2688 -1924,2688 -1925,2688 -1926,2688 -1927,2688 -1928,2688 -1929,2675 -1930,2688 -1931,2688 -1932,2688 -1933,2675 -1934,2688 -1935,2688 -1936,2688 -1937,2688 -1938,2688 -1939,2688 -1940,2675 -1941,2688 -1942,2688 -1943,2688 -1944,2688 -1945,2688 -1946,2688 -1947,2688 -1948,2688 -1949,2688 -1950,2688 -1951,2688 -1952,2688 -1953,2688 -1954,2688 -1955,2688 -1956,2688 -1957,2688 -1958,2688 -1959,2688 -1960,2688 -1961,2688 -1962,2688 -1963,2688 -1964,2688 -1965,2675 -1966,2688 -1967,2688 -1968,2688 -1969,2688 -1970,2688 -1971,2688 -1972,2688 -1973,2675 -1974,2688 -1975,2688 -1976,2688 -1977,2675 -1978,2688 -1979,2688 -1980,2688 -1981,2688 -1982,2688 -1983,2688 -1984,2688 -1985,2675 -1986,2688 -1987,2688 -1988,2688 -1989,2688 -1990,2675 -1991,2688 -1992,2688 -1993,2688 -1994,2675 -1995,2675 -1996,2688 -1997,2688 -1998,2688 -1999,2675 -2000,2688 -2001,2688 -2002,2688 -2003,2688 -2004,2688 -2005,2688 -2006,2688 -2007,2688 -2008,2688 -2009,2688 -2010,2688 -2011,2688 -2012,2688 -2013,2688 -2014,2688 -2015,2688 -2016,2688 -2017,2688 -2018,2688 -2019,2688 -2020,2675 -2021,2675 -2022,2675 -2023,2688 -2024,2688 -2025,2688 -2026,2688 -2027,2688 -2028,2675 -2029,2688 -2030,2688 -2031,2688 -2032,2675 -2033,2688 -2034,2688 -2035,2688 -2036,2688 -2037,2688 -2038,2688 -2039,2675 -2040,2688 -2041,2688 -2042,2675 -2043,2688 -2044,2688 -2045,2688 -2046,2688 -2047,2700 -2048,2688 -2049,2675 -2050,2688 -2051,2688 -2052,2688 -2053,2688 -2054,2688 -2055,2675 -2056,2688 -2057,2688 -2058,2688 -2059,2688 -2060,2688 -2061,2688 -2062,2688 -2063,2688 -2064,2675 -2065,2675 -2066,2700 -2067,2688 -2068,2688 -2069,2688 -2070,2688 -2071,2688 -2072,2688 -2073,2688 -2074,2688 -2075,2688 -2076,2688 -2077,2688 -2078,2688 -2079,2688 -2080,2688 -2081,2688 -2082,2688 -2083,2688 -2084,2675 -2085,2688 -2086,2688 -2087,2688 -2088,2688 -2089,2688 -2090,2688 -2091,2688 -2092,2688 -2093,2688 -2094,2688 -2095,2688 -2096,2688 -2097,2688 -2098,2688 -2099,2688 -2100,2688 -2101,2688 -2102,2688 -2103,2688 -2104,2688 -2105,2688 -2106,2688 -2107,2688 -2108,2688 -2109,2688 -2110,2688 -2111,2688 -2112,2688 -2113,2688 -2114,2688 -2115,2688 -2116,2688 -2117,2688 -2118,2688 -2119,2688 -2120,2688 -2121,2688 -2122,2688 -2123,2688 -2124,2688 -2125,2688 -2126,2688 -2127,2688 -2128,2688 -2129,2688 -2130,2675 -2131,2688 -2132,2688 -2133,2688 -2134,2688 -2135,2688 -2136,2688 -2137,2688 -2138,2688 -2139,2688 -2140,2688 -2141,2688 -2142,2688 -2143,2688 -2144,2688 -2145,2688 -2146,2688 -2147,2688 -2148,2688 -2149,2688 -2150,2688 -2151,2688 -2152,2688 -2153,2688 -2154,2688 -2155,2688 -2156,2688 -2157,2688 -2158,2688 -2159,2688 -2160,2688 -2161,2688 -2162,2675 -2163,2688 -2164,2688 -2165,2688 -2166,2688 -2167,2688 -2168,2688 -2169,2688 -2170,2688 -2171,2688 -2172,2688 -2173,2675 -2174,2688 -2175,2688 -2176,2688 -2177,2688 -2178,2688 -2179,2688 -2180,2688 -2181,2675 -2182,2688 -2183,2688 -2184,2688 -2185,2688 -2186,2688 -2187,2688 -2188,2688 -2189,2688 -2190,2688 -2191,2688 -2192,2688 -2193,2688 -2194,2688 -2195,2675 -2196,2688 -2197,2688 -2198,2688 -2199,2688 -2200,2675 -2201,2688 -2202,2688 -2203,2688 -2204,2688 -2205,2688 -2206,2675 -2207,2688 -2208,2688 -2209,2675 -2210,2688 -2211,2688 -2212,2688 -2213,2688 -2214,2688 -2215,2688 -2216,2688 -2217,2688 -2218,2688 -2219,2688 -2220,2688 -2221,2688 -2222,2688 -2223,2688 -2224,2688 -2225,2675 -2226,2675 -2227,2688 -2228,2688 -2229,2688 -2230,2688 -2231,2688 -2232,2688 -2233,2688 -2234,2688 -2235,2688 -2236,2688 -2237,2688 -2238,2688 -2239,2688 -2240,2688 -2241,2688 -2242,2688 -2243,2688 -2244,2688 -2245,2688 -2246,2688 -2247,2688 -2248,2688 -2249,2688 -2250,2688 -2251,2688 -2252,2688 -2253,2688 -2254,2688 -2255,2688 -2256,2688 -2257,2675 -2258,2688 -2259,2688 -2260,2688 -2261,2688 -2262,2688 -2263,2688 -2264,2688 -2265,2688 -2266,2688 -2267,2688 -2268,2688 -2269,2688 -2270,2688 -2271,2675 -2272,2688 -2273,2688 -2274,2688 -2275,2675 -2276,2688 -2277,2688 -2278,2688 -2279,2688 -2280,2688 -2281,2688 -2282,2688 -2283,2688 -2284,2688 -2285,2688 -2286,2688 -2287,2675 -2288,2688 -2289,2688 -2290,2688 -2291,2688 -2292,2688 -2293,2688 -2294,2700 -2295,2688 -2296,2688 -2297,2688 -2298,2688 -2299,2688 -2300,2675 -2301,2688 -2302,2688 -2303,2688 -2304,2688 -2305,2688 -2306,2688 -2307,2688 -2308,2688 -2309,2688 -2310,2688 -2311,2688 -2312,2688 -2313,2688 -2314,2688 -2315,2675 -2316,2675 -2317,2688 -2318,2688 -2319,2688 -2320,2688 -2321,2688 -2322,2688 -2323,2688 -2324,2688 -2325,2688 -2326,2675 -2327,2688 -2328,2688 -2329,2688 -2330,2688 -2331,2688 -2332,2675 -2333,2675 -2334,2688 -2335,2688 -2336,2688 -2337,2688 -2338,2688 -2339,2688 -2340,2688 -2341,2688 -2342,2688 -2343,2688 -2344,2688 -2345,2688 -2346,2688 -2347,2688 -2348,2675 -2349,2688 -2350,2688 -2351,2675 -2352,2688 -2353,2688 -2354,2688 -2355,2688 -2356,2688 -2357,2688 -2358,2688 -2359,2675 -2360,2688 -2361,2688 -2362,2688 -2363,2688 -2364,2688 -2365,2675 -2366,2688 -2367,2688 -2368,2688 -2369,2688 -2370,2675 -2371,2675 -2372,2688 -2373,2688 -2374,2688 -2375,2688 -2376,2675 -2377,2688 -2378,2675 -2379,2688 -2380,2688 -2381,2688 -2382,2688 -2383,2675 -2384,2675 -2385,2688 -2386,2688 -2387,2688 -2388,2688 -2389,2688 -2390,2688 -2391,2688 -2392,2688 -2393,2688 -2394,2688 -2395,2688 -2396,2688 -2397,2688 -2398,2688 -2399,2688 -2400,2688 -2401,2688 -2402,2688 -2403,2688 -2404,2688 -2405,2688 -2406,2688 -2407,2688 -2408,2688 -2409,2675 -2410,2688 -2411,2688 -2412,2688 -2413,2688 -2414,2675 -2415,2688 -2416,2688 -2417,2688 -2418,2688 -2419,2688 -2420,2688 -2421,2688 -2422,2688 -2423,2688 -2424,2688 -2425,2688 -2426,2688 -2427,2688 -2428,2688 -2429,2688 -2430,2688 -2431,2688 -2432,2700 -2433,2688 -2434,2688 -2435,2688 -2436,2688 -2437,2688 -2438,2675 -2439,2688 -2440,2688 -2441,2688 -2442,2688 -2443,2688 -2444,2688 -2445,2688 -2446,2688 -2447,2688 -2448,2688 -2449,2688 -2450,2688 -2451,2688 -2452,2688 -2453,2688 -2454,2688 -2455,2688 -2456,2688 -2457,2688 -2458,2688 -2459,2675 -2460,2688 -2461,2688 -2462,2688 -2463,2675 -2464,2700 -2465,2688 -2466,2675 -2467,2688 -2468,2688 -2469,2688 -2470,2688 -2471,2688 -2472,2688 -2473,2688 -2474,2688 -2475,2688 -2476,2688 -2477,2688 -2478,2675 -2479,2688 -2480,2688 -2481,2688 -2482,2688 -2483,2688 -2484,2688 -2485,2688 -2486,2675 -2487,2688 -2488,2688 -2489,2688 -2490,2688 -2491,2688 -2492,2688 -2493,2688 -2494,2688 -2495,2688 -2496,2688 -2497,2688 -2498,2688 -2499,2675 -2500,2688 -2501,2688 -2502,2675 -2503,2675 -2504,2688 -2505,2688 -2506,2688 -2507,2688 -2508,2688 -2509,2688 -2510,2675 -2511,2688 -2512,2688 -2513,2688 -2514,2675 -2515,2688 -2516,2688 -2517,2688 -2518,2688 -2519,2688 -2520,2675 -2521,2688 -2522,2688 -2523,2688 -2524,2675 -2525,2688 -2526,2688 -2527,2688 -2528,2688 -2529,2688 -2530,2688 -2531,2688 -2532,2688 -2533,2688 -2534,2688 -2535,2688 -2536,2675 -2537,2688 -2538,2688 -2539,2688 -2540,2688 -2541,2688 -2542,2675 -2543,2688 -2544,2688 -2545,2688 -2546,2688 -2547,2675 -2548,2688 -2549,2675 -2550,2688 -2551,2688 -2552,2688 -2553,2688 -2554,2688 -2555,2688 -2556,2700 -2557,2688 -2558,2688 -2559,2688 -2560,2688 -2561,2688 -2562,2675 -2563,2688 -2564,2688 -2565,2688 -2566,2688 -2567,2688 -2568,2688 -2569,2688 -2570,2688 -2571,2688 -2572,2688 -2573,2688 -2574,2688 -2575,2688 -2576,2688 -2577,2688 -2578,2688 -2579,2688 -2580,2688 -2581,2688 -2582,2688 -2583,2688 -2584,2688 -2585,2688 -2586,2688 -2587,2688 -2588,2688 -2589,2688 -2590,2688 -2591,2688 -2592,2688 -2593,2688 -2594,2688 -2595,2688 -2596,2688 -2597,2688 -2598,2688 -2599,2688 -2600,2688 -2601,2688 -2602,2675 -2603,2675 -2604,2688 -2605,2688 -2606,2688 -2607,2688 -2608,2688 -2609,2700 -2610,2688 -2611,2688 -2612,2688 -2613,2675 -2614,2688 -2615,2688 -2616,2688 -2617,2688 -2618,2688 -2619,2688 -2620,2688 -2621,2688 -2622,2688 -2623,2688 -2624,2688 -2625,2688 -2626,2688 -2627,2688 -2628,2688 -2629,2688 -2630,2688 -2631,2688 -2632,2688 -2633,2688 -2634,2688 -2635,2688 -2636,2688 -2637,2688 -2638,2688 -2639,2688 -2640,2688 -2641,2688 -2642,2688 -2643,2688 -2644,2688 -2645,2688 -2646,2688 -2647,2675 -2648,2688 -2649,2688 -2650,2675 -2651,2688 -2652,2688 -2653,2688 -2654,2688 -2655,2688 -2656,2688 -2657,2688 -2658,2688 -2659,2688 -2660,2688 -2661,2688 -2662,2688 -2663,2675 -2664,2688 -2665,2688 -2666,2688 -2667,2675 -2668,2688 -2669,2688 -2670,2688 -2671,2688 -2672,2675 -2673,2688 -2674,2688 -2675,2675 -2676,2688 -2677,2688 -2678,2688 -2679,2688 -2680,2688 -2681,2688 -2682,2688 -2683,2688 -2684,2675 -2685,2688 -2686,2688 -2687,2688 -2688,2688 -2689,2688 -2690,2688 -2691,2688 -2692,2688 -2693,2688 -2694,2675 -2695,2688 -2696,2688 -2697,2688 -2698,2688 -2699,2688 -2700,2675 -2701,2688 -2702,2688 -2703,2675 -2704,2688 -2705,2688 -2706,2688 -2707,2675 -2708,2688 -2709,2688 -2710,2688 -2711,2688 -2712,2688 -2713,2688 -2714,2688 -2715,2675 -2716,2675 -2717,2688 -2718,2688 -2719,2688 -2720,2688 -2721,2688 -2722,2688 -2723,2688 -2724,2688 -2725,2688 -2726,2688 -2727,2688 -2728,2688 -2729,2675 -2730,2688 -2731,2675 -2732,2688 -2733,2688 -2734,2688 -2735,2688 -2736,2688 -2737,2688 -2738,2688 -2739,2688 -2740,2688 -2741,2688 -2742,2688 -2743,2688 -2744,2688 -2745,2688 -2746,2688 -2747,2688 -2748,2688 -2749,2688 -2750,2688 -2751,2688 -2752,2688 -2753,2688 -2754,2675 -2755,2688 -2756,2675 -2757,2688 -2758,2675 -2759,2688 -2760,2688 -2761,2688 -2762,2688 -2763,2688 -2764,2688 -2765,2675 -2766,2675 -2767,2688 -2768,2688 -2769,2688 -2770,2688 -2771,2688 -2772,2688 -2773,2688 -2774,2688 -2775,2688 -2776,2688 -2777,2688 -2778,2688 -2779,2688 -2780,2688 -2781,2688 -2782,2688 -2783,2675 -2784,2688 -2785,2688 -2786,2688 -2787,2688 -2788,2688 -2789,2688 -2790,2675 -2791,2688 -2792,2688 -2793,2688 -2794,2688 -2795,2688 -2796,2688 -2797,2688 -2798,2688 -2799,2688 -2800,2688 -2801,2688 -2802,2688 -2803,2688 -2804,2688 -2805,2688 -2806,2688 -2807,2688 -2808,2688 -2809,2688 -2810,2688 -2811,2675 -2812,2688 -2813,2688 -2814,2675 -2815,2688 -2816,2688 -2817,2675 -2818,2688 -2819,2688 -2820,2688 -2821,2688 -2822,2688 -2823,2688 -2824,2675 -2825,2688 -2826,2688 -2827,2688 -2828,2688 -2829,2688 -2830,2688 -2831,2688 -2832,2688 -2833,2688 -2834,2688 -2835,2688 -2836,2688 -2837,2675 -2838,2688 -2839,2675 -2840,2688 -2841,2688 -2842,2688 -2843,2688 -2844,2688 -2845,2688 -2846,2688 -2847,2688 -2848,2688 -2849,2688 -2850,2688 -2851,2688 -2852,2688 -2853,2688 -2854,2688 -2855,2688 -2856,2688 -2857,2688 -2858,2688 -2859,2675 -2860,2688 -2861,2688 -2862,2675 -2863,2688 -2864,2688 -2865,2675 -2866,2688 -2867,2688 -2868,2688 -2869,2688 -2870,2688 -2871,2688 -2872,2688 -2873,2688 -2874,2688 -2875,2688 -2876,2688 -2877,2675 -2878,2688 -2879,2688 -2880,2688 -2881,2688 -2882,2688 -2883,2688 -2884,2688 -2885,2688 -2886,2688 -2887,2688 -2888,2688 -2889,2688 -2890,2688 -2891,2688 -2892,2688 -2893,2688 -2894,2688 -2895,2688 -2896,2688 -2897,2688 -2898,2688 -2899,2688 -2900,2688 -2901,2688 -2902,2688 -2903,2688 -2904,2688 -2905,2688 -2906,2688 -2907,2688 -2908,2688 -2909,2688 -2910,2688 -2911,2688 -2912,2688 -2913,2688 -2914,2688 -2915,2688 -2916,2688 -2917,2675 -2918,2688 -2919,2688 -2920,2688 -2921,2688 -2922,2688 -2923,2675 -2924,2688 -2925,2688 -2926,2688 -2927,2688 -2928,2688 -2929,2688 -2930,2675 -2931,2688 -2932,2688 -2933,2688 -2934,2688 -2935,2700 -2936,2688 -2937,2688 -2938,2688 -2939,2688 -2940,2675 -2941,2688 -2942,2688 -2943,2688 -2944,2688 -2945,2675 -2946,2688 -2947,2688 -2948,2688 -2949,2688 -2950,2688 -2951,2688 -2952,2688 -2953,2688 -2954,2688 -2955,2688 -2956,2688 -2957,2688 -2958,2688 -2959,2688 -2960,2688 -2961,2688 -2962,2688 -2963,2688 -2964,2675 -2965,2688 -2966,2688 -2967,2675 -2968,2688 -2969,2688 -2970,2688 -2971,2688 -2972,2688 -2973,2688 -2974,2688 -2975,2688 -2976,2688 -2977,2688 -2978,2675 -2979,2688 -2980,2688 -2981,2688 -2982,2688 -2983,2688 -2984,2688 -2985,2688 -2986,2688 -2987,2688 -2988,2688 -2989,2688 -2990,2688 -2991,2688 -2992,2688 -2993,2688 -2994,2688 -2995,2688 -2996,2688 -2997,2688 -2998,2688 -2999,2688 -3000,2688 -3001,2688 -3002,2688 -3003,2688 -3004,2688 -3005,2688 -3006,2688 -3007,2688 -3008,2688 -3009,2688 -3010,2688 -3011,2688 -3012,2688 -3013,2688 -3014,2688 -3015,2688 -3016,2688 -3017,2688 -3018,2688 -3019,2675 -3020,2688 -3021,2688 -3022,2688 -3023,2700 -3024,2688 -3025,2688 -3026,2688 -3027,2688 -3028,2688 -3029,2688 -3030,2688 -3031,2688 -3032,2688 -3033,2688 -3034,2688 -3035,2688 -3036,2688 -3037,2688 -3038,2688 -3039,2688 -3040,2688 -3041,2688 -3042,2700 -3043,2688 -3044,2675 -3045,2688 -3046,2688 -3047,2688 -3048,2688 -3049,2688 -3050,2688 -3051,2688 -3052,2675 -3053,2688 -3054,2675 -3055,2688 -3056,2688 -3057,2688 -3058,2688 -3059,2675 -3060,2688 -3061,2688 -3062,2688 -3063,2675 -3064,2688 -3065,2688 -3066,2688 -3067,2675 -3068,2688 -3069,2688 -3070,2688 -3071,2688 -3072,2688 -3073,2675 -3074,2688 -3075,2688 -3076,2675 -3077,2688 -3078,2688 -3079,2688 -3080,2688 -3081,2688 -3082,2688 -3083,2688 -3084,2688 -3085,2688 -3086,2675 -3087,2688 -3088,2688 -3089,2688 -3090,2688 -3091,2688 -3092,2688 -3093,2688 -3094,2688 -3095,2688 -3096,2688 -3097,2688 -3098,2688 -3099,2675 -3100,2675 -3101,2688 -3102,2688 -3103,2688 -3104,2688 -3105,2688 -3106,2688 -3107,2688 -3108,2688 -3109,2688 -3110,2675 -3111,2688 -3112,2688 -3113,2688 -3114,2688 -3115,2688 -3116,2688 -3117,2675 -3118,2688 -3119,2688 -3120,2688 -3121,2688 -3122,2688 -3123,2688 -3124,2675 -3125,2688 -3126,2688 -3127,2688 -3128,2688 -3129,2688 -3130,2688 -3131,2688 -3132,2675 -3133,2700 -3134,2688 -3135,2688 -3136,2688 -3137,2675 -3138,2688 -3139,2675 -3140,2688 -3141,2688 -3142,2688 -3143,2675 -3144,2688 -3145,2688 -3146,2688 -3147,2688 -3148,2688 -3149,2688 -3150,2688 -3151,2688 -3152,2688 -3153,2688 -3154,2688 -3155,2688 -3156,2688 -3157,2688 -3158,2688 -3159,2688 -3160,2688 -3161,2688 -3162,2688 -3163,2688 -3164,2688 -3165,2688 -3166,2688 -3167,2688 -3168,2700 -3169,2688 -3170,2675 -3171,2688 -3172,2688 -3173,2688 -3174,2675 -3175,2688 -3176,2675 -3177,2688 -3178,2688 -3179,2688 -3180,2688 -3181,2688 -3182,2675 -3183,2688 -3184,2688 -3185,2688 -3186,2688 -3187,2688 -3188,2688 -3189,2688 -3190,2688 -3191,2688 -3192,2688 -3193,2675 -3194,2688 -3195,2688 -3196,2688 -3197,2675 -3198,2688 -3199,2688 -3200,2675 -3201,2688 -3202,2688 -3203,2688 -3204,2688 -3205,2688 -3206,2675 -3207,2688 -3208,2688 -3209,2688 -3210,2688 -3211,2688 -3212,2688 -3213,2688 -3214,2688 -3215,2688 -3216,2688 -3217,2688 -3218,2688 -3219,2688 -3220,2688 -3221,2688 -3222,2675 -3223,2688 -3224,2675 -3225,2688 -3226,2688 -3227,2688 -3228,2688 -3229,2688 -3230,2688 -3231,2688 -3232,2688 -3233,2688 -3234,2688 -3235,2688 -3236,2688 -3237,2688 -3238,2688 -3239,2688 -3240,2688 -3241,2688 -3242,2688 -3243,2688 -3244,2675 -3245,2688 -3246,2688 -3247,2688 -3248,2688 -3249,2688 -3250,2688 -3251,2688 -3252,2688 -3253,2688 -3254,2688 -3255,2688 -3256,2688 -3257,2688 -3258,2688 -3259,2688 -3260,2688 -3261,2688 -3262,2688 -3263,2688 -3264,2688 -3265,2688 -3266,2688 -3267,2688 -3268,2675 -3269,2688 -3270,2688 -3271,2688 -3272,2688 -3273,2688 -3274,2675 -3275,2688 -3276,2688 -3277,2688 -3278,2688 -3279,2688 -3280,2688 -3281,2688 -3282,2688 -3283,2688 -3284,2688 -3285,2688 -3286,2675 -3287,2688 -3288,2688 -3289,2688 -3290,2688 -3291,2688 -3292,2688 -3293,2688 -3294,2675 -3295,2688 -3296,2688 -3297,2688 -3298,2688 -3299,2688 -3300,2688 -3301,2688 -3302,2688 -3303,2688 -3304,2688 -3305,2688 -3306,2688 -3307,2688 -3308,2688 -3309,2688 -3310,2688 -3311,2675 -3312,2688 -3313,2675 -3314,2688 -3315,2675 -3316,2688 -3317,2688 -3318,2688 -3319,2688 -3320,2688 -3321,2688 -3322,2675 -3323,2675 -3324,2688 -3325,2688 -3326,2688 -3327,2688 -3328,2688 -3329,2688 -3330,2675 -3331,2688 -3332,2688 -3333,2688 -3334,2675 -3335,2688 -3336,2688 -3337,2688 -3338,2688 -3339,2688 -3340,2688 -3341,2688 -3342,2688 -3343,2688 -3344,2688 -3345,2688 -3346,2688 -3347,2688 -3348,2675 -3349,2688 -3350,2688 -3351,2688 -3352,2688 -3353,2688 -3354,2688 -3355,2675 -3356,2675 -3357,2675 -3358,2688 -3359,2688 -3360,2688 -3361,2688 -3362,2688 -3363,2688 -3364,2688 -3365,2688 -3366,2688 -3367,2688 -3368,2688 -3369,2675 -3370,2688 -3371,2688 -3372,2688 -3373,2688 -3374,2688 -3375,2688 -3376,2688 -3377,2688 -3378,2688 -3379,2688 -3380,2688 -3381,2688 -3382,2688 -3383,2675 -3384,2688 -3385,2688 -3386,2688 -3387,2688 -3388,2688 -3389,2688 -3390,2675 -3391,2688 -3392,2688 -3393,2688 -3394,2688 -3395,2688 -3396,2675 -3397,2688 -3398,2688 -3399,2675 -3400,2688 -3401,2688 -3402,2675 -3403,2688 -3404,2688 -3405,2688 -3406,2675 -3407,2688 -3408,2675 -3409,2688 -3410,2688 -3411,2675 -3412,2688 -3413,2688 -3414,2688 -3415,2688 -3416,2688 -3417,2688 -3418,2688 -3419,2675 -3420,2688 -3421,2688 -3422,2688 -3423,2675 -3424,2688 -3425,2688 -3426,2688 -3427,2700 -3428,2688 -3429,2675 -3430,2675 -3431,2688 -3432,2688 -3433,2688 -3434,2688 -3435,2688 -3436,2688 -3437,2688 -3438,2688 -3439,2688 -3440,2688 -3441,2688 -3442,2688 -3443,2675 -3444,2688 -3445,2675 -3446,2688 -3447,2688 -3448,2688 -3449,2688 -3450,2688 -3451,2675 -3452,2688 -3453,2688 -3454,2688 -3455,2688 -3456,2688 -3457,2675 -3458,2688 -3459,2688 -3460,2675 -3461,2675 -3462,2688 -3463,2688 -3464,2688 -3465,2688 -3466,2688 -3467,2688 -3468,2688 -3469,2688 -3470,2688 -3471,2688 -3472,2688 -3473,2688 -3474,2688 -3475,2688 -3476,2688 -3477,2688 -3478,2688 -3479,2688 -3480,2688 -3481,2675 -3482,2688 -3483,2675 -3484,2688 -3485,2688 -3486,2688 -3487,2688 -3488,2688 -3489,2675 -3490,2688 -3491,2675 -3492,2675 -3493,2688 -3494,2688 -3495,2688 -3496,2688 -3497,2688 -3498,2688 -3499,2675 -3500,2688 -3501,2688 -3502,2688 -3503,2688 -3504,2688 -3505,2688 -3506,2688 -3507,2688 -3508,2688 -3509,2688 -3510,2688 -3511,2675 -3512,2688 -3513,2688 -3514,2688 -3515,2688 -3516,2688 -3517,2688 -3518,2688 -3519,2688 -3520,2688 -3521,2675 -3522,2675 -3523,2688 -3524,2688 -3525,2688 -3526,2688 -3527,2675 -3528,2688 -3529,2688 -3530,2688 -3531,2688 -3532,2688 -3533,2688 -3534,2688 -3535,2688 -3536,2688 -3537,2688 -3538,2688 -3539,2675 -3540,2688 -3541,2675 -3542,2675 -3543,2688 -3544,2688 -3545,2688 -3546,2688 -3547,2688 -3548,2688 -3549,2688 -3550,2688 -3551,2688 -3552,2675 -3553,2688 -3554,2688 -3555,2675 -3556,2688 -3557,2675 -3558,2688 -3559,2688 -3560,2688 -3561,2688 -3562,2688 -3563,2688 -3564,2688 -3565,2688 -3566,2688 -3567,2688 -3568,2675 -3569,2688 -3570,2688 -3571,2688 -3572,2688 -3573,2675 -3574,2675 -3575,2688 -3576,2688 -3577,2688 -3578,2688 -3579,2688 -3580,2688 -3581,2688 -3582,2688 -3583,2688 -3584,2688 -3585,2688 -3586,2675 -3587,2688 -3588,2688 -3589,2688 -3590,2688 -3591,2688 -3592,2688 -3593,2688 -3594,2688 -3595,2688 -3596,2688 -3597,2688 -3598,2675 -3599,2688 -3600,2688 -3601,2675 -3602,2688 -3603,2675 -3604,2675 -3605,2675 -3606,2688 -3607,2675 -3608,2688 -3609,2688 -3610,2688 -3611,2688 -3612,2688 -3613,2688 -3614,2688 -3615,2688 -3616,2688 -3617,2675 -3618,2688 -3619,2688 -3620,2675 -3621,2688 -3622,2688 -3623,2688 -3624,2688 -3625,2688 -3626,2688 -3627,2688 -3628,2688 -3629,2688 -3630,2688 -3631,2688 -3632,2688 -3633,2688 -3634,2688 -3635,2688 -3636,2688 -3637,2688 -3638,2688 -3639,2675 -3640,2688 -3641,2688 -3642,2688 -3643,2688 -3644,2688 -3645,2688 -3646,2688 -3647,2688 -3648,2688 -3649,2688 -3650,2688 -3651,2688 -3652,2688 -3653,2688 -3654,2688 -3655,2688 -3656,2688 -3657,2675 -3658,2688 -3659,2688 -3660,2688 -3661,2688 -3662,2688 -3663,2688 -3664,2675 -3665,2688 -3666,2688 -3667,2688 -3668,2688 -3669,2688 -3670,2688 -3671,2688 -3672,2688 -3673,2688 -3674,2688 -3675,2688 -3676,2688 -3677,2688 -3678,2688 -3679,2688 -3680,2688 -3681,2688 -3682,2688 -3683,2688 -3684,2675 -3685,2688 -3686,2688 -3687,2688 -3688,2688 -3689,2688 -3690,2675 -3691,2688 -3692,2688 -3693,2688 -3694,2688 -3695,2688 -3696,2688 -3697,2688 -3698,2688 -3699,2688 -3700,2688 -3701,2688 -3702,2688 -3703,2675 -3704,2688 -3705,2688 -3706,2688 -3707,2688 -3708,2688 -3709,2675 -3710,2688 -3711,2688 -3712,2688 -3713,2688 -3714,2688 -3715,2688 -3716,2688 -3717,2688 -3718,2688 -3719,2700 -3720,2688 -3721,2675 -3722,2688 -3723,2675 -3724,2688 -3725,2688 -3726,2688 -3727,2675 -3728,2688 -3729,2688 -3730,2688 -3731,2675 -3732,2688 -3733,2688 -3734,2688 -3735,2688 -3736,2688 -3737,2675 -3738,2688 -3739,2688 -3740,2688 -3741,2688 -3742,2688 -3743,2688 -3744,2688 -3745,2688 -3746,2688 -3747,2688 -3748,2688 -3749,2675 -3750,2688 -3751,2688 -3752,2688 -3753,2688 -3754,2688 -3755,2688 -3756,2688 -3757,2675 -3758,2688 -3759,2688 -3760,2688 -3761,2688 -3762,2688 -3763,2688 -3764,2688 -3765,2688 -3766,2688 -3767,2675 -3768,2688 -3769,2688 -3770,2688 -3771,2688 -3772,2688 -3773,2688 -3774,2688 -3775,2688 -3776,2688 -3777,2688 -3778,2688 -3779,2688 -3780,2688 -3781,2688 -3782,2688 -3783,2688 -3784,2688 -3785,2688 -3786,2688 -3787,2688 -3788,2688 -3789,2688 -3790,2688 -3791,2688 -3792,2688 -3793,2688 -3794,2688 -3795,2688 -3796,2688 -3797,2688 -3798,2688 -3799,2688 -3800,2688 -3801,2688 -3802,2675 -3803,2688 -3804,2688 -3805,2688 -3806,2688 -3807,2688 -3808,2688 -3809,2688 -3810,2688 -3811,2688 -3812,2688 -3813,2688 -3814,2688 -3815,2688 -3816,2688 -3817,2688 -3818,2675 -3819,2688 -3820,2688 -3821,2688 -3822,2688 -3823,2688 -3824,2688 -3825,2675 -3826,2688 -3827,2688 -3828,2688 -3829,2688 -3830,2688 -3831,2688 -3832,2688 -3833,2688 -3834,2688 -3835,2688 -3836,2688 -3837,2688 -3838,2688 -3839,2688 -3840,2688 -3841,2675 -3842,2688 -3843,2675 -3844,2688 -3845,2675 -3846,2688 -3847,2688 -3848,2675 -3849,2675 -3850,2688 -3851,2688 -3852,2688 -3853,2688 -3854,2688 -3855,2688 -3856,2675 -3857,2688 -3858,2688 -3859,2688 -3860,2688 -3861,2688 -3862,2675 -3863,2688 -3864,2688 -3865,2688 -3866,2688 -3867,2675 -3868,2688 -3869,2688 -3870,2688 -3871,2688 -3872,2675 -3873,2688 -3874,2688 -3875,2675 -3876,2688 -3877,2688 -3878,2688 -3879,2688 -3880,2688 -3881,2688 -3882,2688 -3883,2688 -3884,2688 -3885,2688 -3886,2688 -3887,2688 -3888,2688 -3889,2688 -3890,2688 -3891,2688 -3892,2688 -3893,2688 -3894,2688 -3895,2688 -3896,2688 -3897,2688 -3898,2688 -3899,2688 -3900,2700 -3901,2688 -3902,2688 -3903,2688 -3904,2688 -3905,2688 -3906,2688 -3907,2675 -3908,2688 -3909,2675 -3910,2688 -3911,2688 -3912,2688 -3913,2688 -3914,2688 -3915,2688 -3916,2688 -3917,2688 -3918,2688 -3919,2675 -3920,2688 -3921,2688 -3922,2688 -3923,2688 -3924,2688 -3925,2688 -3926,2688 -3927,2688 -3928,2688 -3929,2688 -3930,2688 -3931,2688 -3932,2688 -3933,2688 -3934,2688 -3935,2688 -3936,2688 -3937,2675 -3938,2675 -3939,2688 -3940,2688 -3941,2688 -3942,2675 -3943,2688 -3944,2688 -3945,2688 -3946,2688 -3947,2688 -3948,2675 -3949,2675 -3950,2688 -3951,2688 -3952,2688 -3953,2688 -3954,2688 -3955,2688 -3956,2688 -3957,2688 -3958,2688 -3959,2688 -3960,2688 -3961,2675 -3962,2688 -3963,2688 -3964,2688 -3965,2688 -3966,2700 -3967,2688 -3968,2688 -3969,2688 -3970,2688 -3971,2688 -3972,2688 -3973,2688 -3974,2675 -3975,2675 -3976,2688 -3977,2688 -3978,2688 -3979,2688 -3980,2688 -3981,2688 -3982,2688 -3983,2688 -3984,2688 -3985,2675 -3986,2675 -3987,2688 -3988,2688 -3989,2688 -3990,2688 -3991,2688 -3992,2688 -3993,2688 -3994,2688 -3995,2688 -3996,2688 -3997,2688 -3998,2688 -3999,2688 -4000,2688 -4001,2688 -4002,2688 -4003,2688 -4004,2688 -4005,2675 -4006,2688 -4007,2688 -4008,2688 -4009,2688 -4010,2688 -4011,2688 -4012,2675 -4013,2688 -4014,2688 -4015,2688 -4016,2688 -4017,2688 -4018,2688 -4019,2688 -4020,2675 -4021,2675 -4022,2688 -4023,2688 -4024,2688 -4025,2688 -4026,2688 -4027,2688 -4028,2688 -4029,2688 -4030,2688 -4031,2688 -4032,2688 -4033,2688 -4034,2688 -4035,2688 -4036,2688 -4037,2688 -4038,2688 -4039,2688 -4040,2675 -4041,2688 -4042,2688 -4043,2675 -4044,2688 -4045,2688 -4046,2688 -4047,2688 -4048,2688 -4049,2688 -4050,2675 -4051,2688 -4052,2688 -4053,2688 -4054,2688 -4055,2688 -4056,2688 -4057,2688 -4058,2688 -4059,2688 -4060,2688 -4061,2688 -4062,2675 -4063,2700 -4064,2688 -4065,2688 -4066,2688 -4067,2688 -4068,2675 -4069,2688 -4070,2675 -4071,2688 -4072,2688 -4073,2688 -4074,2688 -4075,2688 -4076,2688 -4077,2688 -4078,2688 -4079,2688 -4080,2688 -4081,2688 -4082,2700 -4083,2688 -4084,2700 -4085,2688 -4086,2688 -4087,2688 -4088,2688 -4089,2675 -4090,2688 -4091,2688 -4092,2688 -4093,2688 -4094,2688 -4095,2688 -4096,2688 -4097,2688 -4098,2688 -4099,2688 -4100,2688 -4101,2688 -4102,2688 -4103,2688 -4104,2688 -4105,2688 -4106,2688 -4107,2700 -4108,2688 -4109,2688 -4110,2688 -4111,2688 -4112,2675 -4113,2675 -4114,2688 -4115,2688 -4116,2688 -4117,2688 -4118,2688 -4119,2688 -4120,2700 -4121,2688 -4122,2688 -4123,2688 -4124,2688 -4125,2688 -4126,2688 -4127,2688 -4128,2688 -4129,2675 -4130,2688 -4131,2688 -4132,2688 -4133,2688 -4134,2688 -4135,2688 -4136,2688 -4137,2675 -4138,2688 -4139,2675 -4140,2688 -4141,2688 -4142,2688 -4143,2688 -4144,2675 -4145,2688 -4146,2688 -4147,2675 -4148,2688 -4149,2688 -4150,2688 -4151,2688 -4152,2688 -4153,2700 -4154,2675 -4155,2688 -4156,2675 -4157,2675 -4158,2688 -4159,2688 -4160,2688 -4161,2675 -4162,2688 -4163,2688 -4164,2688 -4165,2688 -4166,2688 -4167,2688 -4168,2688 -4169,2675 -4170,2688 -4171,2688 -4172,2688 -4173,2688 -4174,2688 -4175,2688 -4176,2688 -4177,2675 -4178,2688 -4179,2688 -4180,2688 -4181,2688 -4182,2675 -4183,2688 -4184,2688 -4185,2688 -4186,2688 -4187,2688 -4188,2688 -4189,2688 -4190,2688 -4191,2688 -4192,2688 -4193,2688 -4194,2675 -4195,2688 -4196,2688 -4197,2688 -4198,2688 -4199,2688 -4200,2688 -4201,2688 -4202,2675 -4203,2688 -4204,2688 -4205,2688 -4206,2675 -4207,2688 -4208,2688 -4209,2688 -4210,2688 -4211,2688 -4212,2688 -4213,2688 -4214,2688 -4215,2675 -4216,2675 -4217,2688 -4218,2675 -4219,2688 -4220,2688 -4221,2688 -4222,2688 -4223,2688 -4224,2688 -4225,2688 -4226,2688 -4227,2688 -4228,2688 -4229,2688 -4230,2688 -4231,2675 -4232,2688 -4233,2688 -4234,2675 -4235,2675 -4236,2688 -4237,2688 -4238,2688 -4239,2688 -4240,2675 -4241,2688 -4242,2688 -4243,2675 -4244,2688 -4245,2688 -4246,2688 -4247,2688 -4248,2688 -4249,2688 -4250,2700 -4251,2675 -4252,2688 -4253,2688 -4254,2688 -4255,2688 -4256,2688 -4257,2688 -4258,2688 -4259,2688 -4260,2688 -4261,2688 -4262,2688 -4263,2688 -4264,2688 -4265,2675 -4266,2688 -4267,2688 -4268,2688 -4269,2688 -4270,2688 -4271,2675 -4272,2688 -4273,2700 -4274,2688 -4275,2675 -4276,2688 -4277,2688 -4278,2688 -4279,2688 -4280,2675 -4281,2688 -4282,2688 -4283,2688 -4284,2688 -4285,2675 -4286,2688 -4287,2688 -4288,2675 -4289,2688 -4290,2675 -4291,2688 -4292,2688 -4293,2688 -4294,2688 -4295,2688 -4296,2688 -4297,2688 -4298,2688 -4299,2688 -4300,2688 -4301,2688 -4302,2688 -4303,2688 -4304,2688 -4305,2688 -4306,2688 -4307,2675 -4308,2675 -4309,2688 -4310,2688 -4311,2688 -4312,2675 -4313,2675 -4314,2688 -4315,2688 -4316,2688 -4317,2688 -4318,2688 -4319,2675 -4320,2688 -4321,2688 -4322,2688 -4323,2688 -4324,2675 -4325,2688 -4326,2688 -4327,2688 -4328,2688 -4329,2688 -4330,2675 -4331,2688 -4332,2688 -4333,2688 -4334,2688 -4335,2688 -4336,2688 -4337,2700 -4338,2688 -4339,2688 -4340,2688 -4341,2688 -4342,2688 -4343,2700 -4344,2688 -4345,2675 -4346,2688 -4347,2688 -4348,2675 -4349,2675 -4350,2688 -4351,2688 -4352,2688 -4353,2688 -4354,2688 -4355,2688 -4356,2688 -4357,2688 -4358,2688 -4359,2688 -4360,2688 -4361,2688 -4362,2688 -4363,2688 -4364,2688 -4365,2688 -4366,2688 -4367,2688 -4368,2688 -4369,2688 -4370,2688 -4371,2688 -4372,2688 -4373,2675 -4374,2675 -4375,2688 -4376,2688 -4377,2675 -4378,2688 -4379,2688 -4380,2688 -4381,2688 -4382,2688 -4383,2688 -4384,2688 -4385,2688 -4386,2675 -4387,2688 -4388,2688 -4389,2688 -4390,2688 -4391,2688 -4392,2688 -4393,2688 -4394,2688 -4395,2688 -4396,2688 -4397,2688 -4398,2700 -4399,2688 -4400,2688 -4401,2688 -4402,2688 -4403,2688 -4404,2688 -4405,2688 -4406,2688 -4407,2688 -4408,2675 -4409,2688 -4410,2688 -4411,2688 -4412,2688 -4413,2688 -4414,2688 -4415,2675 -4416,2688 -4417,2688 -4418,2688 -4419,2688 -4420,2688 -4421,2688 -4422,2688 -4423,2688 -4424,2688 -4425,2688 -4426,2688 -4427,2688 -4428,2688 -4429,2688 -4430,2688 -4431,2688 -4432,2688 -4433,2688 -4434,2688 -4435,2688 -4436,2688 -4437,2688 -4438,2688 -4439,2688 -4440,2688 -4441,2688 -4442,2688 -4443,2675 -4444,2688 -4445,2675 -4446,2675 -4447,2688 -4448,2688 -4449,2688 -4450,2688 -4451,2675 -4452,2688 -4453,2688 -4454,2675 -4455,2688 -4456,2688 -4457,2688 -4458,2688 -4459,2688 -4460,2688 -4461,2688 -4462,2688 -4463,2688 -4464,2688 -4465,2688 -4466,2688 -4467,2688 -4468,2688 -4469,2688 -4470,2688 -4471,2688 -4472,2688 -4473,2688 -4474,2688 -4475,2688 -4476,2675 -4477,2688 -4478,2688 -4479,2688 -4480,2688 -4481,2688 -4482,2688 -4483,2688 -4484,2688 -4485,2688 -4486,2688 -4487,2688 -4488,2688 -4489,2688 -4490,2688 -4491,2688 -4492,2675 -4493,2688 -4494,2688 -4495,2688 -4496,2688 -4497,2688 -4498,2688 -4499,2688 -4500,2688 -4501,2688 -4502,2688 -4503,2688 -4504,2688 -4505,2688 -4506,2688 -4507,2688 -4508,2688 -4509,2688 -4510,2688 -4511,2688 -4512,2688 -4513,2688 -4514,2688 -4515,2675 -4516,2688 -4517,2675 -4518,2688 -4519,2688 -4520,2688 -4521,2688 -4522,2688 -4523,2688 -4524,2688 -4525,2688 -4526,2688 -4527,2688 -4528,2688 -4529,2688 -4530,2688 -4531,2688 -4532,2688 -4533,2688 -4534,2688 -4535,2688 -4536,2688 -4537,2675 -4538,2675 -4539,2688 -4540,2688 -4541,2688 -4542,2688 -4543,2688 -4544,2688 -4545,2688 -4546,2688 -4547,2688 -4548,2688 -4549,2688 -4550,2688 -4551,2688 -4552,2688 -4553,2688 -4554,2675 -4555,2688 -4556,2688 -4557,2688 -4558,2688 -4559,2688 -4560,2688 -4561,2688 -4562,2688 -4563,2688 -4564,2688 -4565,2675 -4566,2688 -4567,2688 -4568,2688 -4569,2688 -4570,2688 -4571,2688 -4572,2688 -4573,2688 -4574,2688 -4575,2688 -4576,2688 -4577,2688 -4578,2700 -4579,2688 -4580,2688 -4581,2688 -4582,2688 -4583,2688 -4584,2688 -4585,2688 -4586,2688 -4587,2688 -4588,2688 -4589,2675 -4590,2675 -4591,2675 -4592,2688 -4593,2688 -4594,2688 -4595,2688 -4596,2688 -4597,2688 -4598,2688 -4599,2688 -4600,2688 -4601,2688 -4602,2688 -4603,2688 -4604,2688 -4605,2688 -4606,2700 -4607,2688 -4608,2688 -4609,2688 -4610,2688 -4611,2688 -4612,2688 -4613,2688 -4614,2688 -4615,2675 -4616,2688 -4617,2688 -4618,2688 -4619,2688 -4620,2688 -4621,2688 -4622,2688 -4623,2688 -4624,2688 -4625,2688 -4626,2688 -4627,2688 -4628,2688 -4629,2688 -4630,2688 -4631,2688 -4632,2688 -4633,2688 -4634,2688 -4635,2688 -4636,2688 -4637,2688 -4638,2688 -4639,2688 -4640,2688 -4641,2688 -4642,2688 -4643,2688 -4644,2688 -4645,2688 -4646,2688 -4647,2688 -4648,2688 -4649,2688 -4650,2688 -4651,2688 -4652,2688 -4653,2688 -4654,2688 -4655,2688 -4656,2688 -4657,2688 -4658,2688 -4659,2688 -4660,2675 -4661,2688 -4662,2688 -4663,2688 -4664,2688 -4665,2688 -4666,2675 -4667,2688 -4668,2688 -4669,2688 -4670,2688 -4671,2688 -4672,2688 -4673,2688 -4674,2688 -4675,2688 -4676,2688 -4677,2688 -4678,2688 -4679,2688 -4680,2688 -4681,2688 -4682,2688 -4683,2688 -4684,2688 -4685,2688 -4686,2688 -4687,2675 -4688,2688 -4689,2688 -4690,2688 -4691,2688 -4692,2688 -4693,2688 -4694,2700 -4695,2675 -4696,2688 -4697,2688 -4698,2688 -4699,2675 -4700,2688 -4701,2675 -4702,2688 -4703,2688 -4704,2688 -4705,2688 -4706,2675 -4707,2688 -4708,2688 -4709,2688 -4710,2688 -4711,2688 -4712,2675 -4713,2688 -4714,2688 -4715,2688 -4716,2688 -4717,2688 -4718,2688 -4719,2688 -4720,2688 -4721,2688 -4722,2688 -4723,2688 -4724,2688 -4725,2675 -4726,2688 -4727,2688 -4728,2675 -4729,2688 -4730,2688 -4731,2688 -4732,2688 -4733,2688 -4734,2688 -4735,2688 -4736,2688 -4737,2688 -4738,2688 -4739,2688 -4740,2688 -4741,2688 -4742,2688 -4743,2688 -4744,2688 -4745,2688 -4746,2688 -4747,2688 -4748,2688 -4749,2688 -4750,2688 -4751,2688 -4752,2688 -4753,2688 -4754,2688 -4755,2688 -4756,2688 -4757,2688 -4758,2688 -4759,2688 -4760,2688 -4761,2688 -4762,2688 -4763,2688 -4764,2688 -4765,2688 -4766,2688 -4767,2688 -4768,2688 -4769,2688 -4770,2688 -4771,2675 -4772,2688 -4773,2688 -4774,2688 -4775,2688 -4776,2688 -4777,2688 -4778,2688 -4779,2688 -4780,2688 -4781,2688 -4782,2688 -4783,2675 -4784,2688 -4785,2688 -4786,2688 -4787,2675 -4788,2688 -4789,2688 -4790,2688 -4791,2688 -4792,2688 -4793,2688 -4794,2688 -4795,2688 -4796,2688 -4797,2688 -4798,2688 -4799,2688 -4800,2688 -4801,2688 -4802,2688 -4803,2700 -4804,2688 -4805,2688 -4806,2688 -4807,2688 -4808,2688 -4809,2688 -4810,2688 -4811,2688 -4812,2688 -4813,2688 -4814,2688 -4815,2688 -4816,2688 -4817,2675 -4818,2688 -4819,2688 -4820,2688 -4821,2675 -4822,2688 -4823,2688 -4824,2688 -4825,2688 -4826,2688 -4827,2675 -4828,2688 -4829,2688 -4830,2688 -4831,2688 -4832,2688 -4833,2675 -4834,2688 -4835,2688 -4836,2688 -4837,2688 -4838,2688 -4839,2688 -4840,2688 -4841,2688 -4842,2675 -4843,2688 -4844,2688 -4845,2688 -4846,2688 -4847,2688 -4848,2688 -4849,2675 -4850,2688 -4851,2675 -4852,2688 -4853,2688 -4854,2688 -4855,2688 -4856,2688 -4857,2688 -4858,2688 -4859,2688 -4860,2688 -4861,2688 -4862,2688 -4863,2688 -4864,2688 -4865,2688 -4866,2688 -4867,2675 -4868,2688 -4869,2688 -4870,2688 -4871,2675 -4872,2688 -4873,2675 -4874,2675 -4875,2688 -4876,2688 -4877,2688 -4878,2688 -4879,2688 -4880,2688 -4881,2688 -4882,2688 -4883,2688 -4884,2688 -4885,2688 -4886,2688 -4887,2688 -4888,2688 -4889,2688 -4890,2688 -4891,2688 -4892,2688 -4893,2688 -4894,2688 -4895,2688 -4896,2688 -4897,2688 -4898,2688 -4899,2688 -4900,2688 -4901,2688 -4902,2675 -4903,2688 -4904,2688 -4905,2688 -4906,2688 -4907,2688 -4908,2688 -4909,2688 -4910,2688 -4911,2688 -4912,2688 -4913,2688 -4914,2688 -4915,2688 -4916,2688 -4917,2688 -4918,2688 -4919,2688 -4920,2688 -4921,2688 -4922,2688 -4923,2688 -4924,2688 -4925,2688 -4926,2688 -4927,2688 -4928,2688 -4929,2688 -4930,2688 -4931,2688 -4932,2688 -4933,2688 -4934,2688 -4935,2675 -4936,2675 -4937,2688 -4938,2688 -4939,2688 -4940,2688 -4941,2688 -4942,2688 -4943,2688 -4944,2675 -4945,2675 -4946,2688 -4947,2675 -4948,2688 -4949,2675 -4950,2688 -4951,2688 -4952,2688 -4953,2688 -4954,2688 -4955,2688 -4956,2675 -4957,2688 -4958,2688 -4959,2688 -4960,2675 -4961,2688 -4962,2688 -4963,2688 -4964,2688 -4965,2688 -4966,2675 -4967,2688 -4968,2688 -4969,2675 -4970,2688 -4971,2688 -4972,2688 -4973,2688 -4974,2688 -4975,2688 -4976,2675 -4977,2688 -4978,2688 -4979,2688 -4980,2688 -4981,2688 -4982,2688 -4983,2688 -4984,2675 -4985,2688 -4986,2688 -4987,2688 -4988,2688 -4989,2675 -4990,2688 -4991,2675 -4992,2688 -4993,2688 -4994,2675 -4995,2688 -4996,2688 -4997,2688 -4998,2688 -4999,2688 -5000,2675 -5001,2688 -5002,2688 -5003,2688 -5004,2688 -5005,2675 -5006,2700 -5007,2688 -5008,2688 -5009,2688 -5010,2688 -5011,2688 -5012,2688 -5013,2688 -5014,2688 -5015,2675 -5016,2688 -5017,2688 -5018,2688 -5019,2688 -5020,2688 -5021,2675 -5022,2688 -5023,2688 -5024,2688 -5025,2688 -5026,2688 -5027,2675 -5028,2688 -5029,2688 -5030,2688 -5031,2688 -5032,2688 -5033,2688 -5034,2688 -5035,2688 -5036,2688 -5037,2688 -5038,2688 -5039,2688 -5040,2688 -5041,2688 -5042,2688 -5043,2688 -5044,2688 -5045,2688 -5046,2688 -5047,2688 -5048,2688 -5049,2688 -5050,2688 -5051,2688 -5052,2688 -5053,2688 -5054,2688 -5055,2688 -5056,2688 -5057,2688 -5058,2688 -5059,2688 -5060,2675 -5061,2688 -5062,2688 -5063,2688 -5064,2688 -5065,2688 -5066,2688 -5067,2688 -5068,2675 -5069,2675 -5070,2688 -5071,2688 -5072,2688 -5073,2688 -5074,2688 -5075,2688 -5076,2688 -5077,2688 -5078,2688 -5079,2675 -5080,2675 -5081,2688 -5082,2688 -5083,2688 -5084,2688 -5085,2688 -5086,2688 -5087,2688 -5088,2675 -5089,2688 -5090,2688 -5091,2688 -5092,2688 -5093,2688 -5094,2688 -5095,2688 -5096,2688 -5097,2675 -5098,2688 -5099,2688 -5100,2688 -5101,2688 -5102,2688 -5103,2688 -5104,2688 -5105,2688 -5106,2688 -5107,2688 -5108,2688 -5109,2675 -5110,2688 -5111,2688 -5112,2688 -5113,2688 -5114,2688 -5115,2688 -5116,2675 -5117,2688 -5118,2688 -5119,2688 -5120,2688 -5121,2688 -5122,2688 -5123,2688 -5124,2688 -5125,2688 -5126,2675 -5127,2700 -5128,2688 -5129,2688 -5130,2688 -5131,2688 -5132,2688 -5133,2688 -5134,2688 -5135,2688 -5136,2688 -5137,2688 -5138,2688 -5139,2688 -5140,2688 -5141,2688 -5142,2688 -5143,2688 -5144,2688 -5145,2688 -5146,2675 -5147,2688 -5148,2688 -5149,2688 -5150,2688 -5151,2688 -5152,2675 -5153,2688 -5154,2688 -5155,2688 -5156,2688 -5157,2688 -5158,2688 -5159,2675 -5160,2688 -5161,2688 -5162,2688 -5163,2688 -5164,2688 -5165,2675 -5166,2688 -5167,2675 -5168,2688 -5169,2675 -5170,2688 -5171,2688 -5172,2688 -5173,2688 -5174,2688 -5175,2675 -5176,2675 -5177,2675 -5178,2688 -5179,2675 -5180,2688 -5181,2688 -5182,2675 -5183,2688 -5184,2688 -5185,2688 -5186,2688 -5187,2688 -5188,2688 -5189,2688 -5190,2688 -5191,2688 -5192,2688 -5193,2688 -5194,2688 -5195,2675 -5196,2688 -5197,2688 -5198,2688 -5199,2688 -5200,2675 -5201,2675 -5202,2688 -5203,2688 -5204,2688 -5205,2688 -5206,2688 -5207,2688 -5208,2675 -5209,2688 -5210,2688 -5211,2688 -5212,2688 -5213,2688 -5214,2688 -5215,2688 -5216,2688 -5217,2688 -5218,2688 -5219,2688 -5220,2688 -5221,2675 -5222,2688 -5223,2688 -5224,2688 -5225,2688 -5226,2688 -5227,2688 -5228,2688 -5229,2688 -5230,2688 -5231,2675 -5232,2688 -5233,2688 -5234,2688 -5235,2688 -5236,2688 -5237,2688 -5238,2688 -5239,2688 -5240,2675 -5241,2688 -5242,2688 -5243,2688 -5244,2688 -5245,2688 -5246,2688 -5247,2688 -5248,2688 -5249,2688 -5250,2688 -5251,2688 -5252,2688 -5253,2688 -5254,2688 -5255,2688 -5256,2688 -5257,2688 -5258,2688 -5259,2688 -5260,2675 -5261,2688 -5262,2688 -5263,2688 -5264,2688 -5265,2688 -5266,2675 -5267,2688 -5268,2688 -5269,2688 -5270,2688 -5271,2688 -5272,2675 -5273,2688 -5274,2688 -5275,2688 -5276,2688 -5277,2688 -5278,2688 -5279,2688 -5280,2688 -5281,2688 -5282,2688 -5283,2688 -5284,2688 -5285,2688 -5286,2675 -5287,2675 -5288,2688 -5289,2688 -5290,2688 -5291,2688 -5292,2688 -5293,2688 -5294,2688 -5295,2688 -5296,2688 -5297,2688 -5298,2688 -5299,2688 -5300,2688 -5301,2688 -5302,2688 -5303,2688 -5304,2688 -5305,2675 -5306,2688 -5307,2688 -5308,2688 -5309,2688 -5310,2688 -5311,2688 -5312,2688 -5313,2688 -5314,2688 -5315,2688 -5316,2688 -5317,2688 -5318,2688 -5319,2688 -5320,2688 -5321,2688 -5322,2688 -5323,2688 -5324,2688 -5325,2688 -5326,2688 -5327,2688 -5328,2688 -5329,2688 -5330,2675 -5331,2688 -5332,2688 -5333,2688 -5334,2688 -5335,2688 -5336,2688 -5337,2688 -5338,2688 -5339,2688 -5340,2688 -5341,2688 -5342,2688 -5343,2688 -5344,2688 -5345,2688 -5346,2688 -5347,2688 -5348,2688 -5349,2688 -5350,2675 -5351,2688 -5352,2675 -5353,2688 -5354,2688 -5355,2688 -5356,2688 -5357,2675 -5358,2688 -5359,2688 -5360,2688 -5361,2688 -5362,2688 -5363,2675 -5364,2688 -5365,2688 -5366,2688 -5367,2675 -5368,2688 -5369,2688 -5370,2688 -5371,2688 -5372,2688 -5373,2688 -5374,2688 -5375,2688 -5376,2688 -5377,2688 -5378,2688 -5379,2688 -5380,2688 -5381,2688 -5382,2688 -5383,2675 -5384,2688 -5385,2688 -5386,2688 -5387,2688 -5388,2688 -5389,2688 -5390,2688 -5391,2688 -5392,2688 -5393,2688 -5394,2688 -5395,2688 -5396,2688 -5397,2688 -5398,2688 -5399,2675 diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Encoder.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Encoder.cs new file mode 100644 index 000000000..d2eb00cb6 --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Encoder.cs @@ -0,0 +1,55 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +include "..\..\Defines\Tango_Defines_Basic.cs" +include "Tango_Defines_SSI.cs" +//include "C:\To_Backup\Mulberry\Mulberry_current\Customers\Twine\Tango\LAB_Tests\Main_PCB\ATP_Test\Scripts\Defines\Tango_Defines_Basic.cs" +//include "C:\To_Backup\Mulberry\Mulberry_current\Customers\Twine\Tango\LAB_Tests\Main_PCB\ATP_Test\Scripts\Defines\Tango_Defines_SSI.cs" + + +public void OnExecute(StubManager stubManager) +{ + int k = 0; + Fpga_Read_Reg(FPGA1, F1_Prescaler1_reg1, 0); + Fpga_Read_Reg(FPGA1, F1_Prescaler1_reg2, 0); + + //Set output clock frequency to about 200 kHz + Fpga_Write_Reg(FPGA1, F1_Prescaler1_reg1, 0x0024, 0); + Fpga_Write_Reg(FPGA1, F1_Prescaler1_reg2, 0x0024, 0); + + Fpga_Read_Reg(FPGA1, F1_Prescaler1_reg1, 0); + Fpga_Read_Reg(FPGA1, F1_Prescaler1_reg2, 0); + + for (int i = 0; i < 1000; i++) + { + + stubManager.Write(ReadEncoder_Dryer() +"\n"); + + Thread.Sleep(100); + } + + +} + +Int32 ReadEncoder_Dryer() +{ + Int32 temp; + Int32 temp1; + stubManager.Run("StubFpgaWriteRegRequest" ,0x6000019e, 0x0000); //triggers a TX transmission + + var response = stubManager.Run("StubFpgaReadRegRequest" ,0x60000190); + var response1 = stubManager.Run("StubFpgaReadRegRequest" ,0x60000192); + + temp = Convert.ToInt32 (((((response1.Value <<16) + response.Value)>>10 ) & 0x3fff)); + + return temp; +} diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_SSR.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_SSR.cs index b059a170f..b092d6a20 100644 --- a/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_SSR.cs +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_SSR.cs @@ -26,17 +26,16 @@ float temp1=4096*95*5; stubManager.WriteHex(response.TemperatureCMultBy100,4); SetBit (FPGA2, F2_CTRL, 10, 1); stubManager.Write("\tTesting SSR no. 1\t"); - Thread.Sleep(1000); - - + Thread.Sleep(10000); + var response1 = stubManager.Run("StubIntADCReadRequest" ,16); temp=Convert.ToUInt32 (response1.SamplingInBits); - temp=temp*800*3*100; + + temp=temp*2400*60*100; temp=temp/(4096*95*50); - stubManager.Write("Current = "+ temp + "A\n"); - temp=temp*60; - stubManager.Write("Voltage = "+ temp + " Volt\n"); + stubManager.Write("Voltage = "+ temp + "Volt/n"); + stubManager.Write("Current = "+ temp*100/6 + "mA/n"); SetBit (FPGA2, F2_CTRL, 10, 0); @@ -50,17 +49,16 @@ var response1 = stubManager.Run("StubIntADCReadRequest" stubManager.WriteHex(response.TemperatureCMultBy100,4); SetBit (FPGA2, F2_CTRL, 9, 1); stubManager.Write("\tTesting SSR no. 2\t"); - Thread.Sleep(1000); + Thread.Sleep(10000); -response1 = stubManager.Run("StubIntADCReadRequest" ,17); + response1 = stubManager.Run("StubIntADCReadRequest" ,17); temp=Convert.ToUInt32 (response1.SamplingInBits); - stubManager.WriteLine(temp); - temp=temp*800*3*100; - temp=temp/(4096*95*120); - stubManager.Write("Current = "+ temp + "A\n"); - temp=temp*120; - stubManager.Write("Voltage = "+ temp + " Volt\n"); + + temp=temp*2400*1000; + temp=temp/(4096*95*100); + stubManager.Write("Current = "+ temp*100/6 + "mA/n"); + SetBit (FPGA2, F2_CTRL, 9, 0); diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Tset.CSV b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Tset.CSV index daadff892..de439d914 100644 --- a/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Tset.CSV +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Tset.CSV @@ -1,14 +1,99 @@ -24/06/2020 9:51:30 +03/09/2020 22:34:12 Heating to 190 -24/06/2020 9:51:30 - 99 - 99 - 99 - 99 - 99 - 99 - 99 - 98 +03/09/2020 22:34:12 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 60 + 60 + 60 + 60 + 61 + 61 + 61 + 62 + 62 + 63 + 63 + 64 + 64 + 65 + 65 + 66 + 66 + 67 + 67 + 68 + 68 + 69 + 69 + 70 + 71 + 71 + 72 + 72 + 73 + 73 + 74 + 74 + 75 + 75 + 76 + 76 + 77 + 78 + 78 + 79 + 80 + 80 + 81 + 81 + 82 + 82 + 83 + 83 + 84 + 84 + 85 + 85 + 86 + 86 + 87 + 87 + 88 + 88 + 89 + 89 + 89 + 90 + 90 + 91 + 91 + 92 + 92 + 93 + 93 + 93 + 94 + 94 + 95 + 95 + 96 + 96 + 97 + 97 98 98 98 @@ -16,88 +101,128 @@ Heating to 190 99 99 100 - 100 - 100 + 101 + 101 101 102 + 102 + 102 + 103 103 103 104 104 105 105 + 105 106 106 + 106 + 107 107 107 108 108 + 108 + 109 109 109 110 110 + 110 + 111 111 111 112 112 112 + 112 + 113 113 113 114 114 + 114 + 115 + 115 115 115 - 116 116 116 117 117 + 117 + 117 118 118 + 118 + 119 119 119 119 120 120 + 120 + 120 121 121 121 122 122 + 122 + 122 123 123 123 124 124 + 124 + 124 + 125 + 125 125 125 125 126 126 126 + 126 + 127 127 127 127 128 128 + 128 + 128 + 129 + 129 129 129 129 130 130 130 + 130 + 131 131 131 131 132 132 132 + 132 + 132 133 133 133 + 133 + 134 134 134 134 + 134 + 135 135 135 135 @@ -108,9 +233,15 @@ Heating to 190 137 137 137 + 137 + 137 138 138 138 + 138 + 138 + 139 + 139 139 139 139 @@ -118,12 +249,18 @@ Heating to 190 140 140 140 + 140 + 141 141 141 141 142 142 142 + 142 + 142 + 143 + 143 143 143 143 @@ -131,10 +268,14 @@ Heating to 190 144 144 144 + 144 + 145 145 145 145 145 + 145 + 146 146 146 146 @@ -142,14 +283,20 @@ Heating to 190 147 147 147 + 147 + 147 148 148 148 148 + 148 + 149 149 149 149 149 + 149 + 150 150 150 150 @@ -158,10 +305,14 @@ Heating to 190 151 151 151 + 151 + 152 152 152 152 152 + 152 + 153 153 153 153 @@ -171,6 +322,9 @@ Heating to 190 154 154 154 + 154 + 155 + 155 155 155 155 @@ -184,6 +338,9 @@ Heating to 190 157 157 157 + 157 + 157 + 158 158 158 158 @@ -193,11 +350,15 @@ Heating to 190 159 159 159 + 159 + 159 160 160 160 160 160 + 160 + 161 161 161 161 @@ -208,6 +369,8 @@ Heating to 190 162 162 162 + 162 + 163 163 163 163 @@ -218,6 +381,8 @@ Heating to 190 164 164 164 + 164 + 165 165 165 165 @@ -228,10 +393,16 @@ Heating to 190 166 166 166 + 166 + 166 167 167 167 167 + 167 + 167 + 167 + 168 168 168 168 @@ -248,12 +419,17 @@ Heating to 190 170 170 170 + 170 + 170 171 171 171 171 171 171 + 171 + 172 + 172 172 172 172 @@ -277,11 +453,18 @@ Heating to 190 175 175 175 + 175 + 176 + 176 176 176 176 176 176 + 176 + 177 + 177 + 177 177 177 177 @@ -316,7 +499,6 @@ Heating to 190 180 180 180 - 180 181 181 181 @@ -345,6 +527,8 @@ Heating to 190 184 184 184 + 184 + 185 185 185 185 @@ -374,10 +558,9 @@ Heating to 190 188 188 189 -24/06/2020 9:57:48 +03/09/2020 22:43:52 cooling down -24/06/2020 9:59:48 - 190 +03/09/2020 22:45:53 190 190 190 @@ -402,7 +585,6 @@ cooling down 188 188 188 - 188 187 187 187 @@ -416,14 +598,13 @@ cooling down 185 184 184 - 184 183 183 183 182 182 182 - 182 + 181 181 181 180 @@ -434,14 +615,11 @@ cooling down 179 178 178 - 178 177 177 177 176 176 - 176 - 176 175 175 175 @@ -458,22 +636,19 @@ cooling down 171 171 171 - 171 170 170 170 169 169 169 - 169 - 168 168 168 168 167 167 167 - 166 + 167 166 166 166 @@ -484,8 +659,6 @@ cooling down 164 164 164 - 164 - 163 163 163 163 @@ -498,7 +671,7 @@ cooling down 161 161 161 - 161 + 160 160 160 160 @@ -507,9 +680,6 @@ cooling down 159 159 159 - 159 - 158 - 158 158 158 158 @@ -524,7 +694,6 @@ cooling down 156 156 156 - 156 155 155 155 @@ -535,15 +704,11 @@ cooling down 154 154 154 - 154 - 153 153 153 153 153 153 - 153 - 152 152 152 152 @@ -556,8 +721,6 @@ cooling down 151 151 151 - 151 - 150 150 150 150 @@ -578,8 +741,6 @@ cooling down 148 148 148 - 148 - 148 147 147 147 @@ -587,10 +748,6 @@ cooling down 147 147 147 - 147 - 147 - 146 - 146 146 146 146 @@ -606,10 +763,6 @@ cooling down 145 145 145 - 145 - 144 - 144 - 144 144 144 144 @@ -626,8 +779,6 @@ cooling down 143 143 143 - 143 - 142 142 142 142 @@ -638,9 +789,6 @@ cooling down 142 142 142 - 142 - 141 - 141 141 141 141 @@ -656,3 +804,24324 @@ cooling down 140 140 140 + 140 + 140 + 140 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 59 +04/09/2020 0:00:34 +Heating to 190 +04/09/2020 0:00:34 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 61 + 61 + 61 + 61 + 62 + 62 + 62 + 63 + 63 + 64 + 64 + 65 + 65 + 65 + 66 + 66 + 67 + 67 + 68 + 69 + 69 + 70 + 70 + 71 + 71 + 72 + 72 + 73 + 73 + 74 + 75 + 75 + 76 + 76 + 77 + 77 + 78 + 78 + 79 + 79 + 80 + 80 + 81 + 81 + 82 + 82 + 83 + 83 + 84 + 84 + 85 + 85 + 86 + 87 + 87 + 88 + 88 + 89 + 89 + 90 + 90 + 91 + 91 + 92 + 92 + 92 + 93 + 93 + 94 + 94 + 95 + 95 + 96 + 96 + 97 + 97 + 97 + 98 + 98 + 99 + 99 + 99 + 100 + 100 + 101 + 101 + 101 + 102 + 102 + 103 + 103 + 103 + 104 + 104 + 105 + 105 + 105 + 106 + 106 + 106 + 107 + 107 + 107 + 108 + 108 + 108 + 109 + 109 + 110 + 110 + 110 + 111 + 111 + 111 + 112 + 112 + 112 + 113 + 113 + 113 + 114 + 114 + 114 + 114 + 115 + 115 + 116 + 116 + 116 + 116 + 117 + 117 + 117 + 118 + 118 + 118 + 118 + 119 + 119 + 119 + 120 + 120 + 120 + 120 + 121 + 121 + 121 + 121 + 122 + 122 + 122 + 123 + 123 + 123 + 123 + 124 + 124 + 124 + 124 + 125 + 125 + 125 + 125 + 126 + 126 + 126 + 126 + 127 + 127 + 127 + 128 + 128 + 128 + 128 + 129 + 129 + 129 + 129 + 130 + 130 + 130 + 130 + 130 + 131 + 131 + 131 + 131 + 132 + 132 + 132 + 132 + 133 + 133 + 133 + 133 + 134 + 134 + 134 + 134 + 134 + 135 + 135 + 135 + 135 + 136 + 136 + 136 + 136 + 137 + 137 + 137 + 137 + 137 + 138 + 138 + 138 + 138 + 138 + 139 + 139 + 139 + 139 + 140 + 140 + 140 + 140 + 140 + 141 + 141 + 141 + 141 + 142 + 142 + 142 + 142 + 142 + 143 + 143 + 143 + 143 + 143 + 144 + 144 + 144 + 144 + 144 + 145 + 145 + 145 + 145 + 146 + 146 + 146 + 146 + 146 + 147 + 147 + 147 + 147 + 147 + 147 + 148 + 148 + 148 + 148 + 148 + 149 + 149 + 149 + 149 + 150 + 150 + 150 + 150 + 150 + 150 + 151 + 151 + 151 + 151 + 151 + 151 + 152 + 152 + 152 + 152 + 152 + 152 + 153 + 153 + 153 + 153 + 153 + 154 + 154 + 154 + 154 + 154 + 154 + 155 + 155 + 155 + 155 + 155 + 155 + 156 + 156 + 156 + 156 + 156 + 156 + 157 + 157 + 157 + 157 + 157 + 158 + 158 + 158 + 158 + 158 + 158 + 159 + 159 + 159 + 159 + 159 + 159 + 160 + 160 + 160 + 160 + 160 + 160 + 161 + 161 + 161 + 161 + 161 + 161 + 162 + 162 + 162 + 162 + 162 + 162 + 163 + 163 + 163 + 163 + 163 + 164 + 164 + 164 + 164 + 164 + 164 + 165 + 165 + 165 + 165 + 165 + 165 + 165 + 166 + 166 + 166 + 166 + 166 + 166 + 167 + 167 + 167 + 167 + 167 + 167 + 168 + 168 + 168 + 168 + 168 + 168 + 169 + 169 + 169 + 169 + 169 + 169 + 170 + 170 + 170 + 170 + 170 + 170 + 170 + 171 + 171 + 171 + 171 + 171 + 171 + 172 + 172 + 172 + 172 + 172 + 172 + 172 + 173 + 173 + 173 + 173 + 173 + 173 + 174 + 174 + 174 + 174 + 174 + 174 + 174 + 175 + 175 + 175 + 175 + 175 + 175 + 175 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 182 + 182 + 182 + 182 + 182 + 182 + 183 + 183 + 183 + 183 + 183 + 183 + 183 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 187 + 187 + 187 + 187 + 187 + 187 + 187 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 189 +04/09/2020 0:10:05 +cooling down +04/09/2020 0:12:05 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 189 + 189 + 189 + 189 + 189 + 189 + 189 + 188 + 188 + 188 + 188 + 187 + 187 + 187 + 187 + 186 + 186 + 186 + 185 + 185 + 185 + 184 + 184 + 184 + 183 + 183 + 183 + 182 + 182 + 181 + 181 + 181 + 180 + 180 + 180 + 179 + 179 + 179 + 178 + 178 + 178 + 177 + 177 + 177 + 176 + 176 + 175 + 175 + 175 + 174 + 174 + 174 + 173 + 173 + 173 + 172 + 172 + 172 + 171 + 171 + 171 + 170 + 170 + 169 + 169 + 169 + 169 + 168 + 168 + 168 + 167 + 167 + 167 + 167 + 166 + 166 + 166 + 165 + 165 + 165 + 165 + 164 + 164 + 164 + 163 + 163 + 163 + 163 + 162 + 162 + 162 + 162 + 161 + 161 + 161 + 161 + 160 + 160 + 160 + 160 + 160 + 159 + 159 + 159 + 158 + 158 + 158 + 158 + 158 + 157 + 157 + 157 + 157 + 157 + 156 + 156 + 156 + 156 + 156 + 155 + 155 + 155 + 155 + 154 + 154 + 154 + 154 + 154 + 154 + 153 + 153 + 153 + 153 + 153 + 152 + 152 + 152 + 152 + 152 + 151 + 151 + 151 + 151 + 151 + 151 + 150 + 150 + 150 + 150 + 150 + 150 + 150 + 149 + 149 + 149 + 149 + 149 + 149 + 148 + 148 + 148 + 148 + 148 + 148 + 148 + 147 + 147 + 147 + 147 + 147 + 147 + 146 + 146 + 146 + 146 + 146 + 146 + 146 + 146 + 145 + 145 + 145 + 145 + 145 + 145 + 145 + 145 + 144 + 144 + 144 + 144 + 144 + 144 + 144 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 59 +04/09/2020 1:27:04 +Heating to 190 +04/09/2020 1:27:04 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 61 + 61 + 61 + 62 + 62 + 63 + 63 + 63 + 64 + 64 + 65 + 65 + 66 + 66 + 67 + 67 + 68 + 68 + 69 + 69 + 70 + 70 + 71 + 71 + 72 + 72 + 73 + 74 + 74 + 75 + 75 + 76 + 76 + 77 + 77 + 78 + 78 + 79 + 80 + 80 + 81 + 81 + 82 + 82 + 83 + 83 + 84 + 84 + 85 + 85 + 86 + 86 + 87 + 87 + 88 + 88 + 89 + 89 + 89 + 90 + 90 + 91 + 91 + 92 + 92 + 93 + 93 + 94 + 94 + 94 + 95 + 95 + 96 + 96 + 96 + 97 + 97 + 98 + 98 + 98 + 99 + 99 + 100 + 100 + 100 + 101 + 101 + 102 + 102 + 102 + 103 + 103 + 104 + 104 + 104 + 105 + 105 + 105 + 106 + 106 + 106 + 107 + 107 + 107 + 108 + 108 + 108 + 109 + 109 + 109 + 110 + 110 + 110 + 111 + 111 + 111 + 112 + 112 + 112 + 113 + 113 + 113 + 114 + 114 + 114 + 114 + 115 + 115 + 115 + 116 + 116 + 117 + 117 + 117 + 117 + 118 + 118 + 118 + 119 + 119 + 119 + 119 + 120 + 120 + 120 + 121 + 121 + 121 + 121 + 122 + 122 + 122 + 122 + 123 + 123 + 123 + 124 + 124 + 124 + 124 + 125 + 125 + 125 + 125 + 126 + 126 + 126 + 126 + 127 + 127 + 127 + 127 + 128 + 128 + 128 + 128 + 129 + 129 + 129 + 129 + 130 + 130 + 130 + 130 + 131 + 131 + 131 + 131 + 131 + 132 + 132 + 132 + 132 + 133 + 133 + 133 + 133 + 134 + 134 + 134 + 134 + 135 + 135 + 135 + 135 + 135 + 136 + 136 + 136 + 136 + 137 + 137 + 137 + 137 + 137 + 138 + 138 + 138 + 138 + 138 + 139 + 139 + 139 + 139 + 140 + 140 + 140 + 140 + 140 + 141 + 141 + 141 + 141 + 141 + 142 + 142 + 142 + 142 + 142 + 143 + 143 + 143 + 143 + 143 + 144 + 144 + 144 + 144 + 144 + 145 + 145 + 145 + 145 + 145 + 146 + 146 + 146 + 146 + 147 + 147 + 147 + 147 + 147 + 148 + 148 + 148 + 148 + 148 + 148 + 149 + 149 + 149 + 149 + 149 + 150 + 150 + 150 + 150 + 150 + 150 + 151 + 151 + 151 + 151 + 151 + 152 + 152 + 152 + 152 + 152 + 153 + 153 + 153 + 153 + 153 + 153 + 154 + 154 + 154 + 154 + 154 + 155 + 155 + 155 + 155 + 155 + 155 + 156 + 156 + 156 + 156 + 156 + 156 + 157 + 157 + 157 + 157 + 157 + 157 + 158 + 158 + 158 + 158 + 158 + 158 + 159 + 159 + 159 + 159 + 159 + 159 + 160 + 160 + 160 + 160 + 160 + 160 + 161 + 161 + 161 + 161 + 161 + 161 + 162 + 162 + 162 + 162 + 162 + 162 + 163 + 163 + 163 + 163 + 163 + 163 + 163 + 164 + 164 + 164 + 164 + 164 + 164 + 165 + 165 + 165 + 165 + 165 + 165 + 166 + 166 + 166 + 166 + 166 + 166 + 166 + 167 + 167 + 167 + 167 + 167 + 168 + 168 + 168 + 168 + 168 + 168 + 168 + 169 + 169 + 169 + 169 + 169 + 169 + 169 + 170 + 170 + 170 + 170 + 170 + 170 + 171 + 171 + 171 + 171 + 171 + 171 + 171 + 172 + 172 + 172 + 172 + 172 + 172 + 172 + 173 + 173 + 173 + 173 + 173 + 173 + 173 + 174 + 174 + 174 + 174 + 174 + 174 + 174 + 175 + 175 + 175 + 175 + 175 + 175 + 175 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 182 + 182 + 182 + 182 + 182 + 182 + 182 + 183 + 183 + 183 + 183 + 183 + 183 + 183 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 187 + 187 + 187 + 187 + 187 + 187 + 187 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 189 +04/09/2020 1:36:30 +cooling down +04/09/2020 1:38:30 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 189 + 189 + 189 + 189 + 189 + 189 + 189 + 188 + 188 + 188 + 188 + 188 + 187 + 187 + 187 + 187 + 186 + 186 + 186 + 185 + 185 + 185 + 184 + 184 + 184 + 183 + 183 + 183 + 182 + 182 + 182 + 181 + 181 + 181 + 180 + 180 + 180 + 179 + 179 + 179 + 178 + 178 + 178 + 177 + 177 + 177 + 176 + 176 + 176 + 175 + 175 + 175 + 174 + 174 + 174 + 173 + 173 + 173 + 172 + 172 + 172 + 171 + 171 + 171 + 170 + 170 + 169 + 169 + 169 + 169 + 168 + 168 + 168 + 167 + 167 + 167 + 167 + 166 + 166 + 166 + 165 + 165 + 165 + 165 + 164 + 164 + 164 + 164 + 163 + 163 + 163 + 163 + 162 + 162 + 162 + 162 + 161 + 161 + 161 + 161 + 160 + 160 + 160 + 160 + 160 + 159 + 159 + 159 + 159 + 158 + 158 + 158 + 158 + 158 + 157 + 157 + 157 + 157 + 157 + 156 + 156 + 156 + 156 + 156 + 155 + 155 + 155 + 155 + 155 + 154 + 154 + 154 + 154 + 154 + 153 + 153 + 153 + 153 + 153 + 153 + 152 + 152 + 152 + 152 + 152 + 151 + 151 + 151 + 151 + 151 + 151 + 150 + 150 + 150 + 150 + 150 + 150 + 149 + 149 + 149 + 149 + 149 + 149 + 149 + 148 + 148 + 148 + 148 + 148 + 148 + 148 + 147 + 147 + 147 + 147 + 147 + 147 + 147 + 146 + 146 + 146 + 146 + 146 + 146 + 146 + 146 + 145 + 145 + 145 + 145 + 145 + 145 + 145 + 145 + 144 + 144 + 144 + 144 + 144 + 144 + 144 + 144 + 144 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 59 +04/09/2020 2:53:13 +Heating to 190 +04/09/2020 2:53:13 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 61 + 61 + 61 + 61 + 62 + 62 + 63 + 63 + 63 + 64 + 64 + 65 + 65 + 66 + 66 + 67 + 67 + 68 + 68 + 69 + 69 + 70 + 70 + 71 + 71 + 72 + 72 + 73 + 73 + 74 + 75 + 75 + 76 + 76 + 77 + 78 + 78 + 79 + 79 + 80 + 80 + 81 + 81 + 82 + 82 + 83 + 83 + 84 + 84 + 85 + 85 + 86 + 86 + 87 + 87 + 88 + 88 + 89 + 89 + 90 + 90 + 90 + 91 + 91 + 92 + 92 + 93 + 93 + 93 + 94 + 94 + 95 + 95 + 96 + 96 + 96 + 97 + 97 + 98 + 98 + 98 + 99 + 99 + 99 + 100 + 100 + 101 + 101 + 101 + 102 + 102 + 102 + 103 + 103 + 103 + 104 + 104 + 105 + 105 + 105 + 106 + 106 + 106 + 107 + 107 + 107 + 108 + 108 + 108 + 109 + 109 + 109 + 109 + 110 + 110 + 110 + 111 + 111 + 111 + 112 + 112 + 112 + 113 + 113 + 113 + 113 + 114 + 114 + 114 + 115 + 115 + 115 + 115 + 116 + 116 + 116 + 117 + 117 + 117 + 117 + 118 + 118 + 118 + 119 + 119 + 119 + 119 + 120 + 120 + 120 + 121 + 121 + 121 + 121 + 122 + 122 + 122 + 122 + 123 + 123 + 123 + 123 + 124 + 124 + 124 + 124 + 125 + 125 + 125 + 125 + 126 + 126 + 126 + 126 + 127 + 127 + 127 + 127 + 128 + 128 + 128 + 128 + 129 + 129 + 129 + 129 + 130 + 130 + 130 + 130 + 130 + 131 + 131 + 131 + 131 + 132 + 132 + 132 + 132 + 132 + 133 + 133 + 133 + 133 + 134 + 134 + 134 + 134 + 134 + 135 + 135 + 135 + 135 + 135 + 136 + 136 + 136 + 136 + 136 + 137 + 137 + 137 + 137 + 138 + 138 + 138 + 138 + 138 + 139 + 139 + 139 + 139 + 139 + 140 + 140 + 140 + 140 + 140 + 141 + 141 + 141 + 141 + 141 + 142 + 142 + 142 + 142 + 142 + 142 + 143 + 143 + 143 + 143 + 143 + 144 + 144 + 144 + 144 + 144 + 145 + 145 + 145 + 145 + 145 + 146 + 146 + 146 + 146 + 146 + 147 + 147 + 147 + 147 + 147 + 147 + 148 + 148 + 148 + 148 + 148 + 149 + 149 + 149 + 149 + 149 + 149 + 150 + 150 + 150 + 150 + 150 + 151 + 151 + 151 + 151 + 151 + 151 + 152 + 152 + 152 + 152 + 152 + 152 + 153 + 153 + 153 + 153 + 153 + 153 + 154 + 154 + 154 + 154 + 154 + 154 + 155 + 155 + 155 + 155 + 155 + 155 + 156 + 156 + 156 + 156 + 156 + 156 + 156 + 157 + 157 + 157 + 157 + 157 + 157 + 158 + 158 + 158 + 158 + 158 + 158 + 159 + 159 + 159 + 159 + 159 + 159 + 160 + 160 + 160 + 160 + 160 + 160 + 161 + 161 + 161 + 161 + 161 + 161 + 161 + 162 + 162 + 162 + 162 + 162 + 162 + 163 + 163 + 163 + 163 + 163 + 163 + 163 + 164 + 164 + 164 + 164 + 164 + 164 + 165 + 165 + 165 + 165 + 165 + 165 + 165 + 166 + 166 + 166 + 166 + 166 + 166 + 167 + 167 + 167 + 167 + 167 + 167 + 168 + 168 + 168 + 168 + 168 + 168 + 168 + 169 + 169 + 169 + 169 + 169 + 169 + 169 + 170 + 170 + 170 + 170 + 170 + 170 + 170 + 171 + 171 + 171 + 171 + 171 + 171 + 171 + 172 + 172 + 172 + 172 + 172 + 172 + 172 + 173 + 173 + 173 + 173 + 173 + 173 + 173 + 174 + 174 + 174 + 174 + 174 + 174 + 174 + 175 + 175 + 175 + 175 + 175 + 175 + 175 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 182 + 182 + 182 + 182 + 182 + 182 + 182 + 183 + 183 + 183 + 183 + 183 + 183 + 183 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 187 + 187 + 187 + 187 + 187 + 187 + 187 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 189 +04/09/2020 3:02:59 +cooling down +04/09/2020 3:04:59 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 189 + 189 + 189 + 189 + 189 + 189 + 189 + 188 + 188 + 188 + 188 + 187 + 187 + 187 + 187 + 186 + 186 + 186 + 186 + 185 + 185 + 185 + 184 + 184 + 184 + 183 + 183 + 183 + 182 + 182 + 182 + 181 + 181 + 181 + 180 + 180 + 180 + 179 + 179 + 179 + 178 + 178 + 178 + 177 + 177 + 177 + 176 + 176 + 176 + 175 + 175 + 175 + 174 + 174 + 174 + 173 + 173 + 173 + 172 + 172 + 172 + 171 + 171 + 170 + 170 + 170 + 170 + 169 + 169 + 169 + 168 + 168 + 168 + 167 + 167 + 167 + 167 + 166 + 166 + 166 + 166 + 165 + 165 + 165 + 165 + 164 + 164 + 164 + 163 + 163 + 163 + 163 + 162 + 162 + 162 + 162 + 162 + 161 + 161 + 161 + 161 + 160 + 160 + 160 + 160 + 159 + 159 + 159 + 159 + 159 + 158 + 158 + 158 + 158 + 158 + 157 + 157 + 157 + 157 + 157 + 156 + 156 + 156 + 156 + 156 + 155 + 155 + 155 + 155 + 155 + 154 + 154 + 154 + 154 + 154 + 154 + 153 + 153 + 153 + 153 + 153 + 152 + 152 + 152 + 152 + 152 + 151 + 151 + 151 + 151 + 151 + 151 + 151 + 150 + 150 + 150 + 150 + 150 + 150 + 149 + 149 + 149 + 149 + 149 + 149 + 149 + 148 + 148 + 148 + 148 + 148 + 148 + 148 + 147 + 147 + 147 + 147 + 147 + 147 + 147 + 147 + 146 + 146 + 146 + 146 + 146 + 146 + 146 + 146 + 145 + 145 + 145 + 145 + 145 + 145 + 145 + 145 + 144 + 144 + 144 + 144 + 144 + 144 + 144 + 144 + 144 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 59 +04/09/2020 4:20:17 +Heating to 190 +04/09/2020 4:20:17 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 61 + 61 + 61 + 61 + 62 + 62 + 62 + 63 + 63 + 64 + 64 + 64 + 65 + 65 + 66 + 66 + 67 + 67 + 68 + 68 + 69 + 69 + 70 + 70 + 71 + 71 + 72 + 72 + 73 + 74 + 74 + 75 + 75 + 76 + 76 + 77 + 77 + 78 + 78 + 79 + 79 + 80 + 80 + 81 + 81 + 82 + 82 + 83 + 83 + 84 + 84 + 85 + 85 + 86 + 86 + 87 + 87 + 88 + 88 + 89 + 89 + 89 + 90 + 90 + 91 + 91 + 92 + 92 + 93 + 93 + 93 + 94 + 94 + 95 + 95 + 95 + 96 + 96 + 97 + 97 + 97 + 98 + 98 + 99 + 99 + 99 + 100 + 100 + 100 + 101 + 101 + 102 + 102 + 102 + 103 + 103 + 103 + 104 + 104 + 104 + 105 + 105 + 105 + 106 + 106 + 107 + 107 + 107 + 108 + 108 + 108 + 109 + 109 + 109 + 110 + 110 + 110 + 111 + 111 + 111 + 112 + 112 + 112 + 112 + 113 + 113 + 113 + 114 + 114 + 114 + 115 + 115 + 115 + 115 + 116 + 116 + 116 + 117 + 117 + 117 + 117 + 118 + 118 + 118 + 118 + 119 + 119 + 119 + 120 + 120 + 120 + 120 + 121 + 121 + 121 + 121 + 122 + 122 + 122 + 122 + 123 + 123 + 123 + 123 + 124 + 124 + 124 + 124 + 125 + 125 + 125 + 125 + 126 + 126 + 126 + 126 + 127 + 127 + 127 + 127 + 127 + 128 + 128 + 128 + 128 + 129 + 129 + 129 + 129 + 130 + 130 + 130 + 130 + 130 + 131 + 131 + 131 + 131 + 132 + 132 + 132 + 132 + 132 + 133 + 133 + 133 + 133 + 133 + 134 + 134 + 134 + 134 + 134 + 135 + 135 + 135 + 135 + 136 + 136 + 136 + 136 + 136 + 137 + 137 + 137 + 137 + 137 + 138 + 138 + 138 + 138 + 138 + 139 + 139 + 139 + 139 + 139 + 140 + 140 + 140 + 140 + 140 + 141 + 141 + 141 + 141 + 142 + 142 + 142 + 142 + 142 + 142 + 143 + 143 + 143 + 143 + 143 + 144 + 144 + 144 + 144 + 144 + 144 + 145 + 145 + 145 + 145 + 145 + 146 + 146 + 146 + 146 + 146 + 146 + 147 + 147 + 147 + 147 + 147 + 148 + 148 + 148 + 148 + 148 + 148 + 149 + 149 + 149 + 149 + 149 + 149 + 150 + 150 + 150 + 150 + 150 + 150 + 151 + 151 + 151 + 151 + 151 + 152 + 152 + 152 + 152 + 152 + 152 + 153 + 153 + 153 + 153 + 153 + 153 + 154 + 154 + 154 + 154 + 154 + 154 + 155 + 155 + 155 + 155 + 155 + 156 + 156 + 156 + 156 + 156 + 156 + 156 + 157 + 157 + 157 + 157 + 157 + 157 + 158 + 158 + 158 + 158 + 158 + 158 + 158 + 159 + 159 + 159 + 159 + 159 + 159 + 160 + 160 + 160 + 160 + 160 + 160 + 160 + 161 + 161 + 161 + 161 + 161 + 161 + 161 + 162 + 162 + 162 + 162 + 162 + 162 + 163 + 163 + 163 + 163 + 163 + 163 + 163 + 164 + 164 + 164 + 164 + 164 + 164 + 164 + 165 + 165 + 165 + 165 + 165 + 166 + 166 + 166 + 166 + 166 + 166 + 166 + 167 + 167 + 167 + 167 + 167 + 167 + 167 + 168 + 168 + 168 + 168 + 168 + 168 + 168 + 169 + 169 + 169 + 169 + 169 + 169 + 169 + 170 + 170 + 170 + 170 + 170 + 170 + 170 + 171 + 171 + 171 + 171 + 171 + 171 + 171 + 172 + 172 + 172 + 172 + 172 + 172 + 172 + 173 + 173 + 173 + 173 + 173 + 173 + 173 + 174 + 174 + 174 + 174 + 174 + 174 + 174 + 175 + 175 + 175 + 175 + 175 + 175 + 175 + 175 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 182 + 182 + 182 + 182 + 182 + 182 + 182 + 182 + 183 + 183 + 183 + 183 + 183 + 183 + 183 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 187 + 187 + 187 + 187 + 187 + 187 + 187 + 187 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 189 +04/09/2020 4:30:11 +cooling down +04/09/2020 4:32:11 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 189 + 189 + 189 + 189 + 189 + 189 + 189 + 188 + 188 + 188 + 188 + 187 + 187 + 187 + 187 + 186 + 186 + 186 + 186 + 185 + 185 + 185 + 184 + 184 + 184 + 183 + 183 + 183 + 182 + 182 + 182 + 181 + 181 + 181 + 180 + 180 + 180 + 179 + 179 + 179 + 178 + 178 + 178 + 177 + 177 + 177 + 176 + 176 + 176 + 175 + 175 + 175 + 174 + 174 + 174 + 173 + 173 + 173 + 172 + 172 + 172 + 171 + 171 + 171 + 171 + 170 + 170 + 170 + 169 + 169 + 169 + 168 + 168 + 168 + 168 + 167 + 167 + 167 + 166 + 166 + 166 + 165 + 165 + 165 + 165 + 164 + 164 + 164 + 164 + 163 + 163 + 163 + 163 + 162 + 162 + 162 + 162 + 161 + 161 + 161 + 161 + 161 + 160 + 160 + 160 + 160 + 159 + 159 + 159 + 159 + 159 + 158 + 158 + 158 + 158 + 157 + 157 + 157 + 157 + 157 + 156 + 156 + 156 + 156 + 156 + 156 + 155 + 155 + 155 + 155 + 155 + 154 + 154 + 154 + 154 + 154 + 154 + 153 + 153 + 153 + 153 + 153 + 153 + 152 + 152 + 152 + 152 + 152 + 152 + 151 + 151 + 151 + 151 + 151 + 151 + 150 + 150 + 150 + 150 + 150 + 150 + 150 + 149 + 149 + 149 + 149 + 149 + 148 + 148 + 148 + 148 + 148 + 148 + 148 + 148 + 147 + 147 + 147 + 147 + 147 + 147 + 147 + 146 + 146 + 146 + 146 + 146 + 146 + 146 + 146 + 145 + 145 + 145 + 145 + 145 + 145 + 145 + 145 + 144 + 144 + 144 + 144 + 144 + 144 + 144 + 144 + 144 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 59 +04/09/2020 5:47:35 +Heating to 190 +04/09/2020 5:47:35 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 61 + 61 + 61 + 62 + 62 + 62 + 63 + 63 + 63 + 64 + 64 + 65 + 65 + 66 + 66 + 67 + 67 + 68 + 68 + 69 + 69 + 70 + 70 + 71 + 71 + 72 + 72 + 73 + 73 + 74 + 75 + 75 + 76 + 76 + 77 + 77 + 78 + 78 + 79 + 79 + 80 + 80 + 81 + 81 + 82 + 82 + 83 + 83 + 84 + 84 + 85 + 85 + 86 + 86 + 87 + 87 + 88 + 88 + 88 + 89 + 90 + 90 + 91 + 91 + 92 + 92 + 92 + 93 + 93 + 94 + 94 + 94 + 95 + 95 + 96 + 96 + 96 + 97 + 97 + 98 + 98 + 98 + 99 + 99 + 100 + 100 + 100 + 101 + 101 + 101 + 102 + 102 + 102 + 103 + 103 + 104 + 104 + 104 + 105 + 105 + 105 + 106 + 106 + 106 + 107 + 107 + 107 + 108 + 108 + 108 + 109 + 109 + 109 + 109 + 110 + 110 + 110 + 111 + 111 + 111 + 112 + 112 + 112 + 113 + 113 + 113 + 113 + 114 + 114 + 114 + 115 + 115 + 115 + 115 + 116 + 116 + 116 + 117 + 117 + 117 + 117 diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Tset1.CSV b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Tset1.CSV new file mode 100644 index 000000000..6d1a7862c --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Tset1.CSV @@ -0,0 +1,1600 @@ +06/07/2020 9:43:12 +Heating to 190 +06/07/2020 9:43:12 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 23 + 24 + 24 + 24 + 24 + 24 + 24 + 25 + 25 + 25 + 26 + 26 + 26 + 27 + 27 + 28 + 28 + 29 + 29 + 30 + 30 + 31 + 31 + 32 + 32 + 33 + 33 + 34 + 34 + 35 + 35 + 36 + 37 + 37 + 38 + 38 + 39 + 39 + 40 + 41 + 41 + 42 + 42 + 43 + 43 + 44 + 44 + 45 + 46 + 46 + 47 + 47 + 48 + 48 + 49 + 49 + 50 + 50 + 51 + 52 + 52 + 53 + 53 + 54 + 54 + 55 + 55 + 56 + 56 + 56 + 57 + 57 + 58 + 58 + 59 + 59 + 60 + 60 + 60 + 61 + 61 + 62 + 62 + 63 + 63 + 63 + 64 + 64 + 65 + 65 + 65 + 66 + 66 + 66 + 67 + 67 + 68 + 68 + 68 + 69 + 69 + 69 + 70 + 70 + 71 + 71 + 71 + 72 + 72 + 72 + 73 + 73 + 73 + 74 + 74 + 74 + 75 + 75 + 75 + 76 + 76 + 76 + 77 + 77 + 77 + 78 + 78 + 78 + 79 + 79 + 79 + 79 + 80 + 80 + 80 + 81 + 81 + 81 + 82 + 82 + 82 + 82 + 83 + 83 + 83 + 84 + 84 + 84 + 84 + 85 + 85 + 85 + 86 + 86 + 86 + 86 + 87 + 87 + 87 + 88 + 88 + 88 + 88 + 89 + 89 + 89 + 89 + 90 + 90 + 90 + 91 + 91 + 91 + 92 + 92 + 92 + 92 + 93 + 93 + 93 + 93 + 94 + 94 + 94 + 94 + 95 + 95 + 95 + 95 + 96 + 96 + 96 + 96 + 97 + 97 + 97 + 97 + 98 + 98 + 98 + 98 + 98 + 99 + 99 + 99 + 99 + 100 + 100 + 100 + 100 + 101 + 101 + 101 + 101 + 102 + 102 + 102 + 102 + 102 + 103 + 103 + 103 + 103 + 104 + 104 + 104 + 104 + 105 + 105 + 105 + 105 + 105 + 106 + 106 + 106 + 106 + 106 + 107 + 107 + 107 + 107 + 107 + 108 + 108 + 108 + 108 + 108 + 109 + 109 + 109 + 109 + 110 + 110 + 110 + 110 + 110 + 111 + 111 + 111 + 111 + 111 + 112 + 112 + 112 + 112 + 112 + 113 + 113 + 113 + 113 + 113 + 114 + 114 + 114 + 114 + 114 + 115 + 115 + 115 + 115 + 115 + 116 + 116 + 116 + 116 + 116 + 117 + 117 + 117 + 117 + 117 + 118 + 118 + 118 + 118 + 119 + 119 + 119 + 119 + 119 + 119 + 120 + 120 + 120 + 120 + 120 + 121 + 121 + 121 + 121 + 121 + 122 + 122 + 122 + 122 + 122 + 123 + 123 + 123 + 123 + 123 + 123 + 124 + 124 + 124 + 124 + 124 + 125 + 125 + 125 + 125 + 125 + 125 + 126 + 126 + 126 + 126 + 126 + 127 + 127 + 127 + 127 + 127 + 128 + 128 + 128 + 128 + 128 + 128 + 129 + 129 + 129 + 129 + 129 + 130 + 130 + 130 + 130 + 130 + 130 + 131 + 131 + 131 + 131 + 131 + 131 + 132 + 132 + 132 + 132 + 132 + 132 + 133 + 133 + 133 + 133 + 133 + 134 + 134 + 134 + 134 + 134 + 134 + 135 + 135 + 135 + 135 + 135 + 135 + 136 + 136 + 136 + 136 + 136 + 136 + 137 + 137 + 137 + 137 + 137 + 137 + 138 + 138 + 138 + 138 + 138 + 138 + 139 + 139 + 139 + 139 + 139 + 139 + 140 + 140 + 140 + 140 + 140 + 140 + 141 + 141 + 141 + 141 + 141 + 141 + 142 + 142 + 142 + 142 + 142 + 142 + 143 + 143 + 143 + 143 + 143 + 143 + 144 + 144 + 144 + 144 + 144 + 144 + 145 + 145 + 145 + 145 + 145 + 145 + 145 + 146 + 146 + 146 + 146 + 146 + 146 + 147 + 147 + 147 + 147 + 147 + 147 + 147 + 148 + 148 + 148 + 148 + 148 + 148 + 149 + 149 + 149 + 149 + 149 + 149 + 150 + 150 + 150 + 150 + 150 + 150 + 150 + 151 + 151 + 151 + 151 + 151 + 151 + 151 + 152 + 152 + 152 + 152 + 152 + 152 + 152 + 153 + 153 + 153 + 153 + 153 + 153 + 153 + 154 + 154 + 154 + 154 + 154 + 154 + 155 + 155 + 155 + 155 + 155 + 155 + 155 + 156 + 156 + 156 + 156 + 156 + 156 + 156 + 157 + 157 + 157 + 157 + 157 + 157 + 157 + 158 + 158 + 158 + 158 + 158 + 158 + 158 + 159 + 159 + 159 + 159 + 159 + 159 + 160 + 160 + 160 + 160 + 160 + 160 + 160 + 161 + 161 + 161 + 161 + 161 + 161 + 161 + 162 + 162 + 162 + 162 + 162 + 162 + 162 + 163 + 163 + 163 + 163 + 163 + 163 + 163 + 164 + 164 + 164 + 164 + 164 + 164 + 164 + 165 + 165 + 165 + 165 + 165 + 165 + 165 + 166 + 166 + 166 + 166 + 166 + 166 + 166 + 166 + 167 + 167 + 167 + 167 + 167 + 167 + 167 + 167 + 168 + 168 + 168 + 168 + 168 + 168 + 168 + 169 + 169 + 169 + 169 + 169 + 169 + 169 + 170 + 170 + 170 + 170 + 170 + 170 + 170 + 170 + 171 + 171 + 171 + 171 + 171 + 171 + 171 + 172 + 172 + 172 + 172 + 172 + 172 + 172 + 172 + 173 + 173 + 173 + 173 + 173 + 173 + 173 + 174 + 174 + 174 + 174 + 174 + 174 + 174 + 175 + 175 + 175 + 175 + 175 + 175 + 175 + 175 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 182 + 182 + 182 + 182 + 182 + 182 + 182 + 182 + 182 + 182 + 183 + 183 + 183 + 183 + 183 + 183 + 183 + 183 + 183 + 183 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 187 + 187 + 187 + 187 + 187 + 187 + 187 + 187 + 187 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 189 +06/07/2020 9:56:54 +cooling down +06/07/2020 9:58:54 + 191 + 191 + 191 + 191 + 191 + 191 + 191 + 191 + 191 + 191 + 191 + 190 + 190 + 190 + 190 + 190 + 190 + 190 + 189 + 189 + 189 + 189 + 188 + 188 + 188 + 188 + 187 + 187 + 186 + 186 + 186 + 185 + 185 + 185 + 184 + 184 + 184 + 183 + 183 + 183 + 182 + 182 + 182 + 181 + 181 + 181 + 180 + 180 + 179 + 179 + 179 + 178 + 178 + 178 + 177 + 177 + 177 + 176 + 176 + 175 + 175 + 175 + 174 + 174 + 174 + 173 + 173 + 173 + 172 + 172 + 172 + 171 + 171 + 171 + 170 + 170 + 170 + 169 + 169 + 169 + 168 + 168 + 168 + 167 + 167 + 167 + 167 + 166 + 166 + 166 + 165 + 165 + 165 + 164 + 164 + 164 + 164 + 163 + 163 + 163 + 162 + 162 + 162 + 161 + 161 + 161 + 161 + 160 + 160 + 160 + 160 + 159 + 159 + 159 + 159 + 158 + 158 + 158 + 158 + 157 + 157 + 157 + 157 + 157 + 156 + 156 + 156 + 156 + 155 + 155 + 155 + 155 + 155 + 154 + 154 + 154 + 154 + 153 + 153 + 153 + 153 + 153 + 152 + 152 + 152 + 152 + 152 + 152 + 151 + 151 + 151 + 151 + 151 + 150 + 150 + 150 + 150 + 150 + 149 + 149 + 149 + 149 + 149 + 149 + 148 + 148 + 148 + 148 + 148 + 148 + 147 + 147 + 147 + 147 + 147 + 147 + 146 + 146 + 146 + 146 + 146 + 146 + 145 + 145 + 145 + 145 + 145 + 145 + 145 + 144 + 144 + 144 + 144 + 144 + 144 + 144 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Tset111.CSV b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Tset111.CSV new file mode 100644 index 000000000..4ab057b1c --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/Dryer_Tset111.CSV @@ -0,0 +1,29654 @@ +16/08/2020 18:49:18 +Heating to 190 +16/08/2020 18:49:18 + 24 + 24 + 24 + 24 + 24 + 24 + 24 + 24 + 24 + 24 + 24 + 24 + 24 + 25 + 25 + 25 + 25 + 25 + 26 + 26 + 26 + 26 + 27 + 27 + 27 + 28 + 28 + 29 + 29 + 29 + 30 + 30 + 31 + 31 + 32 + 32 + 33 + 33 + 33 + 34 + 34 + 35 + 36 + 36 + 37 + 38 + 38 + 39 + 39 + 40 + 40 + 41 + 41 + 42 + 42 + 43 + 43 + 44 + 44 + 45 + 45 + 46 + 46 + 47 + 47 + 48 + 48 + 49 + 49 + 50 + 50 + 51 + 51 + 52 + 52 + 53 + 53 + 53 + 54 + 54 + 55 + 55 + 56 + 56 + 57 + 57 + 57 + 58 + 58 + 59 + 59 + 60 + 60 + 60 + 61 + 61 + 62 + 62 + 63 + 63 + 63 + 64 + 64 + 65 + 65 + 66 + 66 + 66 + 67 + 67 + 67 + 68 + 68 + 69 + 69 + 69 + 70 + 70 + 70 + 71 + 71 + 71 + 72 + 72 + 72 + 73 + 73 + 73 + 74 + 74 + 74 + 75 + 75 + 75 + 76 + 76 + 76 + 77 + 77 + 77 + 78 + 78 + 78 + 79 + 79 + 79 + 79 + 80 + 80 + 80 + 81 + 81 + 81 + 81 + 82 + 82 + 82 + 83 + 83 + 83 + 84 + 84 + 84 + 84 + 85 + 85 + 85 + 85 + 86 + 86 + 86 + 87 + 87 + 87 + 87 + 88 + 88 + 88 + 88 + 89 + 89 + 89 + 89 + 90 + 90 + 90 + 91 + 91 + 91 + 91 + 92 + 92 + 92 + 92 + 93 + 93 + 93 + 93 + 94 + 94 + 94 + 94 + 95 + 95 + 95 + 95 + 95 + 96 + 96 + 96 + 96 + 97 + 97 + 97 + 97 + 98 + 98 + 98 + 98 + 98 + 99 + 99 + 99 + 99 + 100 + 100 + 100 + 100 + 100 + 101 + 101 + 101 + 101 + 102 + 102 + 102 + 102 + 102 + 103 + 103 + 103 + 103 + 104 + 104 + 104 + 104 + 104 + 105 + 105 + 105 + 105 + 105 + 106 + 106 + 106 + 106 + 106 + 107 + 107 + 107 + 107 + 107 + 108 + 108 + 108 + 108 + 108 + 109 + 109 + 109 + 109 + 110 + 110 + 110 + 110 + 110 + 111 + 111 + 111 + 111 + 111 + 112 + 112 + 112 + 112 + 112 + 112 + 113 + 113 + 113 + 113 + 113 + 114 + 114 + 114 + 114 + 114 + 115 + 115 + 115 + 115 + 115 + 115 + 116 + 116 + 116 + 116 + 116 + 117 + 117 + 117 + 117 + 117 + 117 + 118 + 118 + 118 + 118 + 118 + 119 + 119 + 119 + 119 + 119 + 119 + 120 + 120 + 120 + 120 + 120 + 120 + 121 + 121 + 121 + 121 + 121 + 122 + 122 + 122 + 122 + 122 + 122 + 123 + 123 + 123 + 123 + 123 + 123 + 124 + 124 + 124 + 124 + 124 + 124 + 125 + 125 + 125 + 125 + 125 + 125 + 126 + 126 + 126 + 126 + 126 + 126 + 127 + 127 + 127 + 127 + 127 + 127 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 129 + 129 + 129 + 129 + 129 + 129 + 130 + 130 + 130 + 130 + 130 + 130 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 132 + 132 + 132 + 132 + 132 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 134 + 134 + 134 + 134 + 134 + 134 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 137 + 137 + 137 + 137 + 137 + 137 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 144 + 144 + 144 + 144 + 144 + 144 + 144 + 145 + 145 + 145 + 145 + 145 + 145 + 146 + 146 + 146 + 146 + 146 + 146 + 146 + 147 + 147 + 147 + 147 + 147 + 147 + 147 + 147 + 148 + 148 + 148 + 148 + 148 + 148 + 148 + 148 + 149 + 149 + 149 + 149 + 149 + 149 + 149 + 150 + 150 + 150 + 150 + 150 + 150 + 150 + 150 + 151 + 151 + 151 + 151 + 151 + 151 + 151 + 151 + 152 + 152 + 152 + 152 + 152 + 152 + 152 + 152 + 153 + 153 + 153 + 153 + 153 + 153 + 154 + 154 + 154 + 154 + 154 + 154 + 154 + 154 + 155 + 155 + 155 + 155 + 155 + 155 + 155 + 155 + 155 + 156 + 156 + 156 + 156 + 156 + 156 + 156 + 156 + 156 + 157 + 157 + 157 + 157 + 157 + 157 + 157 + 157 + 157 + 158 + 158 + 158 + 158 + 158 + 158 + 158 + 158 + 158 + 159 + 159 + 159 + 159 + 159 + 159 + 159 + 159 + 159 + 160 + 160 + 160 + 160 + 160 + 160 + 160 + 160 + 160 + 161 + 161 + 161 + 161 + 161 + 161 + 161 + 161 + 161 + 162 + 162 + 162 + 162 + 162 + 162 + 162 + 162 + 163 + 163 + 163 + 163 + 163 + 163 + 163 + 163 + 164 + 164 + 164 + 164 + 164 + 164 + 164 + 164 + 164 + 165 + 165 + 165 + 165 + 165 + 165 + 165 + 165 + 165 + 166 + 166 + 166 + 166 + 166 + 166 + 166 + 166 + 167 + 167 + 167 + 167 + 167 + 167 + 167 + 167 + 167 + 168 + 168 + 168 + 168 + 168 + 168 + 168 + 168 + 168 + 169 + 169 + 169 + 169 + 169 + 169 + 169 + 169 + 169 + 170 + 170 + 170 + 170 + 170 + 170 + 170 + 170 + 170 + 171 + 171 + 171 + 171 + 171 + 171 + 171 + 171 + 171 + 172 + 172 + 172 + 172 + 172 + 172 + 172 + 172 + 172 + 173 + 173 + 173 + 173 + 173 + 173 + 173 + 173 + 173 + 174 + 174 + 174 + 174 + 174 + 174 + 174 + 174 + 174 + 174 + 175 + 175 + 175 + 175 + 175 + 175 + 175 + 175 + 175 + 175 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 182 + 182 + 182 + 182 + 182 + 182 + 182 + 182 + 182 + 183 + 183 + 183 + 183 + 183 + 183 + 183 + 183 + 183 + 183 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 187 + 187 + 187 + 187 + 187 + 187 + 187 + 187 + 187 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 189 +16/08/2020 19:04:08 +cooling down +16/08/2020 19:06:08 + 193 + 193 + 193 + 193 + 193 + 193 + 192 + 192 + 192 + 192 + 192 + 192 + 192 + 192 + 191 + 191 + 191 + 191 + 191 + 191 + 190 + 190 + 190 + 190 + 190 + 189 + 189 + 189 + 189 + 188 + 188 + 188 + 188 + 187 + 187 + 187 + 186 + 186 + 186 + 185 + 185 + 185 + 185 + 184 + 184 + 184 + 183 + 183 + 183 + 182 + 182 + 182 + 181 + 181 + 181 + 180 + 180 + 180 + 179 + 179 + 179 + 178 + 178 + 178 + 178 + 177 + 177 + 176 + 176 + 176 + 175 + 175 + 175 + 174 + 174 + 174 + 174 + 173 + 173 + 173 + 172 + 172 + 172 + 171 + 171 + 171 + 171 + 170 + 170 + 170 + 169 + 169 + 169 + 169 + 168 + 168 + 168 + 167 + 167 + 167 + 167 + 166 + 166 + 166 + 166 + 165 + 165 + 165 + 165 + 164 + 164 + 164 + 164 + 163 + 163 + 163 + 163 + 162 + 162 + 162 + 162 + 161 + 161 + 161 + 161 + 160 + 160 + 160 + 160 + 159 + 159 + 159 + 159 + 158 + 158 + 158 + 158 + 158 + 157 + 157 + 157 + 157 + 157 + 156 + 156 + 156 + 156 + 156 + 155 + 155 + 155 + 155 + 155 + 154 + 154 + 154 + 154 + 154 + 153 + 153 + 153 + 153 + 153 + 153 + 152 + 152 + 152 + 152 + 152 + 151 + 151 + 151 + 151 + 151 + 151 + 150 + 150 + 150 + 150 + 150 + 150 + 149 + 149 + 149 + 149 + 149 + 149 + 149 + 148 + 148 + 148 + 148 + 148 + 148 + 147 + 147 + 147 + 147 + 147 + 147 + 146 + 146 + 146 + 146 + 146 + 146 + 146 + 146 + 145 + 145 + 145 + 145 + 145 + 145 + 145 + 144 + 144 + 144 + 144 + 144 + 144 + 144 + 144 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 143 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 142 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 141 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 140 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 139 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 138 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 137 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 136 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 135 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 134 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 133 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 132 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 131 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 130 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 129 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 127 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 126 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 125 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 124 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 123 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 122 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 121 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 120 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 119 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 118 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 117 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 116 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 115 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 114 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 113 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 112 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 111 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 110 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 109 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 108 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 107 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 106 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 105 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 104 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 103 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 102 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 101 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 100 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 99 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 98 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 96 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 95 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 94 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 93 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 92 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 91 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 90 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 89 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 88 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 87 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 86 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 85 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 84 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 83 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 82 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 81 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 80 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 79 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 78 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 77 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 76 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 75 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 74 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 73 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 72 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 70 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 69 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 68 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 67 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 66 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 65 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 64 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 63 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 62 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 61 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 59 +16/08/2020 20:12:40 +Heating to 190 +16/08/2020 20:12:40 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 59 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 60 + 61 + 61 + 61 + 61 + 62 + 62 + 62 + 62 + 63 + 63 + 64 + 64 + 64 + 65 + 65 + 66 + 66 + 66 + 67 + 67 + 68 + 68 + 69 + 69 + 70 + 70 + 71 + 71 + 71 + 72 + 72 + 73 + 73 + 74 + 74 + 75 + 75 + 76 + 76 + 77 + 77 + 78 + 78 + 79 + 80 + 80 + 81 + 81 + 82 + 82 + 82 + 83 + 83 + 84 + 84 + 85 + 85 + 86 + 86 + 87 + 87 + 87 + 88 + 88 + 89 + 89 + 90 + 90 + 90 + 91 + 91 + 92 + 92 + 93 + 93 + 93 + 94 + 94 + 95 + 95 + 95 + 96 + 96 + 97 + 97 + 97 + 98 + 98 + 98 + 99 + 99 + 99 + 100 + 100 + 101 + 101 + 101 + 102 + 102 + 102 + 103 + 103 + 103 + 104 + 104 + 104 + 105 + 105 + 105 + 106 + 106 + 106 + 107 + 107 + 107 + 108 + 108 + 108 + 109 + 109 + 109 + 109 + 110 + 110 + 110 + 111 + 111 + 111 + 112 + 112 + 113 + 113 + 113 + 113 + 114 + 114 + 114 + 115 + 115 + 115 + 115 + 116 + 116 + 116 + 116 + 117 + 117 + 117 + 118 + 118 + 118 + 118 + 119 + 119 + 119 + 119 + 120 + 120 + 120 + 120 + 121 + 121 + 121 + 121 + 122 + 122 + 122 + 122 + 123 + 123 + 123 + 123 + 124 + 124 + 124 + 124 + 125 + 125 + 125 + 125 + 126 + 126 + 126 + 126 + 126 + 127 + 127 + 127 + 127 + 128 + 128 + 128 + 128 + 129 + 129 + 129 + 129 + 129 + 130 + 130 + 130 + 130 + 131 + 131 + 131 + 131 + 131 + 132 + 132 + 132 + 132 + 133 + 133 + 133 + 133 + 134 + 134 + 134 + 134 + 134 + 135 + 135 + 135 + 135 + 135 + 136 + 136 + 136 + 136 + 136 + 137 + 137 + 137 + 137 + 137 + 138 + 138 + 138 + 138 + 138 + 139 + 139 + 139 + 139 + 139 + 140 + 140 + 140 + 140 + 140 + 140 + 141 + 141 + 141 + 141 + 141 + 142 + 142 + 142 + 142 + 142 + 142 + 143 + 143 + 143 + 143 + 143 + 144 + 144 + 144 + 144 + 144 + 144 + 145 + 145 + 145 + 145 + 145 + 145 + 146 + 146 + 146 + 146 + 146 + 146 + 147 + 147 + 147 + 147 + 147 + 147 + 148 + 148 + 148 + 148 + 148 + 148 + 149 + 149 + 149 + 149 + 149 + 149 + 150 + 150 + 150 + 150 + 150 + 150 + 151 + 151 + 151 + 151 + 151 + 151 + 151 + 152 + 152 + 152 + 152 + 152 + 152 + 153 + 153 + 153 + 153 + 153 + 153 + 154 + 154 + 154 + 154 + 154 + 154 + 155 + 155 + 155 + 155 + 155 + 155 + 156 + 156 + 156 + 156 + 156 + 156 + 156 + 157 + 157 + 157 + 157 + 157 + 157 + 157 + 158 + 158 + 158 + 158 + 158 + 158 + 159 + 159 + 159 + 159 + 159 + 159 + 159 + 160 + 160 + 160 + 160 + 160 + 160 + 160 + 161 + 161 + 161 + 161 + 161 + 161 + 161 + 162 + 162 + 162 + 162 + 162 + 162 + 162 + 163 + 163 + 163 + 163 + 163 + 163 + 163 + 164 + 164 + 164 + 164 + 164 + 164 + 164 + 164 + 165 + 165 + 165 + 165 + 165 + 165 + 165 + 166 + 166 + 166 + 166 + 166 + 166 + 166 + 166 + 167 + 167 + 167 + 167 + 167 + 167 + 167 + 168 + 168 + 168 + 168 + 168 + 168 + 168 + 169 + 169 + 169 + 169 + 169 + 169 + 169 + 169 + 170 + 170 + 170 + 170 + 170 + 170 + 170 + 171 + 171 + 171 + 171 + 171 + 171 + 171 + 171 + 172 + 172 + 172 + 172 + 172 + 172 + 172 + 173 + 173 + 173 + 173 + 173 + 173 + 173 + 173 + 173 + 174 + 174 + 174 + 174 + 174 + 174 + 174 + 174 + 175 + 175 + 175 + 175 + 175 + 175 + 175 + 175 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 176 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 177 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 178 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 179 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 180 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 181 + 182 + 182 + 182 + 182 + 182 + 182 + 182 + 182 + 182 + 183 + 183 + 183 + 183 + 183 + 183 + 183 + 183 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 184 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 185 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 186 + 187 + 187 + 187 + 187 + 187 + 187 + 187 + 187 + 187 + 188 + 188 + 188 + 188 + 188 + 188 + 188 + 189 +16/08/2020 20:23:12 +cooling down +17/08/2020 0:35:05 + 42 +17/08/2020 0:35:06 +Heating to 190 +17/08/2020 0:35:06 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 42 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 41 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 40 + 39 + 40 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 39 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 38 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 37 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 35 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 34 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 32 + 33 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 31 + 32 + 32 + 32 + 31 + 31 + 31 + 32 + 31 + 31 + 31 + 31 + 32 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 31 + 30 + 30 + 31 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 30 + 29 + 30 + 30 + 30 + 30 + 30 + 30 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 + 29 diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/blower_rpm.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/blower_rpm.cs new file mode 100644 index 000000000..13e6af513 --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dryer/blower_rpm.cs @@ -0,0 +1,62 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +include "..\..\Defines\Tango_Defines_Basic.cs" +include "Tango_Defines_SSR.cs" +include "Tango_Defines_Tacho.cs" + +const int Time_Test_On_Second= 60*30*3 ; //1.5 hour +const string File_Name = @"P:\Scripts\Assemblies\Dryer\Blowe_RMO_LOG.CSV"; //3 hour + + +public void OnExecute(StubManager stubManager) +{ + + +/* + const int LOW = 75;//0 - 100% + var response = stubManager.Run("StubFpgaWriteRegRequest" ,0x60000400 | 0x112, 0xFF);//Freq 8 bit + var response1 = stubManager.Run("StubFpgaWriteRegRequest" ,0x60000400 | 0x3EC, LOW+1);//Low 8 bit + var response2 = stubManager.Run("StubFpgaWriteRegRequest" ,0x60000400 | 0x3EE, 101 - LOW);//High 8 bit +*/ + + + + + + + + var RetVal=Fpga_Read_Reg(FPGA1, F1_Tacho_reg8, 0); + UInt32 temp; + + +// stubManager.WriteToFile(File_Name,",RPM "); + + + for (int i=0;i("StubMotorRunRequest" ,3,true, 2200); - for (int i=0;i<5;i++) + for (int i=0;i<10;i++) { stubManager.WriteLine("--------------------loop number " + i +" ---------------------" ); diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/Dye head/Actuator_In_new set point.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dye head/Actuator_In_new set point.cs new file mode 100644 index 000000000..dc5d5af07 --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dye head/Actuator_In_new set point.cs @@ -0,0 +1,34 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +public void OnExecute(StubManager stubManager) +{ +int Delay_UP=200; //msec +int Delay_stop=500; +int Delay_limit=1000; + + stubManager.Run("ProgressRequest" ,0xfead, 0xcaf000); //mov ACTUATOR-IN down up to limit switch + Thread.Sleep(2000); +// while (true) +// { + + stubManager.Run("ProgressRequest" ,0xfead, 0xcaf003); //mov ACTUATOR-IN up + Thread.Sleep(Delay_UP); + stubManager.Run("ProgressRequest" ,0xfead, 0xcaf008); //stop ACTUATOR-IN + Thread.Sleep(Delay_stop); + // stubManager.Run("ProgressRequest" ,0xfead, 0xcaf000); //mov ACTUATOR-IN down up to limit switch +// Thread.Sleep(Delay_limit); + + // } + + +} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/Dye head/Write SYLKO to head eeprom.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dye head/Write SYLKO to head eeprom.cs new file mode 100644 index 000000000..d7729ca2f --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/Dye head/Write SYLKO to head eeprom.cs @@ -0,0 +1,118 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +//---------------------- +const Int32 I2C_ID = 3; //MCU_I2C3 +const Int32 TCA9548A_address = 0xE2; +const Int32 I2C_Slave_Add = 0xA0; // //eeprom address - 32kByte +int Head_Mux_Channel_ID = 4; //Head MUX channel +//---------------------- + +const Int32 SerialNum = 0x01; + + +int enable_channel(int Channel_ID) +{ + uint Const_temp = 0x01; + + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = TCA9548A_address; + + Const_temp = Const_temp << Channel_ID; + stubI2CWriteBytesRequest.BytesTWrite.Add(Const_temp); + + var response = stubManager.Run(stubI2CWriteBytesRequest); + + return 1; +} + + +int adc_write(uint I2C_Slave_Add, uint Page) +{ + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add; + + UInt32 uInt32 = new UInt32(); + stubI2CWriteBytesRequest.BytesTWrite.Add(0);//Byte 0 to write + stubI2CWriteBytesRequest.BytesTWrite.Add(Page);//Byte 0 to write + //-------------------------------------------------------------- + + stubI2CWriteBytesRequest.BytesTWrite.Add(SerialNum);//S/N + stubI2CWriteBytesRequest.BytesTWrite.Add(0x03);//HEAD_TYPE_SYLKO + //stubI2CWriteBytesRequest.BytesTWrite.Add(0x04);//HEAD_TYPE_STAPLE_SPUN + + var response = stubManager.Run(stubI2CWriteBytesRequest); + + return 1; +} + +int adc_set_for_read_ch(uint I2C_Slave_Add, uint Page) +{ + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add; + + + UInt32 uInt32 = new UInt32(); + stubI2CWriteBytesRequest.BytesTWrite.Add(0);//Byte 0 to write + stubI2CWriteBytesRequest.BytesTWrite.Add(Page);//Byte 0 to write + + var response = stubManager.Run(stubI2CWriteBytesRequest); + + return 1; +} + +int adc_read_ch(uint I2C_Slave_Add) +{ + StubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest(); + stubI2CReadBytesRequest.I2CId = I2C_ID; + stubI2CReadBytesRequest.SlaveAddress = I2C_Slave_Add + 1; + stubI2CReadBytesRequest.NumberOfBytesToRead = 10; // Number of bytes to read + + var response1 = stubManager.Run(stubI2CReadBytesRequest); + uint temph=0; + + for(int i=0; i Disp0enser 0-7 + + for (int i = 0; i<1; i++) + { + + adc_write(I2C_Slave_Add,0x00); + Thread.Sleep(10); //Sleep for 5 milli. - must! otherwise read 0xff (See data sheet ) + + stubManager.Write("\nPage 0x00 #"); + stubManager.Write(i); + stubManager.Write("\t- The Buffer is: "); + adc_set_for_read_ch(I2C_Slave_Add, 0x00); + //Thread.Sleep(1); //Sleep for 10 milli. + adc_read_ch(I2C_Slave_Add); + + Thread.Sleep(1000); + + } +} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/ElectricalEnclosure/ElectricalEnclosure_Fans1.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/ElectricalEnclosure/ElectricalEnclosure_Fans1.cs index af5a07543..ba39cb2b0 100644 --- a/Software/Stubs Collection/stubs/Scripts/Assemblies/ElectricalEnclosure/ElectricalEnclosure_Fans1.cs +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/ElectricalEnclosure/ElectricalEnclosure_Fans1.cs @@ -73,7 +73,7 @@ public void OnExecute(StubManager stubManager) for (int i = 0; i<1000; i++) { - stubManager.Write("----------------------------------------\n"); + stubManager.Write("\n----------------------------------------\n"); // Fpga_Read_Reg(FPGA1, F1_Tacho_reg0, 0); stubManager.Write("\n"); // Fpga_Read_Reg(FPGA1, F1_Tacho_reg1, 1); stubManager.Write("\n"); // Fpga_Read_Reg(FPGA1, F1_Tacho_reg2, 1); stubManager.Write("\n"); @@ -83,61 +83,85 @@ public void OnExecute(StubManager stubManager) var RetVal=Fpga_Read_Reg(FPGA1, F1_Tacho_reg0, 0); stubManager.Write("\nFan5 Speed-"); stubManager.WriteHex(RetVal.Value,4); - - + if (RetVal.Value>0x440 && RetVal.Value<0x4d0) + stubManager.Write("\t Pass"); + else + stubManager.Write("\t Fail"); RetVal=Fpga_Read_Reg(FPGA1, F1_Tacho_reg1, 0); stubManager.Write("\nFan1 Speed-"); stubManager.WriteHex(RetVal.Value,4); + if (RetVal.Value>0x220 && RetVal.Value<0x300) + stubManager.Write("\t Pass"); + else + stubManager.Write("\t Fail"); + + + - RetVal = Fpga_Read_Reg(FPGA1, F1_gpi_FANS, 0); - Temp1=RetVal.Value & 0x0001; - if (Temp1 !=0x0001) - stubManager.Write("\tFan1 Running "); - else - stubManager.Write("\tFan1 Stop"); +// RetVal = Fpga_Read_Reg(FPGA1, F1_gpi_FANS, 0); +// Temp1=RetVal.Value & 0x0001; +// if (Temp1 !=0x0001) +// stubManager.Write("\tFan1 Running "); +// else +// stubManager.Write("\tFan1 Stop"); RetVal=Fpga_Read_Reg(FPGA1, F1_Tacho_reg2, 0); stubManager.Write("\nFan2 Speed-"); stubManager.WriteHex(RetVal.Value,4); + if (RetVal.Value>0x220 && RetVal.Value<0x300) + stubManager.Write("\t Pass"); + else + stubManager.Write("\t Fail"); + - Temp1=RetVal.Value & 0x0002; - if (Temp1 !=0x0002) - stubManager.Write("\tFan2 Running "); - else - stubManager.Write("\tFan2 Stop"); +// Temp1=RetVal.Value & 0x0002; +// if (Temp1 !=0x0002) +// stubManager.Write("\tFan2 Running "); +// else +// stubManager.Write("\tFan2 Stop"); RetVal=Fpga_Read_Reg(FPGA1, F1_Tacho_reg3, 0); stubManager.Write("\nFan3 Speed-"); stubManager.WriteHex(RetVal.Value,4); + if (RetVal.Value>0x220 && RetVal.Value<0x300) + stubManager.Write("\t Pass"); + else + stubManager.Write("\t Fail"); + - Temp1=RetVal.Value & 0x0004; - if (Temp1 !=0x0004) - stubManager.Write("\tFan3 Running "); - else - stubManager.Write("\tFan3 Stop"); +// Temp1=RetVal.Value & 0x0004; +// if (Temp1 !=0x0004) +// stubManager.Write("\tFan3 Running "); +// else +// stubManager.Write("\tFan3 Stop"); RetVal=Fpga_Read_Reg(FPGA1, F1_Tacho_reg4, 0); stubManager.Write("\nFan4 Speed-"); stubManager.WriteHex(RetVal.Value,4); + if (RetVal.Value>0x220 && RetVal.Value<0x300) + stubManager.Write("\t Pass"); + else + stubManager.Write("\t Fail"); + - Temp1=RetVal.Value & 0x0008; - if (Temp1 !=0x0008) - stubManager.Write("\tFan4 Running "); - else - stubManager.Write("\tFan4 Stop"); +// Temp1=RetVal.Value & 0x0008; +// if (Temp1 !=0x0008) +// stubManager.Write("\tFan4 Running "); +// else +// stubManager.Write("\tFan4 Stop"); - Fpga_Read_Reg(FPGA1, F1_Tacho_reg5, 1); stubManager.Write("\n"); - Fpga_Read_Reg(FPGA1, F1_Tacho_reg6, 1); stubManager.Write("\n"); - Fpga_Read_Reg(FPGA1, F1_Tacho_reg7, 1); stubManager.Write("\n"); - Fpga_Read_Reg(FPGA2, F2_Tacho_reg0, 1); stubManager.Write("\n"); +// Fpga_Read_Reg(FPGA1, F1_Tacho_reg5, 1); stubManager.Write("\n"); +// Fpga_Read_Reg(FPGA1, F1_Tacho_reg6, 1); stubManager.Write("\n"); +// Fpga_Read_Reg(FPGA1, F1_Tacho_reg7, 1); stubManager.Write("\n"); +// Fpga_Read_Reg(FPGA2, F2_Tacho_reg0, 1); stubManager.Write("\n"); //stubManager.Write("\n\n"); Thread.Sleep(1000); diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/DO_NOT_WORK_New_Calibrate_Midtank_pressure_sensors.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/DO_NOT_WORK_New_Calibrate_Midtank_pressure_sensors.cs index 254a3143b..2acbe7d71 100644 --- a/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/DO_NOT_WORK_New_Calibrate_Midtank_pressure_sensors.cs +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/DO_NOT_WORK_New_Calibrate_Midtank_pressure_sensors.cs @@ -13,6 +13,7 @@ using Tango.PMR.EmbeddedParameters; using Tango.Stubs; //---------------------- +const double Slop=0.92; const double MIN_SLOP=0.7; const double MAX_SLOP=1.4; const double ERROR_SLOP=-1; @@ -39,6 +40,7 @@ private const string FILE_PATH = @"C:\MidTankLog\"; string File_name; double [,] voltage_array = new double[9,9]; string [] Parameter = new string[5] {"\t","Empty [V]","100cc [V]","800cc [V]"," b [L/V] "}; + double Full_Cartridge=1; // 1 litter less 100 cc //---------------------- const Int32 I2C_ID = 2; @@ -58,9 +60,11 @@ const Int32 I2C_ID = 2; public void OnExecute(StubManager stubManager) { Int32 midtankno = 0; - double Slop; - double Zero_Point; - + double Full_Point=0; //on Voltage + double resualt; + double Sum=0 ; + double Old_Sum=0 ; + if (!Directory.Exists(FILE_PATH)) { @@ -73,9 +77,9 @@ public void OnExecute(StubManager stubManager) stubManager.Write("\n"); Machine_SN = response; stubManager.WriteLine(Machine_SN); - File_name= FILE_PATH +Machine_SN + DateTime.Now.ToString("MM_dd_yyyy_HH_mm_ss")+".LOG"; + File_name= FILE_PATH +Machine_SN + DateTime.Now.ToString("MM_dd_yyyy_HH_mm_ss")+".csv"; stubManager.Write(File_name); - stubManager.WriteToFile(File_name,"MidTank S/N:" + Machine_SN); + stubManager.WriteToFile(File_name,"MidTank S/N:," + Machine_SN); // voltage_array[1,0]=1; // voltage_array[2,0]=2; @@ -91,59 +95,79 @@ public void OnExecute(StubManager stubManager) var response1 = stubManager.ShowResponseWindow("Enter Midtank number to calibrate (1-8):", ""); stubManager.WriteLine(response1); midtankno = Int32.Parse(response1); - stubManager.WriteToFile(File_name,"MidTank Number:\t" + response1); + stubManager.AppendToFile(File_name,"MidTank Number:\t" + response1); - string box_msg = "Please Insert cartridge "; + string box_msg = "Please Insert cartridge with 1000cc except Lubbricant add 500cc only "; // string box_title = "Midatnk empty"; // MessageBox.Show(box_msg, box_title); MessageBox.Show(box_msg); - open_valve(midtankno,1,1) ; //open Air valve - open_valve(midtankno,0,1) ; //open Ink valve - - - - - - - - + open_valve(midtankno,1,1) ; //open Air valve + open_valve(midtankno,0,1) ; //open Ink valve + Int32 i=0; + while (i<60*15) //check for 15 minitus + { + Sum=0; + for (Int32 j=0;j<30;j++) + { + resualt=read_pressure_sensor(midtankno); + stubManager.AppendToFile(File_name,resualt+",mV"); + Sum=Sum+resualt; + Thread.Sleep(1000); + } + i=i+1; + if (Sum>Old_Sum) + Old_Sum=Sum-Old_Sum; + else + Old_Sum=Old_Sum-Sum; + + if ( Old_Sum <0.02) + i=60*15; //end + Old_Sum=Sum; + } + Full_Point=Sum/30; + box_msg = "Send file" + File_name +"to Mati"; + MessageBox.Show(box_msg); - stubManager.Run("StubFpgaWriteRegRequest" ,F3_VALVE_OUT, 0x000f); // open all valve air of midtank and close all ink of midtank - Thread.Sleep(500); - stubManager.Run("StubFpgaWriteRegRequest" ,F3_VALVE_OUT, 0x00ff); // open all valve air of midtank and close all ink of midtank - Thread.Sleep(500); - stubManager.Run("StubFpgaWriteRegRequest" ,F3_VALVE_OUT, 0x0fff); // open all valve air of midtank and close all ink of midtank - Thread.Sleep(500); - stubManager.Run("stubFpgaWriteRegRequest" ,F3_VALVE_OUT, 0xffff); // open all valve air and ink of midtank - Thread.Sleep(2500); - - Thread.Sleep(1000); + // stubManager.Run("StubFpgaWriteRegRequest" ,F3_VALVE_OUT, 0x000f); // open all valve air of midtank and close all ink of midtank + // Thread.Sleep(500); + // stubManager.Run("StubFpgaWriteRegRequest" ,F3_VALVE_OUT, 0x00ff); // open all valve air of midtank and close all ink of midtank + // Thread.Sleep(500); + // stubManager.Run("StubFpgaWriteRegRequest" ,F3_VALVE_OUT, 0x0fff); // open all valve air of midtank and close all ink of midtank + // Thread.Sleep(500); + // stubManager.Run("stubFpgaWriteRegRequest" ,F3_VALVE_OUT, 0xffff); // open all valve air and ink of midtank + // + // Thread.Sleep(2500); + + // Thread.Sleep(1000); - read_pressure_sensor(1); + // read_pressure_sensor(1); - box_msg ="Insert 100cc of appropriate ink/lube to each midtank\n\t1.black ink\n\t2. Magenta ink\n\t3. Transparent ink\n\t4. Cleaner\n\t5. Cyan ink\n\t6. Yellow ink\n\t7. Spot color\n\t8. Lubricant/n"; - MessageBox.Show(box_msg); - - read_pressure_sensor(2); + // box_msg ="Insert 100cc of appropriate ink/lube to each midtank\n\t1.black ink\n\t2. Magenta ink\n\t3. Transparent ink\n\t4. Cleaner\n\t5. Cyan ink\n\t6. Yellow ink\n\t7. Spot color\n\t8. Lubricant/n"; + // MessageBox.Show(box_msg); +// + // read_pressure_sensor(2); // voltage_array[3,2]=2.5; - box_msg = "Add another 700cc for ink and TI \nFor Lubbricant add 500cc only."; - MessageBox.Show(box_msg); - read_pressure_sensor(3); - stubManager.Run("stubFpgaWriteRegRequest" ,F3_VALVE_OUT, 0x0000); // close all valve air and ink of midtank +// box_msg = "Add another 700cc for ink and TI \nFor Lubbricant add 500cc only."; +// MessageBox.Show(box_msg); +// read_pressure_sensor(3); +// stubManager.Run("stubFpgaWriteRegRequest" ,F3_VALVE_OUT, 0x0000); // close all valve air and ink of midtank // voltage_array[3,3]=4.5; + close_valve(midtankno,1,1) ; //close Air valve + close_valve(midtankno,0,1) ; //close Ink valve - calc_slop(); - print_table(); +// calc_slop(); +// print_table(); - insert_slop_t_eeprom(); +// insert_slop_t_eeprom(Full_Point, midtankno); + insert_slop_t_eeprom(Full_Point, midtankno); box_msg ="Turn Power Off and On to finish the calibration."; MessageBox.Show(box_msg); @@ -178,54 +202,55 @@ int calc_slop() } - int insert_slop_t_eeprom() + int insert_slop_t_eeprom( double FullPoint,Int32 midtankno) { - stubManager.Write("\n "); +// stubManager.Write("\n "); MidTankDataSetupRequest midTankDataSetupRequest = new MidTankDataSetupRequest(); - for (uint i=1;i<9;i++) - { - if (voltage_array[i,4]!= ERROR_SLOP) - { +// for (uint i=1;i<9;i++) +// { +// if (voltage_array[i,4]!= ERROR_SLOP) +// { MidTankData midTankData = new MidTankData(); - midTankData.MidTankId = i-1; - midTankData.InitialOffsetA = voltage_array[i,2]; - midTankData.SlopeB = voltage_array[i,4]; + midTankData.MidTankId = Convert.ToUInt32 (midtankno-1); + midTankData.InitialOffsetA =FullPoint - (Full_Cartridge-0.1)/Slop; + midTankData.SlopeB = Slop; - stubManager.Write("\nMidtank No:" + i+ "=\tA="+voltage_array[i,2]+"\tSlop="+voltage_array[i,4]); + stubManager.Write("\nMidtank No:" + midtankno + "=\tVoltage Zero is ="+(FullPoint - (Full_Cartridge-0.1)/Slop)+"\tSlop="+ Slop); + stubManager.AppendToFile(File_name,"\nMidtank No:" + midtankno + "=\tVoltage Zero is ="+(FullPoint - (Full_Cartridge-0.1)/Slop)+"\tSlop="+ Slop); midTankDataSetupRequest.MidTankInfo.Add(midTankData); - } + // } var response = stubManager.Run(midTankDataSetupRequest); - } + //} return 1; } - - -int print_table() - { - - for (uint i=0;i<5;i++) - { - stubManager.AppendToFile(File_name,Parameter[i]+"\t"+voltage_array[1,i]+"\t"+voltage_array[2,i]+"\t"+voltage_array[3,i]+"\t"+voltage_array[4,i]+"\t"+voltage_array[5,i]+"\t"+voltage_array[6,i]+"\t"+voltage_array[7,i]+"\t"+voltage_array[8,i]) ; - } - - - return 1; - - } - - +// +// +//int print_table() +// { +// +// for (uint i=0;i<5;i++) +// { +// stubManager.AppendToFile(File_name,Parameter[i]+"\t"+voltage_array[1,i]+"\t"+voltage_array[2,i]+"\t"+voltage_array[3,i]+"\t"+voltage_array[4,i]+"\t"+voltage_array[5,i]+"\t"+voltage_array[6,i]+"\t"+voltage_array[7,i]+"\t"+voltage_array[8,i]) ; +// } +// +// +// return 1; +// +// } + +//start mat int adc_configuration(uint I2C_Slave_Add,uint channel ) { @@ -261,7 +286,7 @@ int adc_set_for_read_ch(uint I2C_Slave_Add) -int adc_read_ch(uint I2C_Slave_Add,uint table_index_x,uint table_index_y) +double adc_read_ch(uint I2C_Slave_Add) { StubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest(); stubI2CReadBytesRequest.I2CId = I2C_ID; @@ -281,67 +306,80 @@ int adc_read_ch(uint I2C_Slave_Add,uint table_index_x,uint table_index_y) temp=temp & 0x0fff; calc = (double)temp *2.5 / 4096.0; - stubManager.Write("ADC [volts]:\t"); - stubManager.Write(calc+"\t"); +// stubManager.Write("ADC [volts]:\t"); +// stubManager.Write(calc+"\t"); calc1 = (1.96- calc) * 4.64 + 1.96; stubManager.Write("Vsensor [volts]:\t"); - stubManager.Write(calc1); + stubManager.Write(calc1 + "\n"); - voltage_array[table_index_x,table_index_y]=calc1; + // voltage_array[table_index_x,table_index_y]=calc1; - return 1; + return calc1; } -int read_pressure_sensor(uint i ) +double read_pressure_sensor(Int32 i ) { - - stubManager.Write("\n-----------MIDTANK_PRESSESENS-------test_no= "+i); - - stubManager.Write("\n1_1= "); +double resualt =0 ; + switch (i) + { + case 1: + adc_configuration(0x44,0x20); //a2d_address 0x44 channel channel 2 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; - adc_configuration(0x44,0x20); //a2d_address 0x44 channel channel 2 - adc_set_for_read_ch(0x44); - adc_read_ch(0x44,1,i); - - stubManager.Write("\n2_1= "); - adc_configuration(0x44,0x08); //a2d_address 0x44 channel channel 4 - adc_set_for_read_ch(0x44); - adc_read_ch(0x44,2,i); - - stubManager.Write("\n3_1= "); - adc_configuration(0x46,0x80); //a2d_address 0x46 channel channel 0 - adc_set_for_read_ch(0x46); - adc_read_ch(0x46,3,i); - - stubManager.Write("\n4_1= "); - adc_configuration(0x46,0x20); //a2d_address 0x46 channel channel 2 - adc_set_for_read_ch(0x46); - adc_read_ch(0x46,4,i); + case 2: + adc_configuration(0x44,0x08); //a2d_address 0x44 channel channel 4 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; - stubManager.Write("\n1_2= "); - adc_configuration(0x44,0x10); //a2d_address 0x44 channel channel 3 - adc_set_for_read_ch(0x44); - adc_read_ch(0x44,5,i); - - stubManager.Write("\n2_2= "); - adc_configuration(0x44,0x04); //a2d_address 0x44 channel channel 5 - adc_set_for_read_ch(0x44); - adc_read_ch(0x44,6,i); - - stubManager.Write("\n3_2= "); - adc_configuration(0x46,0x40); //a2d_address 0x46 channel channel 1 - adc_set_for_read_ch(0x46); - adc_read_ch(0x46,7,i); - - stubManager.Write("\n4_2= "); - adc_configuration(0x46,0x10); //a2d_address 0x46 channel channel 3 - adc_set_for_read_ch(0x46); - adc_read_ch(0x46,8,i); + case 3: + adc_configuration(0x46,0x80); //a2d_address 0x46 channel channel 0 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; - return 1; + case 4: + adc_configuration(0x46,0x20); //a2d_address 0x46 channel channel 2 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + case 5: + adc_configuration(0x44,0x10); //a2d_address 0x44 channel channel 3 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 6: + adc_configuration(0x44,0x04); //a2d_address 0x44 channel channel 5 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 7: + adc_configuration(0x46,0x40); //a2d_address 0x46 channel channel 1 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + case 8: + adc_configuration(0x46,0x10); //a2d_address 0x46 channel channel 3 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + default: + stubManager.Write("Error"); + + break; + } + + return resualt; } -//strat mat + //-------------------------------- int open_valve (int valve_nm,int valve_type,int check_valve) //valve_type=0 is Air ,1 is Ink ; check_valve=1 send feedbak diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/New_Calibrate_Midtank_pressure_sensors.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/New_Calibrate_Midtank_pressure_sensors.cs new file mode 100644 index 000000000..62d0e017f --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/New_Calibrate_Midtank_pressure_sensors.cs @@ -0,0 +1,393 @@ +using System; +using System.IO; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.PMR.EmbeddedParameters; +using Tango.Stubs; + +//---------------------- +const double MIN_SLOP=0.7; +const double MAX_SLOP=1.4; +const double ERROR_SLOP=-1; +const double MIN_50cc_on_volt=2.3; +const double MAX_50cc_on_volt=3.2; +const double ERROR_50cc_on_volt=-1; + +int [] Convert_Midtank_No = new Int32 [8] {1,3,5,7,2,4,6,8}; +uint [,] ADC_Add_Chnl = new uint [8,2] { + {0x44,0x20}, + {0x44,0x08}, + {0x46,0x80}, + {0x46,0x20}, + {0x44,0x10}, + {0x44,0x04}, + {0x46,0x40}, + {0x46,0x10}, + }; + + +const Int32 F3_VALVE_OUT = 0x600008E2 ; +string Machine_SN ; +private const string FILE_PATH = @"C:\MidTankLog\"; +string File_name; +double Full_Cartridge=1000; // on CC +double Slop=0.92; + +//---------------------- +const Int32 I2C_ID = 2; +//const Int32 I2C_Slave_Add = 0x46; //must be 0x40, 0x44 or 0x46 +//---------------------- + + +public void OnExecute(StubManager stubManager) +{ + Int32 midtankno = 0; + double Full_Point=0; //on Voltage + double resualt; + double Sum=0 ; + double Old_Sum=0 ; + + + if (!Directory.Exists(FILE_PATH)) + { + Directory.CreateDirectory(FILE_PATH); + } + + + + var response = stubManager.ShowResponseWindow("Enter Midtank S/N: ", ""); + stubManager.Write("\n"); + Machine_SN = response; + stubManager.WriteLine(Machine_SN); + File_name= FILE_PATH +Machine_SN + DateTime.Now.ToString("MM_dd_yyyy_HH_mm_ss")+".csv"; + stubManager.Write(File_name); + stubManager.WriteToFile(File_name,"MidTank S/N:," + Machine_SN); + + + var response1 = stubManager.ShowResponseWindow("Enter Midtank number to calibrate (1-8):", ""); + stubManager.WriteLine(response1); + midtankno = Int32.Parse(response1); + stubManager.AppendToFile(File_name,"MidTank Number:\t" + response1); + if (midtankno==8) + Slop=1; + else + Slop=0.92; + + var response10 = stubManager.ShowResponseWindow("Enter Cartridge Valume on CC (500-1500):", ""); + stubManager.WriteLine(response10); + Full_Cartridge = double.Parse(response10); + stubManager.AppendToFile(File_name,"Cartridge Valume:\t" + response10); + stubManager.AppendToFile(File_name,"Slop value:\t" + Slop); + + + DialogResult result = MessageBox.Show("Are you sure to calibrate Midtank No: "+ midtankno + " with "+ Full_Cartridge +" CC" , "Warning",MessageBoxButtons.YesNo); + if(result == DialogResult.Yes) + { + + + + string box_msg = "Please Insert cartridge "; + + MessageBox.Show(box_msg); + + open_valve(midtankno,1,1) ; //open Air valve + open_valve(midtankno,0,1) ; //open Ink valve + Int32 i=0; + while (i<60*15) //check for 15 minitus + { + Sum=0; + for (Int32 j=0;j<30;j++) + { + resualt=read_pressure_sensor(midtankno); + stubManager.AppendToFile(File_name,resualt+",V"); + Sum=Sum+resualt; + Thread.Sleep(1000); + } + i=i+1; + if (Sum>Old_Sum) + Old_Sum=Sum-Old_Sum; + else + Old_Sum=Old_Sum-Sum; + + if ( Old_Sum <0.02) + i=60*15; //end + Old_Sum=Sum; + } + Full_Point=Sum/30; + + + close_valve(midtankno,1,1) ; //close Air valve + close_valve(midtankno,0,1) ; //close Ink valve + + + insert_slop_t_eeprom(Full_Point, midtankno); + box_msg ="Turn Power Off and On to finish the calibration."; + MessageBox.Show(box_msg); + } + + +} + + + int insert_slop_t_eeprom( double FullPoint,Int32 midtankno) +{ +// stubManager.Write("\n "); + + MidTankDataSetupRequest midTankDataSetupRequest = new MidTankDataSetupRequest(); + + MidTankData midTankData = new MidTankData(); + midTankData.MidTankId = Convert.ToUInt32 (midtankno-1); + midTankData.InitialOffsetA =FullPoint - (Full_Cartridge/1000-0.1)/Slop; + midTankData.SlopeB = Slop; + + stubManager.Write("\nMidtank No:" + midtankno + "=\tVoltage Zero is ="+(FullPoint - (Full_Cartridge/1000-0.1)/Slop)+"\tSlop="+ Slop); + stubManager.AppendToFile(File_name,"\nMidtank No:" + midtankno + "=\tVoltage Zero is ="+(FullPoint - (Full_Cartridge/1000-0.1)/Slop)+"\tSlop="+ Slop); + + + midTankDataSetupRequest.MidTankInfo.Add(midTankData); + + +var response = stubManager.Run(midTankDataSetupRequest); + +return 1; +} + + +int adc_configuration(uint I2C_Slave_Add,uint channel ) + { + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add; + + UInt32 uInt32 = new UInt32(); + stubI2CWriteBytesRequest.BytesTWrite.Add(0x00);//Byte 0 to write + stubI2CWriteBytesRequest.BytesTWrite.Add(channel);//Byte 1 to Write, must be 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02 or 0x01 for different channels + stubI2CWriteBytesRequest.BytesTWrite.Add(0x80);//Byte 2 to Write + + var response = stubManager.Run(stubI2CWriteBytesRequest); + + return 1; + } + + +int adc_set_for_read_ch(uint I2C_Slave_Add) + { + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add; + + UInt32 uInt32 = new UInt32(); + stubI2CWriteBytesRequest.BytesTWrite.Add(0x01);//Byte 0 to write + + var response = stubManager.Run(stubI2CWriteBytesRequest); + + return 1; + } + + + + +double adc_read_ch(uint I2C_Slave_Add) + { + StubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest(); + stubI2CReadBytesRequest.I2CId = I2C_ID; + stubI2CReadBytesRequest.SlaveAddress = I2C_Slave_Add; + stubI2CReadBytesRequest.NumberOfBytesToRead = 2; // Number of bytes to read + + var response1 = stubManager.Run(stubI2CReadBytesRequest); + uint temph=0; + uint templ=0; + uint temp; + double calc; + double calc1; + double calc2; + temph=response1.ReadBytes[0]; + templ=response1.ReadBytes[1]; + temp = (temph << 8) | templ; + temp=temp & 0x0fff; + + calc = (double)temp *2.5 / 4096.0; + + calc1 = (1.96- calc) * 4.64 + 1.96; + stubManager.Write("Vsensor [volts]:\t"); + stubManager.Write(calc1 + "\n"); + + + return calc1; + } + +double read_pressure_sensor(Int32 i ) + { +double resualt =0 ; + switch (i) + { + case 1: + adc_configuration(0x44,0x20); //a2d_address 0x44 channel channel 2 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 2: + adc_configuration(0x44,0x08); //a2d_address 0x44 channel channel 4 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 3: + adc_configuration(0x46,0x80); //a2d_address 0x46 channel channel 0 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + case 4: + adc_configuration(0x46,0x20); //a2d_address 0x46 channel channel 2 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + case 5: + adc_configuration(0x44,0x10); //a2d_address 0x44 channel channel 3 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 6: + adc_configuration(0x44,0x04); //a2d_address 0x44 channel channel 5 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 7: + adc_configuration(0x46,0x40); //a2d_address 0x46 channel channel 1 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + case 8: + adc_configuration(0x46,0x10); //a2d_address 0x46 channel channel 3 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + default: + stubManager.Write("Error"); + + break; + } + + return resualt; + } + + +//-------------------------------- +int open_valve (int valve_nm,int valve_type,int check_valve) //valve_type=0 is Air ,1 is Ink ; check_valve=1 send feedbak +{ + int temp1=Convert_Midtank_No[valve_nm-1] ; + + string temp; + SetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 1); + + if (check_valve!=0) + { + temp="Air"; + if (valve_type==1) + temp="Ink"; + + DialogResult result = MessageBox.Show("Did " + temp + "Valve of Midtank " + valve_nm +" open?", "Warning",MessageBoxButtons.YesNo); + if(result == DialogResult.No) + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Fail"; + stubManager.Write(temp +"Valve\tFail\n"); + return 0; + } + else + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Pass"; + stubManager.Write(temp +"Valve\tOpen\n"); + return 1; + } + + } + return 1; + +} +//-------------------------------- +int close_valve (int valve_nm,int valve_type,int check_valve) +{ + int temp1=Convert_Midtank_No[valve_nm-1]; + + string temp; + SetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 0); + if (check_valve!=0) + { + temp="Air"; + if (valve_type==1) + temp="Ink"; + + DialogResult result = MessageBox.Show("Did " + temp +" Valve of Midtank " + valve_nm +" close?", "Warning",MessageBoxButtons.YesNo); + if(result == DialogResult.No) + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Fail"; + stubManager.Write(temp +"Valve\tFail\n"); + return 0; + } + else + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Pass"; + stubManager.Write(temp +"Valve\tclose\n"); + return 1; + } + } + return 1; + +} + +public Int32 SetBit(Int32 Adr, Int32 BitNo, Int32 Bit) +{ + Int32 BitMask; + var RetVal = Fpga_Read_Reg(Adr); + Int32 RV = (Int32) RetVal.Value; + + if (Bit == 0x1) + { + BitMask = 0x1 << BitNo; + RV = RV | BitMask; + Fpga_Write_Reg( Adr, RV ); + } + else if (Bit == 0x0) + { + BitMask = ~(0x1 << BitNo); + RV = RV & BitMask; + Fpga_Write_Reg(Adr, RV ); + } + return 1; +} + +int Fpga_Write_Reg(Int32 Addr, Int32 Data) +{ + var response = stubManager.Run("StubFpgaWriteRegRequest" ,Addr, Data); + + return 1; +} + + + +StubFpgaReadRegResponse Fpga_Read_Reg(Int32 Addr) +{ + var response = stubManager.Run("StubFpgaReadRegRequest" ,Addr); + response.Value = response.Value & 0xffff; + + return response; +} + + + + +//end mati \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/New_Calibrate_Midtank_pressure_sensors1.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/New_Calibrate_Midtank_pressure_sensors1.cs new file mode 100644 index 000000000..9edb49e03 --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/New_Calibrate_Midtank_pressure_sensors1.cs @@ -0,0 +1,423 @@ +using System; +using System.IO; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.PMR.EmbeddedParameters; +using Tango.Stubs; + +//---------------------- +const double MIN_SLOP=0.7; +const double MAX_SLOP=1.4; +const double ERROR_SLOP=-1; +const double MIN_50cc_on_volt=2.3; +const double MAX_50cc_on_volt=3.2; +const double ERROR_50cc_on_volt=-1; + +int [] Convert_Midtank_No = new Int32 [8] {1,3,5,7,2,4,6,8}; +uint [,] ADC_Add_Chnl = new uint [8,2] { + {0x44,0x20}, + {0x44,0x08}, + {0x46,0x80}, + {0x46,0x20}, + {0x44,0x10}, + {0x44,0x04}, + {0x46,0x40}, + {0x46,0x10}, + }; + + +const Int32 F3_VALVE_OUT = 0x600008E2 ; +string Machine_SN ; +private const string FILE_PATH = @"C:\MidTankLog\"; +string File_name; +double Full_Cartridge=1000; // on CC +double Slop=0.92; + +//---------------------- +const Int32 I2C_ID = 2; +//const Int32 I2C_Slave_Add = 0x46; //must be 0x40, 0x44 or 0x46 +//---------------------- + + +public void OnExecute(StubManager stubManager) +{ + Int32 Timout ; + Int32 Interval; + Int32 midtankno = 0; + double Full_Point=0; //on Voltage + double resualt; + double Sum=0 ; + double Old_Sum=0 ; + + + if (!Directory.Exists(FILE_PATH)) + { + Directory.CreateDirectory(FILE_PATH); + } + + + + var response = stubManager.ShowResponseWindow("Enter Midtank S/N: ", ""); + stubManager.Write("\n"); + Machine_SN = response; + stubManager.WriteLine(Machine_SN); + File_name= FILE_PATH +Machine_SN + DateTime.Now.ToString("MM_dd_yyyy_HH_mm_ss")+".csv"; + stubManager.Write(File_name); + stubManager.WriteToFile(File_name,"MidTank S/N:," + Machine_SN); + + + var response1 = stubManager.ShowResponseWindow("Enter Midtank number to calibrate (1-8):", ""); + stubManager.WriteLine(response1); + midtankno = Int32.Parse(response1); + stubManager.AppendToFile(File_name,"MidTank Number:\t" + response1); + if (midtankno==8) + { + Slop=1; + Timout=60; //60 minutes + Interval=60; //60 second + } + else + { + Slop=0.92; + Timout=10*2; //10 minutes + Interval=30; //30 second + + } + var response10 = stubManager.ShowResponseWindow("Enter Cartridge Valume on CC (500-1500):", ""); + stubManager.WriteLine(response10); + Full_Cartridge = double.Parse(response10); + stubManager.AppendToFile(File_name,"Cartridge Valume:\t" + response10); + stubManager.AppendToFile(File_name,"Slop value:\t" + Slop); + + + DialogResult result = MessageBox.Show("Are you sure to calibrate Midtank No: "+ midtankno + " with "+ Full_Cartridge +" CC" , "Warning",MessageBoxButtons.YesNo); + if(result == DialogResult.Yes) + { + + + + string box_msg = "Please Insert cartridge "; + + MessageBox.Show(box_msg); + + open_valve(midtankno,1,1) ; //open Air valve + open_valve(midtankno,0,1) ; //open Ink valve + Int32 i=0; + while (iOld_Sum) + Old_Sum=Sum-Old_Sum; + else + Old_Sum=Old_Sum-Sum; + + if ((check_valve(midtankno,1) == 0) && (check_valve(midtankno,0) == 0)) + { + i++; + if ( Old_Sum <0.02) + i=Timout; //end + Old_Sum=Sum; + } + else + { + open_valve(midtankno,1,0) ; //open Air valve + open_valve(midtankno,0,0) ; //open Ink valve + Old_Sum=0; + } + } + Full_Point=Sum/Interval; + + + close_valve(midtankno,1,1) ; //close Air valve + close_valve(midtankno,0,1) ; //close Ink valve + + + insert_slop_t_eeprom(Full_Point, midtankno); + box_msg ="Turn Power Off and On to finish the calibration."; + MessageBox.Show(box_msg); + } + + +} + + + int insert_slop_t_eeprom( double FullPoint,Int32 midtankno) +{ +// stubManager.Write("\n "); + + MidTankDataSetupRequest midTankDataSetupRequest = new MidTankDataSetupRequest(); + + MidTankData midTankData = new MidTankData(); + midTankData.MidTankId = Convert.ToUInt32 (midtankno-1); + midTankData.InitialOffsetA =FullPoint - (Full_Cartridge/1000-0.1)/Slop; + midTankData.SlopeB = Slop; + + stubManager.Write("\nMidtank No:" + midtankno + "=\tVoltage Zero is ="+(FullPoint - (Full_Cartridge/1000-0.1)/Slop)+"\tSlop="+ Slop); + stubManager.AppendToFile(File_name,"\nMidtank No:" + midtankno + "=\tVoltage Zero is ="+(FullPoint - (Full_Cartridge/1000-0.1)/Slop)+"\tSlop="+ Slop); + + + midTankDataSetupRequest.MidTankInfo.Add(midTankData); + + +var response = stubManager.Run(midTankDataSetupRequest); + +return 1; +} + + +int adc_configuration(uint I2C_Slave_Add,uint channel ) + { + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add; + + UInt32 uInt32 = new UInt32(); + stubI2CWriteBytesRequest.BytesTWrite.Add(0x00);//Byte 0 to write + stubI2CWriteBytesRequest.BytesTWrite.Add(channel);//Byte 1 to Write, must be 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02 or 0x01 for different channels + stubI2CWriteBytesRequest.BytesTWrite.Add(0x80);//Byte 2 to Write + + var response = stubManager.Run(stubI2CWriteBytesRequest); + + return 1; + } + + +int adc_set_for_read_ch(uint I2C_Slave_Add) + { + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add; + + UInt32 uInt32 = new UInt32(); + stubI2CWriteBytesRequest.BytesTWrite.Add(0x01);//Byte 0 to write + + var response = stubManager.Run(stubI2CWriteBytesRequest); + + return 1; + } + + + + +double adc_read_ch(uint I2C_Slave_Add) + { + StubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest(); + stubI2CReadBytesRequest.I2CId = I2C_ID; + stubI2CReadBytesRequest.SlaveAddress = I2C_Slave_Add; + stubI2CReadBytesRequest.NumberOfBytesToRead = 2; // Number of bytes to read + + var response1 = stubManager.Run(stubI2CReadBytesRequest); + uint temph=0; + uint templ=0; + uint temp; + double calc; + double calc1; + double calc2; + temph=response1.ReadBytes[0]; + templ=response1.ReadBytes[1]; + temp = (temph << 8) | templ; + temp=temp & 0x0fff; + + calc = (double)temp *2.5 / 4096.0; + + calc1 = (1.96- calc) * 4.64 + 1.96; + stubManager.Write("Vsensor [volts]:\t"); + stubManager.Write(calc1 + "\n"); + + + return calc1; + } + +double read_pressure_sensor(Int32 i ) + { +double resualt =0 ; + switch (i) + { + case 1: + adc_configuration(0x44,0x20); //a2d_address 0x44 channel channel 2 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 2: + adc_configuration(0x44,0x08); //a2d_address 0x44 channel channel 4 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 3: + adc_configuration(0x46,0x80); //a2d_address 0x46 channel channel 0 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + case 4: + adc_configuration(0x46,0x20); //a2d_address 0x46 channel channel 2 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + case 5: + adc_configuration(0x44,0x10); //a2d_address 0x44 channel channel 3 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 6: + adc_configuration(0x44,0x04); //a2d_address 0x44 channel channel 5 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 7: + adc_configuration(0x46,0x40); //a2d_address 0x46 channel channel 1 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + case 8: + adc_configuration(0x46,0x10); //a2d_address 0x46 channel channel 3 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + default: + stubManager.Write("Error"); + + break; + } + + return resualt; + } + + +//-------------------------------- +int open_valve (int valve_nm,int valve_type,int check_valve) //valve_type=0 is Air ,1 is Ink ; check_valve=1 send feedbak +{ + int temp1=Convert_Midtank_No[valve_nm-1] ; + + string temp; + SetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 1); + + if (check_valve!=0) + { + temp="Air"; + if (valve_type==1) + temp="Ink"; + + DialogResult result = MessageBox.Show("Did " + temp + "Valve of Midtank " + valve_nm +" open?", "Warning",MessageBoxButtons.YesNo); + if(result == DialogResult.No) + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Fail"; + stubManager.Write(temp +"Valve\tFail\n"); + return 0; + } + else + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Pass"; + stubManager.Write(temp +"Valve\tOpen\n"); + return 1; + } + + } + return 1; + +} +//-------------------------------- +int close_valve (int valve_nm,int valve_type,int check_valve) +{ + int temp1=Convert_Midtank_No[valve_nm-1]; + + string temp; + SetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 0); + if (check_valve!=0) + { + temp="Air"; + if (valve_type==1) + temp="Ink"; + + DialogResult result = MessageBox.Show("Did " + temp +" Valve of Midtank " + valve_nm +" close?", "Warning",MessageBoxButtons.YesNo); + if(result == DialogResult.No) + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Fail"; + stubManager.Write(temp +"Valve\tFail\n"); + return 0; + } + else + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Pass"; + stubManager.Write(temp +"Valve\tclose\n"); + return 1; + } + } + return 1; + +} + +public Int32 SetBit(Int32 Adr, Int32 BitNo, Int32 Bit) +{ + Int32 BitMask; + var RetVal = Fpga_Read_Reg(Adr); + Int32 RV = (Int32) RetVal.Value; + + if (Bit == 0x1) + { + BitMask = 0x1 << BitNo; + RV = RV | BitMask; + Fpga_Write_Reg( Adr, RV ); + } + else if (Bit == 0x0) + { + BitMask = ~(0x1 << BitNo); + RV = RV & BitMask; + Fpga_Write_Reg(Adr, RV ); + } + return 1; +} + +int Fpga_Write_Reg(Int32 Addr, Int32 Data) +{ + var response = stubManager.Run("StubFpgaWriteRegRequest" ,Addr, Data); + + return 1; +} + + +Int32 check_valve (Int32 valve_nm,int valve_type) +{ + Int32 temp1=Convert_Midtank_No[valve_nm-1]; + + var response = stubManager.Run("StubFpgaReadRegRequest" ,F3_VALVE_OUT); + Int32 RV =(Int32) response.Value & 0xffff ; + RV = RV & ( 0x1 << (((valve_type+1)*8)- temp1)); + return RV; + +} + + +StubFpgaReadRegResponse Fpga_Read_Reg(Int32 Addr) +{ + var response = stubManager.Run("StubFpgaReadRegRequest" ,Addr); + response.Value = response.Value & 0xffff; + + return response; +} + + + + +//end mati \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/New_Calibrate_Midtank_pressure_sensors2.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/New_Calibrate_Midtank_pressure_sensors2.cs new file mode 100644 index 000000000..403d0b818 --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/New_Calibrate_Midtank_pressure_sensors2.cs @@ -0,0 +1,447 @@ +using System; +using System.IO; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.PMR.EmbeddedParameters; +using Tango.Stubs; + +//---------------------- +const double MIN_SLOP=0.7; +const double MAX_SLOP=1.4; +const double ERROR_SLOP=-1; +const double MIN_50cc_on_volt=2.3; +const double MAX_50cc_on_volt=3.2; +const double ERROR_50cc_on_volt=-1; + +int [] Convert_Midtank_No = new Int32 [8] {1,3,5,7,2,4,6,8}; +uint [,] ADC_Add_Chnl = new uint [8,2] { + {0x44,0x20}, + {0x44,0x08}, + {0x46,0x80}, + {0x46,0x20}, + {0x44,0x10}, + {0x44,0x04}, + {0x46,0x40}, + {0x46,0x10}, + }; + + +const Int32 F3_VALVE_OUT = 0x600008E2 ; +string Machine_SN ; +private const string FILE_PATH = @"C:\MidTankLog\"; +string File_name; +double Full_Cartridge=1000; // on CC +double Slop=0.92; +//---------------------- +const Int32 I2C_ID = 2; +//const Int32 I2C_Slave_Add = 0x46; //must be 0x40, 0x44 or 0x46 +//---------------------- + + +public void OnExecute(StubManager stubManager) +{ + Int32 Timout ; + Int32 Interval; + Int32 midtankno = 0; + double Full_Point=0; //on Voltage + double resualt; + double Sum=0 ; + double Old_Sum=0 ; + double Start_Point=0; + + + if (!Directory.Exists(FILE_PATH)) + { + Directory.CreateDirectory(FILE_PATH); + } + + + + var response = stubManager.ShowResponseWindow("Enter Midtank S/N: ", ""); + stubManager.Write("\n"); + Machine_SN = response; + stubManager.WriteLine(Machine_SN); + File_name= FILE_PATH +Machine_SN + DateTime.Now.ToString("MM_dd_yyyy_HH_mm_ss")+".csv"; + stubManager.Write(File_name); + stubManager.WriteToFile(File_name,"MidTank S/N:," + Machine_SN); + + + var response1 = stubManager.ShowResponseWindow("Enter Midtank number to calibrate (1-8):", ""); + stubManager.WriteLine(response1); + midtankno = Int32.Parse(response1); + stubManager.AppendToFile(File_name,"MidTank Number:\t" + response1); + if (midtankno==8) + { + Slop=1; + Timout=60; //60 minutes + Interval=60; //60 second + } + else + { + Slop=0.92; + Timout=10*2; //10 minutes + Interval=30; //30 second + + } + var response10 = stubManager.ShowResponseWindow("Enter Cartridge Valume on CC (500-1500):", ""); + stubManager.WriteLine(response10); + Full_Cartridge = double.Parse(response10); + stubManager.AppendToFile(File_name,"Cartridge Valume:\t" + response10); + stubManager.AppendToFile(File_name,"Slop value:\t" + Slop); + + + DialogResult result = MessageBox.Show("Are you sure to calibrate Midtank No: "+ midtankno + " with "+ Full_Cartridge +" CC" , "Warning",MessageBoxButtons.YesNo); + if(result == DialogResult.Yes) + { + + + + string box_msg = "Please Insert cartridge "; + + MessageBox.Show(box_msg); + + open_valve(midtankno,1,1) ; //open Air valve + open_valve(midtankno,0,1) ; //open Ink valve + Int32 i=0; + while (iOld_Sum) + Old_Sum=Sum-Old_Sum; + else + Old_Sum=Old_Sum-Sum; + + + if ((check_valve(midtankno,1) != 0) && (check_valve(midtankno,0) != 0)) + { + i++; + if ( Old_Sum <0.02) + i=Timout+1; //end + Old_Sum=Sum; + } + else + { + open_valve(midtankno,1,0) ; //open Air valve + open_valve(midtankno,0,0) ; //open Ink valve + Old_Sum=0; + + } + } + Full_Point=Sum/Interval; + + + close_valve(midtankno,1,1) ; //close Air valve + close_valve(midtankno,0,1) ; //close Ink valve + + + if (insert_slop_t_eeprom(Full_Point, midtankno,Start_Point)==0) + { + box_msg ="Turn Power Off and On to finish the calibration."; + MessageBox.Show(box_msg); + } + else + { + box_msg ="Calibration error"; + MessageBox.Show(box_msg); + + } + } + +} + + + int insert_slop_t_eeprom( double FullPoint,Int32 midtankno, double StartPoint) +{ +// stubManager.Write("\n "); + + StartPoint=FullPoint-StartPoint; + StartPoint=StartPoint/Full_Cartridge; + if ((StartPoint>0.7 ) && (StartPoint>1.3 )) + { + MidTankDataSetupRequest midTankDataSetupRequest = new MidTankDataSetupRequest(); + + MidTankData midTankData = new MidTankData(); + midTankData.MidTankId = Convert.ToUInt32 (midtankno-1); + midTankData.InitialOffsetA =FullPoint - (Full_Cartridge/1000-0.1)/Slop; + midTankData.SlopeB = Slop; + + stubManager.Write("\nMidtank No:" + midtankno + "=\tVoltage Zero is ="+(FullPoint - (Full_Cartridge/1000-0.1)/Slop)+"\tSlop="+ Slop); + stubManager.AppendToFile(File_name,"\nMidtank No:" + midtankno + "=\tVoltage Zero is ="+(FullPoint - (Full_Cartridge/1000-0.1)/Slop)+"\tSlop="+ Slop); + + + midTankDataSetupRequest.MidTankInfo.Add(midTankData); + + + var response = stubManager.Run(midTankDataSetupRequest); + + return 0; + } + else + stubManager.Write("\nError"); + stubManager.AppendToFile(File_name,"\n Slop Error"); + return 1; + +} + + +int adc_configuration(uint I2C_Slave_Add,uint channel ) + { + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add; + + UInt32 uInt32 = new UInt32(); + stubI2CWriteBytesRequest.BytesTWrite.Add(0x00);//Byte 0 to write + stubI2CWriteBytesRequest.BytesTWrite.Add(channel);//Byte 1 to Write, must be 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02 or 0x01 for different channels + stubI2CWriteBytesRequest.BytesTWrite.Add(0x80);//Byte 2 to Write + + var response = stubManager.Run(stubI2CWriteBytesRequest); + + return 1; + } + + +int adc_set_for_read_ch(uint I2C_Slave_Add) + { + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add; + + UInt32 uInt32 = new UInt32(); + stubI2CWriteBytesRequest.BytesTWrite.Add(0x01);//Byte 0 to write + + var response = stubManager.Run(stubI2CWriteBytesRequest); + + return 1; + } + + + + +double adc_read_ch(uint I2C_Slave_Add) + { + StubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest(); + stubI2CReadBytesRequest.I2CId = I2C_ID; + stubI2CReadBytesRequest.SlaveAddress = I2C_Slave_Add; + stubI2CReadBytesRequest.NumberOfBytesToRead = 2; // Number of bytes to read + + var response1 = stubManager.Run(stubI2CReadBytesRequest); + uint temph=0; + uint templ=0; + uint temp; + double calc; + double calc1; + double calc2; + temph=response1.ReadBytes[0]; + templ=response1.ReadBytes[1]; + temp = (temph << 8) | templ; + temp=temp & 0x0fff; + + calc = (double)temp *2.5 / 4096.0; + + calc1 = (1.96- calc) * 4.64 + 1.96; + stubManager.Write("Vsensor [volts]:\t"); + stubManager.Write(calc1 + "\n"); + + + return calc1; + } + +double read_pressure_sensor(Int32 i ) + { +double resualt =0 ; + switch (i) + { + case 1: + adc_configuration(0x44,0x20); //a2d_address 0x44 channel channel 2 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 2: + adc_configuration(0x44,0x08); //a2d_address 0x44 channel channel 4 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 3: + adc_configuration(0x46,0x80); //a2d_address 0x46 channel channel 0 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + case 4: + adc_configuration(0x46,0x20); //a2d_address 0x46 channel channel 2 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + case 5: + adc_configuration(0x44,0x10); //a2d_address 0x44 channel channel 3 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 6: + adc_configuration(0x44,0x04); //a2d_address 0x44 channel channel 5 + adc_set_for_read_ch(0x44); + resualt=adc_read_ch(0x44); + break; + + case 7: + adc_configuration(0x46,0x40); //a2d_address 0x46 channel channel 1 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + case 8: + adc_configuration(0x46,0x10); //a2d_address 0x46 channel channel 3 + adc_set_for_read_ch(0x46); + resualt=adc_read_ch(0x46); + break; + + default: + stubManager.Write("Error"); + + break; + } + + return resualt; + } + + +//-------------------------------- +int open_valve (int valve_nm,int valve_type,int check_valve) //valve_type=0 is Air ,1 is Ink ; check_valve=1 send feedbak +{ + int temp1=Convert_Midtank_No[valve_nm-1] ; + + string temp; + SetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 1); + + if (check_valve!=0) + { + temp="Air"; + if (valve_type==1) + temp="Ink"; + + DialogResult result = MessageBox.Show("Did " + temp + "Valve of Midtank " + valve_nm +" open?", "Warning",MessageBoxButtons.YesNo); + if(result == DialogResult.No) + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Fail"; + stubManager.Write(temp +"Valve\tFail\n"); + return 0; + } + else + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Pass"; + stubManager.Write(temp +"Valve\tOpen\n"); + return 1; + } + + } + return 1; + +} +//-------------------------------- +int close_valve (int valve_nm,int valve_type,int check_valve) +{ + int temp1=Convert_Midtank_No[valve_nm-1]; + + string temp; + SetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 0); + if (check_valve!=0) + { + temp="Air"; + if (valve_type==1) + temp="Ink"; + + DialogResult result = MessageBox.Show("Did " + temp +" Valve of Midtank " + valve_nm +" close?", "Warning",MessageBoxButtons.YesNo); + if(result == DialogResult.No) + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Fail"; + stubManager.Write(temp +"Valve\tFail\n"); + return 0; + } + else + { +// Units_status[(valve_nm-1)*3+valve_type,1]="Pass"; + stubManager.Write(temp +"Valve\tclose\n"); + return 1; + } + } + return 1; + +} + +public Int32 SetBit(Int32 Adr, Int32 BitNo, Int32 Bit) +{ + Int32 BitMask; + var RetVal = Fpga_Read_Reg(Adr); + Int32 RV = (Int32) RetVal.Value; + + if (Bit == 0x1) + { + BitMask = 0x1 << BitNo; + RV = RV | BitMask; + Fpga_Write_Reg( Adr, RV ); + } + else if (Bit == 0x0) + { + BitMask = ~(0x1 << BitNo); + RV = RV & BitMask; + Fpga_Write_Reg(Adr, RV ); + } + return 1; +} + +int Fpga_Write_Reg(Int32 Addr, Int32 Data) +{ + var response = stubManager.Run("StubFpgaWriteRegRequest" ,Addr, Data); + + return 1; +} + + +Int32 check_valve (Int32 valve_nm,int valve_type) +{ + Int32 temp1=Convert_Midtank_No[valve_nm-1]; + + var response = stubManager.Run("StubFpgaReadRegRequest" ,F3_VALVE_OUT); + Int32 RV =(Int32) response.Value & 0xffff ; + RV = RV & ( 0x1 << (((valve_type+1)*8)- temp1)); + return RV; + +} + + +StubFpgaReadRegResponse Fpga_Read_Reg(Int32 Addr) +{ + var response = stubManager.Run("StubFpgaReadRegRequest" ,Addr); + response.Value = response.Value & 0xffff; + + return response; +} + + + + +//end mati \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/midtanksetparams.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/midtanksetparams.cs index 352666c85..d3aa81e83 100644 --- a/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/midtanksetparams.cs +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/MidTank/midtanksetparams.cs @@ -13,13 +13,50 @@ using Tango.PMR.EmbeddedParameters; public void OnExecute(StubManager stubManager) { + uint midtankno = 0; + double Slop; + double Zero_Point; + +MidTankDataSetupRequest midTankDataSetupRequest = new MidTankDataSetupRequest(); + var response = stubManager.ShowResponseWindow("Enter Midtank number to calibrate (1-8):", ""); + //stubManager.WriteLine(response); + stubManager.Write("\n"); + midtankno = uint.Parse(response); -MidTankDataSetupRequest midTankDataSetupRequest = new MidTankDataSetupRequest(); + var response1 = stubManager.ShowResponseWindow("Enter Midtank Slop ", ""); + //stubManager.WriteLine(response); + stubManager.Write("\n"); + Slop = double.Parse(response1); + + var response2= stubManager.ShowResponseWindow("Enter Zero point (100cc)", ""); + //stubManager.WriteLine(response); + stubManager.Write("\n"); + Zero_Point = double.Parse(response2); + + DialogResult result = MessageBox.Show("Are you sure to calibrate Midtank No: "+ midtankno + "with Slop "+ Slop +" and Zero_Point " + Zero_Point , "Warning",MessageBoxButtons.YesNo); + if(result == DialogResult.Yes) + { + MidTankData midTankData = new MidTankData(); + midTankData.MidTankId = midtankno-1; + midTankData.InitialOffsetA = Zero_Point; + midTankData.SlopeB = Slop; + midTankDataSetupRequest.MidTankInfo.Add(midTankData); + var response3 = stubManager.Run(midTankDataSetupRequest); + string box_msg ="Turn Power Off and On to finish the calibration."; + MessageBox.Show(box_msg); + + } + +} + + + +//MidTankDataSetupRequest midTankDataSetupRequest = new MidTankDataSetupRequest(); //50cc [V] 1.93242734375 1.94375546875 1.9295953125 1.935259375 1.92109921875 2.8245171875 1.92676328125 1.92676328125 //b [mL/V] -1 -1 -1 -1 -1 0.885922630082808 -1 -1 - +/* MidTankData midTankData = new MidTankData(); midTankData.MidTankId = 0; midTankData.InitialOffsetA = 2.64273428916931; @@ -76,9 +113,39 @@ midTankDataSetupRequest.MidTankInfo.Add(midTankData7); var response = stubManager.Run(midTankDataSetupRequest); - - - + */ +//} + +/* + int insert_slop_t_eeprom() +{ + stubManager.Write("\n "); + + MidTankDataSetupRequest midTankDataSetupRequest = new MidTankDataSetupRequest(); + + + for (uint i=1;i<9;i++) + { + if (voltage_array[i,4]!= ERROR_SLOP) + { + MidTankData midTankData = new MidTankData(); + midTankData.MidTankId = i-1; + midTankData.InitialOffsetA = voltage_array[i,2]; + midTankData.SlopeB = voltage_array[i,4]; + + stubManager.Write("\nMidtank No:" + i+ "=\tA="+voltage_array[i,2]+"\tSlop="+voltage_array[i,4]); + + + midTankDataSetupRequest.MidTankInfo.Add(midTankData); -} \ No newline at end of file + } +var response = stubManager.Run(midTankDataSetupRequest); + + + + } +} + +*/ + diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/New_DyeHead/Test_Actuator.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/New_DyeHead/Test_Actuator.cs new file mode 100644 index 000000000..f9555a05b --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/New_DyeHead/Test_Actuator.cs @@ -0,0 +1,42 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +public void OnExecute(StubManager stubManager) +{ + int sleep_up=2000;//2 second + int sleep_dn=2000;//2 second + var response = stubManager.ShowResponseWindow("Enter Loop Number for Actuator.", ""); + //stubManager.WriteLine(response); + int Loop_Nm = int.Parse(response); + + for (int i=0;i("ProgressRequest" ,0xfead, 0xcaf000); //mov ACTUATOR-IN down + Thread.Sleep(sleep_dn); + stubManager.Run("ProgressRequest" ,0xfead, 0xcaf101); //mov ACTUATOR-OUT up + Thread.Sleep(sleep_dn); + stubManager.Run("ProgressRequest" ,0xfead, 0xcaf001); //mov ACTUATOR-IN up + Thread.Sleep(sleep_up); + stubManager.Run("ProgressRequest" ,0xfead, 0xcaf100); //mov ACTUATOR-OUT down + Thread.Sleep(sleep_up); + + } + // stubManager.Run("ProgressRequest" ,0xfead, 0xcaf100); //mov ACTUATOR-OUTdown + // stubManager.Run("ProgressRequest" ,0xfead, 0xcaf101); //mov ACTUATOR-OUT up + + + + + +} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/New_DyeHead/Test_Lid.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/New_DyeHead/Test_Lid.cs new file mode 100644 index 000000000..110a0f09b --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/New_DyeHead/Test_Lid.cs @@ -0,0 +1,145 @@ +using System; +using System.Text; +using System.IO; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +const int New_DyeHead_UNDER_TEST=48; + +const Int32 MGNET_OPEN=0x42F801; +const Int32 MGNET_EN=0x42F701; +const Int32 MGNET_CLOSE=0x42F800; +const Int32 MGNET_DIS=0x42F700; + +const Int32 LS_FRONT=0X460110; +const Int32 LS_REAR=0X460120; +const Int32 LS_UPPER=0X460140; +const Int32 LS_SPARE=0X460180; + +const Int32 DyeingHeadLid_Motor = 2; + +//-------------------------------------------------------------------------------- + +public void OnExecute(StubManager stubManager) +{ + var response = stubManager.ShowResponseWindow("Enter Loop Number for Dye Head Lead.", ""); + //stubManager.WriteLine(response); + int Loop_Nm = int.Parse(response); + + for (int i=0;i("ProgressRequest" ,0x0EAD,MGNET_OPEN); // turn magnet on + Thread.Sleep(100); + + stubManager.Run("ProgressRequest" ,0x0EAD,MGNET_EN); // magnet enable + Thread.Sleep(100); + + Thread.Sleep(1000); +//---------------------- chekc Magnet is open ---------------------------- +// DialogResult result = MessageBox.Show("Make shure, Magnet is open and DyeHead cover on front.", "Warning",MessageBoxButtons.YesNo); +// if(result == DialogResult.No) +// { +// stubManager.Write("Magnet is close\n"); +// return 0; +// } + temp=read_pio (LS_UPPER); // read LS_UPPER + if (temp != 0) + { + stubManager.Write("LS_UPPER of Magnet is close\n"); + return 1; + } + stubManager.Write("Magnet is Open\n"); + + +//---------------------- Move DyeingHead Lid Motor rear---------------------------- + stubManager.Run("StubMotorRunRequest" ,DyeingHeadLid_Motor, true, 250); + stubManager.Write("*** Open Lid Head ********* \n"); + + temp = 0; + i=0; + while ((temp == 0x0)&& (i<200) ) //wait until Limit Switch or timeout 200*50msec=10sec + { + temp=read_pio (LS_REAR); // read LS_REAR + Thread.Sleep(50); + + i++; + } + + stubManager.Run("StubMotorStopRequest" ,DyeingHeadLid_Motor,3); //stop motor + if(i==200) + { + stubManager.Write("LS_REAR Not calibrate\n"); + return 1; + } + +//---------------------- Move DyeingHead Lid Motor front---------------------------- + stubManager.Write("*** Close Lid Head \n"); + stubManager.Run("StubMotorRunRequest" ,DyeingHeadLid_Motor, false, 250); + temp = 0; + i=0; + while ((temp == 0x0)&& (i<200) ) //wait until Limit Switch or timeout 200*50msec=10sec + { + temp=read_pio (LS_FRONT); // read LS_FRONT + Thread.Sleep(50); + i++; + } + stubManager.Run("StubMotorStopRequest" ,DyeingHeadLid_Motor,3); //stop motor + if(i==200) + { + stubManager.Write("LS_FRONT Not calibrate\n"); + return 1; + } +//---------------------- Close Magnet ---------------------------- + stubManager.Run("ProgressRequest" ,0x0EAD,MGNET_CLOSE); // turn magnet off + Thread.Sleep(2000); + stubManager.Run("ProgressRequest" ,0x0EAD,MGNET_DIS); // magnet Disable + + stubManager.Write("Magnet is Close\n"); + Thread.Sleep(1000); + + temp=read_pio (LS_UPPER); // read LS_UPPER + if (temp == 0) + { + stubManager.Write("LS_UPPER of Magnet is open\n"); + return 1; + } + stubManager.Write("LS_UPPER of Magnet is close\n"); + return 0; + } + +Int32 read_pio(Int32 i2c_input) +{ + Int32 temp=0; + var response = stubManager.Run("ProgressRequest" ,0x0EAD,i2c_input); // read break + + temp = (Int32) (response.Progress); + temp =temp & (i2c_input& 0xff); //if break ok + + return temp; +} +//end mati diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/PowerStep01/Get_PowerStep01_Parameters.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/PowerStep01/Get_PowerStep01_Parameters.cs new file mode 100644 index 000000000..ebe0dbf0f --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/PowerStep01/Get_PowerStep01_Parameters.cs @@ -0,0 +1,227 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +//unmark Auto logging ! + +const Int32 x_POWERSTEP01_CONFIG = 0x1A; +const Int32 x_POWERSTEP01_STATUS = 0x1B; +const Int32 x_POWERSTEP01_GATECFG1 = 0x18; +const Int32 x_POWERSTEP01_GATECFG2 = 0x19; + +const Int32 x_ABS_POS = 0x01; +const Int32 x_EL_POS = 0x02; +const Int32 x_MARK = 0x03; +const Int32 x_SPEED = 0x04; +const Int32 x_ACC = 0x05; +const Int32 x_DEC = 0x06; +const Int32 x_MAX_SPEED = 0x07; +const Int32 x_MIN_SPEED = 0x08; +const Int32 x_FS_SPD = 0x15; +const Int32 x_KVAL_HOLD = 0x09; +const Int32 x_KVAL_RUN = 0x0A; +const Int32 x_KVAL_ACC = 0x0B; +const Int32 x_KVAL_DEC = 0x0C; +const Int32 x_INT_SPD = 0x0D; +const Int32 x_ST_SLP = 0x0E; +const Int32 x_FN_SLP_ACC = 0x0F; +const Int32 x_FN_SLP_DEC = 0x10; +const Int32 x_K_THERM = 0x11; +const Int32 x_ADC_OUT = 0x12; +const Int32 x_OCD_TH = 0x13; +const Int32 x_STALL_TH = 0x14; +const Int32 x_STEP_MODE = 0x16; +const Int32 x_ALARM_EN = 0x17; +const Int32 x_CONFIG = 0x18; +const Int32 x_STATUS = 0x19; +//------------------------------- +const Int32 x_GET_PARAM = 0x20; +//------------------------------- +const Int32 Max_Motor_ID = 25; + +string[] Motor_ID = new string[30]; + + +Motor_ID[0] ="DH_CLEANHEAD "; +Motor_ID[1] ="DH_CLEANMECH "; +Motor_ID[2] ="DH_LID "; +Motor_ID[3] ="DRYER_DRIVING"; +Motor_ID[4] ="DRYER_LID "; +Motor_ID[5] ="DRYER_LOADARM"; +Motor_ID[6] ="DISPENCER_1 "; +Motor_ID[7] ="DISPENCER_2 "; +Motor_ID[8] ="DISPENCER_3 "; +Motor_ID[9] ="DISPENCER_4 "; +Motor_ID[10]="DISPENCER_5 "; +Motor_ID[11]="DISPENCER_6 "; +Motor_ID[12]="DISPENCER_7 "; +Motor_ID[13]="DISPENCER_8 "; +Motor_ID[14]="SCREW "; +Motor_ID[15]="WINDER "; +Motor_ID[16]="LDANCER1 "; +Motor_ID[17]="LDANCER2 "; +Motor_ID[18]="LDRIVING "; +Motor_ID[19]="LLODING "; +Motor_ID[20]="LPIVOT "; +Motor_ID[21]="RDANCER "; +Motor_ID[22]="RDRIVING "; +Motor_ID[23]="RLOADARM "; +Motor_ID[24]="RLODING "; +Motor_ID[25]="SPARE1_1 "; +Motor_ID[26]="SPARE1_2 "; +Motor_ID[27]="SPARE2_1 "; +Motor_ID[28]="SPARE2_2 "; +Motor_ID[29]="SPARE3 "; + +public void OnExecute(StubManager stubManager) +{ + + var i = stubManager.ShowResponseWindow("Please Enter Motor ID:"); + + stubManager.Write("Motor_ID:\t\t "); + stubManager.Write(i); + stubManager.Write("\n"); + + stubManager.Write("ABS_POS:\t\t"); + var response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_ABS_POS)<<24, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("EL_POS:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_EL_POS)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("MARK:\t\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_MARK)<<24, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("SPEED:\t\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_SPEED)<<24, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("ACC:\t\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_ACC)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("DEC:\t\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_DEC)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("MAX_SPEED:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_MAX_SPEED)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("MIN_SPEED:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_MIN_SPEED)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("FS_SPD:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_FS_SPD)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("KVAL\\TVAL_HOLD:\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_KVAL_HOLD)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("KVAL\\TVAL_RUN:\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_KVAL_RUN)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("KVAL\\TVAL_ACC:\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_KVAL_ACC)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("KVAL\\TVAL_DEC:\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_KVAL_DEC)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("INT_SPEED:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_INT_SPD)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("ST_SLP\\T_FAST:\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_ST_SLP)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("FN_SLP_ACC\\TON_MIN:\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_FN_SLP_ACC)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("FN_SLP_DEC\\TOFF_MIN:"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_FN_SLP_DEC)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("K_THERM:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_K_THERM)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("ADC_OUT:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_ADC_OUT)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("OCD_TH:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_OCD_TH)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("STALL_TH:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_STALL_TH)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("STEP_MODE:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_STEP_MODE)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("ALARM_EN:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_ALARM_EN)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("GATECFG1:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_POWERSTEP01_GATECFG1)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("GATECFG2:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_POWERSTEP01_GATECFG2)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("CONFIG:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_POWERSTEP01_CONFIG)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("STATUS:\t\t"); + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_POWERSTEP01_STATUS)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); +} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/PowerStep01/Motor_GMotor_Get_Param_Powerstep01_rev3.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/PowerStep01/Motor_GMotor_Get_Param_Powerstep01_rev3.cs new file mode 100644 index 000000000..384c079fa --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/PowerStep01/Motor_GMotor_Get_Param_Powerstep01_rev3.cs @@ -0,0 +1,237 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +//unmark Auto logging ! + +//General Configuration +const Int32 x_ABS_POS = 0x01; +const Int32 x_EL_POS = 0x02; +const Int32 x_MARK = 0x03; +const Int32 x_SPEED = 0x04; +const Int32 x_ACC = 0x05; +const Int32 x_DEC = 0x06; +const Int32 x_MAX_SPEED = 0x07; +const Int32 x_MIN_SPEED = 0x08; +//VOLTAGE / CURRENT +const Int32 x_KTVAL_HOLD = 0x09; +const Int32 x_KTVAL_RUN = 0x0A; +const Int32 x_KTVAL_ACC = 0x0B; +const Int32 x_KTVAL_DEC = 0x0C; +const Int32 x_INT_SPD = 0x0D;//voltage +const Int32 x_ST_SLP_T_FAST = 0x0E; +const Int32 x_FN_SLP_ACC_TON_MIN = 0x0F; +const Int32 x_FN_SLP_DEC_TOFF_MIN = 0x10; +const Int32 x_K_THERM = 0x11;//VOLTAGE +const Int32 x_ADC_OUT = 0x12; +const Int32 x_OCD_TH = 0x13; +const Int32 x_STALL_TH = 0x14;//VOLTAGE +const Int32 x_FS_SPD = 0x15; +const Int32 x_STEP_MODE = 0x16; +const Int32 x_ALARM_EN = 0x17; +const Int32 x_POWERSTEP01_GATECFG1 = 0x18; +const Int32 x_POWERSTEP01_GATECFG2 = 0x19; +const Int32 x_POWERSTEP01_CONFIG = 0x1A; +const Int32 x_POWERSTEP01_STATUS = 0x1B; +//VOLTAGE / CURRENT + +//------------------------------- +const Int32 x_GET_PARAM = 0x20; +//------------------------------- +Int32 Start_index = 0; // start from motor + +const Int32 Max_Motor_ID = 25; + +string[] Motor_ID = new string[30]; + + +Motor_ID[0] ="DH_CLEANHEAD "; +Motor_ID[1] ="DH_CLEANMECH "; +Motor_ID[2] ="DH_LID "; +Motor_ID[3] ="DRYER_DRIVING"; +Motor_ID[4] ="DRYER_LID "; +Motor_ID[5] ="DRYER_LOADARM"; +Motor_ID[6] ="DISPENCER_1 "; +Motor_ID[7] ="DISPENCER_2 "; +Motor_ID[8] ="DISPENCER_3 "; +Motor_ID[9] ="DISPENCER_4 "; +Motor_ID[10]="DISPENCER_5 "; +Motor_ID[11]="DISPENCER_6 "; +Motor_ID[12]="DISPENCER_7 "; +Motor_ID[13]="DISPENCER_8 "; +Motor_ID[14]="SCREW "; +Motor_ID[15]="WINDER "; +Motor_ID[16]="LDANCER1 "; +Motor_ID[17]="LDANCER2 "; +Motor_ID[18]="LDRIVING "; +Motor_ID[19]="LLODING "; +Motor_ID[20]="LPIVOT "; +Motor_ID[21]="RDANCER "; +Motor_ID[22]="RDRIVING "; +Motor_ID[23]="RLOADARM "; +Motor_ID[24]="RLODING "; +Motor_ID[25]="SPARE1_1 "; +Motor_ID[26]="SPARE1_2 "; +Motor_ID[27]="SPARE2_1 "; +Motor_ID[28]="SPARE2_2 "; +Motor_ID[29]="SPARE3 "; + + + + +public void OnExecute(StubManager stubManager) +{ + Int32 i = 0; + + Int32 motname = 0; +//stubManager.Run("StubFpgaWriteRegRequest" ,0x60000380 , 0x06b9); //7ff mati +//stubManager.Run("StubFpgaWriteRegRequest" ,0x60000390 , 0x003f); +//stubManager.Run("StubFpgaWriteRegRequest" ,0x60000550 , 0x0003); //ff mati +//stubManager.Run("StubFpgaWriteRegRequest" ,0x60000b80 , 0x001f); + + +// stubManager.Write("\n\n"); + stubManager.Write("MoTor\tABS_POS\tEL_POS\tMARK\tSPEED\tACC\tDEC\tMAX_SPEED\tMIN_SPEED\tKTVAL_HOLD\tKTVAL_RUN\tTKVAL_ACC\tTKVAL_DEC\tINT_SPD\tT_FAST\t TON_MIN\tTOFF_MIN\tK_THERM\tADC_OUT\tOCD_TH\tSTALL_TH\tFS_SPD\tSTEP_MODE\tALARM_EN\tGATECFG1\tGATECFG2\tCONFIG\tSTATUS\n"); +// stubManager.Write("------\t\t\t--------\t--------\t----------\t---\t\t---\t\t----------\t---------\t---------\t---------\t------\t\t--------\t------\n"); + + + + for (i = Start_index; i < Max_Motor_ID; i++) + { + +// if((i%8 ==0) ) +// { +// } + //stubManager.Write(i); + + stubManager.Write(Motor_ID[i]); + stubManager.Write("\t\t"); + + var response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_ABS_POS)<<24, 0, 0); + stubManager.WriteHex(response.RecivedData,6); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_EL_POS)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_MARK)<<24, 0, 0); + stubManager.WriteHex(response.RecivedData,6); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_SPEED)<<24, 0, 0); + stubManager.WriteHex(response.RecivedData,6); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_ACC)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_DEC)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_MAX_SPEED)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_MIN_SPEED)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_KTVAL_HOLD)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_KTVAL_RUN)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_KTVAL_ACC)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_KTVAL_DEC)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_INT_SPD)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_ST_SLP_T_FAST)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_FN_SLP_ACC_TON_MIN)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_FN_SLP_DEC_TOFF_MIN)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_K_THERM)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_ADC_OUT)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_OCD_TH)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_STALL_TH)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_FS_SPD)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_STEP_MODE)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_ALARM_EN)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_POWERSTEP01_GATECFG1)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_POWERSTEP01_GATECFG2)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_POWERSTEP01_CONFIG)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\t"); + + response = stubManager.Run("StubMotorRequest" ,i, (x_GET_PARAM | x_POWERSTEP01_STATUS)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + + + + } + + +} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/Assemblies/WHS/fan1-4.cs b/Software/Stubs Collection/stubs/Scripts/Assemblies/WHS/fan1-4.cs index 6e7617cc0..69f8e4d13 100644 --- a/Software/Stubs Collection/stubs/Scripts/Assemblies/WHS/fan1-4.cs +++ b/Software/Stubs Collection/stubs/Scripts/Assemblies/WHS/fan1-4.cs @@ -12,7 +12,7 @@ using Tango.Stubs; public void OnExecute(StubManager stubManager) { - int x=80; + int x=0; // var response1 = stubManager.ShowResponseWindow("Please Enter fan value from 0 to 255:"); // int x = Int32.Parse(response1); @@ -23,6 +23,7 @@ public void OnExecute(StubManager stubManager) stubManager.Run("ProgressRequest" ,0xffac4, x); //whs fan3 full stubManager.Run("ProgressRequest" ,0xffac5, x); //whs fan4 full + var response = stubManager.Run("ProgressRequest" ,0x3ea, 6); //whs fan4 full } \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/Head_Type_Indification_2.cs b/Software/Stubs Collection/stubs/Scripts/Head_Type_Indification_2.cs new file mode 100644 index 000000000..a5f28a01d --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Head_Type_Indification_2.cs @@ -0,0 +1,25 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +public void OnExecute(StubManager stubManager) +{ + + var response = stubManager.Run("ProgressRequest" ,0xFEAD, 0); + + /* Response: + HEAD_TYPE_UNKNOWN // 0 + HEAD_TYPE_FLAT_WITHOUT_CARD// 1 + HEAD_TYPE_UNKNOWN_WITH_CARD// 2 + HEAD_TYPE_FLAT// 3 + HEAD_TYPE_ARC// 4 + */ +} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/Jig_Tester/JIG_TESTER.cs b/Software/Stubs Collection/stubs/Scripts/Jig_Tester/JIG_TESTER.cs index 7841b09eb..a90acd902 100644 --- a/Software/Stubs Collection/stubs/Scripts/Jig_Tester/JIG_TESTER.cs +++ b/Software/Stubs Collection/stubs/Scripts/Jig_Tester/JIG_TESTER.cs @@ -28,6 +28,7 @@ System.Timers.Timer timer; string [,] Units_status = new string[50,2]; +string File_Name2; string File_Name1 ; string Status; @@ -36,7 +37,7 @@ const int Winder =0 ; const int LTFU =1 ; string path; -string path1="C:\\Jig_Log\\"; +string path1="C:\\Jig_Log\\";; bool BlinkOn = false; bool timer_started = false; @@ -47,6 +48,10 @@ int UNIT_UNDER_TEST ; public void OnExecute(StubManager stubManager) { + string u =System.Environment.UserName; + + + Label Run_text = new Label () { Width = 110, @@ -219,7 +224,7 @@ public void OnExecute(StubManager stubManager) Height = 20, Text =" S/N" }; - SN_lbl.Location = new Point (30, 10); + SN_lbl.Location = new Point (40, 10); form1.Controls.Add(SN_lbl); TextBox SN_TexstBox = new TextBox () { @@ -229,6 +234,27 @@ public void OnExecute(StubManager stubManager) }; SN_TexstBox.Location = new Point (40, 40); form1.Controls.Add(SN_TexstBox); + //-----Create Lable to Part Number ----------- + + Label PN_lbl = new Label () + { + Width = 150, + Height = 20, + Text =" P/N" + }; + PN_lbl.Location = new Point (190, 10); + form1.Controls.Add(PN_lbl); + + TextBox PN_TexstBox = new TextBox () + { + Width = 150, + Height = 20, + Text ="" + }; + PN_TexstBox.Location = new Point (190, 40); + PN_TexstBox.CharacterCasing = CharacterCasing.Upper; + + form1.Controls.Add(PN_TexstBox); //----------Create Lable to LOCATION---------- Label Location_lbl = new Label () { @@ -236,7 +262,7 @@ public void OnExecute(StubManager stubManager) Height = 20, Text ="LOCATION" }; - Location_lbl.Location = new Point (300, 10); + Location_lbl.Location = new Point (440, 10); form1.Controls.Add(Location_lbl); TextBox Location_TexstBox = new TextBox () @@ -245,7 +271,7 @@ public void OnExecute(StubManager stubManager) Height = 20, Text =Location_str }; - Location_TexstBox.Location = new Point (300, 40); + Location_TexstBox.Location = new Point (440, 40); form1.Controls.Add(Location_TexstBox); Run_text.Location = new System.Drawing.Point(300, 100); @@ -253,6 +279,25 @@ public void OnExecute(StubManager stubManager) Run_text.Name = "blink_Text"; Run_text.Font = new Font("Areal", 16, System.Drawing.FontStyle.Bold); form1.Controls.Add(Run_text); +//-------------------------------------------------------------------------------- + Button Open_Log_btm = new Button() + { + Width = 100, + Height = 40, + }; + Open_Log_btm.Text = "Open Log File"; + Open_Log_btm.BackColor = System.Drawing.Color.Red; + Open_Log_btm.Location = new System.Drawing.Point(300, 286); + Open_Log_btm.Enabled= false; + form1.Controls.Add(Open_Log_btm); + + + Open_Log_btm.Click += (_, __) => + { + System.Diagnostics.Process.Start(File_Name2 ); + }; + + //-------------------------------------------------------------------------------- Button Stop_btm = new Button() { @@ -263,6 +308,10 @@ public void OnExecute(StubManager stubManager) Stop_btm.BackColor = System.Drawing.Color.Red; Stop_btm.Location = new System.Drawing.Point(4, 286); Stop_btm.Enabled= false; + + + + Stop_btm.Click += (_, __) => { timer.Stop(); @@ -273,7 +322,7 @@ public void OnExecute(StubManager stubManager) }; form1.Controls.Add(Stop_btm); - + disable_test(); void disable_test() { Winder_btm.Enabled = false; @@ -286,23 +335,23 @@ public void OnExecute(StubManager stubManager) Mixer_btm.Enabled= false; NewMixer_btm.Enabled= false; NewDyeHead_btm.Enabled= false; - Stop_btm.Enabled= true; - } - - void enable_test() - { - Winder_btm.Enabled = true; - LTFU_btm.Enabled = true; - RTFU_btm.Enabled = true; - Dryer_btm.Enabled = true; - MidTank_btm.Enabled= true; - DyeHead_btm.Enabled= true; - WHS_btm.Enabled= true; - Mixer_btm.Enabled= true; - NewMixer_btm.Enabled= true; - NewDyeHead_btm.Enabled= true; Stop_btm.Enabled= false; } + +// void enable_test() +// { +// Winder_btm.Enabled = true; +// LTFU_btm.Enabled = true; +// RTFU_btm.Enabled = true; +// Dryer_btm.Enabled = true; +// MidTank_btm.Enabled= true; +// DyeHead_btm.Enabled= true; +// WHS_btm.Enabled= true; +// Mixer_btm.Enabled= true; +// NewMixer_btm.Enabled= true; +// NewDyeHead_btm.Enabled= true; +// Stop_btm.Enabled= false; +// } void Timer_en() { if (timer_started == false) @@ -320,9 +369,11 @@ public void OnExecute(StubManager stubManager) } } void end_test() - { enable_test(); + { disable_test(); + //enable_test(); + Timer_dis(); - + Open_Log_btm.Enabled= true; Run_text.Text = Status; if (Status=="Pass") { @@ -337,22 +388,126 @@ public void OnExecute(StubManager stubManager) } } +PN_TexstBox.TextChanged += (_,__)=> + + { + string temp; + + if (SN_TexstBox.Text.Length!=15) + { + disable_test(); + return; + } + + if (PN_TexstBox.Text.Contains("-")) + + { + temp=PN_TexstBox.Text.Substring(0, PN_TexstBox.Text.IndexOf("-")); + switch (temp) + { + case "AM00315": //DyeHead + NewDyeHead_btm.Enabled= true; + break; + case "AM00103": //Winder + Winder_btm.Enabled = true; + break; + case "AM00087": //MidTank + MidTank_btm.Enabled = true; + break; + case "AM00031": //LTFU + LTFU_btm.Enabled = true; + break; + case "AM00007": //Dryer + Dryer_btm.Enabled = true; + break; + case "AM00030": //RTFU + RTFU_btm.Enabled = true; + break; + case "AM00281": //New Mixer + NewMixer_btm.Enabled= true; + break; + // case "AM00281": // Mixer + // Mixer_btm.Enabled= true; + // break; + default: + disable_test(); + break; + } + } + else + disable_test(); + + + }; + SN_TexstBox.TextChanged += (_,__)=> + + { + string temp; + if (SN_TexstBox.Text.Length!=15) + { + disable_test(); + return; + } + if (PN_TexstBox.Text.Contains("-")) + { + + temp=PN_TexstBox.Text.Substring(0, PN_TexstBox.Text.IndexOf("-")); + + switch (temp) + { + case "AM00315": //DyeHead + NewDyeHead_btm.Enabled= true; + break; + case "AM00103": //Winder + Winder_btm.Enabled = true; + break; + case "AM00087": //MidTank + MidTank_btm.Enabled = true; + break; + case "AM00031": //LTFU + LTFU_btm.Enabled = true; + break; + case "AM00007": //Dryer + Dryer_btm.Enabled = true; + break; + case "AM00030": //RTFU + RTFU_btm.Enabled = true; + break; + case "AM00286": //New Mixer + NewMixer_btm.Enabled= true; + break; + default: + disable_test(); + break; +// case "AM00281": // Mixer +// Mixer_btm.Enabled= true; +// break; + } + } + else + disable_test(); + }; //----------------------------------------- Winder_btm.Click += async(_,__) => { + Open_Log_btm.Enabled= false; Run_text.Text = "Run"; stubManager.WriteLine("DUT- Winder "); - path="C:\\Users\\lp4\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\Winder\\" ; +// path="C:\\Users\\" + u + "\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\Winder\\" ; + path="C:\\Users\\" + u + "\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\Winder\\" ; + Timer_en(); _cancellationTokenSource = new CancellationTokenSource(); try { - disable_test(); + // disable_test(); + Winder_btm.Enabled = false; + Stop_btm.Enabled= true; var longRunningTask = await Winder_test(setLabel1TextSafe, _cancellationTokenSource.Token, SN_TexstBox.Text ,Location_TexstBox.Text ); } catch (OperationCanceledException) { - enable_test(); + disable_test(); Status="Cancel"; stubManager.Run("StubMotorStopRequest" ,WINDER_Motor,3); //stop motor stubManager.Run("StubMotorStopRequest" ,SCREW,3); //stop motor @@ -368,23 +523,27 @@ public void OnExecute(StubManager stubManager) //----------------------------------------- LTFU_btm.Click += async(_,__) => { + Open_Log_btm.Enabled= false; Run_text.Text = "Run"; stubManager.WriteLine("DUT- LTFU "); - path="C:\\Users\\lp4\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\LTFU\\" ; + path="C:\\Users\\" + u + "\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\LTFU\\" ; Timer_en(); _cancellationTokenSource = new CancellationTokenSource(); try { - disable_test(); +// disable_test(); + LTFU_btm.Enabled = false; + Stop_btm.Enabled= true; var longRunningTask = await LTFU_test(setLabel1TextSafe, _cancellationTokenSource.Token, SN_TexstBox.Text ,Location_TexstBox.Text ); } catch (OperationCanceledException) { - enable_test(); + disable_test(); Status="Cancel"; stubManager.Run("StubMotorStopRequest" ,LLOADING_Motor, 3); //hold LRoading high z stubManager.Run("StubMotorStopRequest" ,LDANCER1_Motor, 3); //hold Lloading high z + stubManager.Run("StubMotorStopRequest" ,LDANCER2_Motor, 3); //hold Lloading high z stubManager.Run("StubMotorStopRequest" ,LDRIVING_Motor,3); //stop motor Thread.Sleep(100); @@ -402,21 +561,24 @@ public void OnExecute(StubManager stubManager) //----------------------------------------- Dryer_btm.Click += async(_,__) => { + Open_Log_btm.Enabled= false; Run_text.Text = "Run"; stubManager.WriteLine("DUT- Dryer "); - path="C:\\Users\\lp4\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\Dryer\\" ; + path="C:\\Users\\" + u + "\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\Dryer\\" ; Timer_en(); _cancellationTokenSource = new CancellationTokenSource(); try { - disable_test(); - var longRunningTask = await Dryer_test(setLabel1TextSafe, _cancellationTokenSource.Token, SN_TexstBox.Text ,Location_TexstBox.Text ); +// disable_test(); + Dryer_btm.Enabled = false; + Stop_btm.Enabled= true; + var longRunningTask = await Dryer_test(setLabel1TextSafe, _cancellationTokenSource.Token, SN_TexstBox.Text ,Location_TexstBox.Text ); } catch (OperationCanceledException) { - enable_test(); + disable_test(); Status="Cancel"; stubManager.Run("StubMotorStopRequest" ,DryerLid_Motor, 2); //Hard stop hiZ motor stubManager.Run("StubMotorStopRequest" ,DryerMain_Motor,3); //stop motor @@ -436,20 +598,23 @@ public void OnExecute(StubManager stubManager) //----------------------------------------- DyeHead_btm.Click += async(_,__) => { + Open_Log_btm.Enabled= false; Run_text.Text = "Run"; stubManager.WriteLine("DUT- DyeHead "); - path="C:\\Users\\lp4\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\DyeHead\\" ; + path="C:\\Users\\" + u + "\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\DyeHead\\" ; Timer_en(); _cancellationTokenSource = new CancellationTokenSource(); try { - disable_test(); - var longRunningTask = await DyeHead_test(setLabel1TextSafe, _cancellationTokenSource.Token, SN_TexstBox.Text ,Location_TexstBox.Text ); +// disable_test(); + DyeHead_btm.Enabled= false; + Stop_btm.Enabled= true; + var longRunningTask = await DyeHead_test(setLabel1TextSafe, _cancellationTokenSource.Token, SN_TexstBox.Text ,Location_TexstBox.Text ); } catch (OperationCanceledException) { - enable_test(); + disable_test(); Status="Cancel"; stubManager.Run("StubMotorStopRequest" ,MAGNET_Driver,3); //stop magnet stubManager.Run("StubMotorStopRequest" ,DyeingHeadLid_Motor,3); //stop motor @@ -472,28 +637,29 @@ public void OnExecute(StubManager stubManager) //----------------------------------------- NewDyeHead_btm.Click += async(_,__) => { + Open_Log_btm.Enabled= false; Run_text.Text = "Run"; stubManager.WriteLine("DUT- New DyeHead "); -// path="C:\\Users\\lp4\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\NewDyeHead\\" ; - path="C:\\Users\\lp4\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\DyeHead\\" ; + path="C:\\Users\\" + u + "\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\NewDyeHead\\" ; Timer_en(); _cancellationTokenSource = new CancellationTokenSource(); try { - disable_test(); -//mf var longRunningTask = await NewDyeHead_test(setLabel1TextSafe, _cancellationTokenSource.Token, SN_TexstBox.Text ,Location_TexstBox.Text ); +// disable_test(); + NewDyeHead_btm.Enabled= false; + Stop_btm.Enabled= true; + var longRunningTask = await NewDyeHead_test(setLabel1TextSafe, _cancellationTokenSource.Token, SN_TexstBox.Text ,Location_TexstBox.Text ); } catch (OperationCanceledException) { - enable_test(); + disable_test(); Status="Cancel"; stubManager.Run("StubMotorStopRequest" ,MAGNET_Driver,3); //stop magnet stubManager.Run("StubMotorStopRequest" ,DyeingHeadLid_Motor,3); //stop motor for (Int32 i = 0; i < 12; i++) //???MF { - stubManager.Run("ProgressRequest" ,0x0EAD,0x40F000 + i*0x100); // turn all heaters OFF Thread.Sleep(10); } @@ -509,19 +675,22 @@ public void OnExecute(StubManager stubManager) //----------------------------------------- RTFU_btm.Click += async(_,__) => { + Open_Log_btm.Enabled= false; Run_text.Text = "Run"; stubManager.WriteLine("DUT- RTFU "); - path="C:\\Users\\lp4\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\RTFU\\" ; + path="C:\\Users\\" + u + "\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\RTFU\\" ; Timer_en(); _cancellationTokenSource = new CancellationTokenSource(); try { - disable_test(); +// disable_test(); + RTFU_btm.Enabled= false; + Stop_btm.Enabled= true; var longRunningTask = await RTFU_test(setLabel1TextSafe, _cancellationTokenSource.Token, SN_TexstBox.Text ,Location_TexstBox.Text ); } catch (OperationCanceledException) { - enable_test(); + disable_test(); Status="Cancel"; stubManager.Run("StubMotorStopRequest" ,RLOADING_Motor, 3); //hold Rloading high z Thread.Sleep(100); @@ -539,19 +708,22 @@ public void OnExecute(StubManager stubManager) //----------------------------------------- MidTank_btm.Click += async(_,__) => { + Open_Log_btm.Enabled= false; Run_text.Text = "Run"; stubManager.WriteLine("DUT- MidTank "); - path="C:\\Users\\lp4\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\MidTank\\" ; + path="C:\\Users\\" + u + "\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\MidTank\\" ; Timer_en(); _cancellationTokenSource = new CancellationTokenSource(); try { - disable_test(); +// disable_test(); + MidTank_btm.Enabled= false; + Stop_btm.Enabled= true; var longRunningTask = await MidTank_test(setLabel1TextSafe, _cancellationTokenSource.Token, SN_TexstBox.Text ,Location_TexstBox.Text ); } catch (OperationCanceledException) { - enable_test(); + disable_test(); Status="Cancel"; stubManager.Run("StubFpgaWriteRegRequest" ,F3_VALVE_OUT, 0); //close all valve @@ -566,20 +738,23 @@ public void OnExecute(StubManager stubManager) //---------------------------Mixer-------------- Mixer_btm.Click += async(_,__) => { + Open_Log_btm.Enabled= false; Run_text.Text = "Run"; stubManager.WriteLine("DUT- Mixer "); - path="C:\\Users\\lp4\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\Mixer\\" ; + path="C:\\Users\\" + u + "\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\Mixer\\" ; Timer_en(); _cancellationTokenSource = new CancellationTokenSource(); try { - disable_test(); +// disable_test(); + Mixer_btm.Enabled= false; + Stop_btm.Enabled= true; var longRunningTask = await Mixer_test(setLabel1TextSafe, _cancellationTokenSource.Token, SN_TexstBox.Text ,Location_TexstBox.Text ); } catch (OperationCanceledException) { - enable_test(); + disable_test(); Status="Cancel"; SetBit (F1_gpo_01, 7, 0); //clear bit F1_VALVE_MIXCHIP_WASTECH SetBit (F2_CTRL, 7, 0); //clear bit mixer SSR @@ -594,20 +769,23 @@ public void OnExecute(StubManager stubManager) //---------------------------new Mixer-------------- NewMixer_btm.Click += async(_,__) => { + Open_Log_btm.Enabled= false; Run_text.Text = "Run"; stubManager.WriteLine("DUT- New Mixer "); - path="C:\\Users\\lp4\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\Mixer\\" ; + path="C:\\Users\\" + u + "\\Dropbox\\"+Location_TexstBox.Text +"_Bench_Tester"+"\\Mixer\\" ; Timer_en(); _cancellationTokenSource = new CancellationTokenSource(); try { - disable_test(); - var longRunningTask = await New_Mixer_test(setLabel1TextSafe, _cancellationTokenSource.Token, SN_TexstBox.Text ,Location_TexstBox.Text ); +// disable_test(); + NewMixer_btm.Enabled= false; + Stop_btm.Enabled= true; + var longRunningTask = await New_Mixer_test(setLabel1TextSafe, _cancellationTokenSource.Token, SN_TexstBox.Text ,Location_TexstBox.Text ); } catch (OperationCanceledException) { - enable_test(); + disable_test(); Status="Cancel"; // SetBit (F1_gpo_01, 7, 0); ????????????//clear bit F1_VALVE_MIXCHIP_WASTECH // SetBit (F2_CTRL, 7, 0); //????????????clear bit mixer SSR @@ -630,7 +808,6 @@ public void OnExecute(StubManager stubManager) form1.Controls.Add(_calc_text); // stubManager.WriteLine("Start dialog!"); form1.ShowDialog(); - return ; @@ -661,7 +838,7 @@ if (!Directory.Exists(path)) -string File_Name2=Environment.ExpandEnvironmentVariables(path +Stemp1+"_"+ s_n +"_"+DUT +"_"+ DateTime.Now.ToString("MM_dd_yyyy_HH_mm_ss")+".log" ); + File_Name2=Environment.ExpandEnvironmentVariables(path +Stemp1+"_"+ s_n +"_"+DUT +"_"+ DateTime.Now.ToString("MM_dd_yyyy_HH_mm_ss")+".log" ); stubManager.Write(File_Name2 +"\n"); diff --git a/Software/Stubs Collection/stubs/Scripts/Jig_Tester/Jig-TesterV 1.0.docx b/Software/Stubs Collection/stubs/Scripts/Jig_Tester/Jig-TesterV 1.0.docx new file mode 100644 index 000000000..f7aa53997 Binary files /dev/null and b/Software/Stubs Collection/stubs/Scripts/Jig_Tester/Jig-TesterV 1.0.docx differ diff --git a/Software/Stubs Collection/stubs/Scripts/Jig_Tester/Jig-TesterV 1.1.docx b/Software/Stubs Collection/stubs/Scripts/Jig_Tester/Jig-TesterV 1.1.docx new file mode 100644 index 000000000..948efd86b Binary files /dev/null and b/Software/Stubs Collection/stubs/Scripts/Jig_Tester/Jig-TesterV 1.1.docx differ diff --git a/Software/Stubs Collection/stubs/Scripts/Jig_Tester/LTFU_Jig.cs b/Software/Stubs Collection/stubs/Scripts/Jig_Tester/LTFU_Jig.cs index 3f9f2a346..ba072b955 100644 --- a/Software/Stubs Collection/stubs/Scripts/Jig_Tester/LTFU_Jig.cs +++ b/Software/Stubs Collection/stubs/Scripts/Jig_Tester/LTFU_Jig.cs @@ -52,7 +52,7 @@ public Task LTFU_test( Action settext, CancellationToken cancel Test_LLOADING_LTFU(); stubManager.Run("StubMotorStopRequest" ,LLOADING_Motor, 3); //hold LRoading high z delay(100); - Motor_SetParam(F1_MOTO_LLOADING_TX1,F1_MOTO_LLOADING_TX0,0x0a,0x14000000); //set kval ran to 0x14,0.65A +// Motor_SetParam(F1_MOTO_LLOADING_TX1,F1_MOTO_LLOADING_TX0,0x0a,0x14000000); //set kval ran to 0x14,0.65A settext("Test LDRIVING LTFU"); Test_LDRIVING_LTFU(); @@ -355,9 +355,9 @@ int Test_DANCER_LTFU() } - if (temp_right_after>temp_right_before) - temp_right_before=temp_right_before+0x4000; - temp_right_before=temp_right_before-temp_right_after; + if (temp_right_after200)) { Units_status[8,1]="Pass"; @@ -465,7 +465,7 @@ int Test_DANCER_LTFU() return 12; } Units_status[8,1]="Fail"; - stubManager.Write("LDANCER2_SSI\tFail\n"); + stubManager.Write("LDANCER_Right_SSI\tFail\n"); return 12; diff --git a/Software/Stubs Collection/stubs/Scripts/Jig_Tester/MidTank_Jig.cs b/Software/Stubs Collection/stubs/Scripts/Jig_Tester/MidTank_Jig.cs index 27e17ed93..16139df2c 100644 --- a/Software/Stubs Collection/stubs/Scripts/Jig_Tester/MidTank_Jig.cs +++ b/Software/Stubs Collection/stubs/Scripts/Jig_Tester/MidTank_Jig.cs @@ -143,9 +143,9 @@ int open_valve (int valve_nm,int valve_type,int check_valve) //valve_type=0 is if (check_valve!=0) { - temp="Air"; + temp="Air "; if (valve_type==1) - temp="Ink"; + temp="Ink "; DialogResult result = MessageBox.Show("Did " + temp + "Valve of Midtank " + valve_nm +" open?", "Warning",MessageBoxButtons.YesNo); if(result == DialogResult.No) diff --git a/Software/Stubs Collection/stubs/Scripts/Jig_Tester/RTFU_Jig.cs b/Software/Stubs Collection/stubs/Scripts/Jig_Tester/RTFU_Jig.cs index 9863a2ea1..4f47a1cd0 100644 --- a/Software/Stubs Collection/stubs/Scripts/Jig_Tester/RTFU_Jig.cs +++ b/Software/Stubs Collection/stubs/Scripts/Jig_Tester/RTFU_Jig.cs @@ -76,7 +76,7 @@ int Test_RLOADING_RTFU() int temp=1; int counter; -// Motor_SetParam(F1_MOTO_RLOADING_TX1,F1_MOTO_RLOADING_TX0,0x0a,0x40000000); //set kval ran to 0x40- 1.9A +// Motor_SetParam(F1_MOTO_RLOADING_TX1,F1_MOTO_RLOADING_TX0,0x0a,0x2c000000); //set kval ran to 0x40- 1.9A delay(100); stubManager.Run("StubMotorRunRequest" ,RLOADING_Motor, true,200); //move Rloading down delay(3000); @@ -317,7 +317,7 @@ int Test_DANCER_RTFU() stubManager.Write("temp="+temp + "\temp1="+temp1 +"\n"); - DialogResult result = MessageBox.Show("SSI Dancer led is Green(not blinking)?", "Warning",MessageBoxButtons.YesNo); + DialogResult result = MessageBox.Show("SSI Dancer led is Green(Not blinking)?", "Warning",MessageBoxButtons.YesNo); if(result == DialogResult.No) { Units_status[8,1]="Fail"; diff --git a/Software/Stubs Collection/stubs/Scripts/Main card Watchdog test.cs b/Software/Stubs Collection/stubs/Scripts/Main card Watchdog test.cs new file mode 100644 index 000000000..3db075678 --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Main card Watchdog test.cs @@ -0,0 +1,24 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +public void OnExecute(StubManager stubManager) +{ + +//"Set WFCF Value +ProgressRequest progressRequest = new ProgressRequest(); +progressRequest.Amount = 0xAD9; +progressRequest.Delay = 0; + +var response = stubManager.Run(progressRequest); + + +} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/MidTank Calibration.pproj b/Software/Stubs Collection/stubs/Scripts/MidTank Calibration.pproj new file mode 100644 index 000000000..ce80c8a70 --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/MidTank Calibration.pproj @@ -0,0 +1 @@ +{"$id":"1","Name":"MidTank Calibration","Description":null,"Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Entities;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\nusing System.IO;\r\nusing System.Windows.Forms;\r\nusing Tango.PMR.EmbeddedParameters;\r\n\r\npublic class Program\r\n{\r\nconst double\tMIN_SLOP=0.7;\r\nconst double\tMAX_SLOP=1.4;\r\nconst double\tERROR_SLOP=-1;\r\nconst double\tMIN_50cc_on_volt=2.3;\r\nconst double\tMAX_50cc_on_volt=3.2;\r\nconst double\tERROR_50cc_on_volt=-1;\r\n\r\nint [] Convert_Midtank_No = new Int32 [8] {1,3,5,7,2,4,6,8};\r\nuint [,] ADC_Add_Chnl = new uint [8,2]\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t{0x44,0x20},\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t{0x44,0x08},\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t{0x46,0x80},\r\n\t\t\t\t\t\t\t\t\t\t\t\t{0x46,0x20},\r\n\t\t\t\t\t\t\t\t\t\t\t\t{0x44,0x10},\r\n\t\t\t\t\t\t\t\t\t\t\t\t{0x44,0x04},\r\n\t\t\t\t\t\t\t\t\t\t\t\t{0x46,0x40},\r\n\t\t\t\t\t\t\t\t\t\t\t\t{0x46,0x10},\r\n\t\t\t\t\t\t\t\t\t\t};\r\n\r\n\r\nconst Int32\tF3_VALVE_OUT\t=\t0x600008E2\t;\r\nstring Machine_SN\t;\r\nprivate const string FILE_PATH = @\"C:\\MidTankLog\\\";\r\nstring File_name;\r\ndouble Full_Cartridge=1000;\t// on CC \r\ndouble \tSlop=0.92;\r\n//----------------------\r\nconst Int32 I2C_ID = 2;\r\n//const Int32 I2C_Slave_Add = 0x46; //must be 0x40, 0x44 or 0x46\r\n//----------------------\r\n\r\n\r\nprivate IProcedureContext context;\r\n\r\n\r\n\r\n\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n \r\n\r\n\tInt32 Timout ;\r\n\tInt32 Interval;\r\n\tInt32 midtankno = 0;\r\n\tdouble Full_Point=0;\t\t\t//on Voltage\r\n\tdouble resualt;\r\n\tdouble Sum=0 ;\r\n\tdouble Old_Sum=0 ;\r\n\tdouble Start_Point=0;\r\n\t\r\n\r\n\tif (!Directory.Exists(FILE_PATH))\r\n\t\t{\r\n\t\t\tDirectory.CreateDirectory(FILE_PATH);\r\n\t\t}\t\t\t\r\n\r\n\r\n\r\n var response =context.RequestUserInputFor(\"Enter Midtank S/N: \", \"\");\r\n\tcontext.Write(\"\\n\");\r\n\tMachine_SN = response;\r\n\tcontext.WriteLine(Machine_SN);\r\n\tFile_name= FILE_PATH +Machine_SN + DateTime.Now.ToString(\"MM_dd_yyyy_HH_mm_ss\")+\".csv\";\r\n\tcontext.Write(File_name);\r\n \tcontext.WriteToFile(File_name,\"MidTank S/N:,\" + Machine_SN);\r\n\t\r\n\r\n var response1 =context.RequestUserInputFor(\"Enter Midtank number to calibrate (1-8):\", \"\");\r\n context.WriteLine(response1);\r\n\tmidtankno = Int32.Parse(response1);\r\n \tcontext.AppendToFile(File_name,\"MidTank Number:\\t\" + response1);\r\n\tif (midtankno==8)\r\n\t{\r\n\t\tSlop=1;\r\n\t\tTimout=60;\t\t//60 minutes\r\n\t\tInterval=60;\t//60 second\r\n\t}\r\n\telse\r\n\t{\r\n\t\tSlop=0.92;\r\n\t\tTimout=10*2;\t\t//10 minutes\r\n\t\tInterval=30;\t//30 second\r\n\r\n\t}\r\n var response10 =context.RequestUserInputFor(\"Enter Cartridge Valume on CC (500-1500):\", \"\");\r\n context.WriteLine(response10);\r\n\tFull_Cartridge = double.Parse(response10);\r\n \tcontext.AppendToFile(File_name,\"Cartridge Valume:\\t\" + response10);\r\n \tcontext.AppendToFile(File_name,\"Slop value:\\t\" + Slop);\r\n\r\n\r\n\tDialogResult result = MessageBox.Show(\"Are you sure to calibrate Midtank No: \"+ midtankno + \" with \"+ Full_Cartridge +\" CC\" , \"Warning\",MessageBoxButtons.YesNo);\r\n\tif(result == DialogResult.Yes)\r\n\t{\r\n\r\n\r\n\r\n\t\tstring box_msg = \"Please Insert cartridge \";\r\n\r\n\t\tMessageBox.Show(box_msg);\r\n\t\t\r\n\t\topen_valve(midtankno,1,1)\t\t;\t//open Air valve\r\n\t\topen_valve(midtankno,0,1)\t\t;\t//open Ink valve\r\n\t\tInt32 i=0; \r\n\t\twhile (iOld_Sum)\r\n\t\t\t\tOld_Sum=Sum-Old_Sum;\r\n\t\t\telse\r\n\t\t\t\tOld_Sum=Old_Sum-Sum;\r\n\t\t\r\n \r\n\t\t\tif ((check_valve(midtankno,1) != 0) && (check_valve(midtankno,0) != 0))\r\n\t\t\t{\r\n\t\t\t\ti++;\r\n\t\t\t\tif ( Old_Sum <0.02)\t\r\n\t\t\t\t\ti=Timout+1;\t\t//end \r\n\t\t\t\tOld_Sum=Sum;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\topen_valve(midtankno,1,0)\t\t;\t//open Air valve\r\n\t\t\topen_valve(midtankno,0,0)\t\t;\t//open Ink valve\r\n\t\t\tOld_Sum=0;\r\n\t\t\t\r\n\t\t\t}\t\r\n\t\t}\r\n\t\tFull_Point=Sum/Interval;\r\n\t\t\r\n\r\n\t\tclose_valve(midtankno,1,1)\t\t;\t//close Air valve\r\n\t\tclose_valve(midtankno,0,1)\t\t;\t//close Ink valve\r\n\r\n\t\t\t\r\n\t\tif (insert_slop_t_eeprom(Full_Point, midtankno,Start_Point)==0)\r\n\t\t{\r\n\t\t\t\tbox_msg =\"Turn Power Off and On to finish the calibration.\";\r\n\t\t\t\tMessageBox.Show(box_msg);\r\n\r\n\r\n \tcontext.AddResult(ResultType.Passed, \"Test passed\", \"Test passed.\");\r\n\t\t\t\t\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t\tbox_msg =\"Calibration error\";\r\n\t\t\t\tMessageBox.Show(box_msg);\r\n\r\n\r\n \tcontext.AddResult(ResultType.Failed, \"Test Fail\", \"Test Fail.\");\r\n\t\t\t\t\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\r\n\r\n\tint\tinsert_slop_t_eeprom( double FullPoint,Int32 midtankno, double StartPoint)\r\n{\r\n//\tcontext.Write(\"\\n \");\r\n\r\n\t\tStartPoint=FullPoint-StartPoint;\r\n\t\tStartPoint=StartPoint/Full_Cartridge;\r\n\t\tif ((StartPoint>0.7 ) && (StartPoint>1.3 ))\r\n\t\t{\r\n\t\t\tMidTankDataSetupRequest midTankDataSetupRequest = new MidTankDataSetupRequest();\r\n\r\n\t\t\tMidTankData midTankData = new MidTankData();\r\n\t\t\tmidTankData.MidTankId = Convert.ToUInt32 (midtankno-1);\r\n\t\t\tmidTankData.InitialOffsetA =FullPoint - (Full_Cartridge/1000-0.1)/Slop;\r\n\t\t\tmidTankData.SlopeB = Slop;\r\n\t\t\t\r\n\t\t\tcontext.Write(\"\\nMidtank No:\" + midtankno + \"=\\tVoltage Zero is =\"+(FullPoint - (Full_Cartridge/1000-0.1)/Slop)+\"\\tSlop=\"+ Slop);\r\n\t\t\tcontext.AppendToFile(File_name,\"\\nMidtank No:\" + midtankno + \"=\\tVoltage Zero is =\"+(FullPoint - (Full_Cartridge/1000-0.1)/Slop)+\"\\tSlop=\"+ Slop);\r\n\r\n\t\t\t\r\n\t\t\tmidTankDataSetupRequest.MidTankInfo.Add(midTankData);\r\n\t\t\r\n\r\n\t\t\tvar response =context.Send(midTankDataSetupRequest);\r\n\r\n\t\t\treturn\t0;\r\n\t\t}\r\n\t\telse\r\n\t\t\tcontext.Write(\"\\nError\");\r\n\t\t\tcontext.AppendToFile(File_name,\"\\n Slop Error\");\r\n\t\t\treturn\t1;\r\n\t\r\n\r\n }\r\n\r\n\r\n\r\nint adc_configuration(uint I2C_Slave_Add,uint channel ) \r\n\t{\r\n\tStubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();\r\n\tstubI2CWriteBytesRequest.I2CId = I2C_ID;\r\n\tstubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add;\r\n\t\r\n\tUInt32 uInt32 = new UInt32();\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(0x00);//Byte 0 to write\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(channel);//Byte 1 to Write, must be 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02 or 0x01 for different channels\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(0x80);//Byte 2 to Write\r\n\t\r\n\tvar response =context.Send(stubI2CWriteBytesRequest);\r\n\t\r\n\treturn 1;\r\n\t}\r\n\r\n\r\nint adc_set_for_read_ch(uint I2C_Slave_Add) \r\n\t{\r\n\tStubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();\r\n\tstubI2CWriteBytesRequest.I2CId = I2C_ID;\r\n\tstubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add;\r\n\t\r\n\tUInt32 uInt32 = new UInt32();\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(0x01);//Byte 0 to write\r\n\r\n\tvar response =context.Send(stubI2CWriteBytesRequest);\r\n\t\r\n\treturn 1;\r\n\t}\r\n\r\n\r\n\r\n\r\ndouble adc_read_ch(uint I2C_Slave_Add) \r\n\t{\r\n\tStubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest();\r\n\tstubI2CReadBytesRequest.I2CId = I2C_ID;\r\n\tstubI2CReadBytesRequest.SlaveAddress = I2C_Slave_Add;\r\n\tstubI2CReadBytesRequest.NumberOfBytesToRead = 2; // Number of bytes to read\r\n\r\n\tvar response1 =context.Send(stubI2CReadBytesRequest);\r\n\tuint temph=0;\r\n\tuint templ=0;\r\n\tuint temp;\r\n\tdouble calc;\r\n\tdouble calc1;\r\n\tdouble calc2;\r\n\t\t\ttemph=response1.ReadBytes[0];\r\n\t\t\ttempl=response1.ReadBytes[1];\r\n\t\t\ttemp = (temph << 8) | templ;\r\n\t\t\ttemp=temp & 0x0fff;\r\n\t\t\t\t\r\n\t\t\tcalc = (double)temp *2.5 / 4096.0;\r\n\t\t\r\n\t\t\tcalc1 = (1.96- calc) * 4.64 + 1.96;\r\n\t\t\tcontext.Write(\"Vsensor [volts]:\\t\");\r\n\t\t\tcontext.Write(calc1 + \"\\n\");\r\n\r\n\t\r\n\treturn calc1;\r\n\t}\r\n\r\ndouble\t\tread_pressure_sensor(Int32 i )\r\n\t{\r\ndouble resualt =0 ;\r\n\t\t switch (i)\r\n {\r\n case 1:\r\n\t\t\tadc_configuration(0x44,0x20);\t\t//a2d_address 0x44 channel channel 2\r\n\t\t\tadc_set_for_read_ch(0x44);\r\n\t\t\tresualt=adc_read_ch(0x44);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 2:\r\n\t\t\tadc_configuration(0x44,0x08);\t\t//a2d_address 0x44 channel channel 4\r\n\t\t\tadc_set_for_read_ch(0x44);\r\n\t\t\tresualt=adc_read_ch(0x44);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 3:\r\n\t\t\tadc_configuration(0x46,0x80);\t\t//a2d_address 0x46 channel channel 0\r\n\t\t\tadc_set_for_read_ch(0x46);\r\n\t\t\tresualt=adc_read_ch(0x46);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 4:\r\n\t\t\tadc_configuration(0x46,0x20);\t\t//a2d_address 0x46 channel channel 2\r\n\t\t\tadc_set_for_read_ch(0x46);\r\n\t\t\tresualt=adc_read_ch(0x46);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 5:\r\n\t\t\tadc_configuration(0x44,0x10);\t\t//a2d_address 0x44 channel channel 3\r\n\t\t\tadc_set_for_read_ch(0x44);\r\n\t\t\tresualt=adc_read_ch(0x44);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 6:\r\n\t\t\tadc_configuration(0x44,0x04);\t\t//a2d_address 0x44 channel channel 5\r\n\t\t\tadc_set_for_read_ch(0x44);\r\n\t\t\tresualt=adc_read_ch(0x44);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 7:\r\n\t\t\tadc_configuration(0x46,0x40);\t\t//a2d_address 0x46 channel channel 1\r\n\t\t\tadc_set_for_read_ch(0x46);\r\n\t\t\tresualt=adc_read_ch(0x46);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 8:\r\n\t\t\tadc_configuration(0x46,0x10);\t\t//a2d_address 0x46 channel channel 3\r\n\t\t\tadc_set_for_read_ch(0x46);\r\n\t\t\tresualt=adc_read_ch(0x46);\r\n\t\tbreak;\r\n\t\t\r\n default:\r\n context.Write(\"Error\");\r\n\r\n break;\r\n\t }\t\r\n\t\t\r\n\t\treturn resualt;\r\n\t}\t\r\n\r\n\r\n//--------------------------------\r\nint open_valve (int valve_nm,int valve_type,int check_valve)\t\t//valve_type=0 is Air ,1 is Ink ; check_valve=1 send feedbak\r\n{\r\n\tint temp1=Convert_Midtank_No[valve_nm-1]\t;\r\n\r\n\tstring temp;\r\n\tSetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 1);\t\r\n\t\r\n\t\tif (check_valve!=0)\r\n\t\t{\r\n\t\t\ttemp=\"Air\";\r\n\t\t\tif (valve_type==1)\r\n\t\t\ttemp=\"Ink\";\r\n\t\t\t\t\r\n\t\t\tDialogResult result = MessageBox.Show(\"Did \" + temp + \"Valve of Midtank \" + valve_nm +\" open?\", \"Warning\",MessageBoxButtons.YesNo);\r\n\t\t\tif(result == DialogResult.No)\r\n\t\t\t\t{\r\n//\t\t\t\t\tUnits_status[(valve_nm-1)*3+valve_type,1]=\"Fail\";\r\n\t\t\t\t\tcontext.Write(temp +\"Valve\\tFail\\n\");\t\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\telse \r\n\t\t\t\t{\r\n//\t\t\t\t\tUnits_status[(valve_nm-1)*3+valve_type,1]=\"Pass\";\r\n\t\t\t\t\tcontext.Write(temp +\"Valve\\tOpen\\n\");\t\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t}\r\n\t\t\t\r\n\t\t}\r\n\t\treturn 1;\r\n\r\n}\r\n//--------------------------------\t\r\nint close_valve (int valve_nm,int valve_type,int check_valve)\r\n{\r\n\tint temp1=Convert_Midtank_No[valve_nm-1];\t\r\n\r\n\tstring temp;\r\n\tSetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 0);\r\n\tif (check_valve!=0)\r\n\t\t{\r\n\t\t\ttemp=\"Air\";\r\n\t\t\tif (valve_type==1)\r\n\t\t\ttemp=\"Ink\";\r\n\t\t\t\t\r\n\t\t\tDialogResult result = MessageBox.Show(\"Did \" + temp +\" Valve of Midtank \" + valve_nm +\" close?\", \"Warning\",MessageBoxButtons.YesNo);\r\n\t\t\tif(result == DialogResult.No)\r\n\t\t\t\t{\r\n//\t\t\t\t\tUnits_status[(valve_nm-1)*3+valve_type,1]=\"Fail\";\r\n\t\t\t\t\tcontext.Write(temp +\"Valve\\tFail\\n\");\t\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\telse \r\n\t\t\t\t{\r\n//\t\t\t\t\tUnits_status[(valve_nm-1)*3+valve_type,1]=\"Pass\";\r\n\t\t\t\t\tcontext.Write(temp +\"Valve\\tclose\\n\");\t\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t}\t\t\t\r\n\t\t}\r\n\treturn 1;\r\n\r\n}\r\n\r\npublic Int32 SetBit(Int32 Adr, Int32 BitNo, Int32 Bit)\r\n{\r\n\tInt32 BitMask;\r\n\tInt32 RetVal;\r\n\tRetVal = Fpga_Read_Reg(Adr);\r\n\tInt32 RV = RetVal ;\r\n\t\r\n\tif (Bit == 0x1) \r\n\t{\r\n\t\tBitMask = 0x1 << BitNo;\r\n\t\tRV = RV | BitMask;\r\n\t\tFpga_Write_Reg( Adr, RV );\r\n\t}\r\n\telse if (Bit == 0x0)\r\n\t{\r\n\t\tBitMask = ~(0x1 << BitNo);\r\n\t\tRV = RV & BitMask;\r\n\t\tFpga_Write_Reg(Adr, RV );\t\r\n\t}\r\n\treturn 1;\r\n}\r\n\r\nint Fpga_Write_Reg(Int32 Addr, Int32 Data)\r\n{\r\n\tvar response =context.Send(\"StubFpgaWriteRegRequest\" ,Addr, Data);\r\n\t\r\n\treturn 1;\r\n}\r\n\r\n\r\nInt32 check_valve (Int32 valve_nm,int valve_type)\r\n{\r\n\tInt32 temp1=Convert_Midtank_No[valve_nm-1];\t\r\n\t\r\n var response =context.Send(\"StubFpgaReadRegRequest\" ,F3_VALVE_OUT);\r\n\tInt32 RV =(Int32) response.Value & 0xffff ;\r\n\tRV = RV & ( 0x1 << (((valve_type+1)*8)- temp1));\r\n\treturn RV;\r\n\r\n}\r\n\r\n\r\nInt32 Fpga_Read_Reg(Int32 Addr)\r\n{\r\n \r\ncontext.Write(\"123\");\r\n\r\n\tvar response =context.Send(\"StubFpgaReadRegRequest\" ,Addr);\r\n\tcontext.Write(\"456\");\r\n\r\n\tInt32 RV= (Int32) response.Value & 0xffff;\r\n\tcontext.Write(\"789\");\r\n\r\n\treturn RV;\r\n} \r\n \r\n \r\n \r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Entities;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[]},"Variables":{"$id":"6","$values":[]},"ReferenceAssemblies":{"$id":"7","$values":[{"$id":"8","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"9","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"10","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"11","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"12","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"13","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"14","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"15","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"16","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"17","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"18","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Resources":{"$id":"19","$values":[]},"Dialogs":{"$id":"20","$values":[]},"ID":"e2c3c81d-1914-4d45-b031-d054af33a18e","ApartmentState":"STA"} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/Priming.pproj b/Software/Stubs Collection/stubs/Scripts/Priming.pproj new file mode 100644 index 000000000..309dae73e --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Priming.pproj @@ -0,0 +1 @@ +{"$id":"1","Name":"Priming","Description":null,"Scripts":{"$id":"2","$values":[{"$id":"3","Name":"Program.csx","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Entities;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\nusing System.IO;\r\nusing System.Diagnostics;\r\nusing System.Windows.Forms;\r\n\r\n\r\npublic class Program\r\n{\r\n\r\n\r\nprivate IProcedureContext context;\r\n\r\n//---------------------Start Command ----------------\r\nconst Int32\tCMD_RUN\t=\t0;\t\t//Run on Pulse Per Secound .positive run Up and negative run Down b\r\nconst Int32\tCMD_STOP=\t1;\t\t//0;Hard stop(Defualt);1-Soft stop;2-Hard Hiz;3-Soft Hiz\r\nconst Int32\tCMD_VALVE=\t2;\t\t//0-to Midtank ,1-to head \r\nconst Int32\tCMD_DLY\t=\t3;\t\t//delay in Seconds .\r\nconst Int32\tCMD_TIME=\t4;\t\t//Print Time .\r\nconst Int32\tCMD_PRESS=\t5;\t\t//return from Delay loop when pressure is high (on mBAR) .\r\nconst Int32 CMD_LOOP_NM=6;\t\t//NUMBER OF counter\r\nconst Int32 CMD_LOOP=\t7;\t\t//jump up(+) or down(-) command u\r\nconst Int32 CMD_MTV_OPEN =\t8;\t\t//0 Air ; 1 Ink\r\nconst Int32 CMD_MTV_CLOSE=\t9;\t\t//0 Air ; 1 Ink\r\nconst Int32 CMD_LBL=\t10;\t//label for user \r\nconst Int32 CMD_SMP=\t11; //sample rate ,defualt 100msec (1); for 1 second is 10.\r\nconst Int32 CMD_PRESL=\t12; //return from Delay loop when pressure is low (on mBAR) .\r\n\r\nconst Int32\tCMD_END\t=\t13;\t//end loop .\r\n \r\n\r\nInt32[] BuildUp_Table = new int []\r\n{\r\n\tCMD_VALVE,1,\r\n\tCMD_PRESL,200,\r\n\tCMD_DLY,200, \r\n\r\n\tCMD_LOOP_NM,3,\r\n\r\n\tCMD_VALVE,0,\r\n\tCMD_DLY,1, \r\n\tCMD_VALVE,1,\r\n\tCMD_DLY,1, \r\n\tCMD_LOOP,-4,\r\n\r\n\tCMD_VALVE,0,\r\n\tCMD_RUN,1068,\r\n\tCMD_PRESS,1000,\t//mbar --> 1000 = 100% work, 4000 = 200% work, 350 = 20% work\r\n\tCMD_DLY,150, \t\t\r\n\tCMD_LBL,1,\r\n\tCMD_PRESS,2000,\t//mbar --> 2000 = 100% work, 4000 = 200% work, 350 = 20% work\r\n\tCMD_DLY,60, \t\t\r\n\tCMD_LBL,2,\r\n\tCMD_PRESS,3000,\r\n\tCMD_DLY,60, // to limit\r\n\tCMD_STOP,0,\r\n\tCMD_VALVE,1,\r\n\tCMD_END,3,\r\n};\r\n\t\r\n\r\nInt32[] Up_Table = new int []\r\n{\r\n\tCMD_VALVE,1,\r\n\tCMD_PRESL,200,\r\n\tCMD_DLY,200, \r\n\t\r\n\tCMD_PRESS,3000,\t//mbar --> 1000 = 100% work, 4000 = 200% work, 350 = 20% work\r\n\tCMD_RUN,534, // 100%\r\n\tCMD_DLY,120,\r\n\tCMD_STOP,0,\r\n\tCMD_END,3,\r\n};\r\nInt32 Dispenser_sample_rate= 1; \r\n\r\n\tstring path = @\"C:\\Dispenser_setup\\Log\\\"; \t\r\n//----------------------\r\nconst UInt32 I2C_ID \t\t\t= \t4;\t\t\t\t\t//MCU_I2C4 \r\nconst UInt32 TCA9548A_address \t=\t0xE2;\t \t\r\nconst UInt32 I2C_Slave_Low_Add \t= \t0xA0;\t\t\t\t//eeprom address - 64k low \r\nconst UInt32 I2C_Slave_High_Add = \t0xA2;\t\t\t\t//eeprom address - 64k High\r\n//----------------------\r\nbyte [] EEPROM_Data = new byte [128];\r\n\r\n\r\n//---------------------End Command ----------------\r\n\r\nconst Int32\tDispenser_Motor1\t=\t6;\t\t \r\nconst Int32\tDispenser_Motor2\t=\t7;\t\t \r\nconst Int32\tDispenser_Motor3\t=\t8;\t\t \r\nconst Int32\tDispenser_Motor4\t=\t9;\t\t \r\nconst Int32\tDispenser_Motor5\t=\t10;\t\t \r\nconst Int32\tDispenser_Motor6\t=\t11;\t\t \r\nconst Int32\tDispenser_Motor7\t=\t12;\t\t \r\nconst Int32\tDispenser_Motor8\t=\t13;\t\t \r\n\r\nconst Int32 AN_IDS_PRESSENS_1\t=\t2;\r\nconst Int32 AN_IDS_PRESSENS_2\t=\t3;\r\nconst Int32 AN_IDS_PRESSENS_3\t=\t4;\r\nconst Int32 AN_IDS_PRESSENS_4\t=\t5;\r\nconst Int32 AN_IDS_PRESSENS_5\t=\t6;\r\nconst Int32 AN_IDS_PRESSENS_6\t=\t7;\r\nconst Int32 AN_IDS_PRESSENS_7\t=\t8;\r\nconst Int32 AN_IDS_PRESSENS_8\t=\t9;\r\n\r\nconst Int32\tF2_LS_01_Direct\t=\t0x60000420\t;\t//\tReads the direct values that are currently being sent to the fpga.\trsv\t\trsv\t\trsv\t\t\t\t\t\trsv\t\t\t\t\t\tF2_LS_DISPENSER_UP_2\tF2_LS_DISPENSER_25_2\tF2_LS_DISPENSER_75_2\tF2_LS_DISPENSER_DOWN_2 \tF2_LS_DISPENSER_50_2\tF2_LS_DISPENSER_SPARE_2\tF2_LS_DISPENSER_UP_1\tF2_LS_DISPENSER_25_1 \tF2_LS_DISPENSER_75_1\tF2_LS_DISPENSER_DOWN_1\tF2_LS_DISPENSER_50_1\tF2_LS_DISPENSER_SPARE_1\t\t\t\r\nconst Int32\tF2_LS_02_Direct\t=\t0x60000430\t;\t//\tReads the direct values that are currently being sent to the fpga.\trsv\t\trsv\t\trsv\t\t\t\t\t\trsv\t\t\t\t\t\tF2_LS_DISPENSER_UP_4\tF2_LS_DISPENSER_25_4\tF2_LS_DISPENSER_75_4\tF2_LS_DISPENSER_DOWN_4\tF2_LS_DISPENSER_50_4\tF2_LS_DISPENSER_SPARE_4\tF2_LS_DISPENSER_UP_3\tF2_LS_DISPENSER_25_3 \tF2_LS_DISPENSER_75_3\tF2_LS_DISPENSER_DOWN_3\tF2_LS_DISPENSER_50_3\tF2_LS_DISPENSER_SPARE_3\t\t\t\r\nconst Int32\tF2_LS_03_Direct\t=\t0x60000440\t;\t//\tReads the direct values that are currently being sent to the fpga.\trsv\t\trsv\t\trsv\t\t\t\t\t\trsv\t\t\t\t\t\tF2_LS_DISPENSER_UP_6 \tF2_LS_DISPENSER_25_6 \tF2_LS_DISPENSER_75_6 \tF2_LS_DISPENSER_DOWN_6\tF2_LS_DISPENSER_50_6\tF2_LS_DISPENSER_SPARE_6\tF2_LS_DISPENSER_UP_5\tF2_LS_DISPENSER_25_5 \tF2_LS_DISPENSER_75_5\tF2_LS_DISPENSER_DOWN_5\tF2_LS_DISPENSER_50_5\tF2_LS_DISPENSER_SPARE_5\t\t\t\r\nconst Int32\tF2_LS_04_Direct =\t0x60000480\t;\t//\tReads the direct values that are currently being sent to the fpga.\trsv\t\trsv\t\trsv\t\t\t\t\t\trsv\t\t\t\t\t\tF2_LS_DISPENSER_UP_8\tF2_LS_DISPENSER_25_8\tF2_LS_DISPENSER_75_8\tF2_LS_DISPENSER_DOWN_8\tF2_LS_DISPENSER_50_8\tF2_LS_DISPENSER_SPARE_8\tF2_LS_DISPENSER_UP_7\tF2_LS_DISPENSER_25_7 \tF2_LS_DISPENSER_75_7\tF2_LS_DISPENSER_DOWN_7\tF2_LS_DISPENSER_50_7\tF2_LS_DISPENSER_SPARE_7\t\t\t\r\n\r\nconst Int32 Dispenser_Valve1\t=\t0;\r\nconst Int32 Dispenser_Valve2\t=\t1;\r\nconst Int32 Dispenser_Valve3\t=\t2;\r\nconst Int32 Dispenser_Valve4\t=\t3;\r\nconst Int32 Dispenser_Valve5\t=\t4;\r\nconst Int32 Dispenser_Valve6\t=\t5;\r\nconst Int32 Dispenser_Valve7\t=\t6;\r\nconst Int32 Dispenser_Valve8\t=\t7;\r\n\r\nconst ushort MinPress_Mbar_Add =0x5c ;\r\nconst ushort MaxPress_Mbar_Add =0x60 ;\r\n\r\nconst Int32 F3_VALVE_OUT\t= 0x600000e2;\t\t\r\n\r\n//string path = \"C:\\\\Dispenser_setup\\\\Log\\\\\"; \r\n\r\n\r\n//Int32[] Start_Table;\r\n\r\nInt32[] Start_Table = new Int32 [10000];\r\n\r\nUInt32 [] Motor_Dir=new UInt32 [8] {0,0,0,0,0,0,0,0};\r\n\r\nstring Dispenser_Fname ;\r\n\r\nInt32 Dispenser_ptr =-1;\r\n\r\nInt32 [] Dispenser_press= new Int32[8]{0,0,0,0,0,0,0,0};\r\nInt32 max_pressure_level = 20000;\r\nInt32 min_pressure_level = -20000;\r\n\t\r\nInt32 [] A2D_Dispenser= new Int32[8]{0,0,0,0,0,0,0,0};\r\nInt32 Loop_cnt= 1;\r\nInt32 Loop_length=1;\r\n\r\nInt32 PressureSensorType= 1;\t\t//1- new -1up +10 . 0-old 0 to +10\r\nInt32\tTemp_Delay=0;\r\n\r\n\r\nUInt32 RD_LS_01_Direct;\r\nUInt32 RD_LS_02_Direct;\r\nUInt32 RD_LS_03_Direct;\r\nUInt32 RD_LS_04_Direct;\r\n\r\nlong Lebel1_time;\r\nlong Lebel2_time;\r\n\r\nlong time_Table;\r\n\r\nInt32 msec_index=0;\r\n\r\nInt32 MaxPress_Mbar;\r\nInt32 MinPress_Mbar;\r\nstring state;\r\n\r\n\tpublic Int32 OnExecute(IProcedureContext context)\r\n {\r\n\t\tlong Max_PBU;\r\n\t\tInt32 Index=0;\r\n\t\tInt32 speed=0;\r\n\t\tInt32 Dispenser_Nm;\r\n\t\tthis.context = context;\r\n\t\r\n\t\tstring box_msg = \"Make sure Mixer Hot \";\r\n\t\tMessageBox.Show(box_msg);\r\n\t\t\r\n\t\tvar response1 = context.RequestUserInputFor(\"Dispenser Number\", \"Enter Dispenser number to make priming (1-8):\");\r\n\t\tcontext.WriteLine(response1);\r\n\t\tDispenser_Nm = Int32.Parse(response1);\r\n\t\t\r\n\t\tcheck_Min_Max_Mbar(Dispenser_Nm);\r\n\t\r\n\t\tif (Dispenser_Nm==8)\r\n\t\t\tMax_PBU=6000;\r\n\t\telse\r\n\t\t\tMax_PBU=4000;\r\n\t\t\t\r\n\t\r\n\tif (!Directory.Exists(path))\r\n\t\t{\r\n\t\t\tDirectory.CreateDirectory(path);\r\n\t\t}\t\r\n\t\t\tcontext.WriteLine(path);\r\n\t\t\t\r\n\tcontext.Send(\"ProgressRequest\" ,0xe0, 1);\r\n\r\n\tDispenser_Fname=path + \"Dispenser_Nm_\" + Dispenser_Nm+\"_\" + DateTime.Now.ToString(\"MM-dd-yy hh-mm\")+ \".csv\" ;\r\n\r\n\tcontext.WriteLine(Dispenser_Fname);\r\n\r\n\tcontext.WriteToFile(Dispenser_Fname,\"Dispenser Nm,\" + Dispenser_Nm + \"\\n\" );\r\n\tcontext.AppendToFile(Dispenser_Fname,\"Pressure,Command,Value,DateTime,Remark\\n\" ); \r\n\t\tfor(int j=0; j<2;j++)\r\n\t\t{\r\n\t\t\tfor(int i=0; i<4;i++)\r\n\t\t\t{\r\n\t\t\t\tstate=\"PBU No. \"+ (4*j+i+1 );\r\n\t\t\t\tStart_Table=BuildUp_Table;\r\n\t\t\t\tTable_Run(Dispenser_Nm );\r\n\t\t\t\tif (time_Table>300000)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontext.AddResult(ResultType.Failed,\"PBU\", \"PBU No.\"+ (4*j+i+1 ) + \" Fail\");\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t\t context.AddResult(ResultType.Passed,\"PBU\",\"PBU No.\"+ (4*j+i+1 ) + \" Pass\");\r\n\t\t\t\t\t\r\n\t\t\t}\r\n\t\t\tstate=\"Flow No.\"+ (j+1 ) ;\r\n\t\t\tStart_Table=Up_Table;\r\n\t\t\tTable_Run(Dispenser_Nm );\r\n\t\t\tif (time_Table<115000)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontext.WriteLine(\"time_Table= \" +time_Table);\r\n\t\t\t\t\tcontext.AddResult(ResultType.Failed,\"Flow\", \"Flow No.\"+ (j+1) + \" Fail\");\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t\t context.AddResult(ResultType.Passed,\"Flow\",\"Flow No.\"+ (j+1 ) + \" Pass\");\r\n\t\t\t\t\t\t\r\n\t\t}\r\n\t\t\t\t state=\"Last PBU \" ;\r\n\t\t\t\tStart_Table=BuildUp_Table; \r\n\t\t\t\tTable_Run(Dispenser_Nm );\r\n\t\t\t\tlong Time=Lebel2_time-Lebel1_time;\r\n\t\t\t\tif (Time>Max_PBU)\r\n\t\t\t\t { \r\n\t\t\t\t context.AddResult(ResultType.Failed,\"PBU\", \"PBU = \" +Time + \"msec \");\r\n\t\t\t\t state=\"PBU = \" +Time + \"msec \\tFail\";\r\n\t\t\t\t }\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t context.AddResult(ResultType.Passed,\"PBU\", \"PBU = \" +Time + \"msec \");\r\n\t\t\t\t state=\"PBU = \" +Time + \"msec \\tPass\";\r\n\t\t\t\t}\t\r\n\t\treturn 0;\r\n\t\t\r\n }\r\n\r\n/////////////////////////////////////////////\r\nvoid \t\tcheck_Min_Max_Mbar(Int32 i )\r\n{\r\n\tint k;\r\n\tstring s ;\r\n\ti--;\r\n\r\n\t\t\t\t\tcontext.WriteLine(\"-------------- write Enable Channel ------------\");\t//debug\r\n\t\tenable_channel(i); // Chanel 0-7 => Disp0enser 0-7 \r\n\t\t\t\t\tcontext.WriteLine(\"-------------- Read_header ------------\");\t//debug\r\n\r\n\t\t\t\t\tcontext.WriteLine(\"-------------- write_address_eeprom ------------\");\t//debug\r\n\t\twrite_address_eeprom (I2C_Slave_Low_Add,MinPress_Mbar_Add);\r\n\t\t\t\t\tcontext.WriteLine(\"-------------- read_data_from_eeprom ------------\");\t//debug\r\n\t\tread_data_from_eeprom (I2C_Slave_Low_Add,1);\r\n\t\tif \t(EEPROM_Data[0]==0\t)\r\n\t\t{\tPressureSensorType=0;\r\n\t\t\tcontext.WriteLine(\"PressureSensorType=0\" );\t//debug\r\n\t\t}\r\n\t\telse\t\r\n\t\t{\t\r\n\t\t\tPressureSensorType=1;\t\t\t\t\t\r\n\t\t\tcontext.WriteLine(\"PressureSensorType=1\" );\t//debug\r\n\t\t}\r\n\t\r\n}\t\r\n//----------------write address eeprom -------------------------\r\npublic void write_address_eeprom (UInt32 I2C_Add, UInt32 Eeprom_Add)\r\n{\t\r\n\tStubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();\r\n\tstubI2CWriteBytesRequest.I2CId = I2C_ID;\r\n\tstubI2CWriteBytesRequest.SlaveAddress = I2C_Add;\r\n\t\r\n\tUInt32 uInt32 = new UInt32();\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(Convert.ToByte( (Eeprom_Add & 0xff00) >>8));\t//Byte High add to write\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(Convert.ToByte(Eeprom_Add & 0xff));\t\t\t//Byte Low add to write\r\n\t\t\t\t\tcontext.WriteLine( (Eeprom_Add & 0xff00) >>8) ;\t//debug\r\n\t\t\t\t\tcontext.WriteLine( Eeprom_Add & 0xff);\t//debug\r\n\r\n\tcontext.Send(stubI2CWriteBytesRequest);\t\r\n}\r\n//------------------- read Data from EEprom--------------------------\r\n\r\npublic void read_data_from_eeprom ( UInt32 I2C_Add, UInt32 cnt )\r\n{\r\n\tStubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest();\r\n\tstubI2CReadBytesRequest.I2CId = I2C_ID;\r\n\tstubI2CReadBytesRequest.SlaveAddress = (I2C_Add + 1);\r\n\tstubI2CReadBytesRequest.NumberOfBytesToRead = cnt; // Number of bytes to read\r\n\r\n\tvar response1 = context.Send(stubI2CReadBytesRequest);\r\n\r\n\tfor(int i=0; i(stubI2CWriteBytesRequest);\r\n\t\r\n\treturn 1;\r\n}\r\n\r\n\r\n////////////////////////////////////////////////////////////// \r\nInt32 Table_Run(Int32 Dispenser )\r\n\r\n{\r\n\tInt32 COMMAND=0;\r\n\tInt32 Data=0;\r\n\tInt32 count=0;\r\n\t\r\n\tDispenser--;\t\t//check from 0-7\r\n\t\r\n\tint j=0;\r\n\tvar stopwatch = new Stopwatch();\r\n\t\tstopwatch.Start();\r\n\t\r\n\t\tlong elapsed_time = stopwatch.ElapsedMilliseconds;\r\n\t\tcontext.WriteLine(elapsed_time);\r\n\t\t\r\n\twhile (count!=-1) \r\n\t{\r\n\tmsec_index=msec_index+1;\r\n\t\t\r\n\t\tif (Dispenser<2) \r\n\t\t\t{\r\n\t\t\t\tvar response1 = context.Send(\"StubFpgaReadRegRequest\" ,F2_LS_01_Direct);\r\n\t\t\t\tRD_LS_01_Direct=response1.Value\t ;\r\n\t\t\t}\r\n\t\telse if ( (Dispenser<4) )\r\n\t\t\t{\r\n\t\t\t\tvar response1 = context.Send(\"StubFpgaReadRegRequest\" ,F2_LS_02_Direct);\r\n\t\t\t\tRD_LS_02_Direct=response1.Value\t ;\r\n\t\t\t}\r\n\t\telse if ( (Dispenser<6) )\r\n\t\t\t{\r\n\t\t\t\tvar response1 = context.Send(\"StubFpgaReadRegRequest\" ,F2_LS_03_Direct);\r\n\t\t\t\tRD_LS_03_Direct=response1.Value\t ;\r\n\t\t\t}\r\n\t\telse\r\n\t\t\t{\r\n\t\t\t\tvar response1 = context.Send(\"StubFpgaReadRegRequest\" ,F2_LS_04_Direct);\r\n\t\t\t\tRD_LS_04_Direct=response1.Value\t ;\r\n\t\t\t}\r\n\t\tif (Dispenser<4) \r\n\t\t\t{\r\n\t\t\tvar response2 = context.Send(\"StubIntADCReadRequest\" ,0x8000 + AN_IDS_PRESSENS_1);\r\n\t\t\t\tA2D_Dispenser[0]=(response2.SamplingInBits)>>16;\r\n\t\t\t\tA2D_Dispenser[1] =(response2.SamplingInBits) & 0x0000ffff;\r\n\t\t\t\tA2D_Dispenser[2] =(response2.VoltageSamplingMv)>>16;\r\n\t\t\t\tA2D_Dispenser[3] =(response2.VoltageSamplingMv) & 0x0000ffff;\r\n\t\t\t}\r\n\t\telse\r\n\t\t\t{\r\n\t\t\tvar\tresponse3 = context.Send(\"StubIntADCReadRequest\" ,0x8000 + AN_IDS_PRESSENS_5);\r\n\t\t\t\tA2D_Dispenser[4] =(response3.SamplingInBits)>>16;\r\n\t\t\t\tA2D_Dispenser[5] =(response3.SamplingInBits)& 0x0000ffff;\r\n\t\t\t\tA2D_Dispenser[6] =(response3.VoltageSamplingMv)>>16;\r\n\t\t\t\tA2D_Dispenser[7] =(response3.VoltageSamplingMv)& 0x0000ffff;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tCOMMAND=Start_Table[count];\r\n\t\t\tData=Start_Table[(count+1)];\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//Index=Index+2;\r\n\t\t\tswitch (COMMAND)\r\n\t\t\t\t{\r\n\t\t\t\tcase CMD_RUN:\r\n\t\t\t\t\tMotor_Run(Data,Dispenser);\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_VALVE:\r\n\t\t\t\t\tValve_3W(Data,Dispenser);\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_STOP:\r\n\t\t\t\t\tMotor_Stop(Data,Dispenser);\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_DLY:\r\n\t\t\t\t\tDelay_on_second(Data,Dispenser);\r\n\t\t\t\t\tif (Temp_Delay ==0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tmax_pressure_level=20000;\t\r\n\t\t\t\t\t\tmin_pressure_level=-20000;\t\r\n\t\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_TIME:\r\n\t\t\t\t\tPrint_Time();\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_PRESS:\r\n\t\t\t\t\tmax_pressure_level=Data;\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",Max_pressure_level is, \" + Data +\",\"+DateTime.Now+\"\\n\");\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_PRESL:\r\n\t\t\t\t\tmin_pressure_level=Data;\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",Min_pressure_level is, \" + Data +\",\"+DateTime.Now+\"\\n\");\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_LBL:\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",Label,\" + Data+\",\"+DateTime.Now+\"\\n\");\r\n\t\t\t\t\tif(Data==1)\r\n\t\t\t\t\t\tLebel1_time=stopwatch.ElapsedMilliseconds;\r\n\t\t\t\t\tif(Data==2)\r\n\t\t\t\t\t\tLebel2_time=stopwatch.ElapsedMilliseconds;\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_SMP:\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",SampleRate,\" + Data+\",\"+DateTime.Now+\"\\n\");\r\n\t\t\t\t\tDispenser_sample_rate =Data;\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_END:\r\n\t\t\t\t\tcount=-1;\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",End testing,,\"+DateTime.Now+\"\\n\");\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\r\n\t\t\t\tcase CMD_MTV_OPEN:\r\n\t\t\t\t\topen_midtank_valve(Data,Dispenser);\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",OPEN MIDTANK, \" + Dispenser+\",\"+DateTime.Now+\"\\n\");\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase CMD_MTV_CLOSE:\r\n\t\t\t\t\tclose_midtank_valve(Data,Dispenser);\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",CLOSE MIDTANK, \" + Dispenser+\",\"+DateTime.Now+\"\\n\");\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\r\n\t\t\t\tcase CMD_LOOP_NM:\r\n\t\t\t\t\r\n\t\t\t\t\tLoop_cnt=Data-1;\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",Counter Loop,\"+ Data+\",\"+DateTime.Now +\"\\n\");\r\n\t\t\t\t\tcount = count+2;\t\t\t\t\t\t\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase CMD_LOOP:\r\n\t\t\t\t\r\n\t\t\t\t\tif (Loop_cnt!=0)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\"Counter Loop,\"+ Loop_cnt+\",\"+DateTime.Now+\"\\n\" );\r\n\t\t\t\t\t\tcount = count+2*Data;\r\n\t\t\t\t\t\tLoop_cnt--;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",End loop,,\"+DateTime.Now +\"\\n\");\r\n\t\t\t\t\t\tcount = count+2;\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t}\t\r\n\t\t\t\r\n\t\t\tlong elapsed_time1 = stopwatch.ElapsedMilliseconds;\r\n\t\t\tlong elapsed_time2= elapsed_time1-elapsed_time;\r\n\t\t\tif (elapsed_time2>95)\r\n\t\t\telapsed_time2=95;\t\t//minimum time\r\n\t\t\t\tThread.Sleep(100-(int )(elapsed_time2));\r\n\r\n\t\t\telapsed_time = stopwatch.ElapsedMilliseconds;\t\t\r\n\r\n\r\n\t\t\tj++;\r\n\t\t\t\tif (j==10)\r\n\t\t\t\t{\r\n\t\t\t\t\tj=0;\r\n\t\t\t\t\tcontext.WriteLine(Dispenser_press[Dispenser]+ \" mBar\\t\"+state + \"\\tTime-\" + (elapsed_time/1000));\r\n\t\t\t\t}\r\n\t}\r\n\ttime_Table=elapsed_time;\r\n\treturn 0;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////\t\r\nInt32 Motor_Run(Int32 speed,Int32 Dispenser)\r\n\r\n{\r\n\r\n\tswitch (Dispenser)\r\n\t\t{\r\n\t\tcase 0:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[0]=2;\r\n\t\t\t\t\tif ((RD_LS_01_Direct & 0x04)!=0x04)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor1, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[0]=1;\r\n\t\t\t\t\tif ((RD_LS_01_Direct & 0x20)!=0x20)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor1, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 1:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[1]=2;\r\n\t\t\t\t\tif ((RD_LS_01_Direct & 0x100)!=0x100)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor2, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[1]=1;\r\n\t\t\t\t\tif ((RD_LS_01_Direct & 0x800)!=0x800)\r\n\t\t\t\t\t{\t\t\t\t\t\t\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor2, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 2:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[2]=2;\r\n\t\t\t\t\tif ((RD_LS_02_Direct & 0x04)!=0x04)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor3, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[2]=1;\r\n\t\t\t\t\tif ((RD_LS_02_Direct & 0x20)!=0x20)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now+ \",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor3, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 3:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[3]=2;\r\n\r\n\t\t\t\t\tif ((RD_LS_02_Direct & 0x100)!=0x100)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now+ \",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor4, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[3]=1;\r\n\r\n\t\t\t\t\tif ((RD_LS_02_Direct & 0x800)!=0x800)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor4, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\t\t\r\n\t\tcase 4:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[4]=2;\r\n\t\t\t\t\tif ((RD_LS_03_Direct & 0x04)!=0x04)\r\n\t\t\t\t\t{ \r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now+ \",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor5, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[4]=1;\r\n\t\t\t\t\tif ((RD_LS_03_Direct & 0x20)!=0x20)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now+ \",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor5, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 5:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[5]=2;\r\n\t\t\t\t\tif ((RD_LS_03_Direct & 0x100)!=0x100)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor6, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[5]=1;\r\n\t\t\t\t\tif ((RD_LS_03_Direct & 0x800)!=0x800)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now+ \",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor6, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 6:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[6]=2;\r\n\t\t\t\t\tif ((RD_LS_04_Direct & 0x04)!=0x04)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor7, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[6]=1;\r\n\t\t\t\t\tif ((RD_LS_04_Direct & 0x20)!=0x20)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor7, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 7:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[7]=2;\r\n\r\n\t\t\t\t\tif ((RD_LS_04_Direct & 0x100)!=0x100)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor8, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[7]=1;\r\n\r\n\t\t\t\t\tif ((RD_LS_04_Direct & 0x800)!=0x800)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send(\"StubMotorRunRequest\" ,Dispenser_Motor8, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\t\t\t\r\n\t\tdefault:\r\n\t\t\tbreak;\r\n\r\n\t\t}\r\n \tcontext.AppendToFile(Dispenser_Fname,\",Run,\" +speed+\",\"+DateTime.Now +\"\\n\" ); \r\n\r\n\treturn 1;\r\n} \r\n \r\n \t\r\n Int32 Valve_3W(Int32 Valve_Value,Int32 Dispenser)\r\n{\r\n\tif ( Valve_Value==1)\r\n\t\tcontext.Send(\"StubValveRequest\" ,Dispenser_Valve1+Dispenser, 3, true);\t//3 3Way\r\n\telse\t\r\n\t\tcontext.Send(\"StubValveRequest\" ,Dispenser_Valve1+Dispenser, 3, false); //3 3Way\r\n \r\n\tcontext.AppendToFile(Dispenser_Fname,\",Dispenser Valve position is, \" + Valve_Value+\",\"+DateTime.Now +\"\\n\" );\r\n\r\n\treturn 1;\t\r\n}\t\r\n//--------------------------------------- \r\n\r\n Int32 Motor_Stop(Int32 Stop_Value,Int32 Dispenser )\r\n{\r\n\tcontext.Send(\"StubMotorStopRequest\" ,Dispenser_Motor1+Dispenser, Stop_Value);\r\n\t\r\n\tcontext.AppendToFile(Dispenser_Fname,\",Motor Stop,\" + Stop_Value+\",\"+DateTime.Now +\"\\n\");\r\n\tMotor_Dir[Dispenser]=0;\r\n\treturn 1;\t\r\n}\r\n\r\n//--------------------------------------- \r\n\r\n Int32 Delay_on_second(Int32 Delay,Int32 Dispenser )\r\n{\r\n//Int32 temp1;\r\nInt32 pressure_om_mBAR=0;\r\n\tif \t(Temp_Delay ==0)\r\n\t{\r\n\t\tcontext.AppendToFile(Dispenser_Fname,\",DLY, \" + Delay +\",\"+DateTime.Now+\"\\n\");\r\n\t\tTemp_Delay = Delay *10 -1;\r\n//\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontext.Write(\"A\");\t\t//debug\r\n\t}\r\n\telse\t\r\n\t\t\tTemp_Delay--;\r\n\t\t\t\r\n\tif ( LimitSW_Dispenser(Dispenser)==0)\r\n \t {\t\r\n \t \tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now+\",Warning Motor on Limit\\n\");\r\n\t\t\tMotorStop(Dispenser);\r\n\t\t\tTemp_Delay =0;\t//end delay\r\n//\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontext.Write(\"C\");\t\t//debug\r\n\r\n\t\t\treturn 0 ;\r\n \t }\r\n\t\t\t\t\t\r\n\tpressure_om_mBAR=Calc_mBAR(Dispenser,true);\r\n \tif (pressure_om_mBAR > max_pressure_level)\r\n \t \t{\r\n\t\t//\tMotorStop(Dispenser);\r\n\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Pressure too high\\n\");\r\n\t\t\tTemp_Delay =0;\t//end delay\r\n//\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontext.Write(\"D\");\t\t//debug\r\n\t\t\t\r\n\t\t\treturn 0;\r\n\t\t}\r\n \tif (pressure_om_mBAR < min_pressure_level)\r\n \t \t{\r\n\t\t//\tMotorStop(Dispenser);\r\n\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Pressure too low\\n\");\r\n\t\t\tTemp_Delay =0;\t//end delay\r\n//\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontext.Write(\"D\");\t\t//debug\r\n\t\t\t\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t\r\n\t\t\r\n \treturn 1;\r\n}\t\r\n \t \t\r\nInt32 LimitSW_Dispenser(Int32 Dispenser) \r\n{\r\n\r\n\tif (Dispenser==0)\r\n\t\t\r\n\t\t{\r\n\t\t\t\r\n//\t\tvar response1 = context.Send(\"StubFpgaReadRegRequest\" ,F2_LS_01_Direct);\r\n\r\n\t\t\t\tif (((RD_LS_01_Direct & 0x04)!=0x04) && (Motor_Dir[0]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_01_Direct & 0x20)!=0x20) && (Motor_Dir[0]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t}\r\n\t\t\r\n\tif (Dispenser==1)\r\n\t\t\r\n\t\t{\r\n//\t\tvar response2 = context.Send(\"StubFpgaReadRegRequest\" ,F2_LS_01_Direct);\r\n\t\t\t\tif (((RD_LS_01_Direct & 0x100)!=0x100) && (Motor_Dir[1]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_01_Direct & 0x800)!=0x800) && (Motor_Dir[1]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t}\r\n\t\t\r\n\r\n\tif (Dispenser==2)\r\n\t\t\r\n\t\t{\r\n\t\t\t\t\r\n\t\t//var response3 = context.Send(\"StubFpgaReadRegRequest\" ,F2_LS_02_Direct);\r\n\t\t\t\tif (((RD_LS_02_Direct & 0x04)!=0x04) && (Motor_Dir[2]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_02_Direct & 0x20)!=0x20) && (Motor_Dir[2]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\tif (Dispenser==3)\r\n\t\t\r\n\t\t{\r\n\t\t\t\tvar response4 = context.Send(\"StubFpgaReadRegRequest\" ,F2_LS_02_Direct);\r\n\t\t\t\tif (((RD_LS_02_Direct & 0x100)!=0x100) && (Motor_Dir[3]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_02_Direct & 0x800)!=0x800) && (Motor_Dir[3]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t\r\n\r\n\tif (Dispenser==4)\r\n\t\t\r\n\t\t{\r\n\t\t\t\r\n//\t\tvar response1 = context.Send(\"StubFpgaReadRegRequest\" ,F2_LS_01_Direct);\r\n\t\t\t\tif (((RD_LS_03_Direct & 0x04)!=0x04) && (Motor_Dir[4]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_03_Direct & 0x20)!=0x20) && (Motor_Dir[4]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t}\r\n\t\t\r\n\tif (Dispenser==5)\r\n\t\t\r\n\t\t{\r\n//\t\tvar response2 = context.Send(\"StubFpgaReadRegRequest\" ,F2_LS_01_Direct);\r\n\t\t\t\tif (((RD_LS_03_Direct & 0x100)!=0x100) && (Motor_Dir[5]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_03_Direct & 0x800)!=0x800) && (Motor_Dir[5]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t}\r\n\t\t\r\n\r\n\tif (Dispenser==6)\r\n\t\t\r\n\t\t{\r\n\t\t\t\t\r\n\t\t//var response3 = context.Send(\"StubFpgaReadRegRequest\" ,F2_LS_02_Direct);\r\n\t\t\t\tif (((RD_LS_04_Direct & 0x04)!=0x04) && (Motor_Dir[6]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_04_Direct & 0x20)!=0x20) && (Motor_Dir[6]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\tif (Dispenser==7)\r\n\t\t\r\n\t\t{\r\n//\t\tvar response4 = context.Send(\"StubFpgaReadRegRequest\" ,F2_LS_02_Direct);\r\n\t\t\t\tif (((RD_LS_04_Direct & 0x100)!=0x100) && (Motor_Dir[7]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_04_Direct & 0x800)!=0x800) && (Motor_Dir[7]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\treturn 0;\r\n}\t\t\r\n\t\t\r\n\t \t\r\nInt32 Print_Time() \r\n{\t\r\n\t\tcontext.AppendToFile(Dispenser_Fname,\",Time is\\t,,\"+ DateTime.Now +\"\\n\" ); \r\n\r\n\t\treturn 1;\r\n}\t\r\n\r\n\r\n\r\nInt32 Calc_mBAR(Int32 Dispenser, bool save_press)\r\n{\t\t\r\nInt32 Data;\r\nInt32 Sense1;\r\nInt32 temp=0;\r\n\r\n\t\tData =A2D_Dispenser[Dispenser];\r\n\t\tif (Data<100)\r\n\t\t\ttemp=-1;\r\n\t\tData=Data-710;\r\n\t\tif (Data<0)\r\n\t\tData=0;\r\n\r\n\t\tData=Data*(10000+PressureSensorType*1000)/2840;\t//\tfor -1 to 10 bar Press_Sensor_Type=1 else 0\r\n\t\tData=Data-1000*PressureSensorType; \t\t\t// for -1 to 10 bar\r\n\r\n\t\tif (temp==-1)\t\t\t\t\t\t//if SamplingInBits <100 then No pressure sensor exist\r\n\t\tSense1=-9999\t;\r\n\t\telse\t\r\n\t\tSense1=Data\t;\r\n\t\tif (\t((msec_index) % (Dispenser_sample_rate)) == 0)\r\n\t\t{\r\n\t\t\tcontext.AppendToFile(Dispenser_Fname,\"\" + Sense1+\"\\n\");\r\n\t\t}\r\n\t\tDispenser_press[Dispenser]=Sense1;\r\n\treturn Sense1;\r\n\t\t\t\r\n } \t\r\n\r\n \r\n//--------------------------------\r\nint open_midtank_valve (Int32 valve_type,Int32 valve_nm)\t\t//valve_type=0 is Air ,1 is Ink ; valve_nm 0-7\r\n{\r\n\tSetBit (F3_VALVE_OUT,((valve_type+1)*8)- valve_nm-1, 1);\r\n\treturn 1;\r\n\r\n}\r\n//--------------------------------\t\r\nint close_midtank_valve (Int32 valve_type,Int32 valve_nm)\t\t//valve_type=0 is Air ,1 is Ink ; valve_nm 0-7\r\n{\r\n\tSetBit (F3_VALVE_OUT,((valve_type+1)*8)- valve_nm-1, 0);\r\n\treturn 1;\r\n}\r\n//--------------------------------\r\nInt32 SetBit(Int32 Adr, Int32 BitNo, Int32 Bit)\r\n{\r\n\tInt32 BitMask;\r\n\r\n var response = context.Send(\"StubFpgaReadRegRequest\" , F3_VALVE_OUT);\r\n\tInt32 RV = (Int32) response.Value & 0xffff;\r\n\t\r\n\t\r\n\tif (Bit == 0x1) \r\n\t{\r\n\t\tBitMask = 0x1 << BitNo;\r\n\t\tRV = RV | BitMask;\r\n\t\tcontext.Send(\"StubFpgaWriteRegRequest\" ,F3_VALVE_OUT , RV);\r\n\t}\r\n\telse if (Bit == 0x0)\r\n\t{\r\n\t\tBitMask = ~(0x1 << BitNo);\r\n\t\tRV = RV & BitMask;\r\n\t\tcontext.Send(\"StubFpgaWriteRegRequest\" ,F3_VALVE_OUT , RV);\r\n\t}\r\n\treturn 1;\r\n}\r\n//---------------------------------- \r\n void MotorStop(Int32 i)\r\n{\r\n \r\ncontext.Send(\"StubMotorStopRequest\" ,Dispenser_Motor1+i, 2);\r\nMotor_Dir[i]=0;\t//0 stop 1- up 2-dn\r\n\r\n}\r\n \r\n}","IsEntryPoint":true},{"$id":"4","Name":"Service.csx","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Entities;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[]},"Variables":{"$id":"6","$values":[{"$id":"7","Name":null,"Value":null}]},"ReferenceAssemblies":{"$id":"8","$values":[{"$id":"9","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"10","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"11","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"12","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"13","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"14","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"15","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"16","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"17","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"18","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"19","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Resources":{"$id":"20","$values":[]},"Dialogs":{"$id":"21","$values":[]},"ID":"b5924fbd-808a-41e3-99fb-980cd8df910c","ApartmentState":"STA"} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/Set cleaning sequence.cs b/Software/Stubs Collection/stubs/Scripts/Set cleaning sequence.cs new file mode 100644 index 000000000..6f5357535 --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/Set cleaning sequence.cs @@ -0,0 +1,23 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +public void OnExecute(StubManager stubManager) +{ + + +ProgressRequest progressRequest = new ProgressRequest(); +progressRequest.Amount = 0xAD7; +progressRequest.Delay = 1; // 1 - active, 0 - disabled + +var response = stubManager.Run(progressRequest); + +} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/WHS_waste_Tank_Calibration_Save_V0.pproj b/Software/Stubs Collection/stubs/Scripts/WHS_waste_Tank_Calibration_Save_V0.pproj new file mode 100644 index 000000000..5932b58a0 --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/WHS_waste_Tank_Calibration_Save_V0.pproj @@ -0,0 +1 @@ +{"$id":"1","Name":"untitled","Description":null,"Scripts":{"$id":"2","$values":[{"$id":"3","Name":"Program.csx","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Entities;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\n\r\npublic class Program\r\n{\r\n\tdouble V0_default_ml = 8.7433;\r\n\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n \r\n\tvar response1 = context.RequestUserInputFor(\"Warning - you are going to change the value of Vo in the eeprom !!!\\nPlease Enter Password to confirme:\",\"\");\r\n\tif (response1==\"Aa123456\")\r\n\t{\r\n\t\tcontext.WriteLine(response1);\r\n\t\t\r\n\t\t//Write_0_Vo_in_ml_to_eeprom\r\n\t\tcontext.WriteLine(\"\\nWrite_0_Vo_in_ml_to_eeprom\");\t\r\n\t\tStubWhsEEpromRequest stubWhsEEpromRequest = new StubWhsEEpromRequest();\r\n\t\tstubWhsEEpromRequest.BurnRequest = true; //write\r\n\t\tStubWhsEEpromData stubWhsEEpromData = new StubWhsEEpromData();\r\n\t\tstubWhsEEpromData.Orifice1Flow = 0;\r\n\t\tstubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;\r\n\t\tvar response = context.Send(stubWhsEEpromRequest);\r\n\t\t\t\t\r\n\t\t//wait_10mSec\r\n\t\tcontext.WriteLine(\"\\nwait_10mSec\");\t\r\n\t\tThread.Sleep(100); //Sleep for 10 milli.\r\n\t\t\r\n\t\t//Read_Vo_in_ml_from_eeprom\t& verify it is 0\r\n\t\tcontext.WriteLine(\"\\nRead_Vo_in_ml_from_eeprom\t& verify it is 0\");\r\n\t\tstubWhsEEpromRequest.BurnRequest = false; //write\r\n\t\tstubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;\r\n\t\tvar response2 = context.Send(stubWhsEEpromRequest);\r\n\t\t\r\n\t\t//Read_Vo_in_mV\r\n\t\tcontext.WriteLine(\"\\nRead_Vo_in_mV\");\r\n\t\tvar response3 = context.Send(\"ProgressRequest\" ,0x3EC, 0x01);\r\n\t\t//Print_Vo_in_mV\r\n\t\tcontext.WriteLine(response3.Progress);\r\n\t\t\r\n\t\t//check validity\r\n\t\tcontext.WriteLine(\"\\ncheck validity\");\r\n\t\t if((response3.Progress <= 800) || (response3.Progress >=1200))\r\n\t\t {\r\n\t\t \tresponse3.Progress = 1076; //default\r\n\t\t \tcontext.Write(\"\\nERROR ------ Vreading value outside the defined range !!! ------\");\r\n\t\t \t context.AddResult(ResultType.Failed , \"Error\", \"ERROR ------ Vreading value outside the defined range !!! ------\");\r\n\t\t }\r\n\t\telse\r\n\t\t{\t\t\t\r\n\t\t\t//calculate_V0_in_ml\r\n\t\t\tcontext.WriteLine(\"\\ncalculate_V0_in_ml\");\r\n\t\t\tV0_default_ml = V0_default_ml * response3.Progress;\r\n\t\t\t\r\n\t\t\t//print_Vo_in_ml\r\n\t\t\tcontext.WriteLine(\"\\nprint_Vo_in_ml\");\r\n\t\t\tcontext.WriteLine(V0_default_ml);\r\n\t\t\tcontext.WriteLine(\"\");\r\n\t\t\t\r\n\t\t\t//Write_Vo_in_ml_to_eeprom\r\n\t\t\tcontext.WriteLine(\"\\nWrite_Vo_in_ml_to_eeprom\");\r\n\t\t\tstubWhsEEpromRequest.BurnRequest = true; //write\r\n\t\r\n\t\t\tstubWhsEEpromData.Orifice1Flow = V0_default_ml;\r\n\t\t\tstubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;\r\n\t\t\tvar response4 = context.Send(stubWhsEEpromRequest);\r\n\t\t\t\t\r\n\t\t\t//wait_10mSec\r\n\t\t\tcontext.WriteLine(\"\\nwait_10mSec\");\t\r\n\t\t\t Thread.Sleep(100); //Sleep for 10 milli.\r\n\t\t\t \t\t\r\n\t\t\t //Read_Vo_in_ml_from_eeprom\r\n\t\t\tcontext.WriteLine(\"\\nRead_Vo_in_ml_from_eeprom\");\r\n\t\t\tstubWhsEEpromRequest.BurnRequest = false; //write\r\n\t\t\tstubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;\r\n\t\t\tvar response5 = context.Send(stubWhsEEpromRequest);\r\n\t\t\t\r\n\t\t\t//Check if we read the correct value\r\n\t\t\tcontext.WriteLine(\"\\nVerify that we read the correct value of Orifice1Flow!!\");\r\n\t\t\t context.AddResult(ResultType.Passed , \"Pass\", \"Calibration Pass.\");\r\n\r\n\t\t\t}\r\n\t}\r\n\t\telse\r\n \t{\r\n\t\t\tcontext.AddResult(ResultType.Failed , \"Error\", \"Password Fail.\");\r\n\t\t}\r\n\t\tcontext.WriteLine(\"\\n -- END OF SCRIPT -- \");\r\n }\r\n}\r\n\r\n\r\n","IsEntryPoint":true},{"$id":"4","Name":"Service.csx","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Entities;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[]},"Variables":{"$id":"6","$values":[]},"ReferenceAssemblies":{"$id":"7","$values":[{"$id":"8","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"9","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"10","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"11","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"12","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"13","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"14","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"15","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"16","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"17","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"18","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Resources":{"$id":"19","$values":[]},"Dialogs":{"$id":"20","$values":[]},"ID":"605a2ef0-71a6-450d-92f7-9b6d22850ad1","ApartmentState":"STA"} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/Write SYLKO to head eeprom.cs b/Software/Stubs Collection/stubs/Scripts/Write SYLKO to head eeprom.cs deleted file mode 100644 index d7729ca2f..000000000 --- a/Software/Stubs Collection/stubs/Scripts/Write SYLKO to head eeprom.cs +++ /dev/null @@ -1,118 +0,0 @@ -using System; -using System.Text; -using System.Linq; -using System.Drawing; -using System.Diagnostics; -using System.Windows.Forms; -using System.Threading; -using System.Threading.Tasks; -using System.Collections.Generic; -using Tango.PMR.Stubs; -using Tango.Stubs; - -//---------------------- -const Int32 I2C_ID = 3; //MCU_I2C3 -const Int32 TCA9548A_address = 0xE2; -const Int32 I2C_Slave_Add = 0xA0; // //eeprom address - 32kByte -int Head_Mux_Channel_ID = 4; //Head MUX channel -//---------------------- - -const Int32 SerialNum = 0x01; - - -int enable_channel(int Channel_ID) -{ - uint Const_temp = 0x01; - - StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); - stubI2CWriteBytesRequest.I2CId = I2C_ID; - stubI2CWriteBytesRequest.SlaveAddress = TCA9548A_address; - - Const_temp = Const_temp << Channel_ID; - stubI2CWriteBytesRequest.BytesTWrite.Add(Const_temp); - - var response = stubManager.Run(stubI2CWriteBytesRequest); - - return 1; -} - - -int adc_write(uint I2C_Slave_Add, uint Page) -{ - StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); - stubI2CWriteBytesRequest.I2CId = I2C_ID; - stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add; - - UInt32 uInt32 = new UInt32(); - stubI2CWriteBytesRequest.BytesTWrite.Add(0);//Byte 0 to write - stubI2CWriteBytesRequest.BytesTWrite.Add(Page);//Byte 0 to write - //-------------------------------------------------------------- - - stubI2CWriteBytesRequest.BytesTWrite.Add(SerialNum);//S/N - stubI2CWriteBytesRequest.BytesTWrite.Add(0x03);//HEAD_TYPE_SYLKO - //stubI2CWriteBytesRequest.BytesTWrite.Add(0x04);//HEAD_TYPE_STAPLE_SPUN - - var response = stubManager.Run(stubI2CWriteBytesRequest); - - return 1; -} - -int adc_set_for_read_ch(uint I2C_Slave_Add, uint Page) -{ - StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); - stubI2CWriteBytesRequest.I2CId = I2C_ID; - stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add; - - - UInt32 uInt32 = new UInt32(); - stubI2CWriteBytesRequest.BytesTWrite.Add(0);//Byte 0 to write - stubI2CWriteBytesRequest.BytesTWrite.Add(Page);//Byte 0 to write - - var response = stubManager.Run(stubI2CWriteBytesRequest); - - return 1; -} - -int adc_read_ch(uint I2C_Slave_Add) -{ - StubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest(); - stubI2CReadBytesRequest.I2CId = I2C_ID; - stubI2CReadBytesRequest.SlaveAddress = I2C_Slave_Add + 1; - stubI2CReadBytesRequest.NumberOfBytesToRead = 10; // Number of bytes to read - - var response1 = stubManager.Run(stubI2CReadBytesRequest); - uint temph=0; - - for(int i=0; i Disp0enser 0-7 - - for (int i = 0; i<1; i++) - { - - adc_write(I2C_Slave_Add,0x00); - Thread.Sleep(10); //Sleep for 5 milli. - must! otherwise read 0xff (See data sheet ) - - stubManager.Write("\nPage 0x00 #"); - stubManager.Write(i); - stubManager.Write("\t- The Buffer is: "); - adc_set_for_read_ch(I2C_Slave_Add, 0x00); - //Thread.Sleep(1); //Sleep for 10 milli. - adc_read_ch(I2C_Slave_Add); - - Thread.Sleep(1000); - - } -} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/config head type to hed card eeprom.cs b/Software/Stubs Collection/stubs/Scripts/config head type to hed card eeprom.cs new file mode 100644 index 000000000..fd0f7fcf7 --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/config head type to hed card eeprom.cs @@ -0,0 +1,118 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +//---------------------- +const Int32 I2C_ID = 3; //MCU_I2C3 +const Int32 TCA9548A_address = 0xE2; +const Int32 I2C_Slave_Add = 0xA0; // //eeprom address - 32kByte +int Head_Mux_Channel_ID = 4; //Head MUX channel +//---------------------- + +const Int32 SerialNum = 0x01; + + +int enable_channel(int Channel_ID) +{ + uint Const_temp = 0x01; + + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = TCA9548A_address; + + Const_temp = Const_temp << Channel_ID; + stubI2CWriteBytesRequest.BytesTWrite.Add(Const_temp); + + var response = stubManager.Run(stubI2CWriteBytesRequest); + + return 1; +} + + +int adc_write(uint I2C_Slave_Add, uint Page) +{ + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add; + + UInt32 uInt32 = new UInt32(); + stubI2CWriteBytesRequest.BytesTWrite.Add(0);//Byte 0 to write + stubI2CWriteBytesRequest.BytesTWrite.Add(Page);//Byte 0 to write + //-------------------------------------------------------------- + + stubI2CWriteBytesRequest.BytesTWrite.Add(SerialNum);//S/N + //stubI2CWriteBytesRequest.BytesTWrite.Add(0x03);//HEAD_TYPE_FLAT + stubI2CWriteBytesRequest.BytesTWrite.Add(0x04);//HEAD_TYPE_ARC + + var response = stubManager.Run(stubI2CWriteBytesRequest); + + return 1; +} + +int adc_set_for_read_ch(uint I2C_Slave_Add, uint Page) +{ + StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest(); + stubI2CWriteBytesRequest.I2CId = I2C_ID; + stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add; + + + UInt32 uInt32 = new UInt32(); + stubI2CWriteBytesRequest.BytesTWrite.Add(0);//Byte 0 to write + stubI2CWriteBytesRequest.BytesTWrite.Add(Page);//Byte 0 to write + + var response = stubManager.Run(stubI2CWriteBytesRequest); + + return 1; +} + +int adc_read_ch(uint I2C_Slave_Add) +{ + StubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest(); + stubI2CReadBytesRequest.I2CId = I2C_ID; + stubI2CReadBytesRequest.SlaveAddress = I2C_Slave_Add + 1; + stubI2CReadBytesRequest.NumberOfBytesToRead = 10; // Number of bytes to read + + var response1 = stubManager.Run(stubI2CReadBytesRequest); + uint temph=0; + + for(int i=0; i Disp0enser 0-7 + + for (int i = 0; i<1; i++) + { + + adc_write(I2C_Slave_Add,0x00); + Thread.Sleep(10); //Sleep for 5 milli. - must! otherwise read 0xff (See data sheet ) + + stubManager.Write("\nPage 0x00 #"); + stubManager.Write(i); + stubManager.Write("\t- The Buffer is: "); + adc_set_for_read_ch(I2C_Slave_Add, 0x00); + //Thread.Sleep(1); //Sleep for 10 milli. + adc_read_ch(I2C_Slave_Add); + + Thread.Sleep(1000); + + } +} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/progress_test.pproj b/Software/Stubs Collection/stubs/Scripts/progress_test.pproj new file mode 100644 index 000000000..29d02caa2 --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/progress_test.pproj @@ -0,0 +1 @@ +{"$id":"1","Name":"untitled","Description":null,"Scripts":{"$id":"2","$values":[{"$id":"3","Name":"Program.csx","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Entities;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n context.AddResult(ResultType.Passed, \"My Value Name\", \"Test for this value has passed.\");\r\n\t\t\r\nfor (int i=0;i<10;i++)\r\n{\r\n Thread.Sleep(10000);\r\n context.UpdateProgress(\"11111\",true,i,10);\r\n\t}\t\r\n }\r\n}","IsEntryPoint":true},{"$id":"4","Name":"Service.csx","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Entities;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[]},"Variables":{"$id":"6","$values":[]},"ReferenceAssemblies":{"$id":"7","$values":[{"$id":"8","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"9","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"10","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"11","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"12","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"13","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"14","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"15","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"16","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"17","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"18","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Resources":{"$id":"19","$values":[]},"Dialogs":{"$id":"20","$values":[]},"ID":"b99ea8ff-f5ff-44d5-8b33-4b534a14647b","ApartmentState":"STA"} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Scripts/test halt.cs b/Software/Stubs Collection/stubs/Scripts/test halt.cs new file mode 100644 index 000000000..289eb612a --- /dev/null +++ b/Software/Stubs Collection/stubs/Scripts/test halt.cs @@ -0,0 +1,24 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +public void OnExecute(StubManager stubManager) +{ + +//CF - initialize FFS +//DF - reset +ProgressRequest progressRequest = new ProgressRequest(); +progressRequest.Amount = 0xAD9; +progressRequest.Delay = 0xAD9; + + var response = stubManager.Run(progressRequest); + +} \ No newline at end of file diff --git a/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs b/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs index 5b2cfdc0d..0f8794799 100644 --- a/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs +++ b/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs @@ -35,8 +35,8 @@ configurationParameters.CloseValveTimeout = 20; configurationParameters.OpenValveTimeout = 20; //backlash after filling - target pressure, timoeout, time staps (speed will be added in general parameters) -configurationParameters.InitialDispenserPressure = 3.85; //used for initial pre-run pressure -configurationParameters.InitialDispenserTimeout = 120000; ////used for initial pre-run number of steps +configurationParameters.InitialDispenserPressure = 3.85; //used for initial pre-run maximal pressure +configurationParameters.InitialDispenserTimeout = 120000; ////used for initial pre-run target number of steps configurationParameters.InitialDispenserTimeLag = 100; //job prepare - build pressure in dispensers - target pressure, timoeout, time staps, speed @@ -108,7 +108,7 @@ configurationParameters.GeneralParameters.Add(checkCurrentAlarms); /*3*/ Double checkTamperAlarms = new Double(); -checkTamperAlarms = 0.0; +checkTamperAlarms = 1.0; configurationParameters.GeneralParameters.Add(checkTamperAlarms); /*4*/ -- cgit v1.3.1 From 9681a00cba155433351209abe8ed460beb86c1ce Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Sun, 6 Sep 2020 15:58:13 +0300 Subject: fix overall temperature bug #3577 --- Software/Embedded_SW/Embedded/Modules/General/MachineStatus.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/General/MachineStatus.c b/Software/Embedded_SW/Embedded/Modules/General/MachineStatus.c index 28ad81a6c..14bcbb5ba 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/MachineStatus.c +++ b/Software/Embedded_SW/Embedded/Modules/General/MachineStatus.c @@ -57,6 +57,8 @@ int MachineUpdateResponseFunc(void) MachineStatus.n_idspackslevels = 0; MachineStatus.idspackslevels = (IDSPackLevel**)my_malloc(sizeof(IDSPackLevel *)*8); MachineStatus.has_spoolstate = true; + MachineStatus.has_overalltemperature = true; + MachineStatus.overalltemperature = (max(MillisecGetTemperatures(TEMP_SENSE_AN_ENCLOSURETEMP1),MillisecGetTemperatures(TEMP_SENSE_AN_ENCLOSURETEMP2)))/100; if (FPGA_Read_limit_Switches(GPI_SW_SPOOL_EXISTS)==LIMIT) { MachineStatus.spoolstate = SPOOL_STATE__Absent; @@ -84,7 +86,6 @@ int MachineUpdateResponseFunc(void) IDS_Level[i].midtanklevel = Get_MidTank_Pressure_Sensor(i); MachineStatus.idspackslevels[MachineStatus.n_idspackslevels] = &IDS_Level[i]; MachineStatus.n_idspackslevels++; - MachineStatus.overalltemperature = max(MillisecGetTemperatures(TEMP_SENSE_AN_ENCLOSURETEMP1),MillisecGetTemperatures(TEMP_SENSE_AN_ENCLOSURETEMP2)); } } else -- cgit v1.3.1 From 9c649a987773d50549c820a29fbb5b078c15a6aa Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Sun, 6 Sep 2020 17:00:59 +0300 Subject: bug fix - excluded mixer heaters together with the head heaters --- .../Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c index 783e337cc..af68d57b4 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c @@ -223,17 +223,17 @@ void initializeArrays(void) /* HeaterId2PT100Id[HEATER_TYPE__HeaterZone4] = HEAD_PT100_ZONE_4_0X82_1; HeaterId2PT100Id[HEATER_TYPE__HeaterZone5] = HEAD_PT100_ZONE_5_0X84_0; - HeaterId2PT100Id[HEATER_TYPE__HeaterZone6] = HEAD_PT100_ZONE_6_0X84_1; + HeaterId2PT100Id[HEATER_TYPE__HeaterZone6] = HEAD_PT100_ZONE_6_0X84_1;*/ HeaterId2PT100Id[HEATER_TYPE__MixerHeater] = HEAD_PT100_MIXER_0X8E_0; - HeaterId2PT100Id[HEATER_TYPE__HeaterZone7] = HEAD_PT100_ZONE_7_0X86_0; + /*HeaterId2PT100Id[HEATER_TYPE__HeaterZone7] = HEAD_PT100_ZONE_7_0X86_0; HeaterId2PT100Id[HEATER_TYPE__HeaterZone8] = HEAD_PT100_ZONE_8_0X86_1; HeaterId2PT100Id[HEATER_TYPE__HeaterZone9] = HEAD_PT100_ZONE_9_0X88_0; HeaterId2PT100Id[HEATER_TYPE__HeaterZone10] = HEAD_PT100_ZONE_10_0X88_1; HeaterId2PT100Id[HEATER_TYPE__HeaterZone11] = HEAD_PT100_ZONE_11_0X8A_0; HeaterId2PT100Id[HEATER_TYPE__HeaterZone12] = HEAD_PT100_ZONE_12_0X8A_1; */ - HeaterId2PT100Id[HEATER_TYPE__HeadCoverHeater1] = HEAD_PT100_ZONE_11_0X8A_0; //HEAD_PT100_AIR_HEATER_2_0X8C_1; - HeaterId2PT100Id[HEATER_TYPE__HeadCoverHeater2] = HEAD_PT100_ZONE_12_0X8A_1; //HEAD_PT100_AIR_HEATER_1_0X8C_0 ; + HeaterId2PT100Id[HEATER_TYPE__HeadCoverHeater1] = HEAD_PT100_AIR_HEATER_2_0X8C_1;//HEAD_PT100_ZONE_11_0X8A_0; + HeaterId2PT100Id[HEATER_TYPE__HeadCoverHeater2] = HEAD_PT100_AIR_HEATER_1_0X8C_0 ;//HEAD_PT100_ZONE_12_0X8A_1; HeaterId2CurrentId[HEATER_TYPE__DryerAirHeater] = NUM_OF_CURRENT_HEATERS; HeaterId2CurrentId[HEATER_TYPE__DryerMainHeater] = HEATER_DRYER_CURRENT_1; @@ -244,9 +244,9 @@ void initializeArrays(void) /* HeaterId2CurrentId[HEATER_TYPE__HeaterZone4] = HEAD_CURRENT_ZONE_4; HeaterId2CurrentId[HEATER_TYPE__HeaterZone5] = HEAD_CURRENT_ZONE_5; - HeaterId2CurrentId[HEATER_TYPE__HeaterZone6] = HEAD_CURRENT_ZONE_6; + HeaterId2CurrentId[HEATER_TYPE__HeaterZone6] = HEAD_CURRENT_ZONE_6;*/ HeaterId2CurrentId[HEATER_TYPE__MixerHeater] = HEAD_CURRENT_MIXER; - HeaterId2CurrentId[HEATER_TYPE__HeaterZone7] = HEAD_CURRENT_ZONE_7; + /*HeaterId2CurrentId[HEATER_TYPE__HeaterZone7] = HEAD_CURRENT_ZONE_7; HeaterId2CurrentId[HEATER_TYPE__HeaterZone8] = HEAD_CURRENT_ZONE_8; HeaterId2CurrentId[HEATER_TYPE__HeaterZone9] = HEAD_CURRENT_ZONE_9; HeaterId2CurrentId[HEATER_TYPE__HeaterZone10] = HEAD_CURRENT_ZONE_10; -- cgit v1.3.1 From 281bd2c6b8faf50f11d1aac3f5d61677f007ad3d Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Sun, 6 Sep 2020 18:45:36 +0300 Subject: clean and improve diagnostics and machine status --- .../Embedded/Drivers/Heater/TemperatureSensor.h | 3 ++ .../Embedded/Modules/Control/MillisecTask.c | 4 +-- .../Embedded/Modules/Diagnostics/Diagnostics.c | 20 ++++++------ .../Embedded/Modules/General/MachineStatus.c | 37 ++++++++++++++++++++-- .../Embedded/Modules/Heaters/Heaters_print.c | 2 -- 5 files changed, 50 insertions(+), 16 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.h b/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.h index 280d67e0c..2dc60b685 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.h +++ b/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.h @@ -11,6 +11,9 @@ #include "include.h" #include "heater.h" +#define MINIMUM_HEATER_READ 9.0 +#define MAXIMUM_HEATER_READ 283 + typedef enum { //Reg Group in Tango_HW_SW.xlsx TEMP_SENSE_ANALOG_MIXCHIP_TEMP, //ANALOG_MIXCHIP_TEMP SSR 11 used for head zone 6 TEMP_SENSE_ANALOG_DYEINGH_TEMP1, //ANALOG_DYEINGH_TEMP1_1 SSR8 Head-Zone 1 diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index c2b4f5298..06434ee50 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -758,7 +758,7 @@ uint32_t MillisecLowLoop(uint32_t tick) { //char Lenstr[160]; //static int Counter = 0; - MachineUpdateResponseFunc(); + //MachineUpdateResponseFunc(); //KeepAliveOneSecondCall(); //TemperatureListString(Lenstr); //ReportWithPackageFilter(ThreadFilter,Lenstr,__FILE__,__LINE__,(int)Counter++,RpWarning,(int) msec_millisecondCounter,0); @@ -814,7 +814,7 @@ uint32_t MillisecLowLoop(uint32_t tick) } if (OneMinute_Tick) { -// MachineUpdateResponseFunc(); + MachineUpdateResponseFunc(); /* for (Motor_i = 0;Motor_i < NUM_OF_MOTORS;Motor_i++) { if (Motor_i == HARDWARE_MOTOR_TYPE__MOTO_SCREW) diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c index 9977c5305..888934584 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c @@ -194,14 +194,14 @@ void DiagnosticsInit(void) DiagnosticsMonitor.dispensersmotorsfrequency = (DoubleArray**)my_malloc(sizeof(DoubleArray *)*MAX_SYSTEM_DISPENSERS); DiagnosticsMonitor.dispenserspressure = (DoubleArray**)my_malloc(sizeof(DoubleArray)*MAX_SYSTEM_DISPENSERS); - DiagnosticsMonitor.midtanksinklevel = (DoubleArray**)my_malloc(sizeof(DoubleArray)*MAX_SYSTEM_DISPENSERS); - DiagnosticsMonitor.dispensersinklevel = (DoubleArray**)my_malloc(sizeof(DoubleArray)*MAX_SYSTEM_DISPENSERS); + //DiagnosticsMonitor.midtanksinklevel = (DoubleArray**)my_malloc(sizeof(DoubleArray)*MAX_SYSTEM_DISPENSERS); + //DiagnosticsMonitor.dispensersinklevel = (DoubleArray**)my_malloc(sizeof(DoubleArray)*MAX_SYSTEM_DISPENSERS); for (i = 0; i Date: Mon, 7 Sep 2020 15:05:44 +0300 Subject: add range check for head blower flow in process parameters --- .../Embedded_SW/Embedded/Modules/General/process.c | 7 ++++--- .../Embedded/Modules/Heaters/Heaters_ex.h | 1 + .../Embedded/Modules/Heaters/Heaters_print.c | 20 ++++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/General/process.c b/Software/Embedded_SW/Embedded/Modules/General/process.c index 7490cef69..e5595a965 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/process.c +++ b/Software/Embedded_SW/Embedded/Modules/General/process.c @@ -41,7 +41,7 @@ double dryerairflow = 5.0; double pressurebuildup = 0; double dryerzone1temp = 0; int32_t tableindex = 0; -double headBlowersFlow[2] = {1.5,1.5}; +double headBlowersFlow[2] = {1.0,1.0}; double dryerbufferMeters = 0; double dryerbufferCentimeters = 0; @@ -304,8 +304,9 @@ uint32_t HandleProcessParameters(ProcessParameters* ProcessParams,bool saveData) { status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__HeadCoverHeater2, false,ProcessParams->lblowertemp); } - headBlowersFlow[HEAD_FAN_RIGHT] = ProcessParams->rblowerflow; - headBlowersFlow[HEAD_FAN_LEFT] = ProcessParams->lblowerflow; + + status |= HeadBlowerCommandRequestMessage(HEAD_FAN_RIGHT, ProcessParams->rblowerflow); + status |= HeadBlowerCommandRequestMessage(HEAD_FAN_LEFT, ProcessParams->lblowerflow); Trigger_HeaterWriting(); } diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h index c428faea3..284b2de6c 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h @@ -49,3 +49,4 @@ double PressureSensorInit(); void HeadBlowersInit(); void HeadBlowersCfg(); void HeadBlowersControlLoop (); +uint32_t HeadBlowerCommandRequestMessage(int blowerId, float flow); diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c index e75d456fc..03b00b0ac 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c @@ -2114,3 +2114,23 @@ double PressureSensorGetPressure(uint8_t SensorId) Q = sqrt(Vm - V0 + 22) * Cp; return Q; } + +uint32_t HeadBlowerCommandRequestMessage(int blowerId, float flow) +{ + if ((blowerId < HEAD_FAN_RIGHT) || (blowerId > HEAD_FAN_LEFT)) { + ReportWithPackageFilter(HeatersFilter,"blowerId not in range",__FILE__,__LINE__,blowerId,RpError, 0,0); + return ERROR; + } +/* + if (HeadBlowerCfg[blowerId].enabled == false) { + ReportWithPackageFilter(HeatersFilter,"HeadBlower not configured",__FILE__,__LINE__,blowerId,RpError, 0,0); + return ERROR; + } +*/ + if ((flow < 0.0) || (flow > 5.0)) { + ReportWithPackageFilter(HeatersFilter,"flow not in range",__FILE__, flow, blowerId,RpError, 0,0); + return ERROR; + } + headBlowersFlow[blowerId] = flow; + return OK; +} -- cgit v1.3.1 From 59186959c774c65bd8689bc8d95aae0cc71af446 Mon Sep 17 00:00:00 2001 From: Ronen Sberlo Date: Tue, 8 Sep 2020 09:54:31 +0300 Subject: change blower cp --- Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Software/Embedded_SW/Embedded/Modules') diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c index 03b00b0ac..3c7248204 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c @@ -117,7 +117,7 @@ uint8_t HeadBlowersCloseLoopTime[2] = {2, 2}; #define DRYER_AIR_PT100 TEMP_SENSE_ANALOG_DRYER_TEMP1 #define DRYER_MAIN_PT100 TEMP_SENSE_ANALOG_DRYER_TEMP2 #define DRYER_SECONDARY_PT100 TEMP_SENSE_ANALOG_DRYER_TEMP3 -#define PRESSURE_SENSOR_CP 0.225 +#define PRESSURE_SENSOR_CP 0.269 extern uint16_t Head_Fan_Tach[2]; extern uint8_t Head_Fan_PWM_Command[2]; -- cgit v1.3.1