aboutsummaryrefslogtreecommitdiffstats
path: root/Software
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2020-08-03 12:36:24 +0300
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2020-08-03 12:36:24 +0300
commitf2a27972ca652ef568e5eede22d86f9698a08cca (patch)
tree6c55d21cba6bfa8587d95fd27e17a5ec423b3b0d /Software
parentbd1221e36ee3e493dc25bd32559f846519fe60d0 (diff)
parent05fc7b1f37ecc809acf65422a799a4d761b78acb (diff)
downloadTango-f2a27972ca652ef568e5eede22d86f9698a08cca.tar.gz
Tango-f2a27972ca652ef568e5eede22d86f9698a08cca.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software')
-rw-r--r--Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c2
-rw-r--r--Software/Embedded_SW/Embedded/DataDef.h8
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c20
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h3
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/Heater/Heater.c6
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c10
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c8
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/EEPROM/Head_EEPROM.c12
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/I2C_Head_Mux.c2
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.c44
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/IO_Ports/Head_IO.h24
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Head_Card/PT100/Head_PT100_ADC.c14
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/I2C_Task.c2
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/NFC.c14
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/logi-tag/LT_RFID.c45
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/logi-tag/LT_RFID.h8
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/Motors/Motor.c2
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c2
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/Valves/Valve.c2
-rw-r--r--Software/Embedded_SW/Embedded/Main.c12
-rw-r--r--Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c4
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c2
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticActions.c4
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c46
-rw-r--r--Software/Embedded_SW/Embedded/Modules/General/process.c6
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c20
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS.h4
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_Cleaning.c15
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c13
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IFS/ifs.h2
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c7
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c15
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c4
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c11
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Waste/Waste_ex.h1
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c14
-rw-r--r--Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c1
-rw-r--r--Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.c2
-rw-r--r--Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c8
-rw-r--r--Software/Stubs Collection/Procedures/ConnectionType.pproj1
-rw-r--r--Software/Stubs Collection/Procedures/Dancers calibration.pproj2
-rw-r--r--Software/Stubs Collection/Procedures/EmbeddedParametersBuild.pproj2
-rw-r--r--Software/Stubs Collection/Procedures/Selection Input.pproj1
-rw-r--r--Software/Stubs Collection/Procedures/WHS Loop Disable.pproj2
-rw-r--r--Software/Stubs Collection/Procedures/demo.pproj1
-rw-r--r--Software/Stubs Collection/stubs/Get_PowerStep01_Parameters.cs227
-rw-r--r--Software/Stubs Collection/stubs/Set CleaningSequence.cs23
-rw-r--r--Software/Stubs Collection/stubs/WHS_EEPROM.cs (renamed from Software/Stubs Collection/WHS_EEPROM.cs)0
-rw-r--r--Software/Stubs Collection/stubs/embeddedparametersbuild_w_cleaning.cs2
-rw-r--r--Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.cpp1201
-rw-r--r--Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.h64
-rw-r--r--Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorConvert.cpp7
-rw-r--r--Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorConvert.h1
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/ViewModels/MainViewVM.cs47
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Views/RmlsView.xaml4
-rw-r--r--Software/Visual_Studio/Tango.ColorLib.GradientTest.CLI/Program.cs36
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs64
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PressureBuildUpAnalyser.cs2
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.xaml2
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.xaml.cs7
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/FileHelper.cs44
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs9
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/FlowRangeToTimeResults.xlsxbin0 -> 15762 bytes
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/SettingsModel.cs107
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Settings.cs87
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Tango.DispenserAnalyzer.UI.csproj11
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml78
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml.cs18
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs27
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/SettingsVM.cs51
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
new file mode 100644
index 000000000..5f0e4b651
--- /dev/null
+++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/FlowRangeToTimeResults.xlsx
Binary files differ
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);
}
}
}