/* * 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 "drivers/I2C_Communication/Dispenser_Card/IO_Ports/Dispenser_IO.h" #include #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}; EventType DispenserAlarm[MAX_SYSTEM_DISPENSERS] = {0,0,0,0,0,0,0,0}; uint32_t Safety_Main_State(uint32_t IfIndex, uint32_t BusyFlag); bool DrierDoorAlarmState = false; bool AirFlowAlarmState = false; bool AirFilterAlarmState = false; bool WasteOverflowAlarmState = false; void Safety_Init(void) { SafetyControlId = AddControlCallback("Safety", 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; bool DispenserBypass = false; bool mDrierDoorAlarmState = false; bool mAirFlowAlarmState = false; bool mAirFilterAlarmState = false; bool mWasteOverflowAlarmState = 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); mDrierDoorAlarmState = true; DrierDoorAlarmState = 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); mAirFlowAlarmState = true; AirFlowAlarmState = true; } else { if (WHS_GPI_SW_FILTER_PRES()) { //report and handle filter missing AlarmHandlingSetAlarm(EVENT_TYPE__AIR_FILTER_NOT_INSTALLED, true); mAirFilterAlarmState = true; AirFilterAlarmState = true; } else { //if (WHS_GPI_WASTE_OVERFULL()) - cannot read this switch { //report and handle waste overflow AlarmHandlingSetAlarm(EVENT_TYPE__WASTE_CONTAINER_OVERFLOW, true); mWasteOverflowAlarmState = true; WasteOverflowAlarmState = 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) { Read_SingleDispenser_IO_Registers(Disp_i); //DispenserBypass = Get_Notification_Bypass(Disp_i); if(Get_Notification_Over_Press(Disp_i) == false) { //report dispenser over pressure AlarmHandlingSetAlarm(EVENT_TYPE__DISPENSER_1_OVERPRESSURE+Disp_i, true); DispenserAlarm[Disp_i] = EVENT_TYPE__DISPENSER_1_OVERPRESSURE+Disp_i; if (DispenserAlarm[Disp_i] == false) { IDS_Dispenser_Alarm_On(Disp_i); } DispenserOverPressure[Disp_i] = true; Report("Dispenser Safety - over pressure", __FILE__,__LINE__,Disp_i, RpFatalError, (int)(1000*GetDispenserPressure(Disp_i)), 0); } else if (Get_Notification_Disp_UP(Disp_i) == false) { AlarmHandlingSetAlarm(EVENT_TYPE__DISPENSER_1_UPPER_HARD_LIMIT+Disp_i, true); DispenserAlarm[Disp_i] = EVENT_TYPE__DISPENSER_1_UPPER_HARD_LIMIT+Disp_i; if (DispenserAlarm[Disp_i] == false) { IDS_Dispenser_Alarm_On(Disp_i); } DispenserOverPressure[Disp_i] = true; Report("Dispenser upper hard limit", __FILE__,__LINE__,Disp_i, RpFatalError, Get_Notification_Disp_UP(Disp_i), 0); } else if (Get_Notification_Disp_Down(Disp_i) == false) { AlarmHandlingSetAlarm(EVENT_TYPE__DISPENSER_1_LOWER_HARD_LIMIT+Disp_i, true); DispenserAlarm[Disp_i] = EVENT_TYPE__DISPENSER_1_LOWER_HARD_LIMIT+Disp_i; if (DispenserAlarm[Disp_i] == false) { IDS_Dispenser_Alarm_On(Disp_i); } DispenserOverPressure[Disp_i] = true; Report("Dispenser lower hard limit", __FILE__,__LINE__,Disp_i, RpFatalError, Get_Notification_Disp_Down(Disp_i), 0); } else { Report("Dispenser unknown safety alarm", __FILE__,__LINE__,Disp_i, RpFatalError,Get_Notification_Disp_Full(Disp_i), 0); } } } } } 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) { AlarmHandlingSetAlarm(DispenserAlarm[Disp_i], false); if (DispenserAlarm[Disp_i] == true) { IDS_Dispenser_Alarm_Off(Disp_i); } DispenserAlarm[Disp_i] = 0; DispenserOverPressure[Disp_i] = false; } } } } if ((mDrierDoorAlarmState != DrierDoorAlarmState)|| (mDrierDoorAlarmState == false)) { //alarm went off AlarmHandlingSetAlarm(EVENT_TYPE__DRYER_DOOR_OPEN, false); DrierDoorAlarmState = mDrierDoorAlarmState; } if ((mAirFlowAlarmState != AirFlowAlarmState)|| (mAirFlowAlarmState == false)) { //alarm went off AlarmHandlingSetAlarm(EVENT_TYPE__NO_AIR_PRESSURE, false); AirFlowAlarmState = mAirFlowAlarmState; } if ((mAirFilterAlarmState != AirFilterAlarmState)|| (mAirFilterAlarmState == false)) { //alarm went off AlarmHandlingSetAlarm(EVENT_TYPE__AIR_FILTER_NOT_INSTALLED, false); AirFilterAlarmState = mAirFilterAlarmState; } if ((mWasteOverflowAlarmState != WasteOverflowAlarmState)|| (mWasteOverflowAlarmState == false)) { //alarm went off AlarmHandlingSetAlarm(EVENT_TYPE__WASTE_CONTAINER_OVERFLOW, false); WasteOverflowAlarmState = mWasteOverflowAlarmState; } return OK; }