diff options
| author | Avi Levkovich <avi@twine-s.com> | 2020-07-13 18:26:20 +0300 |
|---|---|---|
| committer | Avi Levkovich <avi@twine-s.com> | 2020-07-13 18:26:20 +0300 |
| commit | 6908c13314f00030dd039d003aaf6193bdb0f28b (patch) | |
| tree | 5eee7e648541f0f1f971a9e7a33614bacd0adf1a | |
| parent | 5f72798aaff5d2200c939f522bcc92ff7471d2af (diff) | |
| parent | ebdba4dd5bb09f3bbefcd774931153346041dabc (diff) | |
| download | Tango-6908c13314f00030dd039d003aaf6193bdb0f28b.tar.gz Tango-6908c13314f00030dd039d003aaf6193bdb0f28b.zip | |
merge
112 files changed, 2596 insertions, 1112 deletions
diff --git a/Software/DB/Tango.mdf b/Software/DB/Tango.mdf Binary files differindex b8e49d61a..0d73c39e0 100644 --- a/Software/DB/Tango.mdf +++ b/Software/DB/Tango.mdf diff --git a/Software/DB/Tango_log.ldf b/Software/DB/Tango_log.ldf Binary files differindex 0ff918d2f..f22a84182 100644 --- a/Software/DB/Tango_log.ldf +++ b/Software/DB/Tango_log.ldf diff --git a/Software/Embedded_SW/Embedded/.cproject b/Software/Embedded_SW/Embedded/.cproject index 33288a248..0bc7dc368 100644 --- a/Software/Embedded_SW/Embedded/.cproject +++ b/Software/Embedded_SW/Embedded/.cproject @@ -441,7 +441,7 @@ </toolChain> </folderInfo> <sourceEntries> - <entry excluding="Drivers/I2C_Communication/Head_Card/ADC/Head_ADC_old.c|EmbParam.cfg|JigCommands.c|PWM.c|USBCDCD.c|Message.c|Pin_config.c|src|Configuration.c|SlowMotors.c|Timer.c|Communication.c|FastMotors.c|ADCUtils.c|Drivers/L6470|Pin.c|ADCLogger.c|Flashstore.c|Profile.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> + <entry excluding="EmbParam.cfg|Drivers/Uart_Comm/Uart.c|JigCommands.c|PWM.c|USBCDCD.c|Message.c|Pin_config.c|src|Configuration.c|SlowMotors.c|Timer.c|Communication.c|FastMotors.c|ADCUtils.c|Drivers/L6470|Pin.c|ADCLogger.c|Flashstore.c|Profile.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> </sourceEntries> </configuration> </storageModule> 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 60707d0cb..beeb86c92 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,33}; +TangoVersion_t _gTangoVersion = {1,4,6,35}; #define BUILD_DATE __DATE__ char Dat[50] = BUILD_DATE; char _gTangoName [MAX_STRING_LEN] = "Tango01 ";//d diff --git a/Software/Embedded_SW/Embedded/DataDef.h b/Software/Embedded_SW/Embedded/DataDef.h index 4c74839a1..4b6bdc129 100644 --- a/Software/Embedded_SW/Embedded/DataDef.h +++ b/Software/Embedded_SW/Embedded/DataDef.h @@ -20,7 +20,7 @@ #define NO_INITIAL_HEATING #define MAX_STRING_LEN 255 //Embedded version + filter.c -//#define WATCHDOG +#define WATCHDOG //#define DISPESER_TEST //#define FPGA_WATCHDOG_DISABLE diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/EEPROM/Head_EEPROM.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/EEPROM/Head_EEPROM.c index d7f0c8277..0d767b864 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/EEPROM/Head_EEPROM.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/EEPROM/Head_EEPROM.c @@ -121,7 +121,7 @@ uint32_t Check_Head_Type_Via_EEPROM() if (status == 0xFF) { ACTIVITY_RED_LED_ON; - AlarmHandlingSetAlarm(EVENT_TYPE__POWER_UP_BIT_FAILURE, true); + //AlarmHandlingSetAlarm(EVENT_TYPE__POWER_UP_BIT_FAILURE, true); } if((Head_i2c_status == I2C_MASTER_ERR_ADDR_ACK)||(status == 0xFF)) diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Heaters/Head_Heaters.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Heaters/Head_Heaters.c index a5c9376d2..d73fbcdba 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Heaters/Head_Heaters.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Heaters/Head_Heaters.c @@ -13,6 +13,7 @@ bool HeaterMap[HEADCARD_HIT_MIXER+1] = {0}; +uint8_t OT_Heater_Index = 0;IN_Heater_Index = 0; uint32_t Activate_Head_Card_Heaters(HEADCARD_HEATERS_ENUM Head_Heater_ID) { uint32_t status= OK; @@ -40,15 +41,15 @@ uint32_t Deactivate_Head_Card_Heaters(HEADCARD_HEATERS_ENUM Head_Heater_ID) HeaterMap[Head_Heater_ID] &= ~(1 << Head_Heater_ID); if(Head_Heater_ID <= HEADCARD_UPPER_HIT_IN4) - { - Head_I2C_EXP1_0x40.ushort &= ~(1 << Head_Heater_ID); - } - else if(Head_Heater_ID <= HEADCARD_HIT_MIXER) - { - Head_I2C_EXP2_0x42.ushort &= ~(1 << (Head_Heater_ID - 16)); - } - else - status = ERROR; + { + Head_I2C_EXP1_0x40.ushort &= ~(1 << Head_Heater_ID); + } + else if(Head_Heater_ID <= HEADCARD_HIT_MIXER) + { + Head_I2C_EXP2_0x42.ushort &= ~(1 << (Head_Heater_ID - 16)); + } + else + status = ERROR; return status; } @@ -66,6 +67,38 @@ uint32_t Write_Head_Card_Heaters_Commands() Report(" Write_Head_Card_Heaters",__FILE__,__LINE__,255,RpWarning,0,0); if (status) ReadFailures++; + if ((IN_Heater_Index)&&(IN_Heater_Index<=4)) + { + switch (IN_Heater_Index) + { + case 2: + Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN2 = true; + break; + case 3: + Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN3 = true; + break; + case 4: + Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN4 = true; + break; + } + IN_Heater_Index++; + } + if ((OT_Heater_Index)&&(OT_Heater_Index<=4)) + { + switch (OT_Heater_Index) + { + case 2: + Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT2 = true; + break; + case 3: + Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT3 = true; + break; + case 4: + Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT4 = true; + break; + } + OT_Heater_Index++; + } return status; } @@ -137,34 +170,65 @@ uint32_t HeadCard_Control_Heaters(HEADCARD_HEATERS_ENUM Heater_ID, bool Pwr_Cmd) break; case HEADCARD_UPPER_HIT_IN1: Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN1 = Pwr_Cmd; + IN_Heater_Index = (Pwr_Cmd)?1:0; //status |= Head_Write_IO_Reg(0x40,HIGH); // break; // case HEADCARD_UPPER_HIT_IN2: + if (Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN2 == Pwr_Cmd) Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN2 = Pwr_Cmd; + else + if (Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN2 == true) + Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN2 = false; //status |= Head_Write_IO_Reg(0x40,HIGH); // break; // case HEADCARD_UPPER_HIT_IN3: + if (Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN3 == Pwr_Cmd) Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN3 = Pwr_Cmd; + else + if (Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN3 == true) + Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN3 = false; + //Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN3 = false; //status |= Head_Write_IO_Reg(0x40,HIGH); // break; // case HEADCARD_UPPER_HIT_IN4: + if (Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN4 == Pwr_Cmd) Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN4 = Pwr_Cmd; + else + if (Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN4 == true) + Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN4 = false; + //Head_I2C_EXP1_0x40.bits.OUTPUT_ON_HTIN4 = false; //status |= Head_Write_IO_Reg(0x40,HIGH); break; case HEADCARD_UPPER_HIT_OUT1: Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT1 = Pwr_Cmd; + OT_Heater_Index = (Pwr_Cmd)?1:0; //status |= Head_Write_IO_Reg(0x42,LOW); // break; // case HEADCARD_UPPER_HIT_OUT2: - Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT2 = Pwr_Cmd; + if (Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT2 == Pwr_Cmd) + Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT2 = Pwr_Cmd; + else + if (Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT2 == true) + Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT2 = false; + //Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT2 = false; //status |= Head_Write_IO_Reg(0x42,LOW); // break; // case HEADCARD_UPPER_HIT_OUT3: - Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT3 = Pwr_Cmd; + if (Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT3 == Pwr_Cmd) + Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT3 = Pwr_Cmd; + else + if (Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT3 == true) + Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT3 = false; + //Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT3 = false; //status |= Head_Write_IO_Reg(0x42,LOW); // break; // case HEADCARD_UPPER_HIT_OUT4: - Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT4 = Pwr_Cmd; + if (Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT4 == Pwr_Cmd) + Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT4 = Pwr_Cmd; + else + if (Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT4 == true) + Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT4 = false; + //Head_I2C_EXP2_0x42.bits.OUTPUT_ON_HTOT4 = false; //status |= Head_Write_IO_Reg(0x42,LOW); break; case HEADCARD_HIT_MIXER: diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/I2C_Comm.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/I2C_Comm.c index 4289c1794..69be5a330 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/I2C_Comm.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/I2C_Comm.c @@ -22,6 +22,9 @@ #include "i2c_fifo.h" #include "i2c.h" +uint32_t LastReadI2C_BASE; unsigned char LastReadaddr; unsigned char* LastReaddata; unsigned int LastReadlen; +uint32_t LastWriteI2C_BASE; unsigned char LastWriteaddr; unsigned char *LastWritedata; unsigned int LastWritelen; +Task_Handle TaskId; uint32_t Arb_Loss_Count = 0; //***************************************************************************** @@ -36,6 +39,7 @@ uint32_t Arb_Loss_Count = 0; //! \b false. //***************************************************************************** +char I2CErrMsg[181]; uint32_t I2C_WriteBuff(uint32_t I2C_BASE, unsigned char addr, unsigned char* data, unsigned int len) { uint32_t status = OK; @@ -179,11 +183,31 @@ uint32_t I2C_Write(uint32_t I2C_ID, uint32_t Slave_Add, uint8_t *I2C_Write_buf, //Byte2Write = Byte2Write & 0xFF; - /*if(No_BytesToWrite <= 2) { + status = I2C_WriteBuff(I2C_BASE, Slave_Add, I2C_Write_buf, No_BytesToWrite); + //status = I2C_WriteFifo(I2C_BASE, Slave_Add, buff, No_BytesToWrite); + /*if(No_BytesToWrite <= 2) + { status = I2C_WriteBuff(I2C_BASE, Slave_Add, I2C_Write_buf, No_BytesToWrite); - } else { + } + else + { status = I2C_WriteFifo(I2C_BASE, Slave_Add, buff, No_BytesToWrite); }*/ + if (status == OK) + { + //LastWriteI2C_BASE = I2C_BASE; + LastWriteaddr = Slave_Add; + LastWritedata = buff; + LastWritelen = No_BytesToWrite; + TaskId = Task_self(); + } + else + { + usnprintf(I2CErrMsg, 180, "I2C Err write 0x%x 0x%x, last good read 0x%x, %d, write 0x%x, %d, T 0x%x 0x%x",status,Slave_Add, + LastReadaddr, LastReadlen, + LastWriteaddr, LastWritelen, Task_self(),TaskId); + Report(I2CErrMsg, __FILE__, __LINE__, status, RpWarning, Slave_Add, 0); + } //uint32_t I2C_W_buf[256] = {0},i; @@ -192,7 +216,6 @@ uint32_t I2C_Write(uint32_t I2C_ID, uint32_t Slave_Add, uint8_t *I2C_Write_buf, // I2C_W_buf[i] = request->bytestwrite[i]; // } - status = I2C_WriteBuff(I2C_BASE, Slave_Add, I2C_Write_buf, No_BytesToWrite); if (status) { if (Arb_Loss_Count++ >= 5) @@ -255,6 +278,22 @@ uint32_t I2C_Read(uint32_t I2C_ID, uint32_t Slave_Add, uint8_t *I2C_Read_buf, ui } } + if (status == OK) + { + //LastReadI2C_BASE = I2C_BASE; + LastReadaddr = Slave_Add; + LastReaddata = buff; + LastReadlen = No_BytesToRead; + TaskId = Task_self(); + } + else + { + usnprintf(I2CErrMsg, 180, "I2C Err read 0x%x 0x%x, last good read 0x%x, %d, write 0x%x, %d, T 0x%x 0x%x",status,Slave_Add, + LastReadaddr, LastReadlen, + LastWriteaddr, LastWritelen, Task_self(),TaskId); + Report(I2CErrMsg, __FILE__, __LINE__, status, RpWarning, Slave_Add, 0); + } + /*else { if (Arb_Loss_Count) diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/Cartridges/Cartridges.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/Cartridges/Cartridges.c deleted file mode 100644 index 8d11589be..000000000 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/Cartridges/Cartridges.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Cartridges.c - * - * Created on: Jun 29, 2020 - * Author: avi - */ -#include "include.h" -#include "DataDef.h" -#include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h" - -typedef enum -{ - UPPER_CART, - LOWER_CART, - UNKNOWN_CART,//at power up - NONE_CART,//NA -}WASTE_ID; - -//WASTE_ID Waste_Id; - -typedef enum -{ - CART_UNKNOWN,//after power-up... - CART_OUT, - CART_IN, - CART_SELECTED, -}CART_STATE; - -typedef enum -{ - CART_INIT,//unknown, acquire info, decide - CART_IDLE,//empty + valid (RFID tag OK), ready to use - CART_FULL, - CART_EMPTYING, - CART_EMPTYING_PAUSED, - CART_BLOCKED,//RFID FAILED ... -}CART_STATUS;// mode - -typedef struct -{ - CART_STATE State; - uint8_t RFID_Legality; - double Leval;//waste tank level mili litters - uint8_t Warnings;//empty / full / overflow - bool Emptying_Process;// YES / NO - uint8_t Emptying_Duration; //if Emptying_Process YES -}WASTE_HANDLING; - -typedef struct -{ - uint8_t Door; // OPEN / CLOSE / unknown - uint8_t Waste_Active; // CART_2 / CART_3 / NONE - WASTE_HANDLING Waste_Handling[2]; -}CART_HANDLING; - -CART_HANDLING Cart_Handling; - -void cartWaste_Init() -{ - //Initial state - OUT - Cart_Handling.Waste_Handling[UPPER_CART].State = CART_UNKNOWN; - Cart_Handling.Waste_Handling[LOWER_CART].State = CART_UNKNOWN; - - Pannel_Leds(CART_2,MODE_OFF); - Pannel_Leds(CART_3,MODE_OFF); - - Cart_Handling.Door = UNKNOWN; - Cart_Handling.Waste_Active = NONE_CART; -} - -void cartCart_door()//Polled by polling function. Notify waste. Poll each 1 second. During active filling poll each 100msec -{ - if(Get_COVER_1_State(CartridgesDoor))//to check the polarity - { - Cart_Handling.Door = OPEN; - } - else - { - Cart_Handling.Door = CLOSE; - } -} - -void cartCART_INSERTED(WASTE_ID CartId) //every 1 sec. -{ - switch(CartId) - { - case UPPER_CART: - if(Is_Cartridge_Present(CART_2) == true) - { - Cart_Handling.Waste_Handling[UPPER_CART].State = CART_IN; - Pannel_Leds(CART_2,MODE_ON); - } - break; - case LOWER_CART: - if(Is_Cartridge_Present(CART_3) == true) - { - Cart_Handling.Waste_Handling[LOWER_CART].State = CART_IN; - Pannel_Leds(CART_3,MODE_ON); - } - break; - default: - break; - } -} - -void cartCART_EXTRACTED(WASTE_ID CartId) -{ - if(Cart_Handling.Waste_Active == CART_SELECTED) - { - #warning notify waste module - } - - Cart_Handling.Waste_Handling[CartId].State = CART_OUT; - - switch(CartId) - { - case UPPER_CART: - if(Is_Cartridge_Present(CART_2) == false) - { - Pannel_Leds(CART_2,MODE_OFF); - } - break; - case LOWER_CART: - if(Is_Cartridge_Present(CART_3) == false) - { - Pannel_Leds(CART_3,MODE_OFF); - } - break; - default: - break; - } -} diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.c index 29698239a..f7d734536 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.c @@ -554,7 +554,7 @@ double CalculateWHSWasteTankLevelMiliLiter() waste_volume_milliliter = Vm_ml -LocalV0_ml; } //ReportWithPackageFilter(WasteFilter,"------------ waste_volume_ml -----------------", __FILE__, __LINE__, 0, RpMessage, (int)(waste_volume_milliliter), 0); - Report("------------ get waste level in ml -----------------", __FILE__, __LINE__, 0, RpMessage, (int)(waste_volume_milliliter), 0); + Report("------------ get waste level in ml -----------------", __FILE__, LocalV0_ml, Vm_ml, RpMessage, (int)(waste_volume_milliliter), 0); return waste_volume_milliliter; } @@ -578,13 +578,13 @@ bool waste_seq_cont() case Open_Valve: Set_WHS_valve(VOC_VALVE, OPEN, 0); Write_WHS_Valve_reg(); - Report("------------ waste level procedure open -----------------", __FILE__, WasteAverageIndex, OpenClose, RpMessage, (int)(waste_level_ml), 0); + //Report("------------ waste level procedure open -----------------", __FILE__, WasteAverageIndex, OpenClose, RpMessage, (int)(waste_level_ml), 0); OpenClose = Close_Valve; break; case Close_Valve: Set_WHS_valve(VOC_VALVE, CLOSE, 0); Write_WHS_Valve_reg(); - Report("------------ waste level procedure close ----------------", __FILE__, WasteAverageIndex, OpenClose, RpMessage, (int)(waste_level_ml), 0); + //Report("------------ waste level procedure close ----------------", __FILE__, WasteAverageIndex, OpenClose, RpMessage, (int)(waste_level_ml), 0); OpenClose = Read_Waste; break; case Read_Waste: @@ -607,7 +607,7 @@ bool waste_seq_cont() WasteCounter = 0; waste_level_ml = avg/8; - Report("------------ Avg waste level in ml -----------------", __FILE__, WasteAverageIndex, OpenClose, RpMessage, (int)(waste_level_ml), 0); + Report("------------ Avg waste level in ml -----------------", __FILE__, WasteAverageIndex, avg, RpMessage, (int)(waste_level_ml), 0); } return status; } @@ -673,7 +673,7 @@ bool waste_seq_step1_cont() Trigger_SetWHS_VOC_Valve(OPEN); - //WasteControlId = AddControlCallback(NULL, Trigger_ReadWHS_WasteContinouos, WASTE_PROCESS_TIME, TemplateDataReadCBFunction,0,0, 0 ); + WasteControlId = AddControlCallback(NULL, Trigger_ReadWHS_WasteContinouos, WASTE_PROCESS_TIME, TemplateDataReadCBFunction,0,0, 0 ); Report("------------ waste_seq_step1_cont -----------------", __FILE__, __LINE__, WasteControlId, RpMessage, 0, 0); return status; @@ -704,7 +704,7 @@ bool waste_seq_step1() WasteCounter = 0; OpenClose = CLOSE; - ReportWithPackageFilter(WasteFilter,"------------ open waste level Air valve -----------------", __FILE__, __LINE__, 0, RpMessage, 0, 0); + Report("------------ open waste level Air valve -----------------", __FILE__, __LINE__, WHS_Eeprom.bytes.Orifice_Waste_Level_V0_ml, RpMessage, 0, 0); Trigger_SetWHS_VOC_Valve(OPEN); ReportWithPackageFilter(WasteFilter,"------------ wait 1 second -----------------", __FILE__, __LINE__, 0, RpMessage, 0, 0); diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c index 3f50f9898..92f24e083 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c @@ -469,6 +469,7 @@ bool WHS_Set_Blower_Control_Closed_Loop(double Q_value) Valve_Set(IDS_Id_to_AirValve[midtank_cleared], Atm_MidTank_ON ); //Atm_MidTank_OFF/ON Valve_Set(IDS_Id_to_CartrideValve[midtank_cleared], Atm_MidTank_ON ); //Atm_MidTank_OFF/ON } + return OK; } else { diff --git a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c index 356f192a3..1c2b6662d 100644 --- a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c +++ b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c @@ -652,6 +652,9 @@ JobEndReasonEnum getEndReason(uint32_t AlarmId) usnprintf(AlarmReasonStr, 100, "Alarm %d type %d caused a job stop",AlarmId,AlarmItem[AlarmId].EventType); return JOB_OTHER_ALARM; } + case ALARM_SOURCE_TYPE__FluidLevelAlarm: + usnprintf(AlarmReasonStr, 100, "Midtank %d is empty",AlarmItem[AlarmId].DeviceId); + return JOB_OUT_OF_DYE; default: usnprintf(AlarmReasonStr, 100, "Alarm %d type %d caused a job stop",AlarmId,AlarmItem[AlarmId].EventType); return JOB_OTHER_ALARM; @@ -993,6 +996,8 @@ JobEndReasonEnum AlarmHandlingPrepareJob(void *CurrentJob) if (FoundReason != JOB_OK) { JobEndReason = getEndReason(AlarmId); + if (JobEndReason!=FoundReason) + ReportWithPackageFilter(AlarmFilter,"end reason mismatch!!!", __FILE__,AlarmId,JobEndReason, RpMessage, FoundReason, 0); //AbortJob(AlarmReasonStr); //PrepareReady(Module_Alarms,ModuleFail); ReportWithPackageFilter(AlarmFilter,AlarmReasonStr, __FILE__,__LINE__,AlarmId, RpMessage, DEBUG_LOG_CATEGORY__Error, 0); diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index 5f9c3130b..4ad5336d9 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -43,6 +43,7 @@ #include "modules/thread/thread_ex.h" #include "modules/ifs/ifs.h" #include "modules/ids/ids_ex.h" +#include "modules/waste/waste_ex.h" #include "modules/Diagnostics/Diagnostics.h" #include "Modules/General/MachineStatus.h" @@ -658,7 +659,6 @@ uint32_t MillisecLowLoop(uint32_t tick) #ifndef EVALUATION_BOARD Read_Buttons_Reg(); #endif - //Ink_Cart_Led(); /////////////////////////////////////////////////////////////////// @@ -766,6 +766,8 @@ uint32_t MillisecLowLoop(uint32_t tick) } */ } + //call waste state machine + Waste_StateMachine_OneSecond_Call(); } if (Tensecond_Tick) { diff --git a/Software/Embedded_SW/Embedded/Modules/Control/control.c b/Software/Embedded_SW/Embedded/Modules/Control/control.c index 0f9848ba1..26fba0194 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/control.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/control.c @@ -170,6 +170,7 @@ void ControlStop(void) ControlRestart = false; ADCAcquireStop(); } +int FPGA_ReInit_Count = 0; ///avoid too many reinitializations of motors as happens when FPGA is corrupted uint32_t ControlActivityLed( uint32_t Parameter1) { static bool flag = false; @@ -192,11 +193,14 @@ uint32_t ControlActivityLed( uint32_t Parameter1) SendJobProgress(0.0,0,false, "Hardware Failure Error"); AbortJob("FPGA Watchdog Error"); } - ReportWithPackageFilter(FPGAFilter, "FPGA Watchdog Error",__FILE__,__LINE__,0,RpError, 0,0); + if (FPGA_ReInit_Count++<20) + { + ReportWithPackageFilter(FPGAFilter, "FPGA Watchdog Error",__FILE__,__LINE__,0,RpError, 0,0); - ACTIVITY_GREEN_LED_ON; - FPGA_SetMotorsInit(); - Motor_ReconfigAllMotors(); + ACTIVITY_GREEN_LED_ON; + FPGA_SetMotorsInit(); + Motor_ReconfigAllMotors(); + } } } else diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c index 849d1cd9b..8e01fe18e 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c @@ -115,7 +115,7 @@ double dispenserinklevel[MAX_SYSTEM_DISPENSERS][1]; double midtankinklevel[MAX_SYSTEM_DISPENSERS][1]; double MidTankpressure[MAX_SYSTEM_DISPENSERS][1]; double HeadFlowMeter; -double tempFlow = 0.0; +//double tempFlow = 0.0; double DrierFlowMeter; double AcVoltage; double WasteLevel = 0.0; @@ -819,11 +819,11 @@ void DiagnosticOneMinuteCollection(void) DiagnosticsMonitor.dryerairflow = &DrierFlowMeter; HeadFlowMeter = GetWHSAirFlow(HEAD_FLOW_METER); - if (fabs(tempFlow - HeadFlowMeter)>0.05) + /*if (fabs(tempFlow - HeadFlowMeter)>0.05) { Report("Head flow change 1m",__FILE__,(int)diagvoltage,(int)(tempFlow*1000),RpWarning,(int)(HeadFlowMeter*1000),0); tempFlow = HeadFlowMeter; - } + }*/ DiagnosticsMonitor.n_headairflow = 1; DiagnosticsMonitor.headairflow = &HeadFlowMeter; @@ -858,11 +858,11 @@ void DiagnosticOneSecCollection(void) HeadFlowMeter = GetWHSAirFlow(HEAD_FLOW_METER); DiagnosticsMonitor.n_headairflow = 1; DiagnosticsMonitor.headairflow = &HeadFlowMeter; - if (fabs(tempFlow - HeadFlowMeter)>0.25) + /*if (fabs(tempFlow - HeadFlowMeter)>0.25) { Report("Head flow change 1s",__FILE__,(int)diagvoltage,(int)(tempFlow*1000),RpWarning,(int)(HeadFlowMeter*1000),0); tempFlow = HeadFlowMeter; - } + }*/ WasteLevel = GetWHSWasteTankLevelMiliLiter()/1000;//change from ml to litter static double InitCounter = 0; if (GetMachineState()<MACHINE_STATE_NO_PROCESS_PARAMS) diff --git a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c index 6d4d1c668..27ed8d0e9 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c +++ b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c @@ -165,8 +165,12 @@ uint32_t HWConfigurationInit(void) #ifndef DISPESER_TEST if (WHS_Type == WHS_TYPE_NEW) newWHS_init(); - WHS_init(); + //WHS_init(); // remove call to old WHS #endif + + // Waste Init (WHS) + Waste_Init(); + ADC_MUX_Init(); GeneralHwReady = true; @@ -554,7 +558,6 @@ uint32_t HWConfiguration(UploadHardwareConfigurationRequest* UploadRequest) } ControlStart(); AlarmHandlingStart(); - //ThreadInitialTestStub(request); GeneralHwReady = true; STATUS_RED_LED_OFF; return OK; diff --git a/Software/Embedded_SW/Embedded/Modules/General/Safety.c b/Software/Embedded_SW/Embedded/Modules/General/Safety.c index 400b083e4..89ac8d020 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/Safety.c +++ b/Software/Embedded_SW/Embedded/Modules/General/Safety.c @@ -46,7 +46,7 @@ uint32_t Safety_Main_State(uint32_t IfIndex, uint32_t BusyFlag) bool mDrierDoorAlarmState = false; bool mAirFlowAlarmState = false; bool mAirFilterAlarmState = false; - bool mWasteOverflowAlarmState = false; + //bool mWasteOverflowAlarmState = false; #ifdef CONTROL_DEBUG uint32_t tempp,tempq,delta; uint32_t sys_ticks_start = msec_millisecondCounter,sys_ticks_end,max = 0,dev = 0; @@ -91,16 +91,6 @@ uint32_t Safety_Main_State(uint32_t IfIndex, uint32_t BusyFlag) mDrierDoorAlarmState = true; DrierDoorAlarmState = true; } - else - { - //if (WHS_GPI_WASTE_OVERFULL()) - cannot read this switch - { - //report and handle waste overflow - AlarmHandlingSetAlarm(EVENT_TYPE__WASTE_CONTAINER_OVERFLOW, true); - mWasteOverflowAlarmState = true; - WasteOverflowAlarmState = true; - } - } } } @@ -234,12 +224,6 @@ uint32_t Safety_Main_State(uint32_t IfIndex, uint32_t BusyFlag) AlarmHandlingSetAlarm(EVENT_TYPE__AIR_FILTER_NOT_INSTALLED, false); AirFilterAlarmState = mAirFilterAlarmState; } - if ((mWasteOverflowAlarmState != WasteOverflowAlarmState)|| (mWasteOverflowAlarmState == false)) - { - //alarm went off - AlarmHandlingSetAlarm(EVENT_TYPE__WASTE_CONTAINER_OVERFLOW, false); - WasteOverflowAlarmState = mWasteOverflowAlarmState; - } #ifdef CONTROL_DEBUG tempq = HibernateRTCSSGet(); if (tempq < tempp) diff --git a/Software/Embedded_SW/Embedded/Modules/General/buttons.c b/Software/Embedded_SW/Embedded/Modules/General/buttons.c index f81cfb88f..328ff3203 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/buttons.c +++ b/Software/Embedded_SW/Embedded/Modules/General/buttons.c @@ -691,34 +691,6 @@ return OK; return OK; }*/ -void Ink_Cart_Led()//temporary for ITMA -{ - if(Is_Cartridge_Present(CART_1) == true) - { - Pannel_Leds( CART_1, MODE_ON); - } - else - { - Pannel_Leds( CART_1, MODE_OFF); - } - if(Is_Cartridge_Present(CART_2) == true) - { - Pannel_Leds( CART_2, MODE_ON); - } - else - { - Pannel_Leds( CART_2, MODE_OFF); - } - if(Is_Cartridge_Present(CART_3) == true) - { - Pannel_Leds( CART_3, MODE_ON); - } - else - { - Pannel_Leds( CART_3, MODE_OFF); - } -} - void test_avi() { diff --git a/Software/Embedded_SW/Embedded/Modules/General/process.c b/Software/Embedded_SW/Embedded/Modules/General/process.c index 968522e48..bf7d761dd 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/process.c +++ b/Software/Embedded_SW/Embedded/Modules/General/process.c @@ -200,6 +200,7 @@ uint32_t HandleProcessParameters(ProcessParameters* ProcessParams,bool saveData) } if(Head_Type != HEAD_TYPE_STAPLE_SPUN) { + Trigger_HeaterWriting(); if (ProcessParams->headzone4temp>1) { status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ4, true,ProcessParams->headzone4temp); @@ -239,6 +240,7 @@ uint32_t HandleProcessParameters(ProcessParameters* ProcessParams,bool saveData) { status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ7, false,ProcessParams->headzone7temp); } + Trigger_HeaterWriting(); if (ProcessParams->headzone8temp>1) { status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ8, true,ProcessParams->headzone8temp); @@ -263,6 +265,7 @@ uint32_t HandleProcessParameters(ProcessParameters* ProcessParams,bool saveData) { status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ10, false,ProcessParams->headzone10temp); } + Trigger_HeaterWriting(); if (ProcessParams->headzone11temp>1) { status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ11, true,ProcessParams->headzone11temp); @@ -282,6 +285,7 @@ uint32_t HandleProcessParameters(ProcessParameters* ProcessParams,bool saveData) } if(Head_Type == HEAD_TYPE_STAPLE_SPUN) { + Trigger_HeaterWriting(); if (ProcessParams->rblowertemp>1) { status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__HeadCoverHeater1, true,ProcessParams->rblowertemp); @@ -290,6 +294,7 @@ uint32_t HandleProcessParameters(ProcessParameters* ProcessParams,bool saveData) { status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__HeadCoverHeater1, false,ProcessParams->rblowertemp); } + Trigger_HeaterWriting(); if (ProcessParams->lblowertemp>1) { status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__HeadCoverHeater2, true,ProcessParams->lblowertemp); @@ -298,6 +303,7 @@ uint32_t HandleProcessParameters(ProcessParameters* ProcessParams,bool saveData) { status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__HeadCoverHeater2, false,ProcessParams->lblowertemp); } + Trigger_HeaterWriting(); Trigger_Head_Fan_Control(HEAD_FAN_RIGHT,ProcessParams->rblowerflow); Trigger_Head_Fan_Control(HEAD_FAN_LEFT,ProcessParams->lblowerflow); } diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c index 309eada85..73da7924b 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c @@ -1110,6 +1110,7 @@ uint32_t DcHeaterMaxTempCBFunction(uint32_t IfIndex, uint32_t readValue) } return ERROR; } +bool IncreaseBlower = false; uint32_t HeaterControlCBFunction(uint32_t IfIndex, uint32_t readValue) { int index=HEATER_TYPE_MAX_HEATERS; @@ -1259,23 +1260,29 @@ uint32_t HeaterControlCBFunction(uint32_t IfIndex, uint32_t readValue) ReportWithPackageFilter(HeatersFilter,"AC Ready",__FILE__,index,readValue,RpWarning,(HeaterCmd[index].targettemperatue), 0); HeaterAtTemp[index] = true; HeaterPrepareReady(); + IncreaseBlower = false; } } if ( (readValue > (HeaterCmd[index].targettemperatue * ((100-HeaterControl[index].outputproportionalband+2)/100))) && (readValue < (HeaterCmd[index].targettemperatue * ((100+HeaterControl[index].outputproportionalband)/100)))) { - if (BlowerCfg.enabled == true) + if (IncreaseBlower == false) { - if(Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) - { - WHS_Set_SetPoint_Q_value(headairflow); - } - else + IncreaseBlower = true; + if (BlowerCfg.enabled == true) { - Turn_the_Blower_On();//Turn on with the Default_Voltage - if (BlowerCfg.voltage) - Control_Voltage_To_Blower(BlowerCfg.voltage); + if(Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + { + WHS_Set_SetPoint_Q_value(headairflow); + } + else + { + Turn_the_Blower_On();//Turn on with the Default_Voltage + if (BlowerCfg.voltage) + Control_Voltage_To_Blower(BlowerCfg.voltage); + } } + } } if(HeaterPIDConfig[index].m_isEnabled && (HeaterPIDConfig[index].m_SetParam != 0)) diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h b/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h index 41e729b9b..647797b69 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h @@ -28,6 +28,9 @@ extern uint32_t DispenserIdToMotorId[MAX_SYSTEM_DISPENSERS]; extern bool HomingActive[MAX_SYSTEM_DISPENSERS]; extern bool PrimingActive[MAX_SYSTEM_DISPENSERS]; +extern uint32_t LeftRockerSpeed; +extern uint32_t RightRockerSpeed; + uint32_t IDS_Dispenser_EmptyCBFunction(uint32_t IfIndex, uint32_t ReadValue); /*typedef struct @@ -45,6 +48,7 @@ void IDS_Dispenser_RefillEnded (char DispenserId,char MicroSteps); //uint32_t IDS_Dispenser_Build_Pressure(int DispenserId, callback_fptr callback); +uint32_t IDS_Cleaning_Move_Actuators(void); uint32_t IDS_Cleaning_Move_Rockers (int LeftRockerSpeed,int RightRockerSpeed); uint32_t IDS_Cleaning_Center_And_Stop_Rockers (int timeout,callback_fptr callback); uint32_t IDS_Cleaning_Spray_Cleaning_Solution (int dispenserSpeed,callback_fptr callback); diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_Cleaning.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_Cleaning.c index bdde05b43..8f10a0e5d 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_Cleaning.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_Cleaning.c @@ -13,11 +13,73 @@ #include "PMR/Hardware/Hardwaremotor.pb-c.h" #include "PMR/Hardware/HardwareDispenser.pb-c.h" #include "StateMachines/Printing/printingSTM.h" +#include <Drivers/I2C_Communication/I2C_Task.h> + #include "drivers/motors/motor.h" #include "drivers/valves/valve.h" +#include "Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.h" int SaveLeftRockerSpeed = 50, SaveRightRockerSpeed = 50; +typedef enum +{ + CleaningStageIdle, + CleaningStageActuatorUp = 1, + CleaningStageDelay1, + CleaningStageActuatorDown, + CleaningStageDelay2, +}CleaningStageEnum; + +/* + *Cleaning sequence: + + +t up – time actuator goes up +t delay1 – time actuator stays in position (up position – not limit switch) +Down to limit - actuator goes to lower limit switch +t delay2 – time actuator stays in lower limit switch position + +Values for start: +t up – 300 msec +t delay1 – 500 msec +t delay2 – 2 sec + + */ + +CleaningStageEnum CleaningStage = CleaningStageIdle; +int CleaningStageCounter = 0; +int Tup = 4,Tdelay1 = 9,Tdelay2 = 29; + +uint32_t IDS_Cleaning_Move_Actuators() +{ + if(Head_Type != HEAD_TYPE_SYLKO) + return OK; + if (CleaningStageCounter == 1) + { + Trigger_Head_Actuators_Control(ACTIN, LOW,true); + Report("IDS_Cleaning_Move_ActuatorUp", __FILE__, __LINE__, 1, RpWarning, CleaningStageCounter, 0); + } + else if (CleaningStageCounter == Tup) + { + Trigger_Head_Actuators_Disable(); + Report("IDS_Cleaning_Stop_Actuator", __FILE__, __LINE__, Tup, RpWarning, CleaningStageCounter, 0); + } + else if (CleaningStageCounter == Tdelay1) + { + Trigger_Head_Actuators_Control(ACTIN, LOW,false); + Report("IDS_Cleaning_MoveDown", __FILE__, __LINE__, Tdelay1, RpWarning, CleaningStageCounter, 0); + } + else if (CleaningStageCounter == Tdelay2) + { + CleaningStageCounter = 0; + Report("IDS_Cleaning_Stop_delay", __FILE__, __LINE__, Tdelay2, RpWarning, CleaningStageCounter, 0); + } + + + CleaningStageCounter++; + + return OK; +} uint32_t IDS_Cleaning_Move_Rockers (int LeftRockerSpeed,int RightRockerSpeed) { uint32_t status = OK; @@ -34,17 +96,25 @@ uint32_t IDS_Cleaning_Move_Rockers (int LeftRockerSpeed,int RightRockerSpeed) uint32_t IDS_Cleaning_Center_And_Stop_Rockers (int timeout,callback_fptr callback) { uint32_t status = OK; - status |= MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD].directionthreadwize, SaveRightRockerSpeed, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD], callback,timeout); - status |= MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH].directionthreadwize, SaveLeftRockerSpeed, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH], callback,timeout); - Report("IDS_Cleaning_Center_And_Stop_Rockers", __FILE__, __LINE__, timeout, RpWarning, 123456, 0); + //status |= MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD].directionthreadwize, SaveRightRockerSpeed, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD], callback,timeout); + //status |= MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH].directionthreadwize, SaveLeftRockerSpeed, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH], callback,timeout); + Trigger_Head_Actuators_Disable(); + Trigger_Head_Actuators_Control(ACTIN, LOW,false); + CleaningStageCounter = 0; + CleaningStage = CleaningStageIdle; + Report("IDS_Cleaning_Center_And_Stop_Rockers actuator down", __FILE__, __LINE__, timeout, RpWarning, 123456, 0); return status; } uint32_t IDS_Cleaning_Spray_Cleaning_Solution (int dispenserSpeed,callback_fptr callback) { uint32_t status = OK; + Tup = LeftRockerSpeed/100; + Tdelay1 = LeftRockerSpeed%100; + Tdelay2 = RightRockerSpeed; status = IDS_Dispenser_Start_Motor_and_Open_Valve(CLEANER_DISPENSER, dispenserSpeed, callback); Report("IDS_Cleaning_Spray_Cleaning_Solution", __FILE__, __LINE__, CLEANER_DISPENSER, RpWarning, dispenserSpeed, 0); + Report("IDS_Cleaning parameters", __FILE__, Tup*100, Tdelay1*100, RpWarning, Tdelay2*100, 0); return status; @@ -54,6 +124,11 @@ uint32_t IDS_Cleaning_Stop_Cleaning_Solution (callback_fptr callback) uint32_t status = OK; status = IDS_Dispenser_Close_Valve_And_Stop_Motor(CLEANER_DISPENSER,callback); Report("IDS_Cleaning_Stop_Cleaning_Solution", __FILE__, __LINE__, CLEANER_DISPENSER, RpWarning, status, 0); + if(Head_Type == HEAD_TYPE_SYLKO) + { + Trigger_Head_Actuators_Control(ACTIN, LOW,false); + Report("IDS_Cleaning_MoveDown cleaning stop", __FILE__, __LINE__, Tdelay1, RpWarning, CleaningStageCounter, 0); + } return status; diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h index b3f21e187..831fa18cd 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h @@ -45,6 +45,8 @@ extern DispenserRunningData IDS_Dispenser_Data[MAX_SYSTEM_DISPENSERS]; //extern DispenserData IDSDispenserData; extern DispenserRunningData **dispenserdata; +extern bool ActuatorsCleaningSequence; + extern bool DispenserUsedInJob[MAX_SYSTEM_DISPENSERS]; extern int32_t CurrentDispenserSpeed[MAX_SYSTEM_DISPENSERS]; diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c index a76453f95..b4442c996 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c @@ -51,6 +51,7 @@ HardwarePidControlType ThreadDispenserIdToControlId[MAX_SYSTEM_DISPENSERS] = { JobUploadStrategy uploadstrategy = JOB_UPLOAD_STRATEGY__Default; bool DispenserReady[MAX_SYSTEM_DISPENSERS] = {true}; bool IDS_Active = false; +bool ActuatorsCleaningSequence = true; bool Special_Dispensers = false; /******************** STRUCTURES AND ENUMs ********************************************/ @@ -78,7 +79,7 @@ int lInterSegmentLength = 0; uint32_t InterSegmentStartRocking = 0; uint32_t InterSegmentCenterRockers = 0; uint32_t LeftRockerSpeed = 20; - uint32_t RighttRockerSpeed = 20; + uint32_t RightRockerSpeed = 20; uint32_t CleaningDispenserSpeed = 40; uint32_t InterSegmentStartWFCFDispensers; uint32_t WFCF = 80; @@ -115,7 +116,7 @@ void IDS_Dispenser_SetPreSegmentWFCFValues(double dispenserpresegmentwfcf, doubl if ( ids_leftcleaningmotorspeed) LeftRockerSpeed = ids_leftcleaningmotorspeed; if ( ids_rightcleaningmotorspeed) - RighttRockerSpeed = ids_rightcleaningmotorspeed; + RightRockerSpeed = ids_rightcleaningmotorspeed; Report("IDS_Dispenser_SetPreSegmentCleaningValues ",__FILE__,__LINE__,CleaningDispenserSpeed,RpWarning,(int)LeftRockerSpeed,0); Report("IDS_Dispenser_SetPreSegmentCleaningValues ",__FILE__,__LINE__,InterSegmentStartSprayCleaner,RpWarning,(int)InterSegmentCenterRockers,0); @@ -1089,6 +1090,12 @@ uint32_t IDS_Cleaning_Stop_Cleaning_Solution (callback_fptr callback); Report("Start cleaning rockers",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); //IDS_Cleaning_Move_Rockers (int LeftRockerSpeed,int RightRockerSpeed); }*/ + if (( InterSegmentStartSprayCleaner )&& + ((InterSegmentStepsCount>InterSegmentStartSprayCleaner)&&(InterSegmentStepsCount<(lInterSegmentLength-InterSegmentCenterRockers) ))) + { + if (ActuatorsCleaningSequence) + IDS_Cleaning_Move_Actuators(); + } if (( InterSegmentCenterRockers)&&(InterSegmentCenterRockers == (lInterSegmentLength-InterSegmentStepsCount))) { Report("Stop spray and center rockers",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c index cbdab01d1..4a7008a7a 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c @@ -31,6 +31,7 @@ #include "Modules/Control/MillisecTask.h" #include "modules/thread/thread_ex.h" #include "modules/heaters/heaters_ex.h" +#include "modules/waste/waste_ex.h" #include <Drivers/I2C_Communication/I2C.h> #include <Drivers/I2C_Communication/Head_Card/I2C_Head_Mux.h> #include "Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.h" @@ -500,6 +501,30 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) response.has_progress = true; } else + if(request->amount == 0xAD6) //Set skip open lids + { + LOG_ERROR(request->delay,"Set SkipOpenLids"); + SkipOpenLids = request->delay; + response.progress = SkipOpenLids; + response.has_progress = true; + } + else + if(request->amount == 0xAD7) //Set actuators cleaning sequence + { + LOG_ERROR(request->delay,"Set actuators cleaning sequence"); + ActuatorsCleaningSequence = request->delay; + response.progress = ActuatorsCleaningSequence; + response.has_progress = true; + } + else + if(request->amount == 0xAD8) //Set ignore cone missing + { + LOG_ERROR(request->delay,"Set ignore cone missing"); + IgnoreConeMissing = request->delay; + response.progress = IgnoreConeMissing; + response.has_progress = true; + } + else if((request->amount == 0x01) && ((request->delay &0x010000) == 0x010000)) //change mode powerset01 { response.progress = Power_Step_01_Mode(((request->delay &0x00FF00)>>8), request->delay &0x0000FF); @@ -1016,6 +1041,16 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) } else + if(request->amount == 0xB8) //fast refresh for pressure + { + if (request->delay == 1) {//init waste + Waste_Init(); + LOG_ERROR(request->delay,"Waste_Init"); + } + response.progress = request->delay; + response.has_progress = true; + } + else if(request->amount == 0xC3) //suspend I2C task { if (request->delay == 0) diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h b/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h index d1d23598f..3a7045a6e 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h @@ -76,7 +76,6 @@ extern int MotorSpeedSamplePointer[MAX_THREAD_MOTORS_NUM]; uint32_t InternalWinderConfigMessage(HardwareWinder* request); uint32_t MotorsConfigMessage( HardwareConfiguration* HW_request); uint32_t InternalWindingConfigMessage(JobSpool* request); -uint32_t ThreadInitialTestStub(HardwareMotor * request); uint32_t MotorPidRequestMessage(HardwarePidControl* request); void SetKeepWindingCone(bool value); void SetWinderBackToBaseTime(uint32_t value); diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c index 965ea30da..f5bc45d85 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c @@ -204,6 +204,7 @@ strcpy(LoadErrorMsg,"Thread_Load_Reduce_Heat failed"); LoadStatus = ERROR; TryAgain = true; + //ThreadLoadButton(LoadStages); } else { @@ -300,6 +301,7 @@ LoadStatus = ERROR; ThreadLoadingReport(); TryAgain = true; + //ThreadLoadButton(LoadStages); } else { @@ -544,6 +546,7 @@ LoadStatus = ERROR; ThreadLoadingReport(); TryAgain = true; + //ThreadLoadButton(LoadStages); } } @@ -647,6 +650,7 @@ Report("Total Feeder load",__FILE__,__LINE__,dryerbufferCentimeters,RpMessage,TotalLoadedLen,0); ThreadLoadingReport(); + //ThreadLoadButton(LoadStages); } return OK; } @@ -857,13 +861,14 @@ LoadStatus = ERROR; TryAgain = true; ThreadLoadingReport(); + //ThreadLoadButton(LoadStages); } return OK; } uint32_t Thread_Load_Dryer_UnLoading(void) { uint32_t temp; - REPORT_MSG(LoadStages, "Thread UnLoad State Machine step"); + REPORT_MSG(LoadStages, "Thread Load State Machine step Dryer Unloading"); //LoadArmRounds = 0; //uint32_t numberOfSteps = 0; //Start Feeder Pid, Rotate Loading Arm Counter Thread Direction X Circles According To Rml. Feeder Speed Is 40 @@ -971,7 +976,7 @@ uint32_t ThreadLoadStateMachine( THREAD_LOAD_STAGES_ENUM ReadValue) { REPORT_MSG(ReadValue,"ThreadLoadStateMachine"); - ThreadLoaded(); + //ThreadLoaded(); ThreadLoadingReport(); if (LoadStages!=ReadValue) @@ -1089,7 +1094,7 @@ uint32_t ThreadLoadButton(THREAD_LOAD_STAGES_ENUM ReadValue) Report("Calling State machine",__FILE__,LoadStages,LoadStatus,RpMessage,SecondTry,0); ThreadLoadStateMachine(LoadStages); } - else + else if (SecondTry == true) { SecondTry = false; Report("Calling State machine",__FILE__,LoadStages,LoadStatus,RpMessage,SecondTry,0); @@ -1258,7 +1263,7 @@ uint32_t ThreadLoadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) } bool ThreadLoaded(void) { - uint32_t ReadValue; + /* uint32_t ReadValue; int32_t PoolerValue,WinderValue,FeederValue; //this function tests if there is a thread in the machine. all dancers are in lowermost position then there is no thread. @@ -1280,7 +1285,7 @@ bool ThreadLoaded(void) Report("Thread is out",__FILE__,(-1*PoolerValue),(-1*WinderValue),RpWarning,(-1*FeederValue),0); return true; } - else + else*/ return false; } void ThreadLoadRequest(MessageContainer* requestContainer) diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c index 80ca05cb7..92b953db5 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c @@ -54,7 +54,7 @@ double ScrewRunningTime = 0; uint32_t ScrewNumberOfSteps = 0; //holds the current number of steps for the next screw run - will be used to build the cone bool SCREW_TimerActivated = false; uint32_t ScrewControlId = 0xFF; - +bool IgnoreConeMissing = false; static bool KeepWindingCone = false; @@ -156,10 +156,13 @@ uint32_t Winder_Prepare(void *JobDetails) REPORT_MSG(LIMIT, "No cone in winder"); if (Is_PP_Machine()) { - JobEndReason = JOB_THREAD_BREAK; - PrepareReady(Module_Winder,ModuleFail); - AlarmHandlingSetAlarm(EVENT_TYPE__WINDER_CONE_DOES_NOT_EXIST,true); - return ERROR; + if (IgnoreConeMissing == false) + { + JobEndReason = JOB_THREAD_BREAK; + PrepareReady(Module_Winder,ModuleFail); + AlarmHandlingSetAlarm(EVENT_TYPE__WINDER_CONE_DOES_NOT_EXIST,true); + return ERROR; + } } } diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h index 4081b53f2..4339c5312 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h @@ -24,6 +24,7 @@ typedef enum threadMotorsEnum extern double TotalProcessedLength; extern double PoolerTotalProcessedLength; extern int SecondFeederCorrection; +extern bool SkipOpenLids,IgnoreConeMissing; void ThreadSetBreakSensorLimit(int limit); @@ -37,7 +38,6 @@ uint32_t ThreadPreSegmentState(void *SegmentDetails, uint32_t SegmentId); uint32_t ThreadSegmentState(void *SegmentDetails, int SegmentId); uint32_t ThreadDistanceToSpoolState(void); uint32_t ThreadEndState(); -uint32_t ThreadInitialTestStub(); bool Set_Thread_Rockers_Bypass (int value); diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c index 760a0726b..e1f887303 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c @@ -112,8 +112,6 @@ uint32_t MotorsConfigMessage(HardwareConfiguration * HWrequest) { IDS_Dispenser_Init(Motor_i-HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1); } -// if (Motor_i == MOTOR_RDRIVING) -// ThreadInitialTestStub(request); } 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 c27725b68..42a56ae8a 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c @@ -217,7 +217,7 @@ uint32_t ThreadLengthCBFunction(uint32_t IfIndex, uint32_t ReadValue) } } - FeederSpeedStore[FeederSpeedIndex++] = length; + /*FeederSpeedStore[FeederSpeedIndex++] = length; if (FeederSpeedIndex>=SPEED_STORE_SIZE) { FeederSpeedIndex = 0; @@ -225,8 +225,8 @@ uint32_t ThreadLengthCBFunction(uint32_t IfIndex, uint32_t ReadValue) for (Speed_i = 0;Speed_i<SPEED_STORE_SIZE;Speed_i++) FeederSpeedAverage+=FeederSpeedStore[Speed_i]; FeederSpeedAverage = FeederSpeedAverage/SPEED_STORE_SIZE; - ReportWithPackageFilter(ThreadFilter,"Average Speed 2 second",__FILE__,__LINE__,(int)(FeederSpeedAverage*100),RpWarning,(int)(PullerSpeedAverage*100),0); - } + ReportWithPackageFilter(ThreadFilter,"Avg len 100ms last 2 sec",__FILE__,(int)PoolerTotalProcessedLength,(int)(FeederSpeedAverage*1000),RpWarning,(int)(PullerSpeedAverage*1000),0); + }*/ TotalProcessedLength += (length/100); TempTotalProcessedLength = TotalProcessedLength; #ifdef FEEDER_LENGTH_CALCULATION @@ -317,7 +317,7 @@ uint32_t PoolerThreadLengthCBFunction(uint32_t IfIndex, uint32_t ReadValue) length = 0; } - PullerSpeedStore[PullerSpeedIndex++] = length; + /*PullerSpeedStore[PullerSpeedIndex++] = length; if (PullerSpeedIndex>=SPEED_STORE_SIZE) { PullerSpeedIndex = 0; @@ -326,7 +326,7 @@ uint32_t PoolerThreadLengthCBFunction(uint32_t IfIndex, uint32_t ReadValue) PullerSpeedAverage+=PullerSpeedStore[Speed_i]; PullerSpeedAverage = PullerSpeedAverage/SPEED_STORE_SIZE; //ReportWithPackageFilter(ThreadFilter,"Average Speed 2 second",__FILE__,__LINE__,(int)(FeederSpeedAverage*100),RpWarning,(int)(PullerSpeedAverage*100),0); - } + }**/ //} @@ -423,7 +423,67 @@ uint32_t ThreadControlSpeedReadFunction(uint32_t IfIndex, uint32_t ReadValue) } return OK; } +uint16_t BreakSensorCounter = 0; +uint16_t BreakSensorLatchCounter = 0; +char TMessage[150]; + +uint32_t checkBreakSensor(uint32_t index) +{ + if (BreakSensorenabled == true) + { + if (JobCounter > eOneSecond) + { + if (ReadBreakSensor()==ERROR) + { + BreakSensorCounter++; + BreakSensorLatchCounter++; + if (BreakSensorCounter>=BreakSensordebouncetimemilli) + { + //consider applying the debouce parameters later + usnprintf(TMessage, 60, "ReadBreakSensor Error"); + //BreakSensordebouncetimemilli + JobEndReason = JOB_THREAD_BREAK; + ThreadControlActive = false; + SendJobProgress(0.0,0,false, TMessage); + SendSegmentFail(); + //AlarmHandlingSetAlarm(EVENT_TYPE__THREAD_BREAK,true); + //EndState(CurrentJob,"ReadBreakSensor Error" ); + ReportWithPackageFilter(ThreadFilter,"ReadBreakSensor Error",__FILE__,BreakSensorCounter,(int)index,RpError,(int)JobCounter,0); + return ERROR; + } //passed limit + }//ReadBreakSensor()==ERROR + else //reset counter - we are looking for consequent calls + { + if (BreakSensorCounter) + { + ReportWithPackageFilter(ThreadFilter,"ReadBreakSensor Spike",__FILE__,BreakSensorCounter,(int)index,RpError,(int)JobCounter,0); + } + BreakSensorCounter = 0; + } + if (CurrentControlledSpeed[index] < (OriginalMotorSpd_2PPS[index]/3)) + { + BreakSensorCounter++; + BreakSensorLatchCounter++; + if (BreakSensorCounter>=BreakSensordebouncetimemilli) + { + //consider applying the debouce parameters later + usnprintf(TMessage, 60, "thread speed too low"); + JobEndReason = JOB_THREAD_BREAK; + ThreadControlActive = false; + SendJobProgress(0.0,0,false, TMessage); + SendSegmentFail(); + //AlarmHandlingSetAlarm(EVENT_TYPE__THREAD_BREAK,true); + //EndState(CurrentJob,"ReadBreakSensor Error" ); + ReportWithPackageFilter(ThreadFilter,"thread speed too low Error",__FILE__,BreakSensorCounter,(int)index,RpError,(int)JobCounter,0); + return ERROR; + } + } + + } + } + return OK; +} int controlIndex = 0; bool keepdata = true; int32_t KeepReadValue = 0; @@ -477,10 +537,7 @@ void testDancersControl() } #endif int MotorFailedSample[MAX_THREAD_MOTORS_NUM] = {0,0,0,0,0}; -char TMessage[150]; //char time[150]; -uint16_t BreakSensorCounter = 0; -uint16_t BreakSensorLatchCounter = 0; bool FirstCalcInJob = true; uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) { @@ -510,6 +567,11 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) } index = IfIndex&0xFF; + if (index == POOLER_MOTOR) //move break sensor handling up to ensure handling even if tiing control is > 1 msec + { + if (checkBreakSensor(index) == ERROR) + return OK; + } if (MotorTiming[index]>1) { MotorTimer[index]++; @@ -571,61 +633,6 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) avreageSampleValue += MotorSamples[index][i]; avreageSampleValue = avreageSampleValue / (int)MotorsControl[index].pvinputfilterfactormode; - if (BreakSensorenabled == true) - { - if (index == POOLER_MOTOR) - { - if (JobCounter > eOneSecond) - { - if (ReadBreakSensor()==ERROR) - { - BreakSensorCounter++; - BreakSensorLatchCounter++; - if (BreakSensorCounter>=BreakSensordebouncetimemilli) - { - //consider applying the debouce parameters later - usnprintf(TMessage, 60, "ReadBreakSensor Error"); - //BreakSensordebouncetimemilli - JobEndReason = JOB_THREAD_BREAK; - ThreadControlActive = false; - SendJobProgress(0.0,0,false, TMessage); - SendSegmentFail(); - //AlarmHandlingSetAlarm(EVENT_TYPE__THREAD_BREAK,true); - //EndState(CurrentJob,"ReadBreakSensor Error" ); - ReportWithPackageFilter(ThreadFilter,"ReadBreakSensor Error",__FILE__,BreakSensorCounter,(int)index,RpError,(int)JobCounter,0); - return OK; - } //passed limit - }//ReadBreakSensor()==ERROR - else //reset counter - we are looking for consequent calls - { - if (BreakSensorCounter) - { - ReportWithPackageFilter(ThreadFilter,"ReadBreakSensor Spike",__FILE__,BreakSensorCounter,(int)index,RpError,(int)JobCounter,0); - } - BreakSensorCounter = 0; - } - if (CurrentControlledSpeed[index] < (OriginalMotorSpd_2PPS[index]/3)) - { - BreakSensorCounter++; - BreakSensorLatchCounter++; - if (BreakSensorCounter>=BreakSensordebouncetimemilli) - { - //consider applying the debouce parameters later - usnprintf(TMessage, 60, "thread speed too low"); - JobEndReason = JOB_THREAD_BREAK; - ThreadControlActive = false; - SendJobProgress(0.0,0,false, TMessage); - SendSegmentFail(); - //AlarmHandlingSetAlarm(EVENT_TYPE__THREAD_BREAK,true); - //EndState(CurrentJob,"ReadBreakSensor Error" ); - ReportWithPackageFilter(ThreadFilter,"thread speed too low Error",__FILE__,BreakSensorCounter,(int)index,RpError,(int)JobCounter,0); - return OK; - } - } - - } - } - } //Stop Execution if the dancer moves too much if ((abs(avreageSampleValue)> DancerStopActivityLimit[index])&&(JobCounter > eOneSecond)) @@ -783,15 +790,6 @@ double ThreadGetMotorCalculatedError(int DancerId) } //******************************************************************************************************************** -uint32_t ThreadInitialTestStub(HardwareMotor * request) -{ - - - //MotorsConfigMessage(request); - ThreadPrepareState(request); - ThreadPreSegmentState(request,0); - return OK; -} uint32_t HandleJobThreadControlParameters(ThreadParameters* ThreadParams) { if (ThreadParams == NULL) @@ -951,7 +949,8 @@ uint32_t ThreadPrepare_Tension (int DancerId, double tension) return status; } //******************************************************************************************************************** - uint32_t ThreadPrepareState(void *JobDetails) +bool SkipOpenLids = true; +uint32_t ThreadPrepareState(void *JobDetails) { int Motor_i,i, HW_Motor_Id, Pid_Id; JobTicket* JobTicket = JobDetails; @@ -1016,22 +1015,30 @@ uint32_t ThreadPrepare_Tension (int DancerId, double tension) //return ERROR; }*/ - if ((FPGA_Read_limit_Switches(Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_LID]) == LIMIT)&&(JoggingJobActive == false)) +// if ((FPGA_Read_limit_Switches(Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_LID]) == LIMIT)&&(JoggingJobActive == false)) + if ((FPGA_Read_limit_Switches(Motor_Id_to_LS_IdDown[HARDWARE_MOTOR_TYPE__MOTO_DH_LID]) != LIMIT)&&(JoggingJobActive == false)) { if(Head_Type != HEAD_TYPE_STAPLE_SPUN) { ReportWithPackageFilter(ThreadFilter,"Dyeing head is wide open!!!",__FILE__,__LINE__,HARDWARE_MOTOR_TYPE__MOTO_DH_LID,RpError,LIMIT,0); - JobEndReason = JOB_LIDS_OPEN; - PrepareReady(Module_Thread,ModuleFail); - return ERROR; + if (SkipOpenLids == false) + { + JobEndReason = JOB_LIDS_OPEN; + PrepareReady(Module_Thread,ModuleFail); + return ERROR; + } } } - if ((FPGA_Read_limit_Switches(Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID]) == LIMIT)&&(JoggingJobActive == false)) +// if ((FPGA_Read_limit_Switches(Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID]) == LIMIT)&&(JoggingJobActive == false)) + if ((FPGA_Read_limit_Switches(Motor_Id_to_LS_IdDown[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID]) != LIMIT)&&(JoggingJobActive == false)) { ReportWithPackageFilter(ThreadFilter,"Dryer lid is wide open!!!",__FILE__,__LINE__,HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID,RpError,LIMIT,0); - JobEndReason = JOB_LIDS_OPEN; - PrepareReady(Module_Thread,ModuleFail); - return ERROR; + if (SkipOpenLids == false) + { + JobEndReason = JOB_LIDS_OPEN; + PrepareReady(Module_Thread,ModuleFail); + return ERROR; + } } //start thread control for all motors @@ -1057,6 +1064,8 @@ uint32_t ThreadPrepare_Tension (int DancerId, double tension) 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; if (MotorTiming[Motor_i]) @@ -1068,7 +1077,7 @@ uint32_t ThreadPrepare_Tension (int DancerId, double tension) for (i = 0;i < (int)MotorsControl[Motor_i].pvinputfilterfactormode; i++) { //if (Motor_i == DRYER_MOTOR) // dryer motor is speed controlled. later a speed sensor will be utilized, but for now it will not be controlled - MotorSamples[Motor_i][i] = Control_Read_Dancer_Position(ThreadMotorIdToDancerId[Motor_i],0); //reset the samples value for control beginning + MotorSamples[Motor_i][i] = 0; // else if ((Motor_i == POOLER_MOTOR)||(Motor_i == FEEDER_MOTOR)) // MotorSamples[Motor_i][i] = DancersCfg[ThreadMotorIdToDancerId[Motor_i]].zeropoint; //MotorSpeedSamples[Motor_i][i] = 0; @@ -1148,7 +1157,6 @@ uint32_t ThreadPrepare_Tension (int DancerId, double tension) if (Motor_i == ThreadMotorIdToMotorId[DRYER_MOTOR]) // dryer motor is speed controlled. later a speed sensor will be utilized, but for now it will not be controlled continue; } - HandleJobThreadControlParameters(JobTicket->threadparameters); //OVERRIDES CONFIGURATION PARAMETERS!!! #ifdef TEST_PID_THREAD testDancersControl(); diff --git a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_ex.h b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_ex.h index 8b1378917..2fdd3a479 100644 --- a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_ex.h +++ b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_ex.h @@ -1 +1,42 @@ +#ifndef WASTE_MAINT_H +#define WASTE_MAINT_H + +typedef enum { + CartridgeStateOUT, + CartridgeStateIN, + CartridgeStateSELECTED, + CartridgeStateACTIVE, + CartridgeStateFULL +}CartridgeStateEnum; + +typedef enum { + WasteCartridge_upper, + WasteCartridge_middle, + WasteCartridge_lower, + MaxWasteCartridges +}WasteCartridgeEnum; + +typedef enum{ + WasteTankStateIdle, + WasteTankStateFull, + WasteTankStateEmptying, + WasteTankStatePaused +}WasteTankStateEnum; + +extern bool DoorState; +/////////////////////////////// Cartridges ////////////////////////////////////// +void cartCART_INSERTED (WasteCartridgeEnum); //{called from polling function. validate, set state to IN) +void cartCART_EXTRACTED(WasteCartridgeEnum); //{called from polling function. set state to out, if was ACTIVE – notify waste module) +WasteCartridgeEnum cartSELECT_CART(void); //{ if there is no SELECTED cartridge select the first cartridge in IN state. If there is none, return -1} +void cartFILLING_START(void); //{set state of SELECTED to ACTIVE} +void cartFILLING_END(void); //{set state of ACTIVE to FULL} +CartridgeStateEnum cartGetState (WasteCartridgeEnum); +bool cartGetPresence (WasteCartridgeEnum CartId); +bool cartCart_door();//Polled by polling function. Notify waste. Poll each 1 second. During active filling poll each 100msec + +void Waste_Init(); +void Waste_StateMachine(void); +void Waste_StateMachine_OneSecond_Call(void); + +#endif diff --git a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_init.c b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_init.c index cf9fb3b7b..03ee73daf 100644 --- a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_init.c +++ b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_init.c @@ -20,6 +20,7 @@ #include <Drivers/I2C_Communication/I2C_Task.h> #include <Drivers/I2C_Communication/WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.h> #include <Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.h> +#include <Drivers/I2C_Communication/RFID_NFC/I2C_IFS_Mux.h> // //#define CARTRIDGE_INK_TIMEOUT 60 //#define CARTRIDGE_INK_TIMEOUTx2 120 @@ -231,11 +232,11 @@ bool RdCartridgeParam(cartridge_name cart_name) { case waste_cartridge1: WHS_info.cartridge_1.serial_number = temp_funcion; //to do - WHS_info.cartridge_1.status = 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 = temp_funcion; + WHS_info.cartridge_2.status = WasteEmpty; break; case INK_cartridge: ReadCartridgeData(cart_name); @@ -313,6 +314,12 @@ U8 set_cartridge_2(U8 cartridge_status) 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 - : @@ -415,6 +422,29 @@ U8 CartridgeWasteFilling(bool status) 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 @@ -460,9 +490,9 @@ U8 CartridgeWasteFilling(bool status) /* ------read waste tank sensors ----------- */ #define WASTE_CARTRIDGE_SIZE 1500 -#define WASTE_LEVEL_OVERFLOW 4000 -#define WASTE_LEVEL_FULL 3500 -#define WASTE_LEVEL_EMPTY 2100 +#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; @@ -727,7 +757,7 @@ bool WasteTankCBFunction() 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(CLOSE); + CartridgeWasteFilling(OFF); pump_on_flag = OPEN; } @@ -759,12 +789,12 @@ bool WasteTankCBFunction() } else // CLOSE { - //if (WHS_info.sttMachine == WHS_full) CartridgeWasteFilling(OPEN); + 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); + CartridgeWasteFilling(OPEN); pump_on_flag = CLOSE; } IFS_info.Cartridge_Ink_device_Id = RemoveControlCallback(IFS_info.Cartridge_Ink_device_Id , WasteTankCBFunction ); diff --git a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c index e69de29bb..099fc0c2e 100644 --- a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c +++ b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c @@ -0,0 +1,363 @@ +#include <Container.h> +#include <DataDef.h> +#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_ex.h" +#include <Drivers/I2C_Communication/RFID_NFC/RFIDTagInfo.h> +#include "Drivers/I2C_Communication/RFID_NFC/logi-tag/LT_RFID.h" +#include "Drivers/I2C_Communication/RFID_NFC/NFC.h" +//#include <Utilities/RfidTagHandling.h> + +#include <PMR/Diagnostics/EventType.pb-c.h> +#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 <Drivers/I2C_Communication/I2C_Task.h> +#include <Drivers/I2C_Communication/WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.h> +#include <Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.h> + +bool DoorState = OPEN; +uint32_t timeout_counter = 0; +int wasteLevel = 0; +WasteCartridgeEnum SelectedCard = MaxWasteCartridges; +CartridgeStateEnum CartState[MaxWasteCartridges]; +uint32_t Cartridge_Cover_Control; +button *CartLed[MaxWasteCartridges] = {0, &cart2, &cart3}; +WasteTankStateEnum WasteTankState = WasteTankStateIdle; + +#define WASTE_CARTRIDGE_SIZE 1500 +#define WASTE_LEVEL_OVERFLOW 2700 +#define WASTE_LEVEL_FULL 2300 +#define WASTE_LEVEL_EMPTY 900 +#define WASTE_EMPTING_TIMEOUT 1200 +double wasteLevelOverflow = WASTE_LEVEL_OVERFLOW; +double wasteLevelFull = WASTE_LEVEL_FULL; +double wasteLevelEmpty = WASTE_LEVEL_EMPTY; +double wasteLevelOverFlow = WASTE_LEVEL_OVERFLOW; + +//#define WHS_DEBUG + +/////////////////////////////// Cartridges ////////////////////////////////////// +void Waste_StateMachine(void); +void cartCART_INSERTED (WasteCartridgeEnum CartId) +{ + assert (CartId<MaxWasteCartridges); + if (CartState[CartId] != CartridgeStateOUT) + Report("Cartridges Cart inserted wrong state", __FILE__, __LINE__, CartId, RpMessage, CartState[CartId], 0); + CartState[CartId] = CartridgeStateIN; + CartLed[CartId]->color = colorON; + + Report("Cartridges Cart inserted", __FILE__, __LINE__, CartId, RpMessage, CartState[CartId], 0); +} +void cartCART_EXTRACTED(WasteCartridgeEnum CartId) //{called from polling function. set state to out, if was ACTIVE – notify waste module) +{ + assert (CartId<MaxWasteCartridges); + if (CartState[CartId] == CartridgeStateOUT) + Report("Cartridges Cart extracted wrong state", __FILE__, __LINE__, CartId, RpMessage, CartState[CartId], 0); + + Report("Cartridges Cart extracted", __FILE__, __LINE__, CartId, RpMessage, CartState[CartId], 0); + CartState[CartId] = CartridgeStateOUT; + CartLed[CartId]->color = colorOFF; + +} +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); + if ((CartState[WasteCartridge_middle] == CartridgeStateSELECTED)||(CartState[WasteCartridge_middle] == CartridgeStateACTIVE)) + return WasteCartridge_middle; + if ((CartState[WasteCartridge_lower] == CartridgeStateSELECTED)||(CartState[WasteCartridge_lower] == CartridgeStateACTIVE)) + return WasteCartridge_lower; + //no selected/active cartridge yet + if (CartState[WasteCartridge_middle] == CartridgeStateIN) { + CartState[WasteCartridge_middle] = CartridgeStateSELECTED; + return WasteCartridge_middle; + } + if (CartState[WasteCartridge_lower] == CartridgeStateIN) { + CartState[WasteCartridge_lower] = CartridgeStateSELECTED; + return WasteCartridge_lower; + } + return MaxWasteCartridges; +} + +void cartFILLING_START(void) //{set state of SELECTED to ACTIVE} +{ + if (CartState[WasteCartridge_middle] == CartridgeStateSELECTED) { + Report("Cartridges middle Cart active", __FILE__, __LINE__, WasteCartridge_middle, RpMessage, CartState[WasteCartridge_middle], 0); + CartState[WasteCartridge_middle] = CartridgeStateACTIVE; + CartLed[WasteCartridge_middle]->color = BLINK; + } else if (CartState[WasteCartridge_lower] == CartridgeStateSELECTED) { + Report("Cartridges lower Cart active", __FILE__, __LINE__, WasteCartridge_lower, RpMessage, CartState[WasteCartridge_lower], 0); + CartState[WasteCartridge_lower] = CartridgeStateACTIVE; + CartLed[WasteCartridge_lower]->color = BLINK; + } else { + Report("Cartridges start with no selected cartridge", __FILE__, __LINE__, CartState[WasteCartridge_middle], RpMessage, CartState[WasteCartridge_lower], 0); + } +} + +void cartFILLING_END(void) +{ + //{set state of ACTIVE to FULL} + if (CartState[WasteCartridge_middle] == CartridgeStateACTIVE) { + CartState[WasteCartridge_middle] = CartridgeStateFULL; + CartLed[WasteCartridge_middle]->color = colorOFF; + } else if (CartState[WasteCartridge_lower] == CartridgeStateACTIVE) { + CartState[WasteCartridge_lower] = CartridgeStateFULL; + CartLed[WasteCartridge_lower]->color = colorOFF; + } else { + Report("Cartridges end with no active cartridge", __FILE__, __LINE__, CartState[WasteCartridge_middle], RpMessage, CartState[WasteCartridge_lower], 0); + } +} + +CartridgeStateEnum cartGetState(WasteCartridgeEnum CartId) +{ + assert (CartId<MaxWasteCartridges); + return CartState[CartId]; +} + +bool cartGetPresence (WasteCartridgeEnum CartId) +{ + assert (CartId<MaxWasteCartridges); + if (CartState[CartId] == CartridgeStateOUT) + return false; + else + return true; +} + +bool NoCartAvailable() +{ + uint32_t CartId; + + for(CartId = CART_2; CartId <= CART_3; CartId++) { + if (Is_Cartridge_Present(CartId)) + return false; + } + return true; +} + +WasteCartridgeEnum cartGetActiveCart() +{ + uint32_t CartId; + + for (CartId = 0; CartId < MaxWasteCartridges; CartId++) { + if (CartState[CartId] == CartridgeStateACTIVE) + return CartId; + } + return MaxWasteCartridges; +} + +WasteCartridgeEnum cartNotAllFull() +{ + uint32_t CartId; + + for (CartId = WasteCartridge_middle; CartId < MaxWasteCartridges; CartId++) { + if (CartState[CartId] != CartridgeStateFULL) + return true; + } + return false; +} + +void Waste_Init() +{ + CartState[WasteCartridge_middle] = CartridgeStateOUT; + CartState[WasteCartridge_lower] = CartridgeStateOUT; + DoorState = OPEN; +} + +bool cartCart_door()//Polled by polling function. Notify waste. Poll each 1 second. During active filling poll each 100msec +{ + if(Get_COVER_1_State(CartridgesDoor))//to check the polarity + { + DoorState = OPEN; + } + else + { + DoorState = CLOSE; + } +#ifdef WHS_DEBUG + DoorState = CLOSE; +#endif + return DoorState; +} + +//Waste_DoorOpenDuringEmptying +uint32_t Waste_DoorOpenDuringEmptying(uint32_t IfIndex, uint32_t ReadValue) +{ + cartCart_door(); + if ((DoorState == OPEN) && (WasteTankState == WasteTankStateEmptying)) { + SetWastePump(CLOSE); + WasteTankState = WasteTankStatePaused; + Report("move to WasteTankStatePaused", __FILE__, __LINE__, DoorState, RpMessage, WasteTankState, 0); + } + if ((DoorState == CLOSE) && (WasteTankState == WasteTankStatePaused)) { + if (cartGetActiveCart() != MaxWasteCartridges) { + SetWastePump(OPEN); + WasteTankState = WasteTankStateEmptying; + Report("return to WasteTankStateEmptying", __FILE__, __LINE__, DoorState, RpMessage, WasteTankState, 0); + } else { + Report("WasteTankStateEmptying no active cart", __FILE__, __LINE__, 0, RpMessage, 0, 0); + WasteTankState = WasteTankStateIdle; + Report("move to WasteTankStateIdle", __FILE__, __LINE__, DoorState, RpMessage, WasteTankState, 0); + } + } + return OK; +#warning add alarm on door open +} + +void Waste_StateMachine_OneSecond_Call(void) +{ + static int init = 1; + static WasteTankStateEnum prev_state = 0; + static int prev_wasteLevel = 0; + + //call cartridge state + if ((Is_Cartridge_Present(CART_2) != cartGetPresence(WasteCartridge_middle)) || (init)) { + if (Is_Cartridge_Present(CART_2)) { + cartCART_INSERTED(WasteCartridge_middle); + } else { + cartCART_EXTRACTED(WasteCartridge_middle); + } + } + if ((Is_Cartridge_Present(CART_3) != cartGetPresence(WasteCartridge_lower)) || (init)) { + if (Is_Cartridge_Present(CART_3)) { + cartCART_INSERTED(WasteCartridge_lower); + } else { + cartCART_EXTRACTED(WasteCartridge_lower); + } + } + + //call door state + cartCart_door(); + + //call waste tank level +#ifndef WHS_DEBUG + wasteLevel = GetWHSWasteTankLevelMiliLiter(); +#endif + + if ((WasteTankState != prev_state) || (abs(wasteLevel - prev_wasteLevel) > 50)) { + Report("Waste_StateMachine_OneSecond_Call", __FILE__, WasteTankState, SelectedCard, RpMessage, wasteLevel, 0); + prev_state = WasteTankState; + prev_wasteLevel = wasteLevel; + } + + //call state machine + Waste_StateMachine(); + + if(init) + init = 0; + +#ifdef WHS_DEBUG + wasteLevel += 50; +#endif +} + +void Waste_StateMachine(void) +{ + uint32_t activeCart; + switch (WasteTankState) + { + case WasteTankStateIdle: + if (wasteLevel > wasteLevelOverFlow) { + AlarmHandlingSetAlarm( EVENT_TYPE__WASTE_CONTAINER_OVERFLOW, true); + } else { + AlarmHandlingSetAlarm( EVENT_TYPE__WASTE_CONTAINER_OVERFLOW, false); + } + if (cartNotAllFull() == true) { + AlarmHandlingSetAlarm( EVENT_TYPE__ALL_WASTE_CARTRIDGES_FULL, false); + } + if (wasteLevel > wasteLevelFull) { + //check if power down in process + if ( PowerOffInProcessGetState() ) { + Report("Power-down in process", __FILE__, __LINE__, 0, RpMessage, 0, 0); + break; + } + + //check door + if (DoorState == OPEN) { + Report("Close cartridge cover", __FILE__, __LINE__, DoorState, RpMessage, 0, 0); + break; + } + + // select cartridge + SelectedCard = cartSELECT_CART(); + if (SelectedCard == MaxWasteCartridges) { + Report("No Available cart", __FILE__, __LINE__, SelectedCard, RpMessage, 0, 0); + AlarmHandlingSetAlarm( EVENT_TYPE__NO_WASTE_CARTRIDGE_AVAILABLE, true); + break; + } else { + AlarmHandlingSetAlarm( EVENT_TYPE__NO_WASTE_CARTRIDGE_AVAILABLE, false); + } + + //check RFID? (TBD) + + //move to next state + WasteTankState = WasteTankStateFull; + Report("move to WasteTankStateFull", __FILE__, __LINE__, DoorState, RpMessage, WasteTankState, 0); + } + break; + case WasteTankStateFull: + //set cart Active + cartFILLING_START(); + + // set valve selection + activeCart = cartGetActiveCart(); + Valve_Set(VALVE_WASTE_TANK, activeCart); + Report("WasteTankStateEmptying set valve", __FILE__, __LINE__, activeCart, RpMessage, 0, 0); + + // RFID change status - TBD + + // set count down + timeout_counter = 1; + + // set emptying limit + wasteLevelEmpty = wasteLevel - WASTE_CARTRIDGE_SIZE; + + // start a timer to observe door opening + Cartridge_Cover_Control = AddControlCallback("Cartridge Cover Door", Waste_DoorOpenDuringEmptying, 100, cartCart_door, 0, 0, 0); + Report("add control Cartridge Cover Door", __FILE__, __LINE__, 0, RpMessage, 0, 0); + + SetWastePump(OPEN); + Report("WasteTankStateEmptying set Pump Open", __FILE__, __LINE__, activeCart, RpMessage, 0, 0); + + //start emptying + WasteTankState = WasteTankStateEmptying; + break; + case WasteTankStateEmptying: + // if time out or emptying done - idle + if (timeout_counter++ > WASTE_EMPTING_TIMEOUT) { + SetWastePump(CLOSE); + cartFILLING_END(); + // RFID change status - TBD + WasteTankState = WasteTankStateIdle; + Report("WasteTankStateEmptying TimeOut", __FILE__, __LINE__, 0, RpMessage, 0, 0); + AlarmHandlingSetAlarm( EVENT_TYPE__WASTE_CONTAINER_EMPTYING_TIMEOUT, true); + RemoveControlCallback(Cartridge_Cover_Control, Waste_DoorOpenDuringEmptying); + } else if (wasteLevel < wasteLevelEmpty) { + SetWastePump(CLOSE); + cartFILLING_END(); + // RFID change status - TBD + WasteTankState = WasteTankStateIdle; + RemoveControlCallback(Cartridge_Cover_Control, Waste_DoorOpenDuringEmptying); + if (cartNotAllFull() == false) + AlarmHandlingSetAlarm( EVENT_TYPE__ALL_WASTE_CARTRIDGES_FULL, true); + Report("WasteTankStateEmptying done", __FILE__, __LINE__, 0, RpMessage, 0, 0); + } +#ifdef WHS_DEBUG + wasteLevel -= 100; + timeout_counter += 10; +#endif + break; + case WasteTankStatePaused: + Report("WasteTankStatePaused...", __FILE__, __LINE__, 0, RpMessage, 0, 0); + break; + default: + Report("wrong state", __FILE__, WasteTankState, 0, RpMessage, SelectedCard, 0); + break; + } +} diff --git a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.h b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.h new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.h diff --git a/Software/Embedded_SW/Embedded/Software Release Notes.txt b/Software/Embedded_SW/Embedded/Software Release Notes.txt index b53a7016f..8857b69eb 100644 --- a/Software/Embedded_SW/Embedded/Software Release Notes.txt +++ b/Software/Embedded_SW/Embedded/Software Release Notes.txt @@ -1,3 +1,26 @@ +Embedded SW Release note - Version 1.4.6.35 - Pack Mid alpha +============================================================= +Arc head - activate arc heaters gradually +stop FPGA Reinit after 20 trials +Head cleaning - move actuators (with stub - 0xAD7) +fix RML PID support +head open prevent job - (with stub - 0xAD6) +add stub to overrule cone missing - 0xAD8 + +Embedded SW Release note - Version 1.4.6.34 - Pack 2+ +============================================================= +Validate IFS and cartridge location on manual waste handling - bug #3033 +better handling of powerstep01 configuration and motors clocks +waste level: logs, fixed reading during waste filling, +fix PT100 reading in WHS //important, OK +improve diespensers reading in I2C timing //important OK +alarm handling: fix report (mid tank empty) +diagnostics - waste level in liters +Heating and process - avoid activating all heaters at once. tested for flat head. +Heating - remove alarms when colling dwn due to change of RML or idle mode +Thread - improve feeder tension handling +system: hold initalization process after 3 failures to enable code / parameters change and debugging + Embedded SW Release note - Version 1.4.6.33 - Pack 2+ ============================================================= remove logs from I2C errors - show only summary. diff --git a/Software/PMR/Messages/Diagnostics/EventType.proto b/Software/PMR/Messages/Diagnostics/EventType.proto index b7872cf35..c165e893f 100644 --- a/Software/PMR/Messages/Diagnostics/EventType.proto +++ b/Software/PMR/Messages/Diagnostics/EventType.proto @@ -83,7 +83,7 @@ enum EventType CARTRIDGES_COVER_OPEN = 2006; //Cover is open. Cannot execute job (Group = GeneralHardware, Category = Error) - REAR_COVER_OPEN = 2007; + ARCH_COVER_OPEN = 2007; //The machine temperature is too high. Cannot execute job (Group = GeneralHardware, Category = Critical) MACHINE_INTERNAL_OVERTEMPERATURE = 2008; @@ -124,6 +124,9 @@ enum EventType //Software error has occurred (Group = GeneralHardware, Category = Error) UNINTENDED_RESET = 2020; + //Temperature measurement error has occurred. Cannot execute job. (Group = GeneralHardware, Category = Error) + TEMPERATURE_MEASUREMENT_ERROR = 2021; + //Thread break. Cannot execute job (Group = ThreadFeedingSystem, Category = Error) THREAD_BREAK = 3000; @@ -625,6 +628,24 @@ enum EventType //Dyeing head actuator did not reach position. Cannot execute job (Group = DyeingHead, Category = Error) DYEING_HEAD_LEFT_ACTUATOR_DOWN_TIMEOUT = 5092; + //Dyeing head blower flow is too high. Cannot execute job (Group = DyeingHead, Category = Error) + DYEING_HEAD_BLOWER_1_FLOW_TOO_HIGH = 5093; + + //Dyeing head blower flow is too high. Cannot execute job (Group = DyeingHead, Category = Error) + DYEING_HEAD_BLOWER_2_FLOW_TOO_HIGH = 5094; + + //Dyeing head blower flow is too low. Cannot execute job (Group = DyeingHead, Category = Error) + DYEING_HEAD_BLOWER_1_FLOW_TOO_LOW = 5095; + + //Dyeing head blower flow is too low. Cannot execute job (Group = DyeingHead, Category = Error) + DYEING_HEAD_BLOWER_2_FLOW_TOO_LOW = 5096; + + //Dyeing head arc lid is open. Cannot execute job. (Group = DyeingHead, Category = Error) + DYEING_HEAD_ARC_LID_IS_OPEN = 5097; + + //Dyeing head tunnel lid is open. Cannot execute job (Group = DyeingHead, Category = Error) + DYEING_HEAD_TUNNEL_LID_IS_OPEN = 5098; + //The temperature in the mixer is too high. Cannot execute job (Group = Mixer, Category = Critical) MIXER_OVERTEMPERATURE = 6000; @@ -667,28 +688,28 @@ enum EventType //Overpressure in lubricant dispenser. Cannot execute job (Group = Dispensers, Category = Critical) DISPENSER_8_OVERPRESSURE = 7007; - //The pressure in black dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + //The pressure in black dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) DISPENSER_1_UNDERPRESSURE = 7008; - //The pressure in cyan dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + //The pressure in cyan dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) DISPENSER_2_UNDERPRESSURE = 7009; - //The pressure in magenta dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + //The pressure in magenta dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) DISPENSER_3_UNDERPRESSURE = 7010; - //The pressure in yellow dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + //The pressure in yellow dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) DISPENSER_4_UNDERPRESSURE = 7011; - //The pressure in transparent ink dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + //The pressure in transparent ink dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) DISPENSER_5_UNDERPRESSURE = 7012; - //The pressure in spot color 1 dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + //The pressure in spot color 1 dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) DISPENSER_6_UNDERPRESSURE = 7013; - //The pressure in cleaner dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + //The pressure in cleaner dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) DISPENSER_7_UNDERPRESSURE = 7014; - //The pressure in lubricant dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + //The pressure in lubricant dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) DISPENSER_8_UNDERPRESSURE = 7015; //Black dispenser is empty (Group = Dispensers, Category = Error) @@ -1024,7 +1045,7 @@ enum EventType //Chiller malfunction. Cannot execute job (Group = WasteHandlingSystem, Category = Critical) CHILLER_DRY_CONTACT = 9006; - //Insufficient air flow. Cannot execute job (Group = WasteHandlingSystem, Category = Critical) + //Insufficient air flow. Cannot execute job (Group = WasteHandlingSystem, Category = Error) INSUFFICIENT_AIR_FLOW = 9007; //Air quality alert. Cannot execute job (Group = WasteHandlingSystem, Category = Critical) diff --git a/Software/Stubs Collection/stubs/technician view files/new head.tpf b/Software/Stubs Collection/stubs/technician view files/new head.tpf index 25215919f..2ae59d2ed 100644 --- a/Software/Stubs Collection/stubs/technician view files/new head.tpf +++ b/Software/Stubs Collection/stubs/technician view files/new head.tpf @@ -27,7 +27,7 @@ <HeaterState> <HeaterType>DryerAirHeater</HeaterType> <SetPoint>0</SetPoint> - <CurrentValue>69.85</CurrentValue> + <CurrentValue>176.1</CurrentValue> <IsActive>false</IsActive> <IsRampingUp>false</IsRampingUp> <IsInSetPoint>true</IsInSetPoint> @@ -46,8 +46,8 @@ <HeaterState> <HeaterType>DryerMainHeater</HeaterType> <SetPoint>0</SetPoint> - <CurrentValue>92.97</CurrentValue> - <IsActive>false</IsActive> + <CurrentValue>208.58999999999998</CurrentValue> + <IsActive>true</IsActive> <IsRampingUp>false</IsRampingUp> <IsInSetPoint>true</IsInSetPoint> </HeaterState> @@ -65,8 +65,8 @@ <HeaterState> <HeaterType>DryerSecondaryHeater</HeaterType> <SetPoint>0</SetPoint> - <CurrentValue>92.94</CurrentValue> - <IsActive>true</IsActive> + <CurrentValue>209.10999999999999</CurrentValue> + <IsActive>false</IsActive> <IsRampingUp>false</IsRampingUp> <IsInSetPoint>true</IsInSetPoint> </HeaterState> @@ -84,7 +84,7 @@ <HeaterState> <HeaterType>HeaterZone3</HeaterType> <SetPoint>0</SetPoint> - <CurrentValue>39.55</CurrentValue> + <CurrentValue>96.71</CurrentValue> <IsActive>false</IsActive> <IsRampingUp>false</IsRampingUp> <IsInSetPoint>true</IsInSetPoint> @@ -103,7 +103,7 @@ <HeaterState> <HeaterType>HeaterZone2</HeaterType> <SetPoint>0</SetPoint> - <CurrentValue>37.29</CurrentValue> + <CurrentValue>88.699999999999989</CurrentValue> <IsActive>false</IsActive> <IsRampingUp>false</IsRampingUp> <IsInSetPoint>true</IsInSetPoint> @@ -122,7 +122,7 @@ <HeaterState> <HeaterType>HeaterZone1</HeaterType> <SetPoint>0</SetPoint> - <CurrentValue>34.27</CurrentValue> + <CurrentValue>76.08</CurrentValue> <IsActive>false</IsActive> <IsRampingUp>false</IsRampingUp> <IsInSetPoint>true</IsInSetPoint> @@ -141,7 +141,7 @@ <HeaterState> <HeaterType>MixerHeater</HeaterType> <SetPoint>0</SetPoint> - <CurrentValue>54.669999999999995</CurrentValue> + <CurrentValue>78.37</CurrentValue> <IsActive>false</IsActive> <IsRampingUp>false</IsRampingUp> <IsInSetPoint>true</IsInSetPoint> @@ -179,7 +179,7 @@ <HeaterState> <HeaterType>HeaterZone5</HeaterType> <SetPoint>0</SetPoint> - <CurrentValue>43.389999999999993</CurrentValue> + <CurrentValue>0</CurrentValue> <IsActive>false</IsActive> <IsRampingUp>false</IsRampingUp> <IsInSetPoint>true</IsInSetPoint> @@ -289,7 +289,7 @@ <HeaterState> <HeaterType>HeaterZone7</HeaterType> <SetPoint>0</SetPoint> - <CurrentValue>50.449999999999996</CurrentValue> + <CurrentValue>6.59</CurrentValue> <IsActive>false</IsActive> <IsRampingUp>false</IsRampingUp> <IsInSetPoint>true</IsInSetPoint> @@ -559,7 +559,7 @@ <HeaterState> <HeaterType>HeadCoverHeater1</HeaterType> <SetPoint>0</SetPoint> - <CurrentValue>283.75</CurrentValue> + <CurrentValue>174.69</CurrentValue> <IsActive>false</IsActive> <IsRampingUp>false</IsRampingUp> <IsInSetPoint>true</IsInSetPoint> @@ -578,7 +578,7 @@ <HeaterState> <HeaterType>HeadCoverHeater2</HeaterType> <SetPoint>0</SetPoint> - <CurrentValue>283.75</CurrentValue> + <CurrentValue>174.95999999999998</CurrentValue> <IsActive>false</IsActive> <IsRampingUp>false</IsRampingUp> <IsInSetPoint>true</IsInSetPoint> @@ -654,44 +654,44 @@ <ColorNumber>-1</ColorNumber> </TechItem> <TechItem xsi:type="ProcessParametersItem"> - <ID>38e5d1ac-40a5-4c5f-822c-51813cb15b7b</ID> - <Left>31</Left> - <Top>144.3584070796461</Top> - <Width>310</Width> - <Height>315.12831858407088</Height> + <ID>d2e09fbf-2ac8-4c32-a4f5-45e50e305098</ID> + <Left>1016</Left> + <Top>821.96460176991263</Top> + <Width>361</Width> + <Height>233.95575221238948</Height> <Angle>0</Angle> <ColorNumber>-14774017</ColorNumber> <ProcessParameters> <ID>0</ID> - <Guid>ce709f03-59be-410d-a928-e942c0c46ce3</Guid> - <LastUpdated>2020-02-09T12:45:24.1272815Z</LastUpdated> - <Name>Process parameters 6</Name> - <DyeingSpeed>50</DyeingSpeed> + <Guid>9b265a7c-cc48-4c5a-abed-dfa8c8e3099f</Guid> + <LastUpdated>2020-02-09T13:11:03.3185652Z</LastUpdated> + <Name>Process parameters 2</Name> + <DyeingSpeed>0</DyeingSpeed> <MinInkUptake>0</MinInkUptake> <MaxInkUptake>0</MaxInkUptake> <FeederTension>0</FeederTension> - <PullerTension>5000</PullerTension> - <WinderTension>5000</WinderTension> - <MixerTemp>80</MixerTemp> - <HeadZone1Temp>80</HeadZone1Temp> - <HeadZone2Temp>90</HeadZone2Temp> - <HeadZone3Temp>110</HeadZone3Temp> - <HeadZone4Temp>120</HeadZone4Temp> - <HeadZone5Temp>120</HeadZone5Temp> - <HeadZone6Temp>135</HeadZone6Temp> - <DryerAirFlow>7</DryerAirFlow> - <DryerZone1Temp>190</DryerZone1Temp> + <PullerTension>0</PullerTension> + <WinderTension>0</WinderTension> + <MixerTemp>0</MixerTemp> + <HeadZone1Temp>0</HeadZone1Temp> + <HeadZone2Temp>0</HeadZone2Temp> + <HeadZone3Temp>0</HeadZone3Temp> + <HeadZone4Temp>0</HeadZone4Temp> + <HeadZone5Temp>0</HeadZone5Temp> + <HeadZone6Temp>0</HeadZone6Temp> + <DryerAirFlow>0</DryerAirFlow> + <DryerZone1Temp>100</DryerZone1Temp> <DryerZone2Temp>0</DryerZone2Temp> <DryerZone3Temp>0</DryerZone3Temp> <DryerBufferLength>0</DryerBufferLength> - <HeadAirFlow>12</HeadAirFlow> + <HeadAirFlow>0</HeadAirFlow> <TableIndex>0</TableIndex> - <HeadZone7Temp>135</HeadZone7Temp> - <HeadZone8Temp>125</HeadZone8Temp> - <HeadZone9Temp>135</HeadZone9Temp> - <HeadZone10Temp>135</HeadZone10Temp> - <HeadZone11Temp>140</HeadZone11Temp> - <HeadZone12Temp>140</HeadZone12Temp> + <HeadZone7Temp>0</HeadZone7Temp> + <HeadZone8Temp>0</HeadZone8Temp> + <HeadZone9Temp>0</HeadZone9Temp> + <HeadZone10Temp>0</HeadZone10Temp> + <HeadZone11Temp>0</HeadZone11Temp> + <HeadZone12Temp>0</HeadZone12Temp> <RBlowerFlow>0</RBlowerFlow> <RBlowerTemp>0</RBlowerTemp> <LBlowerFlow>0</LBlowerFlow> @@ -700,159 +700,166 @@ </ProcessParameters> <ParametersIndices> <ParameterIndex> - <Name>Process Parameters Tables Group Guid</Name> + <Name>Name</Name> <Index>0</Index> </ParameterIndex> <ParameterIndex> - <Name>Name</Name> + <Name>Dyeing Speed</Name> <Index>1</Index> </ParameterIndex> <ParameterIndex> - <Name>Table Index</Name> + <Name>Min Ink Uptake</Name> <Index>2</Index> </ParameterIndex> <ParameterIndex> - <Name>Dyeing Speed</Name> + <Name>Max Ink Uptake</Name> <Index>3</Index> </ParameterIndex> <ParameterIndex> - <Name>Min Ink Uptake</Name> + <Name>Feeder Tension</Name> <Index>4</Index> </ParameterIndex> <ParameterIndex> - <Name>Max Ink Uptake</Name> + <Name>Puller Tension</Name> <Index>5</Index> </ParameterIndex> <ParameterIndex> - <Name>Feeder Tension</Name> + <Name>Winder Tension</Name> <Index>6</Index> </ParameterIndex> <ParameterIndex> - <Name>Puller Tension</Name> + <Name>Mixer Temp</Name> <Index>7</Index> </ParameterIndex> <ParameterIndex> - <Name>Winder Tension</Name> + <Name>Head Zone 1 Temp</Name> <Index>8</Index> </ParameterIndex> <ParameterIndex> - <Name>Mixer Temp</Name> + <Name>Head Zone 2 Temp</Name> <Index>9</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 1 Temp</Name> + <Name>Head Zone 3 Temp</Name> <Index>10</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 2 Temp</Name> + <Name>Head Zone 4 Temp</Name> <Index>11</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 3 Temp</Name> + <Name>Head Zone 5 Temp</Name> <Index>12</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 4 Temp</Name> + <Name>Head Zone 6 Temp</Name> <Index>13</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 5 Temp</Name> + <Name>Dryer Air Flow</Name> <Index>14</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 6 Temp</Name> + <Name>Dryer Zone 1 Temp</Name> <Index>15</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 7 Temp</Name> + <Name>Dryer Zone 2 Temp</Name> <Index>16</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 8 Temp</Name> + <Name>Dryer Zone 3 Temp</Name> <Index>17</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 9 Temp</Name> + <Name>Dryer Buffer Length</Name> <Index>18</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 10 Temp</Name> + <Name>Head Air Flow</Name> <Index>19</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 11 Temp</Name> + <Name>Process Parameters Tables Group Guid</Name> <Index>20</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 12 Temp</Name> + <Name>Table Index</Name> <Index>21</Index> </ParameterIndex> - <ParameterIndex> - <Name>St Sp Zone 1 Temp</Name> - <Index>22</Index> - </ParameterIndex> - <ParameterIndex> - <Name>St Sp Zone 2 Temp</Name> - <Index>23</Index> - </ParameterIndex> - <ParameterIndex> - <Name>Dryer Zone 1 Temp</Name> - <Index>24</Index> - </ParameterIndex> - <ParameterIndex> - <Name>Dryer Zone 2 Temp</Name> - <Index>25</Index> - </ParameterIndex> - <ParameterIndex> - <Name>Dryer Zone 3 Temp</Name> - <Index>26</Index> - </ParameterIndex> - <ParameterIndex> - <Name>Dryer Air Flow</Name> - <Index>27</Index> - </ParameterIndex> - <ParameterIndex> - <Name>Head Air Flow</Name> - <Index>28</Index> - </ParameterIndex> - <ParameterIndex> - <Name>Dryer Buffer Length</Name> - <Index>29</Index> - </ParameterIndex> </ParametersIndices> </TechItem> + <TechItem xsi:type="MonitorItem"> + <ID>11f4748e-ed30-48d6-a08a-afeaa0277e2e</ID> + <Left>330</Left> + <Top>12.154867256637203</Top> + <Width>205</Width> + <Height>90.181415929203524</Height> + <Angle>0</Angle> + <ItemGuid>1778C1A7-AFB5-42F9-9E00-E80D30D9FC02</ItemGuid> + <ColorNumber>-1</ColorNumber> + <UpdateInterval>10</UpdateInterval> + <DecimalPoints>2</DecimalPoints> + </TechItem> + <TechItem xsi:type="SingleGraphItem"> + <ID>dcf78507-ea09-4529-b635-ec1eeed31141</ID> + <Left>145</Left> + <Top>842.58849557522137</Top> + <Width>357</Width> + <Height>215.82743362831855</Height> + <Angle>0</Angle> + <ItemGuid>FE0D0A56-5795-4C5A-8E09-939FBB35C441</ItemGuid> + <ColorNumber>-14774017</ColorNumber> + <Duration>1275</Duration> + <Min>0</Min> + <Max>100</Max> + <UseAutoRange>true</UseAutoRange> + <DecimalPlaces>2</DecimalPlaces> + </TechItem> + <TechItem xsi:type="MonitorItem"> + <ID>85762a06-25d4-457a-9974-7eab916d65c5</ID> + <Left>540</Left> + <Top>4.0486725663717493</Top> + <Width>205</Width> + <Height>90.181415929203524</Height> + <Angle>0</Angle> + <ItemGuid>055D0A38-09BD-490D-9852-12B06A4B22F2</ItemGuid> + <ColorNumber>-1</ColorNumber> + <UpdateInterval>10</UpdateInterval> + <DecimalPoints>0</DecimalPoints> + </TechItem> <TechItem xsi:type="ProcessParametersItem"> - <ID>d2e09fbf-2ac8-4c32-a4f5-45e50e305098</ID> - <Left>1016</Left> - <Top>821.96460176991263</Top> - <Width>361</Width> - <Height>233.95575221238948</Height> + <ID>36f69103-89b6-4076-b8f3-bf4a0806ba05</ID> + <Left>18.250000000000007</Left> + <Top>132.59405940594058</Top> + <Width>317.70833333333337</Width> + <Height>392.24752475247521</Height> <Angle>0</Angle> <ColorNumber>-14774017</ColorNumber> <ProcessParameters> <ID>0</ID> - <Guid>9b265a7c-cc48-4c5a-abed-dfa8c8e3099f</Guid> - <LastUpdated>2020-02-09T13:11:03.3185652Z</LastUpdated> - <Name>Process parameters 2</Name> - <DyeingSpeed>0</DyeingSpeed> + <Guid>0025b28d-1475-4af2-b50e-ecc344c3e43a</Guid> + <LastUpdated>2020-07-05T08:17:42.9870702Z</LastUpdated> + <Name>Process parameters 4</Name> + <DyeingSpeed>50</DyeingSpeed> <MinInkUptake>0</MinInkUptake> <MaxInkUptake>0</MaxInkUptake> <FeederTension>0</FeederTension> <PullerTension>0</PullerTension> <WinderTension>0</WinderTension> - <MixerTemp>0</MixerTemp> - <HeadZone1Temp>0</HeadZone1Temp> - <HeadZone2Temp>0</HeadZone2Temp> - <HeadZone3Temp>0</HeadZone3Temp> + <MixerTemp>80</MixerTemp> + <HeadZone1Temp>80</HeadZone1Temp> + <HeadZone2Temp>90</HeadZone2Temp> + <HeadZone3Temp>100</HeadZone3Temp> <HeadZone4Temp>0</HeadZone4Temp> <HeadZone5Temp>0</HeadZone5Temp> <HeadZone6Temp>0</HeadZone6Temp> <DryerAirFlow>0</DryerAirFlow> - <DryerZone1Temp>100</DryerZone1Temp> + <DryerZone1Temp>180</DryerZone1Temp> <DryerZone2Temp>0</DryerZone2Temp> <DryerZone3Temp>0</DryerZone3Temp> <DryerBufferLength>0</DryerBufferLength> - <HeadAirFlow>0</HeadAirFlow> + <HeadAirFlow>3</HeadAirFlow> <TableIndex>0</TableIndex> <HeadZone7Temp>0</HeadZone7Temp> <HeadZone8Temp>0</HeadZone8Temp> @@ -860,142 +867,147 @@ <HeadZone10Temp>0</HeadZone10Temp> <HeadZone11Temp>0</HeadZone11Temp> <HeadZone12Temp>0</HeadZone12Temp> - <RBlowerFlow>0</RBlowerFlow> - <RBlowerTemp>0</RBlowerTemp> - <LBlowerFlow>0</LBlowerFlow> - <LBlowerTemp>0</LBlowerTemp> + <RBlowerFlow>180</RBlowerFlow> + <RBlowerTemp>180</RBlowerTemp> + <LBlowerFlow>180</LBlowerFlow> + <LBlowerTemp>180</LBlowerTemp> <PressureBuildUp>0</PressureBuildUp> </ProcessParameters> <ParametersIndices> <ParameterIndex> - <Name>Name</Name> + <Name>Process Parameters Tables Group Guid</Name> <Index>0</Index> </ParameterIndex> <ParameterIndex> - <Name>Dyeing Speed</Name> + <Name>Name</Name> <Index>1</Index> </ParameterIndex> <ParameterIndex> - <Name>Min Ink Uptake</Name> + <Name>Table Index</Name> <Index>2</Index> </ParameterIndex> <ParameterIndex> - <Name>Max Ink Uptake</Name> + <Name>Dyeing Speed</Name> <Index>3</Index> </ParameterIndex> <ParameterIndex> - <Name>Feeder Tension</Name> + <Name>Min Ink Uptake</Name> <Index>4</Index> </ParameterIndex> <ParameterIndex> - <Name>Puller Tension</Name> + <Name>Max Ink Uptake</Name> <Index>5</Index> </ParameterIndex> <ParameterIndex> - <Name>Winder Tension</Name> + <Name>Feeder Tension</Name> <Index>6</Index> </ParameterIndex> <ParameterIndex> - <Name>Mixer Temp</Name> + <Name>Puller Tension</Name> <Index>7</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 1 Temp</Name> + <Name>Winder Tension</Name> <Index>8</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 2 Temp</Name> + <Name>Mixer Temp</Name> <Index>9</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 3 Temp</Name> + <Name>Head Zone 1 Temp</Name> <Index>10</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 4 Temp</Name> + <Name>Head Zone 2 Temp</Name> <Index>11</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 5 Temp</Name> + <Name>Head Zone 3 Temp</Name> <Index>12</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Zone 6 Temp</Name> + <Name>Head Zone 4 Temp</Name> <Index>13</Index> </ParameterIndex> <ParameterIndex> - <Name>Dryer Air Flow</Name> + <Name>Head Zone 5 Temp</Name> <Index>14</Index> </ParameterIndex> <ParameterIndex> - <Name>Dryer Zone 1 Temp</Name> + <Name>Head Zone 6 Temp</Name> <Index>15</Index> </ParameterIndex> <ParameterIndex> - <Name>Dryer Zone 2 Temp</Name> + <Name>Head Zone 7 Temp</Name> <Index>16</Index> </ParameterIndex> <ParameterIndex> - <Name>Dryer Zone 3 Temp</Name> + <Name>Head Zone 8 Temp</Name> <Index>17</Index> </ParameterIndex> <ParameterIndex> - <Name>Dryer Buffer Length</Name> + <Name>Head Zone 9 Temp</Name> <Index>18</Index> </ParameterIndex> <ParameterIndex> - <Name>Head Air Flow</Name> + <Name>Head Zone 10 Temp</Name> <Index>19</Index> </ParameterIndex> <ParameterIndex> - <Name>Process Parameters Tables Group Guid</Name> + <Name>Head Zone 11 Temp</Name> <Index>20</Index> </ParameterIndex> <ParameterIndex> - <Name>Table Index</Name> + <Name>Head Zone 12 Temp</Name> <Index>21</Index> </ParameterIndex> + <ParameterIndex> + <Name>R Blower Flow</Name> + <Index>22</Index> + </ParameterIndex> + <ParameterIndex> + <Name>R Blower Temp</Name> + <Index>23</Index> + </ParameterIndex> + <ParameterIndex> + <Name>L Blower Flow</Name> + <Index>24</Index> + </ParameterIndex> + <ParameterIndex> + <Name>L Blower Temp</Name> + <Index>25</Index> + </ParameterIndex> + <ParameterIndex> + <Name>Dryer Zone 1 Temp</Name> + <Index>26</Index> + </ParameterIndex> + <ParameterIndex> + <Name>Dryer Zone 2 Temp</Name> + <Index>27</Index> + </ParameterIndex> + <ParameterIndex> + <Name>Dryer Zone 3 Temp</Name> + <Index>28</Index> + </ParameterIndex> + <ParameterIndex> + <Name>Dryer Air Flow</Name> + <Index>29</Index> + </ParameterIndex> + <ParameterIndex> + <Name>Head Air Flow</Name> + <Index>30</Index> + </ParameterIndex> + <ParameterIndex> + <Name>Dryer Buffer Length</Name> + <Index>31</Index> + </ParameterIndex> + <ParameterIndex> + <Name>Pressure Build Up</Name> + <Index>32</Index> + </ParameterIndex> </ParametersIndices> </TechItem> - <TechItem xsi:type="MonitorItem"> - <ID>11f4748e-ed30-48d6-a08a-afeaa0277e2e</ID> - <Left>330</Left> - <Top>12.154867256637203</Top> - <Width>205</Width> - <Height>90.181415929203524</Height> - <Angle>0</Angle> - <ItemGuid>1778C1A7-AFB5-42F9-9E00-E80D30D9FC02</ItemGuid> - <ColorNumber>-1</ColorNumber> - <UpdateInterval>10</UpdateInterval> - <DecimalPoints>2</DecimalPoints> - </TechItem> - <TechItem xsi:type="SingleGraphItem"> - <ID>dcf78507-ea09-4529-b635-ec1eeed31141</ID> - <Left>145</Left> - <Top>842.58849557522137</Top> - <Width>357</Width> - <Height>215.82743362831855</Height> - <Angle>0</Angle> - <ItemGuid>FE0D0A56-5795-4C5A-8E09-939FBB35C441</ItemGuid> - <ColorNumber>-14774017</ColorNumber> - <Duration>1275</Duration> - <Min>0</Min> - <Max>100</Max> - <UseAutoRange>true</UseAutoRange> - <DecimalPlaces>2</DecimalPlaces> - </TechItem> - <TechItem xsi:type="MonitorItem"> - <ID>85762a06-25d4-457a-9974-7eab916d65c5</ID> - <Left>540</Left> - <Top>4.0486725663717493</Top> - <Width>205</Width> - <Height>90.181415929203524</Height> - <Angle>0</Angle> - <ItemGuid>055D0A38-09BD-490D-9852-12B06A4B22F2</ItemGuid> - <ColorNumber>-1</ColorNumber> - <UpdateInterval>10</UpdateInterval> - <DecimalPoints>0</DecimalPoints> - </TechItem> </Items> </MachineTechViewProjectTab> <MachineTechViewProjectTab> diff --git a/Software/Visual_Studio/Advanced Installer Projects/Machine Studio Installer.aip b/Software/Visual_Studio/Advanced Installer Projects/Machine Studio Installer.aip index fd2f22c0b..c410b3310 100644 --- a/Software/Visual_Studio/Advanced Installer Projects/Machine Studio Installer.aip +++ b/Software/Visual_Studio/Advanced Installer Projects/Machine Studio Installer.aip @@ -16,10 +16,10 @@ <ROW Property="ARPCOMMENTS" Value="This installer database contains the logic and data required to install [|ProductName]." ValueLocId="*"/> <ROW Property="ARPNOREPAIR" MultiBuildValue="DefaultBuild:1"/> <ROW Property="Manufacturer" Value="Twine"/> - <ROW Property="ProductCode" Value="1033:{2DDE0E64-89DD-42DB-80D0-212BA97052D2} " Type="16"/> + <ROW Property="ProductCode" Value="1033:{9E37B9B1-348D-4A0F-BD20-CD7CB78DFB73} " Type="16"/> <ROW Property="ProductLanguage" Value="1033"/> <ROW Property="ProductName" Value="Machine Studio"/> - <ROW Property="ProductVersion" Value="4.1.13.0" Type="32"/> + <ROW Property="ProductVersion" Value="4.1.14.0" Type="32"/> <ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND;AI_SETUPEXEPATH;SETUPEXEDIR"/> <ROW Property="UpgradeCode" Value="{CBEE5CAE-7C5A-4280-98DE-AA98113764E4}"/> <ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/> @@ -826,7 +826,7 @@ <ROW Action="AI_DetectSoftware" Sequence="101"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.BuildComponent"> - <ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="..\Build\Installers\Machine Studio\Release" PackageFileName="Machine Studio Installer_v4.0.9" Languages="en" InstallationType="4" CabsLocation="1" PackageType="1" FilesInsideExe="true" ExtractionFolder="[AppDataFolder][|Manufacturer]\[|ProductName] [|ProductVersion]\install" ExtUI="true" UseLargeSchema="true" ExeName="Machine Studio Installer_v4.1.13"/> + <ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="..\Build\Installers\Machine Studio\Release" PackageFileName="Machine Studio Installer_v4.0.9" Languages="en" InstallationType="4" CabsLocation="1" PackageType="1" FilesInsideExe="true" ExtractionFolder="[AppDataFolder][|Manufacturer]\[|ProductName] [|ProductVersion]\install" ExtUI="true" UseLargeSchema="true" ExeName="Machine Studio Installer_v4.1.14"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent"> <ROW Path="<AI_DICTS>ui.ail"/> diff --git a/Software/Visual_Studio/Advanced Installer Projects/PPC Installer-cache/cacheIndex.txt b/Software/Visual_Studio/Advanced Installer Projects/PPC Installer-cache/cacheIndex.txt Binary files differindex 9453b5c13..a603ff06b 100644 --- a/Software/Visual_Studio/Advanced Installer Projects/PPC Installer-cache/cacheIndex.txt +++ b/Software/Visual_Studio/Advanced Installer Projects/PPC Installer-cache/cacheIndex.txt diff --git a/Software/Visual_Studio/Advanced Installer Projects/PPC Installer.aip b/Software/Visual_Studio/Advanced Installer Projects/PPC Installer.aip index 8c5ad5e3a..de47739b9 100644 --- a/Software/Visual_Studio/Advanced Installer Projects/PPC Installer.aip +++ b/Software/Visual_Studio/Advanced Installer Projects/PPC Installer.aip @@ -18,10 +18,10 @@ <ROW Property="ARPNOREPAIR" Value="1" MultiBuildValue="DefaultBuild:1"/> <ROW Property="ARPSYSTEMCOMPONENT" Value="1"/> <ROW Property="Manufacturer" Value="Twine"/> - <ROW Property="ProductCode" Value="1033:{3B6E9062-3DBE-4A33-A51B-8238ED54DB45} " Type="16"/> + <ROW Property="ProductCode" Value="1033:{2337828E-2432-405A-B8F4-960A367F8CD1} " Type="16"/> <ROW Property="ProductLanguage" Value="1033"/> <ROW Property="ProductName" Value="Tango"/> - <ROW Property="ProductVersion" Value="1.1.19.0" Type="32"/> + <ROW Property="ProductVersion" Value="1.1.20.0" Type="32"/> <ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND;AI_SETUPEXEPATH;SETUPEXEDIR"/> <ROW Property="UpgradeCode" Value="{F8EAB8B4-FD57-45B7-8307-D52DF760273D}"/> <ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/> @@ -203,11 +203,13 @@ <ROW Component="mscoree.dll" ComponentId="{85F439D0-8FD0-4B99-888D-336C7A125E3D}" Directory_="APPDIR" Attributes="0" KeyPath="mscoree.dll"/> <ROW Component="msvcp140d.dll" ComponentId="{69E32675-9ACF-4C23-A495-300B78913B66}" Directory_="APPDIR" Attributes="0" KeyPath="msvcp140d.dll"/> <ROW Component="protobufnet.dll" ComponentId="{163F1E17-6462-4ABE-BC86-E055F7690139}" Directory_="APPDIR" Attributes="0" KeyPath="protobufnet.dll"/> + <ROW Component="turbojpeg.dll" ComponentId="{27A0FCF0-5142-4098-919F-1F41DBD4E96C}" Directory_="win7x64_Dir" Attributes="256" KeyPath="turbojpeg.dll"/> + <ROW Component="turbojpeg.dll.meta" ComponentId="{2277C165-C973-4631-B796-6072626F94FD}" Directory_="win7x64_Dir" Attributes="0" KeyPath="turbojpeg.dll.meta" Type="0"/> + <ROW Component="turbojpeg.dll.meta_1" ComponentId="{6CE58AB5-8A03-45B4-B1F2-C32484FFF26D}" Directory_="win7x86_Dir" Attributes="0" KeyPath="turbojpeg.dll.meta_1" Type="0"/> + <ROW Component="turbojpeg.dll_1" ComponentId="{0F3812A4-9F26-4D7C-92A5-A1A0DB6276D8}" Directory_="win7x86_Dir" Attributes="0" KeyPath="turbojpeg.dll_1"/> <ROW Component="ucrtbased.dll" ComponentId="{B8D025EA-CD16-4EE7-A3E7-713E2BE82BF3}" Directory_="APPDIR" Attributes="0" KeyPath="ucrtbased.dll"/> <ROW Component="vcruntime140.dll" ComponentId="{144594CC-D19B-45E4-A420-7A1BBB122EE3}" Directory_="APPDIR" Attributes="0" KeyPath="vcruntime140.dll"/> <ROW Component="vcruntime140d.dll" ComponentId="{7653420C-C6C3-4F31-97E8-D6DE417D3DF2}" Directory_="APPDIR" Attributes="0" KeyPath="vcruntime140d.dll"/> - <ROW Component="win7x64" ComponentId="{4EC45DC4-ADF4-4C04-9B3B-3DCD30209D93}" Directory_="win7x64_Dir" Attributes="0"/> - <ROW Component="win7x86" ComponentId="{CA5E862B-7791-4F9B-9B4B-AD324C04850A}" Directory_="win7x86_Dir" Attributes="0"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent"> <ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0"/> @@ -456,6 +458,10 @@ <ROW File="Tango.PPC.Shared.pdb" Component_="Tango.PPC.Shared.dll" FileName="TANGO~17.PDB|Tango.PPC.Shared.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\Tango.PPC.Shared.pdb" SelfReg="false"/> <ROW File="Tango.CSV.dll" Component_="Tango.CSV.dll" FileName="TANGOC~8.DLL|Tango.CSV.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\Tango.CSV.dll" SelfReg="false"/> <ROW File="Tango.CSV.pdb" Component_="Tango.CSV.dll" FileName="TANGOC~5.PDB|Tango.CSV.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\Tango.CSV.pdb" SelfReg="false"/> + <ROW File="turbojpeg.dll" Component_="turbojpeg.dll" FileName="TURBOJ~1.DLL|turbojpeg.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\win7-x64\turbojpeg.dll" SelfReg="false"/> + <ROW File="turbojpeg.dll.meta" Component_="turbojpeg.dll.meta" FileName="TURBOJ~1.MET|turbojpeg.dll.meta" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\win7-x64\turbojpeg.dll.meta" SelfReg="false"/> + <ROW File="turbojpeg.dll_1" Component_="turbojpeg.dll_1" FileName="TURBOJ~1.DLL|turbojpeg.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\win7-x86\turbojpeg.dll" SelfReg="false"/> + <ROW File="turbojpeg.dll.meta_1" Component_="turbojpeg.dll.meta_1" FileName="TURBOJ~1.MET|turbojpeg.dll.meta" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\win7-x86\turbojpeg.dll.meta" SelfReg="false"/> <ATTRIBUTE name="DontAddFileAttributes" value="true"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.BootstrOptComponent"> @@ -465,7 +471,7 @@ <ROW Action="AI_DetectSoftware" Sequence="101"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.BuildComponent"> - <ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="..\Build\Installers\PPC" PackageFileName="PPC Installer v1.0.3" Languages="en" InstallationType="4" CabsLocation="1" PackageType="1" FilesInsideExe="true" ExtractionFolder="[AppDataFolder][|Manufacturer]\[|ProductName] [|ProductVersion]\install" ExtUI="true" UseLargeSchema="true" ExeName="PPC Installer_v1.1.19"/> + <ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="..\Build\Installers\PPC" PackageFileName="PPC Installer v1.0.3" Languages="en" InstallationType="4" CabsLocation="1" PackageType="1" FilesInsideExe="true" ExtractionFolder="[AppDataFolder][|Manufacturer]\[|ProductName] [|ProductVersion]\install" ExtUI="true" UseLargeSchema="true" ExeName="PPC Installer_v1.1.20"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent"> <ROW Path="<AI_DICTS>ui.ail"/> @@ -533,8 +539,6 @@ <COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent"> <ROW Directory_="SHORTCUTDIR" Component_="SHORTCUTDIR" ManualDelete="false"/> <ROW Directory_="APPDIR" Component_="APPDIR" ManualDelete="true"/> - <ROW Directory_="win7x64_Dir" Component_="win7x64" ManualDelete="false"/> - <ROW Directory_="win7x86_Dir" Component_="win7x86" ManualDelete="false"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent"> <ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH_ORIGINAL" Target="[AI_SETUPEXEPATH]"/> @@ -726,8 +730,10 @@ <ROW Feature_="MainFeature" Component_="LiteDB.dll"/> <ROW Feature_="MainFeature" Component_="Tango.PPC.Shared.dll"/> <ROW Feature_="MainFeature" Component_="Tango.CSV.dll"/> - <ROW Feature_="MainFeature" Component_="win7x86"/> - <ROW Feature_="MainFeature" Component_="win7x64"/> + <ROW Feature_="MainFeature" Component_="turbojpeg.dll"/> + <ROW Feature_="MainFeature" Component_="turbojpeg.dll.meta"/> + <ROW Feature_="MainFeature" Component_="turbojpeg.dll_1"/> + <ROW Feature_="MainFeature" Component_="turbojpeg.dll.meta_1"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent"> <ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1502"/> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.PPCConsole/Views/RemoteDesktopView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.PPCConsole/Views/RemoteDesktopView.xaml index 46327eeae..95e4b4a52 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.PPCConsole/Views/RemoteDesktopView.xaml +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.PPCConsole/Views/RemoteDesktopView.xaml @@ -123,7 +123,7 @@ <Setter Property="Foreground" Value="{StaticResource FSE_PrimaryForegroundBrush}"></Setter> </DataTrigger> <DataTrigger Binding="{Binding RemoteDesktopProvider.IsWebRtcActive}" Value="True"> - <Setter Property="Text" Value="Remote desktop session is active using a fast communication channel."></Setter> + <Setter Property="Text" Value="Remote desktop session is active using a P2P communication channel."></Setter> </DataTrigger> </Style.Triggers> </Style> @@ -159,7 +159,7 @@ <Button IsEnabled="{Binding RemoteDesktopProvider.InSession}" Width="250" Margin="5" Style="{StaticResource FSE_Button_Polygon}" Content="Open Task Manager" Command="{Binding OpenTaskManagerCommand}" /> - <CheckBox Margin="5" HorizontalAlignment="Center" IsEnabled="{Binding RemoteDesktopProvider.InSession,Converter={StaticResource BooleanInverseConverter}}" IsChecked="{Binding RemoteDesktopProvider.EnableWebRtc}">Enable fast communication channel</CheckBox> + <CheckBox Margin="5" HorizontalAlignment="Center" IsEnabled="{Binding RemoteDesktopProvider.InSession,Converter={StaticResource BooleanInverseConverter}}" IsChecked="{Binding RemoteDesktopProvider.EnableWebRtc}">Enable P2P communication channel</CheckBox> </UniformGrid> </StackPanel> </Grid> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/CSV/CsvColumn.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/CSV/CsvColumn.cs new file mode 100644 index 000000000..afe65f565 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/CSV/CsvColumn.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.FSE.Procedures.CSV +{ + public class CsvColumn + { + public String Name { get; set; } + public String Description { get; set; } + public bool IsProperty { get; set; } + public PropertyInfo PropertyInfo { get; set; } + public FieldInfo FieldInfo { get; set; } + + public Object GetValue(Object obj) + { + if (IsProperty) + { + return PropertyInfo.GetValue(obj); + } + else + { + return FieldInfo.GetValue(obj); + } + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/CSV/CsvRow.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/CSV/CsvRow.cs new file mode 100644 index 000000000..db79c2e13 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/CSV/CsvRow.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.FSE.Procedures.CSV +{ + public class CsvRow + { + public Object V0 { get; set; } + public Object V1 { get; set; } + public Object V2 { get; set; } + public Object V3 { get; set; } + public Object V4 { get; set; } + public Object V5 { get; set; } + public Object V6 { get; set; } + public Object V7 { get; set; } + public Object V8 { get; set; } + public Object V9 { get; set; } + public Object V10 { get; set; } + public Object V11 { get; set; } + public Object V12 { get; set; } + public Object V13 { get; set; } + public Object V14 { get; set; } + public Object V15 { get; set; } + public Object V16 { get; set; } + public Object V17 { get; set; } + public Object V18 { get; set; } + public Object V19 { get; set; } + public Object V20 { get; set; } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Dialogs/ResultGridView.xaml.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Dialogs/ResultGridView.xaml.cs index 5dc17ed66..c16086d9f 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Dialogs/ResultGridView.xaml.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Dialogs/ResultGridView.xaml.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Reflection; using System.Text; @@ -81,18 +82,22 @@ namespace Tango.FSE.Procedures.Dialogs //Generate columns foreach (var prop in model.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) { + var att = prop.GetCustomAttribute<DescriptionAttribute>(); + grid.Columns.Add(new DataGridTextColumn() { - Header = prop.Name, + Header = att != null ? att.Description : prop.Name, Binding = new Binding($"V{columnCount++}"), }); } foreach (var field in model.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance)) { + var att = field.GetCustomAttribute<DescriptionAttribute>(); + grid.Columns.Add(new DataGridTextColumn() { - Header = field.Name, + Header = att != null ? att.Description : field.Name, Binding = new Binding($"V{columnCount++}"), }); } diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Dialogs/UserInputDialogViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Dialogs/UserInputDialogViewVM.cs index 738c71ca9..e8fc957d9 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Dialogs/UserInputDialogViewVM.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Dialogs/UserInputDialogViewVM.cs @@ -40,6 +40,7 @@ namespace Tango.FSE.Procedures.Dialogs if (Model.GetType().IsValueTypeOrString()) { Parameter p = new Parameter(); + p.Value = Model.ToStringSafe(); p.Name = "Value"; Parameters.Add(p); } diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/IProcedureContext.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/IProcedureContext.cs index 84301896d..a142e183c 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/IProcedureContext.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/IProcedureContext.cs @@ -294,8 +294,9 @@ namespace Tango.FSE.Procedures /// <summary> /// Gets the latest diagnostics package. /// </summary> + /// <param name="waitForNext">Waits for a fresh package.</param> /// <returns></returns> - DiagnosticsPackage GetDiagnosticsPackage(); + DiagnosticsPackage GetDiagnosticsPackage(bool waitForNext = false); /// <summary> /// Pauses the script execution for the specified time in milliseconds. diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/ProcedureContext.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/ProcedureContext.cs index 2ce26daa7..8724b12a5 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/ProcedureContext.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/ProcedureContext.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics; using System.IO; using System.Linq; using System.Reactive.Concurrency; @@ -31,6 +32,7 @@ namespace Tango.FSE.Procedures private IProcedureLogger _logger; private ProcedureProject _project; private Dictionary<String, ProcedureInput> _inputs; + private DiagnosticsFrame _lastDiagnosticsFrame; [TangoInject] private IMachineProvider MachineProvider { get; set; } @@ -471,8 +473,26 @@ namespace Tango.FSE.Procedures WriteLine(line); } - public DiagnosticsPackage GetDiagnosticsPackage() + public DiagnosticsPackage GetDiagnosticsPackage(bool waitForNext = false) { + if (waitForNext) + { + Stopwatch watch = new Stopwatch(); + watch.Start(); + + while (_lastDiagnosticsFrame == DiagnosticsProvider.CurrentFrame) + { + Thread.Sleep(10); + + if (watch.Elapsed.TotalSeconds > 5) + { + throw new TimeoutException("Diagnostics package did not arrive within the given time of 5 seconds."); + } + } + } + + _lastDiagnosticsFrame = DiagnosticsProvider.CurrentFrame; + return DiagnosticsProvider.CurrentFrame.ToPackage(); } diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Resources/lib_template.csx b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Resources/lib_template.csx index 3b317dbad..0fcf7da88 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Resources/lib_template.csx +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Resources/lib_template.csx @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading; diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Resources/main_template.csx b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Resources/main_template.csx index 8c17cf72f..4f0dd0922 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Resources/main_template.csx +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Resources/main_template.csx @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading; diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Result.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Result.cs index 3cd093f7f..ef63ae108 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Result.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Result.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections; using System.Collections.Generic; using System.Linq; @@ -13,8 +14,11 @@ namespace Tango.FSE.Procedures public ResultType Type { get; set; } public String Name { get; set; } public Object Value { get; set; } + + [JsonIgnore] public bool IsGraph { get; set; } + [JsonIgnore] public bool IsValueArray { get { return Value != null && typeof(IEnumerable).IsAssignableFrom(Value.GetType()) && Value.GetType() != typeof(String); } diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Tango.FSE.Procedures.csproj b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Tango.FSE.Procedures.csproj index b062266b3..8ff4f771e 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Tango.FSE.Procedures.csproj +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Tango.FSE.Procedures.csproj @@ -103,6 +103,8 @@ <Compile Include="Contracts\IProcedureDesignerView.cs" /> <Compile Include="CreateGroup.cs" /> <Compile Include="CreateItem.cs" /> + <Compile Include="CSV\CsvColumn.cs" /> + <Compile Include="CSV\CsvRow.cs" /> <Compile Include="Designer\ProjectModel.cs" /> <Compile Include="Designer\ScriptTabModel.cs" /> <Compile Include="Dialogs\AddReferenceAssemblyView.xaml.cs"> @@ -224,6 +226,10 @@ <Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project> <Name>Tango.Core</Name> </ProjectReference> + <ProjectReference Include="..\..\..\Tango.CSV\Tango.CSV.csproj"> + <Project>{58e8825f-0c96-449c-b320-1e82b0aa876b}</Project> + <Name>Tango.CSV</Name> + </ProjectReference> <ProjectReference Include="..\..\..\Tango.Integration\Tango.Integration.csproj"> <Project>{4206ac58-3b57-4699-8835-90bf6db01a61}</Project> <Name>Tango.Integration</Name> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/ViewModels/ProcedureRunnerViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/ViewModels/ProcedureRunnerViewVM.cs index cf54087ba..9d845218e 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/ViewModels/ProcedureRunnerViewVM.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/ViewModels/ProcedureRunnerViewVM.cs @@ -1,12 +1,17 @@ using System; +using System.Collections; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; using Tango.BL.Entities; using Tango.Core; using Tango.Core.Commands; +using Tango.CSV; using Tango.FSE.Common; +using Tango.FSE.Procedures.CSV; using Tango.FSE.Procedures.Dialogs; using Tango.FSE.Procedures.Messages; using Tango.FSE.Procedures.Views; @@ -104,6 +109,7 @@ namespace Tango.FSE.Procedures.ViewModels public RelayCommand StartProjectCommand { get; set; } public RelayCommand StopProjectCommand { get; set; } public RelayCommand<Result> DisplayResultGridCommand { get; set; } + public RelayCommand<Result> ExportResultGridCommand { get; set; } public ProcedureRunnerViewVM() { @@ -112,6 +118,7 @@ namespace Tango.FSE.Procedures.ViewModels StartProjectCommand = new RelayCommand(StartProject, () => ProjectRunner != null && ProjectRunner.CanRun); StopProjectCommand = new RelayCommand(StopProject, () => ProjectRunner != null && ProjectRunner.IsRunning); DisplayResultGridCommand = new RelayCommand<Result>(DisplayResultGrid); + ExportResultGridCommand = new RelayCommand<Result>(ExportResultGrid); _requiresReloadingOfProjects = true; RegisterForMessage<ProcedureProjectPublishedOrSuppressed>((x) => _requiresReloadingOfProjects = true); @@ -251,5 +258,98 @@ namespace Tango.FSE.Procedures.ViewModels NotificationProvider.ShowDialog(vm); } } + + private async void ExportResultGrid(Result result) + { + if (result != null && result.IsValueArray && (result.Value as IList).Count > 0) + { + var r = await StorageProvider.SaveFile("Export procedure result", "CSV Files|*.csv", result.Name + ".csv", ".csv"); + if (r.Confirmed) + { + using (NotificationProvider.PushTaskItem("Exporting csv file...")) + { + try + { + await Task.Factory.StartNew(() => + { + List<Object> values = (result.Value as IEnumerable).Cast<Object>().ToList(); + + var model = values.First(); + + if (model.GetType().IsValueTypeOrString()) + { + CsvFile<CsvRow> csvFile = new CsvFile<CsvRow>(new CsvDestination(r.SelectedItem), new CsvDefinition() { Columns = new List<String>() { "Values" } }); + + foreach (var value in values) + { + csvFile.Append(new CsvRow() + { + V0 = value + }); + } + + csvFile.Dispose(); + } + else + { + List<CsvColumn> columns = new List<CsvColumn>(); + + //prop columns + foreach (var prop in model.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) + { + var att = prop.GetCustomAttribute<DescriptionAttribute>(); + columns.Add(new CsvColumn() + { + Name = prop.Name, + Description = att != null ? att.Description : prop.Name, + IsProperty = true, + PropertyInfo = prop + }); + } + + //field columns + foreach (var field in model.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance)) + { + var att = field.GetCustomAttribute<DescriptionAttribute>(); + columns.Add(new CsvColumn() + { + Name = field.Name, + Description = att != null ? att.Description : field.Name, + FieldInfo = field + }); + } + + CsvFile<CsvRow> csvFile = new CsvFile<CsvRow>(new CsvDestination(r.SelectedItem), new CsvDefinition() { Columns = columns.Select(x => x.Description).ToList() }); + + List<PropertyInfo> rowProps = typeof(CsvRow).GetProperties().ToList(); + + foreach (var value in values) + { + CsvRow row = new CsvRow(); + + for (int i = 0; i < columns.Count; i++) + { + var column = columns[i]; + rowProps[i].SetValue(row, column.GetValue(value)); + } + + csvFile.Append(row); + } + + csvFile.Dispose(); + } + }); + + await NotificationProvider.ShowSuccess("File exported successfully."); + } + catch (Exception ex) + { + LogManager.Log(ex, "Error exporting csv file."); + await NotificationProvider.ShowError($"Error occurred while exporting the csv file.\n{ex.FlattenMessage()}"); + } + } + } + } + } } } diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Views/ProcedureDesignerView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Views/ProcedureDesignerView.xaml index b76b3af5d..26c1e19b8 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Views/ProcedureDesignerView.xaml +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Views/ProcedureDesignerView.xaml @@ -234,7 +234,7 @@ <TextBox Background="{StaticResource FSE_PrimaryBackgroundBrush}" Padding="5" Text="{Binding Project.Name,UpdateSourceTrigger=PropertyChanged,NotifyOnValidationError=True,ValidatesOnDataErrors=True,ValidatesOnNotifyDataErrors=True}" Margin="0 2 0 0" Style="{StaticResource FSE_Rounded_Corners_TextBox}"></TextBox> <TextBlock Foreground="{StaticResource FSE_GrayBrush}" Margin="2 15 0 0" FontSize="{StaticResource FSE_SmallFontSize}">Description</TextBlock> - <TextBox Text="{Binding Project.Description,UpdateSourceTrigger=PropertyChanged}" Margin="0 2 0 0" Style="{StaticResource FSE_Rounded_Corners_TextBox_Multiline}" MinHeight="100"></TextBox> + <TextBox Text="{Binding Project.Description,UpdateSourceTrigger=PropertyChanged}" Margin="0 2 0 0" Style="{StaticResource FSE_Rounded_Corners_TextBox_Multiline}" MinHeight="100" TextWrapping="Wrap"></TextBox> </StackPanel> <DockPanel Margin="0 20 0 0"> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Views/ProcedureRunnerExecutionView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Views/ProcedureRunnerExecutionView.xaml index a85a3e024..1f682c033 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Views/ProcedureRunnerExecutionView.xaml +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/Views/ProcedureRunnerExecutionView.xaml @@ -149,6 +149,7 @@ <Run Text="Values."></Run> </TextBlock> <Button Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.DisplayResultGridCommand}" CommandParameter="{Binding}" Height="22" FontSize="{StaticResource FSE_SmallFontSize}" Foreground="{StaticResource FSE_PrimaryAccentBrush}" Background="Transparent" BorderBrush="Transparent" Margin="0 -4 0 0">(Grid View)</Button> + <Button Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.ExportResultGridCommand}" CommandParameter="{Binding}" Height="22" FontSize="{StaticResource FSE_SmallFontSize}" Foreground="{StaticResource FSE_PrimaryAccentBrush}" Background="Transparent" Padding="0" BorderBrush="Transparent" Margin="0 -4 0 0">(Export To CSV)</Button> </StackPanel> <StackPanel Visibility="{Binding IsGraph,Converter={StaticResource BooleanToVisibilityConverter}}"> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/ViewModels/ApplicationUpgradeGeneratedViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/ViewModels/ApplicationUpgradeGeneratedViewVM.cs index f1737463d..003aebab0 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/ViewModels/ApplicationUpgradeGeneratedViewVM.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/ViewModels/ApplicationUpgradeGeneratedViewVM.cs @@ -247,14 +247,17 @@ namespace Tango.FSE.Upgrade.ViewModels { var abort = await NotificationProvider.ShowWarningQuestion("Are you sure you want to abort the upgrade operation?"); - if (Handler.CanAbort) + if (Handler.Status == RemoteUpgradeHandlerStatus.Started) { - Handler.Abort(); - } - else - { - await NotificationProvider.ShowWarning("Cannot abort the operation at this stage."); - return false; + if (Handler.CanAbort) + { + Handler.Abort(); + } + else + { + await NotificationProvider.ShowWarning("Cannot abort the operation at this stage."); + return false; + } } return abort; diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/ViewModels/FirmwareUpgradeGeneratedViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/ViewModels/FirmwareUpgradeGeneratedViewVM.cs index ec35a9581..57cd3aa43 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/ViewModels/FirmwareUpgradeGeneratedViewVM.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/ViewModels/FirmwareUpgradeGeneratedViewVM.cs @@ -219,14 +219,17 @@ namespace Tango.FSE.Upgrade.ViewModels { var abort = await NotificationProvider.ShowWarningQuestion("Are you sure you want to abort the upgrade operation?"); - if (Handler.CanAbort) + if (Handler.Status == RemoteUpgradeHandlerStatus.Started) { - Handler.Abort(); - } - else - { - await NotificationProvider.ShowWarning("Cannot abort the operation at this stage."); - return false; + if (Handler.CanAbort) + { + Handler.Abort(); + } + else + { + await NotificationProvider.ShowWarning("Cannot abort the operation at this stage."); + return false; + } } return abort; diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/ViewModels/FirmwareUpgradeViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/ViewModels/FirmwareUpgradeViewVM.cs index 6a5ba78b1..ed434d92f 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/ViewModels/FirmwareUpgradeViewVM.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/ViewModels/FirmwareUpgradeViewVM.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -40,6 +41,14 @@ namespace Tango.FSE.Upgrade.ViewModels set { _existingTfpFileLocation = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); } } + private String _existingTfpFileVersion; + public String ExistingTfpFileVersion + { + get { return _existingTfpFileVersion; } + set { _existingTfpFileVersion = value; RaisePropertyChangedAuto(); } + } + + private RemoteUpgradeHandler _handler; public RemoteUpgradeHandler Handler { @@ -77,6 +86,22 @@ namespace Tango.FSE.Upgrade.ViewModels var result = await StorageProvider.OpenFile("Select existing firmware package file", "Tango Firmware Package|*.tfp"); if (result) { + try + { + LogManager.Log("Validating firmware package file..."); + using (FileStream s = File.OpenRead(result.SelectedItem)) + { + var package = MachineProvider.MachineOperator.GetFirmwarePackageInfo(s).Result; + package.Validate(); + ExistingTfpFileVersion = package.GetMcuVersion().ToString(); + } + } + catch (Exception ex) + { + await NotificationProvider.ShowError($"Error loading the selected tfp file.\n{ex.FlattenMessage()}"); + return; + } + ExistingTfpFileLocation = result.SelectedItem; } } diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/ApplicationUpgradeGeneratedView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/ApplicationUpgradeGeneratedView.xaml index 3c775f3f3..c1f60d813 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/ApplicationUpgradeGeneratedView.xaml +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/ApplicationUpgradeGeneratedView.xaml @@ -69,7 +69,7 @@ <TextBlock Margin="10 0 0 0" VerticalAlignment="Center" FontSize="{StaticResource FSE_LargeFontSize}">UPGRADE NOW</TextBlock> </StackPanel> </Button> - <Button material:ButtonAssist.CornerRadius="25" Command="{Binding SaveTupFileCommand}" Visibility="{Binding ElementName=chkSaveToDisk,Path=IsChecked,Converter={StaticResource BooleanToVisibilityConverter}}" DockPanel.Dock="Right" HorizontalAlignment="Right" Width="250" Height="50"> + <Button material:ButtonAssist.CornerRadius="25" Command="{Binding SaveTupFileCommand}" Visibility="{Binding ElementName=chkSaveToDisk,Path=IsChecked,Converter={StaticResource BooleanToVisibilityConverter}}" DockPanel.Dock="Right" HorizontalAlignment="Right" Width="250" Height="50" VerticalAlignment="Bottom"> <StackPanel Orientation="Horizontal"> <material:PackIcon Width="32" Height="28" Kind="ContentSaveEdit" /> <TextBlock Margin="10 0 0 0" VerticalAlignment="Center" FontSize="{StaticResource FSE_LargeFontSize}">SAVE PACKAGE</TextBlock> @@ -78,7 +78,7 @@ </Grid> <StackPanel VerticalAlignment="Bottom" Margin="0 0 40 0"> - <TextBlock Text="{Binding Handler.Progress.Message}" ToolTip="{Binding Handler.Progress.Message}" TextTrimming="CharacterEllipsis" Style="{StaticResource FSE_HandlerStatusTextBlock}"></TextBlock> + <TextBlock Text="{Binding Handler.Progress.Message}" TextWrapping="NoWrap" MaxHeight="110" TextTrimming="CharacterEllipsis" ToolTip="{Binding Handler.Progress.Message}" Style="{StaticResource FSE_HandlerStatusTextBlock}"></TextBlock> <ProgressBar Margin="0 5 0 0" Minimum="0" Maximum="{Binding Handler.Progress.Maximum}" Value="{Binding Handler.Progress.Value}" IsIndeterminate="{Binding Handler.Progress.IsIndeterminate}"></ProgressBar> </StackPanel> </DockPanel> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/ApplicationUpgradeView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/ApplicationUpgradeView.xaml index 046259d75..3a1ab183d 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/ApplicationUpgradeView.xaml +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/ApplicationUpgradeView.xaml @@ -22,7 +22,7 @@ </Style> </Grid.Style> <StackPanel> - <TextBlock FontSize="{StaticResource FSE_LargeFontSize}">Application Upgrade</TextBlock> + <TextBlock FontSize="{StaticResource FSE_LargeFontSize}">Full Upgrade</TextBlock> <TextBlock Margin="0 10 0 0" Foreground="{StaticResource FSE_GrayBrush}" LineHeight="20" Visibility="{Binding ResolutionService.IsHighResolution,Converter={StaticResource BooleanToVisibilityConverter}}"> <Run>You chose to perform a machine application and firmware upgrade.</Run> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/FirmwareUpgradeGeneratedView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/FirmwareUpgradeGeneratedView.xaml index a8739b347..a9d6034fd 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/FirmwareUpgradeGeneratedView.xaml +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/FirmwareUpgradeGeneratedView.xaml @@ -52,7 +52,7 @@ <StackPanel VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="1000"> <DockPanel> <Grid DockPanel.Dock="Right" > - <Button material:ButtonAssist.CornerRadius="25" Visibility="{Binding ElementName=chkUpgradeNow,Path=IsChecked,Converter={StaticResource BooleanToVisibilityConverter}}" Command="{Binding StartUpgradeCommand}" HorizontalAlignment="Right" Width="250" Height="50"> + <Button material:ButtonAssist.CornerRadius="25" Visibility="{Binding ElementName=chkUpgradeNow,Path=IsChecked,Converter={StaticResource BooleanToVisibilityConverter}}" Command="{Binding StartUpgradeCommand}" HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="250" Height="50"> <StackPanel Orientation="Horizontal"> <material:PackIcon Width="32" Height="28" Kind="ClockFast" /> <TextBlock Margin="10 0 0 0" VerticalAlignment="Center" FontSize="{StaticResource FSE_LargeFontSize}">UPGRADE NOW</TextBlock> @@ -67,7 +67,7 @@ </Grid> <StackPanel VerticalAlignment="Bottom" Margin="0 0 40 0"> - <TextBlock Text="{Binding Handler.Progress.Message}" Style="{StaticResource FSE_HandlerStatusTextBlock}"></TextBlock> + <TextBlock Text="{Binding Handler.Progress.Message}" TextWrapping="NoWrap" MaxHeight="110" TextTrimming="CharacterEllipsis" ToolTip="{Binding Handler.Progress.Message}" Style="{StaticResource FSE_HandlerStatusTextBlock}"></TextBlock> <ProgressBar Margin="0 5 0 0" Minimum="0" Maximum="{Binding Handler.Progress.Maximum}" Value="{Binding Handler.Progress.Value}" IsIndeterminate="{Binding Handler.Progress.IsIndeterminate}"></ProgressBar> </StackPanel> </DockPanel> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/FirmwareUpgradeView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/FirmwareUpgradeView.xaml index d105c5617..6aeb0fcb1 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/FirmwareUpgradeView.xaml +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/Views/FirmwareUpgradeView.xaml @@ -67,12 +67,17 @@ </DockPanel> </RadioButton> - <StackPanel IsEnabled="{Binding ElementName=chkExisting,Path=IsChecked}" Margin="80 10 0 0" Width="380" HorizontalAlignment="Left"> + <StackPanel IsEnabled="{Binding ElementName=chkExisting,Path=IsChecked}" Margin="80 10 0 0" HorizontalAlignment="Left"> <TextBlock>Select an existing .tfp file on your computer</TextBlock> <DockPanel Margin="0 0 0 0"> + <DockPanel DockPanel.Dock="Right" Margin="0 0 0 0" Visibility="{Binding ExistingTfpFileLocation,Converter={StaticResource IsNullToVisibilityConverter}}"> + <TextBlock Margin="10 0 0 0" Foreground="{StaticResource FSE_PrimaryAccentBrush}" FontSize="{StaticResource FSE_SmallFontSize}" VerticalAlignment="Center"> + <Run>v</Run><Run Text="{Binding ExistingTfpFileVersion}"></Run> + </TextBlock> + </DockPanel> <controls:IconButton ToolTip="Browse for .tfp file" Margin="5 0 0 0" DockPanel.Dock="Right" Icon="FolderOpenOutline" Width="38" Height="38" Command="{Binding SelectExistingTfpFileLocationCommand}" /> - <TextBox FontSize="{StaticResource FSE_SmallFontSize}" Foreground="{StaticResource FSE_PrimaryAccentBrush}" IsReadOnly="True" Text="{Binding ExistingTfpFileLocation,Converter={StaticResource FilePathToFileNameConverter}}" VerticalContentAlignment="Bottom"></TextBox> + <TextBox Width="350" FontSize="{StaticResource FSE_SmallFontSize}" Foreground="{StaticResource FSE_PrimaryAccentBrush}" IsReadOnly="True" Text="{Binding ExistingTfpFileLocation,Converter={StaticResource FilePathToFileNameConverter}}" VerticalContentAlignment="Bottom"></TextBox> </DockPanel> </StackPanel> </StackPanel> diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/OrganizationsService.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/OrganizationsService.cs index 730cd7409..fc2b79566 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/OrganizationsService.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/OrganizationsService.cs @@ -145,7 +145,7 @@ namespace Tango.FSE.BL.Services using (ObservablesContext db = ObservablesContext.CreateDefault()) { - var usersRolesToAdd = user.UsersRoles; + var usersRolesToAdd = user.UsersRoles.ToList(); user.UsersRoles.Clear(); foreach (var userRole in usersRolesToAdd) diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/PublishedProcedureProjectsService.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/PublishedProcedureProjectsService.cs index 074483dec..baa5d3fdd 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/PublishedProcedureProjectsService.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/PublishedProcedureProjectsService.cs @@ -36,7 +36,7 @@ namespace Tango.FSE.BL.Services throw new IndexOutOfRangeException("The memory cache did not contain any procedure projects."); } - return projects.OrderByDescending(x => x.PublishDate).ToList(); + return projects.OrderBy(x => x.SortingIndex).ToList(); }) .Online((context) => { @@ -79,7 +79,7 @@ namespace Tango.FSE.BL.Services } } - return projects.OrderByDescending(x => x.PublishDate).ToList(); + return projects.OrderBy(x => x.SortingIndex).ToList(); } }) .DiskCache((context) => @@ -97,7 +97,7 @@ namespace Tango.FSE.BL.Services _projectsCache.Put(cachedProject.Guid, cachedProject); } - return cachedProjects.Select(x => x.ToObservable()).OrderByDescending(x => x.PublishDate).ToList(); + return cachedProjects.Select(x => x.ToObservable()).OrderBy(x => x.SortingIndex).ToList(); } }) .BuildExecuteAsync(); @@ -131,6 +131,7 @@ namespace Tango.FSE.BL.Services if (projectGuid == null) { project = new PublishedProcedureProject(); + project.PublishDate = DateTime.UtcNow; db.PublishedProcedureProjects.Add(project); } else @@ -143,11 +144,16 @@ namespace Tango.FSE.BL.Services { version = lastVersion.Value + 1; } + + if (!project.IsVisible) + { + project.PublishDate = DateTime.UtcNow; + } } project.Name = name; + project.LastUpdated = DateTime.UtcNow; project.Description = description; - project.PublishDate = DateTime.UtcNow; project.IsVisible = true; PublishedProcedureProjectsVersion projectVersion = new PublishedProcedureProjectsVersion(); diff --git a/Software/Visual_Studio/FSE/Tango.FSE.Common/RemoteUpgrade/RemoteUpgradeHandler.cs b/Software/Visual_Studio/FSE/Tango.FSE.Common/RemoteUpgrade/RemoteUpgradeHandler.cs index 85e48a045..e06c2f95b 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.Common/RemoteUpgrade/RemoteUpgradeHandler.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.Common/RemoteUpgrade/RemoteUpgradeHandler.cs @@ -102,18 +102,21 @@ namespace Tango.FSE.Common.RemoteUpgrade { FailedException = exception; Status = RemoteUpgradeHandlerStatus.Failed; + CanAbort = true; _completionSource.SetException(exception); } internal void RaiseCompleted() { Status = RemoteUpgradeHandlerStatus.Completed; + CanAbort = true; _completionSource.SetResult(Status); } internal void RaiseAborted() { Status = RemoteUpgradeHandlerStatus.Aborted; + CanAbort = true; _completionSource.SetException(new OperationCanceledException("Remote upgrade operation aborted.")); } } diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/Notifications/DefaultNotificationProvider.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/Notifications/DefaultNotificationProvider.cs index ce64bd0f1..368752120 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/Notifications/DefaultNotificationProvider.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/Notifications/DefaultNotificationProvider.cs @@ -900,7 +900,7 @@ namespace Tango.FSE.UI.Notifications DemoModeManager.InsertCommand(() => { - PushErrorReportingSnackbar(new TimeoutException("This is a demo exception"), "Test Error", "This is a demo exception."); + throw new TimeoutException("This is a fake exception."); }, "Emulate Bug Reporting Error", "Creates a snackbar notification with a fake error and bug reporting option."); } } diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/RemoteUpgrade/DefaultRemoteUpgradeManager.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/RemoteUpgrade/DefaultRemoteUpgradeManager.cs index f64958bcf..0ce74e51e 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/RemoteUpgrade/DefaultRemoteUpgradeManager.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/RemoteUpgrade/DefaultRemoteUpgradeManager.cs @@ -558,7 +558,7 @@ namespace Tango.FSE.UI.RemoteUpgrade LogManager.Log("Retrieving remote temporary folder..."); var remoteTempFolder = FileSystemProvider.GetFolder("%temp%").Result as FileSystemItem; - var remoteTempFile = Path.Combine(remoteTempFolder.Path, Path.GetTempFileName()); + var remoteTempFile = Path.Combine(remoteTempFolder.Path, Path.GetFileName(Path.GetTempFileName())); LogManager.Log("Uploading tup file to remote machine..."); var uploadHandler = FileSystemProvider.Upload(tupFile, remoteTempFile).Result; @@ -681,7 +681,7 @@ namespace Tango.FSE.UI.RemoteUpgrade LogManager.Log("Retrieving remote temporary folder..."); var remoteTempFolder = FileSystemProvider.GetFolder("%temp%").Result as FileSystemItem; - var remoteTempFile = Path.Combine(remoteTempFolder.Path, Path.GetTempFileName()); + var remoteTempFile = Path.Combine(remoteTempFolder.Path, Path.GetFileName(Path.GetTempFileName())); LogManager.Log("Uploading tfp file to remote machine..."); var uploadHandler = FileSystemProvider.Upload(tfpFile, remoteTempFile).Result; diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModels/MainViewVM.cs index eed594718..01def8679 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModels/MainViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModels/MainViewVM.cs @@ -2321,7 +2321,13 @@ namespace Tango.MachineStudio.Developer.ViewModels return; } SelectedSegment.BrushStops.Remove(x); - _activeJobDbContext.BrushStops.Remove(x); + var existingBrushStop = _activeJobDbContext.BrushStops.FirstOrDefault(y => y.Guid == x.Guid); + if(existingBrushStop != null) + { + _activeJobDbContext.BrushStops.Remove(existingBrushStop); + } + + }); ArrangeBrushStopsIndices(); @@ -2356,6 +2362,7 @@ namespace Tango.MachineStudio.Developer.ViewModels stop.SetAllDispensingStepDivisions(BL.Dispensing.DispenserStepDivisions.D8); stop.SetLiquidVolumes(SelectedMachine.Configuration, SelectedRML, SelectedProcessParametersTable); SelectedSegment.BrushStops.Add(stop); + // _activeJobDbContext.BrushStops.Add(stop); SelectedSegment.BrushStops.ToList().ForEach(x => x.RaiseOffsetChanged()); ArrangeBrushStopsIndices(); } diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/JobView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/JobView.xaml index ed832f468..35c621822 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/JobView.xaml +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/JobView.xaml @@ -976,7 +976,8 @@ <Image Source="../Images/colorspace.png" Width="24"></Image> <TextBlock VerticalAlignment="Center" Margin="5 0 0 0" FontSize="10">Color Space</TextBlock> </StackPanel> - <ComboBox SelectionChanged="OnBrushStopColorSpace_SelectionChanged" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.ColorSpaces}" SelectedItem="{Binding ColorSpace}" DisplayMemberPath="Name" Width="100" HorizontalAlignment="Left"> + <ComboBox SelectionChanged="OnBrushStopColorSpace_SelectionChanged" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.ColorSpaces}" SelectedItem="{Binding ColorSpace}" DisplayMemberPath="Name" Width="100" HorizontalAlignment="Left" + Style="{StaticResource TransparentComboBoxStyle}" > <ComboBox.ItemContainerStyle> <Style TargetType="ComboBoxItem" BasedOn="{StaticResource {x:Type ComboBoxItem}}"> <Setter Property="Background" Value="{StaticResource WhiteBrush100}"></Setter> diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Models/ColorLinearizationModel.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Models/ColorLinearizationModel.cs new file mode 100644 index 000000000..fe9ec7e37 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Models/ColorLinearizationModel.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Documents; + +namespace Tango.MachineStudio.RML.Models +{ + public class ColorLinearizationModel + { + private class LinearizationDataItem + { + public double L { get; set; } + public double A { get; set; } + public double B { get; set; } + public int InkPercentage { get; set; } + } + + public ColorLinearizationModel() + { + + } + + public void GetDataFromFile(string fileName) + { + + ExcelReader reader = new ExcelReader(fileName); + var items = reader.GetDataByIndex<LinearizationDataItem>("Sheet1", 2); + foreach (var item in items) + { + } + reader.Dispose(); + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Tango.MachineStudio.RML.csproj b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Tango.MachineStudio.RML.csproj index 1f9d56f07..145a0e06e 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Tango.MachineStudio.RML.csproj +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Tango.MachineStudio.RML.csproj @@ -81,6 +81,7 @@ <Compile Include="Contracts\IMainView.cs" /> <Compile Include="Models\CalibrationMeasurementModel.cs" /> <Compile Include="Models\CctModel.cs" /> + <Compile Include="Models\ColorLinearizationModel.cs" /> <Compile Include="RMLModule.cs" /> <Compile Include="Properties\AssemblyInfo.cs"> <SubType>Code</SubType> diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/ViewModels/ColorCalibrationViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/ViewModels/ColorCalibrationViewVM.cs index d44ef7a0c..f118ce77a 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/ViewModels/ColorCalibrationViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/ViewModels/ColorCalibrationViewVM.cs @@ -42,6 +42,14 @@ namespace Tango.MachineStudio.RML.ViewModels set { _liquidType = value; RaisePropertyChangedAuto(); } } + private BL.Entities.LiquidType _selectedLinearizationliquidType; + + public BL.Entities.LiquidType SelectedLinearizationLiquidType + { + get { return _selectedLinearizationliquidType; } + set { _selectedLinearizationliquidType = value; RaisePropertyChangedAuto(); } + } + private List<BL.Entities.LiquidType> _liquidTypes; public List<BL.Entities.LiquidType> LiquidTypes @@ -89,13 +97,19 @@ namespace Tango.MachineStudio.RML.ViewModels } public RelayCommand CreateGraphCommand { get; set; } + public RelayCommand CreateLinearizationGraphCommand { get; set; } - - public string CalibrationType + + public string CalibrationLiquidTypeName { get { return LiquidType == null ?"" : LiquidType.Name; } } + public string LinearizationLiquidTypeName + { + get { return SelectedLinearizationLiquidType == null ? "" : SelectedLinearizationLiquidType.Name; } + } + public Plot PlotControl { get; set; } private IList<DataPoint> _points; /// <summary> @@ -156,6 +170,22 @@ namespace Tango.MachineStudio.RML.ViewModels } } + + public Plot LinearizationPlotControl { get; set; } + private IList<DataPoint> _linearizationPoints; + /// <summary> + /// Binding to ItemsSource of line chart. + /// </summary> + public IList<DataPoint> LinearizationPoints + { + get { return _linearizationPoints; } + set + { + _linearizationPoints = value; + RaisePropertyChangedAuto(); + } + } + #endregion public ColorCalibrationViewVM(INotificationProvider notification) @@ -170,6 +200,7 @@ namespace Tango.MachineStudio.RML.ViewModels Factor = 0; HasError = false; CreateGraphCommand = new RelayCommand(CreateGraph); + CreateLinearizationGraphCommand = new RelayCommand(CreateLinearizationGraph); this.Points = new List<DataPoint>(); TargetPoints = new List<DataPoint>(); } @@ -245,92 +276,38 @@ namespace Tango.MachineStudio.RML.ViewModels RaisePropertyChanged("CalibrationType"); PlotControl.InvalidatePlot(true); - //await Task.Factory.StartNew(() => - //{ - // DataPoint ? intersectionpoints = FindIntersection(Points.ToArray(), TargetPoints.ToArray()); - // if(intersectionpoints == null) - // { - // InvokeUI(() => - // { - // _notification.ShowWarning(LogManager.Log($"No intersect target value with input values", LogCategory.Warning)); - // }); - // } - //}); - } #endregion + #region CreateLinearizationGraph - #region Intersect - - public DataPoint? FindIntersection(DataPoint[] line1, DataPoint[] line2) - { - for (int i = 0; i < line1.Length; i++) - { - int nextI = i; - nextI++; - if (nextI == line1.Length) break; - - for (int j = 0; j < line2.Length; j++) - { - int nextJ = j; - nextJ++; - if (nextJ == line2.Length) break; - DataPoint? d = CheckIntersecting(line1[i], line1[nextI], line2[j], line2[nextJ]); - return d; - - } - } - return null; - } - - public DataPoint? CheckIntersecting(DataPoint A, DataPoint B, DataPoint C, DataPoint D) + private void CreateLinearizationGraph(object obj) { - // Line AB represented as a1x + b1y = c1 - double a1 = B.Y - A.Y; - double b1 = A.X - B.X; - double c1 = a1 * (A.X) + b1 * (A.Y); + if (_selectedLinearizationliquidType == null) + return; - // Line CD represented as a2x + b2y = c2 - double a2 = D.Y - C.Y; - double b2 = C.X - D.X; - double c2 = a2 * (C.X) + b2 * (C.Y); + string labType = ColorCalibrationExt.DisplayLiquidTypeToLABType[_selectedLinearizationliquidType.Type]; - double determinant = a1 * b2 - a2 * b1; + ColorLinearizationModel model = new ColorLinearizationModel(); + string fileName = @"C:\Test\Test Input Lineration.xlsx"; + model.GetDataFromFile(fileName); + //await Task.Factory.StartNew(() => + //{ + // Factor = GetLiquidFactor(); + //}); - if (determinant == 0) - { - // The lines are parallel. This is simplified - } - else - { - double x = (b2 * c1 - b1 * c2) / determinant; - double y = (a1 * c2 - a2 * c1) / determinant; + LinearizationPoints.Clear(); + + Measurements.ToList().ForEach(x => { + LinearizationPoints.Add(new DataPoint(x.Ink, x.L)); + }); - // check if the point lies on given line segment - /* To check if "x" is between "a" and "b"; - int m = (a+b)/2; - if(Math.abs(x-m) <= (Math.abs(a-m))) - { - } - */ - double mx1 = (A.X + B.X) / 2; - double mx2 = (C.X + D.X) / 2; - double my1 = (A.Y + B.Y) / 2; - double my2 = (C.Y + D.Y) / 2; - if (Math.Abs(x - mx1) <= Math.Abs(A.X - mx1) - && Math.Abs(x - mx2) <= Math.Abs(C.X - mx2) - && Math.Abs(y - my1) <= Math.Abs(A.Y - my1) - && Math.Abs(y - my2) <= Math.Abs(C.Y - my2)) - { - return new DataPoint(x, y); - } - - } - return null; + RaisePropertyChanged("To"); + RaisePropertyChanged("From"); + XStep = (int)(Points.Count / 6); + LinearizationPlotControl.InvalidatePlot(true); } - #endregion - + } } diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Views/ColorCalibrationView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Views/ColorCalibrationView.xaml index ffe3bf68e..de433b7e7 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Views/ColorCalibrationView.xaml +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Views/ColorCalibrationView.xaml @@ -36,26 +36,28 @@ <ColumnDefinition Width="1*"/> <ColumnDefinition Width="1*"/> </Grid.ColumnDefinitions> - <Grid Grid.Column="0" Margin="20 0 0 0"> + <Grid Grid.Column="0" Margin="20 0 20 0"> <Grid.RowDefinitions> - <RowDefinition Height="Auto"/> <RowDefinition Height="1*"/> - <RowDefinition Height="1"/> + <RowDefinition Height="3*"/> </Grid.RowDefinitions> - <Border Grid.Row="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="Auto" Height="80" Margin="0 0 0 20" > - <StackPanel Orientation="Vertical"> - <TextBlock FontSize="16" HorizontalAlignment="Left" >Liquid Type</TextBlock> + <Grid Grid.Row="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="Auto" Height="80" Margin="0 0 0 20" > + <Grid.ColumnDefinitions> + <ColumnDefinition Width="1*"></ColumnDefinition> + <ColumnDefinition Width="1*"></ColumnDefinition> + </Grid.ColumnDefinitions> + <StackPanel Orientation="Vertical" Grid.Column="0"> + <TextBlock FontSize="20" HorizontalAlignment="Left" >Liquid Type</TextBlock> <ComboBox Margin="0 20 0 0" MinWidth="140" HorizontalAlignment="Left" ItemsSource="{Binding LiquidTypes}" SelectedItem="{Binding LiquidType}" DisplayMemberPath="Name" Style="{StaticResource TransparentComboBoxStyle}" FontSize="16"></ComboBox> </StackPanel> - </Border> + <Button Grid.Column="1" VerticalAlignment="Top" Background="{StaticResource TransparentBackgroundBrush200}" MinWidth="160" Height="50" BorderBrush="{StaticResource TransparentBackgroundBrush200}" Command="{Binding CreateGraphCommand}" > + <TextBlock FontSize="16" Foreground="{StaticResource MainWindow.Foreground}">GET MAX DISPENSING RATE</TextBlock> + </Button> + </Grid> <Grid Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Stretch"> - <Grid.RowDefinitions> - <RowDefinition Height="1*"/> - <RowDefinition Height="Auto"/> - </Grid.RowDefinitions> - <DataGrid HorizontalAlignment="Left" VerticalScrollBarVisibility ="Auto" Margin="0 0 0 10" SelectionUnit="FullRow" BorderBrush="{StaticResource DarkGrayBrush }" BorderThickness="1" Background="{StaticResource TransparentBackgroundBrush}" AlternatingRowBackground="{StaticResource Transparent200}" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="False" ItemsSource="{Binding Measurements}" > + <DataGrid HorizontalAlignment="Left" VerticalScrollBarVisibility ="Auto" SelectionUnit="FullRow" BorderBrush="{StaticResource DarkGrayBrush }" BorderThickness="1" Background="{StaticResource TransparentBackgroundBrush}" AlternatingRowBackground="{StaticResource Transparent200}" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="False" ItemsSource="{Binding Measurements}" Margin="0 30 0 50"> <DataGrid.CellStyle> <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}"> <Setter Property="BorderThickness" Value="0"/> @@ -97,14 +99,17 @@ <mahapps:DataGridNumericUpDownColumn Header="B" Minimum="-128" Maximum="127" Binding="{Binding B}" HideUpDownButtons="True" Width="1*" ElementStyle="{StaticResource CellNumericUpDown}" EditingElementStyle="{StaticResource EditableCellNumericUpDown}" /> </DataGrid.Columns> </DataGrid> - <Button Grid.Row="1" Background="{StaticResource TransparentBackgroundBrush200}" MinWidth="160" Height="50" BorderBrush="{StaticResource TransparentBackgroundBrush200}" Command="{Binding CreateGraphCommand}" > - <TextBlock FontSize="16" Foreground="{StaticResource MainWindow.Foreground}">CREATE GRAPH</TextBlock> - </Button> + </Grid> </Grid> - <Grid Grid.Column="1"> - <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="20 20 0 0"> - <oxy:Plot Title="{Binding CalibrationType}" x:Name="CalibrationPlot"> + <Grid Grid.Column="1" Margin="20 0 20 0"> + <Grid> + <Grid.RowDefinitions> + <RowDefinition Height="1*"/> + <RowDefinition Height="3*"/> + </Grid.RowDefinitions> + <Border Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0 20 0 0" BorderThickness="0" BorderBrush="{StaticResource DarkGrayBrush}" CornerRadius="5"> + <oxy:Plot Title="{Binding CalibrationLiquidTypeName}" x:Name="CalibrationPlot" Margin="0 0 10 0" Background="Transparent"> <oxy:Plot.Series > <oxy:LineSeries ItemsSource="{Binding Points}" Color="#73B6EC" MarkerFill="SteelBlue" MarkerType="Circle" /> <oxy:LineSeries ItemsSource="{Binding TargetPoints}" Color="#E14141" MarkerFill="#E14141" MarkerType="Circle" /> @@ -114,20 +119,59 @@ <oxy:LinearAxis Position="Left" Title = "Lab" MajorGridlineStyle="Solid" MinorGridlineStyle="Dot" IsZoomEnabled="True" Minimum="{Binding From}" Maximum="{Binding To}"/> </oxy:Plot.Axes> </oxy:Plot> - </Border> - </Grid> - <Grid Grid.Column="2" Margin="40 0 0 0"> - <StackPanel Orientation="Vertical"> - <TextBlock FontSize="16" HorizontalAlignment="Left" Foreground="{StaticResource MainWindow.Foreground}" Height="50" Visibility="{Binding HasError, Converter={StaticResource BooleanToVisibilityInverseConverter}}"> - <Run FontWeight="DemiBold"> Factor: </Run> - <Run Text="{Binding Factor}"></Run> - <LineBreak /> - </TextBlock> - <TextBlock FontSize="16" Foreground="{StaticResource MainWindow.Foreground}" FontWeight="SemiBold" Visibility="{Binding HasError, Converter={StaticResource BooleanToVisibilityConverter}}" Margin="0 20 10 20" >Warning:</TextBlock> - <Border BorderThickness="1" CornerRadius="4" BorderBrush="{StaticResource DarkGrayBrush}" Visibility="{Binding HasError, Converter={StaticResource BooleanToVisibilityConverter}}"> - <TextBlock Margin="5" Foreground="{StaticResource RedBrush300}" Text="{Binding ErrorMessage}" Height="75" TextWrapping="Wrap" TextTrimming="CharacterEllipsis" /> </Border> - </StackPanel> + <Border BorderBrush="{StaticResource BlueBrush100}" BorderThickness="0" CornerRadius="5" Margin="55 0 20 0"> + <StackPanel Orientation="Vertical" Grid.Row="0" Margin="10 10 0 0"> + + <TextBlock FontSize="16" HorizontalAlignment="Left" Foreground="{StaticResource MainWindow.Foreground}" Height="50" Visibility="{Binding HasError, Converter={StaticResource BooleanToVisibilityInverseConverter}}"> + <Run FontSize="20"> Factor: </Run> + <Run Text="{Binding Factor}" Foreground="{StaticResource BlueBrush100}"></Run> + <LineBreak /> + </TextBlock> + <TextBlock FontSize="16" Foreground="{StaticResource MainWindow.Foreground}" FontWeight="SemiBold" Visibility="{Binding HasError, Converter={StaticResource BooleanToVisibilityConverter}}" Margin="0 20 10 10" >Warning:</TextBlock> + + <Border BorderThickness="1" CornerRadius="4" BorderBrush="{StaticResource DarkGrayBrush}" Visibility="{Binding HasError, Converter={StaticResource BooleanToVisibilityConverter}}" Height="Auto"> + <TextBlock Margin="5" Foreground="{StaticResource RedBrush300}" Text="{Binding ErrorMessage}" TextWrapping="Wrap" Padding="5" FontSize="14"/> + </Border> + </StackPanel> + </Border> + </Grid> + </Grid> + <Grid Grid.Column="2" Margin="10 0 0 0"> + <Grid> + <Grid.RowDefinitions> + <RowDefinition Height="1*"/> + <RowDefinition Height="3*"/> + </Grid.RowDefinitions> + <Grid Grid.Row="0" Margin="55 0 0 0"> + <Grid.ColumnDefinitions> + <ColumnDefinition/> + <ColumnDefinition Width="Auto"/> + </Grid.ColumnDefinitions> + <StackPanel Orientation="Vertical" Grid.Column="0"> + <TextBlock HorizontalAlignment="Left" FontSize="20" >Liquid Type</TextBlock> + <ComboBox Margin="0 20 0 0" MinWidth="140" HorizontalAlignment="Left" ItemsSource="{Binding LiquidTypes}" + SelectedItem="{Binding SelectedLinearizationLiquidType}" DisplayMemberPath="Name" + Style="{StaticResource TransparentComboBoxStyle}" FontSize="16"></ComboBox> + </StackPanel> + <Button Grid.Column="1" IsEnabled="False" VerticalAlignment="Top" Background="{StaticResource TransparentBackgroundBrush200}" MinWidth="160" Height="50" BorderBrush="{StaticResource TransparentBackgroundBrush200}" Command="{Binding CreateLinearizationGraphCommand}" > + <TextBlock FontSize="16" Foreground="{StaticResource MainWindow.Foreground}">CREATE LINEARIZATION GRAPH</TextBlock> + </Button> + + </Grid> + <Border Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0 20 0 0" BorderThickness="0" BorderBrush="{StaticResource DarkGrayBrush}" CornerRadius="5"> + <oxy:Plot Title="{Binding LinearizationLiquidTypeName}" x:Name="LinearizationPlot" Margin="0 0 10 0" Background="Transparent"> + <oxy:Plot.Series > + <oxy:LineSeries ItemsSource="{Binding LinearizationPoints}" Color="#73B6EC" MarkerFill="SteelBlue" /> + </oxy:Plot.Series> + <oxy:Plot.Axes> + <oxy:LinearAxis Position="Bottom" Title = "In Ink" MajorGridlineStyle="Solid" MinorGridlineStyle="Dot" IsZoomEnabled="True" Minimum="0"/> + <oxy:LinearAxis Position="Left" Title = "Out Ink" MajorGridlineStyle="Solid" MinorGridlineStyle="Dot" IsZoomEnabled="True" Minimum="0" /> + </oxy:Plot.Axes> + </oxy:Plot> + </Border> + </Grid> + </Grid> </Grid> </DockPanel> diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Views/ColorCalibrationView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Views/ColorCalibrationView.xaml.cs index 4c456c12d..d56b3c6c9 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Views/ColorCalibrationView.xaml.cs +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Views/ColorCalibrationView.xaml.cs @@ -33,6 +33,7 @@ namespace Tango.MachineStudio.RML.Views { ColorCalibrationViewVM vm = (ColorCalibrationViewVM)DataContext; vm.PlotControl = CalibrationPlot; + vm.LinearizationPlotControl = LinearizationPlot; vm.Loading(); } } diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/LiquidQuantityToFormatStringConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/LiquidQuantityToFormatStringConverter.cs index e5f06e167..3ab013ab3 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/LiquidQuantityToFormatStringConverter.cs +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/LiquidQuantityToFormatStringConverter.cs @@ -15,11 +15,17 @@ namespace Tango.MachineStudio.Statistics.Converters { try { + string format = ""; + if (parameter is string) + { + format = (string)parameter; + } + var longValue = System.Convert.ToUInt64(value.ToString()); double liters_val = (longValue / 1000000000d); double cc_val = (longValue / 1000000d); double dispensers_val = (longValue / 130000000d); - string tooltip = String.Format($"Nanoliters: {longValue}\nCubic Centimeters: {cc_val}\nLiters: {liters_val}\nDispensers: {dispensers_val}"); + string tooltip = String.Format($"Nanoliters: {longValue.ToString(format)}\nCubic Centimeters: {cc_val}\nLiters: {liters_val}\nDispensers: {dispensers_val}"); return tooltip; } catch { } diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/TooltipLiquidQuantityFormatConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/TooltipLiquidQuantityFormatConverter.cs new file mode 100644 index 000000000..6c4d1347f --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/TooltipLiquidQuantityFormatConverter.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; +namespace Tango.MachineStudio.Statistics.Converters +{ + class TooltipLiquidQuantityFormatConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + try + { + string format = ""; + if (parameter is string) + { + format = (string)parameter; + } + var longValue = System.Convert.ToUInt64(value.ToString()); + decimal liters_val = (decimal)(longValue / 1000000000d); + decimal cc_val = (decimal)(longValue / 1000000d); + decimal dispensers_val = (decimal)(longValue / 130000000d); + string tooltip = String.Format($"Nanoliters: {longValue.ToString(format)}\nCubic Centimeters: {cc_val}\nLiters: {liters_val}\nDispensers: {dispensers_val}"); + return tooltip; + } + catch { } + + return ""; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Tango.MachineStudio.Statistics.csproj b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Tango.MachineStudio.Statistics.csproj index 02e3f40a9..4ce0ea87d 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Tango.MachineStudio.Statistics.csproj +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Tango.MachineStudio.Statistics.csproj @@ -85,6 +85,7 @@ <Compile Include="Converters\NanoLiterToLiterFormatConverter.cs" /> <Compile Include="Converters\StringToBoolYesNoNullConverter.cs" /> <Compile Include="Converters\StringToFirstLetterConverter.cs" /> + <Compile Include="Converters\TooltipLiquidQuantityFormatConverter.cs" /> <Compile Include="Models\ExcelModel.cs" /> <Compile Include="Models\TotalLiquidQuantityModel.cs" /> <Compile Include="Models\JobRunModel.cs" /> diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/JobRunsView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/JobRunsView.xaml index b3e93a52c..e6c46ba10 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/JobRunsView.xaml +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/JobRunsView.xaml @@ -32,6 +32,7 @@ <localConverters:JobLengthConverter x:Key="JobLengthConverter"/> <localConverters:NanoLiterToLiterFormatConverter x:Key="NanoLiterToLiterFormatConverter"/> <localConverters:LiquidQuantityToFormatStringConverter x:Key="LiquidQuantityToFormatStringConverter"/> + <localConverters:TooltipLiquidQuantityFormatConverter x:Key="TooltipLiquidQuantityFormatConverter"/> <ResourceDictionary x:Key="SelectAllTextBoxResource"> <Style TargetType="TextBox"> @@ -518,7 +519,7 @@ </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate> - <DockPanel ToolTip="{Binding Quantity}" ToolTipService.Placement="Center" ToolTipService.VerticalOffset="10"> + <DockPanel ToolTip="{Binding Quantity, Converter={StaticResource TooltipLiquidQuantityFormatConverter}, ConverterParameter='#,#\\'}" ToolTipService.Placement="Center" ToolTipService.VerticalOffset="10"> <Grid DockPanel.Dock="Top" Height="40" Margin="0 5 8 0" Width="16" > <Border x:Name="LiquidTypeBorder" BorderThickness="1" BorderBrush="{StaticResource borderBrush}" CornerRadius="2" > <Canvas x:Name="LiquidCanvas" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="0" ClipToBounds="True" ToolTip="{Binding Quantity}" ToolTipService.Placement="Left" ToolTipService.VerticalOffset="10"> @@ -539,7 +540,7 @@ </Style> </Border.Style> </Border> - <Border Background="Transparent" ToolTip="{Binding Quantity}" Height="{Binding RelativeSource={RelativeSource AncestorType=Canvas}, Path=ActualHeight }" Width="{Binding RelativeSource={RelativeSource AncestorType=Canvas}, Path=ActualWidth }"></Border> + <Border Background="Transparent" ToolTip="{Binding Quantity, Converter={StaticResource TooltipLiquidQuantityFormatConverter}, ConverterParameter='#,#\\'}" Height="{Binding RelativeSource={RelativeSource AncestorType=Canvas}, Path=ActualHeight }" Width="{Binding RelativeSource={RelativeSource AncestorType=Canvas}, Path=ActualWidth }"></Border> </Canvas> </Border> </Grid> @@ -589,7 +590,7 @@ <StackPanel Orientation="Horizontal" Margin="0 3"> <TextBlock Text="{Binding Name}" FontWeight="SemiBold"/> <TextBlock Text=": "/> - <TextBlock Text="{Binding Value, StringFormat={}{0:#,0.##}}"/> + <TextBlock Text="{Binding Value, StringFormat={}{0:N2}}"/> <TextBlock Text="{Binding Unit}"/> </StackPanel> </DataTemplate> @@ -634,7 +635,7 @@ <StackPanel Orientation="Horizontal" Margin="2"> <TextBlock Margin="5 0 0 0" Text="{Binding Name}" FontWeight="SemiBold"/> <TextBlock Text=": "/> - <TextBlock Text="{Binding Value, StringFormat={}{0:0.0}}"/> + <TextBlock Text="{Binding Value, StringFormat={}{0:N0}}"/> <TextBlock Text="{Binding Unit}"/> </StackPanel> </DataTemplate> @@ -694,7 +695,7 @@ </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate> - <Border Background="Transparent" ToolTip="{Binding Quantity, Converter={StaticResource NanoLiterToLiterFormatConverter}}"> + <Border Background="Transparent" ToolTip="{Binding Quantity, Converter={StaticResource TooltipLiquidQuantityFormatConverter}, ConverterParameter='#,#\\'}"> <StackPanel Orientation="Horizontal" Margin="4"> <Ellipse Width="30" Height="30"> <Ellipse.Fill> @@ -713,7 +714,7 @@ </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> - <Border Background="Transparent" ToolTip="{Binding StatisticsValueCollection.TotalLiquidQuantities, Converter={StaticResource LiquidQuantityToFormatStringConverter}}"> + <Border Background="Transparent" ToolTip="{Binding StatisticsValueCollection.TotalLiquidQuantities, Converter={StaticResource TooltipLiquidQuantityFormatConverter}, ConverterParameter='#,#\\'}"> <TextBlock DockPanel.Dock="Bottom" Margin="4 10 0 0 "> <Run Text="Total liquid quantities for all: " FontWeight="SemiBold"/> <Run Text="{Binding StatisticsValueCollection.TotalLiquidQuantities, Converter={StaticResource NanoLiterToLiterFormatConverter}, ConverterParameter='0.00'}"></Run> diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/MaterialDesign.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/MaterialDesign.xaml index 37e35b1ab..11dc2bad3 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/MaterialDesign.xaml +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/MaterialDesign.xaml @@ -540,16 +540,12 @@ <Grid.RowDefinitions> <RowDefinition Height="*" /> </Grid.RowDefinitions> - <Border Background="Transparent" - BorderBrush="{DynamicResource MaterialDesignShadowBrush}" - BorderThickness="1" - CornerRadius="2"> + <Border Background="Transparent" BorderBrush="{DynamicResource MaterialDesignShadowBrush}" BorderThickness="1" CornerRadius="2"> <Border.Effect> <BlurEffect Radius="6"/> </Border.Effect> </Border> - <Grid Margin="1" - SnapsToDevicePixels="True"> + <Grid Margin="1" SnapsToDevicePixels="True"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> @@ -560,7 +556,7 @@ <Border Grid.Row="0" CornerRadius="2 2 0 0" Background="{DynamicResource ComboBox.Floating.Background}" - Height="{StaticResource PopupTopBottomMargin}"/> + Height="0"/> <Grid Grid.Row="1"> <Grid.ColumnDefinitions> @@ -568,29 +564,18 @@ <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> - <Border Grid.Column="0" - Width="{StaticResource PopupLeftRightMargin}" - Background="{DynamicResource ComboBox.Floating.Background}" - /> - <Grid Grid.Column="1" - Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type materialDesign:ComboBoxPopup}}, Path=VisiblePlacementWidth}" - Height="{Binding ElementName=templateRoot, Path=ActualHeight}"/> - <Border Grid.Column="2" - MinWidth="{StaticResource PopupLeftRightMargin}" - Background="{DynamicResource ComboBox.Floating.Background}" - /> + <Border Grid.Column="0" Width="{StaticResource PopupLeftRightMargin}" Background="{DynamicResource ComboBox.Floating.Background}" /> + <Grid Grid.Column="1" + Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type materialDesign:ComboBoxPopup}}, Path=VisiblePlacementWidth}" + Height="0"/> + <Border Grid.Column="2" MinWidth="{StaticResource PopupLeftRightMargin}" Background="{DynamicResource ComboBox.Floating.Background}"/> </Grid> - <Border Grid.Row="2" - Background="{DynamicResource ComboBox.Floating.Background}" - Height="{StaticResource PopupContentPresenterExtend}"/> + <Border Grid.Row="2" Background="{DynamicResource ComboBox.Floating.Background}" Height="0"/> <ContentPresenter Grid.Row="3"/> - <Border Grid.Row="4" - CornerRadius="0 0 2 2" - Height="{StaticResource PopupTopBottomMargin}" - Background="{DynamicResource ComboBox.Floating.Background}" /> + <Border Grid.Row="4" CornerRadius="0 0 2 2" Height="0" Background="{DynamicResource ComboBox.Floating.Background}" /> </Grid> </Grid> </ControlTemplate> @@ -657,7 +642,7 @@ Visibility="{Binding Path=(materialDesign:TextFieldAssist.DecorationVisibility), RelativeSource={RelativeSource TemplatedParent}}"/> <materialDesign:ComboBoxPopup x:Name="PART_Popup" - + AllowsTransparency="true" Focusable="False" HorizontalOffset="-11.5" @@ -667,9 +652,9 @@ UseLayoutRounding="True" Placement="Custom" PopupAnimation="Fade" - VerticalOffset="0" + VerticalOffset="-10" DefaultVerticalOffset="5" - DownVerticalOffset="-15.5" + DownVerticalOffset="{Binding ElementName=templateRoot, Path=ActualHeight}" UpVerticalOffset="15" ClassicMode="{Binding Path=(materialDesign:ComboBoxAssist.ClassicMode), RelativeSource={RelativeSource TemplatedParent}}" UpContentTemplate="{StaticResource PopupContentUpTemplate}" diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Properties/AssemblyInfo.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Properties/AssemblyInfo.cs index 7fe1cd8fd..e72f62f17 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Properties/AssemblyInfo.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Properties/AssemblyInfo.cs @@ -4,5 +4,5 @@ using System.Runtime.InteropServices; [assembly: System.Windows.ThemeInfo(System.Windows.ResourceDictionaryLocation.None, System.Windows.ResourceDictionaryLocation.SourceAssembly)] [assembly: AssemblyTitle("Tango - Machine Studio")] -[assembly: AssemblyVersion("4.1.13.0")] +[assembly: AssemblyVersion("4.1.14.0")] [assembly: ComVisible(false)]
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/ViewModels/MainViewVM.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/ViewModels/MainViewVM.cs index 087e30be6..7869e6990 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/ViewModels/MainViewVM.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/ViewModels/MainViewVM.cs @@ -24,6 +24,7 @@ namespace Tango.PPC.Jobs.ViewModels public class MainViewVM : PPCViewModel { private NotificationItem _last_failed_job_notification; + private bool resuming; /// <summary> /// Called when the application has been started. @@ -33,15 +34,14 @@ namespace Tango.PPC.Jobs.ViewModels MachineProvider.MachineOperator.PrintingCompleted += MachineOperator_PrintingCompleted; MachineProvider.MachineOperator.PrintingFailed += MachineOperator_PrintingFailed; MachineProvider.MachineOperator.ResumingJob += MachineOperator_ResumingJob; + MachineProvider.MachineOperator.PrintingStarted += MachineOperator_PrintingStarted; } - private void MachineOperator_ResumingJob(object sender, ResumingJobEventArgs e) + private void MachineOperator_PrintingStarted(object sender, PrintingEventArgs e) { - LogManager.Log($"Trying to resume job '{e.JobGuid}'..."); - - try + if (resuming) { - e.Approve(); + resuming = false; InvokeUI(() => { @@ -54,6 +54,17 @@ namespace Tango.PPC.Jobs.ViewModels } }); } + } + + private void MachineOperator_ResumingJob(object sender, ResumingJobEventArgs e) + { + LogManager.Log($"Job resume request '{e.JobGuid}' approving..."); + + try + { + e.Approve(); + resuming = true; + } catch (Exception ex) { LogManager.Log(ex, "An error occurred while trying to resume the job."); diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/Converters/LiquidTypeToBrushConverter.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/Converters/LiquidTypeToBrushConverter.cs index c7e828148..c33efdca6 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/Converters/LiquidTypeToBrushConverter.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/Converters/LiquidTypeToBrushConverter.cs @@ -4,6 +4,7 @@ using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Windows; using System.Windows.Data; using System.Windows.Media; using System.Windows.Media.Imaging; @@ -19,24 +20,45 @@ namespace Tango.PPC.Maintenance.Converters if (value is LiquidType) { LiquidType type = value as LiquidType; - if (type.Type == BL.Enumerations.LiquidTypes.Lubricant) + switch (type.Type) { - ImageBrush lubricantBrush = new ImageBrush() { Stretch = Stretch.None, TileMode = TileMode.Tile, ViewportUnits = BrushMappingMode.Absolute }; - lubricantBrush.ImageSource = ResourceHelper.GetImageFromResources(@"Images/lubricant2.png"); - lubricantBrush.Viewport = new System.Windows.Rect(lubricantBrush.ImageSource.Width/3, lubricantBrush.ImageSource.Height/3, lubricantBrush.ImageSource.Width, lubricantBrush.ImageSource.Height); - return lubricantBrush; - } - if (type.Type == BL.Enumerations.LiquidTypes.Cleaner) - { - ImageBrush cleanerBrush = new ImageBrush(){ Stretch = Stretch.None, TileMode = TileMode.Tile, ViewportUnits = BrushMappingMode.Absolute }; - cleanerBrush.ImageSource = ResourceHelper.GetImageFromResources(@"Images/cl-full.png"); - cleanerBrush.Viewport = new System.Windows.Rect(5, 5, cleanerBrush.ImageSource.Width, cleanerBrush.ImageSource.Height); - return cleanerBrush; - } - else - { - return new SolidColorBrush(type.LiquidTypeColor); ; + case BL.Enumerations.LiquidTypes.Lubricant: + { + + ImageBrush lubricantBrush = new ImageBrush() { Stretch = Stretch.None, TileMode = TileMode.Tile, ViewportUnits = BrushMappingMode.Absolute }; + + BitmapSource bit_source = ResourceHelper.GetImageFromResources(@"Images/lubricant2.png"); + var targetBitmap = new WriteableBitmap(new TransformedBitmap(bit_source, new ScaleTransform(0.2, 0.2))); + lubricantBrush.ImageSource = targetBitmap; + lubricantBrush.Viewport = new System.Windows.Rect(2, 2, targetBitmap.Width, targetBitmap.Height); + return lubricantBrush; + } + case BL.Enumerations.LiquidTypes.Cleaner: + { + ImageBrush cleanerBrush = new ImageBrush() { Stretch = Stretch.None, TileMode = TileMode.Tile, ViewportUnits = BrushMappingMode.Absolute }; + BitmapSource bit_source = ResourceHelper.GetImageFromResources(@"Images/cl-full.png"); + var targetBitmap = new WriteableBitmap(new TransformedBitmap(bit_source, new ScaleTransform(0.3, 0.3))); + + cleanerBrush.ImageSource = targetBitmap; + cleanerBrush.Viewport = new System.Windows.Rect(0, 0, targetBitmap.Width, targetBitmap.Height); + return cleanerBrush; + } + case BL.Enumerations.LiquidTypes.Yellow: + { + return new SolidColorBrush(Color.FromRgb(232, 225, 12)); + } + case BL.Enumerations.LiquidTypes.Cyan: + { + return new SolidColorBrush(Color.FromRgb(22, 98, 235)); + } + case BL.Enumerations.LiquidTypes.Magenta: + { + return new SolidColorBrush(Color.FromRgb(237, 0, 140)); + } } + + + return new SolidColorBrush(type.LiquidTypeColor); } return null; diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/Converters/StringToFirstLetterConverter.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/Converters/StringToFirstLetterConverter.cs index 0922af78d..5418b5cf5 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/Converters/StringToFirstLetterConverter.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/Converters/StringToFirstLetterConverter.cs @@ -14,6 +14,14 @@ namespace Tango.PPC.Maintenance.Converters { if (value != null && value.ToString().Length > 1) { + if (value.ToString() == "Cleaner") + return "CL"; + else if (value.ToString() == "Transparent Ink") + return "TI"; + else if(value.ToString() == "Black") + { + return "K"; + } return value.ToString().First().ToString(); } else diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/ViewModels/MaintenanceViewVM.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/ViewModels/MaintenanceViewVM.cs index f613d6f43..252c8aa2e 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/ViewModels/MaintenanceViewVM.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/ViewModels/MaintenanceViewVM.cs @@ -111,8 +111,8 @@ namespace Tango.PPC.Maintenance.ViewModels { Max = MachineOperator.MAX_MIDTANK_LITERS, IDSPack = x, - }).ToList(); - + }).OrderBy(y=>y.IDSPack.LiquidType.Code).ToList(); + MachineProvider.MachineOperator.MachineStatusChanged += MachineOperator_MachineStatusChanged; } diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/Views/MaintenanceView.xaml b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/Views/MaintenanceView.xaml index acbda9daa..2216c47d8 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/Views/MaintenanceView.xaml +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Maintenance/Views/MaintenanceView.xaml @@ -32,7 +32,7 @@ <DataTemplate x:Key="LiquidBox"> <DockPanel> <TextBlock DockPanel.Dock="Top" Text="{Binding IDSPack.LiquidType.Name,Converter={StaticResource StringToFirstLetterConverter}}" HorizontalAlignment="Center"></TextBlock> - <Grid MaxWidth="30" Margin="5 0"> + <Grid MaxWidth="20" Margin="1 0"> <touch:TouchIcon Icon="MapMarkerSolid" Width="20" Height="20" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0 0 0 10" Foreground ="{Binding Path=IDSPack.LiquidType, Converter={StaticResource LiquidTypeToBrushConverter}}"> <touch:TouchIcon.Style> <Style TargetType="touch:TouchIcon"> @@ -114,13 +114,13 @@ <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="150*" /> - <ColumnDefinition Width="250*" /> - <ColumnDefinition Width="100*" /> + <ColumnDefinition Width="200*" /> + <ColumnDefinition Width="150*" /> <ColumnDefinition Width="100*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="100" /> - <RowDefinition Height="25" /> + <RowDefinition Height="28" /> </Grid.RowDefinitions> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> @@ -170,7 +170,7 @@ <TextBlock Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="{StaticResource TangoTitleFontSize}">Temperature</TextBlock> <TextBlock Grid.Column="1" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="{StaticResource TangoTitleFontSize}">Inks</TextBlock> - <TextBlock Grid.Column="2" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="{StaticResource TangoTitleFontSize}">Cone</TextBlock> + <TextBlock Grid.Column="2" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="{StaticResource TangoTitleFontSize}">Collecting Cone</TextBlock> </Grid> </StackPanel> </StackPanel> @@ -242,12 +242,12 @@ <!--JOB RUNS--> <StackPanel Margin="0 20 0 20" TextElement.FontSize="{StaticResource TangoTitleFontSize}" TextElement.Foreground="{StaticResource TangoGrayTextBrush}"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> - <TextBlock FontWeight="SemiBold">Total Dye Time:</TextBlock> + <TextBlock FontWeight="SemiBold">Total Dyeing Time:</TextBlock> <TextBlock Margin="10 0 0 0" Text="{Binding TotalDyeTime,Mode=OneWay,FallbackValue=0}"></TextBlock> </StackPanel> <StackPanel Orientation="Horizontal" Margin="0 10 0 0" HorizontalAlignment="Center"> - <TextBlock FontWeight="SemiBold">Total Dye Meters:</TextBlock> + <TextBlock FontWeight="SemiBold">Total Dyed Length:</TextBlock> <TextBlock Margin="10 0 0 0" Text="{Binding TotalDyeMeters,Mode=OneWay,FallbackValue=0}"></TextBlock> </StackPanel> </StackPanel> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCSettings.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCSettings.cs index 2c605ec36..5586b5341 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCSettings.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCSettings.cs @@ -279,7 +279,7 @@ namespace Tango.PPC.Common HotSpotPassword = "Aa123456"; LockScreenTimeout = TimeSpan.FromMinutes(10); LockScreenPassword = "1111"; - DeploymentSlot = DeploymentSlot.TEST; + DeploymentSlot = DeploymentSlot.DEV; EnableWatchDog = true; EnableEmergencyNotifications = true; EmergencyComPort = "COM2"; diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Properties/AssemblyInfo.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/Properties/AssemblyInfo.cs index 6e9f18b0d..c2a48aec9 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Properties/AssemblyInfo.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Properties/AssemblyInfo.cs @@ -8,4 +8,4 @@ using System.Windows; // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Tango PPC Application")] -[assembly: AssemblyVersion("1.1.19.0")] +[assembly: AssemblyVersion("1.1.20.0")] diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineUpdateViewVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineUpdateViewVM.cs index 54a92aa5c..d4d78dac6 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineUpdateViewVM.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineUpdateViewVM.cs @@ -609,6 +609,7 @@ namespace Tango.PPC.UI.ViewModels { _update_result = await MachineUpdateManager.UpdateFromTUP(request.RemoteTupFilePath, request.SetupFirmware, request.SetupFPGA); LogManager.Log("Machine update from package completed."); + stopReporting = true; InvokeUI(() => { @@ -624,6 +625,8 @@ namespace Tango.PPC.UI.ViewModels { NavigateTo(MachineUpdateView.UpdateFailedFromPackageView); }); + + throw ex; } await receiver.SendGenericResponse(new StartRemoteApplicationUpgradeResponse() @@ -646,10 +649,13 @@ namespace Tango.PPC.UI.ViewModels } catch (Exception ex) { + stopReporting = true; await receiver.SendErrorResponse(ex, token); } finally { + stopReporting = true; + try { File.Delete(request.RemoteTupFilePath); @@ -707,6 +713,7 @@ namespace Tango.PPC.UI.ViewModels try { await MachineUpdateManager.UpdateFromTFP(request.RemoteTfpFilePath); + stopReporting = true; LogManager.Log("Firmware upgrade from package completed."); _update_result = new MachineUpdateResult() { @@ -720,6 +727,8 @@ namespace Tango.PPC.UI.ViewModels } catch (Exception ex) { + stopReporting = true; + LogManager.Log(ex, "Firmware upgrade from package failed."); FailedError = ex.FlattenMessage(); @@ -727,6 +736,8 @@ namespace Tango.PPC.UI.ViewModels { NavigateTo(MachineUpdateView.UpdateFailedFromPackageView); }); + + throw ex; } await receiver.SendGenericResponse(new StartRemoteFirmwareUpgradeResponse() @@ -749,10 +760,13 @@ namespace Tango.PPC.UI.ViewModels } catch (Exception ex) { + stopReporting = true; await receiver.SendErrorResponse(ex, token); } finally { + stopReporting = true; + try { File.Delete(request.RemoteTfpFilePath); diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/app.manifest b/Software/Visual_Studio/PPC/Tango.PPC.UI/app.manifest index efc5f8179..d72e75011 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/app.manifest +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/app.manifest @@ -16,7 +16,7 @@ Remove this element if your application requires this virtualization for backwards compatibility. --> - <!--<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />--> + <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> diff --git a/Software/Visual_Studio/Resources/Tango alarm events handling chart_Rev21.xlsx b/Software/Visual_Studio/Resources/Tango alarm events handling chart_Rev21.xlsx Binary files differnew file mode 100644 index 000000000..f3c8b0e48 --- /dev/null +++ b/Software/Visual_Studio/Resources/Tango alarm events handling chart_Rev21.xlsx diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs index 6417e34f8..3ceecae4b 100644 --- a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs @@ -1939,6 +1939,8 @@ namespace Tango.Scripting.Editors currentLine = currentLine.Split('(')[currentLine.Split('(').Length - 2]; } + currentLine = Regex.Replace(currentLine, "(?<=\")(.*?)(?=\")", string.Empty); + var words = currentLine.Split(' '); if (words.Count() > 0 && (words.First() == "private" || words.First() == "public" || words.First() == "void")) @@ -1951,6 +1953,8 @@ namespace Tango.Scripting.Editors if (expression != null) { int parameterIndex = expression.Count(x => x == ','); + + expression = new string(expression.TakeWhile(x => x != '(').ToArray()); var tree = expression.Split('.').Select(x => x.Remove(@"\n|\r|\s|\t|\(|\)|\[|\]|<.*>")).ToList(); diff --git a/Software/Visual_Studio/Tango.BL/DTO/PublishedProcedureProjectDTOBase.cs b/Software/Visual_Studio/Tango.BL/DTO/PublishedProcedureProjectDTOBase.cs index ef759e862..851b3fa8d 100644 --- a/Software/Visual_Studio/Tango.BL/DTO/PublishedProcedureProjectDTOBase.cs +++ b/Software/Visual_Studio/Tango.BL/DTO/PublishedProcedureProjectDTOBase.cs @@ -46,6 +46,14 @@ namespace Tango.BL.DTO } /// <summary> + /// sorting index + /// </summary> + public Int32 SortingIndex + { + get; set; + } + + /// <summary> /// is visible /// </summary> public Boolean IsVisible diff --git a/Software/Visual_Studio/Tango.BL/Entities/PublishedProcedureProjectBase.cs b/Software/Visual_Studio/Tango.BL/Entities/PublishedProcedureProjectBase.cs index 272f562d6..d4ce0decb 100644 --- a/Software/Visual_Studio/Tango.BL/Entities/PublishedProcedureProjectBase.cs +++ b/Software/Visual_Studio/Tango.BL/Entities/PublishedProcedureProjectBase.cs @@ -33,6 +33,8 @@ namespace Tango.BL.Entities public event EventHandler<DateTime> PublishDateChanged; + public event EventHandler<Int32> SortingIndexChanged; + public event EventHandler<Boolean> IsVisibleChanged; public event EventHandler<SynchronizedObservableCollection<PublishedProcedureProjectsVersion>> PublishedProcedureProjectsVersionsChanged; @@ -118,6 +120,33 @@ namespace Tango.BL.Entities } } + protected Int32 _sortingindex; + + /// <summary> + /// Gets or sets the publishedprocedureprojectbase sorting index. + /// </summary> + + [Column("SORTING_INDEX")] + + public Int32 SortingIndex + { + get + { + return _sortingindex; + } + + set + { + if (_sortingindex != value) + { + _sortingindex = value; + + OnSortingIndexChanged(value); + + } + } + } + protected Boolean _isvisible; /// <summary> @@ -198,6 +227,15 @@ namespace Tango.BL.Entities } /// <summary> + /// Called when the SortingIndex has changed. + /// </summary> + protected virtual void OnSortingIndexChanged(Int32 sortingindex) + { + SortingIndexChanged?.Invoke(this, sortingindex); + RaisePropertyChanged(nameof(SortingIndex)); + } + + /// <summary> /// Called when the IsVisible has changed. /// </summary> protected virtual void OnIsVisibleChanged(Boolean isvisible) diff --git a/Software/Visual_Studio/Tango.BL/Enumerations/EventTypes.cs b/Software/Visual_Studio/Tango.BL/Enumerations/EventTypes.cs index 37e1b2dc9..69c81c7f3 100644 --- a/Software/Visual_Studio/Tango.BL/Enumerations/EventTypes.cs +++ b/Software/Visual_Studio/Tango.BL/Enumerations/EventTypes.cs @@ -149,7 +149,7 @@ namespace Tango.BL.Enumerations /// (Cover is open. Cannot execute job ) /// </summary> [Description("Cover is open. Cannot execute job ")] - REAR_COVER_OPEN = 2007, + ARCH_COVER_OPEN = 2007, /// <summary> /// (The machine temperature is too high. Cannot execute job) @@ -230,6 +230,12 @@ namespace Tango.BL.Enumerations UNINTENDED_RESET = 2020, /// <summary> + /// (Temperature measurement error has occurred. Cannot execute job.) + /// </summary> + [Description("Temperature measurement error has occurred. Cannot execute job.")] + TEMPERATURE_MEASUREMENT_ERROR = 2021, + + /// <summary> /// (Thread break. Cannot execute job) /// </summary> [Description("Thread break. Cannot execute job")] @@ -1232,6 +1238,42 @@ namespace Tango.BL.Enumerations DYEING_HEAD_LEFT_ACTUATOR_DOWN_TIMEOUT = 5092, /// <summary> + /// (Dyeing head blower flow is too high. Cannot execute job) + /// </summary> + [Description("Dyeing head blower flow is too high. Cannot execute job")] + DYEING_HEAD_BLOWER_1_FLOW_TOO_HIGH = 5093, + + /// <summary> + /// (Dyeing head blower flow is too high. Cannot execute job) + /// </summary> + [Description("Dyeing head blower flow is too high. Cannot execute job")] + DYEING_HEAD_BLOWER_2_FLOW_TOO_HIGH = 5094, + + /// <summary> + /// (Dyeing head blower flow is too low. Cannot execute job) + /// </summary> + [Description("Dyeing head blower flow is too low. Cannot execute job")] + DYEING_HEAD_BLOWER_1_FLOW_TOO_LOW = 5095, + + /// <summary> + /// (Dyeing head blower flow is too low. Cannot execute job) + /// </summary> + [Description("Dyeing head blower flow is too low. Cannot execute job")] + DYEING_HEAD_BLOWER_2_FLOW_TOO_LOW = 5096, + + /// <summary> + /// (Dyeing head arc lid is open. Cannot execute job.) + /// </summary> + [Description("Dyeing head arc lid is open. Cannot execute job.")] + DYEING_HEAD_ARC_LID_IS_OPEN = 5097, + + /// <summary> + /// (Dyeing head tunnel lid is open. Cannot execute job) + /// </summary> + [Description("Dyeing head tunnel lid is open. Cannot execute job")] + DYEING_HEAD_TUNNEL_LID_IS_OPEN = 5098, + + /// <summary> /// (The temperature in the mixer is too high. Cannot execute job) /// </summary> [Description("The temperature in the mixer is too high. Cannot execute job")] diff --git a/Software/Visual_Studio/Tango.DAL.Remote/DB/PUBLISHED_PROCEDURE_PROJECTS.cs b/Software/Visual_Studio/Tango.DAL.Remote/DB/PUBLISHED_PROCEDURE_PROJECTS.cs index 827a2ba94..cabfa89c7 100644 --- a/Software/Visual_Studio/Tango.DAL.Remote/DB/PUBLISHED_PROCEDURE_PROJECTS.cs +++ b/Software/Visual_Studio/Tango.DAL.Remote/DB/PUBLISHED_PROCEDURE_PROJECTS.cs @@ -26,6 +26,7 @@ namespace Tango.DAL.Remote.DB public string NAME { get; set; } public string DESCRIPTION { get; set; } public System.DateTime PUBLISH_DATE { get; set; } + public int SORTING_INDEX { get; set; } public bool IS_VISIBLE { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] diff --git a/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx b/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx index a379b2049..50f09d327 100644 --- a/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx +++ b/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx @@ -927,6 +927,7 @@ <Property Name="NAME" Type="nvarchar" MaxLength="100" Nullable="false" /> <Property Name="DESCRIPTION" Type="nvarchar(max)" /> <Property Name="PUBLISH_DATE" Type="datetime2" Precision="3" Nullable="false" /> + <Property Name="SORTING_INDEX" Type="int" Nullable="false" /> <Property Name="IS_VISIBLE" Type="bit" Nullable="false" /> </EntityType> <EntityType Name="PUBLISHED_PROCEDURE_PROJECTS_VERSIONS"> @@ -4359,6 +4360,7 @@ <Property Name="NAME" Type="String" Nullable="false" MaxLength="100" FixedLength="false" Unicode="true" /> <Property Name="DESCRIPTION" Type="String" MaxLength="Max" FixedLength="false" Unicode="true" /> <Property Name="PUBLISH_DATE" Type="DateTime" Nullable="false" Precision="3" /> + <Property Name="SORTING_INDEX" Type="Int32" Nullable="false" /> <Property Name="IS_VISIBLE" Type="Boolean" Nullable="false" /> <NavigationProperty Name="PUBLISHED_PROCEDURE_PROJECTS_VERSIONS" Relationship="RemoteModel.FK_PUBLISHED_TEST_PROJECTS_VERSIONS_PUBLISHED_TEST_PROJECTS" FromRole="PUBLISHED_PROCEDURE_PROJECTS" ToRole="PUBLISHED_PROCEDURE_PROJECTS_VERSIONS" /> </EntityType> @@ -6890,6 +6892,7 @@ <EntityTypeMapping TypeName="RemoteModel.PUBLISHED_PROCEDURE_PROJECTS"> <MappingFragment StoreEntitySet="PUBLISHED_PROCEDURE_PROJECTS"> <ScalarProperty Name="IS_VISIBLE" ColumnName="IS_VISIBLE" /> + <ScalarProperty Name="SORTING_INDEX" ColumnName="SORTING_INDEX" /> <ScalarProperty Name="PUBLISH_DATE" ColumnName="PUBLISH_DATE" /> <ScalarProperty Name="DESCRIPTION" ColumnName="DESCRIPTION" /> <ScalarProperty Name="NAME" ColumnName="NAME" /> diff --git a/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx.diagram b/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx.diagram index 9731d3aac..41f8bf0c3 100644 --- a/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx.diagram +++ b/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx.diagram @@ -5,88 +5,88 @@ <!-- Diagram content (shape and connector positions) --> <edmx:Diagrams> <Diagram DiagramId="f9ae01d708754bbd997add25a4bacc79" Name="Diagram1" ZoomLevel="97"> - <EntityTypeShape EntityType="RemoteModel.ACTION_LOGS" Width="1.5" PointX="11.25" PointY="33" /> - <EntityTypeShape EntityType="RemoteModel.ADDRESS" Width="1.5" PointX="1.5" PointY="59.125" /> - <EntityTypeShape EntityType="RemoteModel.APPLICATION_DISPLAY_PANEL_VERSIONS" Width="1.5" PointX="1.5" PointY="84.5" /> - <EntityTypeShape EntityType="RemoteModel.APPLICATION_FIRMWARE_VERSIONS" Width="1.5" PointX="1.5" PointY="78.625" /> - <EntityTypeShape EntityType="RemoteModel.APPLICATION_OS_VERSIONS" Width="1.5" PointX="1.5" PointY="63.5" /> + <EntityTypeShape EntityType="RemoteModel.ACTION_LOGS" Width="1.5" PointX="11.25" PointY="93" /> + <EntityTypeShape EntityType="RemoteModel.ADDRESS" Width="1.5" PointX="4.5" PointY="32.5" /> + <EntityTypeShape EntityType="RemoteModel.APPLICATION_DISPLAY_PANEL_VERSIONS" Width="1.5" PointX="4.5" PointY="72.25" /> + <EntityTypeShape EntityType="RemoteModel.APPLICATION_FIRMWARE_VERSIONS" Width="1.5" PointX="4.5" PointY="75.125" /> + <EntityTypeShape EntityType="RemoteModel.APPLICATION_OS_VERSIONS" Width="1.5" PointX="4.5" PointY="69.25" /> <EntityTypeShape EntityType="RemoteModel.BRUSH_STOPS" Width="1.5" PointX="15.75" PointY="17" /> - <EntityTypeShape EntityType="RemoteModel.CARTRIDGE_TYPES" Width="1.5" PointX="3" PointY="41.875" /> - <EntityTypeShape EntityType="RemoteModel.CAT" Width="1.5" PointX="5.25" PointY="15.875" /> - <EntityTypeShape EntityType="RemoteModel.CCT" Width="1.5" PointX="0.75" PointY="23.625" /> + <EntityTypeShape EntityType="RemoteModel.CARTRIDGE_TYPES" Width="1.5" PointX="9.75" PointY="46.875" /> + <EntityTypeShape EntityType="RemoteModel.CAT" Width="1.5" PointX="5.25" PointY="23.875" /> + <EntityTypeShape EntityType="RemoteModel.CCT" Width="1.5" PointX="0.75" PointY="12.75" /> <EntityTypeShape EntityType="RemoteModel.COLOR_CATALOGS" Width="1.5" PointX="1.5" PointY="7.625" /> <EntityTypeShape EntityType="RemoteModel.COLOR_CATALOGS_GROUPS" Width="1.5" PointX="3.75" PointY="8.125" /> <EntityTypeShape EntityType="RemoteModel.COLOR_CATALOGS_ITEMS" Width="1.5" PointX="6" PointY="6.875" /> - <EntityTypeShape EntityType="RemoteModel.COLOR_CATALOGS_ITEMS_RECIPES" Width="1.5" PointX="8.25" PointY="19.75" /> - <EntityTypeShape EntityType="RemoteModel.COLOR_SPACES" Width="1.5" PointX="9" PointY="7.625" /> - <EntityTypeShape EntityType="RemoteModel.CONFIGURATION" Width="1.5" PointX="0.75" PointY="69" /> - <EntityTypeShape EntityType="RemoteModel.CONTACT" Width="1.5" PointX="1.5" PointY="55.25" /> - <EntityTypeShape EntityType="RemoteModel.CUSTOMER" Width="1.5" PointX="9" PointY="29.125" /> - <EntityTypeShape EntityType="RemoteModel.DISPENSER_TYPES" Width="1.5" PointX="0.75" PointY="88.75" /> - <EntityTypeShape EntityType="RemoteModel.DISPENSER" Width="1.5" PointX="3" PointY="88.125" /> - <EntityTypeShape EntityType="RemoteModel.EMBEDDED_FIRMWARE_VERSIONS" Width="1.5" PointX="1.5" PointY="81.625" /> - <EntityTypeShape EntityType="RemoteModel.EVENT_TYPES" Width="1.5" PointX="9" PointY="41" /> - <EntityTypeShape EntityType="RemoteModel.FIBER_SHAPES" Width="1.5" PointX="0.75" PointY="15.75" /> + <EntityTypeShape EntityType="RemoteModel.COLOR_CATALOGS_ITEMS_RECIPES" Width="1.5" PointX="8.25" PointY="15.75" /> + <EntityTypeShape EntityType="RemoteModel.COLOR_SPACES" Width="1.5" PointX="9" PointY="42.75" /> + <EntityTypeShape EntityType="RemoteModel.CONFIGURATION" Width="1.5" PointX="6.75" PointY="67.625" /> + <EntityTypeShape EntityType="RemoteModel.CONTACT" Width="1.5" PointX="4.5" PointY="28.625" /> + <EntityTypeShape EntityType="RemoteModel.CUSTOMER" Width="1.5" PointX="9" PointY="31.125" /> + <EntityTypeShape EntityType="RemoteModel.DISPENSER_TYPES" Width="1.5" PointX="7.5" PointY="2.375" /> + <EntityTypeShape EntityType="RemoteModel.DISPENSER" Width="1.5" PointX="9.75" PointY="1.875" /> + <EntityTypeShape EntityType="RemoteModel.EMBEDDED_FIRMWARE_VERSIONS" Width="1.5" PointX="4.5" PointY="66.375" /> + <EntityTypeShape EntityType="RemoteModel.EVENT_TYPES" Width="1.5" PointX="13" PointY="75" /> + <EntityTypeShape EntityType="RemoteModel.FIBER_SHAPES" Width="1.5" PointX="0.75" PointY="27" /> <EntityTypeShape EntityType="RemoteModel.FIBER_SYNTHS" Width="1.5" PointX="0.75" PointY="29.875" /> - <EntityTypeShape EntityType="RemoteModel.FSE_VERSIONS" Width="1.5" PointX="11.25" PointY="50.25" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_BLOWER_TYPES" Width="1.5" PointX="4.5" PointY="68" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_BLOWERS" Width="1.5" PointX="6.75" PointY="68.625" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_BREAK_SENSOR_TYPES" Width="1.5" PointX="7.5" PointY="85" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_BREAK_SENSORS" Width="1.5" PointX="9.75" PointY="74.625" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_DANCER_TYPES" Width="1.5" PointX="7.5" PointY="65" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_DANCERS" Width="1.5" PointX="9.75" PointY="68.875" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_MOTOR_TYPES" Width="1.5" PointX="1.5" PointY="92.875" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_MOTORS" Width="1.5" PointX="3.75" PointY="71.625" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_PID_CONTROL_TYPES" Width="1.5" PointX="4.5" PointY="82" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_PID_CONTROLS" Width="1.5" PointX="6.75" PointY="73" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_SPEED_SENSOR_TYPES" Width="1.5" PointX="4.5" PointY="93" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_SPEED_SENSORS" Width="1.5" PointX="6.75" PointY="80.625" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_VERSIONS" Width="1.5" PointX="1.5" PointY="74.375" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_WINDER_TYPES" Width="1.5" PointX="7.5" PointY="89" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_WINDERS" Width="1.5" PointX="9.75" PointY="78.75" /> - <EntityTypeShape EntityType="RemoteModel.IDS_PACK_FORMULAS" Width="1.5" PointX="3" PointY="35.5" /> - <EntityTypeShape EntityType="RemoteModel.IDS_PACKS" Width="1.5" PointX="5.25" PointY="35.5" /> - <EntityTypeShape EntityType="RemoteModel.JOB_RUNS" Width="1.5" PointX="11.75" PointY="0.75" /> + <EntityTypeShape EntityType="RemoteModel.FSE_VERSIONS" Width="1.5" PointX="11.25" PointY="89.5" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_BLOWER_TYPES" Width="1.5" PointX="7.5" PointY="81.625" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_BLOWERS" Width="1.5" PointX="9.75" PointY="62.25" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_BREAK_SENSOR_TYPES" Width="1.5" PointX="4.5" PointY="54.625" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_BREAK_SENSORS" Width="1.5" PointX="6.75" PointY="62.375" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_DANCER_TYPES" Width="1.5" PointX="9.5" PointY="76.625" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_DANCERS" Width="1.5" PointX="11.75" PointY="56.625" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_MOTOR_TYPES" Width="1.5" PointX="12.5" PointY="48.625" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_MOTORS" Width="1.5" PointX="14.75" PointY="52.25" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_PID_CONTROL_TYPES" Width="1.5" PointX="10.5" PointY="80.625" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_PID_CONTROLS" Width="1.5" PointX="12.75" PointY="62.75" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_SPEED_SENSOR_TYPES" Width="1.5" PointX="9.5" PointY="85.625" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_SPEED_SENSORS" Width="1.5" PointX="11.75" PointY="70.375" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_VERSIONS" Width="1.5" PointX="4.5" PointY="62.125" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_WINDER_TYPES" Width="1.5" PointX="4.5" PointY="58.625" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_WINDERS" Width="1.5" PointX="6.75" PointY="58.5" /> + <EntityTypeShape EntityType="RemoteModel.IDS_PACK_FORMULAS" Width="1.5" PointX="9.75" PointY="12.125" /> + <EntityTypeShape EntityType="RemoteModel.IDS_PACKS" Width="1.5" PointX="12" PointY="35.125" /> + <EntityTypeShape EntityType="RemoteModel.JOB_RUNS" Width="1.5" PointX="13.75" PointY="0.75" /> <EntityTypeShape EntityType="RemoteModel.JOB" Width="1.5" PointX="11.25" PointY="16.375" /> - <EntityTypeShape EntityType="RemoteModel.LINEAR_MASS_DENSITY_UNITS" Width="1.5" PointX="0.75" PointY="20.25" /> - <EntityTypeShape EntityType="RemoteModel.LIQUID_TYPES" Width="1.5" PointX="3" PointY="2.125" /> - <EntityTypeShape EntityType="RemoteModel.LIQUID_TYPES_RMLS" Width="1.5" PointX="8.25" PointY="16" /> - <EntityTypeShape EntityType="RemoteModel.MACHINE_STUDIO_VERSIONS" Width="1.5" PointX="11.25" PointY="46.75" /> - <EntityTypeShape EntityType="RemoteModel.MACHINE_VERSIONS" Width="1.5" PointX="0.75" PointY="44.125" /> - <EntityTypeShape EntityType="RemoteModel.MACHINE" Width="1.5" PointX="3" PointY="45" /> - <EntityTypeShape EntityType="RemoteModel.MACHINES_EVENTS" Width="1.5" PointX="11.25" PointY="42.25" /> - <EntityTypeShape EntityType="RemoteModel.MEDIA_CONDITIONS" Width="1.5" PointX="0.75" PointY="27" /> + <EntityTypeShape EntityType="RemoteModel.LINEAR_MASS_DENSITY_UNITS" Width="1.5" PointX="0.75" PointY="16.125" /> + <EntityTypeShape EntityType="RemoteModel.LIQUID_TYPES" Width="1.5" PointX="3" PointY="2.75" /> + <EntityTypeShape EntityType="RemoteModel.LIQUID_TYPES_RMLS" Width="1.5" PointX="5.25" PointY="16" /> + <EntityTypeShape EntityType="RemoteModel.MACHINE_STUDIO_VERSIONS" Width="1.5" PointX="11.25" PointY="42.875" /> + <EntityTypeShape EntityType="RemoteModel.MACHINE_VERSIONS" Width="1.5" PointX="6.75" PointY="78" /> + <EntityTypeShape EntityType="RemoteModel.MACHINE" Width="1.5" PointX="9" PointY="66.875" /> + <EntityTypeShape EntityType="RemoteModel.MACHINES_EVENTS" Width="1.5" PointX="15.25" PointY="64.25" /> + <EntityTypeShape EntityType="RemoteModel.MEDIA_CONDITIONS" Width="1.5" PointX="0.75" PointY="24" /> <EntityTypeShape EntityType="RemoteModel.MEDIA_MATERIALS" Width="1.5" PointX="0.75" PointY="32.75" /> - <EntityTypeShape EntityType="RemoteModel.MEDIA_PURPOSES" Width="1.5" PointX="0.75" PointY="12.75" /> - <EntityTypeShape EntityType="RemoteModel.MID_TANK_TYPES" Width="1.5" PointX="3" PointY="38.75" /> - <EntityTypeShape EntityType="RemoteModel.ORGANIZATION" Width="1.5" PointX="0.75" PointY="38.125" /> - <EntityTypeShape EntityType="RemoteModel.PERMISSION" Width="1.5" PointX="12" PointY="8.625" /> + <EntityTypeShape EntityType="RemoteModel.MEDIA_PURPOSES" Width="1.5" PointX="0.75" PointY="20.25" /> + <EntityTypeShape EntityType="RemoteModel.MID_TANK_TYPES" Width="1.5" PointX="9.75" PointY="27.75" /> + <EntityTypeShape EntityType="RemoteModel.ORGANIZATION" Width="1.5" PointX="6.75" PointY="30.625" /> + <EntityTypeShape EntityType="RemoteModel.PERMISSION" Width="1.5" PointX="15" PointY="44.625" /> <EntityTypeShape EntityType="RemoteModel.PROCESS_PARAMETERS_TABLES" Width="1.5" PointX="7.5" PointY="46.625" /> <EntityTypeShape EntityType="RemoteModel.PROCESS_PARAMETERS_TABLES_GROUPS" Width="1.5" PointX="5.25" PointY="49.25" /> - <EntityTypeShape EntityType="RemoteModel.PUBLISHED_PROCEDURE_PROJECTS" Width="1.5" PointX="5.75" PointY="1" /> - <EntityTypeShape EntityType="RemoteModel.PUBLISHED_PROCEDURE_PROJECTS_VERSIONS" Width="1.5" PointX="8" PointY="1" /> + <EntityTypeShape EntityType="RemoteModel.PUBLISHED_PROCEDURE_PROJECTS" Width="1.5" PointX="8.75" PointY="7" /> + <EntityTypeShape EntityType="RemoteModel.PUBLISHED_PROCEDURE_PROJECTS_VERSIONS" Width="1.5" PointX="11" PointY="7" /> <EntityTypeShape EntityType="RemoteModel.RML" Width="1.5" PointX="3" PointY="15.25" /> - <EntityTypeShape EntityType="RemoteModel.RMLS_SPOOLS" Width="1.5" PointX="5.25" PointY="23.875" /> - <EntityTypeShape EntityType="RemoteModel.ROLE" Width="1.5" PointX="12" PointY="29.5" /> - <EntityTypeShape EntityType="RemoteModel.ROLES_PERMISSIONS" Width="1.5" PointX="14.25" PointY="29.625" /> + <EntityTypeShape EntityType="RemoteModel.RMLS_SPOOLS" Width="1.5" PointX="8.25" PointY="19.875" /> + <EntityTypeShape EntityType="RemoteModel.ROLE" Width="1.5" PointX="15" PointY="48.5" /> + <EntityTypeShape EntityType="RemoteModel.ROLES_PERMISSIONS" Width="1.5" PointX="17.25" PointY="48.625" /> <EntityTypeShape EntityType="RemoteModel.SEGMENT" Width="1.5" PointX="13.5" PointY="20" /> - <EntityTypeShape EntityType="RemoteModel.SITE" Width="1.5" PointX="3" PointY="29" /> - <EntityTypeShape EntityType="RemoteModel.SITES_CATALOGS" Width="1.5" PointX="11.25" PointY="12.5" /> + <EntityTypeShape EntityType="RemoteModel.SITE" Width="1.5" PointX="3" PointY="37" /> + <EntityTypeShape EntityType="RemoteModel.SITES_CATALOGS" Width="1.5" PointX="8.25" PointY="24.5" /> <EntityTypeShape EntityType="RemoteModel.SITES_RMLS" Width="1.5" PointX="5.25" PointY="20.25" /> - <EntityTypeShape EntityType="RemoteModel.SPOOL_TYPES" Width="1.5" PointX="9" PointY="24.125" /> - <EntityTypeShape EntityType="RemoteModel.SPOOL" Width="1.5" PointX="11.25" PointY="37.375" /> - <EntityTypeShape EntityType="RemoteModel.sysdiagram" Width="1.5" PointX="8.75" PointY="4.75" /> - <EntityTypeShape EntityType="RemoteModel.TANGO_UPDATES" Width="1.5" PointX="13.75" PointY="0.75" /> - <EntityTypeShape EntityType="RemoteModel.TANGO_VERSIONS" Width="1.5" PointX="14.25" PointY="37.875" /> - <EntityTypeShape EntityType="RemoteModel.TECH_CONTROLLERS" Width="1.5" PointX="13.75" PointY="11.75" /> + <EntityTypeShape EntityType="RemoteModel.SPOOL_TYPES" Width="1.5" PointX="9" PointY="34.625" /> + <EntityTypeShape EntityType="RemoteModel.SPOOL" Width="1.5" PointX="11.25" PointY="52.5" /> + <EntityTypeShape EntityType="RemoteModel.sysdiagram" Width="1.5" PointX="11.75" PointY="10.75" /> + <EntityTypeShape EntityType="RemoteModel.TANGO_UPDATES" Width="1.5" PointX="13.75" PointY="8.75" /> + <EntityTypeShape EntityType="RemoteModel.TANGO_VERSIONS" Width="1.5" PointX="14.25" PointY="69.75" /> + <EntityTypeShape EntityType="RemoteModel.TECH_CONTROLLERS" Width="1.5" PointX="15.75" PointY="0.75" /> <EntityTypeShape EntityType="RemoteModel.TECH_DISPENSERS" Width="1.5" PointX="5.75" PointY="12.75" /> - <EntityTypeShape EntityType="RemoteModel.TECH_HEATERS" Width="1.5" PointX="14.75" PointY="5.75" /> - <EntityTypeShape EntityType="RemoteModel.TECH_IOS" Width="1.5" PointX="15.75" PointY="0.75" /> - <EntityTypeShape EntityType="RemoteModel.TECH_MONITORS" Width="1.5" PointX="15.75" PointY="8.75" /> + <EntityTypeShape EntityType="RemoteModel.TECH_HEATERS" Width="1.5" PointX="13.75" PointY="13.75" /> + <EntityTypeShape EntityType="RemoteModel.TECH_IOS" Width="1.5" PointX="15.75" PointY="4.75" /> + <EntityTypeShape EntityType="RemoteModel.TECH_MONITORS" Width="1.5" PointX="15.75" PointY="9.75" /> <EntityTypeShape EntityType="RemoteModel.TECH_VALVES" Width="1.5" PointX="17.75" PointY="0.75" /> - <EntityTypeShape EntityType="RemoteModel.USER" Width="1.5" PointX="9" PointY="32.25" /> - <EntityTypeShape EntityType="RemoteModel.USERS_ROLES" Width="1.5" PointX="14.25" PointY="33.625" /> - <EntityTypeShape EntityType="RemoteModel.WINDING_METHODS" Width="1.5" PointX="9" PointY="11.5" /> + <EntityTypeShape EntityType="RemoteModel.USER" Width="1.5" PointX="9" PointY="56.25" /> + <EntityTypeShape EntityType="RemoteModel.USERS_ROLES" Width="1.5" PointX="17.25" PointY="57.625" /> + <EntityTypeShape EntityType="RemoteModel.WINDING_METHODS" Width="1.5" PointX="9" PointY="39.625" /> <AssociationConnector Association="RemoteModel.FK_ACTION_LOGS_USERS" /> <AssociationConnector Association="RemoteModel.FK_ORGANIZATIONS_ADDRESSES" /> <AssociationConnector Association="RemoteModel.FK_USERS_ADDRESSES" /> diff --git a/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs b/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs index e93fa0eba..5c260f639 100644 --- a/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs +++ b/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs @@ -715,10 +715,13 @@ namespace Tango.Emulations.Emulators Task.Factory.StartNew(() => { MachineStatus.State = MachineState.RunningJob; - - List<JobBrushStop> calculatedStops = new List<JobBrushStop>(); + + List<int> calculatedStopIndexes = new List<int>(); double progress = 0; double lastProgress = 0; + Stopwatch watch = new Stopwatch(); + Dictionary<int, IDSPackLevel> dispenserindexToPacklevel = new Dictionary<int, IDSPackLevel>(); + for (int i = 0; i < units; i++) { @@ -757,6 +760,8 @@ namespace Tango.Emulations.Emulators double currentPosition = 0; double nextStopPosition = unit_length; + + watch.Restart(); for (int seg_index = 0; seg_index < jobTicket.Segments.Count(); seg_index++) { var segment = jobTicket.Segments[seg_index]; @@ -773,8 +778,8 @@ namespace Tango.Emulations.Emulators var nextStop = segment.BrushStops[index + 1]; nextStopPosition = nextStop.OffsetMeters; } - - if (!calculatedStops.Contains(stop)) + + if(!calculatedStopIndexes.Contains(stop.Index)) { var brushStopPosition = currentPosition + stop.OffsetMeters; if (brushStopPosition >= lastProgress && brushStopPosition <= progress) @@ -782,22 +787,27 @@ namespace Tango.Emulations.Emulators foreach (var dispenser in stop.Dispensers) { var quantity = dispenser.NanoliterPerCentimeter * (nextStopPosition - stop.OffsetMeters) * 100d; - var packLevel = MachineStatus.IDSPacksLevels.SingleOrDefault(x => x.Index == dispenser.Index); + IDSPackLevel packLevel; + if(!dispenserindexToPacklevel.TryGetValue(dispenser.Index, out packLevel)) + { + packLevel = MachineStatus.IDSPacksLevels.SingleOrDefault(x => x.Index == dispenser.Index); + dispenserindexToPacklevel.Add(dispenser.Index, packLevel); + } if (packLevel != null) { packLevel.DispenserLevel -= (int)quantity; } } - - calculatedStops.Add(stop); + calculatedStopIndexes.Add(stop.Index); } } } currentPosition += segment.Length; } + watch.Stop(); lastProgress = progress; - - Thread.Sleep(100); + int delay = (100 - (int)watch.ElapsedMilliseconds) > 0? (100 - (int)watch.ElapsedMilliseconds) : 5; + Thread.Sleep(delay); if (_cancelJob) { diff --git a/Software/Visual_Studio/Tango.PMR/Diagnostics/EventType.cs b/Software/Visual_Studio/Tango.PMR/Diagnostics/EventType.cs index c3b58f341..ac44f7de0 100644 --- a/Software/Visual_Studio/Tango.PMR/Diagnostics/EventType.cs +++ b/Software/Visual_Studio/Tango.PMR/Diagnostics/EventType.cs @@ -22,7 +22,7 @@ namespace Tango.PMR.Diagnostics { static EventTypeReflection() { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( - "Cg9FdmVudFR5cGUucHJvdG8SFVRhbmdvLlBNUi5EaWFnbm9zdGljcyrsYQoJ", + "Cg9FdmVudFR5cGUucHJvdG8SFVRhbmdvLlBNUi5EaWFnbm9zdGljcyr5YwoJ", "RXZlbnRUeXBlEggKBE5vbmUQABIRCgxSRVFVRVNUX1NFTlQQ6AcSFgoRUkVT", "UE9OU0VfUkVDRUlWRUQQ6QcSEwoOUkVRVUVTVF9GQUlMRUQQ6gcSGgoVQVBQ", "TElDQVRJT05fRVhDRVBUSU9OEOsHEhwKF0FQUExJQ0FUSU9OX0lORk9STUFU", @@ -34,7 +34,7 @@ namespace Tango.PMR.Diagnostics { "DxIiCh1FTUVSR0VOQ1lfUFVTSF9CVVRUT05fUFJFU1NFRBDRDxIXChJGUk9O", "VF9DT1ZFUl8xX09QRU4Q0g8SFwoSRlJPTlRfQ09WRVJfMl9PUEVOENMPEhcK", "EkZST05UX0NPVkVSXzNfT1BFThDUDxIXChJGUk9OVF9DT1ZFUl80X09QRU4Q", - "1Q8SGgoVQ0FSVFJJREdFU19DT1ZFUl9PUEVOENYPEhQKD1JFQVJfQ09WRVJf", + "1Q8SGgoVQ0FSVFJJREdFU19DT1ZFUl9PUEVOENYPEhQKD0FSQ0hfQ09WRVJf", "T1BFThDXDxIlCiBNQUNISU5FX0lOVEVSTkFMX09WRVJURU1QRVJBVFVSRRDY", "DxIdChhNQUNISU5FX0ZBTlNfUlBNX1RPT19MT1cQ2Q8SGQoUTUFDSElORV9G", "QU5TX1NUT1BQRUQQ2g8SKAojRUxFQ1RSSUNBTF9DQUJJTkVUX0ZBTlNfUlBN", @@ -44,265 +44,271 @@ namespace Tango.PMR.Diagnostics { "X0lOSVRJQUxfQkxPV0VSX0ZBSUxFRBDfDxIQCgtVTlNQRUNJRklFRBDgDxIn", "CiJNQUNISU5FX0lOVEVSTkFMX09WRVJURU1QRVJBVFVSRV8yEOEPEicKIkVM", "RUNUUklDQUxfQ0FCSU5FVF9PVkVSVEVNUEVSQVRVUkUQ4g8SHAoXRlBHQV9X", - "QVRDSERPR19BQ1RJVkFURUQQ4w8SFQoQVU5JTlRFTkRFRF9SRVNFVBDkDxIR", - "CgxUSFJFQURfQlJFQUsQuBcSMQosVEhSRUFEX1RFTlNJT05fQ09OVFJPTF9G", - "QUlMVVJFX0ZFRURFUl9EQU5DRVIQuRcSHwoaV0lOREVSX0NPTkVfRE9FU19O", - "T1RfRVhJU1QQuhcSHQoYRkVFREVSX01PVE9SX09WRVJDVVJSRU5UELsXEiMK", - "HlJJR0hUX0xPQURFUl9NT1RPUl9PVkVSQ1VSUkVOVBC8FxIdChhQVUxMRVJf", - "TU9UT1JfT1ZFUkNVUlJFTlQQvRcSIgodTEVGVF9MT0FERVJfTU9UT1JfT1ZF", - "UkNVUlJFTlQQvhcSHQoYV0lOREVSX01PVE9SX09WRVJDVVJSRU5UEL8XEhwK", - "F1NDUkVXX01PVE9SX09WRVJDVVJSRU5UEMAXEiIKHUxPQURJTkdfQVJNX01P", - "VE9SX09WRVJDVVJSRU5UEMEXEiEKHEZFRURFUl9NT1RPUl9PVkVSVEVNUEVS", - "QVRVUkUQwhcSJwoiUklHSFRfTE9BREVSX01PVE9SX09WRVJURU1QRVJBVFVS", - "RRDDFxIhChxQVUxMRVJfTU9UT1JfT1ZFUlRFTVBFUkFUVVJFEMQXEiYKIUxF", - "RlRfTE9BREVSX01PVE9SX09WRVJURU1QRVJBVFVSRRDFFxIhChxXSU5ERVJf", - "TU9UT1JfT1ZFUlRFTVBFUkFUVVJFEMYXEiAKG1NDUkVXX01PVE9SX09WRVJU", - "RU1QRVJBVFVSRRDHFxImCiFMT0FESU5HX0FSTV9NT1RPUl9PVkVSVEVNUEVS", - "QVRVUkUQyBcSFwoSRkVFREVSX01PVE9SX1NUQUxMEMkXEh0KGFJJR0hUX0xP", - "QURFUl9NT1RPUl9TVEFMTBDKFxIXChJQVUxMRVJfTU9UT1JfU1RBTEwQyxcS", - "HAoXTEVGVF9MT0FERVJfTU9UT1JfU1RBTEwQzBcSFwoSV0lOREVSX01PVE9S", - "X1NUQUxMEM0XEhYKEVNDUkVXX01PVE9SX1NUQUxMEM4XEhwKF0xPQURJTkdf", - "QVJNX01PVE9SX1NUQUxMEM8XEh4KGUZFRURFUl9NT1RPUl9VTkRFUlZPTFRB", - "R0UQ0BcSJAofUklHSFRfTE9BREVSX01PVE9SX1VOREVSVk9MVEFHRRDRFxIe", - "ChlQVUxMRVJfTU9UT1JfVU5ERVJWT0xUQUdFENIXEiMKHkxFRlRfTE9BREVS", - "X01PVE9SX1VOREVSVk9MVEFHRRDTFxIeChlXSU5ERVJfTU9UT1JfVU5ERVJW", - "T0xUQUdFENQXEh0KGFNDUkVXX01PVE9SX1VOREVSVk9MVEFHRRDVFxIjCh5M", - "T0FESU5HX0FSTV9NT1RPUl9VTkRFUlZPTFRBR0UQ1hcSFAoPTFRGVV9VUF9U", - "SU1FT1VUENcXEhYKEUxURlVfRE9XTl9USU1FT1VUENgXEhQKD1JURlVfVVBf", - "VElNRU9VVBDZFxIWChFSVEZVX0RPV05fVElNRU9VVBDaFxIeChlTQ1JFV19N", - "T1RPUl9MSU1JVF9USU1FT1VUENsXEiQKH1dJTkRFUl9EQU5DRVJfTU9UT1Jf", - "T1ZFUkNVUlJFTlQQ3BcSJAofUFVMTEVSX0RBTkNFUl9NT1RPUl9PVkVSQ1VS", - "UkVOVBDdFxIkCh9GRUVERVJfREFOQ0VSX01PVE9SX09WRVJDVVJSRU5UEN4X", - "EigKI1dJTkRFUl9EQU5DRVJfTU9UT1JfT1ZFUlRFTVBFUkFUVVJFEN8XEigK", - "I1BVTExFUl9EQU5DRVJfTU9UT1JfT1ZFUlRFTVBFUkFUVVJFEOAXEigKI0ZF", - "RURFUl9EQU5DRVJfTU9UT1JfT1ZFUlRFTVBFUkFUVVJFEOEXEh4KGVdJTkRF", - "Ul9EQU5DRVJfTU9UT1JfU1RBTEwQ4hcSHgoZUFVMTEVSX0RBTkNFUl9NT1RP", - "Ul9TVEFMTBDjFxIeChlGRUVERVJfREFOQ0VSX01PVE9SX1NUQUxMEOQXEiUK", - "IFdJTkRFUl9EQU5DRVJfTU9UT1JfVU5ERVJWT0xUQUdFEOUXEiUKIFBVTExF", - "Ul9EQU5DRVJfTU9UT1JfVU5ERVJWT0xUQUdFEOYXEiUKIEZFRURFUl9EQU5D", - "RVJfTU9UT1JfVU5ERVJWT0xUQUdFEOcXEjEKLFRIUkVBRF9URU5TSU9OX0NP", - "TlRST0xfRkFJTFVSRV9QVUxMRVJfREFOQ0VSEOgXEjEKLFRIUkVBRF9URU5T", - "SU9OX0NPTlRST0xfRkFJTFVSRV9XSU5ERVJfREFOQ0VSEOkXEiUKIE1BQ0hJ", - "TkVfU1RBVEVfTk9fVEhSRUFEX0RFVEVDVEVEEOoXEhkKFFRIUkVBRF9MT0FE", - "SU5HX0VSUk9SEOsXEhwKF0RSWUVSX01PVE9SX09WRVJDVVJSRU5UEKAfEiAK", - "G0RSWUVSX01PVE9SX09WRVJURU1QRVJBVFVSRRChHxIWChFEUllFUl9NT1RP", - "Ul9TVEFMTBCiHxIdChhEUllFUl9NT1RPUl9VTkRFUlZPTFRBR0UQox8SFAoP", - "RFJZRVJfRE9PUl9PUEVOEKQfEiEKHERSWUVSX1pPTkVfMV9PVkVSVEVNUEVS", - "QVRVUkUQpR8SIQocRFJZRVJfWk9ORV8yX09WRVJURU1QRVJBVFVSRRCmHxIk", - "Ch9EUllFUl9aT05FXzFfVU5ERVJURU1QRVJBVFVSRV9BEKcfEiQKH0RSWUVS", - "X1pPTkVfMV9VTkRFUlRFTVBFUkFUVVJFX0IQqB8SJAofRFJZRVJfWk9ORV8y", - "X1VOREVSVEVNUEVSQVRVUkVfQhCpHxIZChREUllFUl9USEVSTUFMX0NVVE9G", - "RhCqHxIuCilEUllFUl9IRUFURVJTX1pPTkVfMV9DVVJSRU5UX09VVF9PRl9S", - "QU5HRRCrHxIuCilEUllFUl9IRUFURVJTX1pPTkVfMl9DVVJSRU5UX09VVF9P", - "Rl9SQU5HRRCsHxIsCidEUllFUl9IRUFURVJTX1pPTkVfMV9DVVJSRU5UX0xP", - "T1BfQlJFQUsQrR8SLAonRFJZRVJfSEVBVEVSU19aT05FXzJfQ1VSUkVOVF9M", - "T09QX0JSRUFLEK4fEhoKFURSWUVSX0ZBTl9SUE1fVE9PX0xPVxCvHxIWChFE", - "UllFUl9GQU5fU1RPUFBFRBCwHxIgChtEUllFUl9MSURfTU9UT1JfT1ZFUkNV", - "UlJFTlQQsR8SJAofRFJZRVJfTElEX01PVE9SX09WRVJURU1QRVJBVFVSRRCy", - "HxIaChVEUllFUl9MSURfTU9UT1JfU1RBTEwQsx8SIQocRFJZRVJfTElEX01P", - "VE9SX1VOREVSVk9MVEFHRRC0HxIkCh9EUllFUl9aT05FXzJfVU5ERVJURU1Q", - "RVJBVFVSRV9BELUfEicKIkRZRUlOR19IRUFEX1pPTkVfMV9PVkVSVEVNUEVS", - "QVRVUkUQiCcSJwoiRFlFSU5HX0hFQURfWk9ORV8yX09WRVJURU1QRVJBVFVS", - "RRCJJxInCiJEWUVJTkdfSEVBRF9aT05FXzNfT1ZFUlRFTVBFUkFUVVJFEIon", - "EicKIkRZRUlOR19IRUFEX1pPTkVfNF9PVkVSVEVNUEVSQVRVUkUQiycSJwoi", - "RFlFSU5HX0hFQURfWk9ORV81X09WRVJURU1QRVJBVFVSRRCMJxInCiJEWUVJ", - "TkdfSEVBRF9aT05FXzZfT1ZFUlRFTVBFUkFUVVJFEI0nEioKJURZRUlOR19I", - "RUFEX1pPTkVfMV9VTkRFUlRFTVBFUkFUVVJFX0EQjicSKgolRFlFSU5HX0hF", - "QURfWk9ORV8yX1VOREVSVEVNUEVSQVRVUkVfQRCPJxIqCiVEWUVJTkdfSEVB", - "RF9aT05FXzNfVU5ERVJURU1QRVJBVFVSRV9BEJAnEioKJURZRUlOR19IRUFE", - "X1pPTkVfNF9VTkRFUlRFTVBFUkFUVVJFX0EQkScSKgolRFlFSU5HX0hFQURf", - "Wk9ORV81X1VOREVSVEVNUEVSQVRVUkVfQRCSJxIqCiVEWUVJTkdfSEVBRF9a", - "T05FXzZfVU5ERVJURU1QRVJBVFVSRV9BEJMnEioKJURZRUlOR19IRUFEX1pP", - "TkVfMV9VTkRFUlRFTVBFUkFUVVJFX0IQlCcSKgolRFlFSU5HX0hFQURfWk9O", - "RV8yX1VOREVSVEVNUEVSQVRVUkVfQhCVJxIqCiVEWUVJTkdfSEVBRF9aT05F", - "XzNfVU5ERVJURU1QRVJBVFVSRV9CEJYnEioKJURZRUlOR19IRUFEX1pPTkVf", - "NF9VTkRFUlRFTVBFUkFUVVJFX0IQlycSKgolRFlFSU5HX0hFQURfWk9ORV81", - "X1VOREVSVEVNUEVSQVRVUkVfQhCYJxIqCiVEWUVJTkdfSEVBRF9aT05FXzZf", - "VU5ERVJURU1QRVJBVFVSRV9CEJknEiwKJ0RZRUlOR19IRUFEX1pPTkVfMV9D", - "VVJSRU5UX09VVF9PRl9SQU5HRRCaJxIsCidEWUVJTkdfSEVBRF9aT05FXzJf", - "Q1VSUkVOVF9PVVRfT0ZfUkFOR0UQmycSLAonRFlFSU5HX0hFQURfWk9ORV8z", - "X0NVUlJFTlRfT1VUX09GX1JBTkdFEJwnEiwKJ0RZRUlOR19IRUFEX1pPTkVf", - "NF9DVVJSRU5UX09VVF9PRl9SQU5HRRCdJxIsCidEWUVJTkdfSEVBRF9aT05F", - "XzVfQ1VSUkVOVF9PVVRfT0ZfUkFOR0UQnicSKgolRFlFSU5HX0hFQURfWk9O", - "RV8xX0NVUlJFTlRfTE9PUF9CUkVBSxCfJxIqCiVEWUVJTkdfSEVBRF9aT05F", - "XzJfQ1VSUkVOVF9MT09QX0JSRUFLEKAnEioKJURZRUlOR19IRUFEX1pPTkVf", - "M19DVVJSRU5UX0xPT1BfQlJFQUsQoScSKgolRFlFSU5HX0hFQURfWk9ORV80", - "X0NVUlJFTlRfTE9PUF9CUkVBSxCiJxIqCiVEWUVJTkdfSEVBRF9aT05FXzVf", - "Q1VSUkVOVF9MT09QX0JSRUFLEKMnEh8KGkRZRUlOR19IRUFEX1RIRVJNQUxf", - "Q1VUT0ZGEKQnEiMKHkRZRUlOR19IRUFEX0NPVkVSX09QRU5fVElNRU9VVBCl", - "JxIkCh9EWUVJTkdfSEVBRF9DT1ZFUl9DTE9TRV9USU1FT1VUEKYnEigKI0RZ", - "RUlOR19IRUFEX0NPVkVSX01PVE9SX09WRVJDVVJSRU5UEKcnEiwKJ0RZRUlO", - "R19IRUFEX0NPVkVSX01PVE9SX09WRVJURU1QRVJBVFVSRRCoJxIiCh1EWUVJ", - "TkdfSEVBRF9DT1ZFUl9NT1RPUl9TVEFMTBCpJxIpCiREWUVJTkdfSEVBRF9D", - "T1ZFUl9NT1RPUl9VTkRFUlZPTFRBR0UQqicSNQowRFlFSU5HX0hFQURfQ0xF", - "QU5JTkdfTUVDSEFOSVNNX01PVE9SX09WRVJDVVJSRU5UEKsnEjkKNERZRUlO", - "R19IRUFEX0NMRUFOSU5HX01FQ0hBTklTTV9NT1RPUl9PVkVSVEVNUEVSQVRV", - "UkUQrCcSLwoqRFlFSU5HX0hFQURfQ0xFQU5JTkdfTUVDSEFOSVNNX01PVE9S", - "X1NUQUxMEK0nEjYKMURZRUlOR19IRUFEX0NMRUFOSU5HX01FQ0hBTklTTV9N", - "T1RPUl9VTkRFUlZPTFRBR0UQricSMAorRFlFSU5HX0hFQURfQ0xFQU5JTkdf", - "SEVBRF9NT1RPUl9PVkVSQ1VSUkVOVBCvJxI0Ci9EWUVJTkdfSEVBRF9DTEVB", - "TklOR19IRUFEX01PVE9SX09WRVJURU1QRVJBVFVSRRCwJxIqCiVEWUVJTkdf", - "SEVBRF9DTEVBTklOR19IRUFEX01PVE9SX1NUQUxMELEnEjEKLERZRUlOR19I", - "RUFEX0NMRUFOSU5HX0hFQURfTU9UT1JfVU5ERVJWT0xUQUdFELInEicKIkRZ", - "RUlOR19IRUFEX1pPTkVfN19PVkVSVEVNUEVSQVRVUkUQsycSJwoiRFlFSU5H", - "X0hFQURfWk9ORV84X09WRVJURU1QRVJBVFVSRRC0JxInCiJEWUVJTkdfSEVB", - "RF9aT05FXzlfT1ZFUlRFTVBFUkFUVVJFELUnEigKI0RZRUlOR19IRUFEX1pP", - "TkVfMTBfT1ZFUlRFTVBFUkFUVVJFELYnEigKI0RZRUlOR19IRUFEX1pPTkVf", - "MTFfT1ZFUlRFTVBFUkFUVVJFELcnEigKI0RZRUlOR19IRUFEX1pPTkVfMTJf", - "T1ZFUlRFTVBFUkFUVVJFELgnEioKJURZRUlOR19IRUFEX1pPTkVfN19VTkRF", - "UlRFTVBFUkFUVVJFX0EQuScSKgolRFlFSU5HX0hFQURfWk9ORV84X1VOREVS", - "VEVNUEVSQVRVUkVfQRC6JxIqCiVEWUVJTkdfSEVBRF9aT05FXzlfVU5ERVJU", - "RU1QRVJBVFVSRV9BELsnEisKJkRZRUlOR19IRUFEX1pPTkVfMTBfVU5ERVJU", - "RU1QRVJBVFVSRV9BELwnEisKJkRZRUlOR19IRUFEX1pPTkVfMTFfVU5ERVJU", - "RU1QRVJBVFVSRV9BEL0nEisKJkRZRUlOR19IRUFEX1pPTkVfMTJfVU5ERVJU", - "RU1QRVJBVFVSRV9BEL4nEioKJURZRUlOR19IRUFEX1pPTkVfN19VTkRFUlRF", - "TVBFUkFUVVJFX0IQvycSKgolRFlFSU5HX0hFQURfWk9ORV84X1VOREVSVEVN", - "UEVSQVRVUkVfQhDAJxIqCiVEWUVJTkdfSEVBRF9aT05FXzlfVU5ERVJURU1Q", - "RVJBVFVSRV9CEMEnEisKJkRZRUlOR19IRUFEX1pPTkVfMTBfVU5ERVJURU1Q", - "RVJBVFVSRV9CEMInEisKJkRZRUlOR19IRUFEX1pPTkVfMTFfVU5ERVJURU1Q", - "RVJBVFVSRV9CEMMnEisKJkRZRUlOR19IRUFEX1pPTkVfMTJfVU5ERVJURU1Q", - "RVJBVFVSRV9CEMQnEiwKJ0RZRUlOR19IRUFEX1pPTkVfNl9DVVJSRU5UX09V", - "VF9PRl9SQU5HRRDFJxIsCidEWUVJTkdfSEVBRF9aT05FXzdfQ1VSUkVOVF9P", - "VVRfT0ZfUkFOR0UQxicSLAonRFlFSU5HX0hFQURfWk9ORV84X0NVUlJFTlRf", - "T1VUX09GX1JBTkdFEMcnEiwKJ0RZRUlOR19IRUFEX1pPTkVfOV9DVVJSRU5U", - "X09VVF9PRl9SQU5HRRDIJxItCihEWUVJTkdfSEVBRF9aT05FXzEwX0NVUlJF", - "TlRfT1VUX09GX1JBTkdFEMknEi0KKERZRUlOR19IRUFEX1pPTkVfMTFfQ1VS", - "UkVOVF9PVVRfT0ZfUkFOR0UQyicSLQooRFlFSU5HX0hFQURfWk9ORV8xMl9D", - "VVJSRU5UX09VVF9PRl9SQU5HRRDLJxIqCiVEWUVJTkdfSEVBRF9aT05FXzZf", - "Q1VSUkVOVF9MT09QX0JSRUFLEMwnEioKJURZRUlOR19IRUFEX1pPTkVfN19D", - "VVJSRU5UX0xPT1BfQlJFQUsQzScSKgolRFlFSU5HX0hFQURfWk9ORV84X0NV", - "UlJFTlRfTE9PUF9CUkVBSxDOJxIqCiVEWUVJTkdfSEVBRF9aT05FXzlfQ1VS", - "UkVOVF9MT09QX0JSRUFLEM8nEisKJkRZRUlOR19IRUFEX1pPTkVfMTBfQ1VS", - "UkVOVF9MT09QX0JSRUFLENAnEisKJkRZRUlOR19IRUFEX1pPTkVfMTFfQ1VS", - "UkVOVF9MT09QX0JSRUFLENEnEisKJkRZRUlOR19IRUFEX1pPTkVfMTJfQ1VS", - "UkVOVF9MT09QX0JSRUFLENInEikKJERZRUlOR19IRUFEX0JMT1dFUl8xX09W", - "RVJURU1QRVJBVFVSRRDTJxIpCiREWUVJTkdfSEVBRF9CTE9XRVJfMl9PVkVS", - "VEVNUEVSQVRVUkUQ1CcSLAonRFlFSU5HX0hFQURfQkxPV0VSXzFfVU5ERVJU", - "RU1QRVJBVFVSRV9BENUnEiwKJ0RZRUlOR19IRUFEX0JMT1dFUl8yX1VOREVS", - "VEVNUEVSQVRVUkVfQRDWJxIsCidEWUVJTkdfSEVBRF9CTE9XRVJfMV9VTkRF", - "UlRFTVBFUkFUVVJFX0IQ1ycSLAonRFlFSU5HX0hFQURfQkxPV0VSXzJfVU5E", - "RVJURU1QRVJBVFVSRV9CENgnEi4KKURZRUlOR19IRUFEX0JMT1dFUl8xX0NV", - "UlJFTlRfT1VUX09GX1JBTkdFENknEi4KKURZRUlOR19IRUFEX0JMT1dFUl8y", - "X0NVUlJFTlRfT1VUX09GX1JBTkdFENonEiwKJ0RZRUlOR19IRUFEX0JMT1dF", - "Ul8xX0NVUlJFTlRfTE9PUF9CUkVBSxDbJxIsCidEWUVJTkdfSEVBRF9CTE9X", - "RVJfMl9DVVJSRU5UX0xPT1BfQlJFQUsQ3CcSJQogRFlFSU5HX0hFQURfQkxP", - "V0VSXzFfRkFOX1NUT1BQRUQQ3ScSJQogRFlFSU5HX0hFQURfQkxPV0VSXzJf", - "RkFOX1NUT1BQRUQQ3icSKQokRFlFSU5HX0hFQURfQkxPV0VSXzFfRkFOX1JQ", - "TV9UT09fTE9XEN8nEikKJERZRUlOR19IRUFEX0JMT1dFUl8yX0ZBTl9SUE1f", - "VE9PX0xPVxDgJxIqCiVEWUVJTkdfSEVBRF9SSUdIVF9BQ1RVQVRPUl9VUF9U", - "SU1FT1VUEOEnEikKJERZRUlOR19IRUFEX0xFRlRfQUNUVUFUT1JfVVBfVElN", - "RU9VVBDiJxIsCidEWUVJTkdfSEVBRF9SSUdIVF9BQ1RVQVRPUl9ET1dOX1RJ", - "TUVPVVQQ4ycSKwomRFlFSU5HX0hFQURfTEVGVF9BQ1RVQVRPUl9ET1dOX1RJ", - "TUVPVVQQ5CcSGgoVTUlYRVJfT1ZFUlRFTVBFUkFUVVJFEPAuEh0KGE1JWEVS", - "X1VOREVSVEVNUEVSQVRVUkVfQRDxLhIdChhNSVhFUl9VTkRFUlRFTVBFUkFU", - "VVJFX0IQ8i4SGQoUTUlYRVJfVEhFUk1BTF9DVVRPRkYQ8y4SHwoaTUlYRVJf", - "Q1VSUkVOVF9PVVRfT0ZfUkFOR0UQ9C4SHQoYTUlYRVJfQ1VSUkVOVF9MT09Q", - "X0JSRUFLEPUuEh0KGERJU1BFTlNFUl8xX09WRVJQUkVTU1VSRRDYNhIdChhE", - "SVNQRU5TRVJfMl9PVkVSUFJFU1NVUkUQ2TYSHQoYRElTUEVOU0VSXzNfT1ZF", - "UlBSRVNTVVJFENo2Eh0KGERJU1BFTlNFUl80X09WRVJQUkVTU1VSRRDbNhId", - "ChhESVNQRU5TRVJfNV9PVkVSUFJFU1NVUkUQ3DYSHQoYRElTUEVOU0VSXzZf", - "T1ZFUlBSRVNTVVJFEN02Eh0KGERJU1BFTlNFUl83X09WRVJQUkVTU1VSRRDe", - "NhIdChhESVNQRU5TRVJfOF9PVkVSUFJFU1NVUkUQ3zYSHgoZRElTUEVOU0VS", - "XzFfVU5ERVJQUkVTU1VSRRDgNhIeChlESVNQRU5TRVJfMl9VTkRFUlBSRVNT", - "VVJFEOE2Eh4KGURJU1BFTlNFUl8zX1VOREVSUFJFU1NVUkUQ4jYSHgoZRElT", - "UEVOU0VSXzRfVU5ERVJQUkVTU1VSRRDjNhIeChlESVNQRU5TRVJfNV9VTkRF", - "UlBSRVNTVVJFEOQ2Eh4KGURJU1BFTlNFUl82X1VOREVSUFJFU1NVUkUQ5TYS", - "HgoZRElTUEVOU0VSXzdfVU5ERVJQUkVTU1VSRRDmNhIeChlESVNQRU5TRVJf", - "OF9VTkRFUlBSRVNTVVJFEOc2EhYKEURJU1BFTlNFUl8xX0VNUFRZEOg2EhYK", - "EURJU1BFTlNFUl8yX0VNUFRZEOk2EhYKEURJU1BFTlNFUl8zX0VNUFRZEOo2", - "EhYKEURJU1BFTlNFUl80X0VNUFRZEOs2EhYKEURJU1BFTlNFUl81X0VNUFRZ", - "EOw2EhYKEURJU1BFTlNFUl82X0VNUFRZEO02EhYKEURJU1BFTlNFUl83X0VN", - "UFRZEO42EhYKEURJU1BFTlNFUl84X0VNUFRZEO82Eh8KGkRJU1BFTlNFUl8x", - "X1JFRklMTF9GQUlMVVJFEPA2Eh8KGkRJU1BFTlNFUl8yX1JFRklMTF9GQUlM", - "VVJFEPE2Eh8KGkRJU1BFTlNFUl8zX1JFRklMTF9GQUlMVVJFEPI2Eh8KGkRJ", - "U1BFTlNFUl80X1JFRklMTF9GQUlMVVJFEPM2Eh8KGkRJU1BFTlNFUl81X1JF", - "RklMTF9GQUlMVVJFEPQ2Eh8KGkRJU1BFTlNFUl82X1JFRklMTF9GQUlMVVJF", - "EPU2Eh8KGkRJU1BFTlNFUl83X1JFRklMTF9GQUlMVVJFEPY2Eh8KGkRJU1BF", - "TlNFUl84X1JFRklMTF9GQUlMVVJFEPc2EiIKHURJU1BFTlNFUl8xX01PVE9S", - "X09WRVJDVVJSRU5UEPg2EiIKHURJU1BFTlNFUl8yX01PVE9SX09WRVJDVVJS", - "RU5UEPk2EiIKHURJU1BFTlNFUl8zX01PVE9SX09WRVJDVVJSRU5UEPo2EiIK", - "HURJU1BFTlNFUl80X01PVE9SX09WRVJDVVJSRU5UEPs2EiIKHURJU1BFTlNF", - "Ul81X01PVE9SX09WRVJDVVJSRU5UEPw2EiIKHURJU1BFTlNFUl82X01PVE9S", - "X09WRVJDVVJSRU5UEP02EiIKHURJU1BFTlNFUl83X01PVE9SX09WRVJDVVJS", - "RU5UEP42EiIKHURJU1BFTlNFUl84X01PVE9SX09WRVJDVVJSRU5UEP82EiYK", - "IURJU1BFTlNFUl8xX01PVE9SX09WRVJURU1QRVJBVFVSRRCANxImCiFESVNQ", - "RU5TRVJfMl9NT1RPUl9PVkVSVEVNUEVSQVRVUkUQgTcSJgohRElTUEVOU0VS", - "XzNfTU9UT1JfT1ZFUlRFTVBFUkFUVVJFEII3EiYKIURJU1BFTlNFUl80X01P", - "VE9SX09WRVJURU1QRVJBVFVSRRCDNxImCiFESVNQRU5TRVJfNV9NT1RPUl9P", - "VkVSVEVNUEVSQVRVUkUQhDcSJgohRElTUEVOU0VSXzZfTU9UT1JfT1ZFUlRF", - "TVBFUkFUVVJFEIU3EiYKIURJU1BFTlNFUl83X01PVE9SX09WRVJURU1QRVJB", - "VFVSRRCGNxImCiFESVNQRU5TRVJfOF9NT1RPUl9PVkVSVEVNUEVSQVRVUkUQ", - "hzcSHAoXRElTUEVOU0VSXzFfTU9UT1JfU1RBTEwQiDcSHAoXRElTUEVOU0VS", - "XzJfTU9UT1JfU1RBTEwQiTcSHAoXRElTUEVOU0VSXzNfTU9UT1JfU1RBTEwQ", - "ijcSHAoXRElTUEVOU0VSXzRfTU9UT1JfU1RBTEwQizcSHAoXRElTUEVOU0VS", - "XzVfTU9UT1JfU1RBTEwQjDcSHAoXRElTUEVOU0VSXzZfTU9UT1JfU1RBTEwQ", - "jTcSHAoXRElTUEVOU0VSXzdfTU9UT1JfU1RBTEwQjjcSHAoXRElTUEVOU0VS", - "XzhfTU9UT1JfU1RBTEwQjzcSIwoeRElTUEVOU0VSXzFfTU9UT1JfVU5ERVJW", - "T0xUQUdFEJA3EiMKHkRJU1BFTlNFUl8yX01PVE9SX1VOREVSVk9MVEFHRRCR", - "NxIjCh5ESVNQRU5TRVJfM19NT1RPUl9VTkRFUlZPTFRBR0UQkjcSIwoeRElT", - "UEVOU0VSXzRfTU9UT1JfVU5ERVJWT0xUQUdFEJM3EiMKHkRJU1BFTlNFUl81", - "X01PVE9SX1VOREVSVk9MVEFHRRCUNxIjCh5ESVNQRU5TRVJfNl9NT1RPUl9V", - "TkRFUlZPTFRBR0UQlTcSIwoeRElTUEVOU0VSXzdfTU9UT1JfVU5ERVJWT0xU", - "QUdFEJY3EiMKHkRJU1BFTlNFUl84X01PVE9SX1VOREVSVk9MVEFHRRCXNxIh", - "ChxESVNQRU5TRVJfMV9VUFBFUl9IQVJEX0xJTUlUEJg3EiEKHERJU1BFTlNF", - "Ul8yX1VQUEVSX0hBUkRfTElNSVQQmTcSIQocRElTUEVOU0VSXzNfVVBQRVJf", - "SEFSRF9MSU1JVBCaNxIhChxESVNQRU5TRVJfNF9VUFBFUl9IQVJEX0xJTUlU", - "EJs3EiEKHERJU1BFTlNFUl81X1VQUEVSX0hBUkRfTElNSVQQnDcSIQocRElT", - "UEVOU0VSXzZfVVBQRVJfSEFSRF9MSU1JVBCdNxIhChxESVNQRU5TRVJfN19V", - "UFBFUl9IQVJEX0xJTUlUEJ43EiEKHERJU1BFTlNFUl84X1VQUEVSX0hBUkRf", - "TElNSVQQnzcSIQocRElTUEVOU0VSXzFfTE9XRVJfSEFSRF9MSU1JVBCgNxIh", - "ChxESVNQRU5TRVJfMl9MT1dFUl9IQVJEX0xJTUlUEKE3EiEKHERJU1BFTlNF", - "Ul8zX0xPV0VSX0hBUkRfTElNSVQQojcSIQocRElTUEVOU0VSXzRfTE9XRVJf", - "SEFSRF9MSU1JVBCjNxIhChxESVNQRU5TRVJfNV9MT1dFUl9IQVJEX0xJTUlU", - "EKQ3EiEKHERJU1BFTlNFUl82X0xPV0VSX0hBUkRfTElNSVQQpTcSIQocRElT", - "UEVOU0VSXzdfTE9XRVJfSEFSRF9MSU1JVBCmNxIhChxESVNQRU5TRVJfOF9M", - "T1dFUl9IQVJEX0xJTUlUEKc3Eh4KGURJU1BFTlNFUl8xX0hJR0hfUFJFU1NV", - "UkUQqDcSHgoZRElTUEVOU0VSXzJfSElHSF9QUkVTU1VSRRCpNxIeChlESVNQ", - "RU5TRVJfM19ISUdIX1BSRVNTVVJFEKo3Eh4KGURJU1BFTlNFUl80X0hJR0hf", - "UFJFU1NVUkUQqzcSHgoZRElTUEVOU0VSXzVfSElHSF9QUkVTU1VSRRCsNxIe", - "ChlESVNQRU5TRVJfNl9ISUdIX1BSRVNTVVJFEK03Eh4KGURJU1BFTlNFUl83", - "X0hJR0hfUFJFU1NVUkUQrjcSHgoZRElTUEVOU0VSXzhfSElHSF9QUkVTU1VS", - "RRCvNxIZChRNSURfVEFOS18xX0xPV19MRVZFTBDAPhIZChRNSURfVEFOS18y", - "X0xPV19MRVZFTBDBPhIZChRNSURfVEFOS18zX0xPV19MRVZFTBDCPhIZChRN", - "SURfVEFOS180X0xPV19MRVZFTBDDPhIZChRNSURfVEFOS181X0xPV19MRVZF", - "TBDEPhIZChRNSURfVEFOS182X0xPV19MRVZFTBDFPhIZChRNSURfVEFOS183", - "X0xPV19MRVZFTBDGPhIZChRNSURfVEFOS184X0xPV19MRVZFTBDHPhIVChBN", - "SURfVEFOS18xX0VNUFRZEMg+EhUKEE1JRF9UQU5LXzJfRU1QVFkQyT4SFQoQ", - "TUlEX1RBTktfM19FTVBUWRDKPhIVChBNSURfVEFOS180X0VNUFRZEMs+EhUK", - "EE1JRF9UQU5LXzVfRU1QVFkQzD4SFQoQTUlEX1RBTktfNl9FTVBUWRDNPhIV", - "ChBNSURfVEFOS183X0VNUFRZEM4+EhUKEE1JRF9UQU5LXzhfRU1QVFkQzz4S", - "GAoTTUlEX1RBTktfMV9PVkVSRkxPVxDQPhIYChNNSURfVEFOS18yX09WRVJG", - "TE9XENE+EhgKE01JRF9UQU5LXzNfT1ZFUkZMT1cQ0j4SGAoTTUlEX1RBTktf", - "NF9PVkVSRkxPVxDTPhIYChNNSURfVEFOS181X09WRVJGTE9XENQ+EhgKE01J", - "RF9UQU5LXzZfT1ZFUkZMT1cQ1T4SGAoTTUlEX1RBTktfN19PVkVSRkxPVxDW", - "PhIYChNNSURfVEFOS184X09WRVJGTE9XENc+EhwKF01JRF9UQU5LXzFfRklM", - "TF9USU1FT1VUENg+EhwKF01JRF9UQU5LXzJfRklMTF9USU1FT1VUENk+EhwK", - "F01JRF9UQU5LXzNfRklMTF9USU1FT1VUENo+EhwKF01JRF9UQU5LXzRfRklM", - "TF9USU1FT1VUENs+EhwKF01JRF9UQU5LXzVfRklMTF9USU1FT1VUENw+EhwK", - "F01JRF9UQU5LXzZfRklMTF9USU1FT1VUEN0+EhwKF01JRF9UQU5LXzdfRklM", - "TF9USU1FT1VUEN4+EhwKF01JRF9UQU5LXzhfRklMTF9USU1FT1VUEN8+Eh0K", - "GEFJUl9GSUxURVJfTk9UX0lOU1RBTExFRBCoRhIXChJBSVJfRklMVEVSX0NM", - "T0dHRUQQqUYSJQogV0FTVEVfQ09OVEFJTkVSX0VNUFRZSU5HX1RJTUVPVVQQ", - "qkYSFAoPTk9fQUlSX1BSRVNTVVJFEKtGEh0KGFdBU1RFX0NPTlRBSU5FUl9P", - "VkVSRkxPVxCsRhIaChVWT0NfU0VOU09SX0FMQVJNX1RJTUUQrUYSGAoTQ0hJ", - "TExFUl9EUllfQ09OVEFDVBCuRhIaChVJTlNVRkZJQ0lFTlRfQUlSX0ZMT1cQ", - "r0YSGwoWVk9DX1NFTlNPUl9BTEFSTV9TTE9QRRCwRhIdChhQUkVfQ09PTEVS", - "X0ZBTl8xX1NUT1BQRUQQsUYSHQoYUFJFX0NPT0xFUl9GQU5fMl9TVE9QUEVE", - "ELJGEhkKFENPT0xFUl9GQU5fMV9TVE9QUEVEELNGEhkKFENPT0xFUl9GQU5f", - "Ml9TVE9QUEVEELRGEhkKFENPT0xFUl9GQU5fM19TVE9QUEVEELVGEhkKFENP", - "T0xFUl9GQU5fNF9TVE9QUEVEELZGEiEKHFBSRV9DT09MRVJfRkFOXzFfUlBN", - "X1RPT19MT1cQt0YSIQocUFJFX0NPT0xFUl9GQU5fMl9SUE1fVE9PX0xPVxC4", - "RhIdChhDT09MRVJfRkFOXzFfUlBNX1RPT19MT1cQuUYSHQoYQ09PTEVSX0ZB", - "Tl8yX1JQTV9UT09fTE9XELpGEh0KGENPT0xFUl9GQU5fM19SUE1fVE9PX0xP", - "VxC7RhIdChhDT09MRVJfRkFOXzRfUlBNX1RPT19MT1cQvEYSIAobQ09PTEVS", - "X1RFTVBFUkFUVVJFX1RPT19ISUdIEL1GEh8KGkNPT0xFUl9URU1QRVJBVFVS", - "RV9UT09fTE9XEL5GEioKJUlOS19DQVJUUklER0VfUFJFU0VOQ0VfU0VOU09S", - "X1RJTUVPVVQQkE4SHwoaSU5LX0NBUlRSSURHRV9SRklEX1RJTUVPVVQQkU4S", - "IQocTk9fV0FTVEVfQ0FSVFJJREdFX0FWQUlMQUJMRRCSThIeChlBTExfV0FT", - "VEVfQ0FSVFJJREdFU19GVUxMEJNOEiwKJ1dBU1RFX0NBUlRSSURHRV9QUkVT", - "RU5DRV9TRU5TT1JfVElNRU9VVBCUThIhChxXQVNURV9DQVJUUklER0VfUkZJ", - "RF9USU1FT1VUEJVOQiEKH2NvbS50d2luZS50YW5nby5wbXIuZGlhZ25vc3Rp", - "Y3NiBnByb3RvMw==")); + "QVRDSERPR19BQ1RJVkFURUQQ4w8SFQoQVU5JTlRFTkRFRF9SRVNFVBDkDxIi", + "Ch1URU1QRVJBVFVSRV9NRUFTVVJFTUVOVF9FUlJPUhDlDxIRCgxUSFJFQURf", + "QlJFQUsQuBcSMQosVEhSRUFEX1RFTlNJT05fQ09OVFJPTF9GQUlMVVJFX0ZF", + "RURFUl9EQU5DRVIQuRcSHwoaV0lOREVSX0NPTkVfRE9FU19OT1RfRVhJU1QQ", + "uhcSHQoYRkVFREVSX01PVE9SX09WRVJDVVJSRU5UELsXEiMKHlJJR0hUX0xP", + "QURFUl9NT1RPUl9PVkVSQ1VSUkVOVBC8FxIdChhQVUxMRVJfTU9UT1JfT1ZF", + "UkNVUlJFTlQQvRcSIgodTEVGVF9MT0FERVJfTU9UT1JfT1ZFUkNVUlJFTlQQ", + "vhcSHQoYV0lOREVSX01PVE9SX09WRVJDVVJSRU5UEL8XEhwKF1NDUkVXX01P", + "VE9SX09WRVJDVVJSRU5UEMAXEiIKHUxPQURJTkdfQVJNX01PVE9SX09WRVJD", + "VVJSRU5UEMEXEiEKHEZFRURFUl9NT1RPUl9PVkVSVEVNUEVSQVRVUkUQwhcS", + "JwoiUklHSFRfTE9BREVSX01PVE9SX09WRVJURU1QRVJBVFVSRRDDFxIhChxQ", + "VUxMRVJfTU9UT1JfT1ZFUlRFTVBFUkFUVVJFEMQXEiYKIUxFRlRfTE9BREVS", + "X01PVE9SX09WRVJURU1QRVJBVFVSRRDFFxIhChxXSU5ERVJfTU9UT1JfT1ZF", + "UlRFTVBFUkFUVVJFEMYXEiAKG1NDUkVXX01PVE9SX09WRVJURU1QRVJBVFVS", + "RRDHFxImCiFMT0FESU5HX0FSTV9NT1RPUl9PVkVSVEVNUEVSQVRVUkUQyBcS", + "FwoSRkVFREVSX01PVE9SX1NUQUxMEMkXEh0KGFJJR0hUX0xPQURFUl9NT1RP", + "Ul9TVEFMTBDKFxIXChJQVUxMRVJfTU9UT1JfU1RBTEwQyxcSHAoXTEVGVF9M", + "T0FERVJfTU9UT1JfU1RBTEwQzBcSFwoSV0lOREVSX01PVE9SX1NUQUxMEM0X", + "EhYKEVNDUkVXX01PVE9SX1NUQUxMEM4XEhwKF0xPQURJTkdfQVJNX01PVE9S", + "X1NUQUxMEM8XEh4KGUZFRURFUl9NT1RPUl9VTkRFUlZPTFRBR0UQ0BcSJAof", + "UklHSFRfTE9BREVSX01PVE9SX1VOREVSVk9MVEFHRRDRFxIeChlQVUxMRVJf", + "TU9UT1JfVU5ERVJWT0xUQUdFENIXEiMKHkxFRlRfTE9BREVSX01PVE9SX1VO", + "REVSVk9MVEFHRRDTFxIeChlXSU5ERVJfTU9UT1JfVU5ERVJWT0xUQUdFENQX", + "Eh0KGFNDUkVXX01PVE9SX1VOREVSVk9MVEFHRRDVFxIjCh5MT0FESU5HX0FS", + "TV9NT1RPUl9VTkRFUlZPTFRBR0UQ1hcSFAoPTFRGVV9VUF9USU1FT1VUENcX", + "EhYKEUxURlVfRE9XTl9USU1FT1VUENgXEhQKD1JURlVfVVBfVElNRU9VVBDZ", + "FxIWChFSVEZVX0RPV05fVElNRU9VVBDaFxIeChlTQ1JFV19NT1RPUl9MSU1J", + "VF9USU1FT1VUENsXEiQKH1dJTkRFUl9EQU5DRVJfTU9UT1JfT1ZFUkNVUlJF", + "TlQQ3BcSJAofUFVMTEVSX0RBTkNFUl9NT1RPUl9PVkVSQ1VSUkVOVBDdFxIk", + "Ch9GRUVERVJfREFOQ0VSX01PVE9SX09WRVJDVVJSRU5UEN4XEigKI1dJTkRF", + "Ul9EQU5DRVJfTU9UT1JfT1ZFUlRFTVBFUkFUVVJFEN8XEigKI1BVTExFUl9E", + "QU5DRVJfTU9UT1JfT1ZFUlRFTVBFUkFUVVJFEOAXEigKI0ZFRURFUl9EQU5D", + "RVJfTU9UT1JfT1ZFUlRFTVBFUkFUVVJFEOEXEh4KGVdJTkRFUl9EQU5DRVJf", + "TU9UT1JfU1RBTEwQ4hcSHgoZUFVMTEVSX0RBTkNFUl9NT1RPUl9TVEFMTBDj", + "FxIeChlGRUVERVJfREFOQ0VSX01PVE9SX1NUQUxMEOQXEiUKIFdJTkRFUl9E", + "QU5DRVJfTU9UT1JfVU5ERVJWT0xUQUdFEOUXEiUKIFBVTExFUl9EQU5DRVJf", + "TU9UT1JfVU5ERVJWT0xUQUdFEOYXEiUKIEZFRURFUl9EQU5DRVJfTU9UT1Jf", + "VU5ERVJWT0xUQUdFEOcXEjEKLFRIUkVBRF9URU5TSU9OX0NPTlRST0xfRkFJ", + "TFVSRV9QVUxMRVJfREFOQ0VSEOgXEjEKLFRIUkVBRF9URU5TSU9OX0NPTlRS", + "T0xfRkFJTFVSRV9XSU5ERVJfREFOQ0VSEOkXEiUKIE1BQ0hJTkVfU1RBVEVf", + "Tk9fVEhSRUFEX0RFVEVDVEVEEOoXEhkKFFRIUkVBRF9MT0FESU5HX0VSUk9S", + "EOsXEhwKF0RSWUVSX01PVE9SX09WRVJDVVJSRU5UEKAfEiAKG0RSWUVSX01P", + "VE9SX09WRVJURU1QRVJBVFVSRRChHxIWChFEUllFUl9NT1RPUl9TVEFMTBCi", + "HxIdChhEUllFUl9NT1RPUl9VTkRFUlZPTFRBR0UQox8SFAoPRFJZRVJfRE9P", + "Ul9PUEVOEKQfEiEKHERSWUVSX1pPTkVfMV9PVkVSVEVNUEVSQVRVUkUQpR8S", + "IQocRFJZRVJfWk9ORV8yX09WRVJURU1QRVJBVFVSRRCmHxIkCh9EUllFUl9a", + "T05FXzFfVU5ERVJURU1QRVJBVFVSRV9BEKcfEiQKH0RSWUVSX1pPTkVfMV9V", + "TkRFUlRFTVBFUkFUVVJFX0IQqB8SJAofRFJZRVJfWk9ORV8yX1VOREVSVEVN", + "UEVSQVRVUkVfQhCpHxIZChREUllFUl9USEVSTUFMX0NVVE9GRhCqHxIuCilE", + "UllFUl9IRUFURVJTX1pPTkVfMV9DVVJSRU5UX09VVF9PRl9SQU5HRRCrHxIu", + "CilEUllFUl9IRUFURVJTX1pPTkVfMl9DVVJSRU5UX09VVF9PRl9SQU5HRRCs", + "HxIsCidEUllFUl9IRUFURVJTX1pPTkVfMV9DVVJSRU5UX0xPT1BfQlJFQUsQ", + "rR8SLAonRFJZRVJfSEVBVEVSU19aT05FXzJfQ1VSUkVOVF9MT09QX0JSRUFL", + "EK4fEhoKFURSWUVSX0ZBTl9SUE1fVE9PX0xPVxCvHxIWChFEUllFUl9GQU5f", + "U1RPUFBFRBCwHxIgChtEUllFUl9MSURfTU9UT1JfT1ZFUkNVUlJFTlQQsR8S", + "JAofRFJZRVJfTElEX01PVE9SX09WRVJURU1QRVJBVFVSRRCyHxIaChVEUllF", + "Ul9MSURfTU9UT1JfU1RBTEwQsx8SIQocRFJZRVJfTElEX01PVE9SX1VOREVS", + "Vk9MVEFHRRC0HxIkCh9EUllFUl9aT05FXzJfVU5ERVJURU1QRVJBVFVSRV9B", + "ELUfEicKIkRZRUlOR19IRUFEX1pPTkVfMV9PVkVSVEVNUEVSQVRVUkUQiCcS", + "JwoiRFlFSU5HX0hFQURfWk9ORV8yX09WRVJURU1QRVJBVFVSRRCJJxInCiJE", + "WUVJTkdfSEVBRF9aT05FXzNfT1ZFUlRFTVBFUkFUVVJFEIonEicKIkRZRUlO", + "R19IRUFEX1pPTkVfNF9PVkVSVEVNUEVSQVRVUkUQiycSJwoiRFlFSU5HX0hF", + "QURfWk9ORV81X09WRVJURU1QRVJBVFVSRRCMJxInCiJEWUVJTkdfSEVBRF9a", + "T05FXzZfT1ZFUlRFTVBFUkFUVVJFEI0nEioKJURZRUlOR19IRUFEX1pPTkVf", + "MV9VTkRFUlRFTVBFUkFUVVJFX0EQjicSKgolRFlFSU5HX0hFQURfWk9ORV8y", + "X1VOREVSVEVNUEVSQVRVUkVfQRCPJxIqCiVEWUVJTkdfSEVBRF9aT05FXzNf", + "VU5ERVJURU1QRVJBVFVSRV9BEJAnEioKJURZRUlOR19IRUFEX1pPTkVfNF9V", + "TkRFUlRFTVBFUkFUVVJFX0EQkScSKgolRFlFSU5HX0hFQURfWk9ORV81X1VO", + "REVSVEVNUEVSQVRVUkVfQRCSJxIqCiVEWUVJTkdfSEVBRF9aT05FXzZfVU5E", + "RVJURU1QRVJBVFVSRV9BEJMnEioKJURZRUlOR19IRUFEX1pPTkVfMV9VTkRF", + "UlRFTVBFUkFUVVJFX0IQlCcSKgolRFlFSU5HX0hFQURfWk9ORV8yX1VOREVS", + "VEVNUEVSQVRVUkVfQhCVJxIqCiVEWUVJTkdfSEVBRF9aT05FXzNfVU5ERVJU", + "RU1QRVJBVFVSRV9CEJYnEioKJURZRUlOR19IRUFEX1pPTkVfNF9VTkRFUlRF", + "TVBFUkFUVVJFX0IQlycSKgolRFlFSU5HX0hFQURfWk9ORV81X1VOREVSVEVN", + "UEVSQVRVUkVfQhCYJxIqCiVEWUVJTkdfSEVBRF9aT05FXzZfVU5ERVJURU1Q", + "RVJBVFVSRV9CEJknEiwKJ0RZRUlOR19IRUFEX1pPTkVfMV9DVVJSRU5UX09V", + "VF9PRl9SQU5HRRCaJxIsCidEWUVJTkdfSEVBRF9aT05FXzJfQ1VSUkVOVF9P", + "VVRfT0ZfUkFOR0UQmycSLAonRFlFSU5HX0hFQURfWk9ORV8zX0NVUlJFTlRf", + "T1VUX09GX1JBTkdFEJwnEiwKJ0RZRUlOR19IRUFEX1pPTkVfNF9DVVJSRU5U", + "X09VVF9PRl9SQU5HRRCdJxIsCidEWUVJTkdfSEVBRF9aT05FXzVfQ1VSUkVO", + "VF9PVVRfT0ZfUkFOR0UQnicSKgolRFlFSU5HX0hFQURfWk9ORV8xX0NVUlJF", + "TlRfTE9PUF9CUkVBSxCfJxIqCiVEWUVJTkdfSEVBRF9aT05FXzJfQ1VSUkVO", + "VF9MT09QX0JSRUFLEKAnEioKJURZRUlOR19IRUFEX1pPTkVfM19DVVJSRU5U", + "X0xPT1BfQlJFQUsQoScSKgolRFlFSU5HX0hFQURfWk9ORV80X0NVUlJFTlRf", + "TE9PUF9CUkVBSxCiJxIqCiVEWUVJTkdfSEVBRF9aT05FXzVfQ1VSUkVOVF9M", + "T09QX0JSRUFLEKMnEh8KGkRZRUlOR19IRUFEX1RIRVJNQUxfQ1VUT0ZGEKQn", + "EiMKHkRZRUlOR19IRUFEX0NPVkVSX09QRU5fVElNRU9VVBClJxIkCh9EWUVJ", + "TkdfSEVBRF9DT1ZFUl9DTE9TRV9USU1FT1VUEKYnEigKI0RZRUlOR19IRUFE", + "X0NPVkVSX01PVE9SX09WRVJDVVJSRU5UEKcnEiwKJ0RZRUlOR19IRUFEX0NP", + "VkVSX01PVE9SX09WRVJURU1QRVJBVFVSRRCoJxIiCh1EWUVJTkdfSEVBRF9D", + "T1ZFUl9NT1RPUl9TVEFMTBCpJxIpCiREWUVJTkdfSEVBRF9DT1ZFUl9NT1RP", + "Ul9VTkRFUlZPTFRBR0UQqicSNQowRFlFSU5HX0hFQURfQ0xFQU5JTkdfTUVD", + "SEFOSVNNX01PVE9SX09WRVJDVVJSRU5UEKsnEjkKNERZRUlOR19IRUFEX0NM", + "RUFOSU5HX01FQ0hBTklTTV9NT1RPUl9PVkVSVEVNUEVSQVRVUkUQrCcSLwoq", + "RFlFSU5HX0hFQURfQ0xFQU5JTkdfTUVDSEFOSVNNX01PVE9SX1NUQUxMEK0n", + "EjYKMURZRUlOR19IRUFEX0NMRUFOSU5HX01FQ0hBTklTTV9NT1RPUl9VTkRF", + "UlZPTFRBR0UQricSMAorRFlFSU5HX0hFQURfQ0xFQU5JTkdfSEVBRF9NT1RP", + "Ul9PVkVSQ1VSUkVOVBCvJxI0Ci9EWUVJTkdfSEVBRF9DTEVBTklOR19IRUFE", + "X01PVE9SX09WRVJURU1QRVJBVFVSRRCwJxIqCiVEWUVJTkdfSEVBRF9DTEVB", + "TklOR19IRUFEX01PVE9SX1NUQUxMELEnEjEKLERZRUlOR19IRUFEX0NMRUFO", + "SU5HX0hFQURfTU9UT1JfVU5ERVJWT0xUQUdFELInEicKIkRZRUlOR19IRUFE", + "X1pPTkVfN19PVkVSVEVNUEVSQVRVUkUQsycSJwoiRFlFSU5HX0hFQURfWk9O", + "RV84X09WRVJURU1QRVJBVFVSRRC0JxInCiJEWUVJTkdfSEVBRF9aT05FXzlf", + "T1ZFUlRFTVBFUkFUVVJFELUnEigKI0RZRUlOR19IRUFEX1pPTkVfMTBfT1ZF", + "UlRFTVBFUkFUVVJFELYnEigKI0RZRUlOR19IRUFEX1pPTkVfMTFfT1ZFUlRF", + "TVBFUkFUVVJFELcnEigKI0RZRUlOR19IRUFEX1pPTkVfMTJfT1ZFUlRFTVBF", + "UkFUVVJFELgnEioKJURZRUlOR19IRUFEX1pPTkVfN19VTkRFUlRFTVBFUkFU", + "VVJFX0EQuScSKgolRFlFSU5HX0hFQURfWk9ORV84X1VOREVSVEVNUEVSQVRV", + "UkVfQRC6JxIqCiVEWUVJTkdfSEVBRF9aT05FXzlfVU5ERVJURU1QRVJBVFVS", + "RV9BELsnEisKJkRZRUlOR19IRUFEX1pPTkVfMTBfVU5ERVJURU1QRVJBVFVS", + "RV9BELwnEisKJkRZRUlOR19IRUFEX1pPTkVfMTFfVU5ERVJURU1QRVJBVFVS", + "RV9BEL0nEisKJkRZRUlOR19IRUFEX1pPTkVfMTJfVU5ERVJURU1QRVJBVFVS", + "RV9BEL4nEioKJURZRUlOR19IRUFEX1pPTkVfN19VTkRFUlRFTVBFUkFUVVJF", + "X0IQvycSKgolRFlFSU5HX0hFQURfWk9ORV84X1VOREVSVEVNUEVSQVRVUkVf", + "QhDAJxIqCiVEWUVJTkdfSEVBRF9aT05FXzlfVU5ERVJURU1QRVJBVFVSRV9C", + "EMEnEisKJkRZRUlOR19IRUFEX1pPTkVfMTBfVU5ERVJURU1QRVJBVFVSRV9C", + "EMInEisKJkRZRUlOR19IRUFEX1pPTkVfMTFfVU5ERVJURU1QRVJBVFVSRV9C", + "EMMnEisKJkRZRUlOR19IRUFEX1pPTkVfMTJfVU5ERVJURU1QRVJBVFVSRV9C", + "EMQnEiwKJ0RZRUlOR19IRUFEX1pPTkVfNl9DVVJSRU5UX09VVF9PRl9SQU5H", + "RRDFJxIsCidEWUVJTkdfSEVBRF9aT05FXzdfQ1VSUkVOVF9PVVRfT0ZfUkFO", + "R0UQxicSLAonRFlFSU5HX0hFQURfWk9ORV84X0NVUlJFTlRfT1VUX09GX1JB", + "TkdFEMcnEiwKJ0RZRUlOR19IRUFEX1pPTkVfOV9DVVJSRU5UX09VVF9PRl9S", + "QU5HRRDIJxItCihEWUVJTkdfSEVBRF9aT05FXzEwX0NVUlJFTlRfT1VUX09G", + "X1JBTkdFEMknEi0KKERZRUlOR19IRUFEX1pPTkVfMTFfQ1VSUkVOVF9PVVRf", + "T0ZfUkFOR0UQyicSLQooRFlFSU5HX0hFQURfWk9ORV8xMl9DVVJSRU5UX09V", + "VF9PRl9SQU5HRRDLJxIqCiVEWUVJTkdfSEVBRF9aT05FXzZfQ1VSUkVOVF9M", + "T09QX0JSRUFLEMwnEioKJURZRUlOR19IRUFEX1pPTkVfN19DVVJSRU5UX0xP", + "T1BfQlJFQUsQzScSKgolRFlFSU5HX0hFQURfWk9ORV84X0NVUlJFTlRfTE9P", + "UF9CUkVBSxDOJxIqCiVEWUVJTkdfSEVBRF9aT05FXzlfQ1VSUkVOVF9MT09Q", + "X0JSRUFLEM8nEisKJkRZRUlOR19IRUFEX1pPTkVfMTBfQ1VSUkVOVF9MT09Q", + "X0JSRUFLENAnEisKJkRZRUlOR19IRUFEX1pPTkVfMTFfQ1VSUkVOVF9MT09Q", + "X0JSRUFLENEnEisKJkRZRUlOR19IRUFEX1pPTkVfMTJfQ1VSUkVOVF9MT09Q", + "X0JSRUFLENInEikKJERZRUlOR19IRUFEX0JMT1dFUl8xX09WRVJURU1QRVJB", + "VFVSRRDTJxIpCiREWUVJTkdfSEVBRF9CTE9XRVJfMl9PVkVSVEVNUEVSQVRV", + "UkUQ1CcSLAonRFlFSU5HX0hFQURfQkxPV0VSXzFfVU5ERVJURU1QRVJBVFVS", + "RV9BENUnEiwKJ0RZRUlOR19IRUFEX0JMT1dFUl8yX1VOREVSVEVNUEVSQVRV", + "UkVfQRDWJxIsCidEWUVJTkdfSEVBRF9CTE9XRVJfMV9VTkRFUlRFTVBFUkFU", + "VVJFX0IQ1ycSLAonRFlFSU5HX0hFQURfQkxPV0VSXzJfVU5ERVJURU1QRVJB", + "VFVSRV9CENgnEi4KKURZRUlOR19IRUFEX0JMT1dFUl8xX0NVUlJFTlRfT1VU", + "X09GX1JBTkdFENknEi4KKURZRUlOR19IRUFEX0JMT1dFUl8yX0NVUlJFTlRf", + "T1VUX09GX1JBTkdFENonEiwKJ0RZRUlOR19IRUFEX0JMT1dFUl8xX0NVUlJF", + "TlRfTE9PUF9CUkVBSxDbJxIsCidEWUVJTkdfSEVBRF9CTE9XRVJfMl9DVVJS", + "RU5UX0xPT1BfQlJFQUsQ3CcSJQogRFlFSU5HX0hFQURfQkxPV0VSXzFfRkFO", + "X1NUT1BQRUQQ3ScSJQogRFlFSU5HX0hFQURfQkxPV0VSXzJfRkFOX1NUT1BQ", + "RUQQ3icSKQokRFlFSU5HX0hFQURfQkxPV0VSXzFfRkFOX1JQTV9UT09fTE9X", + "EN8nEikKJERZRUlOR19IRUFEX0JMT1dFUl8yX0ZBTl9SUE1fVE9PX0xPVxDg", + "JxIqCiVEWUVJTkdfSEVBRF9SSUdIVF9BQ1RVQVRPUl9VUF9USU1FT1VUEOEn", + "EikKJERZRUlOR19IRUFEX0xFRlRfQUNUVUFUT1JfVVBfVElNRU9VVBDiJxIs", + "CidEWUVJTkdfSEVBRF9SSUdIVF9BQ1RVQVRPUl9ET1dOX1RJTUVPVVQQ4ycS", + "KwomRFlFSU5HX0hFQURfTEVGVF9BQ1RVQVRPUl9ET1dOX1RJTUVPVVQQ5CcS", + "JwoiRFlFSU5HX0hFQURfQkxPV0VSXzFfRkxPV19UT09fSElHSBDlJxInCiJE", + "WUVJTkdfSEVBRF9CTE9XRVJfMl9GTE9XX1RPT19ISUdIEOYnEiYKIURZRUlO", + "R19IRUFEX0JMT1dFUl8xX0ZMT1dfVE9PX0xPVxDnJxImCiFEWUVJTkdfSEVB", + "RF9CTE9XRVJfMl9GTE9XX1RPT19MT1cQ6CcSIAobRFlFSU5HX0hFQURfQVJD", + "X0xJRF9JU19PUEVOEOknEiMKHkRZRUlOR19IRUFEX1RVTk5FTF9MSURfSVNf", + "T1BFThDqJxIaChVNSVhFUl9PVkVSVEVNUEVSQVRVUkUQ8C4SHQoYTUlYRVJf", + "VU5ERVJURU1QRVJBVFVSRV9BEPEuEh0KGE1JWEVSX1VOREVSVEVNUEVSQVRV", + "UkVfQhDyLhIZChRNSVhFUl9USEVSTUFMX0NVVE9GRhDzLhIfChpNSVhFUl9D", + "VVJSRU5UX09VVF9PRl9SQU5HRRD0LhIdChhNSVhFUl9DVVJSRU5UX0xPT1Bf", + "QlJFQUsQ9S4SHQoYRElTUEVOU0VSXzFfT1ZFUlBSRVNTVVJFENg2Eh0KGERJ", + "U1BFTlNFUl8yX09WRVJQUkVTU1VSRRDZNhIdChhESVNQRU5TRVJfM19PVkVS", + "UFJFU1NVUkUQ2jYSHQoYRElTUEVOU0VSXzRfT1ZFUlBSRVNTVVJFENs2Eh0K", + "GERJU1BFTlNFUl81X09WRVJQUkVTU1VSRRDcNhIdChhESVNQRU5TRVJfNl9P", + "VkVSUFJFU1NVUkUQ3TYSHQoYRElTUEVOU0VSXzdfT1ZFUlBSRVNTVVJFEN42", + "Eh0KGERJU1BFTlNFUl84X09WRVJQUkVTU1VSRRDfNhIeChlESVNQRU5TRVJf", + "MV9VTkRFUlBSRVNTVVJFEOA2Eh4KGURJU1BFTlNFUl8yX1VOREVSUFJFU1NV", + "UkUQ4TYSHgoZRElTUEVOU0VSXzNfVU5ERVJQUkVTU1VSRRDiNhIeChlESVNQ", + "RU5TRVJfNF9VTkRFUlBSRVNTVVJFEOM2Eh4KGURJU1BFTlNFUl81X1VOREVS", + "UFJFU1NVUkUQ5DYSHgoZRElTUEVOU0VSXzZfVU5ERVJQUkVTU1VSRRDlNhIe", + "ChlESVNQRU5TRVJfN19VTkRFUlBSRVNTVVJFEOY2Eh4KGURJU1BFTlNFUl84", + "X1VOREVSUFJFU1NVUkUQ5zYSFgoRRElTUEVOU0VSXzFfRU1QVFkQ6DYSFgoR", + "RElTUEVOU0VSXzJfRU1QVFkQ6TYSFgoRRElTUEVOU0VSXzNfRU1QVFkQ6jYS", + "FgoRRElTUEVOU0VSXzRfRU1QVFkQ6zYSFgoRRElTUEVOU0VSXzVfRU1QVFkQ", + "7DYSFgoRRElTUEVOU0VSXzZfRU1QVFkQ7TYSFgoRRElTUEVOU0VSXzdfRU1Q", + "VFkQ7jYSFgoRRElTUEVOU0VSXzhfRU1QVFkQ7zYSHwoaRElTUEVOU0VSXzFf", + "UkVGSUxMX0ZBSUxVUkUQ8DYSHwoaRElTUEVOU0VSXzJfUkVGSUxMX0ZBSUxV", + "UkUQ8TYSHwoaRElTUEVOU0VSXzNfUkVGSUxMX0ZBSUxVUkUQ8jYSHwoaRElT", + "UEVOU0VSXzRfUkVGSUxMX0ZBSUxVUkUQ8zYSHwoaRElTUEVOU0VSXzVfUkVG", + "SUxMX0ZBSUxVUkUQ9DYSHwoaRElTUEVOU0VSXzZfUkVGSUxMX0ZBSUxVUkUQ", + "9TYSHwoaRElTUEVOU0VSXzdfUkVGSUxMX0ZBSUxVUkUQ9jYSHwoaRElTUEVO", + "U0VSXzhfUkVGSUxMX0ZBSUxVUkUQ9zYSIgodRElTUEVOU0VSXzFfTU9UT1Jf", + "T1ZFUkNVUlJFTlQQ+DYSIgodRElTUEVOU0VSXzJfTU9UT1JfT1ZFUkNVUlJF", + "TlQQ+TYSIgodRElTUEVOU0VSXzNfTU9UT1JfT1ZFUkNVUlJFTlQQ+jYSIgod", + "RElTUEVOU0VSXzRfTU9UT1JfT1ZFUkNVUlJFTlQQ+zYSIgodRElTUEVOU0VS", + "XzVfTU9UT1JfT1ZFUkNVUlJFTlQQ/DYSIgodRElTUEVOU0VSXzZfTU9UT1Jf", + "T1ZFUkNVUlJFTlQQ/TYSIgodRElTUEVOU0VSXzdfTU9UT1JfT1ZFUkNVUlJF", + "TlQQ/jYSIgodRElTUEVOU0VSXzhfTU9UT1JfT1ZFUkNVUlJFTlQQ/zYSJgoh", + "RElTUEVOU0VSXzFfTU9UT1JfT1ZFUlRFTVBFUkFUVVJFEIA3EiYKIURJU1BF", + "TlNFUl8yX01PVE9SX09WRVJURU1QRVJBVFVSRRCBNxImCiFESVNQRU5TRVJf", + "M19NT1RPUl9PVkVSVEVNUEVSQVRVUkUQgjcSJgohRElTUEVOU0VSXzRfTU9U", + "T1JfT1ZFUlRFTVBFUkFUVVJFEIM3EiYKIURJU1BFTlNFUl81X01PVE9SX09W", + "RVJURU1QRVJBVFVSRRCENxImCiFESVNQRU5TRVJfNl9NT1RPUl9PVkVSVEVN", + "UEVSQVRVUkUQhTcSJgohRElTUEVOU0VSXzdfTU9UT1JfT1ZFUlRFTVBFUkFU", + "VVJFEIY3EiYKIURJU1BFTlNFUl84X01PVE9SX09WRVJURU1QRVJBVFVSRRCH", + "NxIcChdESVNQRU5TRVJfMV9NT1RPUl9TVEFMTBCINxIcChdESVNQRU5TRVJf", + "Ml9NT1RPUl9TVEFMTBCJNxIcChdESVNQRU5TRVJfM19NT1RPUl9TVEFMTBCK", + "NxIcChdESVNQRU5TRVJfNF9NT1RPUl9TVEFMTBCLNxIcChdESVNQRU5TRVJf", + "NV9NT1RPUl9TVEFMTBCMNxIcChdESVNQRU5TRVJfNl9NT1RPUl9TVEFMTBCN", + "NxIcChdESVNQRU5TRVJfN19NT1RPUl9TVEFMTBCONxIcChdESVNQRU5TRVJf", + "OF9NT1RPUl9TVEFMTBCPNxIjCh5ESVNQRU5TRVJfMV9NT1RPUl9VTkRFUlZP", + "TFRBR0UQkDcSIwoeRElTUEVOU0VSXzJfTU9UT1JfVU5ERVJWT0xUQUdFEJE3", + "EiMKHkRJU1BFTlNFUl8zX01PVE9SX1VOREVSVk9MVEFHRRCSNxIjCh5ESVNQ", + "RU5TRVJfNF9NT1RPUl9VTkRFUlZPTFRBR0UQkzcSIwoeRElTUEVOU0VSXzVf", + "TU9UT1JfVU5ERVJWT0xUQUdFEJQ3EiMKHkRJU1BFTlNFUl82X01PVE9SX1VO", + "REVSVk9MVEFHRRCVNxIjCh5ESVNQRU5TRVJfN19NT1RPUl9VTkRFUlZPTFRB", + "R0UQljcSIwoeRElTUEVOU0VSXzhfTU9UT1JfVU5ERVJWT0xUQUdFEJc3EiEK", + "HERJU1BFTlNFUl8xX1VQUEVSX0hBUkRfTElNSVQQmDcSIQocRElTUEVOU0VS", + "XzJfVVBQRVJfSEFSRF9MSU1JVBCZNxIhChxESVNQRU5TRVJfM19VUFBFUl9I", + "QVJEX0xJTUlUEJo3EiEKHERJU1BFTlNFUl80X1VQUEVSX0hBUkRfTElNSVQQ", + "mzcSIQocRElTUEVOU0VSXzVfVVBQRVJfSEFSRF9MSU1JVBCcNxIhChxESVNQ", + "RU5TRVJfNl9VUFBFUl9IQVJEX0xJTUlUEJ03EiEKHERJU1BFTlNFUl83X1VQ", + "UEVSX0hBUkRfTElNSVQQnjcSIQocRElTUEVOU0VSXzhfVVBQRVJfSEFSRF9M", + "SU1JVBCfNxIhChxESVNQRU5TRVJfMV9MT1dFUl9IQVJEX0xJTUlUEKA3EiEK", + "HERJU1BFTlNFUl8yX0xPV0VSX0hBUkRfTElNSVQQoTcSIQocRElTUEVOU0VS", + "XzNfTE9XRVJfSEFSRF9MSU1JVBCiNxIhChxESVNQRU5TRVJfNF9MT1dFUl9I", + "QVJEX0xJTUlUEKM3EiEKHERJU1BFTlNFUl81X0xPV0VSX0hBUkRfTElNSVQQ", + "pDcSIQocRElTUEVOU0VSXzZfTE9XRVJfSEFSRF9MSU1JVBClNxIhChxESVNQ", + "RU5TRVJfN19MT1dFUl9IQVJEX0xJTUlUEKY3EiEKHERJU1BFTlNFUl84X0xP", + "V0VSX0hBUkRfTElNSVQQpzcSHgoZRElTUEVOU0VSXzFfSElHSF9QUkVTU1VS", + "RRCoNxIeChlESVNQRU5TRVJfMl9ISUdIX1BSRVNTVVJFEKk3Eh4KGURJU1BF", + "TlNFUl8zX0hJR0hfUFJFU1NVUkUQqjcSHgoZRElTUEVOU0VSXzRfSElHSF9Q", + "UkVTU1VSRRCrNxIeChlESVNQRU5TRVJfNV9ISUdIX1BSRVNTVVJFEKw3Eh4K", + "GURJU1BFTlNFUl82X0hJR0hfUFJFU1NVUkUQrTcSHgoZRElTUEVOU0VSXzdf", + "SElHSF9QUkVTU1VSRRCuNxIeChlESVNQRU5TRVJfOF9ISUdIX1BSRVNTVVJF", + "EK83EhkKFE1JRF9UQU5LXzFfTE9XX0xFVkVMEMA+EhkKFE1JRF9UQU5LXzJf", + "TE9XX0xFVkVMEME+EhkKFE1JRF9UQU5LXzNfTE9XX0xFVkVMEMI+EhkKFE1J", + "RF9UQU5LXzRfTE9XX0xFVkVMEMM+EhkKFE1JRF9UQU5LXzVfTE9XX0xFVkVM", + "EMQ+EhkKFE1JRF9UQU5LXzZfTE9XX0xFVkVMEMU+EhkKFE1JRF9UQU5LXzdf", + "TE9XX0xFVkVMEMY+EhkKFE1JRF9UQU5LXzhfTE9XX0xFVkVMEMc+EhUKEE1J", + "RF9UQU5LXzFfRU1QVFkQyD4SFQoQTUlEX1RBTktfMl9FTVBUWRDJPhIVChBN", + "SURfVEFOS18zX0VNUFRZEMo+EhUKEE1JRF9UQU5LXzRfRU1QVFkQyz4SFQoQ", + "TUlEX1RBTktfNV9FTVBUWRDMPhIVChBNSURfVEFOS182X0VNUFRZEM0+EhUK", + "EE1JRF9UQU5LXzdfRU1QVFkQzj4SFQoQTUlEX1RBTktfOF9FTVBUWRDPPhIY", + "ChNNSURfVEFOS18xX09WRVJGTE9XENA+EhgKE01JRF9UQU5LXzJfT1ZFUkZM", + "T1cQ0T4SGAoTTUlEX1RBTktfM19PVkVSRkxPVxDSPhIYChNNSURfVEFOS180", + "X09WRVJGTE9XENM+EhgKE01JRF9UQU5LXzVfT1ZFUkZMT1cQ1D4SGAoTTUlE", + "X1RBTktfNl9PVkVSRkxPVxDVPhIYChNNSURfVEFOS183X09WRVJGTE9XENY+", + "EhgKE01JRF9UQU5LXzhfT1ZFUkZMT1cQ1z4SHAoXTUlEX1RBTktfMV9GSUxM", + "X1RJTUVPVVQQ2D4SHAoXTUlEX1RBTktfMl9GSUxMX1RJTUVPVVQQ2T4SHAoX", + "TUlEX1RBTktfM19GSUxMX1RJTUVPVVQQ2j4SHAoXTUlEX1RBTktfNF9GSUxM", + "X1RJTUVPVVQQ2z4SHAoXTUlEX1RBTktfNV9GSUxMX1RJTUVPVVQQ3D4SHAoX", + "TUlEX1RBTktfNl9GSUxMX1RJTUVPVVQQ3T4SHAoXTUlEX1RBTktfN19GSUxM", + "X1RJTUVPVVQQ3j4SHAoXTUlEX1RBTktfOF9GSUxMX1RJTUVPVVQQ3z4SHQoY", + "QUlSX0ZJTFRFUl9OT1RfSU5TVEFMTEVEEKhGEhcKEkFJUl9GSUxURVJfQ0xP", + "R0dFRBCpRhIlCiBXQVNURV9DT05UQUlORVJfRU1QVFlJTkdfVElNRU9VVBCq", + "RhIUCg9OT19BSVJfUFJFU1NVUkUQq0YSHQoYV0FTVEVfQ09OVEFJTkVSX09W", + "RVJGTE9XEKxGEhoKFVZPQ19TRU5TT1JfQUxBUk1fVElNRRCtRhIYChNDSElM", + "TEVSX0RSWV9DT05UQUNUEK5GEhoKFUlOU1VGRklDSUVOVF9BSVJfRkxPVxCv", + "RhIbChZWT0NfU0VOU09SX0FMQVJNX1NMT1BFELBGEh0KGFBSRV9DT09MRVJf", + "RkFOXzFfU1RPUFBFRBCxRhIdChhQUkVfQ09PTEVSX0ZBTl8yX1NUT1BQRUQQ", + "skYSGQoUQ09PTEVSX0ZBTl8xX1NUT1BQRUQQs0YSGQoUQ09PTEVSX0ZBTl8y", + "X1NUT1BQRUQQtEYSGQoUQ09PTEVSX0ZBTl8zX1NUT1BQRUQQtUYSGQoUQ09P", + "TEVSX0ZBTl80X1NUT1BQRUQQtkYSIQocUFJFX0NPT0xFUl9GQU5fMV9SUE1f", + "VE9PX0xPVxC3RhIhChxQUkVfQ09PTEVSX0ZBTl8yX1JQTV9UT09fTE9XELhG", + "Eh0KGENPT0xFUl9GQU5fMV9SUE1fVE9PX0xPVxC5RhIdChhDT09MRVJfRkFO", + "XzJfUlBNX1RPT19MT1cQukYSHQoYQ09PTEVSX0ZBTl8zX1JQTV9UT09fTE9X", + "ELtGEh0KGENPT0xFUl9GQU5fNF9SUE1fVE9PX0xPVxC8RhIgChtDT09MRVJf", + "VEVNUEVSQVRVUkVfVE9PX0hJR0gQvUYSHwoaQ09PTEVSX1RFTVBFUkFUVVJF", + "X1RPT19MT1cQvkYSKgolSU5LX0NBUlRSSURHRV9QUkVTRU5DRV9TRU5TT1Jf", + "VElNRU9VVBCQThIfChpJTktfQ0FSVFJJREdFX1JGSURfVElNRU9VVBCRThIh", + "ChxOT19XQVNURV9DQVJUUklER0VfQVZBSUxBQkxFEJJOEh4KGUFMTF9XQVNU", + "RV9DQVJUUklER0VTX0ZVTEwQk04SLAonV0FTVEVfQ0FSVFJJREdFX1BSRVNF", + "TkNFX1NFTlNPUl9USU1FT1VUEJROEiEKHFdBU1RFX0NBUlRSSURHRV9SRklE", + "X1RJTUVPVVQQlU5CIQofY29tLnR3aW5lLnRhbmdvLnBtci5kaWFnbm9zdGlj", + "c2IGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Tango.PMR.Diagnostics.EventType), }, null)); @@ -403,7 +409,7 @@ namespace Tango.PMR.Diagnostics { /// <summary> ///Cover is open. Cannot execute job (Group = GeneralHardware, Category = Error) /// </summary> - [pbr::OriginalName("REAR_COVER_OPEN")] RearCoverOpen = 2007, + [pbr::OriginalName("ARCH_COVER_OPEN")] ArchCoverOpen = 2007, /// <summary> ///The machine temperature is too high. Cannot execute job (Group = GeneralHardware, Category = Critical) /// </summary> @@ -457,6 +463,10 @@ namespace Tango.PMR.Diagnostics { /// </summary> [pbr::OriginalName("UNINTENDED_RESET")] UnintendedReset = 2020, /// <summary> + ///Temperature measurement error has occurred. Cannot execute job. (Group = GeneralHardware, Category = Error) + /// </summary> + [pbr::OriginalName("TEMPERATURE_MEASUREMENT_ERROR")] TemperatureMeasurementError = 2021, + /// <summary> ///Thread break. Cannot execute job (Group = ThreadFeedingSystem, Category = Error) /// </summary> [pbr::OriginalName("THREAD_BREAK")] ThreadBreak = 3000, @@ -1125,6 +1135,30 @@ namespace Tango.PMR.Diagnostics { /// </summary> [pbr::OriginalName("DYEING_HEAD_LEFT_ACTUATOR_DOWN_TIMEOUT")] DyeingHeadLeftActuatorDownTimeout = 5092, /// <summary> + ///Dyeing head blower flow is too high. Cannot execute job (Group = DyeingHead, Category = Error) + /// </summary> + [pbr::OriginalName("DYEING_HEAD_BLOWER_1_FLOW_TOO_HIGH")] DyeingHeadBlower1FlowTooHigh = 5093, + /// <summary> + ///Dyeing head blower flow is too high. Cannot execute job (Group = DyeingHead, Category = Error) + /// </summary> + [pbr::OriginalName("DYEING_HEAD_BLOWER_2_FLOW_TOO_HIGH")] DyeingHeadBlower2FlowTooHigh = 5094, + /// <summary> + ///Dyeing head blower flow is too low. Cannot execute job (Group = DyeingHead, Category = Error) + /// </summary> + [pbr::OriginalName("DYEING_HEAD_BLOWER_1_FLOW_TOO_LOW")] DyeingHeadBlower1FlowTooLow = 5095, + /// <summary> + ///Dyeing head blower flow is too low. Cannot execute job (Group = DyeingHead, Category = Error) + /// </summary> + [pbr::OriginalName("DYEING_HEAD_BLOWER_2_FLOW_TOO_LOW")] DyeingHeadBlower2FlowTooLow = 5096, + /// <summary> + ///Dyeing head arc lid is open. Cannot execute job. (Group = DyeingHead, Category = Error) + /// </summary> + [pbr::OriginalName("DYEING_HEAD_ARC_LID_IS_OPEN")] DyeingHeadArcLidIsOpen = 5097, + /// <summary> + ///Dyeing head tunnel lid is open. Cannot execute job (Group = DyeingHead, Category = Error) + /// </summary> + [pbr::OriginalName("DYEING_HEAD_TUNNEL_LID_IS_OPEN")] DyeingHeadTunnelLidIsOpen = 5098, + /// <summary> ///The temperature in the mixer is too high. Cannot execute job (Group = Mixer, Category = Critical) /// </summary> [pbr::OriginalName("MIXER_OVERTEMPERATURE")] MixerOvertemperature = 6000, @@ -1181,35 +1215,35 @@ namespace Tango.PMR.Diagnostics { /// </summary> [pbr::OriginalName("DISPENSER_8_OVERPRESSURE")] Dispenser8Overpressure = 7007, /// <summary> - ///The pressure in black dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + ///The pressure in black dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) /// </summary> [pbr::OriginalName("DISPENSER_1_UNDERPRESSURE")] Dispenser1Underpressure = 7008, /// <summary> - ///The pressure in cyan dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + ///The pressure in cyan dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) /// </summary> [pbr::OriginalName("DISPENSER_2_UNDERPRESSURE")] Dispenser2Underpressure = 7009, /// <summary> - ///The pressure in magenta dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + ///The pressure in magenta dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) /// </summary> [pbr::OriginalName("DISPENSER_3_UNDERPRESSURE")] Dispenser3Underpressure = 7010, /// <summary> - ///The pressure in yellow dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + ///The pressure in yellow dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) /// </summary> [pbr::OriginalName("DISPENSER_4_UNDERPRESSURE")] Dispenser4Underpressure = 7011, /// <summary> - ///The pressure in transparent ink dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + ///The pressure in transparent ink dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) /// </summary> [pbr::OriginalName("DISPENSER_5_UNDERPRESSURE")] Dispenser5Underpressure = 7012, /// <summary> - ///The pressure in spot color 1 dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + ///The pressure in spot color 1 dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) /// </summary> [pbr::OriginalName("DISPENSER_6_UNDERPRESSURE")] Dispenser6Underpressure = 7013, /// <summary> - ///The pressure in cleaner dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + ///The pressure in cleaner dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) /// </summary> [pbr::OriginalName("DISPENSER_7_UNDERPRESSURE")] Dispenser7Underpressure = 7014, /// <summary> - ///The pressure in lubricant dispenser is too low. Cannot execute job (Group = Dispensers, Category = Critical) + ///The pressure in lubricant dispenser is too low. Cannot execute job (Group = Dispensers, Category = Error) /// </summary> [pbr::OriginalName("DISPENSER_8_UNDERPRESSURE")] Dispenser8Underpressure = 7015, /// <summary> @@ -1657,7 +1691,7 @@ namespace Tango.PMR.Diagnostics { /// </summary> [pbr::OriginalName("CHILLER_DRY_CONTACT")] ChillerDryContact = 9006, /// <summary> - ///Insufficient air flow. Cannot execute job (Group = WasteHandlingSystem, Category = Critical) + ///Insufficient air flow. Cannot execute job (Group = WasteHandlingSystem, Category = Error) /// </summary> [pbr::OriginalName("INSUFFICIENT_AIR_FLOW")] InsufficientAirFlow = 9007, /// <summary> diff --git a/Software/Visual_Studio/Tango.SQLExaminer/SQLExaminer/Configurations/OverrideData.xml b/Software/Visual_Studio/Tango.SQLExaminer/SQLExaminer/Configurations/OverrideData.xml Binary files differindex 5a2082722..6fb63840f 100644 --- a/Software/Visual_Studio/Tango.SQLExaminer/SQLExaminer/Configurations/OverrideData.xml +++ b/Software/Visual_Studio/Tango.SQLExaminer/SQLExaminer/Configurations/OverrideData.xml diff --git a/Software/Visual_Studio/Tango.Transport/TransporterBase.cs b/Software/Visual_Studio/Tango.Transport/TransporterBase.cs index 81166ac2e..cba768fce 100644 --- a/Software/Visual_Studio/Tango.Transport/TransporterBase.cs +++ b/Software/Visual_Studio/Tango.Transport/TransporterBase.cs @@ -1201,7 +1201,7 @@ namespace Tango.Transport { ErrorCode = ErrorCode.GeneralError, Completed = true, - ErrorMessage = exception.Message + ErrorMessage = exception.FlattenMessage() }); } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzerResult.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzerResult.cs index 074d5ec86..6b404d2a5 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzerResult.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzerResult.cs @@ -13,6 +13,8 @@ namespace Tango.DispenserAnalyzer.UI.Analysis { public ObservableCollection<DataPoint> Points { get; set; } + public string Title { get; set; } + private int _step; public int XStep { @@ -38,6 +40,7 @@ namespace Tango.DispenserAnalyzer.UI.Analysis { _to = Points.Max(x => x.Y) + 2; _from = Points.Min(x => x.Y)-1; + RaisePropertyChanged("Title"); RaisePropertyChanged("Points"); } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs index 60ca14fa9..2d4775a37 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs @@ -22,10 +22,11 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers { return Task.Factory.StartNew<List<IAnalyzerResult>>(() => { - List<IAnalyzerResult> results = new List<IAnalyzerResult>(); - List<DispenserSample> commands = csvRows.Where(x => x.Command != null && x.Command.ToLower().Contains("label")).ToList<DispenserSample>(); - var pairs = commands.Select((x, i) => new { Index = i, Value = x }).GroupBy(x => x.Index / 2).Select(x => x.Select(v => v.Value).ToList()).ToList(); - MovingAverageFilter filter = new MovingAverageFilter(); + List<IAnalyzerResult> results = new List<IAnalyzerResult>(); + List<DispenserSample> commands = csvRows.Where(x => x.Command != null && x.Command.ToLower().Contains("label")).ToList<DispenserSample>(); + var pairs = commands.Select((x, i) => new { Index = i, Value = x }).GroupBy(x => x.Index / 2).Select(x => x.Select(v => v.Value).ToList()).ToList(); + MovingAverageFilter filter = new MovingAverageFilter(); + int flowtestNumber = 0; for (int index = 0; index < pairs.Count(); index++) { var pair = pairs[index]; @@ -73,7 +74,7 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers averageResult.Result = (averageResult.AverageValue <= 1850 && averageResult.AverageValue >= 1400) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; results.Add(averageResult); - FlowAnalyzerResult result = new FlowAnalyzerResult(); + FlowAnalyzerResult result = new FlowAnalyzerResult(++flowtestNumber); result.AverageValue = averageResult.AverageValue; result.SetLocalErrors(differenceMaxMin, differenceMaxMinToLocationArr); results.Add(result); @@ -114,13 +115,15 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers public double AverageValue { get; set; } + public int TestNumber { get; set; } + #endregion Properties - public FlowAnalyzerResult():base() + public FlowAnalyzerResult(int testNumber) :base() { AverageValue = 0.0; Result = AnalyzerResultValue.Undetermined; - //this.Points = new ObservableCollection<DataPoint>(); + TestNumber = testNumber; } /// <summary> @@ -142,6 +145,7 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers } } this.IsShowPlotResult = true; + RangeToCountChart.Title = $"Flow Range To Count {TestNumber}"; RangeToCountChart.UpdateData(); var rangeToTimePoints = RangeToTimeChart.Points; rangeToTimePoints.Clear(); @@ -149,6 +153,7 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers { rangeToTimePoints.Add(new DataPoint(differenceMaxMinToLocationArr.ElementAt(y), differenceMaxMin.ElementAt(y))); } + RangeToTimeChart.Title = $"Flow Time Location To Range {TestNumber}"; RangeToTimeChart.UpdateData(); } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml index c73d67ba7..e56ae6639 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml @@ -40,7 +40,12 @@ <TextBox x:Name="tbPath" BorderThickness="1" FontSize="16" VerticalContentAlignment="Center" IsReadOnly="False" Grid.Column="0" Margin="0 0 20 0" Text="{Binding OpenFilePath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AllowDrop="True" PreviewDrop="TextBlock_PreviewDrop" PreviewDragOver="TextBox_PreviewDragOver" BorderBrush="Silver" Padding="5 0 0 0 "></TextBox> <Button Grid.Column="1" Command="{Binding OpenCSVFileCommand}">Browse</Button> </Grid> - <Button Grid.Row="1" Margin="10 0 10 20" Command="{Binding GenerateCommand}" Content="{Binding ButtonName}"></Button> + <Grid Grid.Row="1" HorizontalAlignment="Stretch" Margin="10 0 20 20"> + <Button Command="{Binding GenerateCommand}" Content="{Binding ButtonName}" Margin="0 0 30 0"></Button> + <Button Command="{Binding OpenSettingWndCommand}" HorizontalAlignment="Right" VerticalAlignment="Center" Width="20" Height="20" Margin="0 0 0 0" Padding="0" Style="{StaticResource MaterialDesignFlatButton}" ToolTip="Open Setting Window"> + <materialDesign:PackIcon Kind="Settings" Width="16" Height="16" VerticalAlignment="Center"></materialDesign:PackIcon> + </Button> + </Grid> <Grid Grid.Row="2"> <Border BorderBrush="Silver" Padding="5" BorderThickness="1" CornerRadius="5" Margin="10"> <Expander Header="{Binding TestName}" IsExpanded="True"> @@ -106,7 +111,7 @@ </ItemsControl> <Border x:Name="PlotBorder" BorderBrush="Silver" Padding="2" BorderThickness="1" CornerRadius="5" Margin="10" Visibility="{Binding IsShowPlotResult, Converter={StaticResource BooleanToVisibilityConverter}}" MinHeight="300"> <StackPanel Orientation="Vertical" x:Name="PlotStackPanel"> - <oxy:Plot Title="Flow Range To Count" x:Name="RangeToCountPlot" LegendPlacement="Outside" LegendPosition="RightTop" LegendOrientation="Vertical" ClipToBounds="True" Loaded="RangeToCountPlot_Loaded" MinWidth="200" MinHeight="300"> + <oxy:Plot Title="{Binding RangeToCountChart.Title}" x:Name="RangeToCountPlot" LegendPlacement="Outside" LegendPosition="RightTop" LegendOrientation="Vertical" ClipToBounds="True" Loaded="RangeToCountPlot_Loaded" MinWidth="220" MinHeight="300"> <oxy:Plot.Series > <oxy:ColumnSeries ItemsSource="{Binding RangeToCountChart.Points}" Color="#73B6EC" StrokeThickness="1" FillColor="#73B6EC" ValueField="Y" LabelFormatString="{}{0}" LabelPlacement="Base" /> </oxy:Plot.Series> @@ -119,7 +124,7 @@ </Border> <Border x:Name="RangeToTimeBorder" BorderBrush="Silver" Padding="2" BorderThickness="1" CornerRadius="5" Margin="10" Visibility="{Binding IsShowPlotResult, Converter={StaticResource BooleanToVisibilityConverter}}" MinHeight="300"> <StackPanel Orientation="Vertical" x:Name="RangeToTimeStackPanel"> - <oxy:Plot Title="Flow Time Location To Range" x:Name="RangeToTimePlot" LegendPlacement="Outside" LegendPosition="RightTop" LegendOrientation="Vertical" ClipToBounds="True" MinWidth="200" MinHeight="300"> + <oxy:Plot Title="{Binding RangeToTimeChart.Title}" x:Name="RangeToTimePlot" LegendPlacement="Outside" LegendPosition="RightTop" LegendOrientation="Vertical" ClipToBounds="True" MinWidth="220" MinHeight="300"> <oxy:Plot.Series > <oxy:LineSeries ItemsSource="{Binding RangeToTimeChart.Points}" Color="#73B6EC" StrokeThickness="1" MarkerFill="SteelBlue" /> </oxy:Plot.Series> diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/SettingsModel.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/SettingsModel.cs new file mode 100644 index 000000000..0d9e20288 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/SettingsModel.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Core; + +namespace Tango.DispenserAnalyzer.UI.Models +{ + public class SettingsModel: ExtendedObject + { + private string _propertyName; + + public string PropertyName + { + get { return _propertyName; } + set { _propertyName = value; RaisePropertyChangedAuto(); } + } + + private double _propertyvalue; + + public double PropertyValue + { + get { return _propertyvalue; } + set { _propertyvalue = value; RaisePropertyChangedAuto(); } + } + + private double _defaultValue; + + public double DefaultValue + { + get { return _defaultValue; } + set { _defaultValue = value; RaisePropertyChangedAuto(); } + } + + private string _defaultValueDisplay; + + public string DefaultValueDisplay + { + get { return _defaultValueDisplay; } + set { _defaultValueDisplay = value; } + } + + + public SettingsModel( string propertyName, string defaultValueDisplay, double defaultValue) + { + PropertyName = propertyName; + DefaultValueDisplay = defaultValueDisplay; + DefaultValue = defaultValue; + } + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Tango.DispenserAnalyzer.UI.csproj b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Tango.DispenserAnalyzer.UI.csproj index 373654985..7efcaa58d 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Tango.DispenserAnalyzer.UI.csproj +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Tango.DispenserAnalyzer.UI.csproj @@ -143,7 +143,12 @@ <Compile Include="Models\DispenserCsvRow.cs" /> <Compile Include="Models\DispenserSample.cs" /> <Compile Include="Models\DispenserSampleCommand.cs" /> + <Compile Include="Models\SettingsModel.cs" /> <Compile Include="ViewModels\MainWindowVM.cs" /> + <Compile Include="ViewModels\SettingsVM.cs" /> + <Compile Include="View\SettingsWnd.xaml.cs"> + <DependentUpon>SettingsWnd.xaml</DependentUpon> + </Compile> <Page Include="MainWindow.xaml"> <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> @@ -156,6 +161,10 @@ <DependentUpon>MainWindow.xaml</DependentUpon> <SubType>Code</SubType> </Compile> + <Page Include="View\SettingsWnd.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> </ItemGroup> <ItemGroup> <Compile Include="Properties\AssemblyInfo.cs"> diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml new file mode 100644 index 000000000..9d818a05b --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml @@ -0,0 +1,166 @@ +<Window x:Class="Tango.DispenserAnalyzer.UI.View.SettingsWnd" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" + xmlns:local="clr-namespace:Tango.DispenserAnalyzer.UI.View" + mc:Ignorable="d" + Title="Settings" Height="630" Width="800" FontSize="22" ResizeMode="NoResize" WindowStyle="ToolWindow"> + <Window.Resources> + <Style TargetType="{x:Type TextBlock}" x:Key="WrapText"> + <Setter Property="TextWrapping" Value="Wrap"/> + </Style> + + <Style TargetType="DataGridColumnHeader" BasedOn="{StaticResource {x:Type DataGridColumnHeader}}"> + <Setter Property="HorizontalAlignment" Value="Left"></Setter> + <Setter Property="HorizontalContentAlignment" Value="Left"></Setter> + <Setter Property="Padding" Value="0 0 0 0"></Setter> + <Setter Property="Margin" Value="8 0 0 0"></Setter> + <Setter Property="FontWeight" Value="SemiBold"/> + <Setter Property="BorderThickness" Value="0"/> + <Setter Property="Height" Value="Auto"/> + <Setter Property="FontSize" Value="14"/> + </Style> + <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}"> + <Setter Property="Padding" Value="1" /> + <Setter Property="BorderThickness" Value="0"/> + <Setter Property="FocusVisualStyle" Value="{x:Null}"/> + <Setter Property="VerticalContentAlignment" Value="Center"></Setter> + <Setter Property="VerticalAlignment" Value="Center"/> + <Setter Property="HorizontalAlignment" Value="Left"/> + <Setter Property="Margin" Value="8 0 8 0"/> + <Setter Property="Height" Value="Auto"/> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="{x:Type DataGridCell}"> + <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> + </ControlTemplate> + </Setter.Value> + </Setter> + <Style.Triggers> + <Trigger Property="IsSelected" Value="True"> + <Setter Property="Background" Value="Transparent"></Setter> + <Setter Property="Foreground" Value="{StaticResource AccentColorBrush}" /> + </Trigger> + </Style.Triggers> + </Style> + <Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}"> + <Setter Property="BorderThickness" Value="0 0 0 1"/> + <Setter Property="BorderBrush" Value="LightGray"/> + <Setter Property="Height" Value="Auto"/> + <Style.Triggers> + <Trigger Property="IsMouseOver" Value="True"> + <Setter Property="Background" Value="Transparent"></Setter> + <Setter Property="Foreground" Value="#4fc3f7" /> + <Setter Property="Cursor" Value="Hand"></Setter> + </Trigger> + <Trigger Property="IsSelected" Value="True"> + <Setter Property="Background" Value="Transparent"></Setter> + </Trigger> + <Trigger Property="IsFocused" Value="True"> + <Setter Property="Background" Value="Transparent"></Setter> + </Trigger> + </Style.Triggers> + </Style> + + <Style TargetType="DataGrid" BasedOn="{StaticResource {x:Type DataGrid}}"> + <Setter Property="BorderBrush" Value="#FF688CAF"/> + <Setter Property="BorderThickness" Value="0"/> + <Setter Property="HorizontalScrollBarVisibility" Value="Disabled" /> + <Setter Property="VerticalScrollBarVisibility" Value="Auto"/> + </Style> + + <DataGrid x:Key="PropertyDataGrid" HorizontalAlignment="Left" VerticalScrollBarVisibility ="Auto" SelectionUnit="FullRow" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" + ItemsSource="{Binding .}" GridLinesVisibility="None" SelectionMode="Single" AlternatingRowBackground="#F6F6F6" FontSize="12" > + <DataGrid.Columns> + <DataGridTextColumn Header="Property Name" Binding="{Binding PropertyName}" Width="150" ElementStyle="{StaticResource WrapText}"/> + <DataGridTextColumn Header="Property Value" Binding="{Binding PropertyValue}" Width="150" IsReadOnly="False"></DataGridTextColumn> + <DataGridTextColumn Header="Default Value" Binding="{Binding DefaultValueDisplay}" Width="150" ElementStyle="{StaticResource WrapText}" /> + <DataGridTemplateColumn Header="" Width="1*"> + <DataGridTemplateColumn.CellStyle> + <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}"> + <Setter Property="BorderThickness" Value="0"/> + <Setter Property="FocusVisualStyle" Value="{x:Null}"/> + <Setter Property="VerticalContentAlignment" Value="Center"></Setter> + <Setter Property="VerticalAlignment" Value="Center"/> + <Setter Property="HorizontalAlignment" Value="Stretch"/> + <Setter Property="Margin" Value="0 0 0 0"/> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="{x:Type DataGridCell}"> + <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> + </ControlTemplate> + </Setter.Value> + </Setter> + <Style.Triggers> + <Trigger Property="IsSelected" Value="True"> + <Setter Property="Background" Value="Transparent"></Setter> + <Setter Property="Foreground" Value="{StaticResource AccentColorBrush}" /> + </Trigger> + </Style.Triggers> + </Style> + </DataGridTemplateColumn.CellStyle> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <Grid HorizontalAlignment="Stretch" VerticalAlignment="Center"> + <Button Width="80" Padding="2" Height="26" FontSize="12" Margin="0 8">Set Default</Button> + </Grid> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + </DataGrid.Columns> + </DataGrid> + </Window.Resources> + + + <Grid> + <Grid.RowDefinitions> + <RowDefinition Height="Auto"/> + <RowDefinition Height="1*"/> + <RowDefinition Height="Auto"/> + </Grid.RowDefinitions> + <Grid.ColumnDefinitions> + + </Grid.ColumnDefinitions> + <Grid Grid.Row="0"> + <Grid.RowDefinitions> + <RowDefinition Height="Auto"/> + <RowDefinition/> + </Grid.RowDefinitions> + <Grid Grid.Row="0" VerticalAlignment="Top"> + <Border Margin="20 20 20 0" BorderBrush="LightGray" BorderThickness="0.6" CornerRadius="4" Height="36"> + <Border.Effect> + <DropShadowEffect/> + </Border.Effect> + </Border> + <Border Margin="20 20 20 0" BorderBrush="LightGray" BorderThickness="0.6" CornerRadius="4" Height="34" Background="#C4EEFC"> + <TextBlock FontSize="22" Padding="2">Pressure build up test</TextBlock> + </Border> + </Grid> + <ContentControl Grid.Row="1" Margin="20 3 20 0" Content="{StaticResource PropertyDataGrid}" DataContext="{Binding Path=PBUTestSettings}"></ContentControl> + </Grid> + <Grid Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Stretch"> + <Grid> + <Grid.RowDefinitions> + <RowDefinition Height="Auto"/> + <RowDefinition Height="1*"/> + </Grid.RowDefinitions> + <Grid Grid.Row="0" VerticalAlignment="Top"> + <Border Margin="20 20 20 0" BorderBrush="LightGray" BorderThickness="0.6" CornerRadius="4" Height="36"> + <Border.Effect> + <DropShadowEffect/> + </Border.Effect> + </Border> + <Border Margin="20 20 20 0" BorderBrush="LightGray" BorderThickness="0.6" CornerRadius="4" Height="34" Background="#C4EEFC"> + <TextBlock FontSize="22" Padding="2">Flow test</TextBlock> + </Border> + </Grid> + <ContentControl Grid.Row="1" Content="{StaticResource PropertyDataGrid}" DataContext="{Binding Path=FlowTestSettings}" Margin="20 0 20 0"></ContentControl> + </Grid> + </Grid> + <Grid Grid.Row="2" > + <Button Width="80" HorizontalAlignment="Right" Margin="20">Save</Button> + </Grid> + </Grid> +</Window> diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml.cs new file mode 100644 index 000000000..f0e35726e --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; +using Tango.DispenserAnalyzer.UI.ViewModels; + +namespace Tango.DispenserAnalyzer.UI.View +{ + /// <summary> + /// Interaction logic for SettingsWnd.xaml + /// </summary> + public partial class SettingsWnd : Window + { + public SettingsWnd() + { + InitializeComponent(); + DataContext = new SettingsVM(); + Loaded += Window_loaded; + } + + private void Window_loaded(object sender, RoutedEventArgs e) + { + Application curApp = Application.Current; + Window mainWindow = curApp.MainWindow; + this.Left = mainWindow.Left + (mainWindow.Width - this.ActualWidth) / 2; + this.Top = mainWindow.Top + (mainWindow.Height - this.ActualHeight) / 2; + } + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs index 1182d5301..ab571ec43 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs @@ -27,6 +27,7 @@ using System.Windows.Media.Imaging; using PdfSharp; using OxyPlot.Reporting; using System.Threading; +using Tango.DispenserAnalyzer.UI.View; namespace Tango.DispenserAnalyzer.UI.ViewModels { @@ -144,12 +145,14 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels public RelayCommand OpenCSVFileCommand { get; set; } public RelayCommand GenerateCommand { get; set; } + public RelayCommand OpenSettingWndCommand { get; set; } public MainWindowVM() { OpenCSVFileCommand = new RelayCommand(OpenCSVFile); GenerateCommand = new RelayCommand(Generate, CanGenerate); - + OpenSettingWndCommand = new RelayCommand(OpenSettingWnd); + YFormatter = value => value.ToString(); _from = 0; _to = 1; @@ -160,6 +163,18 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels this.Points = new List<DataPoint>(); } + + #region Settings + + public void OpenSettingWnd() + { + SettingsWnd settings = new SettingsWnd(); + settings.Owner = System.Windows.Application.Current.MainWindow; + settings.ShowDialog(); + } + + #endregion + #region Read File private void OpenCSVFile() { @@ -209,6 +224,7 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels } } #endregion + #region Generate public bool CanGenerate() { @@ -351,10 +367,11 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels string pngPlotFileName = String.Format($"{fileNameWithoutExtension}_Plottest{index}.png"); File.Delete(pngPlotFileName); System.Windows.Controls.Image plotImage = new System.Windows.Controls.Image(); - using (var stream = File.Open(pngPlotFileName, FileMode.Create, FileAccess.ReadWrite)) + //print plot to png file - removed 2/07/2020 + //using (var stream = File.Open(pngPlotFileName, FileMode.Create, FileAccess.ReadWrite)) { PngExporter exporter = new PngExporter() { Width = (int)item.ActualWidth, Height = (int)item.ActualHeight, Background = OxyColors.White, Resolution = 96 }; - exporter.Export(item.ActualModel, stream); + //exporter.Export(item.ActualModel, stream); BitmapSource bitmap = exporter.ExportToBitmap(item.ActualModel); plotImage.Source = bitmap; @@ -400,7 +417,10 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels FixedDocument fixedDoc = new FixedDocument(); PageContent pageContent = new PageContent(); FixedPage fixedPage = new FixedPage(); + fixedPage.Width = reportSize.Width; + fixedPage.Height = reportSize.Height; fixedPage.Children.Add(ResultsPanel); + fixedPage.UpdateLayout(); pageContent.BeginInit(); ((System.Windows.Markup.IAddChild)pageContent).AddChild(fixedPage); @@ -445,8 +465,8 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels private static Size GetReportSize(ItemsControl reportContainer) { - double reportWidth = reportContainer.ActualWidth; - double reportHeight = reportContainer.ActualHeight;// (reportWidth / printDialog.PrintableAreaWidth) * printDialog.PrintableAreaHeight; + double reportWidth = reportContainer.ActualWidth + 10; + double reportHeight = reportContainer.ActualHeight + 10;// (reportWidth / printDialog.PrintableAreaWidth) * printDialog.PrintableAreaHeight; return new Size(reportWidth, reportHeight); } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/SettingsVM.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/SettingsVM.cs new file mode 100644 index 000000000..99b6e948a --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/SettingsVM.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.DispenserAnalyzer.UI.Models; +using Tango.SharedUI; + +namespace Tango.DispenserAnalyzer.UI.ViewModels +{ + public class SettingsVM : ViewModel + { + private ObservableCollection<SettingsModel> _PBUSettings; + + public ObservableCollection<SettingsModel> PBUTestSettings + { + get { return _PBUSettings; } + set { _PBUSettings = value; RaisePropertyChangedAuto(); } + } + + private ObservableCollection<SettingsModel> _flowTestSettings; + + public ObservableCollection<SettingsModel> FlowTestSettings + { + get { return _flowTestSettings; } + set { _flowTestSettings = value; RaisePropertyChangedAuto(); } + } + + public SettingsVM() + { + _PBUSettings = new ObservableCollection<SettingsModel>(); + InitPBUTestSettings(); + _flowTestSettings = new ObservableCollection<SettingsModel>(); + InitFlowTestSettings(); + } + + private void InitPBUTestSettings() + { + _PBUSettings.Add(new SettingsModel("PBU Pass fail", "4.5 sec", 4.5)); + } + + private void InitFlowTestSettings() + { + _flowTestSettings.Add(new SettingsModel("PBU Pass fail", "4.5 sec", 4.5)); + _flowTestSettings.Add(new SettingsModel("Exclude from analysis", "1800 reads", 1800)); + _flowTestSettings.Add(new SettingsModel("Avg value", "1400-1850 [mbar]", 1400)); + _flowTestSettings.Add(new SettingsModel("Max-Min range", "500 reads", 500)); + _flowTestSettings.Add(new SettingsModel("Max Min intervals", "300 reads", 300)); + _flowTestSettings.Add(new SettingsModel("Max error", "1.5%", 1.5)); + _flowTestSettings.Add(new SettingsModel("Take off 'Max-min' values (out of highest results)", "3", 3)); + } + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.EventsTypesGenerator/Program.cs b/Software/Visual_Studio/Utilities/Tango.EventsTypesGenerator/Program.cs index e217076a1..25152d63f 100644 --- a/Software/Visual_Studio/Utilities/Tango.EventsTypesGenerator/Program.cs +++ b/Software/Visual_Studio/Utilities/Tango.EventsTypesGenerator/Program.cs @@ -16,7 +16,7 @@ namespace Tango.EventsTypesGenerator { class Program { - private static string EVENTS_FILE = "Tango alarm events handling chart_Rev17.xlsx"; + private static string EVENTS_FILE = "Tango alarm events handling chart_Rev21.xlsx"; private class ExcelEventType { diff --git a/Software/Visual_Studio/Utilities/Tango.EventsTypesGenerator/Tango.EventsTypesGenerator.csproj b/Software/Visual_Studio/Utilities/Tango.EventsTypesGenerator/Tango.EventsTypesGenerator.csproj index 6c00c03e8..f26ff09d5 100644 --- a/Software/Visual_Studio/Utilities/Tango.EventsTypesGenerator/Tango.EventsTypesGenerator.csproj +++ b/Software/Visual_Studio/Utilities/Tango.EventsTypesGenerator/Tango.EventsTypesGenerator.csproj @@ -72,6 +72,10 @@ <Link>Tango alarm events handling chart_Rev17.xlsx</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> + <None Include="..\..\Resources\Tango alarm events handling chart_Rev21.xlsx"> + <Link>Tango alarm events handling chart_Rev21.xlsx</Link> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> <None Include="App.config" /> <None Include="packages.config" /> <None Include="Events.xlsx"> |
