diff options
| author | Shlomo Hecht <shlomo@twine-s.com> | 2019-02-27 12:05:21 +0200 |
|---|---|---|
| committer | Shlomo Hecht <shlomo@twine-s.com> | 2019-02-27 12:05:21 +0200 |
| commit | 067e34ae548d2125cf92477af4e8afb4e85f63ce (patch) | |
| tree | 7bbd5184939f427b9df193948c35d9a1f700e2ea /Software/Embedded_SW | |
| parent | 39b56dcb67c5b1aa99975a724916429ae25576c0 (diff) | |
| parent | 88a73106e8113a4a6ce224f9205e11219939798e (diff) | |
| download | Tango-067e34ae548d2125cf92477af4e8afb4e85f63ce.tar.gz Tango-067e34ae548d2125cf92477af4e8afb4e85f63ce.zip | |
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software/Embedded_SW')
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; |
