aboutsummaryrefslogtreecommitdiffstats
path: root/Software
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2020-08-30 10:43:01 +0300
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2020-08-30 10:43:01 +0300
commit4ebd2c0a636596be0e4a2b8eca87e79d17868207 (patch)
tree9c326f7812470f49222b2be4922540f9eb12c73f /Software
parent1c66febdea80e32eb82142dde8528a315b642774 (diff)
parentb91e38b4265ffe413d9b54aabb3e17d8cd150570 (diff)
downloadTango-4ebd2c0a636596be0e4a2b8eca87e79d17868207.tar.gz
Tango-4ebd2c0a636596be0e4a2b8eca87e79d17868207.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software')
-rw-r--r--Software/Embedded_SW/Embedded/Communication/Connection.c46
-rw-r--r--Software/Embedded_SW/Embedded/Communication/Connection.h1
-rw-r--r--Software/Embedded_SW/Embedded/Communication/Container.c6
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.c18
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c5
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_ADS122_PT100/ADS122X04_Driver.c13
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_ADS122_PT100/ADS122X04_Driver.h2
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/SSI_Comm/SSI_Comm.h4
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/flash_ram/MCU_E2Prom.h4
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c9
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c49
-rw-r--r--Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c20
-rw-r--r--Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.h1
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h5
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c60
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c4
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IFS/ifs.h1
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread.h2
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c22
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h7
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c64
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c126
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c2
-rw-r--r--Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c26
-rw-r--r--Software/PMR/Messages/Debugging/DebugDistributorType.proto2
-rw-r--r--Software/PMR/Messages/Debugging/StartDebugLogResponse.proto1
-rw-r--r--Software/Stubs Collection/Procedures/Dancer calibration.txt49
-rw-r--r--Software/Stubs Collection/Procedures/EmbeddedParametersBuild.pproj2
-rw-r--r--Software/Stubs Collection/Procedures/EmbeddedParametersBuild.txt233
-rw-r--r--Software/Stubs Collection/Procedures/EmbeddedParametersBuild_w_file.pproj1
-rw-r--r--Software/Stubs Collection/Procedures/Loading Arm claibration.txt39
-rw-r--r--Software/Stubs Collection/Procedures/Mid tank calibration.pproj478
-rw-r--r--Software/Stubs Collection/Procedures/MidTank Calibration.txt477
-rw-r--r--Software/Stubs Collection/Procedures/Priming.pproj1
-rw-r--r--Software/Stubs Collection/Procedures/Priming1.pproj1015
-rw-r--r--Software/Stubs Collection/Procedures/Priming1.txt1015
-rw-r--r--Software/Stubs Collection/Procedures/WHS loopp control.txt31
-rw-r--r--Software/Stubs Collection/Procedures/WHS_waste_Tank_Calibration_Save_V0.pproj107
-rw-r--r--Software/Stubs Collection/Procedures/WHS_waste_Tank_Calibration_Save_V0.txt107
-rw-r--r--Software/Stubs Collection/Procedures/Waste Tank Calibration.pproj1
-rw-r--r--Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTable.cpp53
-rw-r--r--Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTable.h2
-rw-r--r--Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTransf.cpp8
-rw-r--r--Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/Curves.cpp8
-rw-r--r--Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/GBD.cpp8
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.UI/Properties/AssemblyInfo.cs2
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.UI/app.manifest2
47 files changed, 4011 insertions, 128 deletions
diff --git a/Software/Embedded_SW/Embedded/Communication/Connection.c b/Software/Embedded_SW/Embedded/Communication/Connection.c
index aa0db0ea9..c7077124c 100644
--- a/Software/Embedded_SW/Embedded/Communication/Connection.c
+++ b/Software/Embedded_SW/Embedded/Communication/Connection.c
@@ -139,7 +139,7 @@ void DisconnectionRequest(MessageContainer* requestContainer)
int KeepAliveOneSecondCounter = 0;
#define KEEPALIVE_COMMUNICATION_ABORT_LIMIT 10
bool KeepAliveActive = false;
-bool keepalivetest = false;
+bool keepalivetest = true;
void KeepAliveRequestFunc(MessageContainer* requestContainer)
{
MessageContainer responseContainer;
@@ -158,12 +158,50 @@ void KeepAliveRequestFunc(MessageContainer* requestContainer)
SendChars((char*)container_buffer, container_size);
//keep_alive_request__free_unpacked(request,NULL);
}
+
+int KARequestId = 0x01010101;
+char KARequestToken[36+1];
+void KeepAliveResponseFunc(MessageContainer* requestContainer)
+{
+ //KeepAliveRequest* request =
+ KeepAliveResponse *response = keep_alive_response__unpack(NULL, requestContainer->data.len, requestContainer->data.data);
+ if (strcmp(requestContainer->token,KARequestToken)==0)
+ {
+ if (keepalivetest == false)
+ KeepAliveOneSecondCounter = 0;
+ KeepAliveActive = true;
+ //Report("keepalive response received",__FILE__,__LINE__,KARequestId,RpWarning,msec_millisecondCounter, 0);
+ }
+ keep_alive_response__free_unpacked(response,NULL);
+}
+
+void KeepAliveRequest1Second(void)
+{
+ MessageContainer responseContainer;
+
+ KeepAliveResponse request = KEEP_ALIVE_REQUEST__INIT;
+
+ strcpy(KARequestToken,"Happy days are coming to us, soon");
+ memcpy(&KARequestToken[32],&KARequestId,sizeof(KARequestId));
+ KARequestId++;
+ //Report("keepalive request sent",__FILE__,__LINE__,KARequestId,RpWarning,msec_millisecondCounter, 0);
+
+ if (keepalivetest == false)
+ KeepAliveOneSecondCounter = 0;
+ //KeepAliveActive = true;
+ responseContainer = createContainer(MESSAGE_TYPE__KeepAliveRequest, KARequestToken, true, &request, &keep_alive_request__pack, &keep_alive_request__get_packed_size);
+ //-------------------------------------------------------------------------------------------
+ uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer));
+ size_t container_size = message_container__pack(&responseContainer, container_buffer);
+ SendChars((char*)container_buffer, container_size);
+}
void KeepAliveOneSecondCall(void)
{
- if (KeepAliveActive == false)
- return;
if (FileUploadGetState()==false)
return;
+ KeepAliveRequest1Second();
+ if (KeepAliveActive == false)
+ return;
KeepAliveOneSecondCounter++;
if (KeepAliveOneSecondCounter > (KEEPALIVE_COMMUNICATION_ABORT_LIMIT/2))
@@ -181,7 +219,7 @@ void KeepAliveOneSecondCall(void)
JobStopReporting();
//AlarmHandlingStop();
//CommunicationMailboxFlush();
- keepalivetest = false;
+ //keepalivetest = false;
//USBCDCD_init();
USBCDCD_Reinit();
//UART_ResetBuffers();
diff --git a/Software/Embedded_SW/Embedded/Communication/Connection.h b/Software/Embedded_SW/Embedded/Communication/Connection.h
index 8089cd82f..c0a31344f 100644
--- a/Software/Embedded_SW/Embedded/Communication/Connection.h
+++ b/Software/Embedded_SW/Embedded/Communication/Connection.h
@@ -12,6 +12,7 @@
void ConnectionRequest(MessageContainer* requestContainer);
void DisconnectionRequest(MessageContainer* requestContainer);
void KeepAliveRequestFunc(MessageContainer* requestContainer);
+void KeepAliveResponseFunc(MessageContainer* requestContainer);
void KeepAliveOneSecondCall(void);
extern int KeepAliveOneSecondCounter;
diff --git a/Software/Embedded_SW/Embedded/Communication/Container.c b/Software/Embedded_SW/Embedded/Communication/Container.c
index 64f06a8c5..b14efbd55 100644
--- a/Software/Embedded_SW/Embedded/Communication/Container.c
+++ b/Software/Embedded_SW/Embedded/Communication/Container.c
@@ -42,6 +42,7 @@
#include "Modules/General/process.h"
#include "Modules/Thread/Thread_ex.h"
#include "Modules/Ids/Ids_ex.h"
+#include "Modules/Ifs/Ifs.h"
#include "Common/SWUpdate/FileSystem.h"
#include "Common/SWUpdate/FirmwareUpgrade.h"
@@ -142,7 +143,7 @@ void receive_callback(char* buffer, size_t length)
if (requestContainer == NULL)
return;
#ifndef DISPESER_TEST
- if ((requestContainer->type>= MESSAGE_TYPE__StartDiagnosticsRequest)&&(requestContainer->type != MESSAGE_TYPE__KeepAliveRequest)) //user action resets the idle counter
+ if ((requestContainer->type>= MESSAGE_TYPE__StartDiagnosticsRequest)&&(requestContainer->type != MESSAGE_TYPE__KeepAliveRequest)&&(requestContainer->type != MESSAGE_TYPE__KeepAliveResponse)) //user action resets the idle counter
{
ReportWithPackageFilter(CommFilter,"Message received", __FILE__,__LINE__,requestContainer->type, RpMessage,length, 0);
}
@@ -411,6 +412,9 @@ void receive_callback(char* buffer, size_t length)
case MESSAGE_TYPE__KeepAliveRequest:
KeepAliveRequestFunc(requestContainer);
break;
+ case MESSAGE_TYPE__KeepAliveResponse:
+ KeepAliveResponseFunc(requestContainer);
+ break;
case MESSAGE_TYPE__FileUploadRequest:
FileUploadRequestFunc(requestContainer);
break;
diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.c b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.c
index fda349f69..9c5c52bb9 100644
--- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.c
+++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.c
@@ -335,13 +335,13 @@ void FPGA_GetBusy()
F1MOTNBUSY1 F1_MOT_NBUSY1;
F1MOTNBUSY2 F1_MOT_NBUSY2;
F2MOTNBUSY1 F2_MOT_NBUSY1;
- //F3MOTNBUSY1 F3_MOT_NBUSY1; - for spare motors
+ F3MOTNBUSY1 F3_MOT_NBUSY1; //- for spare motors
F1SPIBUSY1 F1_SPI_BUSY1;
F1SPIBUSY2 F1_SPI_BUSY2;
F2SPIBUSY1 F2_SPI_BUSY1;
F2SPIBUSY2 F2_SPI_BUSY2;
- //F3SPIBUSY1 F3_SPI_BUSY1; - for spare motors
+ F3SPIBUSY1 F3_SPI_BUSY1;// - for spare motors
//Read NBUSY from FPGA
unsigned short readValue = 0;
@@ -351,14 +351,15 @@ void FPGA_GetBusy()
F1_MOT_NBUSY2.ushort = (uint16_t) ~((unsigned int) readValue);
readValue = F2_Moto_Driver_NBUSY1_D;
F2_MOT_NBUSY1.ushort = (uint16_t) ~((unsigned int) readValue);
- //F3_MOT_NBUSY1.ushort = F3_Moto_Driver_NBUSY1_D; - for spare motors
+ readValue = F3_Moto_Driver_NBUSY1_D;
+ F3_MOT_NBUSY1.ushort = (uint16_t) ~((unsigned int) readValue);; // - for spare motors
//Read SPI BUSY from FPGA
F1_SPI_BUSY1.ushort = F1_SPI_Busy1_D;
F1_SPI_BUSY2.ushort = F1_SPI_Busy2_D;
F2_SPI_BUSY1.ushort = F2_SPI_Busy1_D;
F2_SPI_BUSY2.ushort = F2_SPI_Busy2_D;
- //F3_SPI_BUSY1.ushort = F3_SPI_Busy1_D; - for spare motors
+ F3_SPI_BUSY1.ushort = F3_SPI_Busy1_D; // - for spare motors
MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD].Busy = (F1_MOT_NBUSY1.bits.F1_MOTO_DH_CLEANHEAD_A1_NBUSY) | F1_SPI_BUSY1.bits.F1_MOTO_DH_CLEANHEAD_A1_SDI_busy;
MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH].Busy = (F1_MOT_NBUSY1.bits.F1_MOTO_DH_CLEANMECH_A1_NBUSY) | F1_SPI_BUSY1.bits.F1_MOTO_DH_CLEANMECH_A1_SDI_busy;
@@ -381,10 +382,17 @@ void FPGA_GetBusy()
MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_LDRIVING].Busy = (F1_MOT_NBUSY1.bits.F1_MOTO_LDRIVING_A1_NBUSY) | F1_SPI_BUSY1.bits.F1_MOTO_LDRIVING_A1_SDI_busy;
MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_LLOADING].Busy = (F1_MOT_NBUSY1.bits.F1_MOTO_LLOADING_A1_NBUSY) | F1_SPI_BUSY1.bits.F1_MOTO_LLOADING_A1_SDI_busy;
MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_LPIVOT1].Busy = (F1_MOT_NBUSY1.bits.F1_MOTO_LPIVOT1_A1_NBUSY) | F1_SPI_BUSY2.bits.F1_MOTO_LPIVOT1_A1_SDI_busy;
- MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_RDANCER].Busy = (F1_MOT_NBUSY2.bits.F1_MOTO_RDANCER_A1_NBUSY) | F1_SPI_BUSY2.bits.F1_MOTO_RDANCER_A1_SDI_busy;
+ MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_RDANCER].Busy = (F1_MOT_NBUSY2.bits.F1_MOTO_RDANCER_A1_NBUSY) & F1_SPI_BUSY2.bits.F1_MOTO_RDANCER_A1_SDI_busy;
MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_RDRIVING].Busy = (F1_MOT_NBUSY2.bits.F1_MOTO_RDRIVING_A1_NBUSY) | F1_SPI_BUSY1.bits.F1_MOTO_RDRIVING_A1_SDI_busy;
MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_RLOADING].Busy = (F1_MOT_NBUSY2.bits.F1_MOTO_RLOADING_A1_NBUSY) | F1_SPI_BUSY1.bits.F1_MOTO_RLOADING_A1_SDI_busy;
+ MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_SPARE1_1].Busy = (F3_MOT_NBUSY1.bits.F3_MOTO_SPARE1_1_A1_NBUSY) | F3_SPI_BUSY1.bits.F3_MOTO_SPARE1_1_A1_SDI_busy;
+ MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_SPARE1_2].Busy = (F3_MOT_NBUSY1.bits.F3_MOTO_SPARE1_2_A1_NBUSY) | F3_SPI_BUSY1.bits.F3_MOTO_SPARE1_2_A1_SDI_busy;
+ MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_SPARE2_1].Busy = (F3_MOT_NBUSY1.bits.F3_MOTO_SPARE2_1_A1_NBUSY) | F3_SPI_BUSY1.bits.F3_MOTO_SPARE2_1_A1_SDI_busy;
+ MotorDriverResponse[HARDWARE_MOTOR_TYPE__MOTO_SPARE2_2].Busy = (F3_MOT_NBUSY1.bits.F3_MOTO_SPARE2_2_A1_NBUSY) | F3_SPI_BUSY1.bits.F3_MOTO_SPARE2_2_A1_SDI_busy;
+
+
+
TempSensorResponse[TEMP_SENSE_ANALOG_MIXCHIP_TEMP].Busy = F2_SPI_BUSY1.bits.F2_ANALOG_MIXCHIP_TEMP_1_BUSY;
TempSensorResponse[TEMP_SENSE_ANALOG_DYEINGH_TEMP1].Busy = F2_SPI_BUSY1.bits.F2_ANALOG_DYEINGH_TEMP1_1_BUSY;
TempSensorResponse[TEMP_SENSE_ANALOG_DYEINGH_TEMP2].Busy = F2_SPI_BUSY1.bits.F2_ANALOG_DYEINGH_TEMP2_1_BUSY;
diff --git a/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c b/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c
index 68392c72f..e06962ca5 100644
--- a/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c
+++ b/Software/Embedded_SW/Embedded/Drivers/Heater/TemperatureSensor.c
@@ -19,6 +19,7 @@
#include <DataDef.h>
#include "drivers/Heater/TemperatureSensor.h"
#include "Drivers/I2C_Communication/Head_Card/PT100/Head_PT100_ADC.h"
+#include <Drivers/I2C_Communication/WHS_Card/D_ADS122_PT100/ADS122X04_Driver.h>
uint32_t TemperatureSensorReadFromFPGA_Res(TEMPERATURE_SENSOR_ID_ENUM SensorId);
//uint32_t TemperatureSendSensorDummyClk(TEMP_SENSE_ANALOG_DYEINGH_TEMP1);
@@ -449,6 +450,10 @@ uint32_t CalculateTemperatures(TEMPERATURE_SENSOR_ID_ENUM SensorId, uint32_t Dat
{
Resistance_mult_by_100 = HeadADCPT100_Calc_Resistance(SensorId, Data);
}
+ else if(SensorId < MAX_WHS_CARD_TEMP_SENS_ID)
+ {
+ Resistance_mult_by_100 = D_ADS122_Calc_Resistance(SensorId, Data);//WHS
+ }
Current_Measurement_C = RTD (Resistance_mult_by_100);
diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_ADS122_PT100/ADS122X04_Driver.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_ADS122_PT100/ADS122X04_Driver.c
index ade76b239..07f2a52aa 100644
--- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_ADS122_PT100/ADS122X04_Driver.c
+++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_ADS122_PT100/ADS122X04_Driver.c
@@ -9,6 +9,7 @@
#include "include.h"
#include <DataDef.h>
+#include "drivers/Heater/TemperatureSensor.h"
#include <Drivers/I2C_Communication/WHS_Card/D_ADS122_PT100/ADS122X04_Driver.h>
#include <Drivers/I2C_Communication/WHS_Card/WHS_data.h>
#include "drivers/I2C_Communication/I2C.h"
@@ -150,27 +151,29 @@ uint32_t WHS_Test_ADS122X_Internal_Temperature_Sensor(uint8_t i2cbus, uint8_t i2
}
-uint32_t D_ADS122_Calc_Resistance(uint32_t Data_ADS122X)
+uint32_t D_ADS122_Calc_Resistance(TEMPERATURE_SENSOR_ID_ENUM SensorId, uint32_t Data_ADS122X)
{
#define Rref 1650 //ohm
- uint32_t ADS122_Resistance;
+ uint32_t ADS122_Resistance_100;
uint32_t Factor_2Rref_E_H;
uint32_t Factor_2Rref_E_L;
//Resistance = Measurement / (2^23) *4 * Rref / Gain //---------------------- is it *4 ????
- Factor_2Rref_E_H = 400 * Rref; // 200 to calculate Resistance*100
+ Factor_2Rref_E_H = 100 * Rref; // 200 to calculate Resistance*100
//avi: Factor_2Rref_E_L = 8388608 * (2<<(TempSensConfig[SensorId].Reg0.bits.GAIN -1));//2^23*Gain
Factor_2Rref_E_L = 8388608 * (1<<ADS122_Conf.Reg0.bits.GAIN);//2^23*Gain
/* why to use "float" */ //to do
- ADS122_Resistance = (float)Data_ADS122X / (float)Factor_2Rref_E_L * (float)Factor_2Rref_E_H;
+ ADS122_Resistance_100 = (uint32_t)((float)Data_ADS122X / (float)Factor_2Rref_E_L * (float)Factor_2Rref_E_H);
- return ADS122_Resistance;
+ TempSensorResponse[SensorId].Calculated_Resistance = ADS122_Resistance_100;
+
+ return ADS122_Resistance_100;
}
/* unused - using the function WHS_PT100_InitConfigReg()
diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_ADS122_PT100/ADS122X04_Driver.h b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_ADS122_PT100/ADS122X04_Driver.h
index 9491c68af..5e4fcc2b0 100644
--- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_ADS122_PT100/ADS122X04_Driver.h
+++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_ADS122_PT100/ADS122X04_Driver.h
@@ -420,7 +420,7 @@ bool D_ADS122_ReadReg (uint8_t i2cbus, uint8_t i2cadd, uint8_t reg,
bool D_ADS122_WriteReg (uint8_t i2cbus, uint8_t i2cadd, uint8_t reg, uint8_t writeValue);
bool D_ADS122_WriteAllReg (uint8_t i2cbus, uint8_t i2cadd, D_ADS122C04_TempSensConfigStruc *p_writeValue);
uint32_t WHS_Test_ADS122X_Internal_Temperature_Sensor(uint8_t i2cbus, uint8_t i2cadd, uint8_t *p_readValue );
-uint32_t D_ADS122_Calc_Resistance(uint32_t Data_ADS122X);
+uint32_t D_ADS122_Calc_Resistance(TEMPERATURE_SENSOR_ID_ENUM SensorId, uint32_t Data_ADS122X);
bool D_ADS122_InitConfigReg();
#endif /* ADS122X_H_ */
diff --git a/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/SSI_Comm.h b/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/SSI_Comm.h
index f726baeb4..79239835f 100644
--- a/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/SSI_Comm.h
+++ b/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/SSI_Comm.h
@@ -27,8 +27,8 @@
typedef enum Dancers4Winders
{
- HARDWARE_DANCER_0 = 0,
- HARDWARE_DANCER_1 = 1,
+ HARDWARE_DANCER_0 = 0, //winder
+ HARDWARE_DANCER_1 = 1, // puller
HARDWARE_DANCER_2 = 2,
HARDWARE_DANCER_3 = 3,
HARDWARE_DANCER_4 = 4,
diff --git a/Software/Embedded_SW/Embedded/Drivers/flash_ram/MCU_E2Prom.h b/Software/Embedded_SW/Embedded/Drivers/flash_ram/MCU_E2Prom.h
index bbbc49c7d..3691b41bd 100644
--- a/Software/Embedded_SW/Embedded/Drivers/flash_ram/MCU_E2Prom.h
+++ b/Software/Embedded_SW/Embedded/Drivers/flash_ram/MCU_E2Prom.h
@@ -42,6 +42,10 @@ typedef enum {
EEPROM_PULLER_TENSION_POSITION,
EEPROM_WINDER_TENSION_POSITION,
EEPROM_INIT_FAILURE_COUNTER,
+ EEPROM_STORAGE_DANCER_3,
+ EEPROM_STORAGE_DANCER_4,
+ EEPROM_PRESSURE_SENSOR_V0_0,
+ EEPROM_PRESSURE_SENSOR_V0_1,
MAX_EEPROM_STORAGE
}EEPROM_STORAGE_USAGE_ENUM;
#define MAX_SERIAL_NUM_LEN 5 //5*4 bytes
diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c
index 327b5d19b..55148e655 100644
--- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c
+++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c
@@ -496,9 +496,17 @@ uint32_t MillisecLoop(uint32_t tick)
#ifdef test_RTFU_dancer
test_dancer_responce_RTFU();
#else
+#ifdef FOUR_WINDERS
+ Dancer_Data[HARDWARE_DANCER_0] = Read_Dancer_Position(HARDWARE_DANCER_0);
+ Dancer_Data[HARDWARE_DANCER_1] = Read_Dancer_Position(HARDWARE_DANCER_1);
+ Dancer_Data[HARDWARE_DANCER_2] = Read_Dancer_Position(HARDWARE_DANCER_2);
+ Dancer_Data[HARDWARE_DANCER_3] = Read_Dancer_Position(HARDWARE_DANCER_3);
+ Dancer_Data[HARDWARE_DANCER_4] = Read_Dancer_Position(HARDWARE_DANCER_4);
+#else
Dancer_Data[FEEDER_DANCER] = Read_Dancer_Position(FEEDER_DANCER);
Dancer_Data[POOLER_DANCER] = Read_Dancer_Position(POOLER_DANCER);
Dancer_Data[WINDER_DANCER] = Read_Dancer_Position(WINDER_DANCER);
+#endif
#endif
#endif
@@ -732,7 +740,6 @@ uint32_t MillisecLowLoop(uint32_t tick)
//static int Counter = 0;
MachineUpdateResponseFunc();
//KeepAliveOneSecondCall();
-
//TemperatureListString(Lenstr);
//ReportWithPackageFilter(ThreadFilter,Lenstr,__FILE__,__LINE__,(int)Counter++,RpWarning,(int) msec_millisecondCounter,0);
for (Sensor_i = StartPT100;Sensor_i < MAX_HEAD_CARD_TEMP_SENS_ID;Sensor_i++)
diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c
index a76142b00..18793ce28 100644
--- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c
+++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c
@@ -17,12 +17,14 @@
#include "drivers/Motors/Motor.h"
#include "drivers/Heater/TemperatureSensor.h"
#include "drivers/SSI_Comm/Dancer/Dancer.h"
+#include <Drivers/SSI_Comm/SSI_Comm.h>
#include "drivers/FPGA/FPGA_SPI_Comm.h"
#include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h"
#include "drivers/FPGA/FPGA.h"
#include "drivers/I2C_Communication/ADC_MUX/ADC_MUX.h"
#include "drivers/I2C_Communication/Head_Card/ADC/Head_ADC.h"
#include "drivers/I2C_Communication/DAC/Blower.h"
+#include <Drivers/I2C_Communication/I2C_Task.h>
#include "drivers/valves/valve.h"
#include "modules/ids/ids_ex.h"
@@ -264,6 +266,7 @@ double MotorValue[MAX_THREAD_MOTORS_NUM][DIAGNOSTICS_LIMIT+1];
uint8_t SpeedCounterIndex= 0;
double SpeedValue[DIAGNOSTICS_DANCER_LIMIT+1];
double headblowervoltage1 = 0.0, headblowervoltage2 = 0.0;
+double headblower1airflow = 0.0, headblower2airflow = 0.0;
void DiagnosticLoadMotor(int MotorId, int frequency)
{
@@ -407,6 +410,9 @@ void DiagnosticLoadDancerError(int DancerId, double value)
// DancerErrorCounterIndex[DancerId] = 0;
}
+#ifdef FOUR_WINDERS
+ double dancer2,dancer3,dancer4;
+#endif
void CopyTemperaturesToMonitor(void)
{
DiagnosticsMonitor.mixertemperature =
@@ -496,21 +502,34 @@ void CopyTemperaturesToMonitor(void)
HeaterCounterIndex[HEATER_TYPE__HeaterZone4];
DiagnosticsMonitor.n_headzone6temperature =
HeaterCounterIndex[HEATER_TYPE__HeaterZone6];
+
DiagnosticsMonitor.n_headblower1airflow = HeaterCounterIndex[HEATER_TYPE__HeaterZone5];
DiagnosticsMonitor.n_headblower2airflow = HeaterCounterIndex[HEATER_TYPE__HeaterZone7];
- DiagnosticsMonitor.headblower1airflow = HeaterTemperature[HEATER_TYPE__HeaterZone5];
- DiagnosticsMonitor.headblower2airflow = HeaterTemperature[HEATER_TYPE__HeaterZone7];
+ headblower1airflow = PressureSensorGetPressure(HEAD_PT100_ZONE_5_0X84_0);
+ headblower2airflow = PressureSensorGetPressure(HEAD_PT100_ZONE_7_0X86_0);
+ DiagnosticsMonitor.headblower1airflow = &headblower1airflow;
+ DiagnosticsMonitor.headblower2airflow = &headblower2airflow;
+
+ DiagnosticsMonitor.n_headblowervoltage1 = 1;
+ DiagnosticsMonitor.n_headblowervoltage2 = 1;
+ headblowervoltage1 = HeadBlowersGetRPM(HEAD_FAN_RIGHT);
+ headblowervoltage2 = HeadBlowersGetRPM(HEAD_FAN_LEFT);
+ DiagnosticsMonitor.headblowervoltage1 = &headblowervoltage1;
+ DiagnosticsMonitor.headblowervoltage2 = &headblowervoltage2;
}
- DiagnosticsMonitor.n_headblower1airflow = HeaterCounterIndex[HEATER_TYPE__HeaterZone5];
- DiagnosticsMonitor.n_headblower2airflow = HeaterCounterIndex[HEATER_TYPE__HeaterZone7];
- DiagnosticsMonitor.headblower1airflow = HeaterTemperature[HEATER_TYPE__HeaterZone5];
- DiagnosticsMonitor.headblower2airflow = HeaterTemperature[HEATER_TYPE__HeaterZone7];
- headblowervoltage1 =(double )Head_Fan_PWM_Command[HEAD_FAN_RIGHT];
- headblowervoltage2 =(double )Head_Fan_PWM_Command[HEAD_FAN_LEFT];
- DiagnosticsMonitor.headblowervoltage1 = &headblowervoltage1;
- DiagnosticsMonitor.headblowervoltage2 = &headblowervoltage2;
+#ifdef FOUR_WINDERS
+// double dancer2,dancer3,dancer4;
+ dancer2 = Control_Read_Dancer_Position(HARDWARE_DANCER_2,0);
+ dancer3 = Control_Read_Dancer_Position(HARDWARE_DANCER_3,0);
+ dancer4 = Control_Read_Dancer_Position(HARDWARE_DANCER_4,0);
+ DiagnosticsMonitor.n_headblower1airflow = 1;
+ DiagnosticsMonitor.n_headblower2airflow = 1;
+ DiagnosticsMonitor.headblower1airflow = &dancer4;
+ DiagnosticsMonitor.headblower2airflow = &dancer3;
+ DiagnosticsMonitor.headblowervoltage1 = &dancer2;
DiagnosticsMonitor.n_headblowervoltage1 = 1;
- DiagnosticsMonitor.n_headblowervoltage2 = 1;
+#endif
+
DiagnosticsMonitor.dryerzone1temperature =
HeaterTemperature[HEATER_TYPE__DryerAirHeater];
DiagnosticsMonitor.dryerzone2temperature =
@@ -975,11 +994,19 @@ void Diagnostic100msecCollection(void)
{
//if (JobIsActive())
{
+#ifdef FOUR_WINDERS
+ DiagnosticLoadMotor(FEEDER_MOTOR, ThreadGetMotorSpeed (WINDER_2_MOTOR));
+ DiagnosticLoadMotor(DRYER_MOTOR, ThreadGetMotorSpeed (WINDER_3_MOTOR));
+ DiagnosticLoadMotor(POOLER_MOTOR, ThreadGetMotorSpeed (WINDER_4_MOTOR));
+ DiagnosticLoadMotor(WINDER_MOTOR, ThreadGetMotorSpeed (WINDER_MOTOR));
+ DiagnosticLoadMotor(SCREW_MOTOR, ThreadGetMotorSpeed (SCREW_MOTOR));
+#else
DiagnosticLoadMotor(FEEDER_MOTOR, ThreadGetMotorSpeed (FEEDER_MOTOR));
DiagnosticLoadMotor(DRYER_MOTOR, ThreadGetMotorSpeed (DRYER_MOTOR));
DiagnosticLoadMotor(POOLER_MOTOR, ThreadGetMotorSpeed (POOLER_MOTOR));
DiagnosticLoadMotor(WINDER_MOTOR, ThreadGetMotorSpeed (WINDER_MOTOR));
DiagnosticLoadMotor(SCREW_MOTOR, ThreadGetMotorSpeed (SCREW_MOTOR));
+#endif
}
for (i=0;i<MAX_SYSTEM_DISPENSERS;i++)
{
diff --git a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c
index ac2009bcd..011e25317 100644
--- a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c
+++ b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c
@@ -43,6 +43,7 @@
#include "Drivers/I2C_Communication/I2C.h"
#include "drivers/Flash_ram/MCU_E2Prom.h"
#include <Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.h>
+#include "drivers/FPGA/Full_Vme/FPGA_Programming_Up.h"
#include "StateMachines/Printing/PrintingSTM.h"
#include "StateMachines/Initialization/InitSequence.h"
@@ -65,6 +66,7 @@ bool GeneralHwReady = false;
bool PP_Machine = false;
HardwareBlower BlowerCfg;
+HardwareBlower HeadBlowerCfg[2];
char *SW_INFO_DIR = "0://SysInfo";
char HwConfigPath[50] = "0://SysInfo//GenHwCfg.cfg";
@@ -431,6 +433,11 @@ uint32_t HWConfiguration(UploadHardwareConfigurationRequest* UploadRequest)
LOG_ERROR(1,"JobIsActive");
return ERROR;
}
+ if (FPGABurningActive == true)
+ {
+ LOG_ERROR(1,"FPGABurningActive");
+ return ERROR;
+ }
if (watchdogCriticalAlarm == true)
{
LOG_ERROR(1,"Critical Alarm cleared - Watchdog de-activated");
@@ -568,7 +575,18 @@ uint32_t HWConfiguration(UploadHardwareConfigurationRequest* UploadRequest)
{
LargeFansCfg = request->blowers[Dispenser_i]->voltage;
}
-
+ if((request->blowers[Dispenser_i]->enabled)&&(request->blowers[Dispenser_i]->hardwareblowertype == HARDWARE_BLOWER_TYPE__HeadBlower1))
+ {
+ HeadBlowerCfg[0].enabled = true;
+ HeadBlowerCfg[0].voltage = request->blowers[Dispenser_i]->voltage;
+ HeadBlowerCfg[0].heatingvoltage = request->blowers[Dispenser_i]->heatingvoltage;
+ }
+ if((request->blowers[Dispenser_i]->enabled)&&(request->blowers[Dispenser_i]->hardwareblowertype == HARDWARE_BLOWER_TYPE__HeadBlower2))
+ {
+ HeadBlowerCfg[1].enabled = true;
+ HeadBlowerCfg[1].voltage = request->blowers[Dispenser_i]->voltage;
+ HeadBlowerCfg[1].heatingvoltage = request->blowers[Dispenser_i]->heatingvoltage;
+ }
}
}
ControlStart();
diff --git a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.h b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.h
index 55490a140..e99931acc 100644
--- a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.h
+++ b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.h
@@ -20,6 +20,7 @@ uint32_t LoadConfigurationParamsFromFile(bool);
void HWConfigurationLoadFile(void);
extern HardwareBlower BlowerCfg;
+extern HardwareBlower HeadBlowerCfg[2];
extern bool DataUpdated;
diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h
index 0220d1a6c..015c5ea83 100644
--- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h
+++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h
@@ -41,3 +41,8 @@ uint32_t HeatersEnd(void);
void HeatersControlStart(void);
void HeatersControlStop(void);
uint32_t Heaters_Init(void);
+double PressureSensorGetPressure(uint8_t SensorId);
+int HeadBlowersGetRPM(uint8_t fanId);
+double PressureSensorInit();
+void HeadBlowersInit();
+void HeadBlowersCfg();
diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c
index ce3ced6ef..8fe3de207 100644
--- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c
+++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c
@@ -8,6 +8,7 @@
///////////////////////////////////////////////////////////////////////////////////////////
#include "include.h"
#include <DataDef.h>
+#include <math.h>
#include "heaters.h"
#include "Heaters_ex.h"
@@ -38,6 +39,7 @@
#include "drivers/I2C_Communication/ADC_MUX/ADC_MUX.h"
#include "drivers/I2C_Communication/Head_Card/ADC/Head_ADC.h"
#include "Drivers/I2C_Communication/I2C.h"
+#include <Drivers/I2C_Communication/I2C_Task.h>
#include <Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.h>
#include "StateMachines/Printing/PrintingSTM.h"
@@ -91,11 +93,15 @@ uint32_t UnderHeatCounter [HEATER_TYPE_MAX_HEATERS] = {0,0,0,0,0,0,0,0,0,0,0,
uint32_t MainDryerHeaterMaxTempControl = 0xFF;
uint32_t SecondDryerHeaterMaxTempControl = 0xFF;
uint32_t DisasterControlId = 0xFF;
+double PressureSensorV0[2] = {0.0, 0.0};
+
#define DRYER_AIR_PT100 TEMP_SENSE_ANALOG_DRYER_TEMP1
#define DRYER_MAIN_PT100 TEMP_SENSE_ANALOG_DRYER_TEMP2
#define DRYER_SECONDARY_PT100 TEMP_SENSE_ANALOG_DRYER_TEMP3
#define MINIMUM_HEATER_READ 9.0
#define MAXIMUM_HEATER_READ 283
+#define PRESSURE_SENSOR_CP 0.225
+extern uint16_t Head_Fan_Tach[2];
bool UseSecondaryDrierHeater = true;
@@ -237,7 +243,6 @@ uint32_t HeatersDisasterControl(uint32_t x,uint32_t y);
uint32_t PrepareHeater(int HeaterId, uint32_t SetTemperatue);
void HeatersStartControlTimer (void);
-
//**********************************************************************
//******************** CODE *******************************************/
//**********************************************************************
@@ -1843,3 +1848,56 @@ void HeatersControlTask(UArg arg0, UArg arg1)
}
}
}
+
+
+/********************************************************************************
+ * Arc Head Pressure sensors
+ *******************************************************************************/
+
+void HeadBlowersInit()
+{
+ Trigger_Head_Fan_Control(HEAD_FAN_RIGHT, 0);
+ Trigger_Head_Fan_Control(HEAD_FAN_LEFT, 0);
+}
+
+void HeadBlowersCfg()
+{
+ if (HeadBlowerCfg[0].enabled) {
+ Trigger_Head_Fan_Control(HEAD_FAN_RIGHT, HeadBlowerCfg[0].voltage);
+ }
+ if (HeadBlowerCfg[1].enabled) {
+ Trigger_Head_Fan_Control(HEAD_FAN_LEFT, HeadBlowerCfg[1].voltage);
+ }
+}
+
+double PressureSensorInit(int fanId)
+{
+ int sensorId;
+ sensorId = (fanId == HEAD_FAN_RIGHT)?(HEAD_PT100_ZONE_5_0X84_0):(HEAD_PT100_ZONE_7_0X86_0);
+ PressureSensorV0[fanId] = MillisecGetTemperatures(sensorId);
+ PressureSensorV0[fanId] *= 10;
+ return PressureSensorV0[fanId];
+}
+
+int HeadBlowersGetRPM(uint8_t fanId)
+{
+ Trigger_Head_Read_Tacho(fanId);
+
+ if (Head_Fan_Tach[fanId] == 0x1FFE) {
+ return 0;
+ } else {
+ return 7864320/Head_Fan_Tach[fanId];
+ }
+}
+
+double PressureSensorGetPressure(uint8_t SensorId)
+{
+ double V0, Vm, Q, Cp;
+
+ Cp = PRESSURE_SENSOR_CP;
+ V0 = (SensorId == HEAD_PT100_ZONE_5_0X84_0)?(PressureSensorV0[0]):(PressureSensorV0[1]);
+ Vm = MillisecGetTemperatures(SensorId);
+ Vm *= 10;
+ Q = sqrt(Vm - V0 + 22) * Cp;
+ return Q;
+}
diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c
index 9c82cb1bf..c0ccefde1 100644
--- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c
+++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c
@@ -1118,8 +1118,8 @@ uint32_t IDS_Cleaning_Stop_Cleaning_Solution (callback_fptr callback);
if (CurrentDispenserSpeed[CLEANER_DISPENSER]>0)
IDS_Cleaning_Stop_Cleaning_Solution (NULL);
setRapidPressureRead(false);
- if (JobEndSequence == true)
- DistanceToSpoolReady(Module_IDS,ModuleDone);
+ //if (JobEndSequence == true)
+ // DistanceToSpoolReady(Module_IDS,ModuleDone);
}
if (EnableCleaning == true)
{
diff --git a/Software/Embedded_SW/Embedded/Modules/IFS/ifs.h b/Software/Embedded_SW/Embedded/Modules/IFS/ifs.h
index 1edc03264..0f95fb2e2 100644
--- a/Software/Embedded_SW/Embedded/Modules/IFS/ifs.h
+++ b/Software/Embedded_SW/Embedded/Modules/IFS/ifs.h
@@ -27,5 +27,6 @@ void ResponseDemo(int MidtankId);
bool IFS_MidTankFilling(void);
MidTank_t IFS_MidTankIsActive(void);
bool IFS_CartridgeLowerPresent();
+bool CartridgeValidationResponseFunc(MessageContainer* requestContainer);
#endif /* MODULES_IFS_IFS_H_ */
diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h b/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h
index 1f2da8dc0..13032f49d 100644
--- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h
+++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h
@@ -54,7 +54,7 @@ typedef struct
#define MAX_THREAD_FEED_MOTORS (WINDER_MOTOR+1)
-#define MAX_SYSTEM_DANCERS (HARDWARE_DANCER_TYPE__RightDancer+1)
+#define MAX_SYSTEM_DANCERS NUM_OF_ROTENC
extern TimerMotors_t ThreadMotorIdToMotorId[MAX_THREAD_MOTORS_NUM];
diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c
index 1ce27115d..852389001 100644
--- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c
+++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c
@@ -347,10 +347,14 @@ int flipflop = 0;
uint32_t motspeed;
float speedf;
int WinderCalculation = 0;
+int MotorOrder[4] = {HARDWARE_MOTOR_TYPE__MOTO_SCREW,SCREW_2_Motor,SCREW_3_Motor,SCREW_4_Motor};
+
+
uint32_t Screw100msecDirectionChange(uint32_t deviceID, uint32_t BusyFlag)
{
//uint32_t Steps;
double temp,tempScrewSpeed;
+ int i,tempmot;
//double screw_horizontal_speed = 0;
//double RotationsPerSecond;
if (WinderMotorSpeedCounter++>=MAX_WINDER_SPEED_CALCULATION)
@@ -369,6 +373,14 @@ uint32_t Screw100msecDirectionChange(uint32_t deviceID, uint32_t BusyFlag)
ScrewCurrentDirection = 1-ScrewCurrentDirection;
CalculationDirectionChangeCounter++;
+#ifdef FOUR_WINDERS
+ tempmot = MotorOrder[0];
+ MotorOrder[0] = MotorOrder[1];
+ MotorOrder[1] = MotorOrder[2];
+ MotorOrder[2] = MotorOrder[3];
+ MotorOrder[3] = tempmot;
+ //Report("order change" ,__FILE__,MotorOrder[0],MotorOrder[1],RpWarning,MotorOrder[2], 0);
+#endif
if (SampleWinding)
return OK;
//double calcsteps = (ScrewRunningTime/SYS_CLK_FREQ)*ScrewSpeed;
@@ -707,11 +719,13 @@ void ScrewTimerInterrupt(int ARG0)
MotorSetDirection (SCREW_3_Motor, ScrewCurrentDirection);
MotorSetDirection (SCREW_4_Motor, ScrewCurrentDirection);
#endif
- MotorSetSpeedDirect(HARDWARE_MOTOR_TYPE__MOTO_SCREW,ScrewSpeed);
#ifdef FOUR_WINDERS
- MotorSetSpeedDirect (SCREW_2_Motor, ScrewSpeed);
- MotorSetSpeedDirect (SCREW_3_Motor, ScrewSpeed);
- MotorSetSpeedDirect (SCREW_4_Motor, ScrewSpeed);
+ MotorSetSpeedDirect(MotorOrder[0],ScrewSpeed);
+ MotorSetSpeedDirect (MotorOrder[1], ScrewSpeed);
+ MotorSetSpeedDirect (MotorOrder[2], ScrewSpeed);
+ MotorSetSpeedDirect (MotorOrder[3], ScrewSpeed);
+#else
+ MotorSetSpeedDirect(HARDWARE_MOTOR_TYPE__MOTO_SCREW,ScrewSpeed);
#endif
#ifdef READ_SCREW_ENCODER
Read_Screw_Encoder();
diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h
index 4339c5312..c3f181b52 100644
--- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h
+++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h
@@ -9,7 +9,7 @@
#define WINDER_DANCER HARDWARE_DANCER_TYPE__LeftDancer
#define POOLER_DANCER HARDWARE_DANCER_TYPE__MiddleDancer
#define FEEDER_DANCER HARDWARE_DANCER_TYPE__RightDancer
-#define NUM_OF_DANCERS (HARDWARE_DANCER_TYPE__RightDancer+1)
+#define NUM_OF_DANCERS NUM_OF_ROTENC
//} DANCER_ENUM;
typedef enum threadMotorsEnum
{
@@ -17,6 +17,11 @@ typedef enum threadMotorsEnum
DRYER_MOTOR,
POOLER_MOTOR,
WINDER_MOTOR,
+#ifdef FOUR_WINDERS
+ WINDER_2_MOTOR,
+ WINDER_3_MOTOR,
+ WINDER_4_MOTOR,
+#endif
SCREW_MOTOR,
MAX_THREAD_MOTORS_NUM
}threadMotorsEnum;
diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c
index bbb3e4040..1920db03a 100644
--- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c
+++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c
@@ -151,6 +151,39 @@ uint32_t MotorPidRequestMessage(HardwarePidControl* request)
temp = temp*3/2;
}
DancerStopActivityLimit[Motor_i] = temp/(2*PI*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].armlength);
+#ifdef FOUR_WINDERS
+ if (Motor_i == WINDER_MOTOR)
+ {
+ int j,winderMotorId;
+ for (j=0;j<3;j++)
+ {
+ winderMotorId = j+WINDER_2_MOTOR;
+ memcpy (&MotorsControl[winderMotorId],request,sizeof(HardwarePidControl));
+ if (MotorsControl[winderMotorId].pvinputfilterfactormode > MAX_CONTROL_SAMPLES)
+ MotorsControl[winderMotorId].pvinputfilterfactormode = MAX_CONTROL_SAMPLES;
+ #ifdef TEST_LONGER_PID_THREAD
+ MotorsControl[Motor_i].pvinputfilterfactormode = 10; //test longer control
+ #endif
+ for (i = 0;i < (int)MotorsControl[winderMotorId].pvinputfilterfactormode; i++)
+ {
+ MotorSamples[winderMotorId][i] = 0; //reset the samples value for control beginning
+ MotorSpeedSamples[winderMotorId][i] = 0;
+ }
+ NormalizedErrorCoEfficient[winderMotorId] = (2*PI*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].armlength);
+ temp = 1<<(DancersCfg[ThreadMotorIdToDancerId[Motor_i]].resolutionbits);
+ temp=(NORMAL_COEF_DIVIDER*(temp-1)*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].maximalmovementmm);
+ NormalizedErrorCoEfficient[winderMotorId] = NormalizedErrorCoEfficient[winderMotorId] / temp;
+ // uint32_t MotorSamples[MAX_THREAD_MOTORS_NUM][MAX_CONTROL_SAMPLES];
+ temp = 1<<(DancersCfg[ThreadMotorIdToDancerId[Motor_i]].resolutionbits);
+ temp = (temp*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].maximalmovementmm);//*3/2);
+ if (Motor_i == WINDER_MOTOR)
+ {
+ temp = temp*3/2;
+ }
+ DancerStopActivityLimit[winderMotorId] = temp/(2*PI*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].armlength);
+ }
+ }
+#endif
return OK;
}
char DancerConfigPath[50] = "0://SysInfo//DancCfg.cfg";
@@ -159,31 +192,37 @@ uint32_t StoreDancerConfigMessage()
{
uint32_t status = OK;
// FRESULT Fresult = FR_OK;
- HardwareConfiguration DancerConfig;
+ //HardwareConfiguration DancerConfig;
HardwareDancer Dancers[MAX_SYSTEM_DANCERS];
// uint8_t* response_buffer;
// size_t response_size = 0;
int Dancer_i;
- hardware_configuration__init(&DancerConfig);
- DancerConfig.dancers = (HardwareDancer**)my_malloc(sizeof(HardwareDancer*)*MAX_SYSTEM_DANCERS);
+ //hardware_configuration__init(&DancerConfig);
+ //DancerConfig.dancers = (HardwareDancer**)my_malloc(sizeof(HardwareDancer*)*MAX_SYSTEM_DANCERS);
for (Dancer_i = 0; Dancer_i < MAX_SYSTEM_DANCERS; Dancer_i++)
{
hardware_dancer__init(&Dancers[Dancer_i]);
- DancerConfig.dancers[Dancer_i] = &Dancers[Dancer_i];
+ //DancerConfig.dancers[Dancer_i] = &Dancers[Dancer_i];
Dancers[Dancer_i].has_zeropoint = true;
Dancers[Dancer_i].hardwaredancertype = Dancer_i;
Dancers[Dancer_i].has_hardwaredancertype = true;
- DancerConfig.dancers[Dancer_i]->zeropoint=Control_Read_Dancer_Position(Dancer_i,0);
- DancerConfig.n_dancers++;
- DancersCfg[Dancer_i].zeropoint = DancerConfig.dancers[Dancer_i]->zeropoint;
+ Dancers[Dancer_i].zeropoint=Control_Read_Dancer_Position(Dancer_i,0);
+ //DancerConfig.n_dancers++;
+ DancersCfg[Dancer_i].zeropoint = Dancers[Dancer_i].zeropoint;
+ DancersCfg[Dancer_i].zeropoint = Control_Read_Dancer_Position(Dancer_i,0);
}
status |= MCU_E2PromProgram(EEPROM_STORAGE_DANCER_0,DancersCfg[0].zeropoint);
status |= MCU_E2PromProgram(EEPROM_STORAGE_DANCER_1,DancersCfg[1].zeropoint);
status |= MCU_E2PromProgram(EEPROM_STORAGE_DANCER_2,DancersCfg[2].zeropoint);
Report("~~~~~~Store eeprom 0",__FILE__,DancersCfg[0].zeropoint,(int)DancersCfg[1].zeropoint,RpWarning,(int)DancersCfg[2].zeropoint,0);
-/*
+#ifdef FOUR_WINDERS
+ status |= MCU_E2PromProgram(EEPROM_STORAGE_DANCER_3,DancersCfg[HARDWARE_DANCER_3].zeropoint);
+ status |= MCU_E2PromProgram(EEPROM_STORAGE_DANCER_4,DancersCfg[HARDWARE_DANCER_4].zeropoint);
+ Report("~~~~~~Store eeprom 1",__FILE__,__LINE__,(int)DancersCfg[HARDWARE_DANCER_3].zeropoint,RpWarning,(int)DancersCfg[HARDWARE_DANCER_4].zeropoint,0);
+#endif
+ /*
response_buffer = my_malloc(hardware_configuration__get_packed_size(&DancerConfig));
if (response_buffer)
{
@@ -208,11 +247,18 @@ uint32_t LoadDancerConfigMessage()
MCU_E2PromRead(EEPROM_STORAGE_DANCER_0,&DancersCfg[0].zeropoint);
MCU_E2PromRead(EEPROM_STORAGE_DANCER_1,&DancersCfg[1].zeropoint);
MCU_E2PromRead(EEPROM_STORAGE_DANCER_2,&DancersCfg[2].zeropoint);
-
+#ifdef FOUR_WINDERS
+ MCU_E2PromRead(EEPROM_STORAGE_DANCER_3,&DancersCfg[3].zeropoint);
+ MCU_E2PromRead(EEPROM_STORAGE_DANCER_4,&DancersCfg[4].zeropoint);
+#endif
status |= Report("Dancer 0 Store data eeprom ",__FILE__,__LINE__,0,RpWarning,(int)DancersCfg[0].zeropoint,0);
status |= Report("Dancer 1 Store data eeprom ",__FILE__,__LINE__,1,RpWarning,(int)DancersCfg[1].zeropoint,0);
status |= Report("Dancer 2 Store data eeprom ",__FILE__,__LINE__,2,RpWarning,(int)DancersCfg[2].zeropoint,0);
+#ifdef FOUR_WINDERS
+ status |= Report("Dancer 3 Store data eeprom ",__FILE__,__LINE__,3,RpWarning,(int)DancersCfg[3].zeropoint,0);
+ status |= Report("Dancer 4 Store data eeprom ",__FILE__,__LINE__,4,RpWarning,(int)DancersCfg[4].zeropoint,0);
+#endif
return status;
diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c
index 79832120b..7ec0ed5e5 100644
--- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c
+++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c
@@ -46,13 +46,15 @@
double CurrentControlledSpeed[MAX_THREAD_MOTORS_NUM] = {0};
-TimerMotors_t ThreadMotorIdToMotorId[MAX_THREAD_MOTORS_NUM] = {HARDWARE_MOTOR_TYPE__MOTO_RDRIVING,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,HARDWARE_MOTOR_TYPE__MOTO_LDRIVING,HARDWARE_MOTOR_TYPE__MOTO_WINDER,HARDWARE_MOTOR_TYPE__MOTO_SCREW};
#ifdef FOUR_WINDERS
-Dancers_4_Winders ThreadMotorIdToDancerId[MAX_THREAD_MOTORS_NUM] = {FEEDER_DANCER,NUM_OF_DANCERS,POOLER_DANCER,WINDER_DANCER,NUM_OF_DANCERS};
+TimerMotors_t ThreadMotorIdToMotorId[MAX_THREAD_MOTORS_NUM] = {HARDWARE_MOTOR_TYPE__MOTO_RDRIVING,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,HARDWARE_MOTOR_TYPE__MOTO_LDRIVING,HARDWARE_MOTOR_TYPE__MOTO_WINDER,Winder_2_Motor,Winder_3_Motor,Winder_4_Motor,HARDWARE_MOTOR_TYPE__MOTO_SCREW};
+Dancers_4_Winders ThreadMotorIdToDancerId[MAX_THREAD_MOTORS_NUM] = {NUM_OF_DANCERS,NUM_OF_DANCERS,HARDWARE_DANCER_1,HARDWARE_DANCER_0,HARDWARE_DANCER_4,HARDWARE_DANCER_3,HARDWARE_DANCER_2,NUM_OF_DANCERS};
+uint32_t ControlIdtoMotorId [MAX_THREAD_MOTORS_NUM] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
#else
+TimerMotors_t ThreadMotorIdToMotorId[MAX_THREAD_MOTORS_NUM] = {HARDWARE_MOTOR_TYPE__MOTO_RDRIVING,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,HARDWARE_MOTOR_TYPE__MOTO_LDRIVING,HARDWARE_MOTOR_TYPE__MOTO_WINDER,HARDWARE_MOTOR_TYPE__MOTO_SCREW};
HardwareDancerType ThreadMotorIdToDancerId[MAX_THREAD_MOTORS_NUM] = {FEEDER_DANCER,NUM_OF_DANCERS,POOLER_DANCER,WINDER_DANCER,NUM_OF_DANCERS};
-#endif
uint32_t ControlIdtoMotorId [MAX_THREAD_MOTORS_NUM] = {0xFF,0xFF,0xFF,0xFF,0xFF};
+#endif
uint32_t SpeedControlId=0xFF;
uint32_t PoolerSpeedControlId=0xFF;
@@ -432,7 +434,10 @@ uint32_t ThreadControlSpeedReadFunction(uint32_t IfIndex, uint32_t ReadValue)
uint16_t BreakSensorCounter = 0;
uint16_t BreakSensorLatchCounter = 0;
char TMessage[150];
-
+#ifdef FOUR_WINDERS
+char ATMessage[MAX_THREAD_MOTORS_NUM][150];
+int c = 0;
+#endif
uint32_t checkBreakSensor(uint32_t index)
{
if (BreakSensorenabled == true)
@@ -550,7 +555,6 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue)
//#define MAX_CONTROL_SAMPLES 6
//extern uint32_t MotorSamples[MAX_THREAD_MOTORS_NUM][MAX_CONTROL_SAMPLES];
//extern int MotorSamplePointer[MAX_THREAD_MOTORS_NUM];
-
//read value is the dancer angle
int i,index=MAX_THREAD_MOTORS_NUM;
int len;
@@ -621,6 +625,29 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue)
//pooler dancer is right sided: data is opposite
TranslatedReadValue = (-1*TranslatedReadValue);
}
+#ifdef FOUR_WINDERS
+ if (index == WINDER_MOTOR)
+ {
+ c++;
+ }
+ if (index == WINDER_2_MOTOR)
+ {
+ c++;
+ }
+ if (index == WINDER_3_MOTOR)
+ {
+ c++;
+ }
+ if (index == WINDER_4_MOTOR)
+ {
+ c++;
+ }
+ if ((index == WINDER_2_MOTOR)||(index == WINDER_3_MOTOR))
+ {
+ //pooler dancer is right sided: data is opposite
+ TranslatedReadValue = (-1*TranslatedReadValue);
+ }
+#endif
if (index == POOLER_MOTOR)
{
//pooler dancer is right sided: data is opposite
@@ -650,6 +677,10 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue)
ThreadControlActive = false;
//MotorGetStatusFromFPGA(ThreadMotorIdToMotorId[index]);
JobEndReason = JOB_WINDER_DANCER_FAIL+DancerId;
+#ifdef FOUR_WINDERS
+ if (DancerId>HARDWARE_DANCER_2)
+ JobEndReason = JOB_WINDER_DANCER_FAIL+HARDWARE_DANCER_0;
+#endif
SendJobProgress(0.0,0,false, TMessage);
//EndState(CurrentJob,TMessage );
SendSegmentFail();
@@ -702,24 +733,26 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue)
}*`/
}*/
calculated_speed = (1-MotorControlConfig[index].m_calculatedError)*OriginalMotorSpd_2PPS[index];
- if (index != WINDER_MOTOR)
+ if (index < WINDER_MOTOR)
calculated_speed = calculated_speed*InitialDryerSpeed/OriginalMotorSpd_2PPS[DRYER_MOTOR];
//calculated_speed = (1-MotorControlConfig[index].m_calculatedError)*CurrentControlledSpeed[index];
- if (0)//(JobCounter % 1000 == 0)
- //if (JobCounter < 100)//(FirstCalcInJob == true)
+ //if (0)//(JobCounter % 1000 == 0)
+#ifdef FOUR_WINDERS
+ if (JobCounter % 500 < 4)//(FirstCalcInJob == true)
{
- if (index == FEEDER_MOTOR)
+ if (index >= WINDER_MOTOR)
{
// FirstCalcInJob = false;
- len = usnprintf(TMessage, 150, "read %d avg %d error(6) %d integral(9) %d,delta(9) %d, calc(3) %d speed %d %d",
+ len = usnprintf(ATMessage[index], 150, "index %d read %d avg %d error(6) %d integral(9) %d,delta(9) %d, calc(3) %d speed %d %d",index,
TranslatedReadValue,avreageSampleValue,(int)(MotorControlConfig[index].m_mesuredParam*1000000),
(int)(MotorControlConfig[index].m_integral*1000000000),(int)((MotorControlConfig[index].m_mesuredParam*MotorControlConfig[index].m_params.dt)*1000000000),
(int)(MotorControlConfig[index].m_calculatedError*1000),(int)calculated_speed, (int)(InitialDryerSpeed*100/OriginalMotorSpd_2PPS[DRYER_MOTOR]));
- ReportWithPackageFilter(ThreadFilter,TMessage,__FILE__,MotorSamplePointer[index],JobCounter,RpError,ReadValue,0);
+ ReportWithPackageFilter(ThreadFilter,ATMessage[index],__FILE__,MotorSamplePointer[index],JobCounter,RpError,ReadValue,0);
}
+ JobCounter++;
}
-
+#endif
#ifndef TEST_PID_THREAD
if (fabs(calculated_speed-CurrentControlledSpeed[index])> MotorControlConfig[index].m_ingnoreValue)
#else
@@ -735,14 +768,6 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue)
}*/
CurrentControlledSpeed[index] = calculated_speed;
MotorSetSpeed(ThreadMotorIdToMotorId[index], calculated_speed);
-#ifdef FOUR_WINDERS
- if (index == WINDER_MOTOR)
- {
- MotorSetSpeed(Winder_2_Motor, calculated_speed);
- MotorSetSpeed(Winder_3_Motor, calculated_speed);
- MotorSetSpeed(Winder_4_Motor, calculated_speed);
- }
-#endif
}
else
{
@@ -832,11 +857,32 @@ uint32_t HandleJobThreadControlParameters(ThreadParameters* ThreadParams)
MotorControlConfig[POOLER_MOTOR].m_params.Kd = ThreadParams->pullerd;
if(ThreadParams->winderp)
+ {
MotorControlConfig[WINDER_MOTOR].m_params.Kp = ThreadParams->winderp;
+#ifdef FOUR_WINDERS
+ MotorControlConfig[WINDER_2_MOTOR].m_params.Kp = ThreadParams->winderp;
+ MotorControlConfig[WINDER_3_MOTOR].m_params.Kp = ThreadParams->winderp;
+ MotorControlConfig[WINDER_4_MOTOR].m_params.Kp = ThreadParams->winderp;
+#endif
+ }
if(ThreadParams->winderi)
+ {
MotorControlConfig[WINDER_MOTOR].m_params.Ki = ThreadParams->winderi;
+#ifdef FOUR_WINDERS
+ MotorControlConfig[WINDER_2_MOTOR].m_params.Ki = ThreadParams->winderi;
+ MotorControlConfig[WINDER_3_MOTOR].m_params.Ki = ThreadParams->winderi;
+ MotorControlConfig[WINDER_4_MOTOR].m_params.Ki = ThreadParams->winderi;
+#endif
+ }
if(ThreadParams->winderd)
+ {
MotorControlConfig[WINDER_MOTOR].m_params.Kd = ThreadParams->winderd;
+#ifdef FOUR_WINDERS
+ MotorControlConfig[WINDER_2_MOTOR].m_params.Kd = ThreadParams->winderd;
+ MotorControlConfig[WINDER_3_MOTOR].m_params.Kd = ThreadParams->winderd;
+ MotorControlConfig[WINDER_4_MOTOR].m_params.Kd = ThreadParams->winderd;
+#endif
+ }
ReportWithPackageFilter(ThreadFilter,"Rockers activity",__FILE__,__LINE__,(int)Thread_Rockers_Bypass,RpWarning,(int)ThreadParams->bypassrockers,0);
if(ThreadParams->bypassrockers)
Thread_Rockers_Bypass = true;
@@ -1032,13 +1078,14 @@ uint32_t ThreadPrepareState(void *JobDetails)
IntersegmentLength = JobTicket->intersegmentlength;
PrepareWaitCount = 0;
+#ifndef FOUR_WINDERS
status = ThreadPrepare_Tension (HARDWARE_DANCER_TYPE__LeftDancer, windertension);
ReportWithPackageFilter(ThreadFilter,"ThreadPrepare_Tension Winder",__FILE__,HARDWARE_DANCER_TYPE__LeftDancer,PrepareWaitCount,RpWarning,(int)windertension,0);
status = ThreadPrepare_Tension (HARDWARE_DANCER_TYPE__MiddleDancer, pullertension);
ReportWithPackageFilter(ThreadFilter,"ThreadPrepare_Tension Puller",__FILE__,HARDWARE_DANCER_TYPE__MiddleDancer,PrepareWaitCount,RpWarning,(int)pullertension,0);
status = ThreadPrepare_Tension (HARDWARE_DANCER_TYPE__RightDancer, feedertension);
ReportWithPackageFilter(ThreadFilter,"ThreadPrepare_Tension Feeder",__FILE__,HARDWARE_DANCER_TYPE__RightDancer,PrepareWaitCount,RpWarning,(int)feedertension,0);
-
+#endif
FirstCalcInJob = true;
if(MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_RDRIVING].speedmaster == false)
{
@@ -1098,6 +1145,11 @@ uint32_t ThreadPrepareState(void *JobDetails)
{
HW_Motor_Id = ThreadMotorIdToMotorId[Motor_i];
Pid_Id = Motor_i;/*ThreadMotorIdToControlId[Motor_i];*/
+#ifdef FOUR_WINDERS
+ if (Motor_i == WINDER_2_MOTOR) Pid_Id = WINDER_MOTOR;
+ if (Motor_i == WINDER_3_MOTOR) Pid_Id = WINDER_MOTOR;
+ if (Motor_i == WINDER_4_MOTOR) Pid_Id = WINDER_MOTOR;
+#endif
MotorControlConfig[Motor_i].m_params.MAX = 1;
MotorControlConfig[Motor_i].m_params.MIN = MotorsControl[Pid_Id].outputproportionalpowerlimit*-1;
MotorControlConfig[Motor_i].m_params.Kd = MotorsControl[Pid_Id].derivativetime;
@@ -1116,7 +1168,6 @@ uint32_t ThreadPrepareState(void *JobDetails)
MotorControlConfig[Motor_i].m_preError = 0;
MotorControlConfig[Motor_i].m_SetParam = 0;//need to update SetParams on presegment stage
- HandleJobThreadControlParameters(JobTicket->threadparameters); //OVERRIDES CONFIGURATION PARAMETERS!!!
temp_dt = MotorControlConfig[Motor_i].m_params.dt/0.001;
MotorTiming[Motor_i] = (int)temp_dt;
@@ -1210,7 +1261,24 @@ uint32_t ThreadPrepareState(void *JobDetails)
ControlIdtoMotorId[Motor_i] = AddControlCallback(NULL,ThreadControlCBFunction, eOneMillisecond,Control_Read_Dancer_Position,(IfTypeThread*0x100+Motor_i),ThreadMotorIdToDancerId[Motor_i],Motor_i);
#endif
}
+#ifdef FOUR_WINDERS
+ if ((Motor_i == WINDER_2_MOTOR)||(Motor_i == WINDER_3_MOTOR)||(Motor_i == WINDER_4_MOTOR)) // dryer motor is speed controlled. later a speed sensor will be utilized, but for now it will n//ot be controlled
+ {
+ ReportWithPackageFilter(ThreadFilter,"Winder 2/3/4 Control",__FILE__,Motor_i,MotorControlConfig[WINDER_MOTOR].m_params.Kp,RpWarning,MotorControlConfig[WINDER_MOTOR].m_params.Ki,0);
+ if (ControlIdtoMotorId[Motor_i] != 0xFF)
+ {
+ if(RemoveControlCallback(ControlIdtoMotorId[Motor_i],ThreadControlCBFunction)!=OK)
+ ReportWithPackageFilter(ThreadFilter,"Remove Control Failed.",__FILE__,__LINE__,(int)Motor_i,RpError,(int)PoolerSpeedControlId,0);
+ CurrentControlledSpeed[Motor_i] = 0;
+ ControlIdtoMotorId[Motor_i] = 0xFF;
+ }
+#ifndef TEST_PID_THREAD
+ ControlIdtoMotorId[Motor_i] = AddControlCallback(NULL,ThreadControlCBFunction, eOneMillisecond,Control_Read_Dancer_Position,(IfTypeThread*0x100+Motor_i),ThreadMotorIdToDancerId[Motor_i],Motor_i);
+#endif
+#endif
+ }
}
+ HandleJobThreadControlParameters(JobTicket->threadparameters); //OVERRIDES CONFIGURATION PARAMETERS!!!
#ifdef TEST_PID_THREAD
testDancersControl();
@@ -1274,7 +1342,7 @@ uint32_t UpdatePidDuringRun(HardwarePidControl *request)
void SetOriginMotorSpeed(float process_speed)
{
int Motor_i, HW_Motor_Id;
- for (Motor_i = 0; Motor_i <= WINDER_MOTOR; Motor_i++)
+ for (Motor_i = 0; Motor_i < SCREW_MOTOR; Motor_i++)
{
HW_Motor_Id = ThreadMotorIdToMotorId[Motor_i];
//(Speed*uStep*PPR)/((2*PI*motor_Radius)
@@ -1509,7 +1577,7 @@ char Endstr[150];
PoolerSpeedControlId = 0xFF;
}
- for ( Motor_i = 0;Motor_i <= WINDER_MOTOR;Motor_i++)
+ for ( Motor_i = 0;Motor_i < SCREW_MOTOR;Motor_i++)
{
if (ControlIdtoMotorId[Motor_i] != 0xFF)
{
@@ -1522,17 +1590,9 @@ char Endstr[150];
}
Task_sleep(100);
- for ( Motor_i = 0;Motor_i <= WINDER_MOTOR;Motor_i++)
+ for ( Motor_i = 0;Motor_i < SCREW_MOTOR;Motor_i++)
{
MotorStop(ThreadMotorIdToMotorId[Motor_i],Hard_Hiz);
-#ifdef FOUR_WINDERS
- if (Motor_i == WINDER_MOTOR)
- {
- MotorStop(Winder_2_Motor, Hard_Hiz);
- MotorStop(Winder_3_Motor, Hard_Hiz);
- MotorStop(Winder_4_Motor, Hard_Hiz);
- }
-#endif
}
MotorStop(HARDWARE_MOTOR_TYPE__MOTO_RLOADING,Hard_Hiz);
diff --git a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c
index 222b618d2..7c29a909b 100644
--- a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c
+++ b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_maint.c
@@ -76,7 +76,7 @@ void cartCART_EXTRACTED(WasteCartridgeEnum CartId) //{called from polling functi
}
WasteCartridgeEnum cartSELECT_CART(void) //{ if there is no SELECTED cartridge select the first cartridge in IN state. If there is none, return -1}
{
- Report("Cartridges select cart", __FILE__, __LINE__, CartState[WasteCartridge_middle], RpMessage, CartState[WasteCartridge_lower], 0);
+ //Report("Cartridges select cart", __FILE__, __LINE__, CartState[WasteCartridge_middle], RpMessage, CartState[WasteCartridge_lower], 0);
if ((CartState[WasteCartridge_middle] == CartridgeStateSELECTED)||(CartState[WasteCartridge_middle] == CartridgeStateACTIVE))
return WasteCartridge_middle;
if ((CartState[WasteCartridge_lower] == CartridgeStateSELECTED)||(CartState[WasteCartridge_lower] == CartridgeStateACTIVE))
diff --git a/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c b/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c
index f20b1aa94..f6d825c20 100644
--- a/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c
+++ b/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c
@@ -231,6 +231,8 @@ uint32_t InitSequenceMidTankCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag
}
uint32_t InitSequenceBlowerCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag)
{
+ double V0[2] = {0.0, 0.0};
+
if (SafeRemoveControlCallback(HWControlId, InitSequenceBlowerCallBackFunction )==OK)
HWControlId = 0xFF;
else
@@ -247,6 +249,26 @@ uint32_t InitSequenceBlowerCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag)
waste_seq_step1();// include 1Sec delay <- to open !!!!
+ if (Head_Type == HEAD_TYPE_ARC) {
+ if (ResetReason & SYSCTL_CAUSE_POR) {
+ V0[0] = PressureSensorInit(0);
+ V0[1] = PressureSensorInit(1);
+ if ((V0[0] > 0) && (V0[0] < 2)) {
+ MCU_E2PromProgram(EEPROM_ORIFICE1_ZERO_VALUE, V0[0]);
+ MCU_E2PromProgram(EEPROM_ORIFICE1_ZERO_VALUE, V0[1]);
+ ReportWithPackageFilter(InitFilter,"store pressure sensor v0[0]", __FILE__,__LINE__, V0[0], RpMessage, 0, 0);
+ }
+ if ((V0[1] > 0) && (V0[1] < 2)) {
+ MCU_E2PromProgram(EEPROM_ORIFICE1_ZERO_VALUE, V0[1]);
+ ReportWithPackageFilter(InitFilter,"store pressure sensor v0[1]", __FILE__,__LINE__, V0[1], RpMessage, 0, 0);
+ }
+ } else {
+ MCU_E2PromRead(EEPROM_ORIFICE1_ZERO_VALUE, &V0[0]);
+ MCU_E2PromRead(EEPROM_ORIFICE1_ZERO_VALUE, &V0[1]);
+ ReportWithPackageFilter(InitFilter,"load initial values from EEPROM", __FILE__,__LINE__, V0[0], RpMessage, V0[1], 0);
+ }
+ }
+
Safety_Init();
InitStages++;
//InitSequenceStateMachine(InitStages);
@@ -459,6 +481,7 @@ uint32_t InitSequenceInitialBlowerActivation(void)
WHS_MAX11614_Load_OrificeZeroValue(total1,total3);
}
}
+ HeadBlowersInit();
Voc_Sensor_Zero_Calibration();
Turn_the_Blower_On();//Turn on with the Default_Voltage
@@ -535,6 +558,9 @@ uint32_t InitSequenceWaitForCooler(void)
Trigger_SetWHSFanSpeed(FAN4, SmallFansCfg);
Trigger_SetWHSFanSpeed(FAN5, LargeFansCfg);
Trigger_SetWHSFanSpeed(FAN6, LargeFansCfg);
+ if (Head_Type == HEAD_TYPE_ARC) {
+ HeadBlowersCfg();
+ }
if (WHS_Type == WHS_TYPE_UNKNOWN)
{
InitStages++;
diff --git a/Software/PMR/Messages/Debugging/DebugDistributorType.proto b/Software/PMR/Messages/Debugging/DebugDistributorType.proto
index 4cf523dc4..c976afd5a 100644
--- a/Software/PMR/Messages/Debugging/DebugDistributorType.proto
+++ b/Software/PMR/Messages/Debugging/DebugDistributorType.proto
@@ -21,4 +21,6 @@ enum DebugDistributorType
MaintFilter = 13;
IFSFilter = 14;
FilesFilter = 15;
+ I2CFilter = 16;
+ MotorFilter = 17;
} \ No newline at end of file
diff --git a/Software/PMR/Messages/Debugging/StartDebugLogResponse.proto b/Software/PMR/Messages/Debugging/StartDebugLogResponse.proto
index 6648604a1..09e238517 100644
--- a/Software/PMR/Messages/Debugging/StartDebugLogResponse.proto
+++ b/Software/PMR/Messages/Debugging/StartDebugLogResponse.proto
@@ -13,4 +13,5 @@ message StartDebugLogResponse
uint32 Filter = 4;
string Message = 5;
uint32 ModuleId = 6;
+ uint32 Parameter = 7;
} \ No newline at end of file
diff --git a/Software/Stubs Collection/Procedures/Dancer calibration.txt b/Software/Stubs Collection/Procedures/Dancer calibration.txt
new file mode 100644
index 000000000..d6b90c1f0
--- /dev/null
+++ b/Software/Stubs Collection/Procedures/Dancer calibration.txt
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Google.Protobuf;
+using Tango.BL.Enumerations;
+using Tango.PMR.Stubs;
+using Tango.PMR.Diagnostics;
+using Tango.FSE.Common.Diagnostics;
+using Tango.FSE.Procedures;
+
+public class Program
+{
+ public void OnExecute(IProcedureContext context)
+ {
+ StubDancerPositionRequest stubDancerPositionRequest = new StubDancerPositionRequest();
+ string response1 = context.GetInput<string>("ValidationPassword");
+ List<uint> list = new List<uint>();
+ if (response1 == "Aa123456")
+ {
+ context.WriteLine(response1);
+ stubDancerPositionRequest.DancerID = 0;
+ StubDancerPositionResponse response = context.Send<StubDancerPositionResponse>(stubDancerPositionRequest);
+ Thread.Sleep(100);
+ list.Add (response.Position);
+ stubDancerPositionRequest.DancerID = 1;
+ response = context.Send<StubDancerPositionResponse>(stubDancerPositionRequest);
+ Thread.Sleep(100);
+ list.Add (response.Position);
+ stubDancerPositionRequest.DancerID = 2;
+ response = context.Send<StubDancerPositionResponse>(stubDancerPositionRequest);
+ Thread.Sleep(100);
+ list.Add (response.Position);
+
+ context.AddResult(ResultType.Passed, "Array Result", list);
+
+ }
+ else
+ {
+ context.AddResult(ResultType.Failed, "Wrong password", response1);
+
+ }
+
+ }
+} \ No newline at end of file
diff --git a/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.pproj b/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.pproj
index cb927de17..408dfea72 100644
--- a/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.pproj
+++ b/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.pproj
@@ -1 +1 @@
-{"$id":"1","Name":"EmbeddedParametersBuild1","Description":"This procedure lets the FSE to define values for cleaning, tamper alarms, initial heating, WCF value and automatic dispenser filling.","Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.PMR.EmbeddedParameters;\r\nusing Tango.PMR.IO;\r\nusing Tango.FSE.Procedures;\r\n\r\n\r\npublic class Cleaning\r\n{\r\n\t[Description(\"Actuator Going up time\")]\r\n\tpublic int Tup;\r\n\t[Description(\"Actuator Wait up time\")]\r\n\tpublic int Tdelay1;\r\n\t[Description(\"Actuator Wait Down time\")]\r\n\tpublic int Tdelay2;\r\n}\r\npublic class Advanced\r\n{\r\n\t[Description(\"Automatic heating on machine StartUp\")]\r\n\tpublic bool InitialHeating;\r\n\t[Description(\"Waste pressure buildup factor\")]\r\n\tpublic int WFCF;\r\n\t[Description(\"Auto fill mode on/off\")]\r\n\tpublic bool Autofill;\r\n}\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\r\n context.AddResult(ResultType.Passed, \"My Value Name\", \"Test for this value has passed.\");\r\n\t\tConfigurationParameters configurationParameters = new ConfigurationParameters();\r\n\r\n\t\tbool AdvancedParams = context.GetInput<bool>(\"AdvancedParameters\");\r\n\t\tAdvanced Advancedparam = new Advanced();\r\n\t\tAdvancedparam.InitialHeating = true;\r\n\t\tAdvancedparam.WFCF = 40;\r\n\t\tAdvancedparam.Autofill = true;\r\n\t\tif (AdvancedParams == true)\r\n \tAdvancedparam =\tcontext.RequestUserInputFor<Advanced>(Advancedparam,\"Advanced parameters input Required\",\"Please fill in the form\");\r\n\r\n\t\tconfigurationParameters.BreakSensorLimit = 10;\r\n\r\n\t\t//how many samples to collect in diagnostics before sending\r\n\t\tconfigurationParameters.DiagnosticCollectionLimit = 3;\r\n\r\n\t\t//how many consecutive readout before declaring DC over/underheat alarm\r\n\t\tconfigurationParameters.OverHeatCountLimit = 3;\r\n\t\tconfigurationParameters.UnderHeatCountLimit = 3;\r\n\r\n\t\t// time of motor activity before opening the valve or after closing the valve, in milliseconds\r\n\t\tconfigurationParameters.CloseValveTimeout = 20;\r\n\t\tconfigurationParameters.OpenValveTimeout = 20;\r\n\r\n\t\t//backlash after filling - target pressure, timoeout, time staps (speed will be added in general parameters)\r\n\t\tconfigurationParameters.InitialDispenserPressure = 0.25; \r\n\t\tconfigurationParameters.InitialDispenserTimeout = 60000; //20 seconds\r\n\t\tconfigurationParameters.InitialDispenserTimeLag = 100;\r\n\r\n\t\t//job prepare - build pressure in dispensers - target pressure, timoeout, time staps, speed\r\n\t\tconfigurationParameters.DispenserBuildPressureSpeed = 950; //no more than 1000\r\n\t\tconfigurationParameters.DispenserBuildPressureLimit = 0.85; \r\n\t\tconfigurationParameters.DispenserBuildPressureTimeout = 180000;\r\n\t\tconfigurationParameters.DispenserBuildPressureLag = 100;\r\n\r\n\t\t//temperature band 1000 = 100% - thresholds for job start around target temprature - AC\r\n\t\tconfigurationParameters.ACHeatersLowerOperationLimit = 995;\r\n\t\tconfigurationParameters.ACHeatersUpperOperationLimit = 1005;\r\n\r\n\t\t//temperature band 1000 = 100% - thresholds for job start around target temprature - DC\r\n\t\tconfigurationParameters.DCHeatersLowerOperationLimit = 978;\r\n\t\tconfigurationParameters.DCHeatersUpperOperationLimit = 1005;\r\n\r\n\t\t// mid tank reading offset to add to the readout (OBSOLETE!)\r\n\t\tconfigurationParameters.MidTankPressureCorrection = 0.0;\r\n\r\n\t\t//waste factor for intersegment pressure building\r\n\t\tconfigurationParameters.DispenserPresegmentWFCF = Advancedparam.WFCF;\r\n\r\n\t\t//how much time to start the WFCF process (pressure buildup) before segment start\r\n\t\tconfigurationParameters.IDSPreSegmentWFCFTimeBeforeSegment = 12000;\r\n\r\n\t\t//flag: start heaters according to saved process parameters upon init?\r\n\t\tconfigurationParameters.StartHeatingOnInitSequence = Advancedparam.InitialHeating;\r\n\r\n\t\t// current test for the heaters - alarm thresholds\r\n\t\tconfigurationParameters.CurrentAlarmLowLimit = 0.78;\r\n\t\tconfigurationParameters.CurrentAlarmHighLimit = 1.07;\r\n\r\n\t\t//currently not in use\r\n\t\tconfigurationParameters.IDSSegmentRefillTimeout = 5000;\r\n\t\tconfigurationParameters.IDSPreSegmentBuildupTime = 5000;\r\n\t\t//cleaning!!!!!!!!!!\r\n\t\tconfigurationParameters.IDSCleaningSpeed = 800;\r\n\t\tconfigurationParameters.IDSCleaningStopBeforeSegmentTime = 10000; //end of presegemnt\r\n\t\tconfigurationParameters.IDSCleaningStartSprayPreSegmentTime =2000; //beginning of presegment\r\n\r\n\t\tbool SetCleaning = context.GetInput<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;\t\t\r\n\t\tconfigurationParameters.GeneralParameters.Add(SetDiagnosticMode);\r\n\r\n\t\t/*8*/\t\t\r\n\t\tDouble SetAutoFill = new Double();\r\n\t\tSetAutoFill = 3.0;\t\t\r\n\t\tif (Advancedparam.Autofill == false)\r\n\t\t\tSetAutoFill = 0.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(SetAutoFill);\r\n\r\n\t\t//configurationParameters\t= context.RequestUserInputFor<ConfigurationParameters>(configurationParameters,\"ConfigurationParameters Input Required\",\"Please fill in the form\");\r\n\t\t/*Directory.CreateDirectory (\"C:/Temp\");\r\n\t\tFile.WriteAllBytes(\"C:/temp/EmbParam.cfg\",configurationParameters.ToBytes());\r\n\r\n\t\tbyte[] fileBytes1 = File.ReadAllBytes(\"C:/temp/EmbParam.cfg\");*/\r\n\t\tbyte[] fileBytes = configurationParameters.ToBytes();\r\n\r\n\r\n\t\tvar config = ConfigurationParameters.Parser.ParseFrom(fileBytes);\r\n\r\n\t\tcontext.Write( config);\r\n\t\tThread.Sleep(1000);\r\n\r\n\t\r\n\t\tcontext.Write(\"\\n\\n Deleting old file\");\r\n\r\n\t\tDeleteRequest deleteRequest = new DeleteRequest();\r\n\t\tdeleteRequest.Path = \"SYSINFO//EmbParam.cfg\";\r\n\t\tdeleteRequest.Attribute = Tango.PMR.IO.FileAttribute.Unspecified;\r\n\t\tDeleteResponse response5 = context.Send<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\tcontext.Write(\"Chunk size \"+ chunk_size + \" file size \"+ fileBytes.Length +\"\\n\\n\");\r\n\t\tif (chunk_size < fileBytes.Length)\r\n\t\t{\r\n\t\t\tcontext.AddResult(ResultType.Failed, \"Chunk size too small\", chunk_size);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tFileChunkUploadRequest fileChunkUploadRequest = new FileChunkUploadRequest();\r\n\t\t\tfileChunkUploadRequest.UploadID = response2.UploadID;\r\n\t\t\tfileChunkUploadRequest.Buffer = ByteString.CopyFrom(fileBytes);\t\r\n\t\t\tvar response3 = context.Send<FileChunkUploadResponse>(fileChunkUploadRequest);\r\n\t\t\r\n\t\t\t//if (response3.\r\n\r\n\t\t\t// activating the new file\r\n\t\t\tProgressRequest progressRequest = new ProgressRequest();\r\n\t\t\tprogressRequest.Amount = 0xCD;\r\n\t\t\tprogressRequest.Delay = 0xCD;\r\n\t\t\tvar response1 = context.Send<ProgressResponse>(progressRequest);\r\n\t\t\tcontext.AddResult(ResultType.Passed, \"parameters loaded\", chunk_size);\r\n\t\t}\r\n\r\n }\r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[{"$id":"6","Type":"Selection","SelectionInputs":{"$id":"7","$values":[{"$id":"8","Name":"Enable Tamper Check","Value":"1.0"},{"$id":"9","Name":"Disable Tamper Check","Value":"0.0"}]},"DisplayName":"Check Tamper / Fan alarms","Description":"Check Tamper / Fan alarms (1 -true, 0 - false)","Key":"CheckTampers","Value":"1.0"},{"$id":"10","Type":"Default","SelectionInputs":{"$id":"11","$values":[]},"DisplayName":"Set advanced parameters","Description":"Set advanced parameters","Key":"AdvancedParameters","Value":"false"},{"$id":"12","Type":"Default","SelectionInputs":{"$id":"13","$values":[]},"DisplayName":"Set Cleaning Values","Description":"Set to 1 if you want to update the cleaning values","Key":"SetCleaningValues","Value":"false"}]},"Variables":{"$id":"14","$values":[]},"ReferenceAssemblies":{"$id":"15","$values":[{"$id":"16","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"17","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"18","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"19","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"20","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"21","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"22","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"23","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"24","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"25","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"26","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Resources":{"$id":"27","$values":[]},"Dialogs":{"$id":"28","$values":[]},"ID":"2bd29884-5eb9-4d27-be4e-6cfa31dc9f66","ApartmentState":"MTA"} \ No newline at end of file
+{"$id":"1","Name":"EmbeddedParametersBuild","Description":"This procedure lets the FSE to define values for cleaning, tamper alarms, initial heating, WCF value and automatic dispenser filling.","Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.PMR.EmbeddedParameters;\r\nusing Tango.PMR.IO;\r\nusing Tango.FSE.Procedures;\r\n\r\n\r\npublic class Cleaning\r\n{\r\n\t[Description(\"Actuator Going up time\")]\r\n\tpublic int Tup;\r\n\t[Description(\"Actuator Wait up time\")]\r\n\tpublic int Tdelay1;\r\n\t[Description(\"Actuator Wait Down time\")]\r\n\tpublic int Tdelay2;\r\n}\r\npublic class Advanced\r\n{\r\n\t[Description(\"Automatic heating on machine StartUp\")]\r\n\tpublic bool InitialHeating;\r\n\t[Description(\"Waste pressure buildup factor\")]\r\n\tpublic int WFCF;\r\n\t[Description(\"Auto fill mode on/off\")]\r\n\tpublic bool Autofill;\r\n}\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\r\n context.AddResult(ResultType.Passed, \"My Value Name\", \"Test for this value has passed.\");\r\n\t\tConfigurationParameters configurationParameters = new ConfigurationParameters();\r\n\r\n\t\tbool AdvancedParams = context.GetInput<bool>(\"AdvancedParameters\");\r\n\t\tAdvanced Advancedparam = new Advanced();\r\n\t\tAdvancedparam.InitialHeating = true;\r\n\t\tAdvancedparam.WFCF = 40;\r\n\t\tAdvancedparam.Autofill = true;\r\n\t\tif (AdvancedParams == true)\r\n \tAdvancedparam =\tcontext.RequestUserInputFor<Advanced>(Advancedparam,\"Advanced parameters input Required\",\"Please fill in the form\");\r\n\r\n\t\tconfigurationParameters.BreakSensorLimit = 10;\r\n\r\n\t\t//how many samples to collect in diagnostics before sending\r\n\t\tconfigurationParameters.DiagnosticCollectionLimit = 3;\r\n\r\n\t\t//how many consecutive readout before declaring DC over/underheat alarm\r\n\t\tconfigurationParameters.OverHeatCountLimit = 3;\r\n\t\tconfigurationParameters.UnderHeatCountLimit = 3;\r\n\r\n\t\t// time of motor activity before opening the valve or after closing the valve, in milliseconds\r\n\t\tconfigurationParameters.CloseValveTimeout = 20;\r\n\t\tconfigurationParameters.OpenValveTimeout = 20;\r\n\r\n\t\t//backlash after filling - target pressure, timoeout, time staps (speed will be added in general parameters)\r\n\t\tconfigurationParameters.InitialDispenserPressure = 0.25; \r\n\t\tconfigurationParameters.InitialDispenserTimeout = 60000; //20 seconds\r\n\t\tconfigurationParameters.InitialDispenserTimeLag = 100;\r\n\r\n\t\t//job prepare - build pressure in dispensers - target pressure, timoeout, time staps, speed\r\n\t\tconfigurationParameters.DispenserBuildPressureSpeed = 950; //no more than 1000\r\n\t\tconfigurationParameters.DispenserBuildPressureLimit = 0.85; \r\n\t\tconfigurationParameters.DispenserBuildPressureTimeout = 180000;\r\n\t\tconfigurationParameters.DispenserBuildPressureLag = 100;\r\n\r\n\t\t//temperature band 1000 = 100% - thresholds for job start around target temprature - AC\r\n\t\tconfigurationParameters.ACHeatersLowerOperationLimit = 995;\r\n\t\tconfigurationParameters.ACHeatersUpperOperationLimit = 1005;\r\n\r\n\t\t//temperature band 1000 = 100% - thresholds for job start around target temprature - DC\r\n\t\tconfigurationParameters.DCHeatersLowerOperationLimit = 978;\r\n\t\tconfigurationParameters.DCHeatersUpperOperationLimit = 1005;\r\n\r\n\t\t// mid tank reading offset to add to the readout (OBSOLETE!)\r\n\t\tconfigurationParameters.MidTankPressureCorrection = 0.0;\r\n\r\n\t\t//waste factor for intersegment pressure building\r\n\t\tconfigurationParameters.DispenserPresegmentWFCF = Advancedparam.WFCF;\r\n\r\n\t\t//how much time to start the WFCF process (pressure buildup) before segment start\r\n\t\tconfigurationParameters.IDSPreSegmentWFCFTimeBeforeSegment = 12000;\r\n\r\n\t\t//flag: start heaters according to saved process parameters upon init?\r\n\t\tconfigurationParameters.StartHeatingOnInitSequence = Advancedparam.InitialHeating;\r\n\r\n\t\t// current test for the heaters - alarm thresholds\r\n\t\tconfigurationParameters.CurrentAlarmLowLimit = 0.78;\r\n\t\tconfigurationParameters.CurrentAlarmHighLimit = 1.07;\r\n\r\n\t\t//currently not in use\r\n\t\tconfigurationParameters.IDSSegmentRefillTimeout = 5000;\r\n\t\tconfigurationParameters.IDSPreSegmentBuildupTime = 5000;\r\n\t\t//cleaning!!!!!!!!!!\r\n\t\tconfigurationParameters.IDSCleaningSpeed = 800;\r\n\t\tconfigurationParameters.IDSCleaningStopBeforeSegmentTime = 10000; //end of presegemnt\r\n\t\tconfigurationParameters.IDSCleaningStartSprayPreSegmentTime =2000; //beginning of presegment\r\n\r\n\t\tbool SetCleaning = context.GetInput<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;\t\t\r\n\t\tconfigurationParameters.GeneralParameters.Add(SetDiagnosticMode);\r\n\r\n\t\t/*8*/\t\t\r\n\t\tDouble SetAutoFill = new Double();\r\n\t\tSetAutoFill = 3.0;\t\t\r\n\t\tif (Advancedparam.Autofill == false)\r\n\t\t\tSetAutoFill = 0.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(SetAutoFill);\r\n\r\n\t\t//configurationParameters\t= context.RequestUserInputFor<ConfigurationParameters>(configurationParameters,\"ConfigurationParameters Input Required\",\"Please fill in the form\");\r\n\t\t/*Directory.CreateDirectory (\"C:/Temp\");\r\n\t\tFile.WriteAllBytes(\"C:/temp/EmbParam.cfg\",configurationParameters.ToBytes());\r\n\r\n\t\tbyte[] fileBytes1 = File.ReadAllBytes(\"C:/temp/EmbParam.cfg\");*/\r\n\t\tbyte[] fileBytes = configurationParameters.ToBytes();\r\n\r\n\r\n\t\tvar config = ConfigurationParameters.Parser.ParseFrom(fileBytes);\r\n\r\n\t\tcontext.Write( config);\r\n\t\tThread.Sleep(1000);\r\n\r\n\t\r\n\t\tcontext.Write(\"\\n\\n Deleting old file\");\r\n\r\n\t\tDeleteRequest deleteRequest = new DeleteRequest();\r\n\t\tdeleteRequest.Path = \"SYSINFO//EmbParam.cfg\";\r\n\t\tdeleteRequest.Attribute = Tango.PMR.IO.FileAttribute.Unspecified;\r\n\t\tDeleteResponse response5 = context.Send<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\tcontext.Write(\"Chunk size \"+ chunk_size + \" file size \"+ fileBytes.Length +\"\\n\\n\");\r\n\t\tif (chunk_size < fileBytes.Length)\r\n\t\t{\r\n\t\t\tcontext.AddResult(ResultType.Failed, \"Chunk size too small\", chunk_size);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tFileChunkUploadRequest fileChunkUploadRequest = new FileChunkUploadRequest();\r\n\t\t\tfileChunkUploadRequest.UploadID = response2.UploadID;\r\n\t\t\tfileChunkUploadRequest.Buffer = ByteString.CopyFrom(fileBytes);\t\r\n\t\t\tvar response3 = context.Send<FileChunkUploadResponse>(fileChunkUploadRequest);\r\n\t\t\r\n\t\t\t//if (response3.\r\n\r\n\t\t\t// activating the new file\r\n\t\t\tProgressRequest progressRequest = new ProgressRequest();\r\n\t\t\tprogressRequest.Amount = 0xCD;\r\n\t\t\tprogressRequest.Delay = 0xCD;\r\n\t\t\tvar response1 = context.Send<ProgressResponse>(progressRequest);\r\n\t\t\tcontext.AddResult(ResultType.Passed, \"parameters loaded\", chunk_size);\r\n\t\t}\r\n\r\n }\r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[{"$id":"6","Type":"Selection","SelectionInputs":{"$id":"7","$values":[{"$id":"8","Name":"Enable Tamper Check","Value":"1.0"},{"$id":"9","Name":"Disable Tamper Check","Value":"0.0"}]},"DisplayName":"Check Tamper / Fan alarms","Description":"Check Tamper / Fan alarms (1 -true, 0 - false)","Key":"CheckTampers","Value":"1.0"},{"$id":"10","Type":"Default","SelectionInputs":{"$id":"11","$values":[]},"DisplayName":"Set advanced parameters","Description":"Set advanced parameters","Key":"AdvancedParameters","Value":"false"},{"$id":"12","Type":"Default","SelectionInputs":{"$id":"13","$values":[]},"DisplayName":"Set Cleaning Values","Description":"Set to 1 if you want to update the cleaning values","Key":"SetCleaningValues","Value":"false"}]},"Variables":{"$id":"14","$values":[]},"ReferenceAssemblies":{"$id":"15","$values":[{"$id":"16","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"17","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"18","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"19","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"20","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"21","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"22","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"23","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"24","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"25","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"26","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Resources":{"$id":"27","$values":[]},"Dialogs":{"$id":"28","$values":[]},"ID":"2bd29884-5eb9-4d27-be4e-6cfa31dc9f66","ApartmentState":"MTA"} \ No newline at end of file
diff --git a/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.txt b/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.txt
new file mode 100644
index 000000000..403f8710f
--- /dev/null
+++ b/Software/Stubs Collection/Procedures/EmbeddedParametersBuild.txt
@@ -0,0 +1,233 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.IO;
+using Google.Protobuf;
+using Tango.BL.Enumerations;
+using Tango.PMR.Stubs;
+using Tango.PMR.Diagnostics;
+using Tango.FSE.Common.Diagnostics;
+using Tango.PMR.EmbeddedParameters;
+using Tango.PMR.IO;
+using Tango.FSE.Procedures;
+
+
+public class Cleaning
+{
+ [Description("Actuator Going up time")]
+ public int Tup;
+ [Description("Actuator Wait up time")]
+ public int Tdelay1;
+ [Description("Actuator Wait Down time")]
+ public int Tdelay2;
+}
+public class Advanced
+{
+ [Description("Automatic heating on machine StartUp")]
+ public bool InitialHeating;
+ [Description("Waste pressure buildup factor")]
+ public int WFCF;
+ [Description("Auto fill mode on/off")]
+ public bool Autofill;
+}
+
+public class Program
+{
+ public void OnExecute(IProcedureContext context)
+ {
+
+ context.AddResult(ResultType.Passed, "My Value Name", "Test for this value has passed.");
+ ConfigurationParameters configurationParameters = new ConfigurationParameters();
+
+ bool AdvancedParams = context.GetInput<bool>("AdvancedParameters");
+ Advanced Advancedparam = new Advanced();
+ Advancedparam.InitialHeating = true;
+ Advancedparam.WFCF = 40;
+ Advancedparam.Autofill = true;
+ if (AdvancedParams == true)
+ Advancedparam = context.RequestUserInputFor<Advanced>(Advancedparam,"Advanced parameters input Required","Please fill in the form");
+
+ configurationParameters.BreakSensorLimit = 10;
+
+ //how many samples to collect in diagnostics before sending
+ configurationParameters.DiagnosticCollectionLimit = 3;
+
+ //how many consecutive readout before declaring DC over/underheat alarm
+ configurationParameters.OverHeatCountLimit = 3;
+ configurationParameters.UnderHeatCountLimit = 3;
+
+ // time of motor activity before opening the valve or after closing the valve, in milliseconds
+ configurationParameters.CloseValveTimeout = 20;
+ configurationParameters.OpenValveTimeout = 20;
+
+ //backlash after filling - target pressure, timoeout, time staps (speed will be added in general parameters)
+ configurationParameters.InitialDispenserPressure = 0.25;
+ configurationParameters.InitialDispenserTimeout = 60000; //20 seconds
+ configurationParameters.InitialDispenserTimeLag = 100;
+
+ //job prepare - build pressure in dispensers - target pressure, timoeout, time staps, speed
+ configurationParameters.DispenserBuildPressureSpeed = 950; //no more than 1000
+ configurationParameters.DispenserBuildPressureLimit = 0.85;
+ configurationParameters.DispenserBuildPressureTimeout = 180000;
+ configurationParameters.DispenserBuildPressureLag = 100;
+
+ //temperature band 1000 = 100% - thresholds for job start around target temprature - AC
+ configurationParameters.ACHeatersLowerOperationLimit = 995;
+ configurationParameters.ACHeatersUpperOperationLimit = 1005;
+
+ //temperature band 1000 = 100% - thresholds for job start around target temprature - DC
+ configurationParameters.DCHeatersLowerOperationLimit = 978;
+ configurationParameters.DCHeatersUpperOperationLimit = 1005;
+
+ // mid tank reading offset to add to the readout (OBSOLETE!)
+ configurationParameters.MidTankPressureCorrection = 0.0;
+
+ //waste factor for intersegment pressure building
+ configurationParameters.DispenserPresegmentWFCF = Advancedparam.WFCF;
+
+ //how much time to start the WFCF process (pressure buildup) before segment start
+ configurationParameters.IDSPreSegmentWFCFTimeBeforeSegment = 12000;
+
+ //flag: start heaters according to saved process parameters upon init?
+ configurationParameters.StartHeatingOnInitSequence = Advancedparam.InitialHeating;
+
+ // current test for the heaters - alarm thresholds
+ configurationParameters.CurrentAlarmLowLimit = 0.78;
+ configurationParameters.CurrentAlarmHighLimit = 1.07;
+
+ //currently not in use
+ configurationParameters.IDSSegmentRefillTimeout = 5000;
+ configurationParameters.IDSPreSegmentBuildupTime = 5000;
+ //cleaning!!!!!!!!!!
+ configurationParameters.IDSCleaningSpeed = 800;
+ configurationParameters.IDSCleaningStopBeforeSegmentTime = 10000; //end of presegemnt
+ configurationParameters.IDSCleaningStartSprayPreSegmentTime =2000; //beginning of presegment
+
+ bool SetCleaning = context.GetInput<bool>("SetCleaningValues");
+ Cleaning Clean = new Cleaning();
+ Clean.Tup = 10;
+ Clean.Tdelay1 = 98;
+ Clean.Tdelay2 = 198;//300 milli up, stay 1 sec, stay down 2 sec
+ if (SetCleaning == true)
+ Clean = context.RequestUserInputFor<Cleaning>(Clean,"Cleaning Input Required","Please fill in the form");
+
+ // Tup = LeftRockerSpeed/100;
+ // Tdelay1 = LeftRockerSpeed%100;
+ // Tdelay2 = RightRockerSpeed;
+ int LeftRockerSpeed = Clean.Tup*100+Clean.Tdelay1;
+ int RightRockerSpeed = Clean.Tdelay2;
+
+ configurationParameters.IDSLeftCleaningMotorSpeed = LeftRockerSpeed;
+ configurationParameters.IDSRightCleaningMotorSpeed = RightRockerSpeed;
+
+ configurationParameters.SwitchToIdleTimeinSeconds = 3600;
+ configurationParameters.IdleDrierTemperature = 80;
+ configurationParameters.IdleHeadTemperature = 80;
+ configurationParameters.IdleMixerTemperature = 0;
+ configurationParameters.PowerOffTemperatureLimit = 60;
+
+ //general parameters, ORDER MUST BE PRESERVED!!!!
+ //check the dispensers hard limit alarms
+ /*1*/
+ Double checkHardLimitAlarms = new Double();
+ checkHardLimitAlarms = 1.0;
+ configurationParameters.GeneralParameters.Add(checkHardLimitAlarms);
+
+ /*2*/
+ Double checkCurrentAlarms = new Double();
+ checkCurrentAlarms = 0.0;
+ configurationParameters.GeneralParameters.Add(checkCurrentAlarms);
+ //check the tamper alarms
+
+ /*3*/
+ Double checkTamperAlarms = new Double();
+ checkTamperAlarms = context.GetInput<double>("CheckTampers");
+ configurationParameters.GeneralParameters.Add(checkTamperAlarms);
+
+ /*4*/
+ Double checkMotorAlarms = new Double();
+ checkMotorAlarms = 1.0;
+ configurationParameters.GeneralParameters.Add(checkMotorAlarms);
+
+ /*5*/
+ Double WinderBackToBaseTime = new Double();
+ WinderBackToBaseTime = 820.0;
+ configurationParameters.GeneralParameters.Add(WinderBackToBaseTime);
+ /*6*/
+ Double DispenserInitialPressureSpeed = new Double();
+ DispenserInitialPressureSpeed = 1050.0;
+ configurationParameters.GeneralParameters.Add(DispenserInitialPressureSpeed);
+
+ /*7*/
+ Double SetDiagnosticMode = new Double();
+ SetDiagnosticMode = 3.0;
+ configurationParameters.GeneralParameters.Add(SetDiagnosticMode);
+
+ /*8*/
+ Double SetAutoFill = new Double();
+ SetAutoFill = 3.0;
+ if (Advancedparam.Autofill == false)
+ SetAutoFill = 0.0;
+ configurationParameters.GeneralParameters.Add(SetAutoFill);
+
+ //configurationParameters = context.RequestUserInputFor<ConfigurationParameters>(configurationParameters,"ConfigurationParameters Input Required","Please fill in the form");
+ /*Directory.CreateDirectory ("C:/Temp");
+ File.WriteAllBytes("C:/temp/EmbParam.cfg",configurationParameters.ToBytes());
+
+ byte[] fileBytes1 = File.ReadAllBytes("C:/temp/EmbParam.cfg");*/
+ byte[] fileBytes = configurationParameters.ToBytes();
+
+
+ var config = ConfigurationParameters.Parser.ParseFrom(fileBytes);
+
+ context.Write( config);
+ Thread.Sleep(1000);
+
+
+ context.Write("\n\n Deleting old file");
+
+ DeleteRequest deleteRequest = new DeleteRequest();
+ deleteRequest.Path = "SYSINFO//EmbParam.cfg";
+ deleteRequest.Attribute = Tango.PMR.IO.FileAttribute.Unspecified;
+ DeleteResponse response5 = context.Send<DeleteResponse>(deleteRequest);
+
+
+ Thread.Sleep(1000);
+ context.Write("\n\n Loading new file file");
+
+ FileUploadRequest fileUploadRequest = new FileUploadRequest();
+ fileUploadRequest.Path = "SYSINFO//EmbParam.cfg";
+ fileUploadRequest.Length = (int)fileBytes.Length;
+ FileUploadResponse response2 = context.Send<FileUploadResponse>(fileUploadRequest);
+ Thread.Sleep(1000);
+ long chunk_size = response2.MaxChunkLength;
+
+ context.Write("Chunk size "+ chunk_size + " file size "+ fileBytes.Length +"\n\n");
+ if (chunk_size < fileBytes.Length)
+ {
+ context.AddResult(ResultType.Failed, "Chunk size too small", chunk_size);
+ }
+ else
+ {
+ FileChunkUploadRequest fileChunkUploadRequest = new FileChunkUploadRequest();
+ fileChunkUploadRequest.UploadID = response2.UploadID;
+ fileChunkUploadRequest.Buffer = ByteString.CopyFrom(fileBytes);
+ var response3 = context.Send<FileChunkUploadResponse>(fileChunkUploadRequest);
+
+ //if (response3.
+
+ // activating the new file
+ ProgressRequest progressRequest = new ProgressRequest();
+ progressRequest.Amount = 0xCD;
+ progressRequest.Delay = 0xCD;
+ var response1 = context.Send<ProgressResponse>(progressRequest);
+ context.AddResult(ResultType.Passed, "parameters loaded", chunk_size);
+ }
+
+ }
+} \ No newline at end of file
diff --git a/Software/Stubs Collection/Procedures/EmbeddedParametersBuild_w_file.pproj b/Software/Stubs Collection/Procedures/EmbeddedParametersBuild_w_file.pproj
deleted file mode 100644
index 643a26ce3..000000000
--- a/Software/Stubs Collection/Procedures/EmbeddedParametersBuild_w_file.pproj
+++ /dev/null
@@ -1 +0,0 @@
-{"$id":"1","Name":"EmbeddedParametersBuild","Description":"This procedure lets the FSE to define values for cleaning, tamper alarms, initial heating, WCF value and automatic dispenser filling.","Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.PMR.EmbeddedParameters;\r\nusing Tango.PMR.IO;\r\nusing Tango.FSE.Procedures;\r\n\r\n\r\npublic class Cleaning\r\n{\r\n\t[Description(\"Actuator Going up time\")]\r\n\tpublic int Tup;\r\n\t[Description(\"Actuator Wait up time\")]\r\n\tpublic int Tdelay1;\r\n\t[Description(\"Actuator Wait Down time\")]\r\n\tpublic int Tdelay2;\r\n}\r\npublic class Advanced\r\n{\r\n\t[Description(\"Automatic heating on machine StartUp\")]\r\n\tpublic bool InitialHeating;\r\n\t[Description(\"Waste pressure buildup factor\")]\r\n\tpublic int WFCF;\r\n\t[Description(\"Auto fill mode on/off\")]\r\n\tpublic bool Autofill;\r\n}\r\n\r\npublic class Program\r\n{\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\r\n context.AddResult(ResultType.Passed, \"My Value Name\", \"Test for this value has passed.\");\r\n\t\tConfigurationParameters configurationParameters = new ConfigurationParameters();\r\n\r\n\t\tbool AdvancedParams = context.GetInput<bool>(\"AdvancedParameters\");\r\n\t\tAdvanced Advancedparam = new Advanced();\r\n\t\tAdvancedparam.InitialHeating = true;\r\n\t\tAdvancedparam.WFCF = 40;\r\n\t\tAdvancedparam.Autofill = true;\r\n\t\tif (AdvancedParams == true)\r\n \tAdvancedparam =\tcontext.RequestUserInputFor<Advanced>(Advancedparam,\"Advanced parameters input Required\",\"Please fill in the form\");\r\n\r\n\t\tconfigurationParameters.BreakSensorLimit = 10;\r\n\r\n\t\t//how many samples to collect in diagnostics before sending\r\n\t\tconfigurationParameters.DiagnosticCollectionLimit = 3;\r\n\r\n\t\t//how many consecutive readout before declaring DC over/underheat alarm\r\n\t\tconfigurationParameters.OverHeatCountLimit = 3;\r\n\t\tconfigurationParameters.UnderHeatCountLimit = 3;\r\n\r\n\t\t// time of motor activity before opening the valve or after closing the valve, in milliseconds\r\n\t\tconfigurationParameters.CloseValveTimeout = 20;\r\n\t\tconfigurationParameters.OpenValveTimeout = 20;\r\n\r\n\t\t//backlash after filling - target pressure, timoeout, time staps (speed will be added in general parameters)\r\n\t\tconfigurationParameters.InitialDispenserPressure = 0.25; \r\n\t\tconfigurationParameters.InitialDispenserTimeout = 60000; //20 seconds\r\n\t\tconfigurationParameters.InitialDispenserTimeLag = 100;\r\n\r\n\t\t//job prepare - build pressure in dispensers - target pressure, timoeout, time staps, speed\r\n\t\tconfigurationParameters.DispenserBuildPressureSpeed = 950; //no more than 1000\r\n\t\tconfigurationParameters.DispenserBuildPressureLimit = 0.85; \r\n\t\tconfigurationParameters.DispenserBuildPressureTimeout = 180000;\r\n\t\tconfigurationParameters.DispenserBuildPressureLag = 100;\r\n\r\n\t\t//temperature band 1000 = 100% - thresholds for job start around target temprature - AC\r\n\t\tconfigurationParameters.ACHeatersLowerOperationLimit = 995;\r\n\t\tconfigurationParameters.ACHeatersUpperOperationLimit = 1005;\r\n\r\n\t\t//temperature band 1000 = 100% - thresholds for job start around target temprature - DC\r\n\t\tconfigurationParameters.DCHeatersLowerOperationLimit = 978;\r\n\t\tconfigurationParameters.DCHeatersUpperOperationLimit = 1005;\r\n\r\n\t\t// mid tank reading offset to add to the readout (OBSOLETE!)\r\n\t\tconfigurationParameters.MidTankPressureCorrection = 0.0;\r\n\r\n\t\t//waste factor for intersegment pressure building\r\n\t\tconfigurationParameters.DispenserPresegmentWFCF = Advancedparam.WFCF;\r\n\r\n\t\t//how much time to start the WFCF process (pressure buildup) before segment start\r\n\t\tconfigurationParameters.IDSPreSegmentWFCFTimeBeforeSegment = 12000;\r\n\r\n\t\t//flag: start heaters according to saved process parameters upon init?\r\n\t\tconfigurationParameters.StartHeatingOnInitSequence = Advancedparam.InitialHeating;\r\n\r\n\t\t// current test for the heaters - alarm thresholds\r\n\t\tconfigurationParameters.CurrentAlarmLowLimit = 0.78;\r\n\t\tconfigurationParameters.CurrentAlarmHighLimit = 1.07;\r\n\r\n\t\t//currently not in use\r\n\t\tconfigurationParameters.IDSSegmentRefillTimeout = 5000;\r\n\t\tconfigurationParameters.IDSPreSegmentBuildupTime = 5000;\r\n\t\t//cleaning!!!!!!!!!!\r\n\t\tconfigurationParameters.IDSCleaningSpeed = 800;\r\n\t\tconfigurationParameters.IDSCleaningStopBeforeSegmentTime = 10000; //end of presegemnt\r\n\t\tconfigurationParameters.IDSCleaningStartSprayPreSegmentTime =2000; //beginning of presegment\r\n\r\n\t\tbool SetCleaning = context.GetInput<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;\t\t\r\n\t\tconfigurationParameters.GeneralParameters.Add(SetDiagnosticMode);\r\n\r\n\t\t/*8*/\t\t\r\n\t\tDouble SetAutoFill = new Double();\r\n\t\tSetAutoFill = 3.0;\t\t\r\n\t\tif (Advancedparam.Autofill == false)\r\n\t\t\tSetAutoFill = 0.0;\r\n\t\tconfigurationParameters.GeneralParameters.Add(SetAutoFill);\r\n\r\n\t\t//configurationParameters\t= context.RequestUserInputFor<ConfigurationParameters>(configurationParameters,\"ConfigurationParameters Input Required\",\"Please fill in the form\");\r\n\t\tDirectory.CreateDirectory (\"C:/Temp\");\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":"Selection","SelectionInputs":{"$id":"7","$values":[{"$id":"8","Name":"Enable Tamper Check","Value":"1.0"},{"$id":"9","Name":"Disable Tamper Check","Value":"0.0"}]},"DisplayName":"Check Tamper / Fan alarms","Description":"Check Tamper / Fan alarms (1 -true, 0 - false)","Key":"CheckTampers","Value":"1.0"},{"$id":"10","Type":"Default","SelectionInputs":{"$id":"11","$values":[]},"DisplayName":"Set advanced parameters","Description":"Set advanced parameters","Key":"AdvancedParameters","Value":"false"},{"$id":"12","Type":"Default","SelectionInputs":{"$id":"13","$values":[]},"DisplayName":"Set Cleaning Values","Description":"Set to 1 if you want to update the cleaning values","Key":"SetCleaningValues","Value":"false"}]},"Variables":{"$id":"14","$values":[]},"ReferenceAssemblies":{"$id":"15","$values":[{"$id":"16","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"17","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"18","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"19","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"20","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"21","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"22","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"23","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"24","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"25","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"26","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Resources":{"$id":"27","$values":[]},"Dialogs":{"$id":"28","$values":[]},"ID":"2bd29884-5eb9-4d27-be4e-6cfa31dc9f66","ApartmentState":"MTA"} \ No newline at end of file
diff --git a/Software/Stubs Collection/Procedures/Loading Arm claibration.txt b/Software/Stubs Collection/Procedures/Loading Arm claibration.txt
new file mode 100644
index 000000000..946cfc546
--- /dev/null
+++ b/Software/Stubs Collection/Procedures/Loading Arm claibration.txt
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Drawing;
+using Google.Protobuf;
+using Tango.BL.Entities;
+using Tango.BL.Enumerations;
+using Tango.PMR.Stubs;
+using Tango.PMR.Diagnostics;
+using Tango.FSE.Common.Connection;
+using Tango.FSE.Common.Diagnostics;
+using Tango.FSE.Procedures;
+
+public class Program
+{
+ public void OnExecute(IProcedureContext context)
+ {
+
+
+ ProgressRequest progressRequest = new ProgressRequest();
+ progressRequest.Amount = 0xB1;
+ //progressRequest.Delay = 1;
+
+ var response = context.Send<ProgressResponse>(progressRequest);
+
+ progressRequest.Amount = 0xB2;
+ progressRequest.Delay = 0;
+
+ response = context.Send<ProgressResponse>(progressRequest);
+
+ context.AddResult(ResultType.Passed, "Loading Arm Calibrated", "OK");
+
+ }
+} \ No newline at end of file
diff --git a/Software/Stubs Collection/Procedures/Mid tank calibration.pproj b/Software/Stubs Collection/Procedures/Mid tank calibration.pproj
index 0bb05e75b..655bbd099 100644
--- a/Software/Stubs Collection/Procedures/Mid tank calibration.pproj
+++ b/Software/Stubs Collection/Procedures/Mid tank calibration.pproj
@@ -1 +1,477 @@
-{"$id":"1","Inputs":{"$id":"2","$values":[{"$id":"3","Type":"Default","SelectionInputs":{"$id":"4","$values":[]},"DisplayName":"Check Tamper / Fan alarms","Description":"Check Tamper / Fan alarms","Key":"CheckTampers","Value":"1.0"},{"$id":"5","Type":"Default","SelectionInputs":{"$id":"6","$values":[]},"DisplayName":"Initial Heating on startup","Description":"Initial Heating on startup","Key":"InitialHeating","Value":"true"},{"$id":"7","Type":"Default","SelectionInputs":{"$id":"8","$values":[]},"DisplayName":"WCF Value","Description":"WCF Value","Key":"WCF_Value","Value":"40"},{"$id":"9","Type":"Default","SelectionInputs":{"$id":"10","$values":[]},"DisplayName":"AutoFill Mode","Description":"Controls the AutoFill Mode","Key":"AutoFillMode","Value":"3.0"}]},"Variables":{"$id":"11","$values":[]},"Resources":{"$id":"12","$values":[]},"Dialogs":{"$id":"13","$values":[]},"ID":"2bd29884-5eb9-4d27-be4e-6cfa31dc9f66","Name":"Mid tank calibration","Description":"This procedure lets the FSE to define values for cleaning, tamper alarms, initial heating, WCF value and automatic dispenser filling.","ApartmentState":"MTA","ReferenceAssemblies":{"$id":"14","$values":[{"$id":"15","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"16","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"17","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"18","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"19","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"20","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"21","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"22","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"23","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"24","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"25","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Scripts":{"$id":"26","$values":[{"$id":"27","Name":"Program.csx","IsEntryPoint":true,"Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.IO;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Entities;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.PMR.EmbeddedParameters;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\n\r\npublic class Program\r\n{\r\n\r\nprivate IProcedureContext context;\r\n\r\n\t//----------------------\r\n\tconst double \tSlop=0.92;\r\n\tconst double\tMIN_SLOP=0.7;\r\n\tconst double\tMAX_SLOP=1.4;\r\n\tconst double\tERROR_SLOP=-1;\r\n\tconst double\tMIN_50cc_on_volt=2.3;\r\n\tconst double\tMAX_50cc_on_volt=3.2;\r\n\tconst double\tERROR_50cc_on_volt=-1;\r\n\tdouble CartSizeLiter = 1.0;\r\n\t\r\n\tint [] Convert_Midtank_No = new Int32 [8] {1,3,5,7,2,4,6,8};\r\n\tuint [,] ADC_Add_Chnl = new uint [8,2]\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x44,0x20},\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x44,0x08},\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x46,0x80},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x46,0x20},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x44,0x10},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x44,0x04},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x46,0x40},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{0x46,0x10},\r\n\t\t\t\t\t\t\t\t\t\t\t};\r\n\t\r\n\t\r\n\tconst Int32\tF3_VALVE_OUT\t=\t0x600008E2\t;\r\n\tstring Machine_SN\t;\r\n\tprivate const string FILE_PATH = @\"C:\\MidTankLog\\\";\r\n\tstring File_name;\r\n\tdouble [,] voltage_array = new double[9,9];\r\n\tstring [] Parameter = new string[5] {\"\\t\",\"Empty [V]\",\"100cc [V]\",\"800cc [V]\",\" b [L/V] \"};\r\n\t\tdouble Full_Cartridge=1;\t// 1 litter less 100 cc\r\n\t\r\n\t//----------------------\r\n\tconst Int32 I2C_ID = 2;\r\n\t//const Int32 I2C_Slave_Add = 0x46; //must be 0x40, 0x44 or 0x46\r\n\t//----------------------\r\n\t\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n\tthis.context = context;\r\n\t\r\n\tInt32 midtankno = 0;\r\n\tdouble Full_Point=0;\t\t\t//on Voltage\r\n\tdouble resualt;\r\n\tdouble Sum=0 ;\r\n\tdouble Old_Sum=0 ;\r\n\t\r\n\r\n\tif (!Directory.Exists(FILE_PATH))\r\n\t\t{\r\n\t\t\tDirectory.CreateDirectory(FILE_PATH);\r\n\t\t}\t\t\t\r\n\r\n\r\n \t//Machine_SN = context.GetInput<string>(\"Midtank_SN\");\r\n var response = context.RequestUserInputFor<String>(\"Mid Tank Serial Number\", \"Enter Midtank S/N:\");\r\n\tcontext.Write(\"\\n\");\r\n\tMachine_SN = response;\r\n\tcontext.WriteLine(Machine_SN);\r\n\tFile_name= FILE_PATH +Machine_SN + DateTime.Now.ToString(\"MM_dd_yyyy_HH_mm_ss\")+\".csv\";\r\n\tcontext.Write(File_name);\r\n \tcontext.WriteToFile(File_name,\"MidTank S/N:,\" + Machine_SN); \r\n\t\r\n\t\r\n\r\n\t//midtankno = context.GetInput<int>(\"MidTankId\");\r\n\tvar response1 = context.RequestUserInputFor<String>(\"Mid Tank Number\", \"Enter Midtank number to calibrate (1-8):\");\r\n\tcontext.WriteLine(response1);\r\n\tmidtankno = Int32.Parse(response1);\r\n \tcontext.AppendToFile(File_name,\"MidTank Number:\\t\" + response1);\r\n\r\n\r\n\tvar response2 = context.RequestUserInputFor<int>(\"Cartridge size\", \"Enter enter cartridge size in ml (1000/700/500):\");\r\n\tcontext.WriteLine(response2);\r\n\tint Cart_size = response2;\r\n \tcontext.AppendToFile(File_name,\"Cartrideg size:\\t\" + response2);\r\n\r\n\r\n string box_msg = \"Please Insert cartridge with\" +Cart_size+\"cc (Lubbricant add 500cc only) \";\r\n// string box_title = \"Midatnk empty\";\r\n// context.ShowInfo(box_msg, box_title);\r\n\tcontext.ShowInfo(box_msg);\r\n\r\n\t//int CartInserted = 0;\r\n\t//while (CartInserted == 0)\r\n\t//\tCartInserted = context.GetInput<int>(\"insertCartridge\");\r\n\t\r\n\tCartSizeLiter = Cart_size/1000;\r\n\t\r\n\topen_valve(midtankno,1,1)\t\t;\t//open Air valve\r\n\topen_valve(midtankno,0,1)\t\t;\t//open Ink valve\r\n\tInt32 i=0; \r\n\twhile (i<60*15)\t\t\t\t\t//check for 15 minitus \r\n\t{\r\n\t\tSum=0;\r\n\t\tfor (Int32 j=0;j<30;j++)\r\n\t\t{\r\n\t\t\tresualt=read_pressure_sensor(midtankno);\r\n\t\t\tcontext.AppendToFile(File_name,resualt+\",mV\");\r\n\t\t\tSum=Sum+resualt;\r\n\t\t\tThread.Sleep(1000);\r\n\t\t}\r\n\t\ti=i+1;\r\n\t\tif (Sum>Old_Sum)\r\n\t\t\tOld_Sum=Sum-Old_Sum;\r\n\t\telse\r\n\t\t\tOld_Sum=Old_Sum-Sum;\r\n\t\t\t\r\n\t\tif ( Old_Sum <0.02)\t\r\n\t\t\ti=60*15;\t\t//end \r\n\t\tOld_Sum=Sum;\r\n\t}\r\n\tFull_Point=Sum/30;\r\n\t\r\n\tbox_msg = \"Send file\" + File_name +\"to Mati\"; \r\n\tcontext.ShowInfo(box_msg);\r\n\t\r\n\t\r\n\t//\tcontext.Send<StubFpgaWriteRegResponse>(\"StubFpgaWriteRegRequest\" ,F3_VALVE_OUT, 0x000f);\t\t// open all valve air of midtank and close all ink of midtank\r\n\t//\tThread.Sleep(500);\r\n\t//\tcontext.Send<StubFpgaWriteRegResponse>(\"StubFpgaWriteRegRequest\" ,F3_VALVE_OUT, 0x00ff);\t\t// open all valve air of midtank and close all ink of midtank\r\n\t//\tThread.Sleep(500);\r\n\t//\tcontext.Send<StubFpgaWriteRegResponse>(\"StubFpgaWriteRegRequest\" ,F3_VALVE_OUT, 0x0fff);\t\t// open all valve air of midtank and close all ink of midtank\r\n\t//\tThread.Sleep(500);\r\n\t//\tcontext.Send<StubFpgaWriteRegResponse>(\"stubFpgaWriteRegRequest\" ,F3_VALVE_OUT, 0xffff);\t\t// open all valve air and ink of midtank\r\n\t//\r\n\t//\tThread.Sleep(2500);\r\n\r\n\t//\tThread.Sleep(1000);\t\r\n\t\t\r\n\t//\tread_pressure_sensor(1);\r\n \t\t\r\n\t//\tbox_msg =\"Insert 100cc of appropriate ink/lube to each midtank\\n\\t1.black ink\\n\\t2. Magenta ink\\n\\t3. Transparent ink\\n\\t4. Cleaner\\n\\t5. Cyan ink\\n\\t6. Yellow ink\\n\\t7. Spot color\\n\\t8. Lubricant/n\";\r\n // context.ShowInfo(box_msg);\r\n//\r\n\t//\tread_pressure_sensor(2);\r\n\r\n\t\t\t\t\t//\tvoltage_array[3,2]=2.5;\r\n\t\t\r\n//\t\tbox_msg = \"Add another 700cc for ink and TI \\nFor Lubbricant add 500cc only.\"; \r\n//\t\tcontext.ShowInfo(box_msg);\r\n//\t\tread_pressure_sensor(3);\r\n//\t\t\t\tcontext.Send<StubFpgaWriteRegResponse>(\"stubFpgaWriteRegRequest\" ,F3_VALVE_OUT, 0x0000);\t\t// close all valve air and ink of midtank\r\n\t\t\t\t\t\t\t\t\t//\t\t\tvoltage_array[3,3]=4.5;\r\n\tclose_valve(midtankno,1,1)\t\t;\t//close Air valve\r\n\tclose_valve(midtankno,0,1)\t\t;\t//close Ink valve\r\n\r\n//\t\tcalc_slop();\r\n//\t\tprint_table();\r\n\t\t\r\n//\t\tinsert_slop_t_eeprom(Full_Point, midtankno);\r\n\t\tinsert_slop_t_eeprom(Full_Point, midtankno);\r\n\t\tbox_msg =\"Turn Power Off and On to finish the calibration.\";\r\n context.ShowInfo(box_msg);\r\n\t\r\n\t}\r\n\r\nint calc_slop()\r\n\t{\r\n\tcontext.Write(\"\\n \");\r\n\t\t\r\n\tdouble delta;\r\n\tfor (uint i=1;i<9;i++)\r\n\t\t{\r\n\t\t\tdelta=voltage_array[i,3]-voltage_array[i,2];\r\n\t\t\r\n\t\t\tcontext.Write(\"\\nMidtank No:\"+i +\"=\"+delta);\r\n//\t\t\tif (i==8)\r\n\t\t\t\tdelta=CartSizeLiter/delta;\t\t\t\t\t\t\t\t\t\t\t\t//0.5 litter on lubricant\t\t\t\r\n//\t\t\telse \r\n//\t\t\t\tdelta=CartSizeLiter/delta;\t\t\t\t\t\t\t\t\t\t\t\t//0.7 litter\r\n\t\t\t\t\r\n\t\t\tif ((delta<MIN_SLOP) || (delta >MAX_SLOP)) \r\n\t\t\t{\r\n\t\t\t\tvoltage_array[i,4]=ERROR_SLOP;\r\n\t\t//\t\tcontext.Write(\"123\");\r\n\t\t\t}\r\n\t\telse if\t((voltage_array[i,2]<MIN_50cc_on_volt) || (voltage_array[i,2]>MAX_50cc_on_volt ))\r\n\t\t\t\t\tvoltage_array[i,4]=ERROR_SLOP;\r\n\t\telse\r\n\t\tvoltage_array[i,4]=delta;\r\n\t\t}\r\n\treturn 1;\r\n\t}\r\n\r\n\r\n\tint\tinsert_slop_t_eeprom( double FullPoint,Int32 midtankno)\r\n{\r\n//\tcontext.Write(\"\\n \");\r\n\r\n\tMidTankDataSetupRequest midTankDataSetupRequest = new MidTankDataSetupRequest();\r\n\r\n\r\n//\tfor (uint i=1;i<9;i++)\r\n//\t{\r\n//\t\tif (voltage_array[i,4]!= ERROR_SLOP)\r\n//\t\t{\r\n\t\tMidTankData midTankData = new MidTankData();\r\n\t\tmidTankData.MidTankId = Convert.ToUInt32 (midtankno-1);\r\n\t\tmidTankData.InitialOffsetA =FullPoint - (Full_Cartridge-0.1)/Slop;\r\n\t\tmidTankData.SlopeB = Slop;\r\n\t\t\r\n\t\tcontext.Write(\"\\nMidtank No:\" + midtankno + \"=\\tVoltage Zero is =\"+(FullPoint - (Full_Cartridge-0.1)/Slop)+\"\\tSlop=\"+ Slop);\r\n\t\tcontext.AppendToFile(File_name,\"\\nMidtank No:\" + midtankno + \"=\\tVoltage Zero is =\"+(FullPoint - (Full_Cartridge-0.1)/Slop)+\"\\tSlop=\"+ Slop);\r\n\r\n\t\t\r\n\t\tmidTankDataSetupRequest.MidTankInfo.Add(midTankData);\r\n\t\r\n\t//\t}\r\nvar response = context.Send<MidTankDataSetupResponse>(midTankDataSetupRequest);\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t//}\r\n\r\n\r\nreturn\t1;\r\n}\r\n\r\n//\r\n//\r\n//int\t\tprint_table()\r\n//\t\t{\r\n//\r\n//\t\tfor (uint i=0;i<5;i++)\r\n//\t\t\t{\r\n//\t\t\t\tcontext.AppendToFile(File_name,Parameter[i]+\"\\t\"+voltage_array[1,i]+\"\\t\"+voltage_array[2,i]+\"\\t\"+voltage_array[3,i]+\"\\t\"+voltage_array[4,i]+\"\\t\"+voltage_array[5,i]+\"\\t\"+voltage_array[6,i]+\"\\t\"+voltage_array[7,i]+\"\\t\"+voltage_array[8,i]) ;\r\n// } \r\n// \r\n//\t\r\n//\t\t\treturn 1;\r\n//\r\n//\t\t}\r\n\r\n//start mat\r\n\r\nint adc_configuration(uint I2C_Slave_Add,uint channel ) \r\n\t{\r\n\tStubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();\r\n\tstubI2CWriteBytesRequest.I2CId = I2C_ID;\r\n\tstubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add;\r\n\t\r\n\tUInt32 uInt32 = new UInt32();\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(0x00);//Byte 0 to write\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(channel);//Byte 1 to Write, must be 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02 or 0x01 for different channels\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(0x80);//Byte 2 to Write\r\n\t\r\n\tvar response = context.Send<StubI2CWriteBytesResponse>(stubI2CWriteBytesRequest);\r\n\t\r\n\treturn 1;\r\n\t}\r\n\r\n\r\nint adc_set_for_read_ch(uint I2C_Slave_Add) \r\n\t{\r\n\tStubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();\r\n\tstubI2CWriteBytesRequest.I2CId = I2C_ID;\r\n\tstubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add;\r\n\t\r\n\tUInt32 uInt32 = new UInt32();\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(0x01);//Byte 0 to write\r\n\r\n\tvar response = context.Send<StubI2CWriteBytesResponse>(stubI2CWriteBytesRequest);\r\n\t\r\n\treturn 1;\r\n\t}\r\n\r\n\r\n\r\n\r\ndouble adc_read_ch(uint I2C_Slave_Add) \r\n\t{\r\n\tStubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest();\r\n\tstubI2CReadBytesRequest.I2CId = I2C_ID;\r\n\tstubI2CReadBytesRequest.SlaveAddress = I2C_Slave_Add;\r\n\tstubI2CReadBytesRequest.NumberOfBytesToRead = 2; // Number of bytes to read\r\n\r\n\tvar response1 = context.Send<StubI2CReadBytesResponse>(stubI2CReadBytesRequest);\r\n\tuint temph=0;\r\n\tuint templ=0;\r\n\tuint temp;\r\n\tdouble calc;\r\n\tdouble calc1;\r\n\tdouble calc2;\r\n\t\t\ttemph=response1.ReadBytes[0];\r\n\t\t\ttempl=response1.ReadBytes[1];\r\n\t\t\ttemp = (temph << 8) | templ;\r\n\t\t\ttemp=temp & 0x0fff;\r\n\t\t\t\t\r\n\t\t\tcalc = (double)temp *2.5 / 4096.0;\r\n//\t\t\tcontext.Write(\"ADC [volts]:\\t\");\r\n//\t\t\tcontext.Write(calc+\"\\t\");\r\n\t\t\r\n\t\t\tcalc1 = (1.96- calc) * 4.64 + 1.96;\r\n\t\t\tcontext.Write(\"Vsensor [volts]:\\t\");\r\n\t\t\tcontext.Write(calc1 + \"\\n\");\r\n\r\n\t//\t\tvoltage_array[table_index_x,table_index_y]=calc1;\r\n\t\r\n\treturn calc1;\r\n\t}\r\n\r\ndouble\t\tread_pressure_sensor(Int32 i )\r\n\t{\r\ndouble resualt =0 ;\r\n\t\t switch (i)\r\n {\r\n case 1:\r\n\t\t\tadc_configuration(0x44,0x20);\t\t//a2d_address 0x44 channel channel 2\r\n\t\t\tadc_set_for_read_ch(0x44);\r\n\t\t\tresualt=adc_read_ch(0x44);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 2:\r\n\t\t\tadc_configuration(0x44,0x08);\t\t//a2d_address 0x44 channel channel 4\r\n\t\t\tadc_set_for_read_ch(0x44);\r\n\t\t\tresualt=adc_read_ch(0x44);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 3:\r\n\t\t\tadc_configuration(0x46,0x80);\t\t//a2d_address 0x46 channel channel 0\r\n\t\t\tadc_set_for_read_ch(0x46);\r\n\t\t\tresualt=adc_read_ch(0x46);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 4:\r\n\t\t\tadc_configuration(0x46,0x20);\t\t//a2d_address 0x46 channel channel 2\r\n\t\t\tadc_set_for_read_ch(0x46);\r\n\t\t\tresualt=adc_read_ch(0x46);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 5:\r\n\t\t\tadc_configuration(0x44,0x10);\t\t//a2d_address 0x44 channel channel 3\r\n\t\t\tadc_set_for_read_ch(0x44);\r\n\t\t\tresualt=adc_read_ch(0x44);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 6:\r\n\t\t\tadc_configuration(0x44,0x04);\t\t//a2d_address 0x44 channel channel 5\r\n\t\t\tadc_set_for_read_ch(0x44);\r\n\t\t\tresualt=adc_read_ch(0x44);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 7:\r\n\t\t\tadc_configuration(0x46,0x40);\t\t//a2d_address 0x46 channel channel 1\r\n\t\t\tadc_set_for_read_ch(0x46);\r\n\t\t\tresualt=adc_read_ch(0x46);\r\n\t\tbreak;\r\n\t\t\r\n\t\tcase 8:\r\n\t\t\tadc_configuration(0x46,0x10);\t\t//a2d_address 0x46 channel channel 3\r\n\t\t\tadc_set_for_read_ch(0x46);\r\n\t\t\tresualt=adc_read_ch(0x46);\r\n\t\tbreak;\r\n\t\t\r\n default:\r\n context.Write(\"Error\");\r\n\r\n break;\r\n\t }\t\r\n\t\t\r\n\t\treturn resualt;\r\n\t}\t\r\n\r\n\r\n//--------------------------------\r\nint open_valve (int valve_nm,int valve_type,int check_valve)\t\t//valve_type=0 is Air ,1 is Ink ; check_valve=1 send feedbak\r\n{\r\n\tint temp1=Convert_Midtank_No[valve_nm-1]\t;\r\n\r\n\tstring temp;\r\n\tSetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 1);\t\r\n\t\r\n\t\tif (check_valve!=0)\r\n\t\t{\r\n\t\t\ttemp=\"Air\";\r\n\t\t\tif (valve_type==1)\r\n\t\t\ttemp=\"Ink\";\r\n\t\t\t\t\r\n\t\t\tif(!context.ShowWarningQuestion(\"Did \" + temp + \"Valve of Midtank \" + valve_nm +\" open?\"))\r\n\t\t\t\t{\r\n//\t\t\t\t\tUnits_status[(valve_nm-1)*3+valve_type,1]=\"Fail\";\r\n\t\t\t\t\tcontext.Write(temp +\"Valve\\tFail\\n\");\t\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\telse \r\n\t\t\t\t{\r\n//\t\t\t\t\tUnits_status[(valve_nm-1)*3+valve_type,1]=\"Pass\";\r\n\t\t\t\t\tcontext.Write(temp +\"Valve\\tOpen\\n\");\t\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t}\r\n\t\t\t\r\n\t\t}\r\n\t\treturn 1;\r\n\r\n}\r\n//--------------------------------\t\r\nint close_valve (int valve_nm,int valve_type,int check_valve)\r\n{\r\n\tint temp1=Convert_Midtank_No[valve_nm-1];\t\r\n\r\n\tstring temp;\r\n\tSetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 0);\r\n\tif (check_valve!=0)\r\n\t\t{\r\n\t\t\ttemp=\"Air\";\r\n\t\t\tif (valve_type==1)\r\n\t\t\ttemp=\"Ink\";\r\n\t\t\t\t\r\n\t\t\tif(!context.ShowWarningQuestion(\"Did \" + temp +\" Valve of Midtank \" + valve_nm +\" close?\"))\r\n\t\t\t\t{\r\n//\t\t\t\t\tUnits_status[(valve_nm-1)*3+valve_type,1]=\"Fail\";\r\n\t\t\t\t\tcontext.Write(temp +\"Valve\\tFail\\n\");\t\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\telse \r\n\t\t\t\t{\r\n//\t\t\t\t\tUnits_status[(valve_nm-1)*3+valve_type,1]=\"Pass\";\r\n\t\t\t\t\tcontext.Write(temp +\"Valve\\tclose\\n\");\t\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t}\t\t\t\r\n\t\t}\r\n\treturn 1;\r\n\r\n}\r\n\r\npublic Int32 SetBit(Int32 Adr, Int32 BitNo, Int32 Bit)\r\n{\r\n\tInt32 BitMask;\r\n\tvar RetVal = Fpga_Read_Reg(Adr);\r\n\tInt32 RV = (Int32) RetVal.Value;\r\n\t\r\n\tif (Bit == 0x1) \r\n\t{\r\n\t\tBitMask = 0x1 << BitNo;\r\n\t\tRV = RV | BitMask;\r\n\t\tFpga_Write_Reg( Adr, RV );\r\n\t}\r\n\telse if (Bit == 0x0)\r\n\t{\r\n\t\tBitMask = ~(0x1 << BitNo);\r\n\t\tRV = RV & BitMask;\r\n\t\tFpga_Write_Reg(Adr, RV );\t\r\n\t}\r\n\treturn 1;\r\n}\r\n\r\nint Fpga_Write_Reg(Int32 Addr, Int32 Data)\r\n{\r\n\tvar response = context.Send<StubFpgaWriteRegResponse>(\"StubFpgaWriteRegRequest\" ,Addr, Data);\r\n\t\r\n\treturn 1;\r\n}\r\n\r\n\r\n\r\nStubFpgaReadRegResponse Fpga_Read_Reg(Int32 Addr)\r\n{\r\n var response = context.Send<StubFpgaReadRegResponse>(\"StubFpgaReadRegRequest\" ,Addr);\r\n\tresponse.Value = response.Value & 0xffff;\r\n\t\r\n\treturn response;\r\n}\r\n}"},{"$id":"28","Name":"Service.csx","IsEntryPoint":false,"Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}"}]}} \ No newline at end of file
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Drawing;
+using Google.Protobuf;
+using Tango.BL.Entities;
+using Tango.BL.Enumerations;
+using Tango.PMR.Stubs;
+using Tango.PMR.Diagnostics;
+using Tango.FSE.Common.Connection;
+using Tango.FSE.Common.Diagnostics;
+using Tango.FSE.Procedures;
+using System.IO;
+using System.Windows.Forms;
+using Tango.PMR.EmbeddedParameters;
+
+public class Program
+{
+const double MIN_SLOP=0.7;
+const double MAX_SLOP=1.4;
+const double ERROR_SLOP=-1;
+const double MIN_50cc_on_volt=2.3;
+const double MAX_50cc_on_volt=3.2;
+const double ERROR_50cc_on_volt=-1;
+
+int [] Convert_Midtank_No = new Int32 [8] {1,3,5,7,2,4,6,8};
+uint [,] ADC_Add_Chnl = new uint [8,2] {
+ {0x44,0x20},
+ {0x44,0x08},
+ {0x46,0x80},
+ {0x46,0x20},
+ {0x44,0x10},
+ {0x44,0x04},
+ {0x46,0x40},
+ {0x46,0x10},
+ };
+
+
+const Int32 F3_VALVE_OUT = 0x600008E2 ;
+string Machine_SN ;
+private const string FILE_PATH = @"C:\MidTankLog\";
+string File_name;
+double Full_Cartridge=1000; // on CC
+double Slop=0.92;
+//----------------------
+const Int32 I2C_ID = 2;
+//const Int32 I2C_Slave_Add = 0x46; //must be 0x40, 0x44 or 0x46
+//----------------------
+
+
+private IProcedureContext context;
+
+
+
+
+ public void OnExecute(IProcedureContext context)
+ {
+
+
+ Int32 Timout ;
+ Int32 Interval;
+ Int32 midtankno = 0;
+ double Full_Point=0; //on Voltage
+ double resualt;
+ double Sum=0 ;
+ double Old_Sum=0 ;
+ double Start_Point=0;
+
+
+ if (!Directory.Exists(FILE_PATH))
+ {
+ Directory.CreateDirectory(FILE_PATH);
+ }
+
+
+
+ var response =context.RequestUserInputFor<String>("Enter Midtank S/N: ", "");
+ context.Write("\n");
+ Machine_SN = response;
+ context.WriteLine(Machine_SN);
+ File_name= FILE_PATH +Machine_SN + DateTime.Now.ToString("MM_dd_yyyy_HH_mm_ss")+".csv";
+ context.Write(File_name);
+ context.WriteToFile(File_name,"MidTank S/N:," + Machine_SN);
+
+
+ var response1 =context.RequestUserInputFor<String>("Enter Midtank number to calibrate (1-8):", "");
+ context.WriteLine(response1);
+ midtankno = Int32.Parse(response1);
+ context.AppendToFile(File_name,"MidTank Number:\t" + response1);
+ if (midtankno==8)
+ {
+ Slop=1;
+ Timout=60; //60 minutes
+ Interval=60; //60 second
+ }
+ else
+ {
+ Slop=0.92;
+ Timout=10*2; //10 minutes
+ Interval=30; //30 second
+
+ }
+ var response10 =context.RequestUserInputFor<String>("Enter Cartridge Valume on CC (500-1500):", "");
+ context.WriteLine(response10);
+ Full_Cartridge = double.Parse(response10);
+ context.AppendToFile(File_name,"Cartridge Valume:\t" + response10);
+ context.AppendToFile(File_name,"Slop value:\t" + Slop);
+
+
+ DialogResult result = MessageBox.Show("Are you sure to calibrate Midtank No: "+ midtankno + " with "+ Full_Cartridge +" CC" , "Warning",MessageBoxButtons.YesNo);
+ if(result == DialogResult.Yes)
+ {
+
+
+
+ string box_msg = "Please Insert cartridge ";
+
+ MessageBox.Show(box_msg);
+
+ open_valve(midtankno,1,1) ; //open Air valve
+ open_valve(midtankno,0,1) ; //open Ink valve
+ Int32 i=0;
+ while (i<Timout) //check for 15 minitus
+ {
+ Sum=0;
+ for (Int32 j=0;j<Interval;j++)
+ {
+ resualt=read_pressure_sensor(midtankno);
+ context.AppendToFile(File_name,resualt+",V");
+ Sum=Sum+resualt;
+ Thread.Sleep(1000);
+ }
+
+
+ if (i==0)
+ Start_Point=Sum/Interval;
+
+ if (Sum>Old_Sum)
+ Old_Sum=Sum-Old_Sum;
+ else
+ Old_Sum=Old_Sum-Sum;
+
+
+ if ((check_valve(midtankno,1) != 0) && (check_valve(midtankno,0) != 0))
+ {
+ i++;
+ if ( Old_Sum <0.02)
+ i=Timout+1; //end
+ Old_Sum=Sum;
+ }
+ else
+ {
+ open_valve(midtankno,1,0) ; //open Air valve
+ open_valve(midtankno,0,0) ; //open Ink valve
+ Old_Sum=0;
+
+ }
+ }
+ Full_Point=Sum/Interval;
+
+
+ close_valve(midtankno,1,1) ; //close Air valve
+ close_valve(midtankno,0,1) ; //close Ink valve
+
+
+ if (insert_slop_t_eeprom(Full_Point, midtankno,Start_Point)==0)
+ {
+ box_msg ="Turn Power Off and On to finish the calibration.";
+ MessageBox.Show(box_msg);
+
+
+ context.AddResult(ResultType.Passed, "Test passed", "Test passed.");
+
+ }
+ else
+ {
+ box_msg ="Calibration error";
+ MessageBox.Show(box_msg);
+
+
+ context.AddResult(ResultType.Failed, "Test Fail", "Test Fail.");
+
+ }
+ }
+
+}
+
+
+ int insert_slop_t_eeprom( double FullPoint,Int32 midtankno, double StartPoint)
+{
+// context.Write("\n ");
+
+ StartPoint=FullPoint-StartPoint;
+ StartPoint=StartPoint/Full_Cartridge;
+ if ((StartPoint>0.7 ) && (StartPoint>1.3 ))
+ {
+ MidTankDataSetupRequest midTankDataSetupRequest = new MidTankDataSetupRequest();
+
+ MidTankData midTankData = new MidTankData();
+ midTankData.MidTankId = Convert.ToUInt32 (midtankno-1);
+ midTankData.InitialOffsetA =FullPoint - (Full_Cartridge/1000-0.1)/Slop;
+ midTankData.SlopeB = Slop;
+
+ context.Write("\nMidtank No:" + midtankno + "=\tVoltage Zero is ="+(FullPoint - (Full_Cartridge/1000-0.1)/Slop)+"\tSlop="+ Slop);
+ context.AppendToFile(File_name,"\nMidtank No:" + midtankno + "=\tVoltage Zero is ="+(FullPoint - (Full_Cartridge/1000-0.1)/Slop)+"\tSlop="+ Slop);
+
+
+ midTankDataSetupRequest.MidTankInfo.Add(midTankData);
+
+
+ var response =context.Send<MidTankDataSetupResponse>(midTankDataSetupRequest);
+
+ return 0;
+ }
+ else
+ context.Write("\nError");
+ context.AppendToFile(File_name,"\n Slop Error");
+ return 1;
+
+
+ }
+
+
+
+int adc_configuration(uint I2C_Slave_Add,uint channel )
+ {
+ StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();
+ stubI2CWriteBytesRequest.I2CId = I2C_ID;
+ stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add;
+
+ UInt32 uInt32 = new UInt32();
+ stubI2CWriteBytesRequest.BytesTWrite.Add(0x00);//Byte 0 to write
+ stubI2CWriteBytesRequest.BytesTWrite.Add(channel);//Byte 1 to Write, must be 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02 or 0x01 for different channels
+ stubI2CWriteBytesRequest.BytesTWrite.Add(0x80);//Byte 2 to Write
+
+ var response =context.Send<StubI2CWriteBytesResponse>(stubI2CWriteBytesRequest);
+
+ return 1;
+ }
+
+
+int adc_set_for_read_ch(uint I2C_Slave_Add)
+ {
+ StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();
+ stubI2CWriteBytesRequest.I2CId = I2C_ID;
+ stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add;
+
+ UInt32 uInt32 = new UInt32();
+ stubI2CWriteBytesRequest.BytesTWrite.Add(0x01);//Byte 0 to write
+
+ var response =context.Send<StubI2CWriteBytesResponse>(stubI2CWriteBytesRequest);
+
+ return 1;
+ }
+
+
+
+
+double adc_read_ch(uint I2C_Slave_Add)
+ {
+ StubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest();
+ stubI2CReadBytesRequest.I2CId = I2C_ID;
+ stubI2CReadBytesRequest.SlaveAddress = I2C_Slave_Add;
+ stubI2CReadBytesRequest.NumberOfBytesToRead = 2; // Number of bytes to read
+
+ var response1 =context.Send<StubI2CReadBytesResponse>(stubI2CReadBytesRequest);
+ uint temph=0;
+ uint templ=0;
+ uint temp;
+ double calc;
+ double calc1;
+ double calc2;
+ temph=response1.ReadBytes[0];
+ templ=response1.ReadBytes[1];
+ temp = (temph << 8) | templ;
+ temp=temp & 0x0fff;
+
+ calc = (double)temp *2.5 / 4096.0;
+
+ calc1 = (1.96- calc) * 4.64 + 1.96;
+ context.Write("Vsensor [volts]:\t");
+ context.Write(calc1 + "\n");
+
+
+ return calc1;
+ }
+
+double read_pressure_sensor(Int32 i )
+ {
+double resualt =0 ;
+ switch (i)
+ {
+ case 1:
+ adc_configuration(0x44,0x20); //a2d_address 0x44 channel channel 2
+ adc_set_for_read_ch(0x44);
+ resualt=adc_read_ch(0x44);
+ break;
+
+ case 2:
+ adc_configuration(0x44,0x08); //a2d_address 0x44 channel channel 4
+ adc_set_for_read_ch(0x44);
+ resualt=adc_read_ch(0x44);
+ break;
+
+ case 3:
+ adc_configuration(0x46,0x80); //a2d_address 0x46 channel channel 0
+ adc_set_for_read_ch(0x46);
+ resualt=adc_read_ch(0x46);
+ break;
+
+ case 4:
+ adc_configuration(0x46,0x20); //a2d_address 0x46 channel channel 2
+ adc_set_for_read_ch(0x46);
+ resualt=adc_read_ch(0x46);
+ break;
+
+ case 5:
+ adc_configuration(0x44,0x10); //a2d_address 0x44 channel channel 3
+ adc_set_for_read_ch(0x44);
+ resualt=adc_read_ch(0x44);
+ break;
+
+ case 6:
+ adc_configuration(0x44,0x04); //a2d_address 0x44 channel channel 5
+ adc_set_for_read_ch(0x44);
+ resualt=adc_read_ch(0x44);
+ break;
+
+ case 7:
+ adc_configuration(0x46,0x40); //a2d_address 0x46 channel channel 1
+ adc_set_for_read_ch(0x46);
+ resualt=adc_read_ch(0x46);
+ break;
+
+ case 8:
+ adc_configuration(0x46,0x10); //a2d_address 0x46 channel channel 3
+ adc_set_for_read_ch(0x46);
+ resualt=adc_read_ch(0x46);
+ break;
+
+ default:
+ context.Write("Error");
+
+ break;
+ }
+
+ return resualt;
+ }
+
+
+//--------------------------------
+int open_valve (int valve_nm,int valve_type,int check_valve) //valve_type=0 is Air ,1 is Ink ; check_valve=1 send feedbak
+{
+ int temp1=Convert_Midtank_No[valve_nm-1] ;
+
+ string temp;
+ SetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 1);
+
+ if (check_valve!=0)
+ {
+ temp="Air";
+ if (valve_type==1)
+ temp="Ink";
+
+ DialogResult result = MessageBox.Show("Did " + temp + "Valve of Midtank " + valve_nm +" open?", "Warning",MessageBoxButtons.YesNo);
+ if(result == DialogResult.No)
+ {
+// Units_status[(valve_nm-1)*3+valve_type,1]="Fail";
+ context.Write(temp +"Valve\tFail\n");
+ return 0;
+ }
+ else
+ {
+// Units_status[(valve_nm-1)*3+valve_type,1]="Pass";
+ context.Write(temp +"Valve\tOpen\n");
+ return 1;
+ }
+
+ }
+ return 1;
+
+}
+//--------------------------------
+int close_valve (int valve_nm,int valve_type,int check_valve)
+{
+ int temp1=Convert_Midtank_No[valve_nm-1];
+
+ string temp;
+ SetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 0);
+ if (check_valve!=0)
+ {
+ temp="Air";
+ if (valve_type==1)
+ temp="Ink";
+
+ DialogResult result = MessageBox.Show("Did " + temp +" Valve of Midtank " + valve_nm +" close?", "Warning",MessageBoxButtons.YesNo);
+ if(result == DialogResult.No)
+ {
+// Units_status[(valve_nm-1)*3+valve_type,1]="Fail";
+ context.Write(temp +"Valve\tFail\n");
+ return 0;
+ }
+ else
+ {
+// Units_status[(valve_nm-1)*3+valve_type,1]="Pass";
+ context.Write(temp +"Valve\tclose\n");
+ return 1;
+ }
+ }
+ return 1;
+
+}
+
+public Int32 SetBit(Int32 Adr, Int32 BitNo, Int32 Bit)
+{
+ Int32 BitMask;
+ Int32 RetVal;
+ RetVal = Fpga_Read_Reg(Adr);
+ Int32 RV = RetVal ;
+
+ if (Bit == 0x1)
+ {
+ BitMask = 0x1 << BitNo;
+ RV = RV | BitMask;
+ Fpga_Write_Reg( Adr, RV );
+ }
+ else if (Bit == 0x0)
+ {
+ BitMask = ~(0x1 << BitNo);
+ RV = RV & BitMask;
+ Fpga_Write_Reg(Adr, RV );
+ }
+ return 1;
+}
+
+int Fpga_Write_Reg(Int32 Addr, Int32 Data)
+{
+ var response =context.Send<StubFpgaWriteRegResponse>("StubFpgaWriteRegRequest" ,Addr, Data);
+
+ return 1;
+}
+
+
+Int32 check_valve (Int32 valve_nm,int valve_type)
+{
+ Int32 temp1=Convert_Midtank_No[valve_nm-1];
+
+ var response =context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F3_VALVE_OUT);
+ Int32 RV =(Int32) response.Value & 0xffff ;
+ RV = RV & ( 0x1 << (((valve_type+1)*8)- temp1));
+ return RV;
+
+}
+
+
+Int32 Fpga_Read_Reg(Int32 Addr)
+{
+
+context.Write("123");
+
+ var response =context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,Addr);
+ context.Write("456");
+
+ Int32 RV= (Int32) response.Value & 0xffff;
+ context.Write("789");
+
+ return RV;
+}
+
+
+
+} \ No newline at end of file
diff --git a/Software/Stubs Collection/Procedures/MidTank Calibration.txt b/Software/Stubs Collection/Procedures/MidTank Calibration.txt
new file mode 100644
index 000000000..655bbd099
--- /dev/null
+++ b/Software/Stubs Collection/Procedures/MidTank Calibration.txt
@@ -0,0 +1,477 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Drawing;
+using Google.Protobuf;
+using Tango.BL.Entities;
+using Tango.BL.Enumerations;
+using Tango.PMR.Stubs;
+using Tango.PMR.Diagnostics;
+using Tango.FSE.Common.Connection;
+using Tango.FSE.Common.Diagnostics;
+using Tango.FSE.Procedures;
+using System.IO;
+using System.Windows.Forms;
+using Tango.PMR.EmbeddedParameters;
+
+public class Program
+{
+const double MIN_SLOP=0.7;
+const double MAX_SLOP=1.4;
+const double ERROR_SLOP=-1;
+const double MIN_50cc_on_volt=2.3;
+const double MAX_50cc_on_volt=3.2;
+const double ERROR_50cc_on_volt=-1;
+
+int [] Convert_Midtank_No = new Int32 [8] {1,3,5,7,2,4,6,8};
+uint [,] ADC_Add_Chnl = new uint [8,2] {
+ {0x44,0x20},
+ {0x44,0x08},
+ {0x46,0x80},
+ {0x46,0x20},
+ {0x44,0x10},
+ {0x44,0x04},
+ {0x46,0x40},
+ {0x46,0x10},
+ };
+
+
+const Int32 F3_VALVE_OUT = 0x600008E2 ;
+string Machine_SN ;
+private const string FILE_PATH = @"C:\MidTankLog\";
+string File_name;
+double Full_Cartridge=1000; // on CC
+double Slop=0.92;
+//----------------------
+const Int32 I2C_ID = 2;
+//const Int32 I2C_Slave_Add = 0x46; //must be 0x40, 0x44 or 0x46
+//----------------------
+
+
+private IProcedureContext context;
+
+
+
+
+ public void OnExecute(IProcedureContext context)
+ {
+
+
+ Int32 Timout ;
+ Int32 Interval;
+ Int32 midtankno = 0;
+ double Full_Point=0; //on Voltage
+ double resualt;
+ double Sum=0 ;
+ double Old_Sum=0 ;
+ double Start_Point=0;
+
+
+ if (!Directory.Exists(FILE_PATH))
+ {
+ Directory.CreateDirectory(FILE_PATH);
+ }
+
+
+
+ var response =context.RequestUserInputFor<String>("Enter Midtank S/N: ", "");
+ context.Write("\n");
+ Machine_SN = response;
+ context.WriteLine(Machine_SN);
+ File_name= FILE_PATH +Machine_SN + DateTime.Now.ToString("MM_dd_yyyy_HH_mm_ss")+".csv";
+ context.Write(File_name);
+ context.WriteToFile(File_name,"MidTank S/N:," + Machine_SN);
+
+
+ var response1 =context.RequestUserInputFor<String>("Enter Midtank number to calibrate (1-8):", "");
+ context.WriteLine(response1);
+ midtankno = Int32.Parse(response1);
+ context.AppendToFile(File_name,"MidTank Number:\t" + response1);
+ if (midtankno==8)
+ {
+ Slop=1;
+ Timout=60; //60 minutes
+ Interval=60; //60 second
+ }
+ else
+ {
+ Slop=0.92;
+ Timout=10*2; //10 minutes
+ Interval=30; //30 second
+
+ }
+ var response10 =context.RequestUserInputFor<String>("Enter Cartridge Valume on CC (500-1500):", "");
+ context.WriteLine(response10);
+ Full_Cartridge = double.Parse(response10);
+ context.AppendToFile(File_name,"Cartridge Valume:\t" + response10);
+ context.AppendToFile(File_name,"Slop value:\t" + Slop);
+
+
+ DialogResult result = MessageBox.Show("Are you sure to calibrate Midtank No: "+ midtankno + " with "+ Full_Cartridge +" CC" , "Warning",MessageBoxButtons.YesNo);
+ if(result == DialogResult.Yes)
+ {
+
+
+
+ string box_msg = "Please Insert cartridge ";
+
+ MessageBox.Show(box_msg);
+
+ open_valve(midtankno,1,1) ; //open Air valve
+ open_valve(midtankno,0,1) ; //open Ink valve
+ Int32 i=0;
+ while (i<Timout) //check for 15 minitus
+ {
+ Sum=0;
+ for (Int32 j=0;j<Interval;j++)
+ {
+ resualt=read_pressure_sensor(midtankno);
+ context.AppendToFile(File_name,resualt+",V");
+ Sum=Sum+resualt;
+ Thread.Sleep(1000);
+ }
+
+
+ if (i==0)
+ Start_Point=Sum/Interval;
+
+ if (Sum>Old_Sum)
+ Old_Sum=Sum-Old_Sum;
+ else
+ Old_Sum=Old_Sum-Sum;
+
+
+ if ((check_valve(midtankno,1) != 0) && (check_valve(midtankno,0) != 0))
+ {
+ i++;
+ if ( Old_Sum <0.02)
+ i=Timout+1; //end
+ Old_Sum=Sum;
+ }
+ else
+ {
+ open_valve(midtankno,1,0) ; //open Air valve
+ open_valve(midtankno,0,0) ; //open Ink valve
+ Old_Sum=0;
+
+ }
+ }
+ Full_Point=Sum/Interval;
+
+
+ close_valve(midtankno,1,1) ; //close Air valve
+ close_valve(midtankno,0,1) ; //close Ink valve
+
+
+ if (insert_slop_t_eeprom(Full_Point, midtankno,Start_Point)==0)
+ {
+ box_msg ="Turn Power Off and On to finish the calibration.";
+ MessageBox.Show(box_msg);
+
+
+ context.AddResult(ResultType.Passed, "Test passed", "Test passed.");
+
+ }
+ else
+ {
+ box_msg ="Calibration error";
+ MessageBox.Show(box_msg);
+
+
+ context.AddResult(ResultType.Failed, "Test Fail", "Test Fail.");
+
+ }
+ }
+
+}
+
+
+ int insert_slop_t_eeprom( double FullPoint,Int32 midtankno, double StartPoint)
+{
+// context.Write("\n ");
+
+ StartPoint=FullPoint-StartPoint;
+ StartPoint=StartPoint/Full_Cartridge;
+ if ((StartPoint>0.7 ) && (StartPoint>1.3 ))
+ {
+ MidTankDataSetupRequest midTankDataSetupRequest = new MidTankDataSetupRequest();
+
+ MidTankData midTankData = new MidTankData();
+ midTankData.MidTankId = Convert.ToUInt32 (midtankno-1);
+ midTankData.InitialOffsetA =FullPoint - (Full_Cartridge/1000-0.1)/Slop;
+ midTankData.SlopeB = Slop;
+
+ context.Write("\nMidtank No:" + midtankno + "=\tVoltage Zero is ="+(FullPoint - (Full_Cartridge/1000-0.1)/Slop)+"\tSlop="+ Slop);
+ context.AppendToFile(File_name,"\nMidtank No:" + midtankno + "=\tVoltage Zero is ="+(FullPoint - (Full_Cartridge/1000-0.1)/Slop)+"\tSlop="+ Slop);
+
+
+ midTankDataSetupRequest.MidTankInfo.Add(midTankData);
+
+
+ var response =context.Send<MidTankDataSetupResponse>(midTankDataSetupRequest);
+
+ return 0;
+ }
+ else
+ context.Write("\nError");
+ context.AppendToFile(File_name,"\n Slop Error");
+ return 1;
+
+
+ }
+
+
+
+int adc_configuration(uint I2C_Slave_Add,uint channel )
+ {
+ StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();
+ stubI2CWriteBytesRequest.I2CId = I2C_ID;
+ stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add;
+
+ UInt32 uInt32 = new UInt32();
+ stubI2CWriteBytesRequest.BytesTWrite.Add(0x00);//Byte 0 to write
+ stubI2CWriteBytesRequest.BytesTWrite.Add(channel);//Byte 1 to Write, must be 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02 or 0x01 for different channels
+ stubI2CWriteBytesRequest.BytesTWrite.Add(0x80);//Byte 2 to Write
+
+ var response =context.Send<StubI2CWriteBytesResponse>(stubI2CWriteBytesRequest);
+
+ return 1;
+ }
+
+
+int adc_set_for_read_ch(uint I2C_Slave_Add)
+ {
+ StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();
+ stubI2CWriteBytesRequest.I2CId = I2C_ID;
+ stubI2CWriteBytesRequest.SlaveAddress = I2C_Slave_Add;
+
+ UInt32 uInt32 = new UInt32();
+ stubI2CWriteBytesRequest.BytesTWrite.Add(0x01);//Byte 0 to write
+
+ var response =context.Send<StubI2CWriteBytesResponse>(stubI2CWriteBytesRequest);
+
+ return 1;
+ }
+
+
+
+
+double adc_read_ch(uint I2C_Slave_Add)
+ {
+ StubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest();
+ stubI2CReadBytesRequest.I2CId = I2C_ID;
+ stubI2CReadBytesRequest.SlaveAddress = I2C_Slave_Add;
+ stubI2CReadBytesRequest.NumberOfBytesToRead = 2; // Number of bytes to read
+
+ var response1 =context.Send<StubI2CReadBytesResponse>(stubI2CReadBytesRequest);
+ uint temph=0;
+ uint templ=0;
+ uint temp;
+ double calc;
+ double calc1;
+ double calc2;
+ temph=response1.ReadBytes[0];
+ templ=response1.ReadBytes[1];
+ temp = (temph << 8) | templ;
+ temp=temp & 0x0fff;
+
+ calc = (double)temp *2.5 / 4096.0;
+
+ calc1 = (1.96- calc) * 4.64 + 1.96;
+ context.Write("Vsensor [volts]:\t");
+ context.Write(calc1 + "\n");
+
+
+ return calc1;
+ }
+
+double read_pressure_sensor(Int32 i )
+ {
+double resualt =0 ;
+ switch (i)
+ {
+ case 1:
+ adc_configuration(0x44,0x20); //a2d_address 0x44 channel channel 2
+ adc_set_for_read_ch(0x44);
+ resualt=adc_read_ch(0x44);
+ break;
+
+ case 2:
+ adc_configuration(0x44,0x08); //a2d_address 0x44 channel channel 4
+ adc_set_for_read_ch(0x44);
+ resualt=adc_read_ch(0x44);
+ break;
+
+ case 3:
+ adc_configuration(0x46,0x80); //a2d_address 0x46 channel channel 0
+ adc_set_for_read_ch(0x46);
+ resualt=adc_read_ch(0x46);
+ break;
+
+ case 4:
+ adc_configuration(0x46,0x20); //a2d_address 0x46 channel channel 2
+ adc_set_for_read_ch(0x46);
+ resualt=adc_read_ch(0x46);
+ break;
+
+ case 5:
+ adc_configuration(0x44,0x10); //a2d_address 0x44 channel channel 3
+ adc_set_for_read_ch(0x44);
+ resualt=adc_read_ch(0x44);
+ break;
+
+ case 6:
+ adc_configuration(0x44,0x04); //a2d_address 0x44 channel channel 5
+ adc_set_for_read_ch(0x44);
+ resualt=adc_read_ch(0x44);
+ break;
+
+ case 7:
+ adc_configuration(0x46,0x40); //a2d_address 0x46 channel channel 1
+ adc_set_for_read_ch(0x46);
+ resualt=adc_read_ch(0x46);
+ break;
+
+ case 8:
+ adc_configuration(0x46,0x10); //a2d_address 0x46 channel channel 3
+ adc_set_for_read_ch(0x46);
+ resualt=adc_read_ch(0x46);
+ break;
+
+ default:
+ context.Write("Error");
+
+ break;
+ }
+
+ return resualt;
+ }
+
+
+//--------------------------------
+int open_valve (int valve_nm,int valve_type,int check_valve) //valve_type=0 is Air ,1 is Ink ; check_valve=1 send feedbak
+{
+ int temp1=Convert_Midtank_No[valve_nm-1] ;
+
+ string temp;
+ SetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 1);
+
+ if (check_valve!=0)
+ {
+ temp="Air";
+ if (valve_type==1)
+ temp="Ink";
+
+ DialogResult result = MessageBox.Show("Did " + temp + "Valve of Midtank " + valve_nm +" open?", "Warning",MessageBoxButtons.YesNo);
+ if(result == DialogResult.No)
+ {
+// Units_status[(valve_nm-1)*3+valve_type,1]="Fail";
+ context.Write(temp +"Valve\tFail\n");
+ return 0;
+ }
+ else
+ {
+// Units_status[(valve_nm-1)*3+valve_type,1]="Pass";
+ context.Write(temp +"Valve\tOpen\n");
+ return 1;
+ }
+
+ }
+ return 1;
+
+}
+//--------------------------------
+int close_valve (int valve_nm,int valve_type,int check_valve)
+{
+ int temp1=Convert_Midtank_No[valve_nm-1];
+
+ string temp;
+ SetBit (F3_VALVE_OUT,(((valve_type+1)*8)- temp1), 0);
+ if (check_valve!=0)
+ {
+ temp="Air";
+ if (valve_type==1)
+ temp="Ink";
+
+ DialogResult result = MessageBox.Show("Did " + temp +" Valve of Midtank " + valve_nm +" close?", "Warning",MessageBoxButtons.YesNo);
+ if(result == DialogResult.No)
+ {
+// Units_status[(valve_nm-1)*3+valve_type,1]="Fail";
+ context.Write(temp +"Valve\tFail\n");
+ return 0;
+ }
+ else
+ {
+// Units_status[(valve_nm-1)*3+valve_type,1]="Pass";
+ context.Write(temp +"Valve\tclose\n");
+ return 1;
+ }
+ }
+ return 1;
+
+}
+
+public Int32 SetBit(Int32 Adr, Int32 BitNo, Int32 Bit)
+{
+ Int32 BitMask;
+ Int32 RetVal;
+ RetVal = Fpga_Read_Reg(Adr);
+ Int32 RV = RetVal ;
+
+ if (Bit == 0x1)
+ {
+ BitMask = 0x1 << BitNo;
+ RV = RV | BitMask;
+ Fpga_Write_Reg( Adr, RV );
+ }
+ else if (Bit == 0x0)
+ {
+ BitMask = ~(0x1 << BitNo);
+ RV = RV & BitMask;
+ Fpga_Write_Reg(Adr, RV );
+ }
+ return 1;
+}
+
+int Fpga_Write_Reg(Int32 Addr, Int32 Data)
+{
+ var response =context.Send<StubFpgaWriteRegResponse>("StubFpgaWriteRegRequest" ,Addr, Data);
+
+ return 1;
+}
+
+
+Int32 check_valve (Int32 valve_nm,int valve_type)
+{
+ Int32 temp1=Convert_Midtank_No[valve_nm-1];
+
+ var response =context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F3_VALVE_OUT);
+ Int32 RV =(Int32) response.Value & 0xffff ;
+ RV = RV & ( 0x1 << (((valve_type+1)*8)- temp1));
+ return RV;
+
+}
+
+
+Int32 Fpga_Read_Reg(Int32 Addr)
+{
+
+context.Write("123");
+
+ var response =context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,Addr);
+ context.Write("456");
+
+ Int32 RV= (Int32) response.Value & 0xffff;
+ context.Write("789");
+
+ return RV;
+}
+
+
+
+} \ No newline at end of file
diff --git a/Software/Stubs Collection/Procedures/Priming.pproj b/Software/Stubs Collection/Procedures/Priming.pproj
new file mode 100644
index 000000000..9139b1597
--- /dev/null
+++ b/Software/Stubs Collection/Procedures/Priming.pproj
@@ -0,0 +1 @@
+{"$id":"1","Name":"Priming","Description":"Used for a dispenser priming","Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Entities;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\nusing System.IO;\r\nusing System.Diagnostics;\r\nusing System.Windows.Forms;\r\n\r\n\r\npublic class Program\r\n{\r\n\r\n\r\nprivate IProcedureContext context;\r\n\r\n//---------------------Start Command ----------------\r\nconst Int32\tCMD_RUN\t=\t0;\t\t//Run on Pulse Per Secound .positive run Up and negative run Down b\r\nconst Int32\tCMD_STOP=\t1;\t\t//0;Hard stop(Defualt);1-Soft stop;2-Hard Hiz;3-Soft Hiz\r\nconst Int32\tCMD_VALVE=\t2;\t\t//0-to Midtank ,1-to head \r\nconst Int32\tCMD_DLY\t=\t3;\t\t//delay in Seconds .\r\nconst Int32\tCMD_TIME=\t4;\t\t//Print Time .\r\nconst Int32\tCMD_PRESS=\t5;\t\t//return from Delay loop when pressure is high (on mBAR) .\r\nconst Int32 CMD_LOOP_NM=6;\t\t//NUMBER OF counter\r\nconst Int32 CMD_LOOP=\t7;\t\t//jump up(+) or down(-) command u\r\nconst Int32 CMD_MTV_OPEN =\t8;\t\t//0 Air ; 1 Ink\r\nconst Int32 CMD_MTV_CLOSE=\t9;\t\t//0 Air ; 1 Ink\r\nconst Int32 CMD_LBL=\t10;\t//label for user \r\nconst Int32 CMD_SMP=\t11; //sample rate ,defualt 100msec (1); for 1 second is 10.\r\nconst Int32 CMD_PRESL=\t12; //return from Delay loop when pressure is low (on mBAR) .\r\n\r\nconst Int32\tCMD_END\t=\t13;\t//end loop .\r\n \r\n\r\nInt32[] BuildUp_Table = new int []\r\n{\r\n\tCMD_VALVE,1,\r\n\tCMD_PRESL,200,\r\n\tCMD_DLY,200, \r\n\r\n\tCMD_LOOP_NM,3,\r\n\r\n\tCMD_VALVE,0,\r\n\tCMD_DLY,1, \r\n\tCMD_VALVE,1,\r\n\tCMD_DLY,1, \r\n\tCMD_LOOP,-4,\r\n\r\n\tCMD_VALVE,0,\r\n\tCMD_RUN,1068,\r\n\tCMD_PRESS,1000,\t//mbar --> 1000 = 100% work, 4000 = 200% work, 350 = 20% work\r\n\tCMD_DLY,150, \t\t\r\n\tCMD_LBL,1,\r\n\tCMD_PRESS,2000,\t//mbar --> 2000 = 100% work, 4000 = 200% work, 350 = 20% work\r\n\tCMD_DLY,60, \t\t\r\n\tCMD_LBL,2,\r\n\tCMD_PRESS,3000,\r\n\tCMD_DLY,60, // to limit\r\n\tCMD_STOP,0,\r\n\tCMD_VALVE,1,\r\n\tCMD_END,3,\r\n};\r\n\t\r\n\r\nInt32[] Up_Table = new int []\r\n{\r\n\tCMD_VALVE,1,\r\n\tCMD_PRESL,200,\r\n\tCMD_DLY,200, \r\n\t\r\n\tCMD_PRESS,3000,\t//mbar --> 1000 = 100% work, 4000 = 200% work, 350 = 20% work\r\n\tCMD_RUN,534, // 100%\r\n\tCMD_DLY,120,\r\n\tCMD_STOP,0,\r\n\tCMD_END,3,\r\n};\r\nInt32 Dispenser_sample_rate= 1; \r\n\r\n\tstring path = @\"C:\\Dispenser_setup\\Log\\\"; \t\r\n//----------------------\r\nconst UInt32 I2C_ID \t\t\t= \t4;\t\t\t\t\t//MCU_I2C4 \r\nconst UInt32 TCA9548A_address \t=\t0xE2;\t \t\r\nconst UInt32 I2C_Slave_Low_Add \t= \t0xA0;\t\t\t\t//eeprom address - 64k low \r\nconst UInt32 I2C_Slave_High_Add = \t0xA2;\t\t\t\t//eeprom address - 64k High\r\n//----------------------\r\nbyte [] EEPROM_Data = new byte [128];\r\n\r\n\r\n//---------------------End Command ----------------\r\n\r\nconst Int32\tDispenser_Motor1\t=\t6;\t\t \r\nconst Int32\tDispenser_Motor2\t=\t7;\t\t \r\nconst Int32\tDispenser_Motor3\t=\t8;\t\t \r\nconst Int32\tDispenser_Motor4\t=\t9;\t\t \r\nconst Int32\tDispenser_Motor5\t=\t10;\t\t \r\nconst Int32\tDispenser_Motor6\t=\t11;\t\t \r\nconst Int32\tDispenser_Motor7\t=\t12;\t\t \r\nconst Int32\tDispenser_Motor8\t=\t13;\t\t \r\n\r\nconst Int32 AN_IDS_PRESSENS_1\t=\t2;\r\nconst Int32 AN_IDS_PRESSENS_2\t=\t3;\r\nconst Int32 AN_IDS_PRESSENS_3\t=\t4;\r\nconst Int32 AN_IDS_PRESSENS_4\t=\t5;\r\nconst Int32 AN_IDS_PRESSENS_5\t=\t6;\r\nconst Int32 AN_IDS_PRESSENS_6\t=\t7;\r\nconst Int32 AN_IDS_PRESSENS_7\t=\t8;\r\nconst Int32 AN_IDS_PRESSENS_8\t=\t9;\r\n\r\nconst Int32\tF2_LS_01_Direct\t=\t0x60000420\t;\t//\tReads the direct values that are currently being sent to the fpga.\trsv\t\trsv\t\trsv\t\t\t\t\t\trsv\t\t\t\t\t\tF2_LS_DISPENSER_UP_2\tF2_LS_DISPENSER_25_2\tF2_LS_DISPENSER_75_2\tF2_LS_DISPENSER_DOWN_2 \tF2_LS_DISPENSER_50_2\tF2_LS_DISPENSER_SPARE_2\tF2_LS_DISPENSER_UP_1\tF2_LS_DISPENSER_25_1 \tF2_LS_DISPENSER_75_1\tF2_LS_DISPENSER_DOWN_1\tF2_LS_DISPENSER_50_1\tF2_LS_DISPENSER_SPARE_1\t\t\t\r\nconst Int32\tF2_LS_02_Direct\t=\t0x60000430\t;\t//\tReads the direct values that are currently being sent to the fpga.\trsv\t\trsv\t\trsv\t\t\t\t\t\trsv\t\t\t\t\t\tF2_LS_DISPENSER_UP_4\tF2_LS_DISPENSER_25_4\tF2_LS_DISPENSER_75_4\tF2_LS_DISPENSER_DOWN_4\tF2_LS_DISPENSER_50_4\tF2_LS_DISPENSER_SPARE_4\tF2_LS_DISPENSER_UP_3\tF2_LS_DISPENSER_25_3 \tF2_LS_DISPENSER_75_3\tF2_LS_DISPENSER_DOWN_3\tF2_LS_DISPENSER_50_3\tF2_LS_DISPENSER_SPARE_3\t\t\t\r\nconst Int32\tF2_LS_03_Direct\t=\t0x60000440\t;\t//\tReads the direct values that are currently being sent to the fpga.\trsv\t\trsv\t\trsv\t\t\t\t\t\trsv\t\t\t\t\t\tF2_LS_DISPENSER_UP_6 \tF2_LS_DISPENSER_25_6 \tF2_LS_DISPENSER_75_6 \tF2_LS_DISPENSER_DOWN_6\tF2_LS_DISPENSER_50_6\tF2_LS_DISPENSER_SPARE_6\tF2_LS_DISPENSER_UP_5\tF2_LS_DISPENSER_25_5 \tF2_LS_DISPENSER_75_5\tF2_LS_DISPENSER_DOWN_5\tF2_LS_DISPENSER_50_5\tF2_LS_DISPENSER_SPARE_5\t\t\t\r\nconst Int32\tF2_LS_04_Direct =\t0x60000480\t;\t//\tReads the direct values that are currently being sent to the fpga.\trsv\t\trsv\t\trsv\t\t\t\t\t\trsv\t\t\t\t\t\tF2_LS_DISPENSER_UP_8\tF2_LS_DISPENSER_25_8\tF2_LS_DISPENSER_75_8\tF2_LS_DISPENSER_DOWN_8\tF2_LS_DISPENSER_50_8\tF2_LS_DISPENSER_SPARE_8\tF2_LS_DISPENSER_UP_7\tF2_LS_DISPENSER_25_7 \tF2_LS_DISPENSER_75_7\tF2_LS_DISPENSER_DOWN_7\tF2_LS_DISPENSER_50_7\tF2_LS_DISPENSER_SPARE_7\t\t\t\r\n\r\nconst Int32 Dispenser_Valve1\t=\t0;\r\nconst Int32 Dispenser_Valve2\t=\t1;\r\nconst Int32 Dispenser_Valve3\t=\t2;\r\nconst Int32 Dispenser_Valve4\t=\t3;\r\nconst Int32 Dispenser_Valve5\t=\t4;\r\nconst Int32 Dispenser_Valve6\t=\t5;\r\nconst Int32 Dispenser_Valve7\t=\t6;\r\nconst Int32 Dispenser_Valve8\t=\t7;\r\n\r\nconst ushort MinPress_Mbar_Add =0x5c ;\r\nconst ushort MaxPress_Mbar_Add =0x60 ;\r\n\r\nconst Int32 F3_VALVE_OUT\t= 0x600000e2;\t\t\r\n\r\n//string path = \"C:\\\\Dispenser_setup\\\\Log\\\\\"; \r\n\r\n\r\n//Int32[] Start_Table;\r\n\r\nInt32[] Start_Table = new Int32 [10000];\r\n\r\nUInt32 [] Motor_Dir=new UInt32 [8] {0,0,0,0,0,0,0,0};\r\n\r\nstring Dispenser_Fname ;\r\n\r\nInt32 Dispenser_ptr =-1;\r\n\r\nInt32 [] Dispenser_press= new Int32[8]{0,0,0,0,0,0,0,0};\r\nInt32 max_pressure_level = 20000;\r\nInt32 min_pressure_level = -20000;\r\n\t\r\nInt32 [] A2D_Dispenser= new Int32[8]{0,0,0,0,0,0,0,0};\r\nInt32 Loop_cnt= 1;\r\nInt32 Loop_length=1;\r\n\r\nInt32 PressureSensorType= 1;\t\t//1- new -1up +10 . 0-old 0 to +10\r\nInt32\tTemp_Delay=0;\r\n\r\n\r\nUInt32 RD_LS_01_Direct;\r\nUInt32 RD_LS_02_Direct;\r\nUInt32 RD_LS_03_Direct;\r\nUInt32 RD_LS_04_Direct;\r\n\r\nlong Lebel1_time;\r\nlong Lebel2_time;\r\n\r\nlong time_Table;\r\n\r\nInt32 msec_index=0;\r\n\r\nInt32 MaxPress_Mbar;\r\nInt32 MinPress_Mbar;\r\nstring state;\r\n\r\n\tpublic Int32 OnExecute(IProcedureContext context)\r\n {\r\n\t\tlong Max_PBU;\r\n\t\tInt32 Index=0;\r\n\t\tInt32 speed=0;\r\n\t\tInt32 Dispenser_Nm;\r\n\t\tthis.context = context;\r\n\t\r\n\t\tstring box_msg = \"Make sure Mixer Hot \";\r\n\t\tMessageBox.Show(box_msg);\r\n\t\t\r\n\t\tvar response1 = context.RequestUserInputFor<String>(\"Dispenser Number\", \"Enter Dispenser number to make priming (1-8):\");\r\n\t\tcontext.WriteLine(response1);\r\n\t\tDispenser_Nm = Int32.Parse(response1);\r\n\t\t\r\n\t\tcheck_Min_Max_Mbar(Dispenser_Nm);\r\n\t\r\n\t\tif (Dispenser_Nm==8)\r\n\t\t\tMax_PBU=6000;\r\n\t\telse\r\n\t\t\tMax_PBU=4000;\r\n\t\t\t\r\n\t\r\n\tif (!Directory.Exists(path))\r\n\t\t{\r\n\t\t\tDirectory.CreateDirectory(path);\r\n\t\t}\t\r\n\t\t\tcontext.WriteLine(path);\r\n\t\t\t\r\n\tcontext.Send<ProgressResponse>(\"ProgressRequest\" ,0xe0, 1);\r\n\r\n\tDispenser_Fname=path + \"Dispenser_Nm_\" + Dispenser_Nm+\"_\" + DateTime.Now.ToString(\"MM-dd-yy hh-mm\")+ \".csv\" ;\r\n\r\n\tcontext.WriteLine(Dispenser_Fname);\r\n\r\n\tcontext.WriteToFile(Dispenser_Fname,\"Dispenser Nm,\" + Dispenser_Nm + \"\\n\" );\r\n\tcontext.AppendToFile(Dispenser_Fname,\"Pressure,Command,Value,DateTime,Remark\\n\" ); \r\n\t\tfor(int j=0; j<2;j++)\r\n\t\t{\r\n\t\t\tfor(int i=0; i<4;i++)\r\n\t\t\t{\r\n\t\t\t\tstate=\"PBU No. \"+ (4*j+i+1 );\r\n\t\t\t\tStart_Table=BuildUp_Table;\r\n\t\t\t\tTable_Run(Dispenser_Nm );\r\n\t\t\t\tif (time_Table>300000)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontext.AddResult(ResultType.Failed,\"PBU\", \"PBU No.\"+ (4*j+i+1 ) + \" Fail\");\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t\t context.AddResult(ResultType.Passed,\"PBU\",\"PBU No.\"+ (4*j+i+1 ) + \" Pass\");\r\n\t\t\t\t\t\r\n\t\t\t}\r\n\t\t\tstate=\"Flow No.\"+ (j+1 ) ;\r\n\t\t\tStart_Table=Up_Table;\r\n\t\t\tTable_Run(Dispenser_Nm );\r\n\t\t\tif (time_Table<115000)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontext.WriteLine(\"time_Table= \" +time_Table);\r\n\t\t\t\t\tcontext.AddResult(ResultType.Failed,\"Flow\", \"Flow No.\"+ (j+1) + \" Fail\");\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t\t context.AddResult(ResultType.Passed,\"Flow\",\"Flow No.\"+ (j+1 ) + \" Pass\");\r\n\t\t\t\t\t\t\r\n\t\t}\r\n\t\t\t\t state=\"Last PBU \" ;\r\n\t\t\t\tStart_Table=BuildUp_Table; \r\n\t\t\t\tTable_Run(Dispenser_Nm );\r\n\t\t\t\tlong Time=Lebel2_time-Lebel1_time;\r\n\t\t\t\tif (Time>Max_PBU)\r\n\t\t\t\t { \r\n\t\t\t\t context.AddResult(ResultType.Failed,\"PBU\", \"PBU = \" +Time + \"msec \");\r\n\t\t\t\t state=\"PBU = \" +Time + \"msec \\tFail\";\r\n\t\t\t\t }\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t context.AddResult(ResultType.Passed,\"PBU\", \"PBU = \" +Time + \"msec \");\r\n\t\t\t\t state=\"PBU = \" +Time + \"msec \\tPass\";\r\n\t\t\t\t}\t\r\n\t\treturn 0;\r\n\t\t\r\n }\r\n\r\n/////////////////////////////////////////////\r\nvoid \t\tcheck_Min_Max_Mbar(Int32 i )\r\n{\r\n\tint k;\r\n\tstring s ;\r\n\ti--;\r\n\r\n\t\t\t\t\tcontext.WriteLine(\"-------------- write Enable Channel ------------\");\t//debug\r\n\t\tenable_channel(i); // Chanel 0-7 => Disp0enser 0-7 \r\n\t\t\t\t\tcontext.WriteLine(\"-------------- Read_header ------------\");\t//debug\r\n\r\n\t\t\t\t\tcontext.WriteLine(\"-------------- write_address_eeprom ------------\");\t//debug\r\n\t\twrite_address_eeprom (I2C_Slave_Low_Add,MinPress_Mbar_Add);\r\n\t\t\t\t\tcontext.WriteLine(\"-------------- read_data_from_eeprom ------------\");\t//debug\r\n\t\tread_data_from_eeprom (I2C_Slave_Low_Add,1);\r\n\t\tif \t(EEPROM_Data[0]==0\t)\r\n\t\t{\tPressureSensorType=0;\r\n\t\t\tcontext.WriteLine(\"PressureSensorType=0\" );\t//debug\r\n\t\t}\r\n\t\telse\t\r\n\t\t{\t\r\n\t\t\tPressureSensorType=1;\t\t\t\t\t\r\n\t\t\tcontext.WriteLine(\"PressureSensorType=1\" );\t//debug\r\n\t\t}\r\n\t\r\n}\t\r\n//----------------write address eeprom -------------------------\r\npublic void write_address_eeprom (UInt32 I2C_Add, UInt32 Eeprom_Add)\r\n{\t\r\n\tStubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();\r\n\tstubI2CWriteBytesRequest.I2CId = I2C_ID;\r\n\tstubI2CWriteBytesRequest.SlaveAddress = I2C_Add;\r\n\t\r\n\tUInt32 uInt32 = new UInt32();\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(Convert.ToByte( (Eeprom_Add & 0xff00) >>8));\t//Byte High add to write\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(Convert.ToByte(Eeprom_Add & 0xff));\t\t\t//Byte Low add to write\r\n\t\t\t\t\tcontext.WriteLine( (Eeprom_Add & 0xff00) >>8) ;\t//debug\r\n\t\t\t\t\tcontext.WriteLine( Eeprom_Add & 0xff);\t//debug\r\n\r\n\tcontext.Send<StubI2CWriteBytesResponse>(stubI2CWriteBytesRequest);\t\r\n}\r\n//------------------- read Data from EEprom--------------------------\r\n\r\npublic void read_data_from_eeprom ( UInt32 I2C_Add, UInt32 cnt )\r\n{\r\n\tStubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest();\r\n\tstubI2CReadBytesRequest.I2CId = I2C_ID;\r\n\tstubI2CReadBytesRequest.SlaveAddress = (I2C_Add + 1);\r\n\tstubI2CReadBytesRequest.NumberOfBytesToRead = cnt; // Number of bytes to read\r\n\r\n\tvar response1 = context.Send<StubI2CReadBytesResponse>(stubI2CReadBytesRequest);\r\n\r\n\tfor(int i=0; i<cnt;i++)\r\n\t\t{\r\n\t\t\tEEPROM_Data[i]=Convert.ToByte(response1.ReadBytes[i]);\r\n\t\t\tcontext.WriteLine(EEPROM_Data[i] );\t//debug\r\n\r\n\t\t}\t\t\r\n}\t\r\n\r\n\r\n///////////////////////////////////////////////\r\n//----------- enable I2c channel --------------\r\npublic int enable_channel(Int32 Channel_ID) \r\n{\r\n\tuint Const_temp = 0x01;\t\r\n\t\r\n\tStubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();\r\n\tstubI2CWriteBytesRequest.I2CId = I2C_ID;\r\n\tstubI2CWriteBytesRequest.SlaveAddress = TCA9548A_address;\r\n\t\r\n\tConst_temp = Const_temp << Channel_ID;\r\n\tstubI2CWriteBytesRequest.BytesTWrite.Add(Const_temp);//enable i2c channel 0 Dispenser 1\r\n\r\n\tvar response = context.Send<StubI2CWriteBytesResponse>(stubI2CWriteBytesRequest);\r\n\t\r\n\treturn 1;\r\n}\r\n\r\n\r\n////////////////////////////////////////////////////////////// \r\nInt32 Table_Run(Int32 Dispenser )\r\n\r\n{\r\n\tInt32 COMMAND=0;\r\n\tInt32 Data=0;\r\n\tInt32 count=0;\r\n\t\r\n\tDispenser--;\t\t//check from 0-7\r\n\t\r\n\tint j=0;\r\n\tvar stopwatch = new Stopwatch();\r\n\t\tstopwatch.Start();\r\n\t\r\n\t\tlong elapsed_time = stopwatch.ElapsedMilliseconds;\r\n\t\tcontext.WriteLine(elapsed_time);\r\n\t\t\r\n\twhile (count!=-1) \r\n\t{\r\n\tmsec_index=msec_index+1;\r\n\t\t\r\n\t\tif (Dispenser<2) \r\n\t\t\t{\r\n\t\t\t\tvar response1 = context.Send<StubFpgaReadRegResponse>(\"StubFpgaReadRegRequest\" ,F2_LS_01_Direct);\r\n\t\t\t\tRD_LS_01_Direct=response1.Value\t ;\r\n\t\t\t}\r\n\t\telse if ( (Dispenser<4) )\r\n\t\t\t{\r\n\t\t\t\tvar response1 = context.Send<StubFpgaReadRegResponse>(\"StubFpgaReadRegRequest\" ,F2_LS_02_Direct);\r\n\t\t\t\tRD_LS_02_Direct=response1.Value\t ;\r\n\t\t\t}\r\n\t\telse if ( (Dispenser<6) )\r\n\t\t\t{\r\n\t\t\t\tvar response1 = context.Send<StubFpgaReadRegResponse>(\"StubFpgaReadRegRequest\" ,F2_LS_03_Direct);\r\n\t\t\t\tRD_LS_03_Direct=response1.Value\t ;\r\n\t\t\t}\r\n\t\telse\r\n\t\t\t{\r\n\t\t\t\tvar response1 = context.Send<StubFpgaReadRegResponse>(\"StubFpgaReadRegRequest\" ,F2_LS_04_Direct);\r\n\t\t\t\tRD_LS_04_Direct=response1.Value\t ;\r\n\t\t\t}\r\n\t\tif (Dispenser<4) \r\n\t\t\t{\r\n\t\t\tvar response2 = context.Send<StubIntADCReadResponse>(\"StubIntADCReadRequest\" ,0x8000 + AN_IDS_PRESSENS_1);\r\n\t\t\t\tA2D_Dispenser[0]=(response2.SamplingInBits)>>16;\r\n\t\t\t\tA2D_Dispenser[1] =(response2.SamplingInBits) & 0x0000ffff;\r\n\t\t\t\tA2D_Dispenser[2] =(response2.VoltageSamplingMv)>>16;\r\n\t\t\t\tA2D_Dispenser[3] =(response2.VoltageSamplingMv) & 0x0000ffff;\r\n\t\t\t}\r\n\t\telse\r\n\t\t\t{\r\n\t\t\tvar\tresponse3 = context.Send<StubIntADCReadResponse>(\"StubIntADCReadRequest\" ,0x8000 + AN_IDS_PRESSENS_5);\r\n\t\t\t\tA2D_Dispenser[4] =(response3.SamplingInBits)>>16;\r\n\t\t\t\tA2D_Dispenser[5] =(response3.SamplingInBits)& 0x0000ffff;\r\n\t\t\t\tA2D_Dispenser[6] =(response3.VoltageSamplingMv)>>16;\r\n\t\t\t\tA2D_Dispenser[7] =(response3.VoltageSamplingMv)& 0x0000ffff;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tCOMMAND=Start_Table[count];\r\n\t\t\tData=Start_Table[(count+1)];\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//Index=Index+2;\r\n\t\t\tswitch (COMMAND)\r\n\t\t\t\t{\r\n\t\t\t\tcase CMD_RUN:\r\n\t\t\t\t\tMotor_Run(Data,Dispenser);\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_VALVE:\r\n\t\t\t\t\tValve_3W(Data,Dispenser);\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_STOP:\r\n\t\t\t\t\tMotor_Stop(Data,Dispenser);\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_DLY:\r\n\t\t\t\t\tDelay_on_second(Data,Dispenser);\r\n\t\t\t\t\tif (Temp_Delay ==0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tmax_pressure_level=20000;\t\r\n\t\t\t\t\t\tmin_pressure_level=-20000;\t\r\n\t\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_TIME:\r\n\t\t\t\t\tPrint_Time();\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_PRESS:\r\n\t\t\t\t\tmax_pressure_level=Data;\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",Max_pressure_level is, \" + Data +\",\"+DateTime.Now+\"\\n\");\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_PRESL:\r\n\t\t\t\t\tmin_pressure_level=Data;\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",Min_pressure_level is, \" + Data +\",\"+DateTime.Now+\"\\n\");\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_LBL:\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",Label,\" + Data+\",\"+DateTime.Now+\"\\n\");\r\n\t\t\t\t\tif(Data==1)\r\n\t\t\t\t\t\tLebel1_time=stopwatch.ElapsedMilliseconds;\r\n\t\t\t\t\tif(Data==2)\r\n\t\t\t\t\t\tLebel2_time=stopwatch.ElapsedMilliseconds;\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_SMP:\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",SampleRate,\" + Data+\",\"+DateTime.Now+\"\\n\");\r\n\t\t\t\t\tDispenser_sample_rate =Data;\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\t\r\n\t\t\t\tcase CMD_END:\r\n\t\t\t\t\tcount=-1;\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",End testing,,\"+DateTime.Now+\"\\n\");\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\r\n\t\t\t\tcase CMD_MTV_OPEN:\r\n\t\t\t\t\topen_midtank_valve(Data,Dispenser);\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",OPEN MIDTANK, \" + Dispenser+\",\"+DateTime.Now+\"\\n\");\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase CMD_MTV_CLOSE:\r\n\t\t\t\t\tclose_midtank_valve(Data,Dispenser);\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",CLOSE MIDTANK, \" + Dispenser+\",\"+DateTime.Now+\"\\n\");\r\n\t\t\t\t\tcount = count+2;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\r\n\t\t\t\tcase CMD_LOOP_NM:\r\n\t\t\t\t\r\n\t\t\t\t\tLoop_cnt=Data-1;\r\n\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",Counter Loop,\"+ Data+\",\"+DateTime.Now +\"\\n\");\r\n\t\t\t\t\tcount = count+2;\t\t\t\t\t\t\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase CMD_LOOP:\r\n\t\t\t\t\r\n\t\t\t\t\tif (Loop_cnt!=0)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\"Counter Loop,\"+ Loop_cnt+\",\"+DateTime.Now+\"\\n\" );\r\n\t\t\t\t\t\tcount = count+2*Data;\r\n\t\t\t\t\t\tLoop_cnt--;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",End loop,,\"+DateTime.Now +\"\\n\");\r\n\t\t\t\t\t\tcount = count+2;\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t}\t\r\n\t\t\t\r\n\t\t\tlong elapsed_time1 = stopwatch.ElapsedMilliseconds;\r\n\t\t\tlong elapsed_time2= elapsed_time1-elapsed_time;\r\n\t\t\tif (elapsed_time2>95)\r\n\t\t\telapsed_time2=95;\t\t//minimum time\r\n\t\t\t\tThread.Sleep(100-(int )(elapsed_time2));\r\n\r\n\t\t\telapsed_time = stopwatch.ElapsedMilliseconds;\t\t\r\n\r\n\r\n\t\t\tj++;\r\n\t\t\t\tif (j==10)\r\n\t\t\t\t{\r\n\t\t\t\t\tj=0;\r\n\t\t\t\t\tcontext.WriteLine(Dispenser_press[Dispenser]+ \" mBar\\t\"+state + \"\\tTime-\" + (elapsed_time/1000));\r\n\t\t\t\t}\r\n\t}\r\n\ttime_Table=elapsed_time;\r\n\treturn 0;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////\t\r\nInt32 Motor_Run(Int32 speed,Int32 Dispenser)\r\n\r\n{\r\n\r\n\tswitch (Dispenser)\r\n\t\t{\r\n\t\tcase 0:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[0]=2;\r\n\t\t\t\t\tif ((RD_LS_01_Direct & 0x04)!=0x04)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor1, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[0]=1;\r\n\t\t\t\t\tif ((RD_LS_01_Direct & 0x20)!=0x20)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor1, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 1:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[1]=2;\r\n\t\t\t\t\tif ((RD_LS_01_Direct & 0x100)!=0x100)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor2, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[1]=1;\r\n\t\t\t\t\tif ((RD_LS_01_Direct & 0x800)!=0x800)\r\n\t\t\t\t\t{\t\t\t\t\t\t\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor2, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 2:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[2]=2;\r\n\t\t\t\t\tif ((RD_LS_02_Direct & 0x04)!=0x04)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor3, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[2]=1;\r\n\t\t\t\t\tif ((RD_LS_02_Direct & 0x20)!=0x20)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now+ \",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor3, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 3:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[3]=2;\r\n\r\n\t\t\t\t\tif ((RD_LS_02_Direct & 0x100)!=0x100)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now+ \",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor4, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[3]=1;\r\n\r\n\t\t\t\t\tif ((RD_LS_02_Direct & 0x800)!=0x800)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor4, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\t\t\r\n\t\tcase 4:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[4]=2;\r\n\t\t\t\t\tif ((RD_LS_03_Direct & 0x04)!=0x04)\r\n\t\t\t\t\t{ \r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now+ \",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor5, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[4]=1;\r\n\t\t\t\t\tif ((RD_LS_03_Direct & 0x20)!=0x20)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now+ \",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor5, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 5:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[5]=2;\r\n\t\t\t\t\tif ((RD_LS_03_Direct & 0x100)!=0x100)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor6, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[5]=1;\r\n\t\t\t\t\tif ((RD_LS_03_Direct & 0x800)!=0x800)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now+ \",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor6, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 6:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[6]=2;\r\n\t\t\t\t\tif ((RD_LS_04_Direct & 0x04)!=0x04)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor7, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[6]=1;\r\n\t\t\t\t\tif ((RD_LS_04_Direct & 0x20)!=0x20)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor7, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 7:\r\n\t\t\t\tif ( speed<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tMotor_Dir[7]=2;\r\n\r\n\t\t\t\t\tif ((RD_LS_04_Direct & 0x100)!=0x100)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor8, false, (-speed));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\t\r\n\t\t\t\t\tMotor_Dir[7]=1;\r\n\r\n\t\t\t\t\tif ((RD_LS_04_Direct & 0x800)!=0x800)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Motor on Limit\\n\");\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontext.Send<StubMotorRunResponse>(\"StubMotorRunRequest\" ,Dispenser_Motor8, true, (speed));\r\n\t\t\t\t}\r\n\t\t\tbreak;\r\n\t\t\t\r\n\t\tdefault:\r\n\t\t\tbreak;\r\n\r\n\t\t}\r\n \tcontext.AppendToFile(Dispenser_Fname,\",Run,\" +speed+\",\"+DateTime.Now +\"\\n\" ); \r\n\r\n\treturn 1;\r\n} \r\n \r\n \t\r\n Int32 Valve_3W(Int32 Valve_Value,Int32 Dispenser)\r\n{\r\n\tif ( Valve_Value==1)\r\n\t\tcontext.Send<StubValveResponse>(\"StubValveRequest\" ,Dispenser_Valve1+Dispenser, 3, true);\t//3 3Way\r\n\telse\t\r\n\t\tcontext.Send<StubValveResponse>(\"StubValveRequest\" ,Dispenser_Valve1+Dispenser, 3, false); //3 3Way\r\n \r\n\tcontext.AppendToFile(Dispenser_Fname,\",Dispenser Valve position is, \" + Valve_Value+\",\"+DateTime.Now +\"\\n\" );\r\n\r\n\treturn 1;\t\r\n}\t\r\n//--------------------------------------- \r\n\r\n Int32 Motor_Stop(Int32 Stop_Value,Int32 Dispenser )\r\n{\r\n\tcontext.Send<StubMotorStopResponse>(\"StubMotorStopRequest\" ,Dispenser_Motor1+Dispenser, Stop_Value);\r\n\t\r\n\tcontext.AppendToFile(Dispenser_Fname,\",Motor Stop,\" + Stop_Value+\",\"+DateTime.Now +\"\\n\");\r\n\tMotor_Dir[Dispenser]=0;\r\n\treturn 1;\t\r\n}\r\n\r\n//--------------------------------------- \r\n\r\n Int32 Delay_on_second(Int32 Delay,Int32 Dispenser )\r\n{\r\n//Int32 temp1;\r\nInt32 pressure_om_mBAR=0;\r\n\tif \t(Temp_Delay ==0)\r\n\t{\r\n\t\tcontext.AppendToFile(Dispenser_Fname,\",DLY, \" + Delay +\",\"+DateTime.Now+\"\\n\");\r\n\t\tTemp_Delay = Delay *10 -1;\r\n//\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontext.Write(\"A\");\t\t//debug\r\n\t}\r\n\telse\t\r\n\t\t\tTemp_Delay--;\r\n\t\t\t\r\n\tif ( LimitSW_Dispenser(Dispenser)==0)\r\n \t {\t\r\n \t \tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now+\",Warning Motor on Limit\\n\");\r\n\t\t\tMotorStop(Dispenser);\r\n\t\t\tTemp_Delay =0;\t//end delay\r\n//\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontext.Write(\"C\");\t\t//debug\r\n\r\n\t\t\treturn 0 ;\r\n \t }\r\n\t\t\t\t\t\r\n\tpressure_om_mBAR=Calc_mBAR(Dispenser,true);\r\n \tif (pressure_om_mBAR > max_pressure_level)\r\n \t \t{\r\n\t\t//\tMotorStop(Dispenser);\r\n\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Pressure too high\\n\");\r\n\t\t\tTemp_Delay =0;\t//end delay\r\n//\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontext.Write(\"D\");\t\t//debug\r\n\t\t\t\r\n\t\t\treturn 0;\r\n\t\t}\r\n \tif (pressure_om_mBAR < min_pressure_level)\r\n \t \t{\r\n\t\t//\tMotorStop(Dispenser);\r\n\t\t\tcontext.AppendToFile(Dispenser_Fname,\",,,\"+DateTime.Now +\",Warning Pressure too low\\n\");\r\n\t\t\tTemp_Delay =0;\t//end delay\r\n//\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontext.Write(\"D\");\t\t//debug\r\n\t\t\t\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t\r\n\t\t\r\n \treturn 1;\r\n}\t\r\n \t \t\r\nInt32 LimitSW_Dispenser(Int32 Dispenser) \r\n{\r\n\r\n\tif (Dispenser==0)\r\n\t\t\r\n\t\t{\r\n\t\t\t\r\n//\t\tvar response1 = context.Send<StubFpgaReadRegResponse>(\"StubFpgaReadRegRequest\" ,F2_LS_01_Direct);\r\n\r\n\t\t\t\tif (((RD_LS_01_Direct & 0x04)!=0x04) && (Motor_Dir[0]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_01_Direct & 0x20)!=0x20) && (Motor_Dir[0]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t}\r\n\t\t\r\n\tif (Dispenser==1)\r\n\t\t\r\n\t\t{\r\n//\t\tvar response2 = context.Send<StubFpgaReadRegResponse>(\"StubFpgaReadRegRequest\" ,F2_LS_01_Direct);\r\n\t\t\t\tif (((RD_LS_01_Direct & 0x100)!=0x100) && (Motor_Dir[1]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_01_Direct & 0x800)!=0x800) && (Motor_Dir[1]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t}\r\n\t\t\r\n\r\n\tif (Dispenser==2)\r\n\t\t\r\n\t\t{\r\n\t\t\t\t\r\n\t\t//var response3 = context.Send<StubFpgaReadRegResponse>(\"StubFpgaReadRegRequest\" ,F2_LS_02_Direct);\r\n\t\t\t\tif (((RD_LS_02_Direct & 0x04)!=0x04) && (Motor_Dir[2]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_02_Direct & 0x20)!=0x20) && (Motor_Dir[2]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\tif (Dispenser==3)\r\n\t\t\r\n\t\t{\r\n\t\t\t\tvar response4 = context.Send<StubFpgaReadRegResponse>(\"StubFpgaReadRegRequest\" ,F2_LS_02_Direct);\r\n\t\t\t\tif (((RD_LS_02_Direct & 0x100)!=0x100) && (Motor_Dir[3]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_02_Direct & 0x800)!=0x800) && (Motor_Dir[3]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t\r\n\r\n\tif (Dispenser==4)\r\n\t\t\r\n\t\t{\r\n\t\t\t\r\n//\t\tvar response1 = context.Send<StubFpgaReadRegResponse>(\"StubFpgaReadRegRequest\" ,F2_LS_01_Direct);\r\n\t\t\t\tif (((RD_LS_03_Direct & 0x04)!=0x04) && (Motor_Dir[4]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_03_Direct & 0x20)!=0x20) && (Motor_Dir[4]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t}\r\n\t\t\r\n\tif (Dispenser==5)\r\n\t\t\r\n\t\t{\r\n//\t\tvar response2 = context.Send<StubFpgaReadRegResponse>(\"StubFpgaReadRegRequest\" ,F2_LS_01_Direct);\r\n\t\t\t\tif (((RD_LS_03_Direct & 0x100)!=0x100) && (Motor_Dir[5]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_03_Direct & 0x800)!=0x800) && (Motor_Dir[5]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t}\r\n\t\t\r\n\r\n\tif (Dispenser==6)\r\n\t\t\r\n\t\t{\r\n\t\t\t\t\r\n\t\t//var response3 = context.Send<StubFpgaReadRegResponse>(\"StubFpgaReadRegRequest\" ,F2_LS_02_Direct);\r\n\t\t\t\tif (((RD_LS_04_Direct & 0x04)!=0x04) && (Motor_Dir[6]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_04_Direct & 0x20)!=0x20) && (Motor_Dir[6]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\tif (Dispenser==7)\r\n\t\t\r\n\t\t{\r\n//\t\tvar response4 = context.Send<StubFpgaReadRegResponse>(\"StubFpgaReadRegRequest\" ,F2_LS_02_Direct);\r\n\t\t\t\tif (((RD_LS_04_Direct & 0x100)!=0x100) && (Motor_Dir[7]==2))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\tif (((RD_LS_04_Direct & 0x800)!=0x800) && (Motor_Dir[7]==1))\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\telse\r\n\t\t\t\treturn 1;\t\t\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\treturn 0;\r\n}\t\t\r\n\t\t\r\n\t \t\r\nInt32 Print_Time() \r\n{\t\r\n\t\tcontext.AppendToFile(Dispenser_Fname,\",Time is\\t,,\"+ DateTime.Now +\"\\n\" ); \r\n\r\n\t\treturn 1;\r\n}\t\r\n\r\n\r\n\r\nInt32 Calc_mBAR(Int32 Dispenser, bool save_press)\r\n{\t\t\r\nInt32 Data;\r\nInt32 Sense1;\r\nInt32 temp=0;\r\n\r\n\t\tData =A2D_Dispenser[Dispenser];\r\n\t\tif (Data<100)\r\n\t\t\ttemp=-1;\r\n\t\tData=Data-710;\r\n\t\tif (Data<0)\r\n\t\tData=0;\r\n\r\n\t\tData=Data*(10000+PressureSensorType*1000)/2840;\t//\tfor -1 to 10 bar Press_Sensor_Type=1 else 0\r\n\t\tData=Data-1000*PressureSensorType; \t\t\t// for -1 to 10 bar\r\n\r\n\t\tif (temp==-1)\t\t\t\t\t\t//if SamplingInBits <100 then No pressure sensor exist\r\n\t\tSense1=-9999\t;\r\n\t\telse\t\r\n\t\tSense1=Data\t;\r\n\t\tif (\t((msec_index) % (Dispenser_sample_rate)) == 0)\r\n\t\t{\r\n\t\t\tcontext.AppendToFile(Dispenser_Fname,\"\" + Sense1+\"\\n\");\r\n\t\t}\r\n\t\tDispenser_press[Dispenser]=Sense1;\r\n\treturn Sense1;\r\n\t\t\t\r\n } \t\r\n\r\n \r\n//--------------------------------\r\nint open_midtank_valve (Int32 valve_type,Int32 valve_nm)\t\t//valve_type=0 is Air ,1 is Ink ; valve_nm 0-7\r\n{\r\n\tSetBit (F3_VALVE_OUT,((valve_type+1)*8)- valve_nm-1, 1);\r\n\treturn 1;\r\n\r\n}\r\n//--------------------------------\t\r\nint close_midtank_valve (Int32 valve_type,Int32 valve_nm)\t\t//valve_type=0 is Air ,1 is Ink ; valve_nm 0-7\r\n{\r\n\tSetBit (F3_VALVE_OUT,((valve_type+1)*8)- valve_nm-1, 0);\r\n\treturn 1;\r\n}\r\n//--------------------------------\r\nInt32 SetBit(Int32 Adr, Int32 BitNo, Int32 Bit)\r\n{\r\n\tInt32 BitMask;\r\n\r\n var response = context.Send<StubFpgaReadRegResponse>(\"StubFpgaReadRegRequest\" , F3_VALVE_OUT);\r\n\tInt32 RV = (Int32) response.Value & 0xffff;\r\n\t\r\n\t\r\n\tif (Bit == 0x1) \r\n\t{\r\n\t\tBitMask = 0x1 << BitNo;\r\n\t\tRV = RV | BitMask;\r\n\t\tcontext.Send<StubFpgaWriteRegResponse>(\"StubFpgaWriteRegRequest\" ,F3_VALVE_OUT , RV);\r\n\t}\r\n\telse if (Bit == 0x0)\r\n\t{\r\n\t\tBitMask = ~(0x1 << BitNo);\r\n\t\tRV = RV & BitMask;\r\n\t\tcontext.Send<StubFpgaWriteRegResponse>(\"StubFpgaWriteRegRequest\" ,F3_VALVE_OUT , RV);\r\n\t}\r\n\treturn 1;\r\n}\r\n//---------------------------------- \r\n void MotorStop(Int32 i)\r\n{\r\n \r\ncontext.Send<StubMotorStopResponse>(\"StubMotorStopRequest\" ,Dispenser_Motor1+i, 2);\r\nMotor_Dir[i]=0;\t//0 stop 1- up 2-dn\r\n\r\n}\r\n \r\n}","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Entities;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[]},"Variables":{"$id":"6","$values":[]},"ReferenceAssemblies":{"$id":"7","$values":[{"$id":"8","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"9","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"10","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"11","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"12","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"13","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"14","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"15","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"16","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"17","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"18","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Resources":{"$id":"19","$values":[]},"Dialogs":{"$id":"20","$values":[]},"ID":"eb73dbd4-1e1e-4f5d-adc8-5f159edab802","ApartmentState":"STA"} \ No newline at end of file
diff --git a/Software/Stubs Collection/Procedures/Priming1.pproj b/Software/Stubs Collection/Procedures/Priming1.pproj
new file mode 100644
index 000000000..adfed3f3e
--- /dev/null
+++ b/Software/Stubs Collection/Procedures/Priming1.pproj
@@ -0,0 +1,1015 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Drawing;
+using Google.Protobuf;
+using Tango.BL.Entities;
+using Tango.BL.Enumerations;
+using Tango.PMR.Stubs;
+using Tango.PMR.Diagnostics;
+using Tango.FSE.Common.Connection;
+using Tango.FSE.Common.Diagnostics;
+using Tango.FSE.Procedures;
+using System.IO;
+using System.Diagnostics;
+using System.Windows.Forms;
+
+
+public class Program
+{
+
+
+private IProcedureContext context;
+
+//---------------------Start Command ----------------
+const Int32 CMD_RUN = 0; //Run on Pulse Per Secound .positive run Up and negative run Down b
+const Int32 CMD_STOP= 1; //0;Hard stop(Defualt);1-Soft stop;2-Hard Hiz;3-Soft Hiz
+const Int32 CMD_VALVE= 2; //0-to Midtank ,1-to head
+const Int32 CMD_DLY = 3; //delay in Seconds .
+const Int32 CMD_TIME= 4; //Print Time .
+const Int32 CMD_PRESS= 5; //return from Delay loop when pressure is high (on mBAR) .
+const Int32 CMD_LOOP_NM=6; //NUMBER OF counter
+const Int32 CMD_LOOP= 7; //jump up(+) or down(-) command u
+const Int32 CMD_MTV_OPEN = 8; //0 Air ; 1 Ink
+const Int32 CMD_MTV_CLOSE= 9; //0 Air ; 1 Ink
+const Int32 CMD_LBL= 10; //label for user
+const Int32 CMD_SMP= 11; //sample rate ,defualt 100msec (1); for 1 second is 10.
+const Int32 CMD_PRESL= 12; //return from Delay loop when pressure is low (on mBAR) .
+
+const Int32 CMD_END = 13; //end loop .
+
+
+Int32[] BuildUp_Table = new int []
+{
+ CMD_VALVE,1,
+ CMD_PRESL,200,
+ CMD_DLY,200,
+
+ CMD_LOOP_NM,3,
+
+ CMD_VALVE,0,
+ CMD_DLY,1,
+ CMD_VALVE,1,
+ CMD_DLY,1,
+ CMD_LOOP,-4,
+
+ CMD_VALVE,0,
+ CMD_RUN,1068,
+ CMD_PRESS,1000, //mbar --> 1000 = 100% work, 4000 = 200% work, 350 = 20% work
+ CMD_DLY,150,
+ CMD_LBL,1,
+ CMD_PRESS,2000, //mbar --> 2000 = 100% work, 4000 = 200% work, 350 = 20% work
+ CMD_DLY,60,
+ CMD_LBL,2,
+ CMD_PRESS,3000,
+ CMD_DLY,60, // to limit
+ CMD_STOP,0,
+ CMD_VALVE,1,
+ CMD_END,3,
+};
+
+
+Int32[] Up_Table = new int []
+{
+ CMD_VALVE,1,
+ CMD_PRESL,200,
+ CMD_DLY,200,
+
+ CMD_PRESS,3000, //mbar --> 1000 = 100% work, 4000 = 200% work, 350 = 20% work
+ CMD_RUN,534, // 100%
+ CMD_DLY,120,
+ CMD_STOP,0,
+ CMD_END,3,
+};
+Int32 Dispenser_sample_rate= 1;
+
+ string path = @"C:\Dispenser_setup\Log\";
+//----------------------
+const UInt32 I2C_ID = 4; //MCU_I2C4
+const UInt32 TCA9548A_address = 0xE2;
+const UInt32 I2C_Slave_Low_Add = 0xA0; //eeprom address - 64k low
+const UInt32 I2C_Slave_High_Add = 0xA2; //eeprom address - 64k High
+//----------------------
+byte [] EEPROM_Data = new byte [128];
+
+
+//---------------------End Command ----------------
+
+const Int32 Dispenser_Motor1 = 6;
+const Int32 Dispenser_Motor2 = 7;
+const Int32 Dispenser_Motor3 = 8;
+const Int32 Dispenser_Motor4 = 9;
+const Int32 Dispenser_Motor5 = 10;
+const Int32 Dispenser_Motor6 = 11;
+const Int32 Dispenser_Motor7 = 12;
+const Int32 Dispenser_Motor8 = 13;
+
+const Int32 AN_IDS_PRESSENS_1 = 2;
+const Int32 AN_IDS_PRESSENS_2 = 3;
+const Int32 AN_IDS_PRESSENS_3 = 4;
+const Int32 AN_IDS_PRESSENS_4 = 5;
+const Int32 AN_IDS_PRESSENS_5 = 6;
+const Int32 AN_IDS_PRESSENS_6 = 7;
+const Int32 AN_IDS_PRESSENS_7 = 8;
+const Int32 AN_IDS_PRESSENS_8 = 9;
+
+const Int32 F2_LS_01_Direct = 0x60000420 ; // Reads the direct values that are currently being sent to the fpga. rsv rsv rsv rsv F2_LS_DISPENSER_UP_2 F2_LS_DISPENSER_25_2 F2_LS_DISPENSER_75_2 F2_LS_DISPENSER_DOWN_2 F2_LS_DISPENSER_50_2 F2_LS_DISPENSER_SPARE_2 F2_LS_DISPENSER_UP_1 F2_LS_DISPENSER_25_1 F2_LS_DISPENSER_75_1 F2_LS_DISPENSER_DOWN_1 F2_LS_DISPENSER_50_1 F2_LS_DISPENSER_SPARE_1
+const Int32 F2_LS_02_Direct = 0x60000430 ; // Reads the direct values that are currently being sent to the fpga. rsv rsv rsv rsv F2_LS_DISPENSER_UP_4 F2_LS_DISPENSER_25_4 F2_LS_DISPENSER_75_4 F2_LS_DISPENSER_DOWN_4 F2_LS_DISPENSER_50_4 F2_LS_DISPENSER_SPARE_4 F2_LS_DISPENSER_UP_3 F2_LS_DISPENSER_25_3 F2_LS_DISPENSER_75_3 F2_LS_DISPENSER_DOWN_3 F2_LS_DISPENSER_50_3 F2_LS_DISPENSER_SPARE_3
+const Int32 F2_LS_03_Direct = 0x60000440 ; // Reads the direct values that are currently being sent to the fpga. rsv rsv rsv rsv F2_LS_DISPENSER_UP_6 F2_LS_DISPENSER_25_6 F2_LS_DISPENSER_75_6 F2_LS_DISPENSER_DOWN_6 F2_LS_DISPENSER_50_6 F2_LS_DISPENSER_SPARE_6 F2_LS_DISPENSER_UP_5 F2_LS_DISPENSER_25_5 F2_LS_DISPENSER_75_5 F2_LS_DISPENSER_DOWN_5 F2_LS_DISPENSER_50_5 F2_LS_DISPENSER_SPARE_5
+const Int32 F2_LS_04_Direct = 0x60000480 ; // Reads the direct values that are currently being sent to the fpga. rsv rsv rsv rsv F2_LS_DISPENSER_UP_8 F2_LS_DISPENSER_25_8 F2_LS_DISPENSER_75_8 F2_LS_DISPENSER_DOWN_8 F2_LS_DISPENSER_50_8 F2_LS_DISPENSER_SPARE_8 F2_LS_DISPENSER_UP_7 F2_LS_DISPENSER_25_7 F2_LS_DISPENSER_75_7 F2_LS_DISPENSER_DOWN_7 F2_LS_DISPENSER_50_7 F2_LS_DISPENSER_SPARE_7
+
+const Int32 Dispenser_Valve1 = 0;
+const Int32 Dispenser_Valve2 = 1;
+const Int32 Dispenser_Valve3 = 2;
+const Int32 Dispenser_Valve4 = 3;
+const Int32 Dispenser_Valve5 = 4;
+const Int32 Dispenser_Valve6 = 5;
+const Int32 Dispenser_Valve7 = 6;
+const Int32 Dispenser_Valve8 = 7;
+
+const ushort MinPress_Mbar_Add =0x5c ;
+const ushort MaxPress_Mbar_Add =0x60 ;
+
+const Int32 F3_VALVE_OUT = 0x600000e2;
+
+//string path = "C:\\Dispenser_setup\\Log\\";
+
+
+//Int32[] Start_Table;
+
+Int32[] Start_Table = new Int32 [10000];
+
+UInt32 [] Motor_Dir=new UInt32 [8] {0,0,0,0,0,0,0,0};
+
+string Dispenser_Fname ;
+
+Int32 Dispenser_ptr =-1;
+
+Int32 [] Dispenser_press= new Int32[8]{0,0,0,0,0,0,0,0};
+Int32 max_pressure_level = 20000;
+Int32 min_pressure_level = -20000;
+
+Int32 [] A2D_Dispenser= new Int32[8]{0,0,0,0,0,0,0,0};
+Int32 Loop_cnt= 1;
+Int32 Loop_length=1;
+
+Int32 PressureSensorType= 1; //1- new -1up +10 . 0-old 0 to +10
+Int32 Temp_Delay=0;
+
+
+UInt32 RD_LS_01_Direct;
+UInt32 RD_LS_02_Direct;
+UInt32 RD_LS_03_Direct;
+UInt32 RD_LS_04_Direct;
+
+long Lebel1_time;
+long Lebel2_time;
+
+long time_Table;
+
+Int32 msec_index=0;
+
+Int32 MaxPress_Mbar;
+Int32 MinPress_Mbar;
+string state;
+
+ public Int32 OnExecute(IProcedureContext context)
+ {
+ long Max_PBU;
+ Int32 Index=0;
+ Int32 speed=0;
+ Int32 Dispenser_Nm;
+ this.context = context;
+
+ string box_msg = "Make sure Mixer Hot ";
+ MessageBox.Show(box_msg);
+
+ var response1 = context.RequestUserInputFor<String>("Dispenser Number", "Enter Dispenser number to make priming (1-8):");
+ context.WriteLine(response1);
+ Dispenser_Nm = Int32.Parse(response1);
+
+ check_Min_Max_Mbar(Dispenser_Nm);
+
+ if (Dispenser_Nm==8)
+ Max_PBU=6000;
+ else
+ Max_PBU=4000;
+
+
+ if (!Directory.Exists(path))
+ {
+ Directory.CreateDirectory(path);
+ }
+ context.WriteLine(path);
+
+ context.Send<ProgressResponse>("ProgressRequest" ,0xe0, 1);
+
+ Dispenser_Fname=path + "Dispenser_Nm_" + Dispenser_Nm+"_" + DateTime.Now.ToString("MM-dd-yy hh-mm")+ ".csv" ;
+
+ context.WriteLine(Dispenser_Fname);
+
+ context.WriteToFile(Dispenser_Fname,"Dispenser Nm," + Dispenser_Nm + "\n" );
+ context.AppendToFile(Dispenser_Fname,"Pressure,Command,Value,DateTime,Remark\n" );
+ for(int j=0; j<2;j++)
+ {
+ for(int i=0; i<4;i++)
+ {
+ state="PBU No. "+ (4*j+i+1 );
+ Start_Table=BuildUp_Table;
+ Table_Run(Dispenser_Nm );
+ if (time_Table>300000)
+ {
+ context.AddResult(ResultType.Failed,"PBU", "PBU No."+ (4*j+i+1 ) + " Fail");
+ return 0;
+ }
+ context.AddResult(ResultType.Passed,"PBU","PBU No."+ (4*j+i+1 ) + " Pass");
+
+ }
+ state="Flow No."+ (j+1 ) ;
+ Start_Table=Up_Table;
+ Table_Run(Dispenser_Nm );
+ if (time_Table<115000)
+ {
+ context.WriteLine("time_Table= " +time_Table);
+ context.AddResult(ResultType.Failed,"Flow", "Flow No."+ (j+1) + " Fail");
+ return 0;
+ }
+ context.AddResult(ResultType.Passed,"Flow","Flow No."+ (j+1 ) + " Pass");
+
+ }
+ state="Last PBU " ;
+ Start_Table=BuildUp_Table;
+ Table_Run(Dispenser_Nm );
+ long Time=Lebel2_time-Lebel1_time;
+ if (Time>Max_PBU)
+ {
+ context.AddResult(ResultType.Failed,"PBU", "PBU = " +Time + "msec ");
+ state="PBU = " +Time + "msec \tFail";
+ }
+ else
+ {
+ context.AddResult(ResultType.Passed,"PBU", "PBU = " +Time + "msec ");
+ state="PBU = " +Time + "msec \tPass";
+ }
+ return 0;
+
+ }
+
+/////////////////////////////////////////////
+void check_Min_Max_Mbar(Int32 i )
+{
+ int k;
+ string s ;
+ i--;
+
+ context.WriteLine("-------------- write Enable Channel ------------"); //debug
+ enable_channel(i); // Chanel 0-7 => Disp0enser 0-7
+ context.WriteLine("-------------- Read_header ------------"); //debug
+
+ context.WriteLine("-------------- write_address_eeprom ------------"); //debug
+ write_address_eeprom (I2C_Slave_Low_Add,MinPress_Mbar_Add);
+ context.WriteLine("-------------- read_data_from_eeprom ------------"); //debug
+ read_data_from_eeprom (I2C_Slave_Low_Add,1);
+ if (EEPROM_Data[0]==0 )
+ { PressureSensorType=0;
+ context.WriteLine("PressureSensorType=0" ); //debug
+ }
+ else
+ {
+ PressureSensorType=1;
+ context.WriteLine("PressureSensorType=1" ); //debug
+ }
+
+}
+//----------------write address eeprom -------------------------
+public void write_address_eeprom (UInt32 I2C_Add, UInt32 Eeprom_Add)
+{
+ StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();
+ stubI2CWriteBytesRequest.I2CId = I2C_ID;
+ stubI2CWriteBytesRequest.SlaveAddress = I2C_Add;
+
+ UInt32 uInt32 = new UInt32();
+ stubI2CWriteBytesRequest.BytesTWrite.Add(Convert.ToByte( (Eeprom_Add & 0xff00) >>8)); //Byte High add to write
+ stubI2CWriteBytesRequest.BytesTWrite.Add(Convert.ToByte(Eeprom_Add & 0xff)); //Byte Low add to write
+ context.WriteLine( (Eeprom_Add & 0xff00) >>8) ; //debug
+ context.WriteLine( Eeprom_Add & 0xff); //debug
+
+ context.Send<StubI2CWriteBytesResponse>(stubI2CWriteBytesRequest);
+}
+//------------------- read Data from EEprom--------------------------
+
+public void read_data_from_eeprom ( UInt32 I2C_Add, UInt32 cnt )
+{
+ StubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest();
+ stubI2CReadBytesRequest.I2CId = I2C_ID;
+ stubI2CReadBytesRequest.SlaveAddress = (I2C_Add + 1);
+ stubI2CReadBytesRequest.NumberOfBytesToRead = cnt; // Number of bytes to read
+
+ var response1 = context.Send<StubI2CReadBytesResponse>(stubI2CReadBytesRequest);
+
+ for(int i=0; i<cnt;i++)
+ {
+ EEPROM_Data[i]=Convert.ToByte(response1.ReadBytes[i]);
+ context.WriteLine(EEPROM_Data[i] ); //debug
+
+ }
+}
+
+
+///////////////////////////////////////////////
+//----------- enable I2c channel --------------
+public int enable_channel(Int32 Channel_ID)
+{
+ uint Const_temp = 0x01;
+
+ StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();
+ stubI2CWriteBytesRequest.I2CId = I2C_ID;
+ stubI2CWriteBytesRequest.SlaveAddress = TCA9548A_address;
+
+ Const_temp = Const_temp << Channel_ID;
+ stubI2CWriteBytesRequest.BytesTWrite.Add(Const_temp);//enable i2c channel 0 Dispenser 1
+
+ var response = context.Send<StubI2CWriteBytesResponse>(stubI2CWriteBytesRequest);
+
+ return 1;
+}
+
+
+//////////////////////////////////////////////////////////////
+Int32 Table_Run(Int32 Dispenser )
+
+{
+ Int32 COMMAND=0;
+ Int32 Data=0;
+ Int32 count=0;
+
+ Dispenser--; //check from 0-7
+
+ int j=0;
+ var stopwatch = new Stopwatch();
+ stopwatch.Start();
+
+ long elapsed_time = stopwatch.ElapsedMilliseconds;
+ context.WriteLine(elapsed_time);
+
+ while (count!=-1)
+ {
+ msec_index=msec_index+1;
+
+ if (Dispenser<2)
+ {
+ var response1 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_01_Direct);
+ RD_LS_01_Direct=response1.Value ;
+ }
+ else if ( (Dispenser<4) )
+ {
+ var response1 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_02_Direct);
+ RD_LS_02_Direct=response1.Value ;
+ }
+ else if ( (Dispenser<6) )
+ {
+ var response1 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_03_Direct);
+ RD_LS_03_Direct=response1.Value ;
+ }
+ else
+ {
+ var response1 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_04_Direct);
+ RD_LS_04_Direct=response1.Value ;
+ }
+ if (Dispenser<4)
+ {
+ var response2 = context.Send<StubIntADCReadResponse>("StubIntADCReadRequest" ,0x8000 + AN_IDS_PRESSENS_1);
+ A2D_Dispenser[0]=(response2.SamplingInBits)>>16;
+ A2D_Dispenser[1] =(response2.SamplingInBits) & 0x0000ffff;
+ A2D_Dispenser[2] =(response2.VoltageSamplingMv)>>16;
+ A2D_Dispenser[3] =(response2.VoltageSamplingMv) & 0x0000ffff;
+ }
+ else
+ {
+ var response3 = context.Send<StubIntADCReadResponse>("StubIntADCReadRequest" ,0x8000 + AN_IDS_PRESSENS_5);
+ A2D_Dispenser[4] =(response3.SamplingInBits)>>16;
+ A2D_Dispenser[5] =(response3.SamplingInBits)& 0x0000ffff;
+ A2D_Dispenser[6] =(response3.VoltageSamplingMv)>>16;
+ A2D_Dispenser[7] =(response3.VoltageSamplingMv)& 0x0000ffff;
+ }
+
+ COMMAND=Start_Table[count];
+ Data=Start_Table[(count+1)];
+ //Index=Index+2;
+ switch (COMMAND)
+ {
+ case CMD_RUN:
+ Motor_Run(Data,Dispenser);
+ count = count+2;
+ break;
+
+ case CMD_VALVE:
+ Valve_3W(Data,Dispenser);
+ count = count+2;
+ break;
+
+ case CMD_STOP:
+ Motor_Stop(Data,Dispenser);
+ count = count+2;
+ break;
+
+ case CMD_DLY:
+ Delay_on_second(Data,Dispenser);
+ if (Temp_Delay ==0)
+ {
+ max_pressure_level=20000;
+ min_pressure_level=-20000;
+ count = count+2;
+ }
+ break;
+
+ case CMD_TIME:
+ Print_Time();
+ count = count+2;
+ break;
+
+ case CMD_PRESS:
+ max_pressure_level=Data;
+ context.AppendToFile(Dispenser_Fname,",Max_pressure_level is, " + Data +","+DateTime.Now+"\n");
+ count = count+2;
+ break;
+
+ case CMD_PRESL:
+ min_pressure_level=Data;
+ context.AppendToFile(Dispenser_Fname,",Min_pressure_level is, " + Data +","+DateTime.Now+"\n");
+ count = count+2;
+ break;
+
+ case CMD_LBL:
+ context.AppendToFile(Dispenser_Fname,",Label," + Data+","+DateTime.Now+"\n");
+ if(Data==1)
+ Lebel1_time=stopwatch.ElapsedMilliseconds;
+ if(Data==2)
+ Lebel2_time=stopwatch.ElapsedMilliseconds;
+ count = count+2;
+ break;
+
+
+ case CMD_SMP:
+ context.AppendToFile(Dispenser_Fname,",SampleRate," + Data+","+DateTime.Now+"\n");
+ Dispenser_sample_rate =Data;
+ count = count+2;
+ break;
+
+ case CMD_END:
+ count=-1;
+ context.AppendToFile(Dispenser_Fname,",End testing,,"+DateTime.Now+"\n");
+ break;
+
+ case CMD_MTV_OPEN:
+ open_midtank_valve(Data,Dispenser);
+ context.AppendToFile(Dispenser_Fname,",OPEN MIDTANK, " + Dispenser+","+DateTime.Now+"\n");
+ count = count+2;
+ break;
+
+ case CMD_MTV_CLOSE:
+ close_midtank_valve(Data,Dispenser);
+ context.AppendToFile(Dispenser_Fname,",CLOSE MIDTANK, " + Dispenser+","+DateTime.Now+"\n");
+ count = count+2;
+ break;
+
+ case CMD_LOOP_NM:
+
+ Loop_cnt=Data-1;
+ context.AppendToFile(Dispenser_Fname,",Counter Loop,"+ Data+","+DateTime.Now +"\n");
+ count = count+2;
+ break;
+
+ case CMD_LOOP:
+
+ if (Loop_cnt!=0)
+ {
+ context.AppendToFile(Dispenser_Fname,"Counter Loop,"+ Loop_cnt+","+DateTime.Now+"\n" );
+ count = count+2*Data;
+ Loop_cnt--;
+
+ }
+ else
+ {
+ context.AppendToFile(Dispenser_Fname,",End loop,,"+DateTime.Now +"\n");
+ count = count+2;
+ }
+ break;
+
+ default:
+ break;
+
+ }
+
+ long elapsed_time1 = stopwatch.ElapsedMilliseconds;
+ long elapsed_time2= elapsed_time1-elapsed_time;
+ if (elapsed_time2>95)
+ elapsed_time2=95; //minimum time
+ Thread.Sleep(100-(int )(elapsed_time2));
+
+ elapsed_time = stopwatch.ElapsedMilliseconds;
+
+
+ j++;
+ if (j==10)
+ {
+ j=0;
+ context.WriteLine(Dispenser_press[Dispenser]+ " mBar\t"+state + "\tTime-" + (elapsed_time/1000));
+ }
+ }
+ time_Table=elapsed_time;
+ return 0;
+}
+
+///////////////////////////////////////////////////////////////////
+Int32 Motor_Run(Int32 speed,Int32 Dispenser)
+
+{
+
+ switch (Dispenser)
+ {
+ case 0:
+ if ( speed<0)
+ {
+ Motor_Dir[0]=2;
+ if ((RD_LS_01_Direct & 0x04)!=0x04)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor1, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[0]=1;
+ if ((RD_LS_01_Direct & 0x20)!=0x20)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor1, true, (speed));
+ }
+ break;
+
+ case 1:
+ if ( speed<0)
+ {
+ Motor_Dir[1]=2;
+ if ((RD_LS_01_Direct & 0x100)!=0x100)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor2, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[1]=1;
+ if ((RD_LS_01_Direct & 0x800)!=0x800)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor2, true, (speed));
+ }
+ break;
+
+ case 2:
+ if ( speed<0)
+ {
+ Motor_Dir[2]=2;
+ if ((RD_LS_02_Direct & 0x04)!=0x04)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor3, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[2]=1;
+ if ((RD_LS_02_Direct & 0x20)!=0x20)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor3, true, (speed));
+ }
+ break;
+
+ case 3:
+ if ( speed<0)
+ {
+ Motor_Dir[3]=2;
+
+ if ((RD_LS_02_Direct & 0x100)!=0x100)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor4, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[3]=1;
+
+ if ((RD_LS_02_Direct & 0x800)!=0x800)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor4, true, (speed));
+ }
+ break;
+
+ case 4:
+ if ( speed<0)
+ {
+ Motor_Dir[4]=2;
+ if ((RD_LS_03_Direct & 0x04)!=0x04)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n");
+ return 0;
+ }
+
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor5, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[4]=1;
+ if ((RD_LS_03_Direct & 0x20)!=0x20)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor5, true, (speed));
+ }
+ break;
+
+ case 5:
+ if ( speed<0)
+ {
+ Motor_Dir[5]=2;
+ if ((RD_LS_03_Direct & 0x100)!=0x100)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor6, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[5]=1;
+ if ((RD_LS_03_Direct & 0x800)!=0x800)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor6, true, (speed));
+ }
+ break;
+
+ case 6:
+ if ( speed<0)
+ {
+ Motor_Dir[6]=2;
+ if ((RD_LS_04_Direct & 0x04)!=0x04)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor7, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[6]=1;
+ if ((RD_LS_04_Direct & 0x20)!=0x20)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor7, true, (speed));
+ }
+ break;
+
+ case 7:
+ if ( speed<0)
+ {
+ Motor_Dir[7]=2;
+
+ if ((RD_LS_04_Direct & 0x100)!=0x100)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor8, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[7]=1;
+
+ if ((RD_LS_04_Direct & 0x800)!=0x800)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor8, true, (speed));
+ }
+ break;
+
+ default:
+ break;
+
+ }
+ context.AppendToFile(Dispenser_Fname,",Run," +speed+","+DateTime.Now +"\n" );
+
+ return 1;
+}
+
+
+ Int32 Valve_3W(Int32 Valve_Value,Int32 Dispenser)
+{
+ if ( Valve_Value==1)
+ context.Send<StubValveResponse>("StubValveRequest" ,Dispenser_Valve1+Dispenser, 3, true); //3 3Way
+ else
+ context.Send<StubValveResponse>("StubValveRequest" ,Dispenser_Valve1+Dispenser, 3, false); //3 3Way
+
+ context.AppendToFile(Dispenser_Fname,",Dispenser Valve position is, " + Valve_Value+","+DateTime.Now +"\n" );
+
+ return 1;
+}
+//---------------------------------------
+
+ Int32 Motor_Stop(Int32 Stop_Value,Int32 Dispenser )
+{
+ context.Send<StubMotorStopResponse>("StubMotorStopRequest" ,Dispenser_Motor1+Dispenser, Stop_Value);
+
+ context.AppendToFile(Dispenser_Fname,",Motor Stop," + Stop_Value+","+DateTime.Now +"\n");
+ Motor_Dir[Dispenser]=0;
+ return 1;
+}
+
+//---------------------------------------
+
+ Int32 Delay_on_second(Int32 Delay,Int32 Dispenser )
+{
+//Int32 temp1;
+Int32 pressure_om_mBAR=0;
+ if (Temp_Delay ==0)
+ {
+ context.AppendToFile(Dispenser_Fname,",DLY, " + Delay +","+DateTime.Now+"\n");
+ Temp_Delay = Delay *10 -1;
+// context.Write("A"); //debug
+ }
+ else
+ Temp_Delay--;
+
+ if ( LimitSW_Dispenser(Dispenser)==0)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+",Warning Motor on Limit\n");
+ MotorStop(Dispenser);
+ Temp_Delay =0; //end delay
+// context.Write("C"); //debug
+
+ return 0 ;
+ }
+
+ pressure_om_mBAR=Calc_mBAR(Dispenser,true);
+ if (pressure_om_mBAR > max_pressure_level)
+ {
+ // MotorStop(Dispenser);
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Pressure too high\n");
+ Temp_Delay =0; //end delay
+// context.Write("D"); //debug
+
+ return 0;
+ }
+ if (pressure_om_mBAR < min_pressure_level)
+ {
+ // MotorStop(Dispenser);
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Pressure too low\n");
+ Temp_Delay =0; //end delay
+// context.Write("D"); //debug
+
+ return 0;
+ }
+
+
+ return 1;
+}
+
+Int32 LimitSW_Dispenser(Int32 Dispenser)
+{
+
+ if (Dispenser==0)
+
+ {
+
+// var response1 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_01_Direct);
+
+ if (((RD_LS_01_Direct & 0x04)!=0x04) && (Motor_Dir[0]==2))
+ return 0;
+ else
+ if (((RD_LS_01_Direct & 0x20)!=0x20) && (Motor_Dir[0]==1))
+ return 0;
+ else
+ return 1;
+ }
+
+ if (Dispenser==1)
+
+ {
+// var response2 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_01_Direct);
+ if (((RD_LS_01_Direct & 0x100)!=0x100) && (Motor_Dir[1]==2))
+ return 0;
+ else
+ if (((RD_LS_01_Direct & 0x800)!=0x800) && (Motor_Dir[1]==1))
+ return 0;
+ else
+ return 1;
+ }
+
+
+ if (Dispenser==2)
+
+ {
+
+ //var response3 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_02_Direct);
+ if (((RD_LS_02_Direct & 0x04)!=0x04) && (Motor_Dir[2]==2))
+ return 0;
+ else
+ if (((RD_LS_02_Direct & 0x20)!=0x20) && (Motor_Dir[2]==1))
+ return 0;
+ else
+ return 1;
+
+ }
+
+ if (Dispenser==3)
+
+ {
+ var response4 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_02_Direct);
+ if (((RD_LS_02_Direct & 0x100)!=0x100) && (Motor_Dir[3]==2))
+ return 0;
+ else
+ if (((RD_LS_02_Direct & 0x800)!=0x800) && (Motor_Dir[3]==1))
+ return 0;
+ else
+ return 1;
+ }
+
+
+
+
+ if (Dispenser==4)
+
+ {
+
+// var response1 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_01_Direct);
+ if (((RD_LS_03_Direct & 0x04)!=0x04) && (Motor_Dir[4]==2))
+ return 0;
+ else
+ if (((RD_LS_03_Direct & 0x20)!=0x20) && (Motor_Dir[4]==1))
+ return 0;
+ else
+ return 1;
+ }
+
+ if (Dispenser==5)
+
+ {
+// var response2 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_01_Direct);
+ if (((RD_LS_03_Direct & 0x100)!=0x100) && (Motor_Dir[5]==2))
+ return 0;
+ else
+ if (((RD_LS_03_Direct & 0x800)!=0x800) && (Motor_Dir[5]==1))
+ return 0;
+ else
+ return 1;
+ }
+
+
+ if (Dispenser==6)
+
+ {
+
+ //var response3 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_02_Direct);
+ if (((RD_LS_04_Direct & 0x04)!=0x04) && (Motor_Dir[6]==2))
+ return 0;
+ else
+ if (((RD_LS_04_Direct & 0x20)!=0x20) && (Motor_Dir[6]==1))
+ return 0;
+ else
+ return 1;
+
+ }
+
+ if (Dispenser==7)
+
+ {
+// var response4 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_02_Direct);
+ if (((RD_LS_04_Direct & 0x100)!=0x100) && (Motor_Dir[7]==2))
+ return 0;
+ else
+ if (((RD_LS_04_Direct & 0x800)!=0x800) && (Motor_Dir[7]==1))
+ return 0;
+ else
+ return 1;
+ }
+
+
+ return 0;
+}
+
+
+Int32 Print_Time()
+{
+ context.AppendToFile(Dispenser_Fname,",Time is\t,,"+ DateTime.Now +"\n" );
+
+ return 1;
+}
+
+
+
+Int32 Calc_mBAR(Int32 Dispenser, bool save_press)
+{
+Int32 Data;
+Int32 Sense1;
+Int32 temp=0;
+
+ Data =A2D_Dispenser[Dispenser];
+ if (Data<100)
+ temp=-1;
+ Data=Data-710;
+ if (Data<0)
+ Data=0;
+
+ Data=Data*(10000+PressureSensorType*1000)/2840; // for -1 to 10 bar Press_Sensor_Type=1 else 0
+ Data=Data-1000*PressureSensorType; // for -1 to 10 bar
+
+ if (temp==-1) //if SamplingInBits <100 then No pressure sensor exist
+ Sense1=-9999 ;
+ else
+ Sense1=Data ;
+ if ( ((msec_index) % (Dispenser_sample_rate)) == 0)
+ {
+ context.AppendToFile(Dispenser_Fname,"" + Sense1+"\n");
+ }
+ Dispenser_press[Dispenser]=Sense1;
+ return Sense1;
+
+ }
+
+
+//--------------------------------
+int open_midtank_valve (Int32 valve_type,Int32 valve_nm) //valve_type=0 is Air ,1 is Ink ; valve_nm 0-7
+{
+ SetBit (F3_VALVE_OUT,((valve_type+1)*8)- valve_nm-1, 1);
+ return 1;
+
+}
+//--------------------------------
+int close_midtank_valve (Int32 valve_type,Int32 valve_nm) //valve_type=0 is Air ,1 is Ink ; valve_nm 0-7
+{
+ SetBit (F3_VALVE_OUT,((valve_type+1)*8)- valve_nm-1, 0);
+ return 1;
+}
+//--------------------------------
+Int32 SetBit(Int32 Adr, Int32 BitNo, Int32 Bit)
+{
+ Int32 BitMask;
+
+ var response = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" , F3_VALVE_OUT);
+ Int32 RV = (Int32) response.Value & 0xffff;
+
+
+ if (Bit == 0x1)
+ {
+ BitMask = 0x1 << BitNo;
+ RV = RV | BitMask;
+ context.Send<StubFpgaWriteRegResponse>("StubFpgaWriteRegRequest" ,F3_VALVE_OUT , RV);
+ }
+ else if (Bit == 0x0)
+ {
+ BitMask = ~(0x1 << BitNo);
+ RV = RV & BitMask;
+ context.Send<StubFpgaWriteRegResponse>("StubFpgaWriteRegRequest" ,F3_VALVE_OUT , RV);
+ }
+ return 1;
+}
+//----------------------------------
+ void MotorStop(Int32 i)
+{
+
+context.Send<StubMotorStopResponse>("StubMotorStopRequest" ,Dispenser_Motor1+i, 2);
+Motor_Dir[i]=0; //0 stop 1- up 2-dn
+
+}
+
+} \ No newline at end of file
diff --git a/Software/Stubs Collection/Procedures/Priming1.txt b/Software/Stubs Collection/Procedures/Priming1.txt
new file mode 100644
index 000000000..adfed3f3e
--- /dev/null
+++ b/Software/Stubs Collection/Procedures/Priming1.txt
@@ -0,0 +1,1015 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Drawing;
+using Google.Protobuf;
+using Tango.BL.Entities;
+using Tango.BL.Enumerations;
+using Tango.PMR.Stubs;
+using Tango.PMR.Diagnostics;
+using Tango.FSE.Common.Connection;
+using Tango.FSE.Common.Diagnostics;
+using Tango.FSE.Procedures;
+using System.IO;
+using System.Diagnostics;
+using System.Windows.Forms;
+
+
+public class Program
+{
+
+
+private IProcedureContext context;
+
+//---------------------Start Command ----------------
+const Int32 CMD_RUN = 0; //Run on Pulse Per Secound .positive run Up and negative run Down b
+const Int32 CMD_STOP= 1; //0;Hard stop(Defualt);1-Soft stop;2-Hard Hiz;3-Soft Hiz
+const Int32 CMD_VALVE= 2; //0-to Midtank ,1-to head
+const Int32 CMD_DLY = 3; //delay in Seconds .
+const Int32 CMD_TIME= 4; //Print Time .
+const Int32 CMD_PRESS= 5; //return from Delay loop when pressure is high (on mBAR) .
+const Int32 CMD_LOOP_NM=6; //NUMBER OF counter
+const Int32 CMD_LOOP= 7; //jump up(+) or down(-) command u
+const Int32 CMD_MTV_OPEN = 8; //0 Air ; 1 Ink
+const Int32 CMD_MTV_CLOSE= 9; //0 Air ; 1 Ink
+const Int32 CMD_LBL= 10; //label for user
+const Int32 CMD_SMP= 11; //sample rate ,defualt 100msec (1); for 1 second is 10.
+const Int32 CMD_PRESL= 12; //return from Delay loop when pressure is low (on mBAR) .
+
+const Int32 CMD_END = 13; //end loop .
+
+
+Int32[] BuildUp_Table = new int []
+{
+ CMD_VALVE,1,
+ CMD_PRESL,200,
+ CMD_DLY,200,
+
+ CMD_LOOP_NM,3,
+
+ CMD_VALVE,0,
+ CMD_DLY,1,
+ CMD_VALVE,1,
+ CMD_DLY,1,
+ CMD_LOOP,-4,
+
+ CMD_VALVE,0,
+ CMD_RUN,1068,
+ CMD_PRESS,1000, //mbar --> 1000 = 100% work, 4000 = 200% work, 350 = 20% work
+ CMD_DLY,150,
+ CMD_LBL,1,
+ CMD_PRESS,2000, //mbar --> 2000 = 100% work, 4000 = 200% work, 350 = 20% work
+ CMD_DLY,60,
+ CMD_LBL,2,
+ CMD_PRESS,3000,
+ CMD_DLY,60, // to limit
+ CMD_STOP,0,
+ CMD_VALVE,1,
+ CMD_END,3,
+};
+
+
+Int32[] Up_Table = new int []
+{
+ CMD_VALVE,1,
+ CMD_PRESL,200,
+ CMD_DLY,200,
+
+ CMD_PRESS,3000, //mbar --> 1000 = 100% work, 4000 = 200% work, 350 = 20% work
+ CMD_RUN,534, // 100%
+ CMD_DLY,120,
+ CMD_STOP,0,
+ CMD_END,3,
+};
+Int32 Dispenser_sample_rate= 1;
+
+ string path = @"C:\Dispenser_setup\Log\";
+//----------------------
+const UInt32 I2C_ID = 4; //MCU_I2C4
+const UInt32 TCA9548A_address = 0xE2;
+const UInt32 I2C_Slave_Low_Add = 0xA0; //eeprom address - 64k low
+const UInt32 I2C_Slave_High_Add = 0xA2; //eeprom address - 64k High
+//----------------------
+byte [] EEPROM_Data = new byte [128];
+
+
+//---------------------End Command ----------------
+
+const Int32 Dispenser_Motor1 = 6;
+const Int32 Dispenser_Motor2 = 7;
+const Int32 Dispenser_Motor3 = 8;
+const Int32 Dispenser_Motor4 = 9;
+const Int32 Dispenser_Motor5 = 10;
+const Int32 Dispenser_Motor6 = 11;
+const Int32 Dispenser_Motor7 = 12;
+const Int32 Dispenser_Motor8 = 13;
+
+const Int32 AN_IDS_PRESSENS_1 = 2;
+const Int32 AN_IDS_PRESSENS_2 = 3;
+const Int32 AN_IDS_PRESSENS_3 = 4;
+const Int32 AN_IDS_PRESSENS_4 = 5;
+const Int32 AN_IDS_PRESSENS_5 = 6;
+const Int32 AN_IDS_PRESSENS_6 = 7;
+const Int32 AN_IDS_PRESSENS_7 = 8;
+const Int32 AN_IDS_PRESSENS_8 = 9;
+
+const Int32 F2_LS_01_Direct = 0x60000420 ; // Reads the direct values that are currently being sent to the fpga. rsv rsv rsv rsv F2_LS_DISPENSER_UP_2 F2_LS_DISPENSER_25_2 F2_LS_DISPENSER_75_2 F2_LS_DISPENSER_DOWN_2 F2_LS_DISPENSER_50_2 F2_LS_DISPENSER_SPARE_2 F2_LS_DISPENSER_UP_1 F2_LS_DISPENSER_25_1 F2_LS_DISPENSER_75_1 F2_LS_DISPENSER_DOWN_1 F2_LS_DISPENSER_50_1 F2_LS_DISPENSER_SPARE_1
+const Int32 F2_LS_02_Direct = 0x60000430 ; // Reads the direct values that are currently being sent to the fpga. rsv rsv rsv rsv F2_LS_DISPENSER_UP_4 F2_LS_DISPENSER_25_4 F2_LS_DISPENSER_75_4 F2_LS_DISPENSER_DOWN_4 F2_LS_DISPENSER_50_4 F2_LS_DISPENSER_SPARE_4 F2_LS_DISPENSER_UP_3 F2_LS_DISPENSER_25_3 F2_LS_DISPENSER_75_3 F2_LS_DISPENSER_DOWN_3 F2_LS_DISPENSER_50_3 F2_LS_DISPENSER_SPARE_3
+const Int32 F2_LS_03_Direct = 0x60000440 ; // Reads the direct values that are currently being sent to the fpga. rsv rsv rsv rsv F2_LS_DISPENSER_UP_6 F2_LS_DISPENSER_25_6 F2_LS_DISPENSER_75_6 F2_LS_DISPENSER_DOWN_6 F2_LS_DISPENSER_50_6 F2_LS_DISPENSER_SPARE_6 F2_LS_DISPENSER_UP_5 F2_LS_DISPENSER_25_5 F2_LS_DISPENSER_75_5 F2_LS_DISPENSER_DOWN_5 F2_LS_DISPENSER_50_5 F2_LS_DISPENSER_SPARE_5
+const Int32 F2_LS_04_Direct = 0x60000480 ; // Reads the direct values that are currently being sent to the fpga. rsv rsv rsv rsv F2_LS_DISPENSER_UP_8 F2_LS_DISPENSER_25_8 F2_LS_DISPENSER_75_8 F2_LS_DISPENSER_DOWN_8 F2_LS_DISPENSER_50_8 F2_LS_DISPENSER_SPARE_8 F2_LS_DISPENSER_UP_7 F2_LS_DISPENSER_25_7 F2_LS_DISPENSER_75_7 F2_LS_DISPENSER_DOWN_7 F2_LS_DISPENSER_50_7 F2_LS_DISPENSER_SPARE_7
+
+const Int32 Dispenser_Valve1 = 0;
+const Int32 Dispenser_Valve2 = 1;
+const Int32 Dispenser_Valve3 = 2;
+const Int32 Dispenser_Valve4 = 3;
+const Int32 Dispenser_Valve5 = 4;
+const Int32 Dispenser_Valve6 = 5;
+const Int32 Dispenser_Valve7 = 6;
+const Int32 Dispenser_Valve8 = 7;
+
+const ushort MinPress_Mbar_Add =0x5c ;
+const ushort MaxPress_Mbar_Add =0x60 ;
+
+const Int32 F3_VALVE_OUT = 0x600000e2;
+
+//string path = "C:\\Dispenser_setup\\Log\\";
+
+
+//Int32[] Start_Table;
+
+Int32[] Start_Table = new Int32 [10000];
+
+UInt32 [] Motor_Dir=new UInt32 [8] {0,0,0,0,0,0,0,0};
+
+string Dispenser_Fname ;
+
+Int32 Dispenser_ptr =-1;
+
+Int32 [] Dispenser_press= new Int32[8]{0,0,0,0,0,0,0,0};
+Int32 max_pressure_level = 20000;
+Int32 min_pressure_level = -20000;
+
+Int32 [] A2D_Dispenser= new Int32[8]{0,0,0,0,0,0,0,0};
+Int32 Loop_cnt= 1;
+Int32 Loop_length=1;
+
+Int32 PressureSensorType= 1; //1- new -1up +10 . 0-old 0 to +10
+Int32 Temp_Delay=0;
+
+
+UInt32 RD_LS_01_Direct;
+UInt32 RD_LS_02_Direct;
+UInt32 RD_LS_03_Direct;
+UInt32 RD_LS_04_Direct;
+
+long Lebel1_time;
+long Lebel2_time;
+
+long time_Table;
+
+Int32 msec_index=0;
+
+Int32 MaxPress_Mbar;
+Int32 MinPress_Mbar;
+string state;
+
+ public Int32 OnExecute(IProcedureContext context)
+ {
+ long Max_PBU;
+ Int32 Index=0;
+ Int32 speed=0;
+ Int32 Dispenser_Nm;
+ this.context = context;
+
+ string box_msg = "Make sure Mixer Hot ";
+ MessageBox.Show(box_msg);
+
+ var response1 = context.RequestUserInputFor<String>("Dispenser Number", "Enter Dispenser number to make priming (1-8):");
+ context.WriteLine(response1);
+ Dispenser_Nm = Int32.Parse(response1);
+
+ check_Min_Max_Mbar(Dispenser_Nm);
+
+ if (Dispenser_Nm==8)
+ Max_PBU=6000;
+ else
+ Max_PBU=4000;
+
+
+ if (!Directory.Exists(path))
+ {
+ Directory.CreateDirectory(path);
+ }
+ context.WriteLine(path);
+
+ context.Send<ProgressResponse>("ProgressRequest" ,0xe0, 1);
+
+ Dispenser_Fname=path + "Dispenser_Nm_" + Dispenser_Nm+"_" + DateTime.Now.ToString("MM-dd-yy hh-mm")+ ".csv" ;
+
+ context.WriteLine(Dispenser_Fname);
+
+ context.WriteToFile(Dispenser_Fname,"Dispenser Nm," + Dispenser_Nm + "\n" );
+ context.AppendToFile(Dispenser_Fname,"Pressure,Command,Value,DateTime,Remark\n" );
+ for(int j=0; j<2;j++)
+ {
+ for(int i=0; i<4;i++)
+ {
+ state="PBU No. "+ (4*j+i+1 );
+ Start_Table=BuildUp_Table;
+ Table_Run(Dispenser_Nm );
+ if (time_Table>300000)
+ {
+ context.AddResult(ResultType.Failed,"PBU", "PBU No."+ (4*j+i+1 ) + " Fail");
+ return 0;
+ }
+ context.AddResult(ResultType.Passed,"PBU","PBU No."+ (4*j+i+1 ) + " Pass");
+
+ }
+ state="Flow No."+ (j+1 ) ;
+ Start_Table=Up_Table;
+ Table_Run(Dispenser_Nm );
+ if (time_Table<115000)
+ {
+ context.WriteLine("time_Table= " +time_Table);
+ context.AddResult(ResultType.Failed,"Flow", "Flow No."+ (j+1) + " Fail");
+ return 0;
+ }
+ context.AddResult(ResultType.Passed,"Flow","Flow No."+ (j+1 ) + " Pass");
+
+ }
+ state="Last PBU " ;
+ Start_Table=BuildUp_Table;
+ Table_Run(Dispenser_Nm );
+ long Time=Lebel2_time-Lebel1_time;
+ if (Time>Max_PBU)
+ {
+ context.AddResult(ResultType.Failed,"PBU", "PBU = " +Time + "msec ");
+ state="PBU = " +Time + "msec \tFail";
+ }
+ else
+ {
+ context.AddResult(ResultType.Passed,"PBU", "PBU = " +Time + "msec ");
+ state="PBU = " +Time + "msec \tPass";
+ }
+ return 0;
+
+ }
+
+/////////////////////////////////////////////
+void check_Min_Max_Mbar(Int32 i )
+{
+ int k;
+ string s ;
+ i--;
+
+ context.WriteLine("-------------- write Enable Channel ------------"); //debug
+ enable_channel(i); // Chanel 0-7 => Disp0enser 0-7
+ context.WriteLine("-------------- Read_header ------------"); //debug
+
+ context.WriteLine("-------------- write_address_eeprom ------------"); //debug
+ write_address_eeprom (I2C_Slave_Low_Add,MinPress_Mbar_Add);
+ context.WriteLine("-------------- read_data_from_eeprom ------------"); //debug
+ read_data_from_eeprom (I2C_Slave_Low_Add,1);
+ if (EEPROM_Data[0]==0 )
+ { PressureSensorType=0;
+ context.WriteLine("PressureSensorType=0" ); //debug
+ }
+ else
+ {
+ PressureSensorType=1;
+ context.WriteLine("PressureSensorType=1" ); //debug
+ }
+
+}
+//----------------write address eeprom -------------------------
+public void write_address_eeprom (UInt32 I2C_Add, UInt32 Eeprom_Add)
+{
+ StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();
+ stubI2CWriteBytesRequest.I2CId = I2C_ID;
+ stubI2CWriteBytesRequest.SlaveAddress = I2C_Add;
+
+ UInt32 uInt32 = new UInt32();
+ stubI2CWriteBytesRequest.BytesTWrite.Add(Convert.ToByte( (Eeprom_Add & 0xff00) >>8)); //Byte High add to write
+ stubI2CWriteBytesRequest.BytesTWrite.Add(Convert.ToByte(Eeprom_Add & 0xff)); //Byte Low add to write
+ context.WriteLine( (Eeprom_Add & 0xff00) >>8) ; //debug
+ context.WriteLine( Eeprom_Add & 0xff); //debug
+
+ context.Send<StubI2CWriteBytesResponse>(stubI2CWriteBytesRequest);
+}
+//------------------- read Data from EEprom--------------------------
+
+public void read_data_from_eeprom ( UInt32 I2C_Add, UInt32 cnt )
+{
+ StubI2CReadBytesRequest stubI2CReadBytesRequest = new StubI2CReadBytesRequest();
+ stubI2CReadBytesRequest.I2CId = I2C_ID;
+ stubI2CReadBytesRequest.SlaveAddress = (I2C_Add + 1);
+ stubI2CReadBytesRequest.NumberOfBytesToRead = cnt; // Number of bytes to read
+
+ var response1 = context.Send<StubI2CReadBytesResponse>(stubI2CReadBytesRequest);
+
+ for(int i=0; i<cnt;i++)
+ {
+ EEPROM_Data[i]=Convert.ToByte(response1.ReadBytes[i]);
+ context.WriteLine(EEPROM_Data[i] ); //debug
+
+ }
+}
+
+
+///////////////////////////////////////////////
+//----------- enable I2c channel --------------
+public int enable_channel(Int32 Channel_ID)
+{
+ uint Const_temp = 0x01;
+
+ StubI2CWriteBytesRequest stubI2CWriteBytesRequest = new StubI2CWriteBytesRequest();
+ stubI2CWriteBytesRequest.I2CId = I2C_ID;
+ stubI2CWriteBytesRequest.SlaveAddress = TCA9548A_address;
+
+ Const_temp = Const_temp << Channel_ID;
+ stubI2CWriteBytesRequest.BytesTWrite.Add(Const_temp);//enable i2c channel 0 Dispenser 1
+
+ var response = context.Send<StubI2CWriteBytesResponse>(stubI2CWriteBytesRequest);
+
+ return 1;
+}
+
+
+//////////////////////////////////////////////////////////////
+Int32 Table_Run(Int32 Dispenser )
+
+{
+ Int32 COMMAND=0;
+ Int32 Data=0;
+ Int32 count=0;
+
+ Dispenser--; //check from 0-7
+
+ int j=0;
+ var stopwatch = new Stopwatch();
+ stopwatch.Start();
+
+ long elapsed_time = stopwatch.ElapsedMilliseconds;
+ context.WriteLine(elapsed_time);
+
+ while (count!=-1)
+ {
+ msec_index=msec_index+1;
+
+ if (Dispenser<2)
+ {
+ var response1 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_01_Direct);
+ RD_LS_01_Direct=response1.Value ;
+ }
+ else if ( (Dispenser<4) )
+ {
+ var response1 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_02_Direct);
+ RD_LS_02_Direct=response1.Value ;
+ }
+ else if ( (Dispenser<6) )
+ {
+ var response1 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_03_Direct);
+ RD_LS_03_Direct=response1.Value ;
+ }
+ else
+ {
+ var response1 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_04_Direct);
+ RD_LS_04_Direct=response1.Value ;
+ }
+ if (Dispenser<4)
+ {
+ var response2 = context.Send<StubIntADCReadResponse>("StubIntADCReadRequest" ,0x8000 + AN_IDS_PRESSENS_1);
+ A2D_Dispenser[0]=(response2.SamplingInBits)>>16;
+ A2D_Dispenser[1] =(response2.SamplingInBits) & 0x0000ffff;
+ A2D_Dispenser[2] =(response2.VoltageSamplingMv)>>16;
+ A2D_Dispenser[3] =(response2.VoltageSamplingMv) & 0x0000ffff;
+ }
+ else
+ {
+ var response3 = context.Send<StubIntADCReadResponse>("StubIntADCReadRequest" ,0x8000 + AN_IDS_PRESSENS_5);
+ A2D_Dispenser[4] =(response3.SamplingInBits)>>16;
+ A2D_Dispenser[5] =(response3.SamplingInBits)& 0x0000ffff;
+ A2D_Dispenser[6] =(response3.VoltageSamplingMv)>>16;
+ A2D_Dispenser[7] =(response3.VoltageSamplingMv)& 0x0000ffff;
+ }
+
+ COMMAND=Start_Table[count];
+ Data=Start_Table[(count+1)];
+ //Index=Index+2;
+ switch (COMMAND)
+ {
+ case CMD_RUN:
+ Motor_Run(Data,Dispenser);
+ count = count+2;
+ break;
+
+ case CMD_VALVE:
+ Valve_3W(Data,Dispenser);
+ count = count+2;
+ break;
+
+ case CMD_STOP:
+ Motor_Stop(Data,Dispenser);
+ count = count+2;
+ break;
+
+ case CMD_DLY:
+ Delay_on_second(Data,Dispenser);
+ if (Temp_Delay ==0)
+ {
+ max_pressure_level=20000;
+ min_pressure_level=-20000;
+ count = count+2;
+ }
+ break;
+
+ case CMD_TIME:
+ Print_Time();
+ count = count+2;
+ break;
+
+ case CMD_PRESS:
+ max_pressure_level=Data;
+ context.AppendToFile(Dispenser_Fname,",Max_pressure_level is, " + Data +","+DateTime.Now+"\n");
+ count = count+2;
+ break;
+
+ case CMD_PRESL:
+ min_pressure_level=Data;
+ context.AppendToFile(Dispenser_Fname,",Min_pressure_level is, " + Data +","+DateTime.Now+"\n");
+ count = count+2;
+ break;
+
+ case CMD_LBL:
+ context.AppendToFile(Dispenser_Fname,",Label," + Data+","+DateTime.Now+"\n");
+ if(Data==1)
+ Lebel1_time=stopwatch.ElapsedMilliseconds;
+ if(Data==2)
+ Lebel2_time=stopwatch.ElapsedMilliseconds;
+ count = count+2;
+ break;
+
+
+ case CMD_SMP:
+ context.AppendToFile(Dispenser_Fname,",SampleRate," + Data+","+DateTime.Now+"\n");
+ Dispenser_sample_rate =Data;
+ count = count+2;
+ break;
+
+ case CMD_END:
+ count=-1;
+ context.AppendToFile(Dispenser_Fname,",End testing,,"+DateTime.Now+"\n");
+ break;
+
+ case CMD_MTV_OPEN:
+ open_midtank_valve(Data,Dispenser);
+ context.AppendToFile(Dispenser_Fname,",OPEN MIDTANK, " + Dispenser+","+DateTime.Now+"\n");
+ count = count+2;
+ break;
+
+ case CMD_MTV_CLOSE:
+ close_midtank_valve(Data,Dispenser);
+ context.AppendToFile(Dispenser_Fname,",CLOSE MIDTANK, " + Dispenser+","+DateTime.Now+"\n");
+ count = count+2;
+ break;
+
+ case CMD_LOOP_NM:
+
+ Loop_cnt=Data-1;
+ context.AppendToFile(Dispenser_Fname,",Counter Loop,"+ Data+","+DateTime.Now +"\n");
+ count = count+2;
+ break;
+
+ case CMD_LOOP:
+
+ if (Loop_cnt!=0)
+ {
+ context.AppendToFile(Dispenser_Fname,"Counter Loop,"+ Loop_cnt+","+DateTime.Now+"\n" );
+ count = count+2*Data;
+ Loop_cnt--;
+
+ }
+ else
+ {
+ context.AppendToFile(Dispenser_Fname,",End loop,,"+DateTime.Now +"\n");
+ count = count+2;
+ }
+ break;
+
+ default:
+ break;
+
+ }
+
+ long elapsed_time1 = stopwatch.ElapsedMilliseconds;
+ long elapsed_time2= elapsed_time1-elapsed_time;
+ if (elapsed_time2>95)
+ elapsed_time2=95; //minimum time
+ Thread.Sleep(100-(int )(elapsed_time2));
+
+ elapsed_time = stopwatch.ElapsedMilliseconds;
+
+
+ j++;
+ if (j==10)
+ {
+ j=0;
+ context.WriteLine(Dispenser_press[Dispenser]+ " mBar\t"+state + "\tTime-" + (elapsed_time/1000));
+ }
+ }
+ time_Table=elapsed_time;
+ return 0;
+}
+
+///////////////////////////////////////////////////////////////////
+Int32 Motor_Run(Int32 speed,Int32 Dispenser)
+
+{
+
+ switch (Dispenser)
+ {
+ case 0:
+ if ( speed<0)
+ {
+ Motor_Dir[0]=2;
+ if ((RD_LS_01_Direct & 0x04)!=0x04)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor1, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[0]=1;
+ if ((RD_LS_01_Direct & 0x20)!=0x20)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor1, true, (speed));
+ }
+ break;
+
+ case 1:
+ if ( speed<0)
+ {
+ Motor_Dir[1]=2;
+ if ((RD_LS_01_Direct & 0x100)!=0x100)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor2, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[1]=1;
+ if ((RD_LS_01_Direct & 0x800)!=0x800)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor2, true, (speed));
+ }
+ break;
+
+ case 2:
+ if ( speed<0)
+ {
+ Motor_Dir[2]=2;
+ if ((RD_LS_02_Direct & 0x04)!=0x04)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor3, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[2]=1;
+ if ((RD_LS_02_Direct & 0x20)!=0x20)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor3, true, (speed));
+ }
+ break;
+
+ case 3:
+ if ( speed<0)
+ {
+ Motor_Dir[3]=2;
+
+ if ((RD_LS_02_Direct & 0x100)!=0x100)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor4, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[3]=1;
+
+ if ((RD_LS_02_Direct & 0x800)!=0x800)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor4, true, (speed));
+ }
+ break;
+
+ case 4:
+ if ( speed<0)
+ {
+ Motor_Dir[4]=2;
+ if ((RD_LS_03_Direct & 0x04)!=0x04)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n");
+ return 0;
+ }
+
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor5, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[4]=1;
+ if ((RD_LS_03_Direct & 0x20)!=0x20)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor5, true, (speed));
+ }
+ break;
+
+ case 5:
+ if ( speed<0)
+ {
+ Motor_Dir[5]=2;
+ if ((RD_LS_03_Direct & 0x100)!=0x100)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor6, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[5]=1;
+ if ((RD_LS_03_Direct & 0x800)!=0x800)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+ ",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor6, true, (speed));
+ }
+ break;
+
+ case 6:
+ if ( speed<0)
+ {
+ Motor_Dir[6]=2;
+ if ((RD_LS_04_Direct & 0x04)!=0x04)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor7, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[6]=1;
+ if ((RD_LS_04_Direct & 0x20)!=0x20)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor7, true, (speed));
+ }
+ break;
+
+ case 7:
+ if ( speed<0)
+ {
+ Motor_Dir[7]=2;
+
+ if ((RD_LS_04_Direct & 0x100)!=0x100)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor8, false, (-speed));
+ }
+ else
+ {
+ Motor_Dir[7]=1;
+
+ if ((RD_LS_04_Direct & 0x800)!=0x800)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Motor on Limit\n");
+ return 0;
+ }
+ context.Send<StubMotorRunResponse>("StubMotorRunRequest" ,Dispenser_Motor8, true, (speed));
+ }
+ break;
+
+ default:
+ break;
+
+ }
+ context.AppendToFile(Dispenser_Fname,",Run," +speed+","+DateTime.Now +"\n" );
+
+ return 1;
+}
+
+
+ Int32 Valve_3W(Int32 Valve_Value,Int32 Dispenser)
+{
+ if ( Valve_Value==1)
+ context.Send<StubValveResponse>("StubValveRequest" ,Dispenser_Valve1+Dispenser, 3, true); //3 3Way
+ else
+ context.Send<StubValveResponse>("StubValveRequest" ,Dispenser_Valve1+Dispenser, 3, false); //3 3Way
+
+ context.AppendToFile(Dispenser_Fname,",Dispenser Valve position is, " + Valve_Value+","+DateTime.Now +"\n" );
+
+ return 1;
+}
+//---------------------------------------
+
+ Int32 Motor_Stop(Int32 Stop_Value,Int32 Dispenser )
+{
+ context.Send<StubMotorStopResponse>("StubMotorStopRequest" ,Dispenser_Motor1+Dispenser, Stop_Value);
+
+ context.AppendToFile(Dispenser_Fname,",Motor Stop," + Stop_Value+","+DateTime.Now +"\n");
+ Motor_Dir[Dispenser]=0;
+ return 1;
+}
+
+//---------------------------------------
+
+ Int32 Delay_on_second(Int32 Delay,Int32 Dispenser )
+{
+//Int32 temp1;
+Int32 pressure_om_mBAR=0;
+ if (Temp_Delay ==0)
+ {
+ context.AppendToFile(Dispenser_Fname,",DLY, " + Delay +","+DateTime.Now+"\n");
+ Temp_Delay = Delay *10 -1;
+// context.Write("A"); //debug
+ }
+ else
+ Temp_Delay--;
+
+ if ( LimitSW_Dispenser(Dispenser)==0)
+ {
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now+",Warning Motor on Limit\n");
+ MotorStop(Dispenser);
+ Temp_Delay =0; //end delay
+// context.Write("C"); //debug
+
+ return 0 ;
+ }
+
+ pressure_om_mBAR=Calc_mBAR(Dispenser,true);
+ if (pressure_om_mBAR > max_pressure_level)
+ {
+ // MotorStop(Dispenser);
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Pressure too high\n");
+ Temp_Delay =0; //end delay
+// context.Write("D"); //debug
+
+ return 0;
+ }
+ if (pressure_om_mBAR < min_pressure_level)
+ {
+ // MotorStop(Dispenser);
+ context.AppendToFile(Dispenser_Fname,",,,"+DateTime.Now +",Warning Pressure too low\n");
+ Temp_Delay =0; //end delay
+// context.Write("D"); //debug
+
+ return 0;
+ }
+
+
+ return 1;
+}
+
+Int32 LimitSW_Dispenser(Int32 Dispenser)
+{
+
+ if (Dispenser==0)
+
+ {
+
+// var response1 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_01_Direct);
+
+ if (((RD_LS_01_Direct & 0x04)!=0x04) && (Motor_Dir[0]==2))
+ return 0;
+ else
+ if (((RD_LS_01_Direct & 0x20)!=0x20) && (Motor_Dir[0]==1))
+ return 0;
+ else
+ return 1;
+ }
+
+ if (Dispenser==1)
+
+ {
+// var response2 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_01_Direct);
+ if (((RD_LS_01_Direct & 0x100)!=0x100) && (Motor_Dir[1]==2))
+ return 0;
+ else
+ if (((RD_LS_01_Direct & 0x800)!=0x800) && (Motor_Dir[1]==1))
+ return 0;
+ else
+ return 1;
+ }
+
+
+ if (Dispenser==2)
+
+ {
+
+ //var response3 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_02_Direct);
+ if (((RD_LS_02_Direct & 0x04)!=0x04) && (Motor_Dir[2]==2))
+ return 0;
+ else
+ if (((RD_LS_02_Direct & 0x20)!=0x20) && (Motor_Dir[2]==1))
+ return 0;
+ else
+ return 1;
+
+ }
+
+ if (Dispenser==3)
+
+ {
+ var response4 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_02_Direct);
+ if (((RD_LS_02_Direct & 0x100)!=0x100) && (Motor_Dir[3]==2))
+ return 0;
+ else
+ if (((RD_LS_02_Direct & 0x800)!=0x800) && (Motor_Dir[3]==1))
+ return 0;
+ else
+ return 1;
+ }
+
+
+
+
+ if (Dispenser==4)
+
+ {
+
+// var response1 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_01_Direct);
+ if (((RD_LS_03_Direct & 0x04)!=0x04) && (Motor_Dir[4]==2))
+ return 0;
+ else
+ if (((RD_LS_03_Direct & 0x20)!=0x20) && (Motor_Dir[4]==1))
+ return 0;
+ else
+ return 1;
+ }
+
+ if (Dispenser==5)
+
+ {
+// var response2 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_01_Direct);
+ if (((RD_LS_03_Direct & 0x100)!=0x100) && (Motor_Dir[5]==2))
+ return 0;
+ else
+ if (((RD_LS_03_Direct & 0x800)!=0x800) && (Motor_Dir[5]==1))
+ return 0;
+ else
+ return 1;
+ }
+
+
+ if (Dispenser==6)
+
+ {
+
+ //var response3 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_02_Direct);
+ if (((RD_LS_04_Direct & 0x04)!=0x04) && (Motor_Dir[6]==2))
+ return 0;
+ else
+ if (((RD_LS_04_Direct & 0x20)!=0x20) && (Motor_Dir[6]==1))
+ return 0;
+ else
+ return 1;
+
+ }
+
+ if (Dispenser==7)
+
+ {
+// var response4 = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" ,F2_LS_02_Direct);
+ if (((RD_LS_04_Direct & 0x100)!=0x100) && (Motor_Dir[7]==2))
+ return 0;
+ else
+ if (((RD_LS_04_Direct & 0x800)!=0x800) && (Motor_Dir[7]==1))
+ return 0;
+ else
+ return 1;
+ }
+
+
+ return 0;
+}
+
+
+Int32 Print_Time()
+{
+ context.AppendToFile(Dispenser_Fname,",Time is\t,,"+ DateTime.Now +"\n" );
+
+ return 1;
+}
+
+
+
+Int32 Calc_mBAR(Int32 Dispenser, bool save_press)
+{
+Int32 Data;
+Int32 Sense1;
+Int32 temp=0;
+
+ Data =A2D_Dispenser[Dispenser];
+ if (Data<100)
+ temp=-1;
+ Data=Data-710;
+ if (Data<0)
+ Data=0;
+
+ Data=Data*(10000+PressureSensorType*1000)/2840; // for -1 to 10 bar Press_Sensor_Type=1 else 0
+ Data=Data-1000*PressureSensorType; // for -1 to 10 bar
+
+ if (temp==-1) //if SamplingInBits <100 then No pressure sensor exist
+ Sense1=-9999 ;
+ else
+ Sense1=Data ;
+ if ( ((msec_index) % (Dispenser_sample_rate)) == 0)
+ {
+ context.AppendToFile(Dispenser_Fname,"" + Sense1+"\n");
+ }
+ Dispenser_press[Dispenser]=Sense1;
+ return Sense1;
+
+ }
+
+
+//--------------------------------
+int open_midtank_valve (Int32 valve_type,Int32 valve_nm) //valve_type=0 is Air ,1 is Ink ; valve_nm 0-7
+{
+ SetBit (F3_VALVE_OUT,((valve_type+1)*8)- valve_nm-1, 1);
+ return 1;
+
+}
+//--------------------------------
+int close_midtank_valve (Int32 valve_type,Int32 valve_nm) //valve_type=0 is Air ,1 is Ink ; valve_nm 0-7
+{
+ SetBit (F3_VALVE_OUT,((valve_type+1)*8)- valve_nm-1, 0);
+ return 1;
+}
+//--------------------------------
+Int32 SetBit(Int32 Adr, Int32 BitNo, Int32 Bit)
+{
+ Int32 BitMask;
+
+ var response = context.Send<StubFpgaReadRegResponse>("StubFpgaReadRegRequest" , F3_VALVE_OUT);
+ Int32 RV = (Int32) response.Value & 0xffff;
+
+
+ if (Bit == 0x1)
+ {
+ BitMask = 0x1 << BitNo;
+ RV = RV | BitMask;
+ context.Send<StubFpgaWriteRegResponse>("StubFpgaWriteRegRequest" ,F3_VALVE_OUT , RV);
+ }
+ else if (Bit == 0x0)
+ {
+ BitMask = ~(0x1 << BitNo);
+ RV = RV & BitMask;
+ context.Send<StubFpgaWriteRegResponse>("StubFpgaWriteRegRequest" ,F3_VALVE_OUT , RV);
+ }
+ return 1;
+}
+//----------------------------------
+ void MotorStop(Int32 i)
+{
+
+context.Send<StubMotorStopResponse>("StubMotorStopRequest" ,Dispenser_Motor1+i, 2);
+Motor_Dir[i]=0; //0 stop 1- up 2-dn
+
+}
+
+} \ No newline at end of file
diff --git a/Software/Stubs Collection/Procedures/WHS loopp control.txt b/Software/Stubs Collection/Procedures/WHS loopp control.txt
new file mode 100644
index 000000000..3638af2a5
--- /dev/null
+++ b/Software/Stubs Collection/Procedures/WHS loopp control.txt
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Google.Protobuf;
+using Tango.BL.Enumerations;
+using Tango.PMR.Stubs;
+using Tango.PMR.Diagnostics;
+using Tango.FSE.Common.Diagnostics;
+using Tango.FSE.Procedures;
+
+public class Program
+{
+ public void OnExecute(IProcedureContext context)
+ {
+
+ int ControlLoopEnable = context.GetInput<int>("WasteControlLoop");
+
+ ProgressRequest progressRequest = new ProgressRequest();
+ progressRequest.Amount = 0x3e8;
+ progressRequest.Delay = ControlLoopEnable*0x1000+2700;
+
+ var response = context.Send<ProgressResponse>(progressRequest);
+ context.AddResult(ResultType.Passed, "Success", response.Progress);
+
+ }
+} \ No newline at end of file
diff --git a/Software/Stubs Collection/Procedures/WHS_waste_Tank_Calibration_Save_V0.pproj b/Software/Stubs Collection/Procedures/WHS_waste_Tank_Calibration_Save_V0.pproj
new file mode 100644
index 000000000..3bd4b1f84
--- /dev/null
+++ b/Software/Stubs Collection/Procedures/WHS_waste_Tank_Calibration_Save_V0.pproj
@@ -0,0 +1,107 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Drawing;
+using Google.Protobuf;
+using Tango.BL.Entities;
+using Tango.BL.Enumerations;
+using Tango.PMR.Stubs;
+using Tango.PMR.Diagnostics;
+using Tango.FSE.Common.Connection;
+using Tango.FSE.Common.Diagnostics;
+using Tango.FSE.Procedures;
+
+
+public class Program
+{
+ double V0_default_ml = 8.7433;
+
+ public void OnExecute(IProcedureContext context)
+ {
+
+ var response1 = context.RequestUserInputFor<String>("Warning - you are going to change the value of Vo in the eeprom !!!\nPlease Enter Password to confirme:","");
+ if (response1=="Aa123456")
+ {
+ context.WriteLine(response1);
+
+ //Write_0_Vo_in_ml_to_eeprom
+ context.WriteLine("\nWrite_0_Vo_in_ml_to_eeprom");
+ StubWhsEEpromRequest stubWhsEEpromRequest = new StubWhsEEpromRequest();
+ stubWhsEEpromRequest.BurnRequest = true; //write
+ StubWhsEEpromData stubWhsEEpromData = new StubWhsEEpromData();
+ stubWhsEEpromData.Orifice1Flow = 0;
+ stubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;
+ var response = context.Send<StubWhsEEpromResponse>(stubWhsEEpromRequest);
+
+ //wait_10mSec
+ context.WriteLine("\nwait_10mSec");
+ Thread.Sleep(100); //Sleep for 10 milli.
+
+ //Read_Vo_in_ml_from_eeprom & verify it is 0
+ context.WriteLine("\nRead_Vo_in_ml_from_eeprom & verify it is 0");
+ stubWhsEEpromRequest.BurnRequest = false; //write
+ stubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;
+ var response2 = context.Send<StubWhsEEpromResponse>(stubWhsEEpromRequest);
+
+ //Read_Vo_in_mV
+ context.WriteLine("\nRead_Vo_in_mV");
+ var response3 = context.Send<ProgressResponse>("ProgressRequest" ,0x3EC, 0x01);
+ //Print_Vo_in_mV
+ context.WriteLine(response3.Progress);
+
+ //check validity
+ context.WriteLine("\ncheck validity");
+ if((response3.Progress <= 800) || (response3.Progress >=1200))
+ {
+ response3.Progress = 1076; //default
+ context.Write("\nERROR ------ Vreading value outside the defined range !!! ------");
+ context.AddResult(ResultType.Failed , "Error", "ERROR ------ Vreading value outside the defined range !!! ------");
+ }
+ else
+ {
+ //calculate_V0_in_ml
+ context.WriteLine("\ncalculate_V0_in_ml");
+ V0_default_ml = V0_default_ml * response3.Progress;
+
+ //print_Vo_in_ml
+ context.WriteLine("\nprint_Vo_in_ml");
+ context.WriteLine(V0_default_ml);
+ context.WriteLine("");
+
+ //Write_Vo_in_ml_to_eeprom
+ context.WriteLine("\nWrite_Vo_in_ml_to_eeprom");
+ stubWhsEEpromRequest.BurnRequest = true; //write
+
+ stubWhsEEpromData.Orifice1Flow = V0_default_ml;
+ stubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;
+ var response4 = context.Send<StubWhsEEpromResponse>(stubWhsEEpromRequest);
+
+ //wait_10mSec
+ context.WriteLine("\nwait_10mSec");
+ Thread.Sleep(100); //Sleep for 10 milli.
+
+ //Read_Vo_in_ml_from_eeprom
+ context.WriteLine("\nRead_Vo_in_ml_from_eeprom");
+ stubWhsEEpromRequest.BurnRequest = false; //write
+ stubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;
+ var response5 = context.Send<StubWhsEEpromResponse>(stubWhsEEpromRequest);
+
+ //Check if we read the correct value
+ context.WriteLine("\nVerify that we read the correct value of Orifice1Flow!!");
+ context.AddResult(ResultType.Passed , "Pass", "Calibration Pass.");
+
+ }
+ }
+ else
+ {
+ context.AddResult(ResultType.Failed , "Error", "Password Fail.");
+ }
+ context.WriteLine("\n -- END OF SCRIPT -- ");
+ }
+}
+
diff --git a/Software/Stubs Collection/Procedures/WHS_waste_Tank_Calibration_Save_V0.txt b/Software/Stubs Collection/Procedures/WHS_waste_Tank_Calibration_Save_V0.txt
new file mode 100644
index 000000000..3bd4b1f84
--- /dev/null
+++ b/Software/Stubs Collection/Procedures/WHS_waste_Tank_Calibration_Save_V0.txt
@@ -0,0 +1,107 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Drawing;
+using Google.Protobuf;
+using Tango.BL.Entities;
+using Tango.BL.Enumerations;
+using Tango.PMR.Stubs;
+using Tango.PMR.Diagnostics;
+using Tango.FSE.Common.Connection;
+using Tango.FSE.Common.Diagnostics;
+using Tango.FSE.Procedures;
+
+
+public class Program
+{
+ double V0_default_ml = 8.7433;
+
+ public void OnExecute(IProcedureContext context)
+ {
+
+ var response1 = context.RequestUserInputFor<String>("Warning - you are going to change the value of Vo in the eeprom !!!\nPlease Enter Password to confirme:","");
+ if (response1=="Aa123456")
+ {
+ context.WriteLine(response1);
+
+ //Write_0_Vo_in_ml_to_eeprom
+ context.WriteLine("\nWrite_0_Vo_in_ml_to_eeprom");
+ StubWhsEEpromRequest stubWhsEEpromRequest = new StubWhsEEpromRequest();
+ stubWhsEEpromRequest.BurnRequest = true; //write
+ StubWhsEEpromData stubWhsEEpromData = new StubWhsEEpromData();
+ stubWhsEEpromData.Orifice1Flow = 0;
+ stubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;
+ var response = context.Send<StubWhsEEpromResponse>(stubWhsEEpromRequest);
+
+ //wait_10mSec
+ context.WriteLine("\nwait_10mSec");
+ Thread.Sleep(100); //Sleep for 10 milli.
+
+ //Read_Vo_in_ml_from_eeprom & verify it is 0
+ context.WriteLine("\nRead_Vo_in_ml_from_eeprom & verify it is 0");
+ stubWhsEEpromRequest.BurnRequest = false; //write
+ stubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;
+ var response2 = context.Send<StubWhsEEpromResponse>(stubWhsEEpromRequest);
+
+ //Read_Vo_in_mV
+ context.WriteLine("\nRead_Vo_in_mV");
+ var response3 = context.Send<ProgressResponse>("ProgressRequest" ,0x3EC, 0x01);
+ //Print_Vo_in_mV
+ context.WriteLine(response3.Progress);
+
+ //check validity
+ context.WriteLine("\ncheck validity");
+ if((response3.Progress <= 800) || (response3.Progress >=1200))
+ {
+ response3.Progress = 1076; //default
+ context.Write("\nERROR ------ Vreading value outside the defined range !!! ------");
+ context.AddResult(ResultType.Failed , "Error", "ERROR ------ Vreading value outside the defined range !!! ------");
+ }
+ else
+ {
+ //calculate_V0_in_ml
+ context.WriteLine("\ncalculate_V0_in_ml");
+ V0_default_ml = V0_default_ml * response3.Progress;
+
+ //print_Vo_in_ml
+ context.WriteLine("\nprint_Vo_in_ml");
+ context.WriteLine(V0_default_ml);
+ context.WriteLine("");
+
+ //Write_Vo_in_ml_to_eeprom
+ context.WriteLine("\nWrite_Vo_in_ml_to_eeprom");
+ stubWhsEEpromRequest.BurnRequest = true; //write
+
+ stubWhsEEpromData.Orifice1Flow = V0_default_ml;
+ stubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;
+ var response4 = context.Send<StubWhsEEpromResponse>(stubWhsEEpromRequest);
+
+ //wait_10mSec
+ context.WriteLine("\nwait_10mSec");
+ Thread.Sleep(100); //Sleep for 10 milli.
+
+ //Read_Vo_in_ml_from_eeprom
+ context.WriteLine("\nRead_Vo_in_ml_from_eeprom");
+ stubWhsEEpromRequest.BurnRequest = false; //write
+ stubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;
+ var response5 = context.Send<StubWhsEEpromResponse>(stubWhsEEpromRequest);
+
+ //Check if we read the correct value
+ context.WriteLine("\nVerify that we read the correct value of Orifice1Flow!!");
+ context.AddResult(ResultType.Passed , "Pass", "Calibration Pass.");
+
+ }
+ }
+ else
+ {
+ context.AddResult(ResultType.Failed , "Error", "Password Fail.");
+ }
+ context.WriteLine("\n -- END OF SCRIPT -- ");
+ }
+}
+
diff --git a/Software/Stubs Collection/Procedures/Waste Tank Calibration.pproj b/Software/Stubs Collection/Procedures/Waste Tank Calibration.pproj
new file mode 100644
index 000000000..6667cdf67
--- /dev/null
+++ b/Software/Stubs Collection/Procedures/Waste Tank Calibration.pproj
@@ -0,0 +1 @@
+{"$id":"1","Name":"Waste Tank Calibration","Description":"This procedure reads the values of waste tank volume when the tank is empty, and stores it in the WHS card EEPROM","Scripts":{"$id":"2","$values":[{"$id":"3","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Entities;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\n\r\npublic class Program\r\n{\r\n\tdouble V0_default_ml = 8.7433;\r\n\r\n public void OnExecute(IProcedureContext context)\r\n {\r\n \r\n\tvar response1 = context.RequestUserInputFor<String>(\"Warning - you are going to change the value of Vo in the eeprom !!!\\nPlease Enter Password to confirme:\",\"\");\r\n\tif (response1==\"Aa123456\")\r\n\t{\r\n\t\tcontext.WriteLine(response1);\r\n\t\t\r\n\t\t//Write_0_Vo_in_ml_to_eeprom\r\n\t\tcontext.WriteLine(\"\\nWrite_0_Vo_in_ml_to_eeprom\");\t\r\n\t\tStubWhsEEpromRequest stubWhsEEpromRequest = new StubWhsEEpromRequest();\r\n\t\tstubWhsEEpromRequest.BurnRequest = true; //write\r\n\t\tStubWhsEEpromData stubWhsEEpromData = new StubWhsEEpromData();\r\n\t\tstubWhsEEpromData.Orifice1Flow = 0;\r\n\t\tstubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;\r\n\t\tvar response = context.Send<StubWhsEEpromResponse>(stubWhsEEpromRequest);\r\n\t\t\t\t\r\n\t\t//wait_10mSec\r\n\t\tcontext.WriteLine(\"\\nwait_10mSec\");\t\r\n\t\tThread.Sleep(100); //Sleep for 10 milli.\r\n\t\t\r\n\t\t//Read_Vo_in_ml_from_eeprom\t& verify it is 0\r\n\t\tcontext.WriteLine(\"\\nRead_Vo_in_ml_from_eeprom\t& verify it is 0\");\r\n\t\tstubWhsEEpromRequest.BurnRequest = false; //write\r\n\t\tstubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;\r\n\t\tvar response2 = context.Send<StubWhsEEpromResponse>(stubWhsEEpromRequest);\r\n\t\t\r\n\t\t//Read_Vo_in_mV\r\n\t\tcontext.WriteLine(\"\\nRead_Vo_in_mV\");\r\n\t\tvar response3 = context.Send<ProgressResponse>(\"ProgressRequest\" ,0x3EC, 0x01);\r\n\t\t//Print_Vo_in_mV\r\n\t\tcontext.WriteLine(response3.Progress);\r\n\t\t\r\n\t\t//check validity\r\n\t\tcontext.WriteLine(\"\\ncheck validity\");\r\n\t\t if((response3.Progress <= 800) || (response3.Progress >=1200))\r\n\t\t {\r\n\t\t \tresponse3.Progress = 1076; //default\r\n\t\t \tcontext.Write(\"\\nERROR ------ Vreading value outside the defined range !!! ------\");\r\n\t\t \t context.AddResult(ResultType.Failed , \"Error\", \"ERROR ------ Vreading value outside the defined range !!! ------\");\r\n\t\t }\r\n\t\telse\r\n\t\t{\t\t\t\r\n\t\t\t//calculate_V0_in_ml\r\n\t\t\tcontext.WriteLine(\"\\ncalculate_V0_in_ml\");\r\n\t\t\tV0_default_ml = V0_default_ml * response3.Progress;\r\n\t\t\t\r\n\t\t\t//print_Vo_in_ml\r\n\t\t\tcontext.WriteLine(\"\\nprint_Vo_in_ml\");\r\n\t\t\tcontext.WriteLine(V0_default_ml);\r\n\t\t\tcontext.WriteLine(\"\");\r\n\t\t\t\r\n\t\t\t//Write_Vo_in_ml_to_eeprom\r\n\t\t\tcontext.WriteLine(\"\\nWrite_Vo_in_ml_to_eeprom\");\r\n\t\t\tstubWhsEEpromRequest.BurnRequest = true; //write\r\n\t\r\n\t\t\tstubWhsEEpromData.Orifice1Flow = V0_default_ml;\r\n\t\t\tstubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;\r\n\t\t\tvar response4 = context.Send<StubWhsEEpromResponse>(stubWhsEEpromRequest);\r\n\t\t\t\t\r\n\t\t\t//wait_10mSec\r\n\t\t\tcontext.WriteLine(\"\\nwait_10mSec\");\t\r\n\t\t\t Thread.Sleep(100); //Sleep for 10 milli.\r\n\t\t\t \t\t\r\n\t\t\t //Read_Vo_in_ml_from_eeprom\r\n\t\t\tcontext.WriteLine(\"\\nRead_Vo_in_ml_from_eeprom\");\r\n\t\t\tstubWhsEEpromRequest.BurnRequest = false; //write\r\n\t\t\tstubWhsEEpromRequest.WhsEEprom = stubWhsEEpromData;\r\n\t\t\tvar response5 = context.Send<StubWhsEEpromResponse>(stubWhsEEpromRequest);\r\n\t\t\t\r\n\t\t\t//Check if we read the correct value\r\n\t\t\tcontext.WriteLine(\"\\nVerify that we read the correct value of Orifice1Flow!!\");\r\n\t\t\t context.AddResult(ResultType.Passed , \"Pass\", \"Calibration Pass.\");\r\n\r\n\t\t\t}\r\n\t}\r\n\t\telse\r\n \t{\r\n\t\t\tcontext.AddResult(ResultType.Failed , \"Error\", \"Password Fail.\");\r\n\t\t}\r\n\t\tcontext.WriteLine(\"\\n -- END OF SCRIPT -- \");\r\n }\r\n}\r\n\r\n","Name":"Program.csx","IsEntryPoint":true},{"$id":"4","Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Drawing;\r\nusing Google.Protobuf;\r\nusing Tango.BL.Entities;\r\nusing Tango.BL.Enumerations;\r\nusing Tango.PMR.Stubs;\r\nusing Tango.PMR.Diagnostics;\r\nusing Tango.FSE.Common.Connection;\r\nusing Tango.FSE.Common.Diagnostics;\r\nusing Tango.FSE.Procedures;\r\n\r\npublic class Service\r\n{\r\n public double Calc(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}","Name":"Service.csx","IsEntryPoint":false}]},"Inputs":{"$id":"5","$values":[]},"Variables":{"$id":"6","$values":[]},"ReferenceAssemblies":{"$id":"7","$values":[{"$id":"8","File":"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","HintType":"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"9","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","HintType":"System.Linq.Enumerable, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"10","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Windows.Forms\\v4.0_4.0.0.0__b77a5c561934e089\\System.Windows.Forms.dll","HintType":"System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},{"$id":"11","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Procedures.dll","HintType":"Tango.FSE.Procedures.ProcedureProject, Tango.FSE.Procedures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"12","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.FSE.Common.dll","HintType":"Tango.FSE.Common.Diagnostics.IDiagnosticsProvider, Tango.FSE.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"13","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.BL.dll","HintType":"Tango.BL.Enumerations.TechMonitors, Tango.BL, Version=2.0.36.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"14","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.PMR.dll","HintType":"Tango.PMR.Common.MessageType, Tango.PMR, Version=2.0.40.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"15","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Transport.dll","HintType":"Tango.Transport.ITransporter, Tango.Transport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},{"$id":"16","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Tango.Integration.dll","HintType":"Tango.Integration.Operation.IMachineOperator, Tango.Integration, Version=2.0.31.1608, Culture=neutral, PublicKeyToken=null"},{"$id":"17","File":"C:\\Program Files (x86)\\Twine Solutions LTD\\Tango FSE\\Google.Protobuf.dll","HintType":"Google.Protobuf.IMessage, Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604"},{"$id":"18","File":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Drawing\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Drawing.dll","HintType":"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]},"Resources":{"$id":"19","$values":[]},"Dialogs":{"$id":"20","$values":[]},"ID":"a0ac651d-3e18-4b62-a761-f55425b4129f","ApartmentState":"STA"} \ No newline at end of file
diff --git a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTable.cpp b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTable.cpp
index 50a9ce9b3..1392559a5 100644
--- a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTable.cpp
+++ b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTable.cpp
@@ -111,7 +111,7 @@ void ColorTable::readColorTables(bool has_data, uint8_t * data, int nprocessrang
TagSize[i] = new int[2];
//TagSize[i] = DBG_NEW int[3];
tmp = conv.ByteToInt(buff, bytesread);
- n = sizeof((char*)&tmp);
+ n = sizeof(tmp);
//tmpC = DBG_NEW char[n];
conv.getchar(tmp, tmpC);
TagNames[i] = new char[n+1];
@@ -242,14 +242,14 @@ void ColorTable::readColorTables(bool has_data, uint8_t * data, int nprocessrang
}
case cprt:
{
- std::string textstr;
- read_text_type(TagSize[k][0], TagSize[k][1], &textstr, data);
+ // std::string textstr;
+ // 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, data);
+ // std::string textdescstr;
+ // read_text_description_type(TagSize[k][0], TagSize[k][1], &textdescstr, data);
break;
}
default:
@@ -364,14 +364,14 @@ CT_Header *ColorTable::read_header(uint8_t *data, int &bytesread)
bytesread += 1;
uint32_t tmp = Conv.ByteToInt(ColorTableData, bytesread);
//char *tmpC = DBG_NEW char[n];
- char tmpC_CS[sizeof((char*)&tmp)+1];
+ char tmpC_CS[sizeof(tmp)+1];
Conv.getchar(tmp, tmpC_CS);
//Header.ColorSpace = DBG_NEW char[n];
Header->SetColorSpace(tmpC_CS);
bytesread += 4;
tmp = Conv.ByteToInt(ColorTableData, bytesread);
- char tmp_connectionspace[sizeof((char*)&tmp)+1];
+ char tmp_connectionspace[sizeof(tmp)+1];
Conv.getchar(tmp, tmp_connectionspace);
//Header.ConnectionSpace = DBG_NEW char[n];
Header->SetConnectionSpace(tmp_connectionspace);
@@ -380,7 +380,7 @@ CT_Header *ColorTable::read_header(uint8_t *data, int &bytesread)
bytesread += 12;
tmp = Conv.ByteToInt(ColorTableData, bytesread);
- char tmp_DM[sizeof((char*)&tmp)+1];
+ char tmp_DM[sizeof(tmp)+1];
Conv.getchar(tmp, tmp_DM);
//Header.DeviceManufacturer = DBG_NEW char[n];
Header->SetDeviceManufacturer(tmp_DM);
@@ -492,14 +492,14 @@ void ColorTable::read_text_type(int offset, int data_size, std::string *textstr,
int bytesread = 0;
NumConversions Conv;
int tmp = Conv.ByteToInt(buff, bytesread);
- int n = sizeof((char*)&tmp);
+ int n = sizeof(tmp);
//char *tmpC = DBG_NEW char[n];
-// char tmpC[sizeof((char*)&tmp)];
- char tagtype[sizeof((char*)&tmp)+1];
- Conv.getchar(tmp, tagtype);
+ char tmpC[sizeof(tmp)];
+ char tagtype[sizeof(tmp)+1];
+ Conv.getchar(tmp, tmpC);
//char *tagtype = DBG_NEW char[n + 1];
-// strcpy(tagtype, tmpC);
- if (strncmp(tagtype, "text", sizeof((char*)&tmp)) != 0)
+ strncpy_s(tagtype, sizeof(tmp) + 1, tmpC, sizeof(tmp) );
+ if (strncmp(tagtype, "text", sizeof(tmp)) != 0)
{
throw std::exception("invalid Tag Name");
strstr << "";
@@ -515,33 +515,32 @@ void ColorTable::read_text_type(int offset, int data_size, std::string *textstr,
strstr.put(tmp1);
}
*textstr = strstr.str();
- return;
+ //return;
}
-void ColorTable::read_text_description_type(int offset, int data_size, std::string textdescstr, uint8_t *data)
+void ColorTable::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
-
+ std::stringstream strstr;
uint8_t *buff = &(data[offset]);
int bytesread = 0;
NumConversions Conv;
int tmp = Conv.ByteToInt(buff, bytesread);
- int n = sizeof((char*)&tmp);
+ int n = sizeof(tmp);
//char *tmpC= DBG_NEW char[n];
-// char tmpC[sizeof((char*)&tmp)];
- char tagtype[sizeof((char*)&tmp)+1];
- Conv.getchar(tmp, tagtype);
+ char tmpC[sizeof(tmp)];
+ char tagtype[sizeof(tmp)+1];
+ Conv.getchar(tmp, tmpC);
//char *tagtype = DBG_NEW char[n + 1];
-// strcpy(tagtype, tmpC);
- std::stringstream strstr;
- if (strncmp(tagtype, "desc", sizeof((char*)&tmp)) != 0)
+ strncpy_s(tagtype, sizeof(tmp)+1, tmpC, sizeof(tmp));
+ if (strncmp(tagtype, "desc", sizeof(tmp)) != 0)
{
throw std::exception("invalid Tag Name");
strstr << "";
- textdescstr = strstr.str();
+ *textdescstr = strstr.str();
return;
}
bytesread += 8;
@@ -553,8 +552,8 @@ void ColorTable::read_text_description_type(int offset, int data_size, std::stri
tmp1 = buff[bytesread + i];
strstr << tmp1;
}
- textdescstr = strstr.str();
- return;
+ *textdescstr = strstr.str();
+ //return;
}
void ColorTable::SetNormFactor()
diff --git a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTable.h b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTable.h
index 9538a4011..99ae37529 100644
--- a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTable.h
+++ b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTable.h
@@ -69,7 +69,7 @@ private:
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,
uint8_t *data);
- void read_text_description_type(int offset, int data_size, std::string textdescstr,
+ void read_text_description_type(int offset, int data_size, std::string *textdescstr,
uint8_t *data);
};
diff --git a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTransf.cpp b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTransf.cpp
index 699011ddb..b723bbe65 100644
--- a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTransf.cpp
+++ b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/ColorTransf.cpp
@@ -114,17 +114,17 @@ using namespace std;
int tmpB =Conv.ByteToInt(buffer, 0);
bytesread += 4;
- int n = sizeof((char*)&tmpB);
+ int n = sizeof(tmpB);
//char *tmpC = DBG_NEW char[n] ;
// char tmpC[sizeof((char*)&tmpB)];
- char luttype[sizeof((char*)&tmpB)+1];
+ char luttype[sizeof(tmpB)+1];
Conv.getchar(tmpB, luttype);
//char *luttype = DBG_NEW char[n + 1];
// strcpy(luttype,tmpC);
int TablePrecision;
- if (strncmp(luttype, "prc1", sizeof((char*)&tmpB))==0)
+ if (strncmp(luttype, "prc1", sizeof(tmpB))==0)
TablePrecision = 1;
- else if (strncmp(luttype, "prc2", sizeof((char*)&tmpB))==0)
+ else if (strncmp(luttype, "prc2", sizeof(tmpB))==0)
TablePrecision = 2;
else
{
diff --git a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/Curves.cpp b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/Curves.cpp
index 1f2024e71..96d20d8cf 100644
--- a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/Curves.cpp
+++ b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/Curves.cpp
@@ -65,17 +65,17 @@ void Curves::InitData(unsigned char* colorTransformBuffer, long colorTransformFi
int tmpB = Conv.ByteToInt(buffer, 0);
bytesread += 4;
- int n = sizeof((char*)&tmpB);
//char *tmpC = DBG_NEW char[n] ;
// char tmpC[sizeof((char*)&tmpB)];
- char Curvetype[sizeof((char*)&tmpB)+1];
+ //char Curvetype[sizeof((char*)&tmpB)+1];
+ char Curvetype[sizeof(tmpB) + 1];
Conv.getchar(tmpB, Curvetype);
//char *luttype = DBG_NEW char[n + 1];
// strcpy(Curvetype, tmpC);
int TablePrecision;
- if (strncmp(Curvetype, "prc1", sizeof((char*)&tmpB)) == 0)
+ if (strncmp(Curvetype, "prc1", sizeof(tmpB)) == 0)
TablePrecision = 1;
- else if (strncmp(Curvetype, "prc2", sizeof((char*)&tmpB)) == 0)
+ else if (strncmp(Curvetype, "prc2", sizeof(tmpB)) == 0)
TablePrecision = 2;
else
{
diff --git a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/GBD.cpp b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/GBD.cpp
index 56696e296..7649d2822 100644
--- a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/GBD.cpp
+++ b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/Utils/GBD.cpp
@@ -207,18 +207,18 @@ void GBD::InitData(unsigned char* colorTransformBuffer, long colorTransformFileS
int tmpB = Conv.ByteToInt(buffer, 0);
bytesread += 4;
- int n = sizeof((char*)&tmpB);
+ int n = sizeof(tmpB);
//char *tmpC = DBG_NEW char[n];
//char tmpC[sizeof((char*)&tmpB)];
- char tableType[sizeof((char*)&tmpB)+1];
+ char tableType[sizeof(tmpB)+1];
Conv.getchar(tmpB, tableType);
//char *tableType = DBG_NEW char[n + 1];
// strcpy(tableType, tmpC);
int TablePrecision;
- if (strncmp(tableType, "prc1", sizeof((char*)&tmpB)) == 0)
+ if (strncmp(tableType, "prc1", sizeof(tmpB)) == 0)
TablePrecision = 1;
- else if (strncmp(tableType, "prc2", sizeof((char*)&tmpB)) == 0)
+ else if (strncmp(tableType, "prc2", sizeof(tmpB)) == 0)
TablePrecision = 2;
else
{
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Properties/AssemblyInfo.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/Properties/AssemblyInfo.cs
index 076589303..e079b335d 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Properties/AssemblyInfo.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Properties/AssemblyInfo.cs
@@ -8,4 +8,4 @@ using System.Windows;
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Tango PPC Application")]
-[assembly: AssemblyVersion("1.1.24.0")]
+[assembly: AssemblyVersion("1.1.25.0")]
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/app.manifest b/Software/Visual_Studio/PPC/Tango.PPC.UI/app.manifest
index efc5f8179..d72e75011 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.UI/app.manifest
+++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/app.manifest
@@ -16,7 +16,7 @@
Remove this element if your application requires this virtualization for backwards
compatibility.
-->
- <!--<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />-->
+ <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>