diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-08-03 12:36:24 +0300 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-08-03 12:36:24 +0300 |
| commit | f2a27972ca652ef568e5eede22d86f9698a08cca (patch) | |
| tree | 6c55d21cba6bfa8587d95fd27e17a5ec423b3b0d /Software | |
| parent | bd1221e36ee3e493dc25bd32559f846519fe60d0 (diff) | |
| parent | 05fc7b1f37ecc809acf65422a799a4d761b78acb (diff) | |
| download | Tango-f2a27972ca652ef568e5eede22d86f9698a08cca.tar.gz Tango-f2a27972ca652ef568e5eede22d86f9698a08cca.zip | |
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software')
70 files changed, 2028 insertions, 519 deletions
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 626a4ec8d..6fa7c0fdf 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,36}; +TangoVersion_t _gTangoVersion = {1,4,6,37}; #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 64717ec0c..7ae727e09 100644 --- a/Software/Embedded_SW/Embedded/DataDef.h +++ b/Software/Embedded_SW/Embedded/DataDef.h @@ -28,7 +28,7 @@ //#define EMC_FORCE_MOT_CLOCK_INTERNAL -//#define VAC_TEST +//#define VAC_TESTHeadCard_Actuators_Stub //#define SPECIAL_DISPENSERS extern bool Special_Dispensers; @@ -385,10 +385,10 @@ typedef union typedef enum { HEAD_TYPE_UNKNOWN, - HEAD_TYPE_SYLKO_WITHOUT_CARD, + HEAD_TYPE_FLAT_WITHOUT_CARD, HEAD_TYPE_UNKNOWN_WITH_CARD, - HEAD_TYPE_SYLKO, - HEAD_TYPE_STAPLE_SPUN, + HEAD_TYPE_FLAT, + HEAD_TYPE_ARC, }HEAD_TYPE; extern uint8_t Head_Type; diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c index 6069c78ff..303d5a43d 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c @@ -433,17 +433,21 @@ bool FPGA_Read_limit_Switches(FPGA_GPI_ENUM Limit_Switch) LM_Status = LS_Left.bits.F1_LS_LSPARE2; break; case I2C_HEADCARD_COVER_LS_FRONT: - if(Head_Type == HEAD_TYPE_SYLKO) - LM_Status = !(Head_I2C_EXP4_0x46.bits.INPUT_LS_FRONT); + case I2C_HEADCARD_ARC_LS_ACTUATOR: + LM_Status = !(Head_I2C_EXP4_0x46.bits.INPUT_LS_FRONT_ARC_ACT); break; case I2C_HEADCARD_COVER_LS_REAR: - if(Head_Type == HEAD_TYPE_SYLKO) - LM_Status = !(Head_I2C_EXP4_0x46.bits.INPUT_LS_REAR); + case I2C_HEADCARD_COVER_LS_ARC: + LM_Status = !(Head_I2C_EXP4_0x46.bits.INPUT_LS_REAR_ARC_COVER); break; case I2C_HEADCARD_COVER_LS_UPPER: - if(Head_Type == HEAD_TYPE_SYLKO) + if(Head_Type == HEAD_TYPE_FLAT) LM_Status = !(Head_I2C_EXP4_0x46.bits.INPUT_LS_UP); break; + case I2C_HEADCARD_COVER_LS_TUNNEL_ARC: + if(Head_Type == HEAD_TYPE_ARC) + LM_Status = !(Head_I2C_EXP4_0x46.bits.INPUT_LS_ARC_TUNNEL_COVER); + break; default : LM_Status = NO_LIMIT; break; @@ -528,7 +532,7 @@ uint32_t MagnetControlId = 0xFF; uint32_t MagnetCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) { - if(Head_Type == HEAD_TYPE_SYLKO) + if(Head_Type == HEAD_TYPE_FLAT) Trigger_Head_Magnet(DISABLE_MAGNET); //HeadCard_HeadMagnet_Disable(); else @@ -547,7 +551,7 @@ uint32_t ActivateHeadMagnet() Report("ActivateHeadMagnet - Close the lid magnet",__FILE__,__LINE__,(int)HARDWARE_MOTOR_TYPE__MOTO_RLOADARM,RpWarning,(int)DH_LID_OPEN,0); //WHS_Start_Blower_Control_Closed_Loop(BlowerSetPoint); //Task_sleep(500); - if(Head_Type == HEAD_TYPE_SYLKO) + if(Head_Type == HEAD_TYPE_FLAT) //HeadCard_ActivateHeadMagnet(); Trigger_Head_Magnet(CLOSE_MAGNET); else @@ -578,7 +582,7 @@ uint32_t DeActivateHeadMagnet() //WHS_Start_Blower_Control_Closed_Loop(0.0); - if(Head_Type == HEAD_TYPE_SYLKO) + if(Head_Type == HEAD_TYPE_FLAT) { Trigger_Head_Magnet(OPEN_MAGNET); //HeadCard_DeActivateHeadMagnet(); diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h index 0ff0fa2de..a7999ea2e 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h @@ -162,6 +162,9 @@ typedef enum I2C_HEADCARD_COVER_LS_FRONT, I2C_HEADCARD_COVER_LS_REAR, I2C_HEADCARD_COVER_LS_UPPER, + I2C_HEADCARD_ARC_LS_ACTUATOR, + I2C_HEADCARD_COVER_LS_ARC, + I2C_HEADCARD_COVER_LS_TUNNEL_ARC, //----------------------- MAX_GPI diff --git a/Software/Embedded_SW/Embedded/Drivers/Heater/Heater.c b/Software/Embedded_SW/Embedded/Drivers/Heater/Heater.c index 824858dfd..960e6cfae 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Heater/Heater.c +++ b/Software/Embedded_SW/Embedded/Drivers/Heater/Heater.c @@ -125,7 +125,7 @@ uint32_t ActivateHeater (int HeaterId) } else { //F2_CTRL |= portMap[HeaterId].m_pin; - if(Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + if(Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) HeadCard_Control_Heaters(HeaterTypetoHeadHeater[HeaterId],ON); else { @@ -194,7 +194,7 @@ uint32_t DeActivateHeater (int HeaterId) } else { - if(Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + if(Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) HeadCard_Control_Heaters(HeaterTypetoHeadHeater[HeaterId],OFF); else { @@ -252,7 +252,7 @@ bool GetHeaterState (int HeaterId) } else { - if(Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + if(Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) { return(Get_HeadCard_Heater_State(HeaterTypetoHeadHeater[HeaterId])); } diff --git a/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c b/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c index 23accb66a..68392c72f 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c +++ b/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c @@ -180,7 +180,7 @@ int TemperatureSensorRead(TEMPERATURE_SENSOR_ID_ENUM SensorId) int TemperatureListString(char* str) { int len; - if(Head_Type == HEAD_TYPE_SYLKO) + if(Head_Type == HEAD_TYPE_FLAT) { len = usnprintf(str, 160, "Prepare H1: ,%d, H2: ,%d, H3: ,%d, H4: ,%d, H5: ,%d, H6: ,%d, H7: ,%d, H8: ,%d, H9: ,%d, H10: ,%d, H11: ,%d, H12: ,%d, M: ,%d, D: ,%d,", TempSensorResponse[HEAD_PT100_ZONE_1_0X80_0].Temperature_C_mult_by_100/100, TempSensorResponse[HEAD_PT100_ZONE_2_0X80_1].Temperature_C_mult_by_100/100, @@ -192,7 +192,7 @@ int TemperatureListString(char* str) TempSensorResponse[HEAD_PT100_MIXER_0X8E_0].Temperature_C_mult_by_100/100, TempSensorResponse[TEMP_SENSE_ANALOG_DRYER_TEMP1].Temperature_C_mult_by_100/100); } - else if(Head_Type == HEAD_TYPE_SYLKO_WITHOUT_CARD) + else if(Head_Type == HEAD_TYPE_FLAT_WITHOUT_CARD) { len = usnprintf(str, 150, "Prepare H1: %d H2: %d H3: %d H4: %d H5: %d H6: %d D1: %d D2: %d D3: %d M: %d",TempSensorResponse[TEMP_SENSE_ANALOG_DYEINGH_TEMP1].Temperature_C_mult_by_100/100, TempSensorResponse[TEMP_SENSE_ANALOG_DYEINGH_TEMP2].Temperature_C_mult_by_100/100,TempSensorResponse[TEMP_SENSE_ANALOG_DYEINGH_TEMP3].Temperature_C_mult_by_100/100, @@ -202,7 +202,7 @@ int TemperatureListString(char* str) ,TempSensorResponse[MIXER_PT100].Temperature_C_mult_by_100/100); //Prepare H1: 78 H2: 111 H3: 137 H4: 135 H5: 144 H6: 75 D1: 120 D2: 167 D3: 158 M: 129 } - else if(Head_Type == HEAD_TYPE_STAPLE_SPUN) + else if(Head_Type == HEAD_TYPE_ARC) { len = usnprintf(str, 160, "Prepare H1: ,%d, H2: ,%d, H3: ,%d, AL1: AR1: M: ,%d, D: ,%d,", TempSensorResponse[HEAD_PT100_ZONE_1_0X80_0].Temperature_C_mult_by_100/100, TempSensorResponse[HEAD_PT100_ZONE_2_0X80_1].Temperature_C_mult_by_100/100, @@ -457,8 +457,8 @@ uint32_t CalculateTemperatures(TEMPERATURE_SENSOR_ID_ENUM SensorId, uint32_t Dat uint32_t NoOfAvrSamples = 5;//TODO - how many Samples Status = Filter_Temparature_Measurement(SensorId, Current_Measurement_C, NoOfAvrSamples); #else - if((Head_Type == HEAD_TYPE_STAPLE_SPUN) && (( SensorId == HEAD_PT100_ZONE_6_0X84_1) || ( SensorId == HEAD_PT100_ZONE_8_0X86_1) || ( SensorId == HEAD_PT100_ZONE_5_0X84_0) || ( SensorId == HEAD_PT100_ZONE_7_0X86_0)))//pressure sensors - //if((Head_Type == HEAD_TYPE_STAPLE_SPUN) && (( SensorId == HEAD_PT100_ZONE_5_0X84_0) || ( SensorId == HEAD_PT100_ZONE_7_0X86_0)))//pressure sensors + if((Head_Type == HEAD_TYPE_ARC) && (( SensorId == HEAD_PT100_ZONE_6_0X84_1) || ( SensorId == HEAD_PT100_ZONE_8_0X86_1) || ( SensorId == HEAD_PT100_ZONE_5_0X84_0) || ( SensorId == HEAD_PT100_ZONE_7_0X86_0)))//pressure sensors + //if((Head_Type == HEAD_TYPE_ARC) && (( SensorId == HEAD_PT100_ZONE_5_0X84_0) || ( SensorId == HEAD_PT100_ZONE_7_0X86_0)))//pressure sensors { //Head Staple spun pressure sensors //bits to mvolts diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c index 9f2e929d5..2d2de930b 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c @@ -418,7 +418,7 @@ uint32_t Heaters_Current_Bits[9];//just for debug void Enable_Reading_Heaters_Current(HEATERS_CURRENT Heater_ID) //0-8 { - if((Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD)&&(Heater_ID>=HEATER_DRYER_CURRENT_3)) + if((Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD)&&(Heater_ID>=HEATER_DRYER_CURRENT_3)) return; if (Heater_ID>=NUM_OF_CURRENT_HEATERS) return; @@ -426,7 +426,7 @@ void Enable_Reading_Heaters_Current(HEATERS_CURRENT Heater_ID) //0-8 } void Disable_Reading_Heaters_Current(HEATERS_CURRENT Heater_ID) //0-8 { - if((Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD)&&(Heater_ID>=HEATER_DRYER_CURRENT_3)) + if((Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD)&&(Heater_ID>=HEATER_DRYER_CURRENT_3)) return; if (Heater_ID>=NUM_OF_CURRENT_HEATERS) return; @@ -434,7 +434,7 @@ void Disable_Reading_Heaters_Current(HEATERS_CURRENT Heater_ID) //0-8 } bool Get_Heater_Current_Reading_State(HEATERS_CURRENT Heater_ID) //0-8 { - if((Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD)&&(Heater_ID>=HEATER_DRYER_CURRENT_3)) + if((Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD)&&(Heater_ID>=HEATER_DRYER_CURRENT_3)) return false; if (Heater_ID>=NUM_OF_CURRENT_HEATERS) return false; @@ -444,7 +444,7 @@ bool Get_Heater_Current_Reading_State(HEATERS_CURRENT Heater_ID) //0-8 uint32_t Read_Heaters_Current(HEATERS_CURRENT Heater_ID) //0-8 { uint32_t Status = OK; - if((Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD)&&(Heater_ID>=HEATER_DRYER_CURRENT_3)) + if((Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD)&&(Heater_ID>=HEATER_DRYER_CURRENT_3)) return 0; if (Heater_ID>=NUM_OF_CURRENT_HEATERS) 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 0d767b864..af0c5511d 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 @@ -126,29 +126,29 @@ uint32_t Check_Head_Type_Via_EEPROM() if((Head_i2c_status == I2C_MASTER_ERR_ADDR_ACK)||(status == 0xFF)) { - Head_Type = HEAD_TYPE_SYLKO_WITHOUT_CARD; + Head_Type = HEAD_TYPE_FLAT_WITHOUT_CARD; } else { - if(Read_Buf[1] == HEAD_TYPE_STAPLE_SPUN) + if(Read_Buf[1] == HEAD_TYPE_ARC) { - Head_struct.Read_Head_EEPROM.bytes.HeadType = HEAD_TYPE_STAPLE_SPUN; + Head_struct.Read_Head_EEPROM.bytes.HeadType = HEAD_TYPE_ARC; } else { - Head_struct.Read_Head_EEPROM.bytes.HeadType = HEAD_TYPE_SYLKO; + Head_struct.Read_Head_EEPROM.bytes.HeadType = HEAD_TYPE_FLAT; } Head_struct.Read_Head_EEPROM.bytes.Head_SN = Read_Buf[0]; - //Head_struct.Read_Head_EEPROM.bytes.HeadType = Read_Buf[1]; //HEAD_TYPE_SYLKO / HEAD_TYPE_STAPLE_SPUN + //Head_struct.Read_Head_EEPROM.bytes.HeadType = Read_Buf[1]; //HEAD_TYPE_SYLKO / HEAD_TYPE_ARC Head_Type = Head_struct.Read_Head_EEPROM.bytes.HeadType; //Head_Type = HEAD_TYPE_UNKNOWN_WITH_CARD; - if identify the type by reading the PT100 } #else - Head_Type = HEAD_TYPE_SYLKO_WITHOUT_CARD; + Head_Type = HEAD_TYPE_FLAT_WITHOUT_CARD; #endif return status; diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/I2C_Head_Mux.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/I2C_Head_Mux.c index f8a425e36..0a53550e7 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/I2C_Head_Mux.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/I2C_Head_Mux.c @@ -18,7 +18,7 @@ uint32_t Select_Main_Head_Mux_Channel() { uint32_t status= OK; - if (Head_Type == HEAD_TYPE_SYLKO_WITHOUT_CARD) + if (Head_Type == HEAD_TYPE_FLAT_WITHOUT_CARD) return OK; uint8_t Write_Buf[1]; diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.c index 1ac0e439b..800684813 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.c @@ -117,7 +117,7 @@ uint32_t Head_IO_Init() Head_I2C_EXP2_0x42.bits.OUTPUT_ACTLOW_HTIN_LATCH_RST = 0x01; Head_I2C_EXP2_0x42.bits.OUTPUT_ACTLOW_HTOT_LATCH_RST = 0x01; - if(Head_Type == HEAD_TYPE_STAPLE_SPUN)// Set 24 to pressure sensor in arc head + if(Head_Type == HEAD_TYPE_ARC)// Set 24 to pressure sensor in arc head { Head_I2C_EXP2_0x42.bits.OUTPUT_MAG_EN = ENABLE; Head_I2C_EXP2_0x42.bits.OUTPUT_MAG_DIR = 0x00; @@ -329,7 +329,7 @@ uint32_t HeadCard_ActivateHeadMagnet() { uint32_t status = OK; - if(Head_Type == HEAD_TYPE_SYLKO) + if(Head_Type == HEAD_TYPE_FLAT) { Head_I2C_EXP2_0x42.bits.OUTPUT_MAG_EN = ENABLE; Head_I2C_EXP2_0x42.bits.OUTPUT_MAG_DIR = 0x01;//? @@ -343,7 +343,7 @@ uint32_t HeadCard_DeActivateHeadMagnet() { uint32_t status = OK; - if(Head_Type == HEAD_TYPE_SYLKO) + if(Head_Type == HEAD_TYPE_FLAT) { Head_I2C_EXP2_0x42.bits.OUTPUT_MAG_EN = ENABLE; Head_I2C_EXP2_0x42.bits.OUTPUT_MAG_DIR = 0x00;//? @@ -356,7 +356,7 @@ uint32_t HeadCard_DeActivateHeadMagnet() uint32_t HeadCard_HeadMagnet_Disable() { uint32_t status = OK; - if(Head_Type == HEAD_TYPE_SYLKO) + if(Head_Type == HEAD_TYPE_FLAT) { Head_I2C_EXP2_0x42.bits.OUTPUT_MAG_EN = DISABLE; status |= Head_Write_IO_Reg(0x42,LOW); @@ -368,7 +368,7 @@ uint32_t HeadCard_ActivateHeadPressureArcBlowers() { uint32_t status = OK; //MAG_EN<=’1’, MAG_DIR<=’0’ - Board is powered by 24V. - if(Head_Type == HEAD_TYPE_STAPLE_SPUN) + if(Head_Type == HEAD_TYPE_ARC) { Head_I2C_EXP2_0x42.bits.OUTPUT_MAG_EN = ENABLE; Head_I2C_EXP2_0x42.bits.OUTPUT_MAG_DIR = 0x00; @@ -381,7 +381,7 @@ uint32_t HeadCard_DeActivateHeadPressureArcBlowers() { uint32_t status = OK; //MAG_EN<=’0’, MAG_DIR<=’0’ -- no 24V on the board - if(Head_Type == HEAD_TYPE_STAPLE_SPUN) + if(Head_Type == HEAD_TYPE_ARC) { Head_I2C_EXP2_0x42.bits.OUTPUT_MAG_EN = DISABLE; Head_I2C_EXP2_0x42.bits.OUTPUT_MAG_DIR = 0x00; @@ -552,7 +552,7 @@ uint32_t HeadCard_ActStubCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) / else Report("Remove control callback failed",__FILE__,__LINE__,(int)ActControlId,RpWarning,(int)HeadCard_ActStubCallBackFunction,0); - Report("HeadCard_ActStubCallBackFunction",__FILE__,__LINE__,(int)ActControlId,RpWarning,(int)Act_ID,0); + //Report("HeadCard_ActStubCallBackFunction",__FILE__,__LINE__,(int)ActControlId,RpWarning,(int)Act_ID,0); if(Act_ID == ACTIN)//0 { Head_I2C_EXP4_0x46.bits.OUTPUT_ACTLOW_ACTIN_ON = HIGH; @@ -569,6 +569,9 @@ uint32_t HeadCard_ActStubCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) / uint32_t HeadCard_Actuators_Stub(ACTUATORS Act_ID, bool Enable, bool Direction)//ENABLE/DISABLE, DOWN/UP/DONTCARE { uint32_t status = OK; + if (Head_Type != HEAD_TYPE_FLAT) + return OK; + Report("HeadCard_Actuators_Stub",__FILE__,Act_ID,(int)Enable,RpWarning,(int)Direction,0); if(Enable == true) @@ -602,15 +605,15 @@ uint32_t HeadCard_Actuators_Stub(ACTUATORS Act_ID, bool Enable, bool Direction)/ { Head_I2C_EXP4_0x46.bits.OUTPUT_ACTLOW_ACTOT_ON = HIGH; } - if (RemoveControlCallback(ActControlId, HeadCard_ActStubCallBackFunction )==OK) - ActControlId = 0xFF; - else - Report("Remove control callback failed",__FILE__,__LINE__,(int)ActControlId,RpWarning,(int)HeadCard_ActStubCallBackFunction,0); + if (ActControlId != 0xFF) + { + if (RemoveControlCallback(ActControlId, HeadCard_ActStubCallBackFunction )==OK) + ActControlId = 0xFF; + else + Report("Remove control callback failed",__FILE__,__LINE__,(int)ActControlId,RpWarning,(int)HeadCard_ActStubCallBackFunction,0); + } } - status |= Head_Write_IO_Reg(0x42,HIGH); - status |= Head_Write_IO_Reg(0x46,LOW_AND_HIGH); - return status; } @@ -737,7 +740,7 @@ bool isActuatorOnLowestLocation(void) // Give indication if the actuator stopped uint32_t HeadCard_Actuators_Relocate_callback(uint32_t IfIndex, uint32_t BusyFlag) // use IfIndex for Act_ID { count_time++; - //ReportWithPackageFilter(ThreadFilter,"actuators relocation",__FILE__,msec_millisecondCounter,ActuatorLocating,RpMessage,count_time,0); + ReportWithPackageFilter(ThreadFilter,"actuators relocation",__FILE__,msec_millisecondCounter,ActuatorLocating,RpMessage,count_time,0); switch (ActuatorLocating) { case ActuatorIdle: @@ -752,7 +755,7 @@ uint32_t HeadCard_Actuators_Relocate_callback(uint32_t IfIndex, uint32_t BusyFla } break; case ActuatorWait: - if (isActuatorOnLowestLocation())//read the inputs in Hundred_msTick + if ((isActuatorOnLowestLocation())||(count_time>200))//read the inputs in Hundred_msTick { Trigger_Head_Actuators_Stub(ACTIN, ENABLE, UP); moveuptime = count_time; @@ -784,13 +787,20 @@ uint32_t HeadCard_Actuators_Relocate_callback(uint32_t IfIndex, uint32_t BusyFla } uint32_t HeadCard_Actuators_Relocate(void) { - if ((ActuatorLocating == ActuatorIdle)||(ActuatorLocating == ActuatorLocated)) + if (Head_Type != HEAD_TYPE_FLAT) + return OK; + //if ((ActuatorLocating == ActuatorIdle)||(ActuatorLocating == ActuatorLocated)) { + Trigger_Head_Actuators_Stub(ACTIN, DISABLE, DONTCARE); ActuatorLocating = ActuatorMoveDown; count_time = 0; ReportWithPackageFilter(ThreadFilter,"actuators relocation",__FILE__,msec_millisecondCounter,ActuatorLocating,RpMessage,count_time,0); ActuatorLocatingControl = AddControlCallback("Actuator Location", HeadCard_Actuators_Relocate_callback, eTenMillisecond, TemplateDataReadCBFunction,0,0, 0 ); } + /*else + { + ReportWithPackageFilter(ThreadFilter,"actuators relocation FAILED",__FILE__,__LINE__,ActuatorLocating,RpMessage,count_time,0); + }*/ return ActuatorLocatingControl; } diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.h b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.h index 33187d1f6..bfaf5937d 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.h +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.h @@ -138,19 +138,19 @@ typedef union bool IN_ACTLOW_OCUR_BREAK_HTOT2 : 1; //P01 bool IN_ACTLOW_OCUR_BREAK_HTOT3 : 1; //P02 bool IN_ACTLOW_OCUR_BREAK_HTOT4 : 1; //P03 - bool INPUT_BREAK_MIX : 1; //P04 - bool INPUT_ACTLOW_LIMIT_740W : 1; //P05 - bool INPUT_FAN_ALERT : 1; //P06 - bool OUTPUT_ACT_DIR : 1; //P07 + bool INPUT_BREAK_MIX : 1; //P04 + bool INPUT_ACTLOW_LIMIT_740W : 1; //P05 + bool INPUT_FAN_ALERT : 1; //P06 + bool OUTPUT_ACT_DIR : 1; //P07 - bool INPUT_ACTIN_EN : 1; //p10 - bool INPUT_ACTOT_EN : 1; //p11 - bool OUTPUT_ACTLOW_ACTIN_ON : 1; //p12 - bool OUTPUT_ACTLOW_ACTOT_ON : 1; //p13 - bool INPUT_LS_FRONT : 1; //p14 - bool INPUT_LS_REAR : 1; //p15 - bool INPUT_LS_UP : 1; //p16 - bool INPUT_LS_SPARE : 1; //p17 + bool INPUT_ACTIN_EN : 1; //p10 + bool INPUT_ACTOT_EN : 1; //p11 + bool OUTPUT_ACTLOW_ACTIN_ON : 1; //p12 + bool OUTPUT_ACTLOW_ACTOT_ON : 1; //p13 + bool INPUT_LS_FRONT_ARC_ACT : 1; //p14 + bool INPUT_LS_REAR_ARC_COVER : 1; //p15 + bool INPUT_LS_UP : 1; //p16 + bool INPUT_LS_ARC_TUNNEL_COVER : 1; //p17 }bits; unsigned char uchar[2]; unsigned short ushort; diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/PT100/Head_PT100_ADC.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/PT100/Head_PT100_ADC.c index 108676b47..ec27b4f57 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/PT100/Head_PT100_ADC.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/PT100/Head_PT100_ADC.c @@ -263,7 +263,7 @@ uint8_t HeadADCPT100_InitConfigReg() for(i=HEAD_PT100_ZONE_1_0X80_0;i < MAX_HEAD_CARD_TEMP_SENS_ID;i++) // for now we are using the same configuration to all of them { - if((Head_Type == HEAD_TYPE_STAPLE_SPUN) && (( i == HEAD_PT100_ZONE_6_0X84_1) || ( i == HEAD_PT100_ZONE_8_0X86_1) || ( i == HEAD_PT100_ZONE_5_0X84_0) || ( i == HEAD_PT100_ZONE_7_0X86_0)))//pressure sensors + if((Head_Type == HEAD_TYPE_ARC) && (( i == HEAD_PT100_ZONE_6_0X84_1) || ( i == HEAD_PT100_ZONE_8_0X86_1) || ( i == HEAD_PT100_ZONE_5_0X84_0) || ( i == HEAD_PT100_ZONE_7_0X86_0)))//pressure sensors { // - - - - - - - - - - Reg0 - - - - - - - - - - HeadTempSensConfig[i].Reg0.bits.PGA_BYPASS = ADS122X_PGA_BYPASS ;//Bit 0 @@ -335,7 +335,7 @@ uint8_t HeadADCPT100_InitConfigReg() for(i=HEAD_PT100_ZONE_2_0X80_1;i < HEAD_PT100_RESERVE_0X8E_1;i++) { - if((Head_Type == HEAD_TYPE_STAPLE_SPUN) && (( i == HEAD_PT100_ZONE_6_0X84_1) || ( i == HEAD_PT100_ZONE_8_0X86_1)))//pressure sensors + if((Head_Type == HEAD_TYPE_ARC) && (( i == HEAD_PT100_ZONE_6_0X84_1) || ( i == HEAD_PT100_ZONE_8_0X86_1)))//pressure sensors { HeadTempSensConfig[i].Reg0.bits.MUX = HEAD_CONFIG_ODD_PT100_MUX ;//Bits 4-7 } @@ -762,7 +762,7 @@ uint32_t control_HeadCard_PT100(uint8_t HEAD_CONFIG_PT100_MUX) //delayms(5); for(SensorId = HEAD_PT100_ZONE_2_0X80_1; SensorId < HEAD_PT100_RESERVE_0X8E_1; SensorId++) { - if((Head_Type == HEAD_TYPE_STAPLE_SPUN) && (( SensorId == HEAD_PT100_ZONE_6_0X84_1) || ( SensorId == HEAD_PT100_ZONE_8_0X86_1)))//pressure sensors + if((Head_Type == HEAD_TYPE_ARC) && (( SensorId == HEAD_PT100_ZONE_6_0X84_1) || ( SensorId == HEAD_PT100_ZONE_8_0X86_1)))//pressure sensors { //Config_Mux } @@ -818,7 +818,7 @@ uint32_t control_HeadCard_PT100(uint8_t HEAD_CONFIG_PT100_MUX) //delayms(5); for(SensorId = HEAD_PT100_ZONE_1_0X80_0; SensorId < HEAD_PT100_ZONE_2_0X80_1; SensorId++) { - if((Head_Type == HEAD_TYPE_STAPLE_SPUN) && (( SensorId == HEAD_PT100_ZONE_5_0X84_0) || ( SensorId == HEAD_PT100_ZONE_7_0X86_0)))//pressure sensors + if((Head_Type == HEAD_TYPE_ARC) && (( SensorId == HEAD_PT100_ZONE_5_0X84_0) || ( SensorId == HEAD_PT100_ZONE_7_0X86_0)))//pressure sensors { } @@ -1004,12 +1004,12 @@ uint32_t Detect_Head_PT100_Faults(TEMPERATURE_SENSOR_ID_ENUM SensorId) if((ERR_Couner >= 9) && (ERR_Couner < 14) || ((Detect_PT100_Faults[HEAD_PT100_AIR_HEATER_1_0X8C_0] == OK ) || (Detect_PT100_Faults[HEAD_PT100_AIR_HEATER_2_0X8C_1] == OK )) ) { - //Head_Type = HEAD_TYPE_STAPLE_SPUN; + //Head_Type = HEAD_TYPE_ARC; if(ERR_Couner==9) - ReportWithPackageFilter(GeneralFilter,"HEAD_TYPE_STAPLE_SPUN",__FILE__,__LINE__,ERR_Couner,RpMessage,0,0); + ReportWithPackageFilter(GeneralFilter,"HEAD_TYPE_ARC",__FILE__,__LINE__,ERR_Couner,RpMessage,0,0); else - ReportWithPackageFilter(HeatersFilter,"HEAD_TYPE_STAPLE_SPUN with PT100 not working",__FILE__,__LINE__,ERR_Couner,RpError, Detect_PT100_Faults[HEAD_PT100_AIR_HEATER_1_0X8C_0] +2*(Detect_PT100_Faults[HEAD_PT100_AIR_HEATER_2_0X8C_1]),0); + ReportWithPackageFilter(HeatersFilter,"HEAD_TYPE_ARC with PT100 not working",__FILE__,__LINE__,ERR_Couner,RpError, Detect_PT100_Faults[HEAD_PT100_AIR_HEATER_1_0X8C_0] +2*(Detect_PT100_Faults[HEAD_PT100_AIR_HEATER_2_0X8C_1]),0); } else if((ERR_Couner >= 2) && (ERR_Couner < 9)) { diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/I2C_Task.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/I2C_Task.c index 90f197587..7d2cf7868 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/I2C_Task.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/I2C_Task.c @@ -631,7 +631,7 @@ void I2C_ReadingTask(UArg arg0, UArg arg1) break; case Heater_Current_Reading: //Report("Read_Heaters_Current",__FILE__,__LINE__,255,RpWarning,0,0); - if((Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD)&&(I2C_ReadingMessage.parameter>=HEATER_DRYER_CURRENT_3)) + if((Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD)&&(I2C_ReadingMessage.parameter>=HEATER_DRYER_CURRENT_3)) Read_Head_ADC(I2C_ReadingMessage.parameter); // else // Read_Heaters_Current(I2C_ReadingMessage.parameter); diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/NFC.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/NFC.c index 877f0a32b..8da522961 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/NFC.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/NFC.c @@ -175,6 +175,12 @@ RFID_RETURN_CODE TagReadData() return SUCCESS; } +RFID_RETURN_CODE WriteCRCValue() +{ + + return SUCCESS; +} + uint32_t RFIDTagComm_StateMachine(StateMachineMode Mode) { uint32_t Status = OK; @@ -184,7 +190,7 @@ uint32_t RFIDTagComm_StateMachine(StateMachineMode Mode) switch(TagStage) { case Tag_Idle: - //Not Active + //Tag Not Active break; case Tag_PrepareForDiscovery: @@ -245,7 +251,11 @@ uint32_t RFIDTagComm_StateMachine(StateMachineMode Mode) break; case Tag_UpdateCheckSum: - break; + crc_ccitt_init(); + //crc_ccitt_update(buf,len); + WriteCRCValue(); + + break; case Tag_DisconnectComm: RFIDRetValue = RFID_StopDiscovery(readerID); diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/logi-tag/LT_RFID.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/logi-tag/LT_RFID.c index 30a6d6f16..4171a62a6 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/logi-tag/LT_RFID.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/logi-tag/LT_RFID.c @@ -381,27 +381,29 @@ RFID_RETURN_CODE WriteValue( uint32_t readerID, NxpNci_RfIntf_t *tagInfo, uint8_ return retCode; } -RFID_RETURN_CODE ReadValue( uint32_t readerID, NxpNci_RfIntf_t *tagInfo, uint8_t *value, uint8_t valueIndex, uint32_t *valueNum ) + + +uint32_t ReadValue( uint32_t readerID, NxpNci_RfIntf_t *tagInfo, uint8_t *value, uint8_t valueIndex, RFID_RETURN_CODE *rfidCode ) { - RFID_RETURN_CODE retCode; + uint32_t retCode = 0; uint8_t i, data[512]; uint16_t succeededSize = 0; + uint8_t startBlock = GetBlockLocation( Fields[valueIndex].fieldLocation ); - retCode = RFID_CardModeReceive( readerID, tagInfo, data, startBlock, Fields[valueIndex].fieldLength + BLOCK_SIZE, &succeededSize); - if ( retCode != SUCCESS ) + *rfidCode = RFID_CardModeReceive( readerID, tagInfo, data, startBlock, Fields[valueIndex].fieldLength + BLOCK_SIZE, &succeededSize); + if ( *rfidCode != SUCCESS ) return retCode; memcpy( value, &data[ Fields[valueIndex].fieldLocation % BLOCK_SIZE], Fields[valueIndex].fieldLength ) ; if ( Fields[valueIndex].isNum == true ) { - *valueNum = 0; + retCode = 0; for ( i = 0; i < Fields[valueIndex].fieldLength; i++ ) { - *valueNum *= 10; - *valueNum += value[i] - '0'; - //*valueNum += value[i]; - //if ( i < Fields[valueIndex].fieldLength - 1 ) - // *valueNum <<= 8; + retCode *= 10; + retCode += value[i] - '0'; + } + } return retCode; } @@ -956,6 +958,29 @@ int incrementCounterAndCompare( uint32_t readerID, NxpNci_RfIntf_t *tagInfo, int return 1; } +void crc_ccitt_init(void) +{ + m_crc = 0xffff; +} + +void crc_ccitt_update(unsigned char * buf, int len) +{ + int i, j; + + for ( i = 0; i < len; i++ ) + { + m_crc ^= buf[i]; + for ( j = 0; j < 8; j++ ) + { + if ( m_crc & 0x0001 ) + m_crc = (m_crc >> 1) ^ 0x8408; + else + m_crc = (m_crc >> 1); + } + } +} + + void RFID_Test() { diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/logi-tag/LT_RFID.h b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/logi-tag/LT_RFID.h index 90860ea50..b07c79f4f 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/logi-tag/LT_RFID.h +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/logi-tag/LT_RFID.h @@ -56,6 +56,7 @@ typedef struct{ } FIELDS_LOCATIONS; FIELDS_LOCATIONS Fields[NUMBER_OF_FIELDS]; +unsigned int m_crc; RFID_RETURN_CODE RFID_Connect(uint32_t readerID); RFID_RETURN_CODE RFID_Disconnect(uint32_t readerID); @@ -70,7 +71,8 @@ RFID_RETURN_CODE RFID_CardModeSend(uint32_t readerID, NxpNci_RfIntf_t *tagInfo, bool IsTagValid(uint32_t readerID, NxpNci_RfIntf_t *tagInfo); uint32_t GetCounter (uint32_t readerID, NxpNci_RfIntf_t *tagInfo); RFID_RETURN_CODE WriteValue( uint32_t readerID, NxpNci_RfIntf_t *tagInfo, uint8_t *value, uint8_t valueIndex, uint32_t valueNum ); -RFID_RETURN_CODE ReadValue( uint32_t readerID, NxpNci_RfIntf_t *tagInfo, uint8_t *value, uint8_t valueIndex, uint32_t *valueNum ); + +uint32_t ReadValue( uint32_t readerID, NxpNci_RfIntf_t *tagInfo, uint8_t *value, uint8_t valueIndex, RFID_RETURN_CODE *rfidCode ); RFID_RETURN_CODE getUID( uint32_t readerID, NxpNci_RfIntf_t *tagInfo, uint8_t *uid ); void calcHash( uint8_t *input, uint16_t inputLen, uint8_t *output ); bool setHashValue( uint32_t readerID, NxpNci_RfIntf_t *tagInfo, uint8_t *uid, uint16_t inputLen ); @@ -89,6 +91,10 @@ void MD5Update( MD5_CTX *, unsigned char *, unsigned int ); void MD5Final( unsigned char results[16], MD5_CTX * ); ////////////////////////////////////// +void crc_ccitt_init(void); +void crc_ccitt_update(unsigned char * buf, int len); +////////////////////////////////////// + // helpers void InitFields(); void SetFieldsLocationLen(); diff --git a/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.c b/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.c index cd66c7a16..ad7e91b88 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.c +++ b/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.c @@ -72,6 +72,7 @@ uint32_t MotorsInit(void) MotorConfigState[i] = false; } +#ifndef EVALUATION_BOARD //option to change itafter initialization (to solve EMC issues) in the function Control_motors_clock_source #ifdef EMC_FORCE_MOT_CLOCK_INTERNAL F3_Moto_Clk_Src_Sel.Motor.LDRIVING = INTERNAL; @@ -86,6 +87,7 @@ uint32_t MotorsInit(void) #endif F3_MOTO_CLK_SRC_SEL = F3_Moto_Clk_Src_Sel.ushort; +#endif return OK; } diff --git a/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c b/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c index e505ac017..90ac22e7d 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c +++ b/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c @@ -878,7 +878,7 @@ void MotorActionsInit(void) MotorDriverResponse[i].Status = 0xFFFFFFFF; StoredMotorPosition[i] = 0; } - if (Head_Type == HEAD_TYPE_SYLKO)//adjust the limit switches + if (Head_Type == HEAD_TYPE_FLAT)//adjust the limit switches { Motor_Id_to_LS_IdDown[HARDWARE_MOTOR_TYPE__MOTO_DH_LID] = I2C_HEADCARD_COVER_LS_FRONT; Motor_Id_to_LS_IdUp [HARDWARE_MOTOR_TYPE__MOTO_DH_LID] = I2C_HEADCARD_COVER_LS_REAR ; diff --git a/Software/Embedded_SW/Embedded/Drivers/Valves/Valve.c b/Software/Embedded_SW/Embedded/Drivers/Valves/Valve.c index 3f43e5243..96c7702bb 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Valves/Valve.c +++ b/Software/Embedded_SW/Embedded/Drivers/Valves/Valve.c @@ -181,7 +181,7 @@ void Valve_Command(Valves_t Valve_Id) //1 - OPEN, 0 - CLOSE F1_GPO_Reg.bits.F1_VALVE_WASTE_TANK = ValveRequest[Valve_Id].Direction; break; case VALVE_MIXCHIP_WASTECH: - if(Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + if(Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) Trigger_Head_MixerValve(ValveRequest[Valve_Id].Direction); else F1_GPO_Reg.bits.F1_VALVE_MIXCHIP_WASTECH = ValveRequest[Valve_Id].Direction; diff --git a/Software/Embedded_SW/Embedded/Main.c b/Software/Embedded_SW/Embedded/Main.c index 45059e9c4..ccda43cfd 100644 --- a/Software/Embedded_SW/Embedded/Main.c +++ b/Software/Embedded_SW/Embedded/Main.c @@ -271,6 +271,7 @@ int main(void) //OpenLogFile(); Init_All_I2C(); +#ifndef EVALUATION_BOARD Block_Main_MUX_TCA9548A_0xE4();//unused, same i2c as head and whs cards I2C_BUSY_DELAY = 3000; //temporary workaround!!! Check_Head_Type_Via_EEPROM();//without trigger @@ -280,22 +281,21 @@ int main(void) { PP_Machine = true; } - if ((Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD)||(WHS_Type == WHS_TYPE_NEW)) + if ((Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD)||(WHS_Type == WHS_TYPE_NEW)) { I2C_ReadingTask_Init(); } - if (Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + if (Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) { Trigger_Head_io_Init();//Head_IO_Init();//moved to set 24 to pressure sensor in arc earlier } - #ifndef EVALUATION_BOARD STATUS_RED_LED_ON; STATUS_GREEN_LED_ON; FPGA_Init(); - #endif Init_IFS();//must be done after FPGA_Init +#endif MAP_FPULazyStackingEnable(); @@ -329,8 +329,10 @@ int main(void) ControlStart(); Heaters_Init(); +#ifndef EVALUATION_BOARD MotorsInit(); -//Shai WHS_HW_test(); // for WHS sensor test +#endif + //Shai WHS_HW_test(); // for WHS sensor test #ifndef EVALUATION_BOARD Init_Machine_Leds(); diff --git a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c index cc8ae5be8..07df07309 100644 --- a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c +++ b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c @@ -967,6 +967,10 @@ JobEndReasonEnum AlarmHandlingPrepareJob(void *CurrentJob) } } } + if (Configured[Module_Waste]) + { + FoundReason = Waste_Prepare(); + } if ((AlarmState[Alarm_i].Status == true)&&(FoundReason == JOB_OK)) { if(AlarmItem[Alarm_i].Severity>=DEBUG_LOG_CATEGORY__Error) diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index 27fc8a707..242bdc3ce 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -621,7 +621,7 @@ uint32_t MillisecLowLoop(uint32_t tick) //ROM_IntMasterDisable(); int StartPT100 = 0; //Screw_ENC_Velocity_to_DAC(); - for testing the screw enc - if (Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + if (Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) StartPT100 = TEMP_SENSE_ANALOG_DRYER_TEMP1; if (Ten_msTick) { diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticActions.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticActions.c index d872b30b5..79e84ebca 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticActions.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticActions.c @@ -378,7 +378,7 @@ uint32_t SetBlowerStateRequestFunc(MessageContainer* requestContainer) Turn_the_Blower_Off(); break; case HARDWARE_BLOWER_TYPE__HeadBlower1: - if (Head_Type == HEAD_TYPE_STAPLE_SPUN) + if (Head_Type == HEAD_TYPE_ARC) { if ((request->has_voltage)&&(request->isactive == true)) Trigger_Head_Fan_Control(HEAD_FAN_RIGHT,request->voltage); @@ -390,7 +390,7 @@ uint32_t SetBlowerStateRequestFunc(MessageContainer* requestContainer) break; case HARDWARE_BLOWER_TYPE__HeadBlower2: - if (Head_Type == HEAD_TYPE_STAPLE_SPUN) + if (Head_Type == HEAD_TYPE_ARC) { if ((request->has_voltage)&&(request->isactive == true)) Trigger_Head_Fan_Control(HEAD_FAN_LEFT,request->voltage); diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c index 1f5093601..7963a9290 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c @@ -147,6 +147,7 @@ double dispenser8motorfrequency[DIAGNOSTICS_LIMIT+1]; Task_Handle Diagnostics_Task_Handle; Mailbox_Handle DiagnosticsMsgQ = NULL; +extern uint8_t Head_Fan_PWM_Command[2] ; bool blowervolatgedisplay = false; bool midtankDisplay = false; double diagvoltage = 0; @@ -262,6 +263,7 @@ uint8_t MotorCounterIndex[MAX_THREAD_MOTORS_NUM]= {0,0,0}; double MotorValue[MAX_THREAD_MOTORS_NUM][DIAGNOSTICS_LIMIT+1]; uint8_t SpeedCounterIndex= 0; double SpeedValue[DIAGNOSTICS_DANCER_LIMIT+1]; +double headblowervoltage1 = 0.0, headblowervoltage2 = 0.0; void DiagnosticLoadMotor(int MotorId, int frequency) { @@ -361,10 +363,10 @@ void DiagnosticLoadTemperature(int HeaterId, int temperature) ReportWithPackageFilter(DiagnosticsFilter,"wrong Heater Id",__FILE__,__LINE__,(int)HeaterId,RpError,(int)0,0); return; } - if ((temperature < 1000)||(temperature>28000)) //error read, all 0xF or all 0 + /*if ((temperature < 1000)||(temperature>28000)) //error read, all 0xF or all 0 { return; - } + }*/ HeaterTemperature[HeaterId][HeaterCounterIndex[HeaterId]] = temp/100; if (HeaterCounterIndex[HeaterId]<DIAGNOSTICS_LIMIT ) HeaterCounterIndex[HeaterId]++; @@ -423,8 +425,8 @@ void CopyTemperaturesToMonitor(void) HeaterCounterIndex[HEATER_TYPE__HeaterZone2]; DiagnosticsMonitor.n_headzone3temperature = HeaterCounterIndex[HEATER_TYPE__HeaterZone3]; - if ((Head_Type == HEAD_TYPE_SYLKO) - || (Head_Type == HEAD_TYPE_SYLKO_WITHOUT_CARD)) + if ((Head_Type == HEAD_TYPE_FLAT) + || (Head_Type == HEAD_TYPE_FLAT_WITHOUT_CARD)) { DiagnosticsMonitor.headzone4temperature = HeaterTemperature[HEATER_TYPE__HeaterZone4]; @@ -439,7 +441,7 @@ void CopyTemperaturesToMonitor(void) DiagnosticsMonitor.n_headzone6temperature = HeaterCounterIndex[HEATER_TYPE__HeaterZone6]; } - if (Head_Type == HEAD_TYPE_SYLKO) + if (Head_Type == HEAD_TYPE_FLAT) { DiagnosticsMonitor.headzone7temperature = HeaterTemperature[HEATER_TYPE__HeaterZone7]; @@ -476,7 +478,7 @@ void CopyTemperaturesToMonitor(void) HeaterCounterIndex[HEATER_TYPE__HeadCoverHeater2]; } //if ((Head_Type == HEAD_TYPE_SYLKO)||(Head_Type == HEAD_TYPE_STAPLE_SPUN)) - if (Head_Type == HEAD_TYPE_STAPLE_SPUN) + if (Head_Type == HEAD_TYPE_ARC) { DiagnosticsMonitor.headcoverheater1temperature = HeaterTemperature[HEATER_TYPE__HeadCoverHeater1]; @@ -499,6 +501,16 @@ void CopyTemperaturesToMonitor(void) DiagnosticsMonitor.headblower1airflow = HeaterTemperature[HEATER_TYPE__HeaterZone5]; DiagnosticsMonitor.headblower2airflow = HeaterTemperature[HEATER_TYPE__HeaterZone7]; } + DiagnosticsMonitor.n_headblower1airflow = HeaterCounterIndex[HEATER_TYPE__HeaterZone5]; + DiagnosticsMonitor.n_headblower2airflow = HeaterCounterIndex[HEATER_TYPE__HeaterZone7]; + DiagnosticsMonitor.headblower1airflow = HeaterTemperature[HEATER_TYPE__HeaterZone5]; + DiagnosticsMonitor.headblower2airflow = HeaterTemperature[HEATER_TYPE__HeaterZone7]; + headblowervoltage1 =(double )Head_Fan_PWM_Command[HEAD_FAN_RIGHT]; + headblowervoltage2 =(double )Head_Fan_PWM_Command[HEAD_FAN_LEFT]; + DiagnosticsMonitor.headblowervoltage1 = &headblowervoltage1; + DiagnosticsMonitor.headblowervoltage2 = &headblowervoltage2; + DiagnosticsMonitor.n_headblowervoltage1 = 1; + DiagnosticsMonitor.n_headblowervoltage2 = 1; DiagnosticsMonitor.dryerzone1temperature = HeaterTemperature[HEATER_TYPE__DryerAirHeater]; DiagnosticsMonitor.dryerzone2temperature = @@ -601,7 +613,7 @@ void DiagnosticOneMinuteCollection(void) DiagnosticsMonitor.midtank7level = MidTankpressure[6]; DiagnosticsMonitor.n_midtank8level = 1; DiagnosticsMonitor.midtank8level = MidTankpressure[7]; - if (Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) //rapid/pp machines + if (Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) //rapid/pp machines { /*DiagnosticsMonitor.n_drierzone1heatercurrent = 1; DiagnosticsMonitor.drierzone1heatercurrent = HeatersCurrent[HEATER_DRYER_CURRENT_1]; @@ -610,7 +622,7 @@ void DiagnosticOneMinuteCollection(void) Get_Head_Current(HEAD_CURRENT_MIXER,&HeadCurrent[HEAD_CURRENT_ZONE_12+1][0]); DiagnosticsMonitor.n_mixer1heatercurrent = 1; DiagnosticsMonitor.mixer1heatercurrent = HeadCurrent[HEAD_CURRENT_ZONE_12+1]; - if (Head_Type == HEAD_TYPE_SYLKO) + if (Head_Type == HEAD_TYPE_FLAT) { for (i=0;i<HEAD_CURRENT_ZONE_12;i++) { @@ -841,7 +853,7 @@ void DiagnosticOneSecCollection(void) int i; memset(HeaterCounterIndex,0,sizeof(HeaterCounterIndex)); - if (Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) //rapid/pp machines + if (Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) //rapid/pp machines { AcVoltage = ReadVAC(); DiagnosticsMonitor.whsblower2voltage = &AcVoltage; @@ -886,7 +898,7 @@ void DiagnosticOneSecCollection(void) DiagnosticsMonitor.n_drierzone2heatercurrent = 1; DiagnosticsMonitor.drierzone2heatercurrent = HeatersCurrent[HEATER_DRYER_CURRENT_2]; - if (Head_Type == HEAD_TYPE_SYLKO_WITHOUT_CARD) + if (Head_Type == HEAD_TYPE_FLAT_WITHOUT_CARD) { DiagnosticLoadTemperature(HARDWARE_PID_CONTROL_TYPE__MixerHeater, MillisecGetTemperatures( MIXER_PT100)); DiagnosticLoadTemperature(HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ1, MillisecGetTemperatures(TEMP_SENSE_ANALOG_DYEINGH_TEMP1)); @@ -896,7 +908,7 @@ void DiagnosticOneSecCollection(void) DiagnosticLoadTemperature(HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ5, MillisecGetTemperatures(TEMP_SENSE_ANALOG_DYEINGH_TEMP5)); DiagnosticLoadTemperature(HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ6, MillisecGetTemperatures(HEAD6_PT100)); } - if (Head_Type == HEAD_TYPE_SYLKO) + if (Head_Type == HEAD_TYPE_FLAT) { DiagnosticLoadTemperature(HEATER_TYPE__MixerHeater, MillisecGetTemperatures( HEAD_PT100_MIXER_0X8E_0)); DiagnosticLoadTemperature(HEATER_TYPE__HeaterZone1, MillisecGetTemperatures(HEAD_PT100_ZONE_1_0X80_0)); @@ -915,7 +927,7 @@ void DiagnosticOneSecCollection(void) DiagnosticLoadTemperature(HEATER_TYPE__HeadCoverHeater1, MillisecGetTemperatures(HEAD_PT100_AIR_HEATER_2_0X8C_1)); DiagnosticLoadTemperature(HEATER_TYPE__HeadCoverHeater2, MillisecGetTemperatures(HEAD_PT100_AIR_HEATER_1_0X8C_0)); } - if (Head_Type == HEAD_TYPE_STAPLE_SPUN) + if (Head_Type == HEAD_TYPE_ARC) { DiagnosticLoadTemperature(HEATER_TYPE__MixerHeater, MillisecGetTemperatures( HEAD_PT100_MIXER_0X8E_0)); DiagnosticLoadTemperature(HEATER_TYPE__HeaterZone1, MillisecGetTemperatures(HEAD_PT100_ZONE_1_0X80_0)); @@ -1196,22 +1208,22 @@ void SendDiagnostics(void) LoadHeaterState(HEATER_TYPE__HeaterZone2,&HeaterInfo[i++]); LoadHeaterState(HEATER_TYPE__HeaterZone3,&HeaterInfo[i++]); - if ((Head_Type == HEAD_TYPE_SYLKO)||(Head_Type == HEAD_TYPE_SYLKO_WITHOUT_CARD)) + if ((Head_Type == HEAD_TYPE_FLAT)||(Head_Type == HEAD_TYPE_FLAT_WITHOUT_CARD)) { LoadHeaterState(HEATER_TYPE__HeaterZone4,&HeaterInfo[i++]); } LoadHeaterState(HEATER_TYPE__HeaterZone5,&HeaterInfo[i++]); //LoadHeaterState(HEATER_TYPE__HeaterZone6,&HeaterInfo[i++]); - if ((Head_Type == HEAD_TYPE_SYLKO)||(Head_Type == HEAD_TYPE_SYLKO_WITHOUT_CARD)) + if ((Head_Type == HEAD_TYPE_FLAT)||(Head_Type == HEAD_TYPE_FLAT_WITHOUT_CARD)) { LoadHeaterState(HEATER_TYPE__HeaterZone6,&HeaterInfo[i++]); } - if ((Head_Type == HEAD_TYPE_SYLKO)||(Head_Type == HEAD_TYPE_STAPLE_SPUN)) + if ((Head_Type == HEAD_TYPE_FLAT)||(Head_Type == HEAD_TYPE_ARC)) { LoadHeaterState(HEATER_TYPE__HeaterZone7,&HeaterInfo[i++]); //LoadHeaterState(HEATER_TYPE__HeaterZone8,&HeaterInfo[i++]); } - if (Head_Type == HEAD_TYPE_SYLKO) + if (Head_Type == HEAD_TYPE_FLAT) { LoadHeaterState(HEATER_TYPE__HeaterZone8,&HeaterInfo[i++]); LoadHeaterState(HEATER_TYPE__HeaterZone9,&HeaterInfo[i++]); @@ -1219,7 +1231,7 @@ void SendDiagnostics(void) LoadHeaterState(HEATER_TYPE__HeaterZone11,&HeaterInfo[i++]); LoadHeaterState(HEATER_TYPE__HeaterZone12,&HeaterInfo[i++]); } - if ((Head_Type == HEAD_TYPE_SYLKO)||(Head_Type == HEAD_TYPE_STAPLE_SPUN)) + if ((Head_Type == HEAD_TYPE_FLAT)||(Head_Type == HEAD_TYPE_ARC)) //if (Head_Type == HEAD_TYPE_STAPLE_SPUN) { LoadHeaterState(HEATER_TYPE__HeadCoverHeater1,&HeaterInfo[i++]); diff --git a/Software/Embedded_SW/Embedded/Modules/General/process.c b/Software/Embedded_SW/Embedded/Modules/General/process.c index 30a99ac86..7530408c9 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/process.c +++ b/Software/Embedded_SW/Embedded/Modules/General/process.c @@ -198,7 +198,7 @@ uint32_t HandleProcessParameters(ProcessParameters* ProcessParams,bool saveData) { status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ3, false,ProcessParams->headzone3temp); } - if(Head_Type != HEAD_TYPE_STAPLE_SPUN) + if(Head_Type != HEAD_TYPE_ARC) { Trigger_HeaterWriting(); if (ProcessParams->headzone4temp>1) @@ -230,7 +230,7 @@ uint32_t HandleProcessParameters(ProcessParameters* ProcessParams,bool saveData) status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature, true,ProcessParams->dryerzone1temp); else status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature, false,ProcessParams->dryerzone1temp); - if(Head_Type == HEAD_TYPE_SYLKO) + if(Head_Type == HEAD_TYPE_FLAT) { if (ProcessParams->headzone7temp>1) { @@ -283,7 +283,7 @@ uint32_t HandleProcessParameters(ProcessParameters* ProcessParams,bool saveData) status |= HeaterCommandRequestMessage(HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ12, false,ProcessParams->headzone12temp); } } - if(Head_Type == HEAD_TYPE_STAPLE_SPUN) + if(Head_Type == HEAD_TYPE_ARC) { Trigger_HeaterWriting(); if (ProcessParams->rblowertemp>1) diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c index ec743ea4a..52e9a6e85 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c @@ -113,7 +113,7 @@ void initializeArrays(void) HeaterId2PT100Id[i] = 0xFF; HeaterId2CurrentId[i] = NUM_OF_CURRENT_HEATERS; } - if (Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + if (Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) { HeaterId2PT100Id[HEATER_TYPE__DryerAirHeater] = DRYER_AIR_PT100; HeaterId2PT100Id[HEATER_TYPE__DryerMainHeater] = DRYER_MAIN_PT100; @@ -466,7 +466,7 @@ uint32_t HeatersSingleHeaterEnd(int HeaterId) HeaterCmd[HeaterId].targettemperatue = 0; HeaterReady[HeaterId] = true; HeaterAtTemp[HeaterId] = true; - if(Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + if(Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) Disable_Reading_Heaters_ADC(HeaterId2CurrentId[HeaterId]); else Disable_Reading_Heaters_Current(HeaterId2CurrentId[HeaterId]); @@ -722,7 +722,7 @@ void PrepareACHeater(int HeaterId,uint32_t Frequency, uint32_t SetTemperatue) HeaterAtTemp[HeaterId] = false; if (BlowerCfg.enabled == true) { - if(Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + if(Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) { WHS_Set_SetPoint_Q_value(headairflow*2/3); } @@ -786,7 +786,7 @@ int PrepareDCHeater(int HeaterId, uint32_t Frequency, uint32_t SetTemperatue) if (HeaterPreviousRead[HeaterId] < HeaterCmd[HeaterId].targettemperatue ) { - if(Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + if(Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) Enable_Reading_Heaters_ADC(HeaterId2CurrentId[HeaterId]); else Enable_Reading_Heaters_Current(HeaterId2CurrentId[HeaterId]); @@ -1244,7 +1244,7 @@ uint32_t HeaterControlCBFunction(uint32_t IfIndex, uint32_t readValue) AlarmHandlingSetAlarm(HeaterUnderEventType[index], false); /*if (BlowerCfg.enabled == true) { - if(Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + if(Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) { WHS_Set_SetPoint_Q_value(headairflow); } @@ -1281,7 +1281,7 @@ uint32_t HeaterControlCBFunction(uint32_t IfIndex, uint32_t readValue) IncreaseBlower = true; if (BlowerCfg.enabled == true) { - if(Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + if(Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) { WHS_Set_SetPoint_Q_value(headairflow); } @@ -1454,7 +1454,7 @@ uint32_t DCHeaterControlCBFunction(uint32_t IfIndex, uint32_t readValue) //DCInitialHeating[index] = false; HeatersControlStart(); AlarmHandlingSetAlarm(HeaterUnderEventType[index], false); - if(Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + if(Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) Disable_Reading_Heaters_ADC(HeaterId2CurrentId[index]); else Disable_Reading_Heaters_Current(HeaterId2CurrentId[index]); @@ -1560,9 +1560,9 @@ void EightMilliSecondHeatersInterrupt(UArg arg0) ROM_TimerLoadSet(Heater_timerBase, TIMER_A,OutputProportionalSingleStep); } else - { + { TimerDisable(Heater_timerBase, TIMER_A); - } + } // // Enable all interrupts. // @@ -1649,7 +1649,7 @@ uint32_t DrierHeaterVoltageSetup(void) } Histeresis = 0; #ifndef VAC_TEST - if (Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) //rapid/pp machines + if (Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) //rapid/pp machines #endif { DrierAcVoltage = ReadVAC(); diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h b/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h index 647797b69..a48e0df0c 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h @@ -49,8 +49,8 @@ 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_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); uint32_t IDS_Cleaning_Stop_Cleaning_Solution (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 c9e9afdde..26ba52d76 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_Cleaning.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_Cleaning.c @@ -51,7 +51,7 @@ int Tup = 4,Tdelay1 = 9,Tdelay2 = 29; uint32_t IDS_Cleaning_Move_Actuators() { - if(Head_Type != HEAD_TYPE_SYLKO) + if(Head_Type != HEAD_TYPE_FLAT) return OK; if (CleaningStageCounter == 1) { @@ -83,7 +83,7 @@ uint32_t IDS_Cleaning_Move_Actuators() return OK; } -uint32_t IDS_Cleaning_Move_Rockers (int LeftRockerSpeed,int RightRockerSpeed) +/*uint32_t IDS_Cleaning_Move_Rockers (int LeftRockerSpeed,int RightRockerSpeed) { uint32_t status = OK; SaveLeftRockerSpeed = LeftRockerSpeed; @@ -109,7 +109,7 @@ uint32_t IDS_Cleaning_Center_And_Stop_Rockers (int timeout,callback_fptr callbac 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; @@ -128,11 +128,10 @@ 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); - } + HeadCard_Actuators_Relocate(); + CleaningStageCounter = 0; + CleaningStage = CleaningStageIdle; + Report("IDS_Cleaning_Stop_Cleaning_Solution actuator relocate", __FILE__, __LINE__, CleaningStage, RpWarning, CleaningStageCounter, 0); return status; diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c index 311f16a19..c8e3d267e 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c @@ -583,7 +583,7 @@ uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue) HW_Motor_Id = DispenserIdToMotorId[CLEANER_DISPENSER]; MotorStop(HW_Motor_Id, Hard_Hiz); CurrentDispenserSpeed[CLEANER_DISPENSER] = 0; - Report("IDS stop cleaner",__FILE__,CLEANER_DISPENSER,(int)(GetDispenserPressure(CLEANER_DISPENSER)*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); + //Report("IDS stop cleaner",__FILE__,CLEANER_DISPENSER,(int)(GetDispenserPressure(CLEANER_DISPENSER)*100),RpWarning,(int)CurrentDispenserSpeed[CLEANER_DISPENSER] ,0); } if ((NumofReadyDispensers)&&(DispenserBuildTimeCounter%1000 == 0)) @@ -1605,7 +1605,8 @@ uint32_t IDSSegmentState(void *SegmentDetails, int SegmentId) #else Valve_Set(VALVE_MIXCHIP_WASTECH, Mixer_Head); #endif - IDS_Cleaning_Stop_Cleaning_Solution(NULL); + if (CurrentDispenserSpeed[CLEANER_DISPENSER]>0) + IDS_Cleaning_Stop_Cleaning_Solution(NULL); SegmentNumOfBrushStops = Segment->n_brushstops; BrushStopTime = Segment->length*1000/(double)SegmentNumOfBrushStops; //brushstop in meters //brushstop in millisecond BrushStopTime = ((BrushStopTime*100)/dyeingspeed);//brushstop in seconds @@ -1632,7 +1633,6 @@ uint32_t IDSSegmentState(void *SegmentDetails, int SegmentId) if (DispenserPreSegmentControlId != 0xFF) { Report("IDS presegment not yet ended!!",__FILE__,DispenserPreSegmentControlId,(int)InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); - //IDS_Cleaning_Stop_Cleaning_Solution (NULL); RemoveControlCallback(DispenserPreSegmentControlId, IDSPreSegmentStateCallbackRunner ); DispenserPreSegmentControlId = 0xFF; } @@ -1751,8 +1751,8 @@ uint32_t IDSSegmentState(void *SegmentDetails, int SegmentId) { Report("IDS_Valve_EndValveReady start homing",__FILE__,deviceID,(int)AutoHoming_Config,RpWarning,(int)AutoHoming_JobEnd_PowerOn_off,0); - //if (deviceID!=LUBRICANT_DISPENSER) - IDS_HomeDispenser (deviceID, 1000 , NULL); + if (deviceID!=LUBRICANT_DISPENSER) + IDS_HomeDispenser (deviceID, 1000 , NULL); } return OK; } @@ -1826,6 +1826,7 @@ uint32_t IDS_StopLubrication(void) Lubricant_2Way_Valve (STOP); IDS_Dispenser_Close_Valve_And_Stop_Motor(LUBRICANT_DISPENSER,IDS_Valve_EndValveReady); CurrentDispenserSpeed[LUBRICANT_DISPENSER] = 0; - REPORT_MSG (lubricant_speed, "IDS_StopLubrication"); + IDS_HomeDispenser (LUBRICANT_DISPENSER, 1000 , NULL); + REPORT_MSG (lubricant_speed, "IDS_StopLubrication and home dispenser"); return OK; } diff --git a/Software/Embedded_SW/Embedded/Modules/IFS/ifs.h b/Software/Embedded_SW/Embedded/Modules/IFS/ifs.h index 55d712412..1edc03264 100644 --- a/Software/Embedded_SW/Embedded/Modules/IFS/ifs.h +++ b/Software/Embedded_SW/Embedded/Modules/IFS/ifs.h @@ -12,7 +12,7 @@ #define MODULES_IFS_IFS_H_ #define CARTRIDGE_INK_TIMEOUT 420 -#define MidTank_Pressure_EMPTY 0.5 +#define MidTank_Pressure_EMPTY 0.3 #define CARTRIDGE_CAPATICY 1500 typedef enum{ diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c index e14053ae3..f61eebfa8 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c @@ -87,6 +87,13 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) uint8_t ReadBackReg[1]; + + if(request->amount == 0xacc1e) + { + response.progress = IDS_Cleaning_Move_Actuators(); + response.has_progress = true; + } + else if(request->amount == 0xC04f) { diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c index 01c70d42f..376b5f4a0 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c @@ -142,11 +142,8 @@ //EEPROM_STORAGE_DRYER_CYCLES MCU_E2PromRead(EEPROM_STORAGE_DRYER_CYCLES,&LoadArmRounds); - Report("Read_Dryer_ENC_Position()",__FILE__,__LINE__,0,RpWarning,Read_Dryer_ENC_Position(),0); - - Report("MotorMovetoEncoderPosition",__FILE__,__LINE__,LoadArmRounds,RpWarning,0,0); + Report("Read_Dryer_ENC_Position()",__FILE__,__LINE__,LoadArmRounds,RpWarning,Read_Dryer_ENC_Position(),0); - Report("Thread_Load_Init",__FILE__,__LINE__,LoadArmRounds,RpMessage,LoadArmRounds,0); StopInitSequence(); memcpy (&ProcessParametersRecover,&ProcessParametersKeep,sizeof(ProcessParameters)); //NumberOfDrierLoaderCycles = loadLoadArmParameters(); @@ -209,7 +206,7 @@ } else { - if(Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) + if(Head_Type > HEAD_TYPE_FLAT_WITHOUT_CARD) { WHS_Set_SetPoint_Q_value(headairflow*2/3); } @@ -349,7 +346,7 @@ //HARDWARE_MOTOR_TYPE__MOTO_DH_LID = 2, //HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID = 4, //DeActivateHeadMagnet(); - if (Head_Type != HEAD_TYPE_STAPLE_SPUN) + if (Head_Type != HEAD_TYPE_ARC) { CallbackCounter++; MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_LID,1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_LID].directionthreadwize, 200, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_LID], Thread_Load_HomingCallback,10000); @@ -366,7 +363,7 @@ direction = DRIER_LID_OPEN; } MotorGotoWithCallback(HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID, direction, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID], Thread_Load_HomingCallback,10000); - if (Head_Type == HEAD_TYPE_SYLKO) + if (Head_Type == HEAD_TYPE_FLAT) { Report("Thread_Load_Lift_actuators",__FILE__,__LINE__,LOW,RpMessage,false,0); Trigger_Head_Actuators_Control(ACTOT, LOW,true); @@ -500,7 +497,7 @@ //Close Dyeing Head Cover And Dryer Lid //HARDWARE_MOTOR_TYPE__MOTO_DH_LID = 2, //HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID = 4, - if (Head_Type != HEAD_TYPE_STAPLE_SPUN) + if (Head_Type != HEAD_TYPE_ARC) { CallbackCounter++; MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_LID,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_LID].directionthreadwize, 200, Motor_Id_to_LS_IdDown[HARDWARE_MOTOR_TYPE__MOTO_DH_LID], Thread_Load_HomingCallback,10000); @@ -517,7 +514,7 @@ direction = DRIER_LID_CLOSE; } MotorGotoWithCallback(HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID, direction, Motor_Id_to_LS_IdDown[HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID], Thread_Load_HomingCallback,10000); - if (Head_Type == HEAD_TYPE_SYLKO) + if (Head_Type == HEAD_TYPE_FLAT) { Report("Thread_Load_Close_actuators",__FILE__,__LINE__,LOW,RpMessage,true,0); Trigger_Head_Actuators_Control(ACTOT, LOW,false); diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c index 39ff91558..bbb3e4040 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c @@ -146,6 +146,10 @@ uint32_t MotorPidRequestMessage(HardwarePidControl* request) // uint32_t MotorSamples[MAX_THREAD_MOTORS_NUM][MAX_CONTROL_SAMPLES]; temp = 1<<(DancersCfg[ThreadMotorIdToDancerId[Motor_i]].resolutionbits); temp = (temp*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].maximalmovementmm);//*3/2); + if (Motor_i == WINDER_MOTOR) + { + temp = temp*3/2; + } DancerStopActivityLimit[Motor_i] = temp/(2*PI*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].armlength); return OK; } diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c index c67619e20..ef80d3603 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c @@ -723,7 +723,7 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) { if (calculated_speed>(CurrentControlledSpeed[index]+100)) { - ReportWithPackageFilter(ThreadFilter,"limit acceleration",__FILE__,calculated_speed,CurrentControlledSpeed[index],RpError,CurrentControlledSpeed[index]+100,0); + ReportWithPackageFilter(ThreadFilter,"limit acceleration",__FILE__,calculated_speed,CurrentControlledSpeed[index],RpError,index,0); calculated_speed=CurrentControlledSpeed[index]+100; } CurrentControlledSpeed[index] = calculated_speed; @@ -898,17 +898,18 @@ uint32_t Adjust_Right_TFU_Tension(double tension) return status; } -uint32_t ThreadPrepare_TensionCallback (int DancerId, double tension) +uint32_t ThreadPrepare_TensionCallback (int MotorId, double tension) { + MotorStop(MotorId,Hard_Hiz); if (PrepareWaitCount) { - ReportWithPackageFilter(ThreadFilter,"ThreadPrepare_TensionCallback",__FILE__,__LINE__,DancerId,RpWarning,PrepareWaitCount,0); + ReportWithPackageFilter(ThreadFilter,"ThreadPrepare_TensionCallback",__FILE__,__LINE__,MotorId,RpWarning,PrepareWaitCount,0); PrepareWaitCount--; } if ((PrepareWaitCount == 0)&&(PrepareState == true)) { PrepareState = false; - ReportWithPackageFilter(ThreadFilter,"ThreadPrepare_TensionCallback Prepare Ready",__FILE__,__LINE__,DancerId,RpWarning,PrepareWaitCount,0); + ReportWithPackageFilter(ThreadFilter,"ThreadPrepare_TensionCallback Prepare Ready",__FILE__,__LINE__,MotorId,RpWarning,PrepareWaitCount,0); PrepareReady(Module_Thread,ModuleDone); } return OK; @@ -1037,7 +1038,7 @@ uint32_t ThreadPrepareState(void *JobDetails) // 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) + if(Head_Type != HEAD_TYPE_ARC) { ReportWithPackageFilter(ThreadFilter,"Dyeing head is wide open!!!",__FILE__,__LINE__,HARDWARE_MOTOR_TYPE__MOTO_DH_LID,RpError,LIMIT,0); if (SkipOpenLids == false) diff --git a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_ex.h b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_ex.h index af4bd5e08..ee9f668db 100644 --- a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_ex.h +++ b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_ex.h @@ -44,6 +44,7 @@ bool WHS_IsContainerFull(); bool WHS_WasteCartridgeLowerPresent(); bool WHS_WasteCartridgeMiddlePresent(); bool WHS_IsEmptying(); +uint32_t Waste_Prepare(void); #endif diff --git a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c index d87ebd1a2..c0e51a143 100644 --- a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c +++ b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c @@ -500,27 +500,31 @@ void Waste_StateMachine(void) break; } } -void Waste_Prepare(void) +uint32_t Waste_Prepare(void) { //check if the waste is ready to run - waste level not above overflow level and no cartridge in the slots if (wasteLevel > wasteLevelOverflow) { Report("cannot start a job with waste tank overflow", __FILE__, __LINE__, wasteLevel, RpMessage, wasteLevelOverflow, 0); JobEndReason = JOB_SAFETY_CRITICAL_ALARM; + usnprintf(AlarmReasonStr, 100, "cannot start a job with waste tank overflow"); AlarmHandlingSetAlarm( EVENT_TYPE__WASTE_CONTAINER_OVERFLOW, true); - PrepareReady(Module_Waste,ModuleFail); - return; + //PrepareReady(Module_Waste,ModuleFail); + return JOB_SAFETY_CRITICAL_ALARM; } if ((WHS_IsEmptying())||(NoCartAvailable())) { - PrepareReady(Module_Waste,ModuleDone); + //PrepareReady(Module_Waste,ModuleDone); + return JOB_OK; } else { Report("cannot start a job with cartridges in the IFS", __FILE__, __LINE__, wasteLevel, RpMessage, wasteLevelOverflow, 0); JobEndReason = JOB_OTHER_ALARM; AlarmHandlingSetAlarm( EVENT_TYPE__ALL_WASTE_CARTRIDGES_FULL, true); - PrepareReady(Module_Waste,ModuleFail); + usnprintf(AlarmReasonStr, 100, "cannot start a job with cartridges in the IFS"); + //PrepareReady(Module_Waste,ModuleFail); + return JOB_OTHER_ALARM; } return; diff --git a/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c b/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c index 1dd81d011..30e43fe99 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c @@ -590,6 +590,7 @@ void InitSequenceSetStartHeating(bool StartHeating) uint32_t InitSequenceStartHeating(void) { SetMachineReadyForHeating(true); + HeadCard_Actuators_Relocate(); //SetMachineStatus(MACHINE_STATE__Ready); //prevent job while waiting for the cooler if (InitialHeating) diff --git a/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.c b/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.c index dfd9ffaa5..776d55080 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.c @@ -409,7 +409,7 @@ uint32_t PowerOffWaitForTemperatureCallback(uint32_t IfIndex, uint32_t BusyFlag) readTemp = MillisecGetTemperatures(HEAD_PT100_ZONE_12_0X8A_1); if ((readTemp>= MaxTemp)&&(readTemp < 27000)) MaxTemp = readTemp; } - if (Head_Type == HEAD_TYPE_STAPLE_SPUN) + if (Head_Type == HEAD_TYPE_ARC) { readTemp = MillisecGetTemperatures( HEAD_PT100_MIXER_0X8E_0); if ((readTemp>= MaxTemp)&&(readTemp < 27000)) MaxTemp = readTemp; diff --git a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c index 106d515ad..33face713 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c @@ -207,10 +207,10 @@ static ReturnCode PrepareState(void *JobDetails) { PrepareWaiting[Module_Thread] = ModuleWaiting; } - if (Configured[Module_Waste]) + /*if (Configured[Module_Waste]) { PrepareWaiting[Module_Waste] = ModuleWaiting; - } + }*/ if (Configured[Module_Winder]) { PrepareWaiting[Module_Winder] = ModuleWaiting; @@ -243,8 +243,8 @@ static ReturnCode PrepareState(void *JobDetails) SendJobProgress(0.0, 0, false, "Winder prepare failed !!!!"); } } - if (Configured[Module_Waste]) - Waste_Prepare(); + //if (Configured[Module_Waste]) + // Waste_Prepare(); return retcode; } diff --git a/Software/Stubs Collection/Procedures/ConnectionType.pproj b/Software/Stubs Collection/Procedures/ConnectionType.pproj new file mode 100644 index 000000000..9f87f5e00 --- /dev/null +++ b/Software/Stubs Collection/Procedures/ConnectionType.pproj @@ -0,0 +1 @@ +{"$id":"1","Name":"untitled","Description":null,"Scripts":{"$id":"2","$values":[{"$id":"3","Name":"Program.csx","IsEntryPoint":true,"Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\t\t\r\n //Connection check example.\r\n \r\n if (context.IsConnected) //Check if there is an active machine connection.\r\n {\r\n \tif (context.ConnectionType == MachineConnectionTypes.Wifi) //Check enumeration of the active connection type.\r\n \t{\r\n \t\tcontext.WriteLine(\"The machine is connected via WiFi\");\t\r\n \t}\r\n }\r\n\r\n }\r\n}"},{"$id":"4","Name":"Service.csx","IsEntryPoint":false,"Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}"}]},"Inputs":{"$id":"5","$values":[]},"ReferenceAssemblies":{"$id":"6","$values":[{"$id":"7","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"8","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"9","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"10","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"11","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"12","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"13","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"14","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"15","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"16","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"17","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Dialogs":{"$id":"18","$values":[]},"ID":"d6aaf6ec-2a05-4edb-b150-fef4487acd80","ApartmentState":"STA"}
\ No newline at end of file diff --git a/Software/Stubs Collection/Procedures/Dancers calibration.pproj b/Software/Stubs Collection/Procedures/Dancers calibration.pproj index e906c6329..53140f877 100644 --- a/Software/Stubs Collection/Procedures/Dancers calibration.pproj +++ b/Software/Stubs Collection/Procedures/Dancers calibration.pproj @@ -1 +1 @@ -{"$id":"1","Name":"Dancers calibration","Description":null,"Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\r\n\t\tvar response1 = context.ShowQuestion(\"Please Enter Password:\");\r\n\t\tif (response1. \"Aa123456\")\r\n\t\t{\r\n\t\t\tcontext.WriteLine(response1);\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tcontext.RequestTimeout = 2000;\r\n\t\t\t//for (int i = 0; i < 100; i++)\r\n\t\t\t{\r\n\t\t\t\tvar response = context.Send<StubDancerPositionResponse>(\"StubDancerPositionRequest\" ,0);\r\n\t\t\t\tThread.Sleep(1000);\r\n\t\t\t\t response = context.Send<StubDancerPositionResponse>(\"StubDancerPositionRequest\" ,1);\r\n\t\t\t\tThread.Sleep(1000);\r\n\t\t\t\t response = context.Send<StubDancerPositionResponse>(\"StubDancerPositionRequest\" ,2);\r\n\t\t\t\tThread.Sleep(1000);\r\n\t\t\t}\r\n\t }\r\n\r\n }\r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[]},"ReferenceAssemblies":{"$id":"6","$values":[{"$id":"7","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"8","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"9","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"10","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"11","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"12","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"13","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"14","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"15","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"16","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"17","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"ApartmentState":"MTA"}
\ No newline at end of file +{"$id":"1","Name":"Dancers calibration","Description":"This procedure calibrates the middle points of the dancers. you must enter the passord for the procedure to run.","Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\t\tStubDancerPositionRequest stubDancerPositionRequest = new StubDancerPositionRequest();\r\n\t\tstring response1 = context.GetInput<string>(\"ValidationPassword\");\r\n List<uint> list = new List<uint>();\r\n\t\tif (response1 == \"Aa123456\")\r\n\t\t{\r\n\t\t\tcontext.WriteLine(response1);\r\n\t\t\tstubDancerPositionRequest.DancerID = 0;\r\n\t\t\tStubDancerPositionResponse response = context.Send<StubDancerPositionResponse>(stubDancerPositionRequest);\r\n\t\t\tThread.Sleep(100);\r\n\t\t\tlist.Add (response.Position);\r\n\t\t\tstubDancerPositionRequest.DancerID = 1;\r\n\t\t \tresponse = context.Send<StubDancerPositionResponse>(stubDancerPositionRequest);\r\n\t\t\tThread.Sleep(100);\r\n\t\t\tlist.Add (response.Position);\r\n\t\t\tstubDancerPositionRequest.DancerID = 2;\r\n\t\t\tresponse = context.Send<StubDancerPositionResponse>(stubDancerPositionRequest);\r\n\t\t\tThread.Sleep(100);\r\n\t\t\tlist.Add (response.Position);\r\n\r\n\t context.AddResult(ResultType.Passed, \"Array Result\", list);\r\n\r\n\t }\r\n\t else\r\n\t {\r\n\t context.AddResult(ResultType.Failed, \"Wrong password\", response1);\r\n\r\n\t }\r\n\r\n }\r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[{"$id":"6","Type":"Default","SelectionInputs":{"$id":"7","$values":[]},"DisplayName":"Validation Password","Description":"Validation Password","Key":"ValidationPassword","Value":"0"}]},"ReferenceAssemblies":{"$id":"8","$values":[{"$id":"9","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"10","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"11","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"12","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"13","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"14","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"15","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"16","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"17","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"18","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"19","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Dialogs":{"$id":"20","$values":[]},"ID":"23b690b1-bd08-45ba-807b-3faa244ed8c3","ApartmentState":"MTA"}
\ No newline at end of file diff --git a/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.pproj b/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.pproj index 0b1371bbb..dd7088a08 100644 --- a/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.pproj +++ b/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.pproj @@ -1 +1 @@ -{"$id":"1","Name":"EmbeddedParametersBuild","Description":null,"Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.PMR.EmbeddedParameters;\r\nusing Tango.PMR.IO;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\r\n context.AddResult(ResultType.Passed, \"My Value Name\", \"Test for this value has passed.\");\r\n\t\tConfigurationParameters configurationParameters = new ConfigurationParameters();\r\n\r\n\t\tconfigurationParameters.BreakSensorLimit = 10;\r\n\r\n\t\t//how many samples to collect in diagnostics before sending\r\n\t\tconfigurationParameters.DiagnosticCollectionLimit = 3;\r\n\r\n\t\t//how many consecutive readout before declaring DC over/underheat alarm\r\n\t\tconfigurationParameters.OverHeatCountLimit = 3;\r\n\t\tconfigurationParameters.UnderHeatCountLimit = 3;\r\n\r\n\t\t// time of motor activity before opening the valve or after closing the valve, in milliseconds\r\n\t\tconfigurationParameters.CloseValveTimeout = 20;\r\n\t\tconfigurationParameters.OpenValveTimeout = 20;\r\n\r\n\t\t//backlash after filling - target pressure, timoeout, time staps (speed will be added in general parameters)\r\n\t\tconfigurationParameters.InitialDispenserPressure = 0.25; \r\n\t\tconfigurationParameters.InitialDispenserTimeout = 60000; //20 seconds\r\n\t\tconfigurationParameters.InitialDispenserTimeLag = 100;\r\n\r\n\t\t//job prepare - build pressure in dispensers - target pressure, timoeout, time staps, speed\r\n\t\tconfigurationParameters.DispenserBuildPressureSpeed = 950; //no more than 1000\r\n\t\tconfigurationParameters.DispenserBuildPressureLimit = 0.85; \r\n\t\tconfigurationParameters.DispenserBuildPressureTimeout = 180000;\r\n\t\tconfigurationParameters.DispenserBuildPressureLag = 100;\r\n\r\n\t\t//temperature band 1000 = 100% - thresholds for job start around target temprature - AC\r\n\t\tconfigurationParameters.ACHeatersLowerOperationLimit = 995;\r\n\t\tconfigurationParameters.ACHeatersUpperOperationLimit = 1005;\r\n\r\n\t\t//temperature band 1000 = 100% - thresholds for job start around target temprature - DC\r\n\t\tconfigurationParameters.DCHeatersLowerOperationLimit = 978;\r\n\t\tconfigurationParameters.DCHeatersUpperOperationLimit = 1005;\r\n\r\n\t\t// mid tank reading offset to add to the readout (OBSOLETE!)\r\n\t\tconfigurationParameters.MidTankPressureCorrection = 0.0;\r\n\r\n\t\t//waste factor for intersegment pressure building\r\n\t\tconfigurationParameters.DispenserPresegmentWFCF = 40;\r\n\t\t//how much time to start the WFCF process (pressure buildup) before segment start\r\n\t\tconfigurationParameters.IDSPreSegmentWFCFTimeBeforeSegment = 12000;\r\n\r\n\t\t//flag: start heaters according to saved process parameters upon init?\r\n\t\tconfigurationParameters.StartHeatingOnInitSequence = true;\r\n\r\n\t\t// current test for the heaters - alarm thresholds\r\n\t\tconfigurationParameters.CurrentAlarmLowLimit = 0.78;\r\n\t\tconfigurationParameters.CurrentAlarmHighLimit = 1.07;\r\n\r\n\t\t//currently not in use\r\n\t\tconfigurationParameters.IDSSegmentRefillTimeout = 5000;\r\n\t\tconfigurationParameters.IDSPreSegmentBuildupTime = 5000;\r\n\t\t//cleaning!!!!!!!!!!\r\n\t\tconfigurationParameters.IDSCleaningSpeed = 800;\r\n\t\tconfigurationParameters.IDSCleaningStopBeforeSegmentTime = 10000; //end of presegemnt\r\n\t\tconfigurationParameters.IDSCleaningStartSprayPreSegmentTime =2000; //beginning of presegment\r\n\r\n\t\tint Tup = 6,Tdelay1 = 26,Tdelay2 = 65;//300 milli up, stay 1 sec, stay down 2 sec\r\n\t\t// Tup = LeftRockerSpeed/100;\r\n\t\t// Tdelay1 = LeftRockerSpeed%100;\r\n\t\t// Tdelay2 = RightRockerSpeed;\r\n\t\tint LeftRockerSpeed = Tup*100+Tdelay1;\r\n\t\tint RightRockerSpeed = Tdelay2;\r\n\r\n\t\tconfigurationParameters.IDSLeftCleaningMotorSpeed = LeftRockerSpeed;\r\n\t\tconfigurationParameters.IDSRightCleaningMotorSpeed = RightRockerSpeed;\r\n\r\n\t\tconfigurationParameters.SwitchToIdleTimeinSeconds = 3600;\r\n\t\tconfigurationParameters.IdleDrierTemperature = 80;\r\n\t\tconfigurationParameters.IdleHeadTemperature = 80;\r\n\t\tconfigurationParameters.IdleMixerTemperature = 0;\r\n\t\tconfigurationParameters.PowerOffTemperatureLimit = 60;\r\n\r\n\t\t//general parameters, ORDER MUST BE PRESERVED!!!!\r\n\t\t//check the dispensers hard limit alarms\r\n\t\t/*1*/\r\n\t\tDouble checkHardLimitAlarms = new Double();\r\n\r\n\t\tcheckHardLimitAlarms = 1.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkHardLimitAlarms);\r\n\r\n\t\t/*2*/\r\n\t\tDouble checkCurrentAlarms = new Double();\r\n\t\tcheckCurrentAlarms = 0.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkCurrentAlarms);\r\n\t\t//check the tamper alarms\r\n\r\n\t\t/*3*/\r\n\t\tDouble checkTamperAlarms = new Double();\r\n\t\tcheckTamperAlarms = 1.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkTamperAlarms);\r\n\r\n\t\t/*4*/\r\n\t\tDouble checkMotorAlarms = new Double();\r\n\t\tcheckMotorAlarms = 1.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkMotorAlarms);\r\n\r\n\t\t/*5*/\r\n\t\tDouble WinderBackToBaseTime = new Double();\r\n\t\tWinderBackToBaseTime = 820.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(WinderBackToBaseTime);\r\n\r\n\t\t/*6*/\r\n\t\tDouble DispenserInitialPressureSpeed = new Double();\r\n\t\tDispenserInitialPressureSpeed = 1050.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(DispenserInitialPressureSpeed);\r\n\r\n\t\t/*7*/\r\n\t\tDouble SetDiagnosticMode = new Double();\r\n\t\tSetDiagnosticMode = 3.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(SetDiagnosticMode);\r\n\r\n\t\t/*8*/\r\n\t\tDouble SetAutoFill = new Double();\r\n\t\tSetAutoFill = 3.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(SetAutoFill);\r\n\r\n\t\tFile.WriteAllBytes(\"C:/temp/EmbParam.cfg\",configurationParameters.ToBytes());\r\n\r\n\t\tbyte[] fileBytes = File.ReadAllBytes(\"C:/temp/EmbParam.cfg\");\r\n\r\n\r\n\t\tvar config = ConfigurationParameters.Parser.ParseFrom(fileBytes);\r\n\r\n\t\tcontext.Write( config);\r\n\t\tThread.Sleep(1000);\r\n\r\n\r\n\t\tcontext.Write(\"\\n\\n Deleting old file\");\r\n\r\n\t\tDeleteRequest deleteRequest = new DeleteRequest();\r\n\t\tdeleteRequest.Path = \"SYSINFO//EmbParam.cfg\";\r\n\t\tdeleteRequest.Attribute = Tango.PMR.IO.FileAttribute.Unspecified;\r\n\t\tDeleteResponse response5 = context.Send<DeleteResponse>(deleteRequest);\r\n\r\n\r\n\t\tThread.Sleep(1000);\r\n\t\tcontext.Write(\"\\n\\n Loading new file file\");\r\n\r\n\t\tFileUploadRequest fileUploadRequest = new FileUploadRequest();\r\n\t\tfileUploadRequest.Path = \"SYSINFO//EmbParam.cfg\";\r\n\t\tfileUploadRequest.Length = (int)fileBytes.Length;\r\n\t\tFileUploadResponse response2 = context.Send<FileUploadResponse>(fileUploadRequest);\r\n\t\tThread.Sleep(1000);\r\n\t\tlong chunk_size = response2.MaxChunkLength;\r\n\r\n\t\tFileStream fs = new FileStream(\"C:/temp/EmbParam.cfg\",FileMode.Open);\r\n\r\n\t\twhile (fs.Position < fs.Length)\r\n\t\t{\r\n\t\t\t\tcontext.Write(\"Position \"+ fs.Position+ \" Length \"+ fs.Length +\"\\n\\n\");\r\n\t\t\t\tFileChunkUploadRequest fileChunkUploadRequest = new FileChunkUploadRequest();\r\n\t\t\t\tfileChunkUploadRequest.UploadID = response2.UploadID;\r\n\t\t\t\tbyte[] chunk = new byte[Math.Min(chunk_size,fs.Length - fs.Position)];\r\n\t\t\t\tfs.Read(chunk,0,chunk.Length);\r\n\t\t\t\tfileChunkUploadRequest.Buffer = ByteString.CopyFrom(chunk);\t\r\n\t\t\t\tvar response3 = context.Send<FileChunkUploadResponse>(fileChunkUploadRequest);\r\n\t\t\t\tThread.Sleep(2000);\r\n\r\n\t\t}\r\n\r\n\t\t// activating the new file\r\n\t\tProgressRequest progressRequest = new ProgressRequest();\r\n\t\tprogressRequest.Amount = 0xCD;\r\n\t\tprogressRequest.Delay = 0xCD;\r\n\t\tvar response1 = context.Send<ProgressResponse>(progressRequest);\r\n\r\n }\r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[]},"ReferenceAssemblies":{"$id":"6","$values":[{"$id":"7","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"8","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"9","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"10","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"11","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"12","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"13","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"14","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"15","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"16","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"17","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"ApartmentState":"MTA"}
\ No newline at end of file +{"$id":"1","Name":"EmbeddedParametersBuild","Description":"This procedure lets the FSE to define values for cleaning, tamper alarms, initial heating, WCF value and automatic dispenser filling.","Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.PMR.EmbeddedParameters;\r\nusing Tango.PMR.IO;\r\nusing Tango.FSE.Procedures;\r\n\r\n\r\npublic class Cleaning\r\n{\r\n\t[Description(\"Actuator Going up time\")]\r\n\tpublic int Tup;\r\n\t[Description(\"Actuator Wait up time\")]\r\n\tpublic int Tdelay1;\r\n\t[Description(\"Actuator Wait Down time\")]\r\n\tpublic int Tdelay2;\r\n}\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\r\n context.AddResult(ResultType.Passed, \"My Value Name\", \"Test for this value has passed.\");\r\n\t\tConfigurationParameters configurationParameters = new ConfigurationParameters();\r\n\r\n\t\tconfigurationParameters.BreakSensorLimit = 10;\r\n\r\n\t\t//how many samples to collect in diagnostics before sending\r\n\t\tconfigurationParameters.DiagnosticCollectionLimit = 3;\r\n\r\n\t\t//how many consecutive readout before declaring DC over/underheat alarm\r\n\t\tconfigurationParameters.OverHeatCountLimit = 3;\r\n\t\tconfigurationParameters.UnderHeatCountLimit = 3;\r\n\r\n\t\t// time of motor activity before opening the valve or after closing the valve, in milliseconds\r\n\t\tconfigurationParameters.CloseValveTimeout = 20;\r\n\t\tconfigurationParameters.OpenValveTimeout = 20;\r\n\r\n\t\t//backlash after filling - target pressure, timoeout, time staps (speed will be added in general parameters)\r\n\t\tconfigurationParameters.InitialDispenserPressure = 0.25; \r\n\t\tconfigurationParameters.InitialDispenserTimeout = 60000; //20 seconds\r\n\t\tconfigurationParameters.InitialDispenserTimeLag = 100;\r\n\r\n\t\t//job prepare - build pressure in dispensers - target pressure, timoeout, time staps, speed\r\n\t\tconfigurationParameters.DispenserBuildPressureSpeed = 950; //no more than 1000\r\n\t\tconfigurationParameters.DispenserBuildPressureLimit = 0.85; \r\n\t\tconfigurationParameters.DispenserBuildPressureTimeout = 180000;\r\n\t\tconfigurationParameters.DispenserBuildPressureLag = 100;\r\n\r\n\t\t//temperature band 1000 = 100% - thresholds for job start around target temprature - AC\r\n\t\tconfigurationParameters.ACHeatersLowerOperationLimit = 995;\r\n\t\tconfigurationParameters.ACHeatersUpperOperationLimit = 1005;\r\n\r\n\t\t//temperature band 1000 = 100% - thresholds for job start around target temprature - DC\r\n\t\tconfigurationParameters.DCHeatersLowerOperationLimit = 978;\r\n\t\tconfigurationParameters.DCHeatersUpperOperationLimit = 1005;\r\n\r\n\t\t// mid tank reading offset to add to the readout (OBSOLETE!)\r\n\t\tconfigurationParameters.MidTankPressureCorrection = 0.0;\r\n\r\n\t\t//waste factor for intersegment pressure building\r\n\t\tconfigurationParameters.DispenserPresegmentWFCF = context.GetInput<double>(\"WCF_Value\");\r\n\r\n\t\t//how much time to start the WFCF process (pressure buildup) before segment start\r\n\t\tconfigurationParameters.IDSPreSegmentWFCFTimeBeforeSegment = 12000;\r\n\r\n\t\t//flag: start heaters according to saved process parameters upon init?\r\n\t\tconfigurationParameters.StartHeatingOnInitSequence = context.GetInput<bool>(\"InitialHeating\");\r\n\r\n\t\t// current test for the heaters - alarm thresholds\r\n\t\tconfigurationParameters.CurrentAlarmLowLimit = 0.78;\r\n\t\tconfigurationParameters.CurrentAlarmHighLimit = 1.07;\r\n\r\n\t\t//currently not in use\r\n\t\tconfigurationParameters.IDSSegmentRefillTimeout = 5000;\r\n\t\tconfigurationParameters.IDSPreSegmentBuildupTime = 5000;\r\n\t\t//cleaning!!!!!!!!!!\r\n\t\tconfigurationParameters.IDSCleaningSpeed = 800;\r\n\t\tconfigurationParameters.IDSCleaningStopBeforeSegmentTime = 10000; //end of presegemnt\r\n\t\tconfigurationParameters.IDSCleaningStartSprayPreSegmentTime =2000; //beginning of presegment\r\n\r\n\t\tbool SetCleaning = context.GetInput<bool>(\"SetCleaningValues\");\r\n Cleaning Clean = new Cleaning();\r\n\t\tClean.Tup = 10;\r\n\t\tClean.Tdelay1 = 98;\r\n\t\tClean.Tdelay2 = 198;//300 milli up, stay 1 sec, stay down 2 sec\r\n\t\tif (SetCleaning == true)\r\n \tClean =\tcontext.RequestUserInputFor<Cleaning>(Clean,\"Cleaning Input Required\",\"Please fill in the form\");\r\n\r\n\t\t// Tup = LeftRockerSpeed/100;\r\n\t\t// Tdelay1 = LeftRockerSpeed%100;\r\n\t\t// Tdelay2 = RightRockerSpeed;\r\n\t\tint LeftRockerSpeed = Clean.Tup*100+Clean.Tdelay1;\r\n\t\tint RightRockerSpeed = Clean.Tdelay2;\r\n\r\n\t\tconfigurationParameters.IDSLeftCleaningMotorSpeed = LeftRockerSpeed;\r\n\t\tconfigurationParameters.IDSRightCleaningMotorSpeed = RightRockerSpeed;\r\n\r\n\t\tconfigurationParameters.SwitchToIdleTimeinSeconds = 3600;\r\n\t\tconfigurationParameters.IdleDrierTemperature = 80;\r\n\t\tconfigurationParameters.IdleHeadTemperature = 80;\r\n\t\tconfigurationParameters.IdleMixerTemperature = 0;\r\n\t\tconfigurationParameters.PowerOffTemperatureLimit = 60;\r\n\r\n\t\t//general parameters, ORDER MUST BE PRESERVED!!!!\r\n\t\t//check the dispensers hard limit alarms\r\n\t\t/*1*/\r\n\t\tDouble checkHardLimitAlarms = new Double();\r\n\t\tcheckHardLimitAlarms = 1.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkHardLimitAlarms);\r\n\r\n\t\t/*2*/\r\n\t\tDouble checkCurrentAlarms = new Double();\r\n\t\tcheckCurrentAlarms = 0.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkCurrentAlarms);\r\n\t\t//check the tamper alarms\r\n\r\n\t\t/*3*/\r\n\t\tDouble checkTamperAlarms = new Double();\r\n\t\tcheckTamperAlarms = context.GetInput<double>(\"CheckTampers\");\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkTamperAlarms);\r\n\r\n\t\t/*4*/\r\n\t\tDouble checkMotorAlarms = new Double();\r\n\t\tcheckMotorAlarms = 1.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(checkMotorAlarms);\r\n\r\n\t\t/*5*/\r\n\t\tDouble WinderBackToBaseTime = new Double();\r\n\t\tWinderBackToBaseTime = 820.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(WinderBackToBaseTime);\r\n\t\t/*6*/\r\n\t\tDouble DispenserInitialPressureSpeed = new Double();\r\n\t\tDispenserInitialPressureSpeed = 1050.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(DispenserInitialPressureSpeed);\r\n\r\n\t\t/*7*/\r\n\t\tDouble SetDiagnosticMode = new Double();\r\n\t\tSetDiagnosticMode = 3.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(SetDiagnosticMode);\r\n\r\n\t\t/*8*/\r\n\t\tDouble SetAutoFill = new Double();\r\n\t\tSetAutoFill = context.GetInput<double>(\"AutoFillMode\");\r\n\t\tconfigurationParameters.GeneralParameters.Add(SetAutoFill);\r\n\r\n\t\t//configurationParameters\t= context.RequestUserInputFor<ConfigurationParameters>(configurationParameters,\"ConfigurationParameters Input Required\",\"Please fill in the form\");\r\n\t\t\r\n\t\tFile.WriteAllBytes(\"C:/temp/EmbParam.cfg\",configurationParameters.ToBytes());\r\n\r\n\t\tbyte[] fileBytes = File.ReadAllBytes(\"C:/temp/EmbParam.cfg\");\r\n\r\n\r\n\t\tvar config = ConfigurationParameters.Parser.ParseFrom(fileBytes);\r\n\r\n\t\tcontext.Write( config);\r\n\t\tThread.Sleep(1000);\r\n\r\n\t\r\n\t\tcontext.Write(\"\\n\\n Deleting old file\");\r\n\r\n\t\tDeleteRequest deleteRequest = new DeleteRequest();\r\n\t\tdeleteRequest.Path = \"SYSINFO//EmbParam.cfg\";\r\n\t\tdeleteRequest.Attribute = Tango.PMR.IO.FileAttribute.Unspecified;\r\n\t\tDeleteResponse response5 = context.Send<DeleteResponse>(deleteRequest);\r\n\r\n\r\n\t\tThread.Sleep(1000);\r\n\t\tcontext.Write(\"\\n\\n Loading new file file\");\r\n\r\n\t\tFileUploadRequest fileUploadRequest = new FileUploadRequest();\r\n\t\tfileUploadRequest.Path = \"SYSINFO//EmbParam.cfg\";\r\n\t\tfileUploadRequest.Length = (int)fileBytes.Length;\r\n\t\tFileUploadResponse response2 = context.Send<FileUploadResponse>(fileUploadRequest);\r\n\t\tThread.Sleep(1000);\r\n\t\tlong chunk_size = response2.MaxChunkLength;\r\n\r\n\t\tFileStream fs = new FileStream(\"C:/temp/EmbParam.cfg\",FileMode.Open);\r\n\r\n\t\twhile (fs.Position < fs.Length)\r\n\t\t{\r\n\t\t\t\tcontext.Write(\"Position \"+ fs.Position+ \" Length \"+ fs.Length +\"\\n\\n\");\r\n\t\t\t\tFileChunkUploadRequest fileChunkUploadRequest = new FileChunkUploadRequest();\r\n\t\t\t\tfileChunkUploadRequest.UploadID = response2.UploadID;\r\n\t\t\t\tbyte[] chunk = new byte[Math.Min(chunk_size,fs.Length - fs.Position)];\r\n\t\t\t\tfs.Read(chunk,0,chunk.Length);\r\n\t\t\t\tfileChunkUploadRequest.Buffer = ByteString.CopyFrom(chunk);\t\r\n\t\t\t\tvar response3 = context.Send<FileChunkUploadResponse>(fileChunkUploadRequest);\r\n\t\t\t\tThread.Sleep(2000);\r\n\r\n\t\t}\r\n\r\n\t\t// activating the new file\r\n\t\tProgressRequest progressRequest = new ProgressRequest();\r\n\t\tprogressRequest.Amount = 0xCD;\r\n\t\tprogressRequest.Delay = 0xCD;\r\n\t\tvar response1 = context.Send<ProgressResponse>(progressRequest);\r\n\r\n }\r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[{"$id":"6","Type":"Default","SelectionInputs":{"$id":"7","$values":[]},"DisplayName":"Check Tamper / Fan alarms","Description":"Check Tamper / Fan alarms (1 -true, 0 - false)","Key":"CheckTampers","Value":"1"},{"$id":"8","Type":"Default","SelectionInputs":{"$id":"9","$values":[]},"DisplayName":"Initial Heating on startup","Description":"Initial Heating on startup","Key":"InitialHeating","Value":"true"},{"$id":"10","Type":"Default","SelectionInputs":{"$id":"11","$values":[]},"DisplayName":"WCF Value","Description":"WCF Value","Key":"WCF_Value","Value":"40"},{"$id":"12","Type":"Default","SelectionInputs":{"$id":"13","$values":[]},"DisplayName":"AutoFill Mode","Description":"Controls the AutoFill Mode","Key":"AutoFillMode","Value":"3.0"},{"$id":"14","Type":"Default","SelectionInputs":{"$id":"15","$values":[]},"DisplayName":"Set Cleaning Values","Description":"Set to 1 if you want to update the cleaning values","Key":"SetCleaningValues","Value":"false"}]},"ReferenceAssemblies":{"$id":"16","$values":[{"$id":"17","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"18","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"19","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"20","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"21","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"22","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"23","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"24","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"25","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"26","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"27","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Dialogs":{"$id":"28","$values":[]},"ID":"2bd29884-5eb9-4d27-be4e-6cfa31dc9f66","ApartmentState":"MTA"}
\ No newline at end of file diff --git a/Software/Stubs Collection/Procedures/Selection Input.pproj b/Software/Stubs Collection/Procedures/Selection Input.pproj new file mode 100644 index 000000000..dfe8b2553 --- /dev/null +++ b/Software/Stubs Collection/Procedures/Selection Input.pproj @@ -0,0 +1 @@ +{"$id":"1","Name":"Selection Input","Description":"Selection Input Demonstration","Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\r\n context.AddResult(ResultType.Passed, \"Selection\", context.GetInput(\"select\"));\r\n\r\n }\r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[{"$id":"6","Key":"select","Type":"Selection","DisplayName":"Parameter 1","Description":"Controls the 1 parameter.","Value":"Value1","SelectionInputs":{"$id":"7","$values":[{"$id":"8","Name":"Value 1 Name","Value":"Value1"},{"$id":"9","Name":"Value 2 Name","Value":"Value2"}]}},{"$id":"10","Key":"param2","Type":"Default","DisplayName":"Parameter 2","Description":"Controls the 2 parameter.","Value":"0","SelectionInputs":{"$id":"11","$values":[]}}]},"ReferenceAssemblies":{"$id":"12","$values":[{"$id":"13","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"14","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"15","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"16","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"17","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"18","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"19","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"20","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"21","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"22","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"23","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Dialogs":{"$id":"24","$values":[]},"ID":"9c8ea90a-47ea-45d8-a5b6-06da13e8ddde","ApartmentState":"STA"}
\ No newline at end of file diff --git a/Software/Stubs Collection/Procedures/WHS Loop Disable.pproj b/Software/Stubs Collection/Procedures/WHS Loop Disable.pproj index 046c188a1..767f1f3cc 100644 --- a/Software/Stubs Collection/Procedures/WHS Loop Disable.pproj +++ b/Software/Stubs Collection/Procedures/WHS Loop Disable.pproj @@ -1 +1 @@ -{"$id":"1","Name":"WHS Loop Disable","Description":null,"Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\r\n\t\tint ControlLoopEnable = 0x1000;\r\n\t\tint ControlLoopDisable = 0x0000;\r\n\t\t\r\n\t\tProgressRequest progressRequest = new ProgressRequest();\r\n\t\tprogressRequest.Amount = 0x3e8;\r\n\t\tprogressRequest.Delay = ControlLoopDisable+2700;\r\n\r\n\tvar response = context.Send<ProgressResponse>(progressRequest);\r\n\r\n }\r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[]},"ReferenceAssemblies":{"$id":"6","$values":[{"$id":"7","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"8","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"9","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"10","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"11","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"12","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"13","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"14","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"15","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"16","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"17","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"ApartmentState":"MTA"}
\ No newline at end of file +{"$id":"1","Name":"WHS Loop Disable","Description":null,"Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\r\n\t\tint ControlLoopEnable = context.GetInput<int>(\"WasteControlLoop\");\r\n\t\t\r\n\t\tProgressRequest progressRequest = new ProgressRequest();\r\n\t\tprogressRequest.Amount = 0x3e8;\r\n\t\tprogressRequest.Delay = ControlLoopEnable*0x1000+2700;\r\n\r\n\t\tvar response = context.Send<ProgressResponse>(progressRequest);\r\n context.AddResult(ResultType.Passed, \"Success\", response.Progress);\r\n context.AddResult(ResultType.Failed, \"Failed\", response.Progress);\r\n\r\n\r\n }\r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[{"$id":"6","Type":"Default","SelectionInputs":{"$id":"7","$values":[]},"DisplayName":"Waste Control Loop Enabled","Description":"Waste Control Loop Enabled","Key":"WasteControlLoop","Value":"1"}]},"ReferenceAssemblies":{"$id":"8","$values":[{"$id":"9","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"10","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"11","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"12","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"13","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"14","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"15","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"16","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"17","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"18","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"19","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Dialogs":{"$id":"20","$values":[]},"ID":"eb9234b2-2aa0-4bf2-bfe4-dcc8de49bda6","ApartmentState":"MTA"}
\ No newline at end of file diff --git a/Software/Stubs Collection/Procedures/demo.pproj b/Software/Stubs Collection/Procedures/demo.pproj new file mode 100644 index 000000000..b5be39462 --- /dev/null +++ b/Software/Stubs Collection/Procedures/demo.pproj @@ -0,0 +1 @@ +{"$id":"1","Name":"demo","Description":"Demo project for developers.","Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\r\n context.WriteLine(\"Calculating...\");\r\n context.Sleep(2000);\r\n\r\n double a = context.GetInput<double>(\"n1\");\r\n double b = context.GetInput<double>(\"n2\");\r\n\r\n\r\n double d = context.RequestUserInputFor<double>(20, \"Additional Number\", \"Please provide another value\");\r\n \r\n Person pp = context.RequestUserInputFor<Person>(\"Person Input Required\",\"Please fill in the form\");\r\n \r\n if (pp.Name == \"Roy\")\r\n {\r\n \tif (context.ShowWarningQuestion(\"The name Roy is invalid are you sure?\"))\r\n \t{\r\n \t\tcontext.Fail(\"Name Roy is invalid!\");\r\n \t}\r\n }\r\n \r\n\r\n double c = a + b + d;\r\n\r\n\r\n\r\n context.AddResult(ResultType.Passed, \"Calc Result\", c);\r\n context.AddResult(ResultType.Warning, \"Other Value\", \"Some Value\");\r\n\r\n List<double> list = new List<double>();\r\n List<Person> persons = new List<Person>();\r\n\r\n for (int i = 0; i < 100; i++)\r\n {\r\n list.Add(i);\r\n\r\n Person p = new Person();\r\n p.Age = i;\r\n p.Name = \"Roy \" + i;\r\n persons.Add(p);\r\n }\r\n\r\n double sum = list.Sum();\r\n\r\n context.AddResult(ResultType.Passed, \"Array Result\", list);\r\n context.AddGraphResult(ResultType.Passed, \"Graph Result\", list);\r\n\r\n context.AddResult(ResultType.Passed, \"Persons\", persons);\r\n\r\n Bitmap bitmap = context.CreateBitmap(400, 200);\r\n Graphics g = context.GetDrawingContext(bitmap);\r\n\r\n g.Clear(Color.Blue);\r\n g.FillRectangle(Brushes.Red, 10, 10, 50, 50);\r\n\r\n context.AddBitmapResult(ResultType.Passed, \"Bitmap Demo\", bitmap);\r\n\r\n g.Dispose();\r\n\r\n List<double> dancerValues = new List<double>();\r\n\r\n context.WriteLine(\"Collecting dancer angle...\");\r\n\r\n for (int i = 0; i < 100; i++)\r\n {\r\n DiagnosticsPackage package = context.GetDiagnosticsPackage(true);\r\n double dancerAngle = package.GetMonitorLastValue(TechMonitors.Dancer2Angle);\r\n\r\n dancerValues.Add(dancerAngle);\r\n\r\n context.UpdateProgress(\"Collecting dancer position...\", false, i, 50);\r\n }\r\n\r\n context.AddGraphResult(ResultType.Passed, \"Dancer Angle\", dancerValues);\r\n }\r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n\tpublic const String WORD = \"123\";\r\n\tpublic const int NUM = 1;\r\n}","Name":"Service.csx","IsEntryPoint":false},{"$id":"5","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Person\r\n{\r\n\tpublic int Age;\r\n\t[Description(\"First Name\")]\r\n\tpublic String Name;\r\n}","Name":"Person.csx","IsEntryPoint":false}]},"Inputs":{"$id":"6","$values":[{"$id":"7","DisplayName":"Number A","Description":"First number for calc","Key":"n1","Value":"10"},{"$id":"8","DisplayName":"Number B","Description":"Second number for calc","Key":"n2","Value":"15"}]},"ReferenceAssemblies":{"$id":"9","$values":[{"$id":"10","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"11","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"12","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"13","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"14","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"15","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"16","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"17","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"18","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"19","File":"C:\\DATA\\Development\\Tango\\Software\\Visual_Studio\\Build\\FSE\\Debug\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"20","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Dialogs":{"$id":"21","$values":[]},"ID":"4d95f6b1-ee07-4bc8-85af-18bc12326f29","ApartmentState":"STA"}
\ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Get_PowerStep01_Parameters.cs b/Software/Stubs Collection/stubs/Get_PowerStep01_Parameters.cs new file mode 100644 index 000000000..e6ced17eb --- /dev/null +++ b/Software/Stubs Collection/stubs/Get_PowerStep01_Parameters.cs @@ -0,0 +1,227 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +//unmark Auto logging ! + +const Int32 x_POWERSTEP01_CONFIG = 0x1A; +const Int32 x_POWERSTEP01_STATUS = 0x1B; +const Int32 x_POWERSTEP01_GATECFG1 = 0x18; +const Int32 x_POWERSTEP01_GATECFG2 = 0x19; + +const Int32 x_ABS_POS = 0x01; +const Int32 x_EL_POS = 0x02; +const Int32 x_MARK = 0x03; +const Int32 x_SPEED = 0x04; +const Int32 x_ACC = 0x05; +const Int32 x_DEC = 0x06; +const Int32 x_MAX_SPEED = 0x07; +const Int32 x_MIN_SPEED = 0x08; +const Int32 x_FS_SPD = 0x15; +const Int32 x_KVAL_HOLD = 0x09; +const Int32 x_KVAL_RUN = 0x0A; +const Int32 x_KVAL_ACC = 0x0B; +const Int32 x_KVAL_DEC = 0x0C; +const Int32 x_INT_SPD = 0x0D; +const Int32 x_ST_SLP = 0x0E; +const Int32 x_FN_SLP_ACC = 0x0F; +const Int32 x_FN_SLP_DEC = 0x10; +const Int32 x_K_THERM = 0x11; +const Int32 x_ADC_OUT = 0x12; +const Int32 x_OCD_TH = 0x13; +const Int32 x_STALL_TH = 0x14; +const Int32 x_STEP_MODE = 0x16; +const Int32 x_ALARM_EN = 0x17; +const Int32 x_CONFIG = 0x18; +const Int32 x_STATUS = 0x19; +//------------------------------- +const Int32 x_GET_PARAM = 0x20; +//------------------------------- +const Int32 Max_Motor_ID = 25; + +string[] Motor_ID = new string[30]; + + +Motor_ID[0] ="DH_CLEANHEAD "; +Motor_ID[1] ="DH_CLEANMECH "; +Motor_ID[2] ="DH_LID "; +Motor_ID[3] ="DRYER_DRIVING"; +Motor_ID[4] ="DRYER_LID "; +Motor_ID[5] ="DRYER_LOADARM"; +Motor_ID[6] ="DISPENCER_1 "; +Motor_ID[7] ="DISPENCER_2 "; +Motor_ID[8] ="DISPENCER_3 "; +Motor_ID[9] ="DISPENCER_4 "; +Motor_ID[10]="DISPENCER_5 "; +Motor_ID[11]="DISPENCER_6 "; +Motor_ID[12]="DISPENCER_7 "; +Motor_ID[13]="DISPENCER_8 "; +Motor_ID[14]="SCREW "; +Motor_ID[15]="WINDER "; +Motor_ID[16]="LDANCER1 "; +Motor_ID[17]="LDANCER2 "; +Motor_ID[18]="LDRIVING "; +Motor_ID[19]="LLODING "; +Motor_ID[20]="LPIVOT "; +Motor_ID[21]="RDANCER "; +Motor_ID[22]="RDRIVING "; +Motor_ID[23]="RLOADARM "; +Motor_ID[24]="RLODING "; +Motor_ID[25]="SPARE1_1 "; +Motor_ID[26]="SPARE1_2 "; +Motor_ID[27]="SPARE2_1 "; +Motor_ID[28]="SPARE2_2 "; +Motor_ID[29]="SPARE3 "; + +public void OnExecute(StubManager stubManager) +{ + + var i = stubManager.ShowResponseWindow("Please Enter Motor ID:"); + + stubManager.Write("Motor_ID:\t\t "); + stubManager.Write(i); + stubManager.Write("\n"); + + stubManager.Write("ABS_POS:\t\t"); + var response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_ABS_POS)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("EL_POS:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_EL_POS)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("MARK:\t\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_MARK)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("SPEED:\t\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_SPEED)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("ACC:\t\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_ACC)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("DEC:\t\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_DEC)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("MAX_SPEED:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_MAX_SPEED)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("MIN_SPEED:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_MIN_SPEED)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("FS_SPD:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_FS_SPD)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("KVAL\\TVAL_HOLD:\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_KVAL_HOLD)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("KVAL\\TVAL_RUN:\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_KVAL_RUN)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("KVAL\\TVAL_ACC:\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_KVAL_ACC)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("KVAL\\TVAL_DEC:\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_KVAL_DEC)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("INT_SPEED:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_INT_SPD)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("ST_SLP\\T_FAST:\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_ST_SLP)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("FN_SLP_ACC\\TON_MIN:\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_FN_SLP_ACC)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("FN_SLP_DEC\\TOFF_MIN:"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_FN_SLP_DEC)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("K_THERM:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_K_THERM)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("ADC_OUT:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_ADC_OUT)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("OCD_TH:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_OCD_TH)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("STALL_TH:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_STALL_TH)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("STEP_MODE:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_STEP_MODE)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("ALARM_EN:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_ALARM_EN)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("GATECFG1:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_POWERSTEP01_GATECFG1)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("GATECFG2:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_POWERSTEP01_GATECFG2)<<8, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("CONFIG:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_POWERSTEP01_CONFIG)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); + + stubManager.Write("STATUS:\t\t"); + response = stubManager.Run<StubMotorResponse>("StubMotorRequest" ,i, (x_GET_PARAM | x_POWERSTEP01_STATUS)<<16, 0, 0); + stubManager.WriteHex(response.RecivedData,4); + stubManager.Write("\n"); +}
\ No newline at end of file diff --git a/Software/Stubs Collection/stubs/Set CleaningSequence.cs b/Software/Stubs Collection/stubs/Set CleaningSequence.cs new file mode 100644 index 000000000..a73134e7b --- /dev/null +++ b/Software/Stubs Collection/stubs/Set CleaningSequence.cs @@ -0,0 +1,23 @@ +using System; +using System.Text; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Tango.PMR.Stubs; +using Tango.Stubs; + +public void OnExecute(StubManager stubManager) +{ + + +ProgressRequest progressRequest = new ProgressRequest(); +progressRequest.Amount = 0xAD7; +progressRequest.Delay = 0; //disable + +var response = stubManager.Run<ProgressResponse>(progressRequest); + +}
\ No newline at end of file diff --git a/Software/Stubs Collection/WHS_EEPROM.cs b/Software/Stubs Collection/stubs/WHS_EEPROM.cs index b5c7af2b1..b5c7af2b1 100644 --- a/Software/Stubs Collection/WHS_EEPROM.cs +++ b/Software/Stubs Collection/stubs/WHS_EEPROM.cs diff --git a/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs b/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs index eaf15b1f6..3b3768310 100644 --- a/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs +++ b/Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs @@ -76,7 +76,7 @@ configurationParameters.IDSCleaningSpeed = 800; configurationParameters.IDSCleaningStopBeforeSegmentTime = 10000; //end of presegemnt configurationParameters.IDSCleaningStartSprayPreSegmentTime =2000; //beginning of presegment -int Tup = 6,Tdelay1 = 26,Tdelay2 = 65;//300 milli up, stay 1 sec, stay down 2 sec +int Tup = 8,Tdelay1 = 98,Tdelay2 = 198; //350nsec up, 1 second delay, 2 seconds before up again // Tup = LeftRockerSpeed/100; // Tdelay1 = LeftRockerSpeed%100; // Tdelay2 = RightRockerSpeed; diff --git a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.cpp b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.cpp index 8f4b55db9..930980726 100644 --- a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.cpp +++ b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.cpp @@ -1,4 +1,5 @@ #include "ColorConverter.h" +#include "ColorConvert.h" #include "CalibrationPoint.pb-c.h" #include "CalibrationData.pb-c.h" #include "ColorSpace.pb-c.h" @@ -53,22 +54,23 @@ #define dETol 2.0 # define ROUNDINGDigits 2.0 #define maxPerRegion 100.0 -#define LowVolumeThreshold 2.0 +#define LowVolumeThreshold 0.0 #define LowVolHalf LowVolumeThreshold/2 +#define GradientEndThr 0.95 Tango::ColorLib::ColorConverter::ColorConverter() : m_A2BTransform(NULL), m_B2ATransform(NULL), m_GBD(NULL), m_CalibCurves(NULL), m_Conv02(NULL), m_GamutRegionMaxLim(NULL), m_maxNlPerCM(NULL), m_nA2BnSepIn(0), m_nA2BnSepOut(0), m_nB2AnSepIn(0), m_nB2AnSepOut(0), -m_nInks(0), m_nVolumes(0), m_AdaptWP(false), m_nGamutRegions(0), m_LinCurves(NULL), -m_nProcessRanges(0), m_ProcessRangesMaxP(NULL) +m_nInks(0), m_nVolumes(0), m_nGamutRegions(0), m_LinCurves(NULL), +m_nProcessRanges(0), m_ProcessRangesMaxP(NULL), m_GradStops(NULL), m_nGradStops(0), m_NormFactor(-1.0), +m_InvNormFactor(-1.0) //m_ProcessRangesMinInkUptake(NULL),m_ProcessRangesMinP(NULL), //m_ProcessRangesMaxInkUptake(NULL) { m_whitepointLab.Set(-1, -1, -1); m_whitepointXYZ_Strip.Set(-1, -1, -1); m_whitepointXYZ_CT.Set(-1, -1, -1); - } Tango::ColorLib::ColorConverter::~ColorConverter() @@ -113,6 +115,11 @@ Tango::ColorLib::ColorConverter::~ColorConverter() delete[] m_ProcessRangesMaxP; m_ProcessRangesMaxP = NULL; } + if (m_GradStops != NULL) + { + delete[] m_GradStops; + m_GradStops = NULL; + } /* if (m_ProcessRangesMinP != NULL) { delete[] m_ProcessRangesMinP; @@ -217,6 +224,7 @@ void Tango::ColorLib::ColorConverter::ProcessHiveNeighbors(ConversionInput *conv //double * LabInFinal1 = DBG_NEW double[3]; double * LabInFinal2 = new double[3]; double * LabOnGamut = new double[3]; + double *InkOutP = new double[m_nB2AnSepOut]; bool InGamut = true; for (int i = 0; i < nHive; ++i) { @@ -224,30 +232,51 @@ void Tango::ColorLib::ColorConverter::ProcessHiveNeighbors(ConversionInput *conv for (j = 0; j < 3; ++j) Lab1P[j] = Lab1(i, j); //Check if whitepoints match - if (m_AdaptWP) +/* if (m_AdaptWP) { //Convert to CT whitepoint m_Conv02->ChangeWP(Lab1P, Lab1P, m_whitepointXYZ_CT, m_whitepointXYZ_Strip); LimitLab(LabInFinal1); } - ColConv.ChangeWP(Lab1P, Lab1P, m_WP, m_whitepointXYZ_CT); //to Relative - + */ +// ColConv.ChangeWP(Lab1P, Lab1P, m_WP, m_whitepointXYZ_CT); //to Relative + ColConv.ChangeWP(Lab1P, Lab1P, m_WP, m_whitepointXYZ_Strip); //to Relative m_B2ATransform->evalLab2InkP(Lab1P, InkOut, GamutRegion[i]); //InkOut is in units of 16 bits + for (int i = 0; i < m_nB2AnSepOut; ++i) + { + InkOut[i] *= m_NormFactor; + if (InkOut[i] <= m_GamutRegionMaxLim[0]) + { + m_LinCurves->m_InterpCurves[i].Eval(InkOut[i] * 655.35, InkOut[i]); + InkOut[i] /= 655.35; + } + } InGamut = IsInGamut(Lab1P, sur, CS, LabOnGamut); LimitLab(LabOnGamut); + VectorXd NLInkOut(m_nB2AnSepOut); + ConvertToNLInks(DoubleToVector(InkOut, m_nInks), NLInkOut); + + //Limit inks based on m_maxNlpercm + //Inks are limited in their nonlinear form + //Output Volume is in % + LimitInks(NLInkOut, InkOutP); + NLInkPToVolume(DoubleToVector(InkOutP, m_nInks), Vol); + GamutRegion[i] = GetGamutRegion(Vol, m_ProcessRangesMaxP); + NLcmtoPercentage(Vol, Vol); //m_A2BTransform->evalInkP2Lab(InkOut, Lab1P, GamutRegion[i]); //Convert to CT WP - m_Conv02->ChangeWP(LabOnGamut, LabInFinal1, m_whitepointXYZ_CT, m_WP); //convert back to Absolute +// m_Conv02->ChangeWP(LabOnGamut, LabInFinal1, m_whitepointXYZ_CT, m_WP); //convert back to Absolute + m_Conv02->ChangeWP(LabOnGamut, LabInFinal1, m_whitepointXYZ_Strip, m_WP); //convert back to Absolute LimitLab(LabInFinal1); //Absolute //Check if whitepoints match - if (m_AdaptWP) +/* if (m_AdaptWP) { //Convert to Strip whitepoint m_Conv02->ChangeWP(LabInFinal1, LabInFinal1, m_whitepointXYZ_Strip, m_whitepointXYZ_CT); LimitLab(LabInFinal1); - } + }*/ m_Conv02->SetReferenceWhite(D65); for (int j = 0; j < 3; ++j) LabHive(i, j) = LabInFinal1[j]; @@ -257,32 +286,7 @@ void Tango::ColorLib::ColorConverter::ProcessHiveNeighbors(ConversionInput *conv //m_Conv02->LabtoRGB(Lab1P, tmpRGB); for (int j = 0; j < 3; ++j) RGBTmpVec(i, j) = std::min(std::max(tmpRGB[j], 0.0), 255.0); - - double NormFactor = m_ProcessRangesMaxP[m_nProcessRanges - 1] / 100.0; - for (int j = 0; j < m_nB2AnSepOut; ++j) - { - InkOut[j] *= NormFactor; - if (InkOut[j] <= m_ProcessRangesMaxP[0]) - { - m_LinCurves->m_InterpCurves[j].Eval(InkOut[j] * 655.35, InkOut[j]); - InkOut[j] /= 655.35; - } - } - - VectorXd InkOutV = DoubleToVector(InkOut, m_nInks); - - ConvertToNLInks(InkOutV, InkOutV); - double maxNLInk = NegValue; - for (int j = 0; j < m_nInks; ++j) - maxNLInk = std::max(InkOutV(j), maxNLInk); - - for (int j = 0; j < (int)(conversionInput->n_processranges - 1); ++j) - { - if (maxNLInk > m_ProcessRangesMaxP[j]) - GamutRegion[i]++; - } - - NLInkPToVolume(InkOutV, Vol); + //make sure the rounded sum does not exceed the limit in the gamut region for (int j = 0; j < m_nInks; ++j) VolumeHive(i, j) = Vol(j); @@ -348,6 +352,11 @@ void Tango::ColorLib::ColorConverter::ProcessHiveNeighbors(ConversionInput *conv delete[]LabInFinal1; LabInFinal1 = NULL; } + if (InkOutP != NULL) + { + delete[] InkOutP; + InkOutP = NULL; + } return; } @@ -443,6 +452,10 @@ void Tango::ColorLib::ColorConverter::ArrangeHiveData(MatrixXd LabHive, MatrixX } } + + + + void Tango::ColorLib::ColorConverter::fillVolume(OutputCoordinates *&outputCoords, VectorXd Volume) { int i = 0; @@ -493,29 +506,39 @@ void Tango::ColorLib::ColorConverter::fillLab(OutputCoordinates *outputCoords, V outputCoords->has_b = true; outputCoords->b = LabOut(2); } - void Tango::ColorLib::ColorConverter::readColorTransformations(ConversionInput* conversionInput) { + SetStripWhitepoint(conversionInput->threadl, conversionInput->threada, conversionInput->threadb); + bool has_forwarddata = conversionInput->has_forwarddata; + uint8_t *data = conversionInput->forwarddata.data; + int nprocessranges = conversionInput->n_processranges; + readColorTables(has_forwarddata, data, nprocessranges); + +} + +void Tango::ColorLib::ColorConverter::SetStripWhitepoint(double threadl, double threada, double threadb) +{ //Read thread white. Thread White is given in CIELab Space - m_whitepointLab.Set(conversionInput->threadl, conversionInput->threada, conversionInput->threadb); + m_whitepointLab.Set(threadl, threada, threadb); //White point in XYZ Color Space ColorConvert CConvert(D65, D65); C_RGB_XYZ_Lab tmpW; tmpW = CConvert.LabToXYZ(m_whitepointLab); m_whitepointXYZ_Strip.Set(tmpW.Get_x(), tmpW.Get_y(), tmpW.Get_z()); +} - - +void Tango::ColorLib::ColorConverter::readColorTables(bool has_data, uint8_t * data, int nprocessranges) +{ //parse Color Tansformations, placed in forward data int bytesread = 0; NumConversions conv; int tag_count = 0; - if (conversionInput->has_forwarddata) + if (has_data) { //Read Header - CT_Header header = read_header(conversionInput, bytesread); + CT_Header header = read_header(data, bytesread); SetnGamutRegions((int)header.nGamutRegions); - if (m_nGamutRegions != conversionInput->n_processranges) + if (m_nGamutRegions != nprocessranges) { throw std::exception("Number of gamut regions in table does not match STRIP\0"); return; @@ -523,7 +546,7 @@ void Tango::ColorLib::ColorConverter::readColorTransformations(ConversionInput* m_GamutRegionMaxLim = new double[m_nGamutRegions]; for (int i = 0; i < m_nGamutRegions; ++i) m_GamutRegionMaxLim[i] = header.GRegMaxLim[i]; - m_nProcessRanges = (int)(conversionInput->n_processranges); + m_nProcessRanges = (int)(nprocessranges); /* for (int i = 0; i < m_nGamutRegions; ++i) { @@ -539,7 +562,7 @@ void Tango::ColorLib::ColorConverter::readColorTransformations(ConversionInput* uint32_t tmp; - uint8_t *buff = conversionInput->forwarddata.data; + uint8_t *buff =data; tmp = conv.ByteToInt(buff, bytesread); tag_count = (int)tmp; bytesread += 4; @@ -602,7 +625,7 @@ void Tango::ColorLib::ColorConverter::readColorTransformations(ConversionInput* { case A2B: { - uint8_t *A2BLUT = &(conversionInput->forwarddata.data[TagSize[k][0]]); + uint8_t *A2BLUT = &(data[TagSize[k][0]]); int A2BLutsize = TagSize[k][1]; m_A2BTransform = new ColorTransf(); //m_A2BTransform = DBG_NEW ColorTransf(); @@ -611,7 +634,7 @@ void Tango::ColorLib::ColorConverter::readColorTransformations(ConversionInput* } case B2A: { - uint8_t *B2ALUT = &(conversionInput->forwarddata.data[TagSize[k][0]]); + uint8_t *B2ALUT = &(data[TagSize[k][0]]); int B2ALutsize = TagSize[k][1]; m_B2ATransform = new ColorTransf(); //m_B2ATransform = DBG_NEW ColorTransf(); @@ -629,7 +652,7 @@ void Tango::ColorLib::ColorConverter::readColorTransformations(ConversionInput* } */ case gbd: { - uint8_t *GBDList = &(conversionInput->forwarddata.data[TagSize[k][0]]); + uint8_t *GBDList = &(data[TagSize[k][0]]); m_GBD = new GBD(); //m_GBD = DBG_NEW GBD(); int GBDSize = TagSize[k][1]; @@ -638,7 +661,7 @@ void Tango::ColorLib::ColorConverter::readColorTransformations(ConversionInput* } case lcrv: { - uint8_t *CurvesData = &(conversionInput->forwarddata.data[TagSize[k][0]]); + uint8_t *CurvesData = &(data[TagSize[k][0]]); m_LinCurves = new Curves(); int CurvesSize = TagSize[k][1]; m_LinCurves->InitData(CurvesData, CurvesSize); @@ -646,20 +669,20 @@ void Tango::ColorLib::ColorConverter::readColorTransformations(ConversionInput* } case wtpt: { - read_xyz_type(TagSize[k][0], TagSize[k][1], &m_whitepointXYZ_CT, conversionInput); + read_xyz_type(TagSize[k][0], TagSize[k][1], &m_whitepointXYZ_CT, data); break; } case cprt: { std::string textstr; - read_text_type(TagSize[k][0], TagSize[k][1], &textstr, conversionInput); + read_text_type(TagSize[k][0], TagSize[k][1], &textstr, data); break; } case desc: { std::string textdescstr; - read_text_description_type(TagSize[k][0], TagSize[k][1], textdescstr, conversionInput); + read_text_description_type(TagSize[k][0], TagSize[k][1], textdescstr, data); break; } default: @@ -744,19 +767,19 @@ void Tango::ColorLib::ColorConverter::readColorTransformations(ConversionInput* } -void Tango::ColorLib::ColorConverter::readCalibrationTables(ConversionInput* conversionInput) +void Tango::ColorLib::ColorConverter::readCalibrationTables(InputLiquid **inputliquid, int n_inputliquid) { - SetNumberofInks((int)(conversionInput->inputcoordinates->n_inputliquids)); + SetNumberofInks((int)(n_inputliquid)); //CalibData *CalibCurves = new CalibData[m_nInks]; m_CalibCurves = new CalibData[m_nInks]; //m_CalibCurves = DBG_NEW CalibData[m_nInks]; for (int i = 0; i < m_nInks; ++i) { - InputLiquid* InkType = conversionInput->inputcoordinates->inputliquids[i]; + InputLiquid* InkType = inputliquid[i]; m_CalibCurves[i].SetCalibName((int)(InkType->calibrationdata->liquidtype)); - m_CalibCurves[i].SetMaxNlPerCM(conversionInput->inputcoordinates->inputliquids[i]->maxnanoliterpercentimeter); + m_CalibCurves[i].SetMaxNlPerCM(inputliquid[i]->maxnanoliterpercentimeter); switch (InkType->calibrationdata->liquidtype) { case LIQUID_TYPE__Cyan: @@ -821,7 +844,8 @@ void Tango::ColorLib::ColorConverter::SetCalibData(CalibrationData *calibrationD return; } -void Tango::ColorLib::ColorConverter::ConvertColorToLinearInks(ConversionInput* conversionInput, VectorXd &InkOut, VectorXd &RGBOut, +void Tango::ColorLib::ColorConverter::ConvertColorToLinearInks(InputCoordinates* inputcoordinates, ColorSpace colorspace, + VectorXd &InkOut, VectorXd &RGBOut, VectorXd &LabOut, int &GamutRegion, bool &InGamut) { size_t nInks = 0; @@ -829,7 +853,7 @@ void Tango::ColorLib::ColorConverter::ConvertColorToLinearInks(ConversionInput* C_RGB_XYZ_Lab DataLab; SURROUND sur = m_Conv02->getSurround(); CAM02CS CS = m_Conv02->getCAM02CS(); - switch (conversionInput->colorspace) + switch (colorspace) { case (COLOR_SPACE__RGB): { @@ -843,9 +867,9 @@ void Tango::ColorLib::ColorConverter::ConvertColorToLinearInks(ConversionInput* //4. Convert Lab to Absolute colorimetric taking into account the Strip and Color Table whitepoints //5. Use the Relative Colorimetric Lab to obtain RGB - RGBOut(0) = conversionInput->inputcoordinates->red; - RGBOut(1) = conversionInput->inputcoordinates->green; - RGBOut(2) = conversionInput->inputcoordinates->blue; + RGBOut(0) = inputcoordinates->red; + RGBOut(1) = inputcoordinates->green; + RGBOut(2) = inputcoordinates->blue; //convert to Lab ColorConvert CConvertD65(D65, D65); //Destination, source double *LabIn = new double[3]; @@ -867,19 +891,18 @@ void Tango::ColorLib::ColorConverter::ConvertColorToLinearInks(ConversionInput* double *InkOutP = new double[m_nB2AnSepOut]; //double *InkOutP = DBG_NEW double[m_nB2AnSepOut]; //LabInFinal is in Relative Colorimetric, just like the Color Tables - m_B2ATransform->evalLab2InkP(LabOnGamut, InkOutP, GamutRegion); //InkOut is in units of 16 bits + m_B2ATransform->evalLab2InkP(LabOnGamut, InkOutP, GamutRegion); //InkOut is inthe [0-100] interval //Convert to Lab to get the actual in Gamut Lab //double *LabInP = new double[3]; //double *LabInP = DBG_NEW double[3]; //m_A2BTransform->evalInkP2Lab(InkOutP, LabInP, GamutRegion); //Lab is in Relative Colorimetric - double NormFactor = m_ProcessRangesMaxP[m_nProcessRanges - 1] / 100.0; //Convert InkOut to Linear via initial calibration Tables //Initial calibration tables are the ones that were included in the color table for (int i = 0; i < m_nB2AnSepOut; ++i) { - InkOutP[i] *= NormFactor; - if (InkOutP[i] <= m_ProcessRangesMaxP[0]) + InkOutP[i] *= m_NormFactor; + if (InkOutP[i] <= m_GamutRegionMaxLim[0]) { m_LinCurves->m_InterpCurves[i].Eval(InkOutP[i] * 655.35, InkOutP[i]); InkOutP[i] /= 655.35; @@ -888,13 +911,16 @@ void Tango::ColorLib::ColorConverter::ConvertColorToLinearInks(ConversionInput* InkOut = DoubleToVector(InkOutP, m_nInks); //Convert to CT thread, LabOnGamut is in Relative Colorimetric Space - CConvertD65.ChangeWP(LabOnGamut, LabInFinal, m_whitepointXYZ_CT, m_WP); + //CConvertD65.ChangeWP(LabOnGamut, LabInFinal, m_whitepointXYZ_CT, m_WP); + CConvertD65.ChangeWP(LabOnGamut, LabInFinal, m_whitepointXYZ_Strip, m_WP); //check if the thread to be used is the same as the one in the color tables + /* if (m_AdaptWP) { //Convert to Strip White Point CConvertD65.ChangeWP(LabInFinal, LabInFinal, m_whitepointXYZ_Strip, m_whitepointXYZ_CT); } + */ LabOut = DoubleToVector(LabInFinal, 3); CConvertD65.SetReferenceWhite(D65); double *RGBOutP1 = new double[3]; @@ -945,28 +971,31 @@ void Tango::ColorLib::ColorConverter::ConvertColorToLinearInks(ConversionInput* //5. Use the Relative Colorimetric Lab to obtain RGB double *LabIn = new double[3]; //double *LabIn = DBG_NEW double[3]; - LabIn[0] = conversionInput->inputcoordinates->l; //Absolute Colorimetric - LabIn[1] = conversionInput->inputcoordinates->a; - LabIn[2] = conversionInput->inputcoordinates->b; + LabIn[0] = inputcoordinates->l; //Absolute Colorimetric + LabIn[1] = inputcoordinates->a; + LabIn[2] = inputcoordinates->b; //the assumption is that the color space has illumination that matches the whitepoint of the Strip ColorConvert CConvertD65(D65, D65); //Destination, source - double *LabInFinal1 = new double[3]; + // double *LabInFinal1 = new double[3]; //double *LabInFinal1 = DBG_NEW double[3]; - for (int i = 0; i < 3; ++i) - LabInFinal1[i] = LabIn[i]; + // for (int i = 0; i < 3; ++i) + // LabInFinal1[i] = LabIn[i]; //LabInFinal1 = LabIn; // Lab is assumed to match the color of the STRIP, however the tables could have a different WP //Check if Color Tables and Strip whitepoints are the same, otherwise convert - if (m_AdaptWP) + /* + if (m_AdaptWP) { CConvertD65.ChangeWP(LabInFinal1, LabInFinal1, m_whitepointXYZ_CT, m_whitepointXYZ_Strip); //to Color Tables for (int i = 0; i < 3; ++i) LabIn[i] = LabInFinal1[i]; } + */ double *LabInFinal2 = new double[3]; double *LabOnGamut = new double[3]; //double *LabInFinal2 = DBG_NEW double[3]; - CConvertD65.ChangeWP(LabIn, LabInFinal2, m_WP, m_whitepointXYZ_CT); //LabInFinal2 is in Relative Colorimetric Space +// CConvertD65.ChangeWP(LabIn, LabInFinal2, m_WP, m_whitepointXYZ_CT); //LabInFinal2 is in Relative Colorimetric Space + CConvertD65.ChangeWP(LabIn, LabInFinal2, m_WP, m_whitepointXYZ_Strip); //LabInFinal2 is in Relative Colorimetric Space InGamut = IsInGamut(LabInFinal2, sur, CS, LabOnGamut); LimitLab(LabOnGamut); @@ -978,12 +1007,11 @@ void Tango::ColorLib::ColorConverter::ConvertColorToLinearInks(ConversionInput* //Convert Inks to Lab to get the Gamut Mapped Lab //m_A2BTransform->evalInkP2Lab(InkOutP, LabIn, GamutRegion); //LabOut = DoubleToVector(LabIn, 3); - //Convert InkOutP to linear in the m_ProcessRangesMaxP[0] range - double NormFactor = m_ProcessRangesMaxP[m_nProcessRanges - 1] / 100.0; + //Convert InkOutP to linear in the m_GamutRegionMaxLim[0] range for (int i = 0; i < m_nB2AnSepOut; ++i) { - InkOutP[i] *= NormFactor; - if (InkOutP[i] <= m_ProcessRangesMaxP[0]) + InkOutP[i] *= m_NormFactor; + if (InkOutP[i] <= m_GamutRegionMaxLim[0]) { m_LinCurves->m_InterpCurves[i].Eval(InkOutP[i] * 655.35, InkOutP[i]); InkOutP[i] /= 655.35; @@ -996,11 +1024,14 @@ void Tango::ColorLib::ColorConverter::ConvertColorToLinearInks(ConversionInput* LabOutFinal[i] = LabOnGamut[i]; //LabOutFinal is in Relative Colorimetric //Reverse the conversion process to bring back Lab to STRIP white point - CConvertD65.ChangeWP(LabOutFinal, LabOutFinal, m_whitepointXYZ_CT, m_WP); +// CConvertD65.ChangeWP(LabOutFinal, LabOutFinal, m_whitepointXYZ_CT, m_WP); + CConvertD65.ChangeWP(LabOutFinal, LabOutFinal, m_whitepointXYZ_Strip, m_WP); +/* if (m_AdaptWP) { CConvertD65.ChangeWP(LabOutFinal, LabOutFinal, m_whitepointXYZ_Strip, m_whitepointXYZ_CT); } + */ LabOut = DoubleToVector(LabOutFinal, 3); CConvertD65.SetReferenceWhite(D65); //Convert to RGB @@ -1025,11 +1056,12 @@ void Tango::ColorLib::ColorConverter::ConvertColorToLinearInks(ConversionInput* delete[] LabIn; LabIn = NULL; } - if (LabInFinal1 != NULL) +/* if (LabInFinal1 != NULL) { delete[]LabInFinal1; LabInFinal1 = NULL; } + */ if (LabInFinal2 != NULL) { delete[]LabInFinal2; @@ -1056,10 +1088,10 @@ void Tango::ColorLib::ColorConverter::ConvertColorToLinearInks(ConversionInput* double *outData = new double[m_nA2BnSepIn]; //double *outData = DBG_NEW double[m_nA2BnSepIn]; size_t CountSep = 0; - outData[0] = (double)(conversionInput->inputcoordinates->cyan); - outData[1] = (double)(conversionInput->inputcoordinates->magenta); - outData[2] = (double)(conversionInput->inputcoordinates->yellow); - outData[3] = conversionInput->inputcoordinates->key; + outData[0] = (double)(inputcoordinates->cyan); + outData[1] = (double)(inputcoordinates->magenta); + outData[2] = (double)(inputcoordinates->yellow); + outData[3] = (double)(inputcoordinates->key); CountSep = 4; if (CountSep != m_nA2BnSepIn) @@ -1090,13 +1122,15 @@ void Tango::ColorLib::ColorConverter::ConvertColorToLinearInks(ConversionInput* LabOutFinal2[i] = LabOutP[i]; InGamut = true; //Check if white points match - CConvertD65.ChangeWP(LabOutFinal1, LabOutFinal1, m_whitepointXYZ_CT, m_WP); //To Absolute - if (m_AdaptWP) +// CConvertD65.ChangeWP(LabOutFinal1, LabOutFinal1, m_whitepointXYZ_CT, m_WP); //To Absolute + CConvertD65.ChangeWP(LabOutFinal1, LabOutFinal1, m_whitepointXYZ_Strip, m_WP); //To Absolute +/* if (m_AdaptWP) { CConvertD65.ChangeWP(LabOutFinal1, LabOutFinal2, m_whitepointXYZ_Strip, m_whitepointXYZ_CT); for (int i = 0; i < 3; ++i) LabOutFinal1[i] = LabOutFinal2[i]; } + */ LabOut = DoubleToVector(LabOutFinal1, 3); CConvertD65.SetReferenceWhite(D65); //Get RGB @@ -1141,8 +1175,8 @@ void Tango::ColorLib::ColorConverter::ConvertColorToLinearInks(ConversionInput* case(COLOR_SPACE__Catalog): { int32_t inData; - if (conversionInput->inputcoordinates->has_pantoncode) - inData = conversionInput->inputcoordinates->pantoncode; + if (inputcoordinates->has_pantoncode) + inData = inputcoordinates->pantoncode; else { //mismatch between color space and data @@ -1156,7 +1190,7 @@ void Tango::ColorLib::ColorConverter::ConvertColorToLinearInks(ConversionInput* default: { throw std::exception(" Unsupported Color Space"); - return; + break; } } //all data is now in linear ink format @@ -1168,7 +1202,7 @@ void Tango::ColorLib::ColorConverter::ConvertToNLInks(VectorXd InkIn, VectorXd { for (int i = 0; i < m_nVolumes; ++i) { - if (InkIn(i) <= m_ProcessRangesMaxP[0]) + if (InkIn(i) <= m_GamutRegionMaxLim[0]) m_CalibCurves[i].m_InvLinearInterp->Eval(InkIn(i), InkOut(i)); else InkOut(i) = InkIn(i); @@ -1188,13 +1222,14 @@ void Tango::ColorLib::ColorConverter::ConvertToLinearInks(VectorXd InkIn, Vecto void Tango::ColorLib::ColorConverter::VolumeToNLInkP(VectorXd Volume, VectorXd &NLInkP) { + //Volume is in %. In order to be compatible with NL to volume it has to be tranlated to nl/cm VectorXd InkP(m_nVolumes); int MaxInd = -1; double InkMax = -1.; double InkSum = 0.; for (int i = 0; i < m_nVolumes; ++i) { - InkP(i) = Volume(i); /// 100 * Volume(i) / m_maxNlPerCM(i); //Volume is in % + InkP(i) = Volume(i)* m_maxNlPerCM(i)/100; //Volume is in %, InkP is in [nl/cm] if (InkMax < InkP(i)) { InkMax = InkP(i); @@ -1202,7 +1237,7 @@ void Tango::ColorLib::ColorConverter::VolumeToNLInkP(VectorXd Volume, VectorXd & } InkSum += InkP(i); } - NLInkP(MaxInd) = InkSum; + NLInkP(MaxInd) =100* InkSum/ m_maxNlPerCM(MaxInd); //Back to % if (InkSum == 0.0) { for (int i = 0; i < m_nVolumes; ++i) @@ -1245,7 +1280,7 @@ void Tango::ColorLib::ColorConverter::VolumeToNLInkP(VectorXd Volume, VectorXd & if (i != MaxInd) { ind += 1; - NLInkP(i) = Result(ind); + NLInkP(i) =100* Result(ind)/m_maxNlPerCM(i); //Back to % } } return; @@ -1286,7 +1321,7 @@ void Tango::ColorLib::ColorConverter::NLInkPToVolume(VectorXd NLInk, VectorXd &V RVolNorm(i) = round(Volume(i)*ROUNDINGTol) / ROUNDINGTol; RsumNorm += RVolNorm(i); } - if (RsumNorm > m_ProcessRangesMaxP[m_nProcessRanges - 1] || abs(sumNorm - RsumNorm) >= 1 / ROUNDINGTol) + if (RsumNorm > m_GamutRegionMaxLim[m_nProcessRanges - 1] || abs(sumNorm - RsumNorm) >= 1 / ROUNDINGTol) { VectorXd dd(m_nInks); double maxdd = -1; @@ -1379,9 +1414,10 @@ void Tango::ColorLib::ColorConverter::SetMaxNLperCM(double maxNlPerCM, int i) m_maxNlPerCM(i) = maxNlPerCM; } -void Tango::ColorLib::ColorConverter::ConvertVolumeToRGBDisplay(ConversionInput* conversionInput, VectorXd &Volume, VectorXd &RGBOut, VectorXd &LabOut, int &GamutRegion) +void Tango::ColorLib::ColorConverter::ConvertVolumeToRGBDisplay(InputCoordinates *inputcoordinates, int n_processRanges, + int colorspace, VectorXd &Volume, VectorXd &RGBOut, VectorXd &LabOut, int &GamutRegion) { - SetNumberOfVolumes((int)(conversionInput->inputcoordinates->n_inputliquids)); + SetNumberOfVolumes((int)(inputcoordinates->n_inputliquids)); // Set Calibration Data LiquidType LQ; if (m_CalibCurves == NULL) @@ -1390,46 +1426,45 @@ void Tango::ColorLib::ColorConverter::ConvertVolumeToRGBDisplay(ConversionInput* //m_CalibCurves = DBG_NEW CalibData[m_nInks]; for (int i = 0; i < m_nVolumes; ++i) { - LQ = conversionInput->inputcoordinates->inputliquids[i]->calibrationdata->liquidtype; + LQ =inputcoordinates->inputliquids[i]->calibrationdata->liquidtype; if (LQ == LIQUID_TYPE__Cyan || LQ == LIQUID_TYPE__Magenta || LQ == LIQUID_TYPE__Yellow || LQ == LIQUID_TYPE__Black) { //Get calibration data. - CalibrationData* calibrationData = conversionInput->inputcoordinates->inputliquids[i]->calibrationdata; + CalibrationData* calibrationData = inputcoordinates->inputliquids[i]->calibrationdata; SetCalibData(calibrationData, i, &m_CalibCurves[i]); - SetMaxNLperCM(conversionInput->inputcoordinates->inputliquids[i]->maxnanoliterpercentimeter, i); - m_CalibCurves[i].SetCalibName((int)(conversionInput->inputcoordinates->inputliquids[i]->calibrationdata->liquidtype)); + SetMaxNLperCM(inputcoordinates->inputliquids[i]->maxnanoliterpercentimeter, i); + m_CalibCurves[i].SetCalibName((int)(inputcoordinates->inputliquids[i]->calibrationdata->liquidtype)); } else std::exception("unsupported volume"); } } + + //July 29 2020 + //Limit inks based on m_maxNlpercm + //Inks are limited in their nonlinear form VectorXd NLInkP((int)(m_nVolumes)); VectorXd InkOut((int)(m_nVolumes)); //Convert to Nonlinear Inks double SumVol_Ink = 0.0; + //Get Gamut Region for (int i = 0; i < m_nVolumes; ++i) - { - Volume(i) = conversionInput->inputcoordinates->inputliquids[i]->volume; //volume is given in % - SumVol_Ink += Volume(i); - } - for (int i = 0; i < int(conversionInput->n_processranges - 1); ++i) - { - if (SumVol_Ink > m_ProcessRangesMaxP[i]) - GamutRegion++; - } + Volume(i) = inputcoordinates->inputliquids[i]->volume; //volume is given in % + + GamutRegion = GetGamutRegion(Volume, m_GamutRegionMaxLim); VolumeToNLInkP(Volume, NLInkP); + //Limit Inks double *InkOutP = new double[m_nA2BnSepIn]; VectorToDouble(NLInkP, InkOutP); //for (int i = 0; i < m_nA2BnSepIn; ++i) // InkOutP[i] = NLInkP(i); double *LinInkP = new double[m_nA2BnSepIn]; - double NormFactor = 100 / m_ProcessRangesMaxP[m_nProcessRanges - 1]; - - if (conversionInput->colorspace == COLOR_SPACE__Catalog) +//Reflect the Calibration Curves of the thread in Catalog Items + if (colorspace == COLOR_SPACE__Catalog) { for (int i = 0; i < m_nB2AnSepOut; ++i) { - if (NLInkP(i) <= m_ProcessRangesMaxP[0]) + if (NLInkP(i) <= m_GamutRegionMaxLim[0]) { m_LinCurves->m_InterpCurves[i].Eval(InkOutP[i] * 655.35, InkOutP[i]); InkOutP[i] /= 655.35; @@ -1439,15 +1474,24 @@ void Tango::ColorLib::ColorConverter::ConvertVolumeToRGBDisplay(ConversionInput* } for (int i = 0; i < (int)(m_nVolumes); ++i) { - if (NLInkP(i) <= m_ProcessRangesMaxP[0]) + if (NLInkP(i) <= m_GamutRegionMaxLim[0]) { m_CalibCurves[i].m_InvLinearInterp->Eval(InkOutP[i], InkOutP[i]); NLInkP(i) = InkOutP[i]; } } - NLInkPToVolume(NLInkP, Volume); + //NLInkPToVolume(NLInkP, Volume); } + //July 29 2020 + //Limit inks based on m_maxNlpercm + //Inks are limited in their nonlinear form + //Output Volume is in % + LimitInks(NLInkP, InkOutP); + NLInkPToVolume(DoubleToVector(InkOutP, m_nInks), Volume); + GamutRegion = GetGamutRegion(Volume, m_ProcessRangesMaxP); + NLcmtoPercentage(Volume, Volume); + //Convert to RGB //GamutRegion = 0; //Convert to Lab @@ -1457,7 +1501,7 @@ void Tango::ColorLib::ColorConverter::ConvertVolumeToRGBDisplay(ConversionInput* //double *LabOutP = DBG_NEW double[m_nA2BnSepOut]; //InkOutP has to be normalized to match the transform units for (int i = 0; i < m_nB2AnSepOut; ++i) - InkOutP[i] *= NormFactor; + InkOutP[i] *= m_InvNormFactor; m_A2BTransform->evalInkP2Lab(InkOutP, LabOutP, GamutRegion); @@ -1467,14 +1511,17 @@ void Tango::ColorLib::ColorConverter::ConvertVolumeToRGBDisplay(ConversionInput* //double *LabOutFinal1 = DBG_NEW double[3]; double *LabOutFinal = new double[3]; - CConvertD65.ChangeWP(LabOutP, LabOutFinal1, m_whitepointXYZ_CT, m_WP); //To Absolute + //CConvertD65.ChangeWP(LabOutP, LabOutFinal1, m_whitepointXYZ_CT, m_WP); //To Absolute + CConvertD65.ChangeWP(LabOutP, LabOutFinal1, m_whitepointXYZ_Strip, m_WP); //To Absolute for (int i = 0; i < 3; ++i) LabOutFinal[i] = LabOutFinal1[i]; +/* if (m_AdaptWP) { CConvertD65.ChangeWP(LabOutFinal, LabOutFinal, m_whitepointXYZ_Strip, m_whitepointXYZ_CT); } + */ LabOut = DoubleToVector(LabOutFinal, 3); CConvertD65.SetReferenceWhite(D65); @@ -1605,10 +1652,10 @@ size_t Tango::ColorLib::ColorConverter::Convert(uint8_t * input_buffer, size_t i //count number if inks // int numofInks = CountNumberofInks(conversionInput); readColorTransformations(conversionInput); - //read calibration tables and store them in m_CalibCurves - - readCalibrationTables(conversionInput); + InputLiquid **inputliquids = conversionInput->inputcoordinates->inputliquids; + int n_inputliquids = conversionInput->inputcoordinates->n_inputliquids; + readCalibrationTables(inputliquids, n_inputliquids); //Initialize CIECAM02 transformation Illum IL = D65; @@ -1623,27 +1670,24 @@ size_t Tango::ColorLib::ColorConverter::Convert(uint8_t * input_buffer, size_t i SetNumberOfInks(m_nB2AnSepOut); // Compare Strip White point to Color Table White Point - CompareWhitePoints(); + //CompareWhitePoints(); if (numofInks != m_nB2AnSepOut) throw std::exception("Number of available inks does not match ink tables\0"); //Tables have been filled - - //Convert maxInkUptake to percentages - - //m_ProcessRangesMinP = new double[m_nProcessRanges]; + //Set Process Ranges m_ProcessRangesMaxP = new double[m_nProcessRanges]; - //m_ProcessRangesMinInkUptake = new double[m_nProcessRanges]; - //m_ProcessRangesMaxInkUptake = new double[m_nProcessRanges]; for (int i = 0; i < m_nProcessRanges; ++i) { - // m_ProcessRangesMinP[i] = 100*(conversionInput->processranges[i]->mininkuptake)/ (conversionInput->processranges[0]->mininkuptake); - m_ProcessRangesMaxP[i] = 100 * (conversionInput->processranges[i]->maxinkuptake) / (conversionInput->processranges[0]->maxinkuptake); - //m_ProcessRangesMinInkUptake[i] = conversionInput->processranges[i]->mininkuptake; - //m_ProcessRangesMaxInkUptake[i] = conversionInput->processranges[i]->maxinkuptake; + m_ProcessRangesMaxP[i] = conversionInput->processranges[i]->maxinkuptake; + } + NormGamutRegionMaxLim(); + if (m_NormFactor <= 0.0) + { + SetNormFactor(); + SetInverseNormFactor(); } - VectorXd InkOut(m_nB2AnSepOut); VectorXd RGBOut(3); VectorXd LabOut(3); @@ -1661,28 +1705,34 @@ size_t Tango::ColorLib::ColorConverter::Convert(uint8_t * input_buffer, size_t i //Convert input data to linear inks if (conversionInput->colorspace == COLOR_SPACE__Volume || conversionInput->colorspace == COLOR_SPACE__Catalog) { - ConvertVolumeToRGBDisplay(conversionInput, Volume, RGBOut, LabOut, GamutRegion); + InputCoordinates *IC = conversionInput->inputcoordinates; + int colorspace = conversionInput->colorspace; + ConvertVolumeToRGBDisplay(IC, conversionInput->n_processranges, colorspace, Volume, RGBOut, LabOut, GamutRegion); InGamut = true; } else { - ConvertColorToLinearInks(conversionInput, InkOut, RGBOut, LabOut, GamutRegion, InGamut); + ConvertColorToLinearInks(conversionInput->inputcoordinates, conversionInput->colorspace, InkOut, RGBOut, + LabOut, GamutRegion, InGamut); //Inks are in Linear Space , convert to nonlinear by using Calibration Tables, // Right now calibration is in the [0-100] range, values exceeding [0-100] are not transformed ConvertToNLInks(InkOut, NLInkOut); - //Determine Gamut Region - double maxNLInk = NegValue; - for (int i = 0; i < m_nInks; ++i) - maxNLInk = std::max(NLInkOut[i], maxNLInk); - - for (int i = 0; i < int(conversionInput->n_processranges - 1); ++i) + + //Limit inks based on m_maxNlpercm + //Inks are limited in their nonlinear form + //Output Volume is in % + double *InkOutP = new double[m_nB2AnSepOut]; + LimitInks(NLInkOut, InkOutP); + NLInkPToVolume(DoubleToVector(InkOutP, m_nInks), Volume); + GamutRegion = GetGamutRegion(Volume, m_ProcessRangesMaxP); + NLcmtoPercentage(Volume, Volume); + //OutputCoordinates outputCoords = OUTPUT_COORDINATES__INIT; + if (InkOutP != NULL) { - if (maxNLInk > m_ProcessRangesMaxP[i]) - GamutRegion++; + delete[] InkOutP; + InkOutP = NULL; } - //Convert to [nl/cm] - NLInkPToVolume(NLInkOut, Volume); - //OutputCoordinates outputCoords = OUTPUT_COORDINATES__INIT; + } OutputCoordinates *outputCoords = (OutputCoordinates*)malloc(sizeof(OutputCoordinates)); output_coordinates__init(outputCoords); @@ -1975,14 +2025,14 @@ bool Tango::ColorLib::ColorConverter::IsInGamut(double *InLab, SURROUND sur, CA } -Tango::CT_Header Tango::ColorLib::ColorConverter::read_header(ConversionInput* conversionInput, int &bytesread) +Tango::CT_Header Tango::ColorLib::ColorConverter::read_header(uint8_t *data, int &bytesread) { //CT_Header *Header = new CT_Header; //CT_Header *Header = DBG_NEW CT_Header; CT_Header Header; // unsigned int tmp = (buffer[2 * i + 1] << 8) | buffer[2 * i]; - uint8_t *ColorTable = conversionInput->forwarddata.data; + uint8_t *ColorTable =data; //File Size NumConversions Conv; Header.TblSIze = Conv.ByteToInt(ColorTable, bytesread); @@ -2088,7 +2138,7 @@ void Tango::ColorLib::ColorConverter::read_lut_type(int offset, int data_size, C return; } -void Tango::ColorLib::ColorConverter::read_xyz_type(int offset, int data_size, C_RGB_XYZ_Lab *XYZ, ConversionInput* conversionInput) +void Tango::ColorLib::ColorConverter::read_xyz_type(int offset, int data_size, C_RGB_XYZ_Lab *XYZ, uint8_t *data) { // 0 - 3 'XYZ ' //4 - 7 reserved, must be 0 @@ -2098,7 +2148,7 @@ void Tango::ColorLib::ColorConverter::read_xyz_type(int offset, int data_size, C { throw std::exception("not enough data to read xyz"); } - uint8_t *buff = &(conversionInput->forwarddata.data[offset]); + uint8_t *buff = &(data[offset]); NumConversions Conv; int bytesread = 0; int tmpxyz = Conv.ByteToInt(buff, bytesread); @@ -2145,8 +2195,7 @@ void Tango::ColorLib::ColorConverter::read_xyz_type(int offset, int data_size, C return; } -void Tango::ColorLib::ColorConverter::read_text_type(int offset, int data_size, std::string *textstr, - ConversionInput* conversionInput) +void Tango::ColorLib::ColorConverter::read_text_type(int offset, int data_size, std::string *textstr, uint8_t *data) { // 0 - 3 'text' //4 - 7 reserved, must be 0 @@ -2161,7 +2210,7 @@ void Tango::ColorLib::ColorConverter::read_text_type(int offset, int data_size, return; } - uint8_t *buff = &(conversionInput->forwarddata.data[offset]); + uint8_t *buff = &(data[offset]); int bytesread = 0; NumConversions Conv; int tmp = Conv.ByteToInt(buff, bytesread); @@ -2201,15 +2250,14 @@ void Tango::ColorLib::ColorConverter::read_text_type(int offset, int data_size, } -void Tango::ColorLib::ColorConverter::read_text_description_type(int offset, int data_size, std::string textdescstr, - ConversionInput* conversionInput) +void Tango::ColorLib::ColorConverter::read_text_description_type(int offset, int data_size, std::string textdescstr, uint8_t *data) { // 0 - 3 'desc' // 4 - 7 reserved, must be 0 // 8 - 11 ASCII invariant description count, including terminating NULL // 12 - ASCII invariant description - uint8_t *buff = &(conversionInput->forwarddata.data[offset]); + uint8_t *buff = &(data[offset]); int bytesread = 0; NumConversions Conv; int tmp = Conv.ByteToInt(buff, bytesread); @@ -2251,7 +2299,7 @@ void Tango::ColorLib::ColorConverter::read_text_description_type(int offset, int return; } -void Tango::ColorLib::ColorConverter::CompareWhitePoints() +/*void Tango::ColorLib::ColorConverter::CompareWhitePoints() { ColorConvert ColConv(D65, D65); C_RGB_XYZ_Lab Lab_CT; @@ -2270,10 +2318,10 @@ void Tango::ColorLib::ColorConverter::CompareWhitePoints() ColConv.SymmetricaldECMC(VLab_CT, VLab_Strip, dECMC); if (dECMC > WPTol) m_AdaptWP = true; - if (m_whitepointXYZ_Strip.Get_x() <= 0 || m_whitepointXYZ_Strip.Get_y() > 0 || m_whitepointXYZ_Strip.Get_z()) + if (m_whitepointXYZ_Strip.Get_x() <= 0 || m_whitepointXYZ_Strip.Get_y() <= 0 || m_whitepointXYZ_Strip.Get_z()<=0) m_AdaptWP = false; return; -} +} */ /* not used*/ //size_t Tango::ColorLib::ColorConverter::Convert(uint8_t * input_buffer, size_t input_buffer_size, uint8_t *& output_buffer) //{ @@ -2479,8 +2527,9 @@ size_t Tango::ColorLib::ColorConverter::P_IsInGamut(uint8_t * input_buffer, size readColorTransformations(conversionInput); //read calibration tables and store them in m_CalibCurves - - readCalibrationTables(conversionInput); + int n_inputliquids = conversionInput->inputcoordinates->n_inputliquids; + InputLiquid **inputliquid = conversionInput->inputcoordinates->inputliquids; + readCalibrationTables(inputliquid, n_inputliquids); //Initialize CIECAM02 transformation Illum IL = D65; @@ -2495,7 +2544,7 @@ size_t Tango::ColorLib::ColorConverter::P_IsInGamut(uint8_t * input_buffer, size SetNumberOfInks(m_nB2AnSepOut); // Compare Strip White point to Color Table White Point - CompareWhitePoints(); + //CompareWhitePoints(); if (numofInks != m_nB2AnSepOut) throw std::exception("Number of available inks does not match ink tables"); @@ -2561,19 +2610,22 @@ size_t Tango::ColorLib::ColorConverter::P_IsInGamut(uint8_t * input_buffer, size LabIn[2] = conversionInput->inputcoordinates->b; //the assumption is that the color space has illumination that matches the whitepoint of the Strip ColorConvert CConvertD65(D65, D65); //Destination, source - double *LabInFinal1 = new double[3]; +// double *LabInFinal1 = new double[3]; //double *LabInFinal1 = DBG_NEW double[3]; - for (int i = 0; i < 3; ++i) - LabInFinal1[i] = LabIn[i]; +// for (int i = 0; i < 3; ++i) +// LabInFinal1[i] = LabIn[i]; // Lab is assumed to match the color of the STRIP, however the tables could have a different WP - //Check if Color Tables and Strip whitepoints are the same, otherwise convert + //We relate to the color table as a generic one in Relative Colorimetric Space + /* if (m_AdaptWP) { CConvertD65.ChangeWP(LabInFinal1, LabInFinal1, m_whitepointXYZ_CT, m_whitepointXYZ_Strip); //to Color Tables } + */ double *LabInFinal2 = new double[3]; //double *LabInFinal2 = DBG_NEW double[3]; - CConvertD65.ChangeWP(LabIn, LabInFinal2, m_WP, m_whitepointXYZ_CT); //to Relative + // CConvertD65.ChangeWP(LabIn, LabInFinal2, m_WP, m_whitepointXYZ_CT); //to Relative + CConvertD65.ChangeWP(LabIn, LabInFinal2, m_WP, m_whitepointXYZ_Strip); //to Relative InGamut = IsInGamut(LabInFinal2, sur, CS, LabInFinal2); LimitLab(LabInFinal2); @@ -2582,11 +2634,11 @@ size_t Tango::ColorLib::ColorConverter::P_IsInGamut(uint8_t * input_buffer, size delete[] LabIn; LabIn = NULL; } - if (LabInFinal1 != NULL) + /* if (LabInFinal1 != NULL) { delete[]LabInFinal1; LabInFinal1 = NULL; - } + } */ if (LabInFinal2 != NULL) { delete[]LabInFinal2; @@ -2651,16 +2703,20 @@ size_t Tango::ColorLib::ColorConverter::P_IsInGamut(uint8_t * input_buffer, size size_t Tango::ColorLib::ColorConverter::GenerateGradient(uint8_t * input_buffer, size_t input_buffer_size, uint8_t *& output_buffer) { - //Get Input... GradientConversionInput* conversionInput = (GradientConversionInput*)malloc(sizeof(GradientConversionInput)); conversionInput = gradient_conversion_input__unpack(NULL, input_buffer_size, input_buffer); + //Initialize Output... + GradientConversionOutput *conversionOutput = (GradientConversionOutput*)malloc(sizeof(GradientConversionOutput)); + gradient_conversion_output__init(conversionOutput); + conversionOutput->haserror = false; + conversionOutput->has_haserror = false; //Get segment length... double segmentLength = conversionInput->segmentlength; - + PrepareGradient(conversionInput, conversionOutput); //Get liquid types info... - InputLiquid* cyan = NULL; +/* InputLiquid* cyan = NULL; InputLiquid* magenta = NULL; InputLiquid* yellow = NULL; InputLiquid* black = NULL; @@ -2682,137 +2738,762 @@ size_t Tango::ColorLib::ColorConverter::GenerateGradient(uint8_t * input_buffer, black = conversionInput->inputliquids[i]; break; } - } + }*/ - //Iterate over input stops... - for (size_t i = 0; i < conversionInput->n_stops; i++) - { - GradientInputStop* stop = conversionInput->stops[i]; - stop->colorspace; //Stop color space. - stop->offset; // Stop offset within the segment length (0-1) + //Pack output... + output_buffer = (uint8_t*)malloc(gradient_conversion_output__get_packed_size(conversionOutput)); + int size = gradient_conversion_output__pack(conversionOutput, output_buffer); + + //RELEASE MEMORY HERE !!! +#pragma region Free Conversion Input & Output + + gradient_conversion_input__free_unpacked(conversionInput, NULL); + + gradient_conversion_output__free_unpacked(conversionOutput, NULL); - switch (stop->colorspace) +#pragma endregion + + return size; +} + +void Tango::ColorLib::ColorConverter::fillGradientStops(GradientConversionInput *conversionInput) +{ + for (int i = 0; i < m_nGradStops; ++i) + { + switch (conversionInput->stops[i]->colorspace) { case COLOR_SPACE__RGB: //Case RGB - stop->red; - stop->green; - stop->blue; + m_GradStops[i].RGB.Set(conversionInput->stops[i]->red, conversionInput->stops[i]->green, conversionInput->stops[i]->blue); + m_GradStops[i].colorspace = COLOR_SPACE__RGB; + m_GradStops[i].offset = conversionInput->stops[i]->offset; break; case COLOR_SPACE__LAB: //Case LAB - stop->l; - stop->a; - stop->b; + m_GradStops[i].Lab.Set(conversionInput->stops[i]->l, conversionInput->stops[i]->a, conversionInput->stops[i]->b); + m_GradStops[i].colorspace = COLOR_SPACE__LAB; + m_GradStops[i].offset = conversionInput->stops[i]->offset; break; case COLOR_SPACE__Volume: //Case Volume - - double cyanVolume = 0; - double magentaVolume = 0; - double yellowVolume = 0; - double blackVolume = 0; - - for (size_t j = 0; j < stop->n_liquidvolumes; j++) + m_GradStops[i].colorspace = COLOR_SPACE__Volume; + m_GradStops[i].offset = conversionInput->stops[i]->offset; + for (int j = 0; j < (int)conversionInput->stops[i]->n_liquidvolumes; j++) { - LiquidVolume* liquidVolume = stop->liquidvolumes[j]; + LiquidVolume* liquidVolume = conversionInput->stops[i]->liquidvolumes[j]; switch (liquidVolume->liquidtype) { case LIQUID_TYPE__Cyan: - cyanVolume = liquidVolume->volume; + m_GradStops[i].Volume[0] = liquidVolume->volume; + break; case LIQUID_TYPE__Magenta: - magentaVolume = liquidVolume->volume; + m_GradStops[i].Volume[1] = liquidVolume->volume; + break; case LIQUID_TYPE__Yellow: - yellowVolume = liquidVolume->volume; + m_GradStops[i].Volume[2] = liquidVolume->volume; + break; case LIQUID_TYPE__Black: - blackVolume = liquidVolume->volume; + m_GradStops[i].Volume[3] = liquidVolume->volume; + break; + default: + throw std::exception("could not fill all volumes"); } } - break; } } +} - //Initialize Output... - GradientConversionOutput *conversionOutput = (GradientConversionOutput*)malloc(sizeof(GradientConversionOutput)); - gradient_conversion_output__init(conversionOutput); - int stops_count = 100; +void Tango::ColorLib::ColorConverter::findStops(GradStruct m_GradStop1, GradStruct m_GradStop2, double dEThr, int ninterstops, + int &nOut, double **VecRGBOut, double **VecLabOut, double *posOut) +{ + ColorConvert CConvertD65(D65, D65); + C_RGB_XYZ_Lab RGBStart = m_GradStop1.RGB; + C_RGB_XYZ_Lab RGBEnd = m_GradStop2.RGB; + C_RGB_XYZ_Lab LowLab(0, -128, -128); + C_RGB_XYZ_Lab HighLab(100, 127, 127); + C_RGB_XYZ_Lab LowRGB(0, 0, 0); + C_RGB_XYZ_Lab HighRGB(255, 255, 255); + + int nsubdiv = 100; + C_RGB_XYZ_Lab dRGB((RGBEnd.Get_x() - RGBStart.Get_x()) / nsubdiv, (RGBEnd.Get_y() - RGBStart.Get_y()) / nsubdiv, + (RGBEnd.Get_z() - RGBStart.Get_z()) / nsubdiv); + + + C_RGB_XYZ_Lab *VecLabOut_tmp = new C_RGB_XYZ_Lab[ninterstops]; + C_RGB_XYZ_Lab *VecRGBOut_tmp = new C_RGB_XYZ_Lab[ninterstops]; + C_RGB_XYZ_Lab *VecLabOut_fin = new C_RGB_XYZ_Lab[ninterstops]; + C_RGB_XYZ_Lab *VecRGBOut_fin = new C_RGB_XYZ_Lab[ninterstops]; + C_RGB_XYZ_Lab RGBTmp; + C_RGB_XYZ_Lab LabTmp; + // make a vector of RGB values with 100 subdivisions + // make a matching Lab vector; + + VecRGBOut_tmp[0] = C_RGB_XYZ_Lab(RGBStart); + VecLabOut_tmp[0] = C_RGB_XYZ_Lab(m_GradStop1.Lab); + + for (int i = 1; i <= nsubdiv; ++i) + { + VecRGBOut_tmp[i].Set(VecRGBOut_tmp[i - 1].Get_x() + dRGB.Get_x(), + VecRGBOut_tmp[i - 1].Get_y() + dRGB.Get_y(), + VecRGBOut_tmp[i - 1].Get_z() + dRGB.Get_z()); + VecLabOut_tmp[i] = CConvertD65.RGBtoLab(VecRGBOut_tmp[i]); + VecLabOut_tmp[i].Clamp(LowLab, HighLab); + } + + int indGrad = 0; + int *pos = new int[ninterstops]; + int i1 = 1; + int j1 = 1; + VecLabOut_fin[indGrad] = VecLabOut_tmp[0]; + VecRGBOut_fin[indGrad] = VecRGBOut_tmp[0]; + pos[indGrad] = 0; + double dE = 0.0; + double dEOld = 0.0; + while (i1 <= nsubdiv) + { + dEOld = dE; + CConvertD65.dEcmc(VecLabOut_fin[indGrad], VecLabOut_tmp[i1], dE); + j1 = i1; + while (dE < dEThr && i1 < nsubdiv && j1 < nsubdiv) + { + j1++; + dEOld = dE; + CConvertD65.dEcmc(VecLabOut_fin[indGrad], VecLabOut_tmp[j1], dE); + } + if (j1 > i1) + { + j1--; + indGrad++; + VecRGBOut_fin[indGrad] = VecRGBOut_tmp[j1]; + VecLabOut_fin[indGrad] = VecLabOut_tmp[j1]; + pos[indGrad] = j1; + dE = dEOld; + i1 = j1 + 1; + } + else + { + dEOld = dE; + while (dE >= dEThr && i1 <= nsubdiv) + { + //get intermediate point + RGBTmp = VecRGBOut_tmp[i1]; + LabTmp = CConvertD65.RGBtoLab(RGBTmp); + LabTmp.Clamp(LowLab, HighLab); + //move vectors down by one + for (int i = i1; i < nsubdiv; ++i) + { + VecRGBOut_tmp[i + 1] = VecRGBOut_tmp[i + 1]; + VecLabOut_tmp[i + 1] = VecLabOut_tmp[i + 1]; + } + VecRGBOut_tmp[i1] = RGBTmp; + VecLabOut_tmp[i1] = LabTmp; + CConvertD65.dEcmc(VecLabOut_fin[indGrad], VecLabOut_tmp[i1], dE); + nsubdiv++; + } + indGrad++; + VecRGBOut_fin[indGrad] = VecRGBOut_tmp[j1]; + VecLabOut_fin[indGrad] = VecLabOut_tmp[j1]; + pos[indGrad] = j1; + i1 = j1 + 1; + } + } + nOut = indGrad; + + for (int i = 0; i < nOut; ++i) + { + VecLabOut[i][0] = VecLabOut_fin[i].Get_x(); + VecLabOut[i][1] = VecLabOut_fin[i].Get_y(); + VecLabOut[i][2] = VecLabOut_fin[i].Get_z(); + VecRGBOut[i][0] = VecRGBOut_fin[i].Get_x(); + VecRGBOut[i][1] = VecRGBOut_fin[i].Get_y(); + VecRGBOut[i][2] = VecRGBOut_fin[i].Get_z(); + posOut[i] = pos[i]; + } + //free allocs + if(VecLabOut_tmp != NULL) + { + delete[] VecLabOut_tmp; + VecLabOut_tmp = NULL; + } + if (VecRGBOut_tmp != NULL) + { + delete[] VecRGBOut_tmp; + VecRGBOut_tmp = NULL; + } + if (VecLabOut_fin != NULL) + { + delete[] VecLabOut_fin; + VecLabOut_fin = NULL; + } + if (VecRGBOut_fin != NULL) + { + delete[] VecRGBOut_fin; + VecRGBOut_fin = NULL; + } + if (pos != NULL) + { + delete[] pos; + pos = NULL; + } +} + +void Tango::ColorLib::ColorConverter::ConvertGradStoptoVolume(InputCoordinates* inputcoordinates, ColorSpace colorspace, + VectorXd &Volume, int &GamutRegion) +{ + size_t nInks = 0; + + C_RGB_XYZ_Lab DataLab; + VectorXd InkOut(m_nB2AnSepOut); + if (colorspace ==COLOR_SPACE__RGB) + { + //Convert RGB to Volume, no nee to calculate RGBOut and LabOut + // Basic assumption: if data is given in RGB space, conversion should be in relative colorimetric, + //We expect that [255,255,255](white) will be mapped to the thread white, meaning all inks should be zero + // and the coverted RGB will refect the color of the thread, but will be shown in Relative Colorimetric to the user + + //convert to Lab + ColorConvert CConvertD65(D65, D65); //Destination, source + double *LabIn = new double[3]; + double *RGBOutP = new double[3]; + RGBOutP[0] = inputcoordinates->red; + RGBOutP[1] = inputcoordinates->green; + RGBOutP[2] = inputcoordinates->blue; + //RGB to Lab + CConvertD65.RGBtoLab(RGBOutP, LabIn); //Values are in Relative Colorimetric, D65 + LimitLab(LabIn); + + //convert to inks + int GamutRegion; + double *InkOutP = new double[m_nB2AnSepOut]; + m_B2ATransform->evalLab2InkP(LabIn, InkOutP, GamutRegion); //InkOut is in units of 16 bits + + //Convert InkOut to Linear via initial calibration Tables + //Initial calibration tables are the ones that were included in the color table + for (int i = 0; i < m_nB2AnSepOut; ++i) + { + InkOutP[i] *= m_NormFactor; + if (InkOutP[i] <= m_GamutRegionMaxLim[0]) + { + m_LinCurves->m_InterpCurves[i].Eval(InkOutP[i] * 655.35, InkOutP[i]); + InkOutP[i] /= 655.35; + } + } + InkOut = DoubleToVector(InkOutP, m_nInks); + + if (InkOutP != NULL) + { + delete[] InkOutP; + InkOutP = NULL; + } + if (LabIn != NULL) + { + delete[] LabIn; + LabIn = NULL; + } + if (RGBOutP != NULL) + { + delete[] RGBOutP; + RGBOutP = NULL; + } + } + else if(colorspace ==COLOR_SPACE__LAB) + { + // Basic assumption: Lab data is in relative colorimetric. No Need to convert + + double *LabIn = new double[3]; + LabIn[0] = inputcoordinates->l; //Relative Colorimetric + LabIn[1] = inputcoordinates->a; + LabIn[2] = inputcoordinates->b; - //Init output stops array... - GradientOutputStop** outputStops = (GradientOutputStop**)malloc(sizeof(GradientOutputStop*) * stops_count); + //convert to Inks + int GamutRegion; + double *InkOutP = new double[m_nB2AnSepOut]; + m_B2ATransform->evalLab2InkP(LabIn, InkOutP, GamutRegion); //InkOut is in the [0-100] interval + for (int i = 0; i < m_nB2AnSepOut; ++i) + { + InkOutP[i] *= m_NormFactor; + if (InkOutP[i] <= m_GamutRegionMaxLim[0]) + { + m_LinCurves->m_InterpCurves[i].Eval(InkOutP[i] * 655.35, InkOutP[i]); + InkOutP[i] /= 655.35; + } + } + InkOut = DoubleToVector(InkOutP, m_nInks); - conversionOutput->stops = outputStops; - conversionOutput->n_stops = stops_count; + if (InkOutP != NULL) + { + delete[] InkOutP; + InkOutP = NULL; + } + if (LabIn != NULL) + { + delete[] LabIn; + LabIn = NULL; + } + } + else + { + throw std::exception("Unsupported Color Space"); + return; + } + VectorXd NLInkOut(m_nB2AnSepOut); + VectorXd VolumeOut(m_nB2AnSepOut); + double *InkOutL = new double[m_nB2AnSepOut]; + ConvertToNLInks(InkOut, NLInkOut); + LimitInks(NLInkOut, InkOutL); + NLInkPToVolume(DoubleToVector(InkOutL, m_nInks), Volume); + GamutRegion = GetGamutRegion(Volume, m_ProcessRangesMaxP); + NLcmtoPercentage(Volume, Volume); + if (InkOutL != NULL) + { + delete[] InkOutL; + InkOutL = NULL; + } - double fake_volume = 1; + return; +} + +void Tango::ColorLib::ColorConverter::SetNormFactor() +{ + m_NormFactor = m_GamutRegionMaxLim[m_nProcessRanges - 1] / m_GamutRegionMaxLim[0]; +} - //Put Demo Stops... - for (size_t i = 0; i < stops_count; i++) +void Tango::ColorLib::ColorConverter::SetInverseNormFactor() +{ + if (m_NormFactor <= 0) + m_InvNormFactor = -1; + else + m_InvNormFactor = 1.0 / m_NormFactor; +} + +void Tango::ColorLib::ColorConverter::PrepareGradient(GradientConversionInput* conversionInput, GradientConversionOutput *conversionOutput) +{ + //fill input stops... + m_nGradStops = conversionInput->n_stops; + m_GradStops = new GradStruct[m_nGradStops]; + InputCoordinates **inputcoordinates = (InputCoordinates**)malloc(sizeof(InputCoordinates*)*m_nGradStops); + double *InkOutL = new double[m_nB2AnSepOut]; + for (int i = 0; i < m_nGradStops; ++i) { - GradientOutputStop *stop = (GradientOutputStop*)malloc(sizeof(GradientOutputStop)); - gradient_output_stop__init(stop); + inputcoordinates[i] = (InputCoordinates*)malloc(sizeof(InputCoordinates)); + input_coordinates__init(inputcoordinates[i]); + } + m_nVolumes = conversionInput->stops[0]->n_liquidvolumes; + fillGradientStops(conversionInput); + GradInput2InputCoords(conversionInput, inputcoordinates); - stop->processparameterstableindex = 0; //Set process parameters table index (0,1). - stop->offset = (double)i / (double)stops_count; + //Global Parameters of gradient + SetStripWhitepoint(conversionInput->threadl, conversionInput->threada, conversionInput->threadb); + bool has_forwarddata = conversionInput->has_forwarddata; + uint8_t *data = conversionInput->forwarddata.data; + int nprocessranges = conversionInput->n_processranges; + readColorTables(has_forwarddata, data, nprocessranges); - //Init stop output liquids - OutputLiquid** outputLiquids = (OutputLiquid**)malloc(sizeof(OutputLiquid*) * 4); + int n_inputliquids = conversionInput->n_inputliquids; + InputLiquid **inputliquid = conversionInput->inputliquids; + readCalibrationTables(inputliquid, n_inputliquids); - //Init cyan. - OutputLiquid* c = (OutputLiquid*)malloc(sizeof(OutputLiquid)); - output_liquid__init(c); - c->has_liquidtype = true; - c->has_volume = true; - c->liquidtype = LIQUID_TYPE__Cyan; - c->volume = fake_volume++; - outputLiquids[0] = c; + //finished reading tables and data + //prepare data to construct the gradient + //gradient is calculated in RGB space, thinned out or expanded based on dE criteria + // returns a vector of volumes and offsets + //gradient stops in different gamut region will use regular transformation + //if all stops in gamut region 0 the color Table will be suited to this gamut region - //Init magenta. - OutputLiquid* m = (OutputLiquid*)malloc(sizeof(OutputLiquid)); - output_liquid__init(m); - m->has_liquidtype = true; - m->has_volume = true; - m->liquidtype = LIQUID_TYPE__Magenta; - m->volume = fake_volume++; - outputLiquids[1] = m; + //prepare input + //if Color Space = lab, fill rgb and calculate volume + volume region + //if color space = rgb, fill lab and calculate volue + volume region + //if color space = Volume, fill lab and RGB, calculate volume region - //Init yellow. - OutputLiquid* y = (OutputLiquid*)malloc(sizeof(OutputLiquid)); - output_liquid__init(y); - y->has_liquidtype = true; - y->has_volume = true; - y->liquidtype = LIQUID_TYPE__Yellow; - y->volume = fake_volume++; - outputLiquids[2] = y; + bool InGamut = false; + m_WP.Set(0.9505, 1.00, 1.0888); //D65 + //Initialize CIECAM02 transformation + Illum IL = D65; + SURROUND sur = average; + CAM02CS CS = UCS; + m_Conv02 = new ColorConvert(IL, IL, Y_b, L_A, sur, CS); + SetnA2BnSepIn(m_A2BTransform->GetSeparationsIn()); + SetnA2BnSepOut(m_A2BTransform->GetSeparationsOut()); + SetnB2AnSepIn(m_B2ATransform->GetSeparationsIn()); + SetnB2AnSepOut(m_B2ATransform->GetSeparationsOut()); + SetNumberOfInks(m_nB2AnSepOut); + // Compare Strip White point to Color Table White Point + //CompareWhitePoints(); + ColorConvert CConvertD65(D65, D65); //Destination, source + if (n_inputliquids != m_nInks) + throw std::exception("Number of available inks does not match ink tables\0"); - //Init black. - OutputLiquid* k = (OutputLiquid*)malloc(sizeof(OutputLiquid)); - output_liquid__init(k); - k->has_liquidtype = true; - k->has_volume = true; - k->liquidtype = LIQUID_TYPE__Black; - k->volume = fake_volume++; - outputLiquids[3] = k; + //Convert maxInkUptake to percentages + NormGamutRegionMaxLim(); + if (m_NormFactor <= 0.0) + { + SetNormFactor(); + SetInverseNormFactor(); + } + VectorXd InkOut(m_nB2AnSepOut); + VectorXd RGBOut(3); + VectorXd LabOut(3); + VectorXd NLInkOut(m_nB2AnSepOut); + VectorXd Volume(m_nB2AnSepOut); + VectorXd VolumeOut(m_nB2AnSepOut); + //set maxNlPerCM + VectorXd NlperCM(m_nB2AnSepOut); + double *LabOutV = new double[3]; + double *LabOutFinal = new double[3]; + NlperCM.setZero(); + m_maxNlPerCM = NlperCM; + for (int i = 0; i < m_nB2AnSepOut; ++i) + SetMaxNLperCM(conversionInput->inputliquids[i]->maxnanoliterpercentimeter, i); + m_nVolumes = m_nB2AnSepOut; + int GamutRegion = 0; + for (int i = 0; i < m_nGradStops; ++i) + { + if (m_GradStops[i].colorspace == COLOR_SPACE__Volume || m_GradStops[i].colorspace == COLOR_SPACE__Catalog) + { //Convert volume to Lab + //Convert lab to rgb + ConvertVolumeToRGBDisplay(inputcoordinates[i], m_nProcessRanges, m_GradStops[i].colorspace, Volume, RGBOut, LabOut, GamutRegion); + //store data + m_GradStops[i].Lab.Set(LabOut(0), LabOut(1), LabOut(2)); + m_GradStops[i].RGB.Set(RGBOut(0), RGBOut(1), RGBOut(2)); + m_GradStops[i].GamutRegion = GamutRegion; + m_GradStops[i].InGamut = true; + } + else + { + ConvertColorToLinearInks(inputcoordinates[i], m_GradStops[i].colorspace, InkOut, RGBOut, LabOut, GamutRegion, InGamut); + //Inks are in Linear Space , convert to nonlinear by using Calibration Tables, + // Right now calibration is in the [0-100] range, values exceeding [0-100] are not transformed - stop->outputliquids = outputLiquids; - stop->n_outputliquids = 4; + ConvertToNLInks(InkOut, NLInkOut); + LimitInks(NLInkOut, InkOutL); + NLInkPToVolume(DoubleToVector(InkOutL, m_nInks), Volume); + GamutRegion = GetGamutRegion(Volume, m_ProcessRangesMaxP); + NLcmtoPercentage(Volume, Volume); + + //fill data + //fill volume + //allocate m_GradStops[i].Volume + m_GradStops[i].Volume = new double[m_nB2AnSepOut]; + for (int j = 0; j < m_nB2AnSepOut; ++j) + m_GradStops[i].Volume[j] = Volume[j]; + m_GradStops[i].GamutRegion = GamutRegion; + m_GradStops[i].InGamut = InGamut; + //LabOut and RGBOut might be different if the input was out of gamut + m_GradStops[i].Lab.Set(LabOut(0), LabOut(1), LabOut(2)); + m_GradStops[i].RGB.Set(RGBOut(0), RGBOut(1), RGBOut(2)); + } + //Convert Lab Values to Relative Colorimetric. These values will be used in the Gradient Volume calculation. + VectorToDouble(LabOut, LabOutV); +/* if (m_AdaptWP) + { + CConvertD65.ChangeWP(LabOutV, LabOutV, m_whitepointXYZ_CT, m_whitepointXYZ_Strip); //to Color Tables + } + */ + //double *LabInFinal2 = DBG_NEW double[3]; +// CConvertD65.ChangeWP(LabOutV, LabOutFinal, m_WP, m_whitepointXYZ_CT); //LabInFinal is in Relative Colorimetric Space + CConvertD65.ChangeWP(LabOutV, LabOutFinal, m_WP, m_whitepointXYZ_Strip); //LabInFinal is in Relative Colorimetric Space + m_GradStops[i].Lab.Set(LabOutFinal[0], LabOutFinal[1], LabOutFinal[2]); + } + //free vectors + if (LabOutV == NULL) + { + delete[] LabOutV; + LabOutV = NULL; + } + if (LabOutFinal == NULL) + { + delete[] LabOutFinal; + LabOutFinal = NULL; + } + if (InkOutL == NULL) + { + delete[] InkOutL; + InkOutL = NULL; + } - outputStops[i] = stop; + //are all stops in the same region? + int maxreg = -10; + int minreg = 10; + for (int i = 0; i < m_nGradStops; ++i) + { + maxreg = std::max(maxreg, m_GradStops[i].GamutRegion); + minreg = std::min(minreg, m_GradStops[i].GamutRegion); + } + bool same_regions = true; + if (maxreg != minreg) + same_regions = false; + double dEThr = 0.8; + //find intermediate points + int ninterstops = 300; + double **VecRGBOut = new double*[ninterstops]; + double **VecLabOut = new double*[ninterstops]; + double *posOut = new double[ninterstops]; + for (int i = 0; i < ninterstops; ++i) + { + VecLabOut[i] = new double[3]; + VecRGBOut[i] = new double[3]; } + int nOut = 0; + int nmaxstops = ninterstops * m_nGradStops; - //Pack output... - output_buffer = (uint8_t*)malloc(gradient_conversion_output__get_packed_size(conversionOutput)); - int size = gradient_conversion_output__pack(conversionOutput, output_buffer); + //Allocate temporary storage for all stops and positions + double **AllRGBOut_tmp = new double*[nmaxstops]; + double **AllLabOut_tmp = new double*[nmaxstops]; + double *AllPos_tmp = new double[nmaxstops]; + for (int i = 0; i < nmaxstops; ++i) + { + AllRGBOut_tmp[i] = new double[3]; + AllLabOut_tmp[i] = new double[3]; + } + AllRGBOut_tmp[0][0] = m_GradStops[0].RGB.Get_x(); + AllRGBOut_tmp[0][1] = m_GradStops[0].RGB.Get_y(); + AllRGBOut_tmp[0][2] = m_GradStops[0].RGB.Get_z(); + AllLabOut_tmp[0][0] = m_GradStops[0].Lab.Get_x(); + AllLabOut_tmp[0][1] = m_GradStops[0].Lab.Get_y(); + AllLabOut_tmp[0][2] = m_GradStops[0].Lab.Get_z(); + AllPos_tmp[0] = m_GradStops[0].offset; + int ncountStops = 0; + int nPosStops = 0; + double dOffset = 0; + GradOffset OffsetType = EqSpaced; + for (int i = 0; i < m_nGradStops - 1; ++i) + { + findStops(m_GradStops[i], m_GradStops[i + 1], dEThr, ninterstops, nOut, VecRGBOut, VecLabOut, posOut); + if (i == m_nGradStops - 2) + dOffset = (m_GradStops[i + 1].offset - m_GradStops[i].offset)*GradientEndThr / (nOut - 1); + else + dOffset = (m_GradStops[i + 1].offset - m_GradStops[i].offset) / (nOut - 1); - //RELEASE MEMORY HERE !!! + switch (OffsetType) + { + case EqSpaced: + for (int j = 1; j < nOut; ++j) + { + nPosStops++; + AllPos_tmp[nPosStops] = m_GradStops[i].offset + dOffset * posOut[j]; + } + break; + case dESpaced: + for (int j = 0; j < nOut; ++j) + { + nPosStops++; + AllPos_tmp[nPosStops] = m_GradStops[i].offset + dOffset * j; + } + break; + } + //store the stops in temporary vector + for (int i = 1; i < nOut; ++i) + { + ncountStops++; + for (int j = 0; j < 3; ++j) + { + AllRGBOut_tmp[ncountStops][j] = VecRGBOut[i][j]; + AllLabOut_tmp[ncountStops][j] = VecLabOut[i][j]; + } + } + } -#pragma region Free Conversion Input & Output - - gradient_conversion_input__free_unpacked(conversionInput, NULL); + if (VecRGBOut != NULL) + { + for (int i = 0; i < nOut; ++i) + delete[]VecRGBOut[i]; + delete[]VecRGBOut; + } + if (VecLabOut != NULL) + { + for (int i = 0; i < nOut; ++i) + delete[]VecLabOut[i]; + delete[]VecLabOut; + VecLabOut = NULL; + } + if (VecLabOut != NULL) + { + delete[]posOut; + posOut = NULL; + } - gradient_conversion_output__free_unpacked(conversionOutput, NULL); + //Store Gradient intermediate data in Input Coordinates type structure. + //Simplify calculations, we only need the ink values, input values are in RGB color space + // Use table according to Gamut Regions, all stops in region 0, use 100%table otherwise use regular table, decrease dyeing speed. -#pragma endregion + int nTotalStops = ncountStops; + InputCoordinates **SubStops = (InputCoordinates**)malloc(sizeof(InputCoordinates*)*nTotalStops); - return size; + //Calculate and store + for (int i = 0; i < nTotalStops; ++i) + { + SubStops[i] = (InputCoordinates*)malloc(sizeof(InputCoordinates)); + input_coordinates__init(SubStops[i]); + SubStops[i]->l = AllLabOut_tmp[i][0]; + SubStops[i]->a = AllLabOut_tmp[i][1]; + SubStops[i]->b = AllLabOut_tmp[i][2]; + SubStops[i]->red = (int)round(AllRGBOut_tmp[i][0]); + SubStops[i]->green = (int)round(AllRGBOut_tmp[i][1]); + SubStops[i]->blue = (int)round(AllRGBOut_tmp[i][2]); + } + +GradientOutputStop** outputStops = (GradientOutputStop**)malloc(sizeof(GradientOutputStop*) * nTotalStops); +conversionOutput->stops = outputStops; +conversionOutput->n_stops = nTotalStops; + +ColorSpace SubStopsCS = COLOR_SPACE__LAB; +//double NormFactor = m_ProcessRangesMaxP[m_nProcessRanges - 1] / 100.0; +VectorXd VolumeStop(m_nB2AnSepOut); +for (int i = 0; i < ncountStops; ++i) +{ + GradientOutputStop *stop = (GradientOutputStop*)malloc(sizeof(GradientOutputStop)); + gradient_output_stop__init(stop); + ConvertGradStoptoVolume(SubStops[i], SubStopsCS, + VolumeStop, GamutRegion); + //start filling Output + fillStop(stop, VolumeStop, GamutRegion, AllPos_tmp[i]); + outputStops[i] = stop; } +//release memory +if(AllLabOut_tmp != NULL) +{ + for (int i = 0; i < nmaxstops; ++i) + delete[] AllLabOut_tmp[i]; + delete[] AllLabOut_tmp; + AllLabOut_tmp = NULL; +} +if (AllRGBOut_tmp != NULL) +{ + for (int i = 0; i < nmaxstops; ++i) + delete[] AllRGBOut_tmp[i]; + delete[] AllRGBOut_tmp; + AllRGBOut_tmp = NULL; +} +if (AllPos_tmp != NULL) +{ + delete[] AllPos_tmp; + AllPos_tmp = NULL; +} + + +for (int i=0; i< m_nGradStops; ++i) + input_coordinates__free_unpacked(inputcoordinates[i], NULL); +free(inputcoordinates); +inputcoordinates = NULL; +for (int i = 0; i < nTotalStops; ++i) + input_coordinates__free_unpacked(SubStops[i], NULL); +free(SubStops); +SubStops = NULL; + +} + +void Tango::ColorLib::ColorConverter::NormGamutRegionMaxLim() +{ + double GamutRegionMaxLim0 = m_GamutRegionMaxLim[0]; + for (int i = 0; i < m_nProcessRanges; ++i) + m_GamutRegionMaxLim[i] = 100 * m_GamutRegionMaxLim[i] / GamutRegionMaxLim0; +} + +void Tango::ColorLib::ColorConverter::fillStop(GradientOutputStop *&stop, VectorXd Volume, int GamutRegion, double Position) +{ + OutputLiquid** outputLiquids = (OutputLiquid**)malloc(sizeof(OutputLiquid*) * m_nVolumes); + for (int i = 0; i < m_nVolumes; ++i) + { + outputLiquids[i] = (OutputLiquid*)malloc(sizeof(OutputLiquid)); + output_liquid__init(outputLiquids[i]); + switch (m_CalibCurves[i].getInkName()) + { + case LIQUID_TYPE__Cyan: + case LIQUID_TYPE__Magenta: + case LIQUID_TYPE__Yellow: + case LIQUID_TYPE__Black: + { + outputLiquids[i]->has_volume = true; + outputLiquids[i]->has_liquidtype = true; + outputLiquids[i]->liquidtype = (LiquidType)(m_CalibCurves[i].getInkName()); + outputLiquids[i]->volume = Volume(i); + break; + } + default: + throw std::exception("could not fill all volumes"); + } + } + stop->outputliquids = outputLiquids; + stop->n_outputliquids = m_nVolumes; + stop->has_processparameterstableindex = true; + stop->processparameterstableindex = GamutRegion; + stop->has_offset = true; + stop->offset = Position; +} + +void Tango::ColorLib::ColorConverter::GradInput2InputCoords(GradientConversionInput *conversionInput, InputCoordinates **inputcoordinates) +{ + for (size_t i = 0; i < conversionInput->n_stops; i++) + { + switch (conversionInput->stops[i]->colorspace) + { + case COLOR_SPACE__RGB: //Case RGB + inputcoordinates[i]->red = conversionInput->stops[i]->red; + inputcoordinates[i]->green = conversionInput->stops[i]->green; + inputcoordinates[i]->blue = conversionInput->stops[i]->blue; + inputcoordinates[i]->has_red = true; + inputcoordinates[i]->has_green = true; + inputcoordinates[i]->has_blue = true; + break; + case COLOR_SPACE__LAB: //Case LAB + inputcoordinates[i]->l = conversionInput->stops[i]->l; + inputcoordinates[i]->a = conversionInput->stops[i]->a; + inputcoordinates[i]->b = conversionInput->stops[i]->b; + inputcoordinates[i]->has_l = true; + inputcoordinates[i]->has_a = true; + inputcoordinates[i]->has_b = true; + break; + case COLOR_SPACE__Volume: //Case Volume + for (int j = 0; j < (int)conversionInput->stops[i]->n_liquidvolumes; j++) + { + LiquidVolume* liquidVolume = conversionInput->stops[i]->liquidvolumes[j]; + + switch (liquidVolume->liquidtype) + { + case LIQUID_TYPE__Cyan: + inputcoordinates[i]->inputliquids[0]->liquidtype = LIQUID_TYPE__Cyan; + inputcoordinates[i]->inputliquids[0]->volume = liquidVolume->volume; + case LIQUID_TYPE__Magenta: + inputcoordinates[i]->inputliquids[1]->liquidtype = LIQUID_TYPE__Magenta; + inputcoordinates[i]->inputliquids[1]->volume = liquidVolume->volume; + case LIQUID_TYPE__Yellow: + inputcoordinates[i]->inputliquids[2]->liquidtype = LIQUID_TYPE__Yellow; + inputcoordinates[i]->inputliquids[2]->volume = liquidVolume->volume; + case LIQUID_TYPE__Black: + inputcoordinates[i]->inputliquids[3]->liquidtype = LIQUID_TYPE__Black; + inputcoordinates[i]->inputliquids[3]->volume = liquidVolume->volume; + } + } + break; + } + } +} + +void Tango::ColorLib::ColorConverter::LimitInks(VectorXd inInks, double *BoundedInks) +{ + //convert Ink % to [nl/cm] + //Bound Ink + for (int i = 0; i < m_nInks; ++i) + BoundedInks[i] = std::min(inInks(i)*m_maxNlPerCM(i)/100.0, m_ProcessRangesMaxP[m_nProcessRanges - 1]); +} + +void Tango::ColorLib::ColorConverter::NLcmtoPercentage(VectorXd InVolume, VectorXd &OutVolume) +{ + for (int i = 0; i < m_nInks; ++i) + OutVolume(i) =100* InVolume(i) / m_maxNlPerCM(i); +} + +int Tango::ColorLib::ColorConverter::GetGamutRegion(VectorXd Volume, double *GamutLimits) +{ + double TotalVolume = 0.0; + int GamutRegion = 0; + for (int i = 0; i < m_nInks; ++i) + TotalVolume += Volume(i); + for (int i=0; i<m_nGamutRegions; ++i) + { + if (TotalVolume > GamutLimits[i]) + GamutRegion++; + } + return(GamutRegion); +}
\ No newline at end of file diff --git a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.h b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.h index 96eeac0f9..15e8f2d04 100644 --- a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.h +++ b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.h @@ -11,6 +11,10 @@ #include "ConversionOutput.pb-c.h" #include "CalibrationData.pb-c.h" #include "ConversionInput.pb-c.h" +#include "GradientInputStop.pb-c.h" +#include "GradientOutputStop.pb-c.h" +#include "GradientConversionInput.pb-c.h" +#include "GradientConversionOutput.pb-c.h" #include "Interp.h" #include "Curves.h" @@ -29,12 +33,28 @@ namespace Tango double *GRegMaxLim; } CT_Header; - typedef enum { + typedef struct + { + C_RGB_XYZ_Lab Lab; + C_RGB_XYZ_Lab RGB; + double *Volume; + bool InGamut; + int GamutRegion; + double offset; + ColorSpace colorspace; + }GradStruct; + + /*typedef enum { XYZ, Lab, CMY, CMYK - }ColorSpace; + }ColorSpaceH;*/ + + typedef enum { + EqSpaced, + dESpaced + }GradOffset; typedef enum { A2B, @@ -49,17 +69,19 @@ namespace Tango namespace ColorLib { - - class ColorConverter { public: ColorConverter(); ~ColorConverter(); // size_t Convert(uint8_t * input_buffer, size_t input_buffer_size, uint8_t *& output_buffer); - void ConvertColorToLinearInks(ConversionInput* conversionInput, VectorXd &InkOut, VectorXd &RGBOut, VectorXd &LabOut, + void ConvertColorToLinearInks( InputCoordinates* inputcoordinates, ColorSpace colorspace, + VectorXd &InkOut, VectorXd &RGBOut, VectorXd &LabOut, int &GamutRegion, bool &InGamut); - void ConvertVolumeToRGBDisplay(ConversionInput* conversionInput, VectorXd &InkOut, VectorXd &RGBOut, + void ConvertGradStoptoVolume(InputCoordinates* inputcoordinates, ColorSpace colorspace, + VectorXd &InkOut, int &GamutRegion); + void ConvertVolumeToRGBDisplay(InputCoordinates *IC, int n_processRanges,int colorspace, + VectorXd &InkOut, VectorXd &RGBOut, VectorXd &LabOut, int &GamutRegion); size_t Tango::ColorLib::ColorConverter::Convert(uint8_t * input_buffer, size_t input_buffer_size, uint8_t *& output_buffer); size_t Tango::ColorLib::ColorConverter::GenerateGradient(uint8_t * input_buffer, size_t input_buffer_size, uint8_t *& output_buffer); @@ -83,18 +105,22 @@ namespace Tango C_RGB_XYZ_Lab m_whitepointXYZ_CT; void LimitLab(double* LabIn); int m_nGamutRegions; + int m_nGradStops; + GradStruct *m_GradStops; double *m_GamutRegionMaxLim; int m_nB2AnSepIn; int m_nB2AnSepOut; int m_nA2BnSepIn; int m_nA2BnSepOut; - bool m_AdaptWP; +// bool m_AdaptWP; CalibData *m_CalibCurves; int m_nInks; int m_nVolumes; int m_nProcessRanges; //double *m_ProcessRangesMinP; double *m_ProcessRangesMaxP; + double m_NormFactor; + double m_InvNormFactor; //double *m_ProcessRangesMaxInkUptake; //double *m_ProcessRangesMinInkUptake; C_RGB_XYZ_Lab m_WP; @@ -105,7 +131,8 @@ namespace Tango void SetnA2BnSepOut(int nA2BnSepOut) { m_nA2BnSepOut = nA2BnSepOut; }; void SetnGamutRegions(int nGamutRegions) { m_nGamutRegions = nGamutRegions; }; void readColorTransformations(ConversionInput* conversionInput); - void readCalibrationTables(ConversionInput* conversionInput); + void readColorTables(bool has_rddata, uint8_t *data, int nprocessranges); + void readCalibrationTables(InputLiquid **inputliquids, int n_inputliquids); void SetCalibData(CalibrationData* calibrationData, int i, CalibData *tmpCurve); void SetNumberofInks(int nInks) { m_nInks = nInks; }; void SetNumberOfVolumes(int nVol) { m_nVolumes = nVol; }; @@ -114,6 +141,8 @@ namespace Tango void fillRGB(OutputCoordinates *outputCoords, VectorXd RGBOut); void fillLab(OutputCoordinates *outputCoords, VectorXd LabOut); void fillVolume(OutputCoordinates *&outputCoords, VectorXd Volume); + void fillStop(GradientOutputStop *&stop, VectorXd Volume, int GamutRegion, double Position); + void fillGradientStops(GradientConversionInput *conversionInput); void ProcessHiveNeighbors(ConversionInput *conversionInput, VectorXd LabC, VectorXd RGBC, VectorXd VolumeC, int InGamutRegion, MatrixXd &RGBOut, MatrixXd & LabOut, MatrixXd &VolumeOut, int nHive, int *&GamutRegion, int *indDataMax); @@ -122,17 +151,28 @@ namespace Tango MatrixXd &ORGBHive, MatrixXd &OVolumeHive, int *&OGamutRegion); void FindTriplet(VectorXd Lab, MatrixXd Lab1, int nHive, int*indDataMax); int CountNumberofInks(ConversionInput* conversionInput); + void SetStripWhitepoint(double threadl, double threada, double threadb); void VectorToDouble(VectorXd Vec, double *doub); VectorXd DoubleToVector(double *doub, int nSize); void CompareWhitePoints(); bool IsInGamut(double *InLab, SURROUND sur, CAM02CS CS, double *LabCoord); - CT_Header read_header(ConversionInput* conversionInput, int &bytesread); + CT_Header read_header(uint8_t* data, int &bytesread); void read_lut_type(int offset, int data_size, ColorTransf *Transf, ConversionInput* conversionInput); - void read_xyz_type(int offset, int data_size, C_RGB_XYZ_Lab *xyz, ConversionInput* conversionInput); + void read_xyz_type(int offset, int data_size, C_RGB_XYZ_Lab *xyz, uint8_t *data); void read_text_type(int offset, int data_size, std::string *textstr, - ConversionInput* conversionInput); + uint8_t *data); void read_text_description_type(int offset, int data_size, std::string textdescstr, - ConversionInput* conversionInput); + uint8_t *data); + void findStops(GradStruct m_GradStops1, GradStruct m_GradStops2, double dEThr, int ninterstops, int &nOut, + double **VecRGBOut, double **VecLabOut, double *posOut); + void SetNormFactor(); + void SetInverseNormFactor(); + void NormGamutRegionMaxLim(); + void GradInput2InputCoords(GradientConversionInput *conversionInput, InputCoordinates **inputcoordinates); + void PrepareGradient(GradientConversionInput* conversionInput, GradientConversionOutput *conversionOutput); + void LimitInks(VectorXd inInks, double *BoundedInks); + void NLcmtoPercentage(VectorXd InVolume, VectorXd &OutVolume); + int GetGamutRegion(VectorXd Volume, double *GamutLimits); }; } } diff --git a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorConvert.cpp b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorConvert.cpp index a0d773aee..19ffdf4b5 100644 --- a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorConvert.cpp +++ b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorConvert.cpp @@ -1078,6 +1078,13 @@ void ColorConvert::Jab_parameters(CAM02CS CS) dECMCVal = (dECMC1 + dECMC2) / 2; } + void ColorConvert::dEcmc(C_RGB_XYZ_Lab &refX, C_RGB_XYZ_Lab &samX, double &dECMC) + { + VectorXd refX1 = refX.Get(); + VectorXd samX1 = samX.Get(); + dEcmc(samX1, refX1, dECMC); + } + void ColorConvert::dEcmc(VectorXd refX, VectorXd samX, double &dECMC) { //dEcmc(refX, samX) calculates color difference CMC(2:1) in diff --git a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorConvert.h b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorConvert.h index aa1b323b1..e9bec9331 100644 --- a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorConvert.h +++ b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorConvert.h @@ -90,6 +90,7 @@ class ColorConvert double *LabToJab(double* pColor, SURROUND sur); void InitCiecamParams(double Y_b, double L_A, SURROUND sur, CAM02CS CS); void dEcmc(VectorXd refX, VectorXd samX, double &dE); + void dEcmc(C_RGB_XYZ_Lab &refX, C_RGB_XYZ_Lab &samX, double &dE); void SymmetricaldECMC(VectorXd refX, VectorXd samX, double &dECMC); CAM02CS getCAM02CS() { return(m_CS); }; SURROUND getSurround() { return(m_sur); }; diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/ViewModels/MainViewVM.cs index d4bb07a9b..c31c95800 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/ViewModels/MainViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/ViewModels/MainViewVM.cs @@ -34,6 +34,7 @@ namespace Tango.MachineStudio.RML.ViewModels private IAuthenticationProvider _authentication; private IActionLogManager _actionLogManager; private RmlDTO _rmlBeforeSave; + private static object _syncLock = new object(); private ObservablesContext _rmls_context; private ObservablesContext _active_context; @@ -45,6 +46,22 @@ namespace Tango.MachineStudio.RML.ViewModels set { _rmls = value; RaisePropertyChangedAuto(); } } + private ICollectionView _rmlssCollectionView; + /// <summary> + /// Gets or sets the RML collection view. + /// </summary> + public ICollectionView RmlsCollectionView + { + get { return _rmlssCollectionView; } + set + { + _rmlssCollectionView = value; + BindingOperations.EnableCollectionSynchronization(_rmlssCollectionView, _syncLock); + + RaisePropertyChangedAuto(); + } + } + private ObservableCollection<MediaMaterial> _materials; public ObservableCollection<MediaMaterial> Materials { @@ -171,6 +188,16 @@ namespace Tango.MachineStudio.RML.ViewModels set { _colorCalibrationVM = value; RaisePropertyChangedAuto(); } } + private String _RMLFilter; + /// <summary> + /// Gets or sets the job filter. + /// </summary> + public String RMLFilter + { + get { return _RMLFilter; } + set { _RMLFilter = value; RaisePropertyChangedAuto(); OnRMLFilterChanged(); } + } + /// <summary> /// Gets or sets the manage RML command. /// </summary> @@ -262,7 +289,6 @@ namespace Tango.MachineStudio.RML.ViewModels _rmls_context = ObservablesContext.CreateDefault(); Rmls = await new RmlsCollectionBuilder(_rmls_context).SetAll().WithLiquidFactors().WithMediaProperties().BuildAsync(); - //Load CCT file names... var ccts = await _rmls_context.Ccts.Select(x => new { @@ -283,6 +309,8 @@ namespace Tango.MachineStudio.RML.ViewModels }; } } + RmlsCollectionView = CollectionViewSource.GetDefaultView(Rmls); + RmlsCollectionView.SortDescriptions.Add(new SortDescription(nameof(Rml.LastUpdated), ListSortDirection.Descending)); } private async void LoadActiveRML(String guid) @@ -653,6 +681,23 @@ namespace Tango.MachineStudio.RML.ViewModels ActiveProcessParametersTableView.Refresh(); } + private void OnRMLFilterChanged() + { + String filter = RMLFilter.ToLower(); + + RmlsCollectionView.Filter = (rml) => + { + Rml r = rml as Rml; + return String.IsNullOrWhiteSpace(filter) + || + r.Name.ToLower().Contains(filter) //Rml name + || + (r.MediaMaterial != null && r.MediaMaterial.Name.ToLower().Contains(filter)) // Material name + || + (r.Cct != null && r.Cct.FileName != null && r.Cct.FileName.ToString().Contains(filter)); //Cct.FileName + }; + } + private void RemoveLiquidFactor(LiquidTypesRml liquidFactor) { if (_notification.ShowQuestion("Removing this liquid factor will remove the liquid type association with the RML and will drop the calibration data. Are you sure?")) diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Views/RmlsView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Views/RmlsView.xaml index 288f00a3d..18af6bed5 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Views/RmlsView.xaml +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Views/RmlsView.xaml @@ -22,6 +22,10 @@ <DockPanel Margin="100 100 100 50" MaxWidth="1200"> <Grid DockPanel.Dock="Top"> <Image Source="../Images/threads.png" Width="300" Margin="10" /> + <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0 0 10 30"> + <materialDesign:PackIcon Kind="Magnify" Width="26" Height="26"/> + <TextBox Width="300" materialDesign:HintAssist.Hint="Search name, material,..." Text="{Binding RMLFilter,UpdateSourceTrigger=PropertyChanged}"></TextBox> + </StackPanel> </Grid> <Grid DockPanel.Dock="Bottom"> <StackPanel> diff --git a/Software/Visual_Studio/Tango.ColorLib.GradientTest.CLI/Program.cs b/Software/Visual_Studio/Tango.ColorLib.GradientTest.CLI/Program.cs index 811f53841..37d219757 100644 --- a/Software/Visual_Studio/Tango.ColorLib.GradientTest.CLI/Program.cs +++ b/Software/Visual_Studio/Tango.ColorLib.GradientTest.CLI/Program.cs @@ -20,54 +20,54 @@ namespace Tango.ColorLib.GradientTest.CLI GradientConversionInput input = new GradientConversionInput(); //CCT - input.ForwardData = ByteString.CopyFrom(File.ReadAllBytes(@"C:\Test\CMYKSylko.cct")); //TODO: Load CCT file from local drive. + input.ForwardData = ByteString.CopyFrom(File.ReadAllBytes(@"C:\Mirta\Matlab\Sylko_HV_IL350.cct")); //TODO: Load CCT file from local drive. //RML Liquid Factors input.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Cyan, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Cyan), - MaxNanoliterPerCentimeter = 2.34, + MaxNanoliterPerCentimeter = 175, }); input.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Magenta, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Magenta), - MaxNanoliterPerCentimeter = 2.34, + MaxNanoliterPerCentimeter = 175, }); input.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Yellow, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Yellow), - MaxNanoliterPerCentimeter = 2.34, + MaxNanoliterPerCentimeter = 175, }); input.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Black, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Black), - MaxNanoliterPerCentimeter = 2.34, + MaxNanoliterPerCentimeter =175, }); //Process Ranges input.ProcessRanges.Add(new ProcessRange() { - MinInkUptake = 200, - MaxInkUptake = 200, + MinInkUptake = 175, + MaxInkUptake = 175, }); input.ProcessRanges.Add(new ProcessRange() { - MinInkUptake = 200, - MaxInkUptake = 400, + MinInkUptake = 175, + MaxInkUptake = 350, }); //White Point - input.ThreadL = 1; - input.ThreadA = 2; - input.ThreadB = 3; + input.ThreadL = 92.7867 ; + input.ThreadA = -0.2519; + input.ThreadB = 0.6968; //Segment length input.SegmentLength = 1000; @@ -77,9 +77,9 @@ namespace Tango.ColorLib.GradientTest.CLI { ColorSpace = ColorSpace.Rgb, Offset = 0, - Red = 255, - Green = 0, - Blue = 0, + Red = 25, + Green = 139, + Blue = 246, }); //RGB Stop 2 @@ -87,9 +87,9 @@ namespace Tango.ColorLib.GradientTest.CLI { ColorSpace = ColorSpace.Rgb, Offset = 1, - Red = 0, - Green = 0, - Blue = 255, + Red = 71, + Green = 244, + Blue = 40, }); Console.WriteLine($"Testing input:\n{input.ToJsonString(nameof(input.ForwardData),nameof(CalibrationData))}"); 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 2d4775a37..58c5dfedf 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs @@ -11,6 +11,9 @@ using System.Linq.Expressions; using System.Diagnostics; using OxyPlot; using System.Collections.ObjectModel; +using Tango.Documents; +using System.IO; +using Tango.Core.Helpers; namespace Tango.DispenserAnalyzer.UI.Analyzers { @@ -38,7 +41,7 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers if (index % 2 == 1)//testing Flow-error { - List<DispenserSample> filteredValues = rangeTestValues.Skip(1800).ToList(); + List<DispenserSample> filteredValues = rangeTestValues.Skip((int)Settings.GetValueByName(AnalyzerSettingsEnum.ExcludeAnalysis)).ToList(); //Move Average data List<Task> tasks = new List<Task>(); @@ -57,11 +60,12 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers Task.WaitAll(tasks.ToArray()); //calculate difference Max Min values for each 300 values - int periodCalcMaxMin = 500; + int periodCalcMaxMin = (int)Settings.GetValueByName(AnalyzerSettingsEnum.MaxMinRange); + int intervalCalcMaxMin = (int)Settings.GetValueByName(AnalyzerSettingsEnum.MaxMinIntervals); List<int> differenceMaxMin = new List<int>(); List<int> differenceMaxMinToLocationArr = new List<int>(); int location_index = 0; - for (int i = 0; i < (filteredValues.Count - periodCalcMaxMin); i+= 300) + for (int i = 0; i < (filteredValues.Count - periodCalcMaxMin); i+= intervalCalcMaxMin) { var rangeItems =(filteredValues.Skip(i).Take(periodCalcMaxMin).ToList()); int range = (int)(rangeItems.Max(t => t.Pressure) - rangeItems.Min(t => t.Pressure)); @@ -71,7 +75,7 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers } FlowAverageAnalyzerResult averageResult = new FlowAverageAnalyzerResult(); averageResult.AverageValue = filteredValues.Average(t => t.Pressure); - averageResult.Result = (averageResult.AverageValue <= 1850 && averageResult.AverageValue >= 1400) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; + averageResult.Result = (averageResult.AverageValue <= Settings.GetValueByName(AnalyzerSettingsEnum.AvgMaxValue) && averageResult.AverageValue >= Settings.GetValueByName(AnalyzerSettingsEnum.AvgMinValue)) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; results.Add(averageResult); FlowAnalyzerResult result = new FlowAnalyzerResult(++flowtestNumber); @@ -85,8 +89,8 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers int avgMinIndex = rangeTestValues.Select(x => x.Index).Min(); int avgMaxIndex = rangeTestValues.Select(x => x.Index).Max(); double totalsec = TimeSpan.FromMilliseconds((avgMaxIndex - avgMinIndex) * 100).TotalSeconds; - result.Time = totalsec.ToString() + " sec (succeed for period < 4.5)"; ; - result.Result = (totalsec < 4.5) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; + result.Time = totalsec.ToString() + $" sec (succeed for period < {AnalyzerSettingsEnum.FlowPBUPassFail})"; ; + result.Result = (totalsec < Settings.GetValueByName(AnalyzerSettingsEnum.FlowPBUPassFail)) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; results.Add(result); } } @@ -155,12 +159,17 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers } RangeToTimeChart.Title = $"Flow Time Location To Range {TestNumber}"; RangeToTimeChart.UpdateData(); + string filename = FileHelper.GetFileToSaveFlowRangeToTimeData(TestNumber); + if(filename.IsNotNullOrEmpty() && rangeToTimePoints.Count > 0) + { + ExportnDataToExcel(rangeToTimePoints.ToList(), filename); + } } private double BuildMeasurementError(List<int> range_values) { int count = range_values.Count(); - return (count - (count * 0.99)); + return (count - (int)Settings.GetValueByName(AnalyzerSettingsEnum.TakeOffMaxMin)); } /// <summary> @@ -187,11 +196,48 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers break; } } - //Result = (range <= 25 && range >= 20) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; + var res = range / AverageValue * 100; - Result = res <= 1.5 ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; + Result = res <= Settings.GetValueByName(AnalyzerSettingsEnum.MaxError) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; return max_key; } + + /// <summary> + /// Exports the calibration data to excel. + /// </summary> + /// <param name="calibrationPoints">The calibration points.</param> + /// <param name="fileName">Name of the file.</param> + public static void ExportnDataToExcel(List<DataPoint> dataPoints, String fileName) + { + try + { + CreateDataExcelTemplate(fileName); + + using (ExcelWriter writer = new ExcelWriter(fileName)) + { + writer.WriteData(dataPoints, "RangeToTimeData"); + } + } + catch (Exception ex) + { + Debug.WriteLine("Error: ", ex.Message); + } + } + + /// <summary> + /// Creates the calibration data excel template. + /// </summary> + /// <param name="fileName">Name of the file.</param> + public static void CreateDataExcelTemplate(String fileName) + { + var stream = EmbeddedResourceHelper.GetEmbeddedResourceStream("Tango.DispenserAnalyzer.UI.Models.FlowRangeToTimeResults.xlsx"); + + using (FileStream fs = new FileStream(fileName, FileMode.Create)) + { + stream.Seek(0, SeekOrigin.Begin); + stream.CopyTo(fs); + } + } } public class MovingAverageFilter diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PressureBuildUpAnalyser.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PressureBuildUpAnalyser.cs index edc89f030..c4c5f6c65 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PressureBuildUpAnalyser.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PressureBuildUpAnalyser.cs @@ -29,7 +29,7 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers int avgMaxIndex = rangeTestValues.Select(x => x.Index).Max(); double totalsec = TimeSpan.FromMilliseconds((avgMaxIndex - avgMinIndex) * 100).TotalSeconds; result.Time = totalsec.ToString() + " sec"; - result.Result = (totalsec <= 12 && totalsec >= 7) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; + result.Result = (totalsec < Settings.GetValueByName(AnalyzerSettingsEnum.PBUPassFail)) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed; results.Add(result); } } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.xaml b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.xaml index 73d8ea48c..8969f50af 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.xaml +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.xaml @@ -3,7 +3,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:local="clr-namespace:Tango.DispenserAnalyzer.UI" - StartupUri="MainWindow.xaml"> + Startup="Application_Startup"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.xaml.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.xaml.cs index 6250d17a1..c1876d806 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.xaml.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.xaml.cs @@ -13,5 +13,12 @@ namespace Tango.DispenserAnalyzer.UI /// </summary> public partial class App : Application { + private void Application_Startup(object sender, StartupEventArgs e) + { + MainWindow wnd = new MainWindow(); + if (e.Args.Length >= 1) + wnd.SetOpenFileFromArgument(e.Args[0]); + wnd.Show(); + } } } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/FileHelper.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/FileHelper.cs new file mode 100644 index 000000000..7172a4ff1 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/FileHelper.cs @@ -0,0 +1,44 @@ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DispenserAnalyzer.UI +{ + public static class FileHelper + { + private const string FILE_EXTENSION = ".pdf"; + private const string FILE_EXEL_EXTENSION = ".xlsx"; + + public static string OpenFilePath{ get; set; } + + public static string GetResultFilePath() + { + if (File.Exists(OpenFilePath)) + { + var ext = Path.GetExtension(OpenFilePath); + var dir = Path.GetDirectoryName(OpenFilePath); + var resultFile = Path.Combine(dir, string.Format("{0}-result{1}", Path.GetFileNameWithoutExtension(OpenFilePath), FILE_EXTENSION)); + return resultFile; + } + return ""; + } + + public static string GetFileToSaveFlowRangeToTimeData( int extNumber) + { + if (File.Exists(OpenFilePath)) + { + var ext = Path.GetExtension(OpenFilePath); + var dir = Path.GetDirectoryName(OpenFilePath); + var resultFile = Path.Combine(dir, string.Format("{0}_rangeToTime{1}{2}", Path.GetFileNameWithoutExtension(OpenFilePath), extNumber.ToString(), FILE_EXEL_EXTENSION)); + return resultFile; + } + return ""; + } + + + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs index 9797d203b..43a573a7d 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs @@ -48,6 +48,15 @@ namespace Tango.DispenserAnalyzer.UI ax.Maximum = ax.Minimum = Double.NaN; } + public void SetOpenFileFromArgument( string openFilePath) + { + if(_vm != null) + { + _vm.OpenFilePath = openFilePath; + _vm.Generate(); + } + } + private void TextBlock_PreviewDrop(object sender, DragEventArgs e) { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/FlowRangeToTimeResults.xlsx b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/FlowRangeToTimeResults.xlsx Binary files differnew file mode 100644 index 000000000..5f0e4b651 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/FlowRangeToTimeResults.xlsx diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/SettingsModel.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/SettingsModel.cs index 0d9e20288..5540e4b25 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/SettingsModel.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/SettingsModel.cs @@ -4,11 +4,24 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core; +using Tango.Core.Commands; namespace Tango.DispenserAnalyzer.UI.Models -{ - public class SettingsModel: ExtendedObject +{ + public interface ISettingsModel { + string PropertyName { get; set; } + double PropertyValue { get; set; } + double DefaultValue { get; set; } + string DefaultValueDisplay { get; set; } + double MinRangeValue { get; set; } + double MaxRangeValue { get; set; } + bool IsRangeVisible { get; set; } + } + + public class SettingsModel: ExtendedObject, ISettingsModel + { + public AnalyzerSettingsEnum _enumName; private string _propertyName; public string PropertyName @@ -22,7 +35,23 @@ namespace Tango.DispenserAnalyzer.UI.Models public double PropertyValue { get { return _propertyvalue; } - set { _propertyvalue = value; RaisePropertyChangedAuto(); } + set { + if( _propertyvalue != value) + { + _propertyvalue = value; + RaisePropertyChangedAuto(); + OnPropertyvalueChanged(); + } + } + } + + private void OnPropertyvalueChanged() + { + if(SettingValueEvent != null) + { + SettingValueEvent?.Invoke(this, new EventArgs()); + } + } private double _defaultValue; @@ -41,12 +70,78 @@ namespace Tango.DispenserAnalyzer.UI.Models set { _defaultValueDisplay = value; } } + private double _minDefaultRangeValue; + public double MinDefaultRangeValue + { + get { return _minDefaultRangeValue; } + set { _minDefaultRangeValue = value; RaisePropertyChangedAuto(); } + } + + private double _maxDefaultRangeValue; + public double MaxDefaultRangeValue + { + get { return _maxDefaultRangeValue; } + set { _maxDefaultRangeValue = value; RaisePropertyChangedAuto(); } + } + + private double _minRangeValue; + public double MinRangeValue + { + get { return _minRangeValue; } + set { + if (_minRangeValue != value) + { + _minRangeValue = value; + RaisePropertyChangedAuto(); + OnPropertyvalueChanged(); + } + } + } - public SettingsModel( string propertyName, string defaultValueDisplay, double defaultValue) + private double _maxRangeValue; + public double MaxRangeValue { - PropertyName = propertyName; + get { return _maxRangeValue; } + set { + if (_maxRangeValue != value) + { + _maxRangeValue = value; + RaisePropertyChangedAuto(); + OnPropertyvalueChanged(); + } + } + } + public bool IsRangeVisible { get; set; } + + public event EventHandler SettingValueEvent; + + public RelayCommand SetDefaultCommand { get; set; } + + + public SettingsModel(AnalyzerSettingsEnum enumName, string defaultValueDisplay, bool isrange = false) + { + _enumName = enumName; + PropertyName = _enumName.ToDescription(); DefaultValueDisplay = defaultValueDisplay; - DefaultValue = defaultValue; + DefaultValue = Settings.GetDefaultValueByName(enumName); + PropertyValue = Settings.GetValueByName(enumName); + IsRangeVisible = isrange; + MinDefaultRangeValue = IsRangeVisible ? Settings.GetDefaultValueByName(AnalyzerSettingsEnum.AvgMinValue) : 0.0; + MaxDefaultRangeValue = IsRangeVisible ? Settings.GetDefaultValueByName(AnalyzerSettingsEnum.AvgMaxValue) : 0.0; + MinRangeValue = IsRangeVisible? Settings.GetValueByName(AnalyzerSettingsEnum.AvgMinValue) : 0.0; + MaxRangeValue = IsRangeVisible? Settings.GetValueByName(AnalyzerSettingsEnum.AvgMaxValue) : 0.0; + SetDefaultCommand = new RelayCommand(SetDefault); + } + + private void SetDefault() + { + if(IsRangeVisible) + { + MinRangeValue = MinDefaultRangeValue; + MaxRangeValue = MaxDefaultRangeValue; + return; + } + PropertyValue = DefaultValue; } } } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Settings.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Settings.cs new file mode 100644 index 000000000..9a1f10aed --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Settings.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DispenserAnalyzer.UI +{ + public enum AnalyzerSettingsEnum + { + //Undetermined + [Description("PBU Pass fail")] + PBUPassFail, + [Description("PBU Pass fail")] + FlowPBUPassFail, + [Description("Exclude from analysis")] + ExcludeAnalysis, + [Description("Avg value")] + AvgMaxValue, + [Description("Avg value")] + AvgMinValue, + [Description("Max-Min range")] + MaxMinRange, + [Description("Max Min intervals")] + MaxMinIntervals, + [Description("Max error")] + MaxError, + [Description("Take off 'Max-min' values(out of highest results)")] + TakeOffMaxMin, + + } + + public static class Settings + { + public static Dictionary<AnalyzerSettingsEnum, double> DefaultValues { get; set; } + public static Dictionary<AnalyzerSettingsEnum, double> CurrentValues { get; set; } + + static Settings() + { + DefaultValues = new Dictionary<AnalyzerSettingsEnum, double>(); + + DefaultValues[AnalyzerSettingsEnum.PBUPassFail] = 4.5; + DefaultValues[AnalyzerSettingsEnum.FlowPBUPassFail] = 4.5; + DefaultValues[AnalyzerSettingsEnum.ExcludeAnalysis] = 1800; + DefaultValues[AnalyzerSettingsEnum.AvgMinValue] = 1400; + DefaultValues[AnalyzerSettingsEnum.AvgMaxValue] = 1850; + DefaultValues[AnalyzerSettingsEnum.MaxMinRange] = 500; + DefaultValues[AnalyzerSettingsEnum.MaxMinIntervals] = 300; + DefaultValues[AnalyzerSettingsEnum.MaxError] = 1.5; + DefaultValues[AnalyzerSettingsEnum.TakeOffMaxMin] = 3; + + CurrentValues = new Dictionary<AnalyzerSettingsEnum, double>(); + CurrentValues[AnalyzerSettingsEnum.PBUPassFail] = 4.5; + CurrentValues[AnalyzerSettingsEnum.FlowPBUPassFail] = 4.5; + CurrentValues[AnalyzerSettingsEnum.ExcludeAnalysis] = 1800; + CurrentValues[AnalyzerSettingsEnum.AvgMinValue] = 1400; + CurrentValues[AnalyzerSettingsEnum.AvgMaxValue] = 1850; + CurrentValues[AnalyzerSettingsEnum.MaxMinRange] = 500; + CurrentValues[AnalyzerSettingsEnum.MaxMinIntervals] = 300; + CurrentValues[AnalyzerSettingsEnum.MaxError] = 1.5; + CurrentValues[AnalyzerSettingsEnum.TakeOffMaxMin] = 3; + } + public static double GetValueByName(AnalyzerSettingsEnum name) + { + double value; + if (CurrentValues.TryGetValue(name, out value)) + { + return value; + } + return 0.0; + } + public static void SetValueByName(AnalyzerSettingsEnum name, double value) + { + CurrentValues[name] = value; + } + public static double GetDefaultValueByName(AnalyzerSettingsEnum name) + { + double value; + if (DefaultValues.TryGetValue(name, out value)) + { + return value; + } + return 0.0; + } + } +} 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 7efcaa58d..01a5a7122 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 @@ -29,8 +29,8 @@ <ProductName>Dispenser Analyser</ProductName> <PublisherName>Twine</PublisherName> <OpenBrowserOnPublish>false</OpenBrowserOnPublish> - <ApplicationRevision>4</ApplicationRevision> - <ApplicationVersion>1.2.1.%2a</ApplicationVersion> + <ApplicationRevision>2</ApplicationRevision> + <ApplicationVersion>2.1.1.%2a</ApplicationVersion> <UseApplicationTrust>true</UseApplicationTrust> <CreateDesktopShortcut>true</CreateDesktopShortcut> <PublishWizardCompleted>true</PublishWizardCompleted> @@ -140,10 +140,12 @@ <Compile Include="Analyzers\ReliabilityTestAnalyser.cs" /> <Compile Include="Analyzers\SealingAnalyzer.cs" /> <Compile Include="Analysis\AnalyzerAttribute.cs" /> + <Compile Include="FileHelper.cs" /> <Compile Include="Models\DispenserCsvRow.cs" /> <Compile Include="Models\DispenserSample.cs" /> <Compile Include="Models\DispenserSampleCommand.cs" /> <Compile Include="Models\SettingsModel.cs" /> + <Compile Include="Settings.cs" /> <Compile Include="ViewModels\MainWindowVM.cs" /> <Compile Include="ViewModels\SettingsVM.cs" /> <Compile Include="View\SettingsWnd.xaml.cs"> @@ -184,6 +186,7 @@ <Generator>ResXFileCodeGenerator</Generator> <LastGenOutput>Resources.Designer.cs</LastGenOutput> </EmbeddedResource> + <EmbeddedResource Include="Models\FlowRangeToTimeResults.xlsx" /> <None Include="packages.config" /> <None Include="Properties\Settings.settings"> <Generator>SettingsSingleFileGenerator</Generator> @@ -203,6 +206,10 @@ <Project>{58e8825f-0c96-449c-b320-1e82b0aa876b}</Project> <Name>Tango.CSV</Name> </ProjectReference> + <ProjectReference Include="..\..\Tango.Documents\Tango.Documents.csproj"> + <Project>{ca87a608-7b17-4c98-88f2-42abee10f4c1}</Project> + <Name>Tango.Documents</Name> + </ProjectReference> <ProjectReference Include="..\..\Tango.SharedUI\Tango.SharedUI.csproj"> <Project>{8491d07b-c1f6-4b62-a412-41b9fd2d6538}</Project> <Name>Tango.SharedUI</Name> diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml index 9d818a05b..2bfa2bba1 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml @@ -6,7 +6,7 @@ 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"> + Title="Settings" Height="630" Width="800" FontSize="22" ResizeMode="NoResize" WindowStyle="ToolWindow" Closing="Window_Closing"> <Window.Resources> <Style TargetType="{x:Type TextBlock}" x:Key="WrapText"> <Setter Property="TextWrapping" Value="Wrap"/> @@ -71,11 +71,44 @@ <Setter Property="VerticalScrollBarVisibility" Value="Auto"/> </Style> - <DataGrid x:Key="PropertyDataGrid" HorizontalAlignment="Left" VerticalScrollBarVisibility ="Auto" SelectionUnit="FullRow" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" + <DataGrid x:Key="PropertyDataGrid" x:Shared="False" 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> + <DataGridTemplateColumn Header="Property Value" Width="150"> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <StackPanel Orientation="Horizontal"> + <TextBox Text="{Binding PropertyValue, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" Width="50" VerticalAlignment="Top"> + <TextBox.Style> + <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource MaterialDesignTextBox}"> + <Setter Property="Visibility" Value="Visible"/> + <Style.Triggers> + <DataTrigger Binding="{Binding IsRangeVisible}" Value="true"> + <Setter Property="Visibility" Value="Collapsed"/> + </DataTrigger> + </Style.Triggers> + </Style> + </TextBox.Style> + </TextBox> + <DockPanel HorizontalAlignment="Stretch" Width="150"> + <DockPanel.Style> + <Style TargetType="{x:Type DockPanel}"> + <Setter Property="Visibility" Value="Collapsed"/> + <Style.Triggers> + <DataTrigger Binding="{Binding IsRangeVisible}" Value="true"> + <Setter Property="Visibility" Value="Visible"/> + </DataTrigger> + </Style.Triggers> + </Style> + </DockPanel.Style> + <TextBox DockPanel.Dock="Left" Name="MinRangeValue" Width="50" Text="{Binding MinRangeValue, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/> + <TextBox DockPanel.Dock="Right" Name="MaxRangeValue" Width="50" Text="{Binding MaxRangeValue, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/> + </DockPanel> + </StackPanel> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> <DataGridTextColumn Header="Default Value" Binding="{Binding DefaultValueDisplay}" Width="150" ElementStyle="{StaticResource WrapText}" /> <DataGridTemplateColumn Header="" Width="1*"> <DataGridTemplateColumn.CellStyle> @@ -104,13 +137,14 @@ <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Grid HorizontalAlignment="Stretch" VerticalAlignment="Center"> - <Button Width="80" Padding="2" Height="26" FontSize="12" Margin="0 8">Set Default</Button> + <Button Width="80" Padding="2" Height="26" FontSize="12" Margin="0 8" Command="{Binding SetDefaultCommand}">Set Default</Button> </Grid> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> + </Window.Resources> @@ -124,27 +158,29 @@ </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> + <Grid.RowDefinitions> + <RowDefinition Height="Auto"/> + <RowDefinition Height="Auto"/> + </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 x:Name="PBUTestControl" Grid.Row="1" Content="{StaticResource PropertyDataGrid}" DataContext="{Binding Path=PBUTestSettings}" Margin="20 0 20 0"></ContentControl> </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*"/> + <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid Grid.Row="0" VerticalAlignment="Top"> <Border Margin="20 20 20 0" BorderBrush="LightGray" BorderThickness="0.6" CornerRadius="4" Height="36"> @@ -156,11 +192,11 @@ <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> + <ContentControl x:Name="FlowTestControl" 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> + <Button Width="80" HorizontalAlignment="Right" Margin="20" Click="SaveButton_Click" IsDefault="True">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 index f0e35726e..9879d8f7a 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml.cs @@ -20,13 +20,20 @@ namespace Tango.DispenserAnalyzer.UI.View /// </summary> public partial class SettingsWnd : Window { + private SettingsVM vm; public SettingsWnd() { InitializeComponent(); - DataContext = new SettingsVM(); + vm = new SettingsVM(); + DataContext = vm; Loaded += Window_loaded; } + public Dictionary<AnalyzerSettingsEnum, double> GetChanges() + { + return vm.GetChanges(); + } + private void Window_loaded(object sender, RoutedEventArgs e) { Application curApp = Application.Current; @@ -34,5 +41,14 @@ namespace Tango.DispenserAnalyzer.UI.View this.Left = mainWindow.Left + (mainWindow.Width - this.ActualWidth) / 2; this.Top = mainWindow.Top + (mainWindow.Height - this.ActualHeight) / 2; } + + private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) + { + vm.Dispose(); + } + public void SaveButton_Click(object sender, RoutedEventArgs e) + { + this.DialogResult = true; + } } } 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 ab571ec43..70034b6e7 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs @@ -161,16 +161,22 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels _isRunning = false; this.Points = new List<DataPoint>(); - } #region Settings - + public void OpenSettingWnd() { SettingsWnd settings = new SettingsWnd(); settings.Owner = System.Windows.Application.Current.MainWindow; - settings.ShowDialog(); + if(true == settings.ShowDialog()) + { + Dictionary<AnalyzerSettingsEnum, double> changes = settings.GetChanges(); + foreach (KeyValuePair<AnalyzerSettingsEnum, double> entry in changes) + { + Settings.SetValueByName(entry.Key, entry.Value); + } + } } #endregion @@ -220,6 +226,7 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels ResetSettings(); if(File.Exists(OpenFilePath)) { + FileHelper.OpenFilePath = OpenFilePath; FileName = Path.GetFileName(OpenFilePath); } } @@ -230,9 +237,9 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels { return (OpenFilePath!= null && OpenFilePath.Length != 0 && File.Exists(OpenFilePath)); } - private async void Generate() + public async void Generate() { - if (IsFileLocked(OpenFilePath)) + if (false == File.Exists(OpenFilePath) || IsFileLocked(OpenFilePath) ) return; ResetSettings(); @@ -328,13 +335,9 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels await Task.Delay(200); try { - if (File.Exists(OpenFilePath)) + var resultFile = FileHelper.GetResultFilePath(); + if (resultFile.IsNotNullOrEmpty()) { - var fileName = Path.GetFileNameWithoutExtension(OpenFilePath); - fileName += "_result"; - var ext = Path.GetExtension(OpenFilePath); - var dir = Path.GetDirectoryName(OpenFilePath); - var resultFile = Path.Combine(dir, string.Format("{0}-result{1}", Path.GetFileNameWithoutExtension(OpenFilePath), FILE_EXTENSION)); SaveResultsAsXps(resultFile); } } @@ -359,6 +362,8 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels int index = 0; foreach (var item in all_plots) { + var seriesdata = item.Series[0].ItemsSource; + item.RaiseEvent(new System.Windows.RoutedEventArgs(OxyPlot.Wpf.PlotView.LoadedEvent)); item.InvalidatePlot(true); if (item.IsMeasureValid && item.ActualHeight > 0) diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/SettingsVM.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/SettingsVM.cs index 99b6e948a..d5c54ab08 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/SettingsVM.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/SettingsVM.cs @@ -9,7 +9,7 @@ using Tango.SharedUI; namespace Tango.DispenserAnalyzer.UI.ViewModels { - public class SettingsVM : ViewModel + public class SettingsVM : ViewModel, IDisposable { private ObservableCollection<SettingsModel> _PBUSettings; @@ -27,28 +27,61 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels set { _flowTestSettings = value; RaisePropertyChangedAuto(); } } + private Dictionary<AnalyzerSettingsEnum, double> changedValues; + public SettingsVM() { _PBUSettings = new ObservableCollection<SettingsModel>(); InitPBUTestSettings(); _flowTestSettings = new ObservableCollection<SettingsModel>(); + changedValues = new Dictionary<AnalyzerSettingsEnum, double>(); InitFlowTestSettings(); } private void InitPBUTestSettings() { - _PBUSettings.Add(new SettingsModel("PBU Pass fail", "4.5 sec", 4.5)); + var setting = new SettingsModel(AnalyzerSettingsEnum.PBUPassFail, "4.5 sec"); + setting.SettingValueEvent += new EventHandler(OnSettingValueChanged); + _PBUSettings.Add(setting); } 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)); + _flowTestSettings.Add(new SettingsModel(AnalyzerSettingsEnum.FlowPBUPassFail, "4.5 sec")); + _flowTestSettings.Add(new SettingsModel(AnalyzerSettingsEnum.ExcludeAnalysis, "1800 reads")); + _flowTestSettings.Add(new SettingsModel(AnalyzerSettingsEnum.AvgMinValue, "1400-1850 [mbar]", true)); + _flowTestSettings.Add(new SettingsModel(AnalyzerSettingsEnum.MaxMinRange, "500 reads")); + _flowTestSettings.Add(new SettingsModel(AnalyzerSettingsEnum.MaxMinIntervals, "300 reads")); + _flowTestSettings.Add(new SettingsModel(AnalyzerSettingsEnum.MaxError, "1.5%")); + _flowTestSettings.Add(new SettingsModel(AnalyzerSettingsEnum.TakeOffMaxMin, "3")); + + _flowTestSettings.ToList().ForEach(x => x.SettingValueEvent += new EventHandler(OnSettingValueChanged)); + } + + private void OnSettingValueChanged(object sender, EventArgs e) + { + if(sender is SettingsModel) + { + SettingsModel settingModel = sender as SettingsModel; + if(settingModel.IsRangeVisible) + { + changedValues[AnalyzerSettingsEnum.AvgMinValue] = settingModel.MinRangeValue; + changedValues[AnalyzerSettingsEnum.AvgMaxValue] = settingModel.MaxRangeValue; + } + else + changedValues[settingModel._enumName] = settingModel.PropertyValue; + } + } + + public Dictionary<AnalyzerSettingsEnum, double> GetChanges() + { + return changedValues; + } + + public void Dispose() + { + _PBUSettings.ToList().ForEach(x => x.SettingValueEvent -= OnSettingValueChanged); + _flowTestSettings.ToList().ForEach(x => x.SettingValueEvent -= OnSettingValueChanged); } } } |
