aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2019-02-27 12:05:21 +0200
committerShlomo Hecht <shlomo@twine-s.com>2019-02-27 12:05:21 +0200
commit067e34ae548d2125cf92477af4e8afb4e85f63ce (patch)
tree7bbd5184939f427b9df193948c35d9a1f700e2ea /Software/Embedded_SW/Embedded
parent39b56dcb67c5b1aa99975a724916429ae25576c0 (diff)
parent88a73106e8113a4a6ce224f9205e11219939798e (diff)
downloadTango-067e34ae548d2125cf92477af4e8afb4e85f63ce.tar.gz
Tango-067e34ae548d2125cf92477af4e8afb4e85f63ce.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software/Embedded_SW/Embedded')
-rw-r--r--Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c2
-rw-r--r--Software/Embedded_SW/Embedded/DataDef.h3
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c27
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h2
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c5
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.h7
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/RFIDTagInfo.h49
-rw-r--r--Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c45
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c1
-rw-r--r--Software/Embedded_SW/Embedded/Modules/General/Safety.c114
-rw-r--r--Software/Embedded_SW/Embedded/Modules/General/Safety.h15
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c20
-rw-r--r--Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c2
13 files changed, 266 insertions, 26 deletions
diff --git a/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c b/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c
index 2531a3e79..5bfd47b44 100644
--- a/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c
+++ b/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c
@@ -20,7 +20,7 @@ typedef struct
} TangoVersion_t;
-TangoVersion_t _gTangoVersion = {1,3,7,5};
+TangoVersion_t _gTangoVersion = {1,3,7,6};
#define BUILD_DATE __DATE__
char Dat[50] = BUILD_DATE;
char _gTangoName [MAX_STRING_LEN] = "Tango01 ";//d
diff --git a/Software/Embedded_SW/Embedded/DataDef.h b/Software/Embedded_SW/Embedded/DataDef.h
index 2c78e1b1c..ec2def5a7 100644
--- a/Software/Embedded_SW/Embedded/DataDef.h
+++ b/Software/Embedded_SW/Embedded/DataDef.h
@@ -126,6 +126,9 @@ enum
#define DOUBLE_BUFFER 2
+#define No_Safety_Event 1
+#define Safety_Event_Occurred 0
+
#define CurrentMotDriver 0x08
#define VoltageMotDriver 0x00
#define CurrentCombinedMotDriver 0x0108 // 01 Combined Driver, 08 Current
diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c
index c3d8426a6..dc34cbd2d 100644
--- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c
+++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c
@@ -148,43 +148,43 @@ void FPGA_Read_LS_Safty_Ind_Reg()
}
-bool Check_Disp_Sfaty_Stop_Indication(uint8_t Dispenser_ID)//0..7
+bool Check_Disp_Safety_Stop_Indication(uint8_t Dispenser_ID)//0..7
{
- bool Sfaty_Indication = OK;
+ bool Safety_Indication = OK;
assert(Dispenser_ID < MAX_DISPENSER_NUM);
switch(Dispenser_ID)
{
case 0:
- Sfaty_Indication = LS_Dispenser_1_2.bits.F2_DISP_SAFETY_STOP_IND_1;
+ Safety_Indication = LS_Dispenser_1_2.bits.F2_DISP_SAFETY_STOP_IND_1;
break;
case 1:
- Sfaty_Indication = LS_Dispenser_1_2.bits.F2_DISP_SAFETY_STOP_IND_2;
+ Safety_Indication = LS_Dispenser_1_2.bits.F2_DISP_SAFETY_STOP_IND_2;
break;
case 2:
- Sfaty_Indication = LS_Dispenser_3_4.bits.F2_DISP_SAFETY_STOP_IND_3;
+ Safety_Indication = LS_Dispenser_3_4.bits.F2_DISP_SAFETY_STOP_IND_3;
break;
case 3:
- Sfaty_Indication = LS_Dispenser_3_4.bits.F2_DISP_SAFETY_STOP_IND_4;
+ Safety_Indication = LS_Dispenser_3_4.bits.F2_DISP_SAFETY_STOP_IND_4;
break;
case 4:
- Sfaty_Indication = LS_Dispenser_5_6.bits.F2_DISP_SAFETY_STOP_IND_5;
+ Safety_Indication = LS_Dispenser_5_6.bits.F2_DISP_SAFETY_STOP_IND_5;
break;
case 5:
- Sfaty_Indication = LS_Dispenser_5_6.bits.F2_DISP_SAFETY_STOP_IND_6;
+ Safety_Indication = LS_Dispenser_5_6.bits.F2_DISP_SAFETY_STOP_IND_6;
break;
case 6:
- Sfaty_Indication = LS_Dispenser_7_8.bits.F2_DISP_SAFETY_STOP_IND_7;
+ Safety_Indication = LS_Dispenser_7_8.bits.F2_DISP_SAFETY_STOP_IND_7;
break;
case 7:
- Sfaty_Indication = LS_Dispenser_7_8.bits.F2_DISP_SAFETY_STOP_IND_8;
+ Safety_Indication = LS_Dispenser_7_8.bits.F2_DISP_SAFETY_STOP_IND_8;
break;
default:
break;
}
- return Sfaty_Indication;
+ return Safety_Indication;
}
bool FPGA_Read_limit_Switches(FPGA_GPI_ENUM Limit_Switch)
@@ -406,10 +406,10 @@ bool FPGA_Read_limit_Switches(FPGA_GPI_ENUM Limit_Switch)
LM_Status = Ls_Dryer_Dh.bits.F1_LS_DH_CLEAN_UP;
break;
case GPI_LS_DH_CLEAN_RIGHT:
- LM_Status = Ls_Dryer_Dh.bits.F1_LS_DH_CLEAN_RIGHT;
+ LM_Status = !(Ls_Dryer_Dh.bits.F1_LS_DH_CLEAN_RIGHT);
break;
case GPI_LS_DH_CLEAN_LEFT:
- LM_Status = Ls_Dryer_Dh.bits.F1_LS_DH_CLEAN_LEFT;
+ LM_Status = !(Ls_Dryer_Dh.bits.F1_LS_DH_CLEAN_LEFT);
break;
case GPI_LS_DH_CLEAN_DOWN:
LM_Status = Ls_Dryer_Dh.bits.F1_LS_DH_CLEAN_DOWN;
@@ -561,6 +561,7 @@ bool WHS_GPI_CHILLER_FAULT()
bool WHS_GPI_WASTE_OVERFULL()//waste tank overflow
{
+#warning NA need to check the DISP_SAFETY_STOP_IND of all the connected dispensers
return F2_GPI_Reg.bits.F2_WASTE_OVERFULL_NO;
}
diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h
index c83e939fd..c98ba5941 100644
--- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h
+++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h
@@ -234,7 +234,7 @@ typedef enum
void Pumps_Control(PUMPS_ENUM Pump_Id, bool Direction);
uint32_t Control_Dryer_Fan(bool StartStop, uint8_t PWM_Command_Precent);
-bool Check_Disp_Sfaty_Stop_Indication(uint8_t Dispenser_ID);
+bool Check_Disp_Safety_Stop_Indication(uint8_t Dispenser_ID);
bool Emergency_Push_Button_Report();
//bool Dryer_Door_Switch();
uint8_t Pannel_Leds(PANEL_BUTTON_OR_CRAT_ID Pannel_Led_Id, OPERATION_MODE LED_Mode);
diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c
index 4f78927d8..96e42fc36 100644
--- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c
+++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c
@@ -355,3 +355,8 @@ double Get_Heaters_Current(HEATERS_CURRENT Heater_ID) //0-8
assert (Heater_ID<NUM_OF_HEATERS);
return Heaters_Current[Heater_ID];
}
+int Get_Heaters_Current_Integer(HEATERS_CURRENT Heater_ID) //0-8
+{
+ assert (Heater_ID<NUM_OF_HEATERS);
+ return (int)(Heaters_Current[Heater_ID]*100);
+}
diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.h b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.h
index 408feb745..1c5fb6dbd 100644
--- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.h
+++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.h
@@ -50,9 +50,10 @@ void MidTankPressureCorrection(double Offset);
void Enable_MidTank_Pressure_Reading(MidTank_t MidTank_ID); //0-7
void Disable_MidTank_Pressure_Reading(MidTank_t MidTank_ID); //0-7
-void Enable_Head_MixChip_Heaters_Current_Reading(HEATERS_CURRENT Heater_ID);
-void Disable_Head_MixChip_Heaters_Current_Reading(HEATERS_CURRENT Heater_ID); //0-5
+void Enable_Reading_Heaters_Current(HEATERS_CURRENT Heater_ID);
+void Disable_Reading_Heaters_Current(HEATERS_CURRENT Heater_ID); //0-5
uint32_t Read_Head_MixChip_Heaters_Current(HEATERS_CURRENT Heater_ID);
-double Get_Head_MixChip_Heaters_Current(HEATERS_CURRENT Heater_ID);
+double Get_Heaters_Current(HEATERS_CURRENT Heater_ID);
+int Get_Heaters_Current_Integer(HEATERS_CURRENT Heater_ID); //0-8
#endif /* DRIVERS_I2C_COMMUNICATION_ADC_MUX_ADC_MUX_H_ */
diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/RFIDTagInfo.h b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/RFIDTagInfo.h
new file mode 100644
index 000000000..9136e4007
--- /dev/null
+++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/RFID_NFC/RFIDTagInfo.h
@@ -0,0 +1,49 @@
+/*
+ * RFIDTagInfo.h
+ *
+ * Created on: Feb 26, 2019
+ * Author: avi
+ */
+
+#ifndef DRIVERS_I2C_COMMUNICATION_RFID_NFC_RFIDTAGINFO_H_
+#define DRIVERS_I2C_COMMUNICATION_RFID_NFC_RFIDTAGINFO_H_
+
+typedef struct
+{
+ uint8_t TagUniqueID[7]; //RFID Tag unique ID
+ uint8_t CartSN[16]; //Cartridge serial number
+ uint32_t InkFactoryID:24; //Ink factory ID
+ uint32_t FillSysID:16; //Filling system ID number
+ uint32_t ColorID; //Color description / ID
+ uint32_t InkCategory:16; //Ink category (TBD)
+ uint32_t Type_Rev:16; //TBD – can be formulation #
+ uint32_t CartridgeSize; //Size in cc
+ uint32_t FiledInkVol; //Size in cc
+ uint32_t InkBatchNo:16; //MFG batch No’
+ uint8_t InkMFGDate[6]; //Date Ink was manufactured (20L container bar-code)
+ uint8_t InkEOLDate[6]; //Ink end of life date
+ uint8_t CartFillDate[6]; //Date cartridge was filled with ink (CFS)
+ uint8_t WasteFillDate[6]; //Date cartridge was filled with waste (Machine)
+ uint32_t Misc;
+ uint32_t PluginCounter:16; //Number of times cartridge was plugged in INK Slot
+ uint8_t InkFillStatus; //State indicator - successful state change when starting to fill mid. tank
+ uint8_t InkUsedStatus;
+ uint8_t InkEmptyStatus;
+ uint8_t WasteEmptyStatus;
+ uint8_t WasteFillStatus;
+ uint8_t WasteFullStatus;
+ uint8_t Blocked;
+ uint8_t Fail;
+ uint32_t WasteCounter:16;
+ uint8_t MachineIdINL[16];
+ uint8_t MachineIdWST[16];
+ uint8_t Spare[4];
+}NFCTag_t;
+
+typedef union
+{
+ NFCTag_t Struct;
+ uint8_t Buf[sizeof(NFCTag)];
+}NFC_Tag;
+
+#endif /* DRIVERS_I2C_COMMUNICATION_RFID_NFC_RFIDTAGINFO_H_ */
diff --git a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c
index fddf73ab5..6f8013557 100644
--- a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c
+++ b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c
@@ -270,18 +270,34 @@ const AlarmHandlingItemStruc AlarmItem[MAX_SYSTEM_ALARMS]={
{ eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_MECHANISM_MOTOR_UNDERVOLTAGE ," MotorDyeingHeadCleaningUnderVoltage " }, /* 5038 */
{ eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_HEAD_MOTOR_UNDERVOLTAGE ," MotorDyeingHeadCleaningHeadUnderVoltage " }, /* 5042 */
-// { eOneSecond, CurrentAlarm, HEAD_ZONE_1 , HEAD_ZONE_1 , 1 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_1_CURRENT_OUT_OF_RANGE ," Head Zone 1 Heater Current Out Of Range " }, /* 5018 */
-// { eOneSecond, CurrentAlarm, HEAD_ZONE_2 , HEAD_ZONE_2 , 1 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_2_CURRENT_OUT_OF_RANGE ," Head Zone 2 Heater Current Out Of Range " }, /* 5019 */
-// { eOneSecond, CurrentAlarm, HEAD_ZONE_3 , HEAD_ZONE_3 , 1 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_3_CURRENT_OUT_OF_RANGE ," Head Zone 3 Heater Current Out Of Range " }, /* 5020 */
-// { eOneSecond, CurrentAlarm, HEAD_ZONE_4 , HEAD_ZONE_4 , 1 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_4_CURRENT_OUT_OF_RANGE ," Head Zone 4 Heater Current Out Of Range " }, /* 5021 */
-// { eOneSecond, CurrentAlarm, HEAD_ZONE_5_6 , HEAD_ZONE_5_6 , 1 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_5_6_CURRENT_OUT_OF_RANGE ," Head Zone 5-6 Heater Current Out Of Range " }, /* 5022 */
-// { eOneSecond, CurrentAlarm, MIXCHIP , MIXCHIP , 1 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__MIXER_CURRENT_OUT_OF_RANGE ," Mixer Heater Current Out Of Range " }, /* 6004 */
+ { eOneSecond, CurrentAlarm, HEAD_ZONE_1_6 , HEAD_ZONE_1_6 , 312 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_1_CURRENT_OUT_OF_RANGE ," Head Zone 1 Heater Current Out Of Range " }, /* 5018 */
+ { eOneSecond, CurrentAlarm, HEAD_ZONE_2 , HEAD_ZONE_2 , 187 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_2_CURRENT_OUT_OF_RANGE ," Head Zone 2 Heater Current Out Of Range " }, /* 5019 */
+ { eOneSecond, CurrentAlarm, HEAD_ZONE_3 , HEAD_ZONE_3 , 187 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_3_CURRENT_OUT_OF_RANGE ," Head Zone 3 Heater Current Out Of Range " }, /* 5020 */
+ { eOneSecond, CurrentAlarm, HEAD_ZONE_4 , HEAD_ZONE_4 , 312 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_4_CURRENT_OUT_OF_RANGE ," Head Zone 4 Heater Current Out Of Range " }, /* 5021 */
+ { eOneSecond, CurrentAlarm, HEAD_ZONE_5 , HEAD_ZONE_5 , 312 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_5_6_CURRENT_OUT_OF_RANGE ," Head Zone 5-6 Heater Current Out Of Range " }, /* 5022 */
+ { eOneSecond, CurrentAlarm, MIXCHIP , MIXCHIP , 187 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__MIXER_CURRENT_OUT_OF_RANGE ," Mixer Heater Current Out Of Range " }, /* 6004 */
+ { eOneSecond, CurrentAlarm, DRYER_CURRENT_1, DRYER_CURRENT_1, 1 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DRYER_HEATERS_ZONE_1_CURRENT_OUT_OF_RANGE ," Drier Heater 1 Current Out Of Range " }, /* 6004 */
+ { eOneSecond, CurrentAlarm, DRYER_CURRENT_2, DRYER_CURRENT_2, 1 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DRYER_HEATERS_ZONE_2_CURRENT_OUT_OF_RANGE ," Drier Heater 2 Current Out Of Range " }, /* 6004 */
+ {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DYEING_HEAD_THERMAL_CUTOFF,"Dyeing head Thermal Cut-Off"},
{eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__THREAD_BREAK,"Thread Break"},
{eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__THREAD_TENSION_CONTROL_FAILURE_FEEDER_DANCER,"Thread Feeder Tension Control Failure"},
{eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__THREAD_TENSION_CONTROL_FAILURE_PULLER_DANCER,"Thread Puller Tension Control Failure"},
{eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__THREAD_TENSION_CONTROL_FAILURE_WINDER_DANCER,"Thread Winder Tension Control Failure"},
- {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__WINDER_CONE_DOES_NOT_EXIST,"No cone in winder"}
+ {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__WINDER_CONE_DOES_NOT_EXIST,"No cone in winder"},
+
+ {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_1_OVERPRESSURE,"Dispenser 1 OverPressure"},
+ {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_2_OVERPRESSURE,"Dispenser 2 OverPressure"},
+ {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_3_OVERPRESSURE,"Dispenser 3 OverPressure"},
+ {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_4_OVERPRESSURE,"Dispenser 4 OverPressure"},
+ {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_5_OVERPRESSURE,"Dispenser 5 OverPressure"},
+ {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_6_OVERPRESSURE,"Dispenser 6 OverPressure"},
+ {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_7_OVERPRESSURE,"Dispenser 7 OverPressure"},
+ {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_8_OVERPRESSURE,"Dispenser 8 OverPressure"},
+
+ {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DRYER_DOOR_OPEN,"Dryer Door is open"},
+ {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__NO_AIR_PRESSURE,"No suction in the waste handling system"},
+ {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__AIR_FILTER_NOT_INSTALLED,"Air filter missing"},
};
char AlarmStorePath[50] = "0://SysInfo//AlarmPrm.msg";
@@ -718,6 +734,21 @@ uint32_t AlarmHandlingLoop(uint32_t tick)
}
break;
case CurrentAlarm:
+ value = Get_Heaters_Current_Integer(AlarmItem[Alarm_i].DeviceId);
+ if (AlarmItem[Alarm_i].AlarmDirection == true)
+ {
+ if (value >= AlarmItem[Alarm_i].AlarmValue)
+ {
+ Status = true;
+ }
+ }
+ else
+ {
+ if (value <= AlarmItem[Alarm_i].AlarmValue)
+ {
+ Status = true;
+ }
+ }
break;
case MotorAlarm:
if (isMotorConfigured((TimerMotors_t)AlarmItem[Alarm_i].DeviceId) == false)
diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c
index b696532ec..72dd92d54 100644
--- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c
+++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c
@@ -239,7 +239,6 @@ void DiagnosticsLoadDigitalValues(void)
DigitalOutputState[10].interfaceio = INTERFACE_IOS__GPO_SPARE_SSR13_CTRL;
DigitalOutputState[10].value = ReadHeadMagnetBit();
-#warning get the magnet state
DigitalOutputState[11].interfaceio = INTERFACE_IOS__GPO_LED4;
DigitalOutputState[11].value = DataUpdated;
diff --git a/Software/Embedded_SW/Embedded/Modules/General/Safety.c b/Software/Embedded_SW/Embedded/Modules/General/Safety.c
new file mode 100644
index 000000000..840898db7
--- /dev/null
+++ b/Software/Embedded_SW/Embedded/Modules/General/Safety.c
@@ -0,0 +1,114 @@
+/*
+ * Safety.c
+ *
+ * Created on: Feb 26, 2019
+ * Author: shlomo
+ * This file includes the safety indication handling functions:
+ * Dispensers safety,Dryer door, Air suction, Air filter presence, Waste overflow
+ */
+
+#include "drivers/Motors/Motor.h"
+#include "drivers/Heater/TemperatureSensor.h"
+#include "drivers/FPGA/FPGA_SPI_Comm.h"
+#include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h"
+#include "drivers/FPGA/FPGA.h"
+
+#include <PMR/Diagnostics/EventType.pb-c.h>
+
+#include "Modules/General/GeneralHardware.h"
+#include "modules/control/control.h"
+#include "modules/AlarmHandling/AlarmHandling.h"
+#include "modules/thread/thread_ex.h"
+#include "modules/heaters/heaters_ex.h"
+#include "modules/ids/ids_ex.h"
+
+uint32_t SafetyControlId;
+bool DispenserOverPressure[MAX_SYSTEM_DISPENSERS] = {false,false,false,false,false,false,false,false};
+uint32_t Safety_Main_State(uint32_t IfIndex, uint32_t BusyFlag);
+
+void Safety_Init(void)
+{
+ SafetyControlId = AddControlCallback( Safety_Main_State, eOneSecond, TemplateDataReadCBFunction,0,0, 0 );
+ //return;
+}
+uint32_t Safety_Main_State(uint32_t IfIndex, uint32_t BusyFlag)
+{
+ int Disp_i;
+ bool AllDispensersInSafety = true;
+ bool AnyDispensersInSafety = false;
+ for (Disp_i = 0;Disp_i < MAX_SYSTEM_DISPENSERS;Disp_i++)
+ {
+ if (isMotorConfigured(Disp_i + HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1)==true)
+ {
+ AllDispensersInSafety &= Check_Disp_Safety_Stop_Indication(Disp_i);
+ AnyDispensersInSafety |= Check_Disp_Safety_Stop_Indication(Disp_i);
+ }
+ }
+
+ if (AllDispensersInSafety)
+ {
+ if (Get_COVER_1_State(DryerDoor))
+ {
+ //report and handle dryer door open
+ AlarmHandlingSetAlarm(EVENT_TYPE__DRYER_DOOR_OPEN, true);
+ }
+ else
+ {
+ if (WHS_GPI_WASTE_FLOW_SWITCH())
+ {
+ //report and handle air flow failure
+ //if blower if off handling is different
+ AlarmHandlingSetAlarm(EVENT_TYPE__NO_AIR_PRESSURE, true);
+ }
+ else
+ {
+ if (WHS_GPI_SW_FILTER_PRES())
+ {
+ //report and handle filter missing
+ AlarmHandlingSetAlarm(EVENT_TYPE__AIR_FILTER_NOT_INSTALLED, true);
+ }
+ else
+ {
+ //if (WHS_GPI_WASTE_OVERFULL()) - cannot read this switch
+ {
+ //report and handle waste overflow
+ AlarmHandlingSetAlarm(EVENT_TYPE__WASTE_CONTAINER_OVERFLOW, true);
+ }
+ }
+ }
+ }
+ }
+ else if (AnyDispensersInSafety)
+ {
+ for (Disp_i = 0;Disp_i < MAX_SYSTEM_DISPENSERS;Disp_i++)
+ {
+ if (isMotorConfigured(Disp_i + HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1)==true)
+ {
+ if (Check_Disp_Safety_Stop_Indication(Disp_i) == true)
+ {
+ //report dispenser over pressure
+ AlarmHandlingSetAlarm(EVENT_TYPE__DISPENSER_1_OVERPRESSURE+Disp_i, true);
+ DispenserOverPressure[Disp_i] = true;
+ }
+ }
+ }
+ }
+ for (Disp_i = 0;Disp_i < MAX_SYSTEM_DISPENSERS;Disp_i++)
+ {
+ if (DispenserOverPressure[Disp_i] == true)
+ {
+ if (isMotorConfigured(Disp_i + HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1)==true)
+ {
+ if (Check_Disp_Safety_Stop_Indication(Disp_i) == false)
+ {
+ //report dispenser over pressure
+ AlarmHandlingSetAlarm(EVENT_TYPE__DISPENSER_1_OVERPRESSURE+Disp_i, false);
+ DispenserOverPressure[Disp_i] = false;
+ }
+ }
+ }
+ }
+
+ return OK;
+}
+
diff --git a/Software/Embedded_SW/Embedded/Modules/General/Safety.h b/Software/Embedded_SW/Embedded/Modules/General/Safety.h
new file mode 100644
index 000000000..266da1c56
--- /dev/null
+++ b/Software/Embedded_SW/Embedded/Modules/General/Safety.h
@@ -0,0 +1,15 @@
+/*
+ * Safety.h
+ *
+ * Created on: Feb 26, 2019
+ * Author: shlomo
+ */
+
+#ifndef MODULES_GENERAL_SAFETY_H_
+#define MODULES_GENERAL_SAFETY_H_
+
+
+void Safety_Init(void);
+
+
+#endif /* MODULES_GENERAL_SAFETY_H_ */
diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c
index 2647970c9..52be7f8f1 100644
--- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c
+++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c
@@ -31,6 +31,8 @@
#include "Drivers/Heater/TemperatureSensor.h"
#include "Drivers/I2C_Communication/DAC/blower.h"
#include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h"
+#include "drivers/I2C_Communication/ADC_MUX/ADC_MUX.h"
+
#include "StateMachines/Printing/PrintingSTM.h"
@@ -82,9 +84,12 @@ uint32_t SecondDryerHeaterMaxTempControl = 0xFF;
#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 8.5
+#define MAXIMUM_HEATER_READ 283
//old uint32_t HeaterId2PT100Id[MAX_HEATERS_NUM] = {DRYER_AIR_PT100,DRYER_MAIN_PT100,DRYER_SECONDARY_PT100,TEMP_SENSE_ANALOG_DYEINGH_TEMP1,TEMP_SENSE_ANALOG_DYEINGH_TEMP2,TEMP_SENSE_ANALOG_DYEINGH_TEMP3,TEMP_SENSE_ANALOG_DYEINGH_TEMP4,TEMP_SENSE_ANALOG_DYEINGH_TEMP5,TEMP_SENSE_ANALOG_MIXCHIP_TEMP,TEMP_SENSE_AN_ENCLOSURETEMP3};
uint32_t HeaterId2PT100Id[MAX_HEATERS_NUM] = {DRYER_AIR_PT100,DRYER_MAIN_PT100,DRYER_SECONDARY_PT100,TEMP_SENSE_ANALOG_DYEINGH_TEMP1,TEMP_SENSE_ANALOG_DYEINGH_TEMP2,TEMP_SENSE_ANALOG_DYEINGH_TEMP3,TEMP_SENSE_ANALOG_DYEINGH_TEMP4,TEMP_SENSE_ANALOG_DYEINGH_TEMP5,HEAD6_PT100,MIXER_PT100};
+HEATERS_CURRENT HeaterId2CurrentId[MAX_HEATERS_NUM] = {NUM_OF_HEATERS,DRYER_CURRENT_1,DRYER_CURRENT_2,HEAD_ZONE_1_6,HEAD_ZONE_2,HEAD_ZONE_3,HEAD_ZONE_4,HEAD_ZONE_5,HEAD_ZONE_1_6,MIXCHIP};
uint32_t DryerInternalPT100Id = DRYER_AIR_PT100;
bool HeatersRestart = false;
@@ -436,7 +441,15 @@ uint32_t PrepareHeater(int HeaterId, uint32_t SetTemperatue)
//HeaterPIDConfig[HeaterId].m_params.dt *=10;
//DCInitialHeating[HeaterId] = true;
HeaterReady[HeaterId] = false;
+
+ Enable_Reading_Heaters_Current(HeaterId2CurrentId[HeaterId]);
+
HeaterPreviousRead[HeaterId] = TemperatureSensorRead(HeaterId2PT100Id[HeaterId]);
+ if((abs(HeaterPreviousRead[HeaterId]-MINIMUM_HEATER_READ)<1)||(abs(MAXIMUM_HEATER_READ-HeaterPreviousRead[HeaterId])<10))
+ {
+ LOG_ERROR (HeaterId,"PT100 not working properly");
+ return ERROR;
+ }
Report("PrepareHeater Read", __FILE__,__LINE__,HeaterId, SetTemperatue, HeaterPreviousRead[HeaterId], 0);
if (ControlIdtoMaxHeaterId [HeaterId] == 0xFF)
ControlIdtoMaxHeaterId [HeaterId] = AddControlCallback( DcHeaterMaxTempCBFunction, eOneSecond,TemperatureSensorRead,(IfTypeHeaters*0x100+HeaterId),HeaterId2PT100Id[HeaterId],0);
@@ -455,6 +468,9 @@ uint32_t PrepareHeater(int HeaterId, uint32_t SetTemperatue)
if (ControlIdtoMaxHeaterId [HeaterId] == 0xFF)
ControlIdtoMaxHeaterId [HeaterId] = AddControlCallback( DcHeaterMaxTempCBFunction, eOneSecond,TemperatureSensorRead,(IfTypeHeaters*0x100+HeaterId),HeaterId2PT100Id[HeaterId],0);
+ Enable_Reading_Heaters_Current(HeaterId2CurrentId[HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain]);
+ Enable_Reading_Heaters_Current(HeaterId2CurrentId[HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary]);
+
if (MainDryerHeaterMaxTempControl == 0xFF)
MainDryerHeaterMaxTempControl = AddControlCallback( HeaterMaxTempCBFunction, eHundredMillisecond,TemperatureSensorRead,(IfTypeHeaters*0x100+HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain),HeaterId2PT100Id[HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain],0);
if (SecondDryerHeaterMaxTempControl == 0xFF)
@@ -723,6 +739,9 @@ uint32_t HeaterControlCBFunction(uint32_t IfIndex, uint32_t readValue)
HeatersControlStart();
////////////////////////
HeaterReady[index] = true;
+ Disable_Reading_Heaters_Current(HeaterId2CurrentId[HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain]);
+ Disable_Reading_Heaters_Current(HeaterId2CurrentId[HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary]);
+
AlarmHandlingSetAlarm(HeaterUnderEventType[index], false);
HeaterPrepareReady();
if (BlowerCfg.enabled == true)
@@ -839,6 +858,7 @@ uint32_t DCHeaterControlCBFunction(uint32_t IfIndex, uint32_t readValue)
//DCInitialHeating[index] = false;
HeatersControlStart();
HeaterReady[index] = true;
+ Disable_Reading_Heaters_Current(HeaterId2CurrentId[index]);
HeaterPrepareReady();
}
return OK;
diff --git a/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c b/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c
index 1d9ae4755..19503cf3f 100644
--- a/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c
+++ b/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c
@@ -10,6 +10,7 @@
#include "modules/General/GeneralHardware.h"
+#include "modules/General/Safety.h"
#include "modules/thread/thread.h"
#include "modules/ids/ids.h"
#include "modules/control/control.h"
@@ -134,6 +135,7 @@ uint32_t InitSequenceBlowerCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag)
Report("Remove control callback failed",__FILE__,__LINE__,(int)HWControlId,RpWarning,(int)InitSequenceBlowerCallBackFunction,0);
if (BlowerCfg.voltage)
Control_Voltage_To_Blower(BlowerCfg.heatingvoltage);
+ Safety_Init();
InitStages++;
InitSequenceStateMachine(InitStages);
return OK;