Index: firmware/App/Services/AlarmMgmtDD.c =================================================================== diff -u -r4b09605126f35b80406e95d079f3822c51a3ba25 -r0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d --- firmware/App/Services/AlarmMgmtDD.c (.../AlarmMgmtDD.c) (revision 4b09605126f35b80406e95d079f3822c51a3ba25) +++ firmware/App/Services/AlarmMgmtDD.c (.../AlarmMgmtDD.c) (revision 0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d) @@ -95,18 +95,19 @@ *************************************************************************/ static void activateAlarmDD( ALARM_ID_T alarm ) { + ALARM_T props; // verify given alarm if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) { - ALARM_T props = getAlarmProperties( alarm ); + props = getAlarmProperties( alarm ); // no need to do anything if alarm is already active if ( FALSE == isAlarmActive( alarm ) ) { // activate alarm activateAlarm( alarm ); - if ( TRUE == props.alarmIsDDFault ) + if ( ( TRUE == props.alarmIsDDFault ) && ( ALM_SRC_DD == props.alarmSource ) ) { // There is a DD fault alarm. isAFaultAlarmActive = TRUE; @@ -118,6 +119,18 @@ //requestNewOperationMode( DD_MODE_FAUL ); } } + if ( ( TRUE == props.alarmIsDDFault ) && ( ALM_SRC_FP == props.alarmSource ) ) + { + // There is a DD fault alarm cause by FP. + isAFaultAlarmActive = TRUE; + + if ( TRUE == isTransitionToFaultRequired() ) + { + // If alarm is a FP fault and the alarm manager can transition to fault immediately, go to fault mode + //TODO : Testing - remove the comment later + //requestNewFPOperationMode( FP_MODE_FAUL ); + } + } } } else @@ -175,7 +188,7 @@ void activateAlarm2Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData1, ALARM_DATA_T alarmData2, BOOL outside ) { TD_MODE_SUB_MODE_T tdModes; - ALARM_T props = getAlarmProperties( alarm ); + ALARM_T props = getAlarmProperties( alarm ); getTDOperationMode( &tdModes ); @@ -186,7 +199,7 @@ // broadcast alarm and data if alarm not already active if ( ( FALSE == isAlarmActive( alarm ) ) && ( TRUE == isTDCommunicating() ) ) { - broadcastAlarmTriggered( alarm, alarmData1, alarmData2 ); + broadcastAlarmTriggered( alarm, alarmData1, alarmData2, props.alarmSource ); } activateAlarmDD( alarm ); } @@ -207,7 +220,7 @@ *************************************************************************/ void clearAlarmDD( ALARM_ID_T alarm ) { - ALARM_T props = getAlarmProperties( alarm ); + ALARM_T props = getAlarmProperties( alarm ); // verify given alarm if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) @@ -217,7 +230,7 @@ { if ( TRUE == isTDCommunicating() ) { - broadcastAlarmCleared( alarm ); + broadcastAlarmCleared( alarm, props.alarmSource ); } setAlarmActive( alarm, FALSE ); clearAlarmConditionDD( alarm ); @@ -244,6 +257,7 @@ *************************************************************************/ void clearAlarmConditionDD( ALARM_ID_T alarm ) { + ALARM_T props = getAlarmProperties( alarm ); // verify given alarm if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) { @@ -252,7 +266,7 @@ { if ( TRUE == isTDCommunicating() ) { - broadcastAlarmConditionCleared( alarm ); + broadcastAlarmConditionCleared( alarm, props.alarmSource ); } setAlarmConditionDetected( alarm, FALSE ); } @@ -311,13 +325,15 @@ *************************************************************************/ void handleResendActiveAlarmsRequest( void ) { + ALARM_T props; U32 index; for ( index = 0; index < NUM_OF_ALARM_IDS; index++ ) { if ( TRUE == isAlarmActive( (ALARM_ID_T)index ) ) { - broadcastAlarmTriggered( index, BLANK_ALARM_DATA, BLANK_ALARM_DATA ); + props = getAlarmProperties( (ALARM_ID_T)index ); + broadcastAlarmTriggered( index, BLANK_ALARM_DATA, BLANK_ALARM_DATA, props.alarmSource ); } } } @@ -381,10 +397,61 @@ * TEST SUPPORT FUNCTIONS *************************************************************************/ +/*********************************************************************//** + * @brief + * The testDDClearAllAlarms function clears all active DD alarms, even if they + * are non-recoverable or faults. The caller of this function must provide + * the correct 32-bit key. A Dialin user must also be logged into DD. + * @details \b Inputs: none + * @details \b Outputs: alarmIsActive[], alarmStartedAt[] + * @details \b Message \b Sent: MSG_ID_ALARM_CLEARED to clear all alarms. + * @param key 32-bit supervisor alarm key required to perform this function + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testDDClearAllAlarms( MESSAGE_T *message ) +{ + BOOL result = FALSE; + ALARM_T props; + U32 key; + // Verify tester has logged in with TD + if ( TRUE == isTestingActivated() ) + { + // Verify payload length + if ( sizeof(U32) == message->hdr.payloadLen ) + { + memcpy( &key, message->payload, sizeof(U32) ); + + // Verify key + if ( SUPERVISOR_ALARM_KEY == key ) + { + ALARM_ID_T a; + + // Clear all active alarms + for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) + { + props = getAlarmProperties( a ); + if ( TRUE == isAlarmActive( a ) && ( ALM_SRC_DD == props.alarmSource)) + { + ALARM_NAME_DATA_T data; + + data.alarmName = (U32)a; + + broadcastData( MSG_ID_ALARM_CLEARED, COMM_BUFFER_OUT_CAN_DD_ALARM, (U08*)&data, sizeof( ALARM_NAME_DATA_T ) ); + setAlarmActive( a, FALSE ); + } + } + result = TRUE; + } + } + } + + return result; +} + /*********************************************************************//** * @brief - * The testClearAllAlarms function clears all active alarms, even if they + * The testFPClearAllAlarms function clears all active FP alarms, even if they * are non-recoverable or faults. The caller of this function must provide * the correct 32-bit key. A Dialin user must also be logged into DD. * @details \b Inputs: none @@ -393,32 +460,41 @@ * @param key 32-bit supervisor alarm key required to perform this function * @return TRUE if override reset successful, FALSE if not *************************************************************************/ -BOOL testClearAllAlarms( U32 key ) +BOOL testFPClearAllAlarms( MESSAGE_T *message ) { BOOL result = FALSE; + ALARM_T props; + U32 key; - // Verify key - if ( SUPERVISOR_ALARM_KEY == key ) + // Verify tester has logged in with TD + if ( TRUE == isTestingActivated() ) { - // Verify tester has logged in with HD - if ( TRUE == isTestingActivated() ) + // Verify payload length + if ( sizeof(U32) == message->hdr.payloadLen ) { - ALARM_ID_T a; + memcpy( &key, message->payload, sizeof(U32) ); - // Clear all active alarms - for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) + // Verify key + if ( SUPERVISOR_ALARM_KEY == key ) { - if ( TRUE == isAlarmActive( a ) ) + ALARM_ID_T a; + + // Clear all active alarms + for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) { - ALARM_NAME_DATA_T data; + props = getAlarmProperties( a ); + if ( TRUE == isAlarmActive( a ) && ( ALM_SRC_FP == props.alarmSource)) + { + ALARM_NAME_DATA_T data; - data.alarmName = (U32)a; + data.alarmName = (U32)a; - broadcastData( MSG_ID_ALARM_CLEARED, COMM_BUFFER_OUT_CAN_DD_ALARM, (U08*)&data, sizeof( ALARM_NAME_DATA_T ) ); - setAlarmActive( a, FALSE ); + broadcastData( MSG_ID_ALARM_CLEARED, COMM_BUFFER_OUT_CAN_FP_ALARM, (U08*)&data, sizeof( ALARM_NAME_DATA_T ) ); + setAlarmActive( a, FALSE ); + } } + result = TRUE; } - result = TRUE; } } Index: firmware/App/Services/AlarmMgmtDD.h =================================================================== diff -u -rf7c714a1a09b10d85a8b013712532d37b4d7b97a -r0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d --- firmware/App/Services/AlarmMgmtDD.h (.../AlarmMgmtDD.h) (revision f7c714a1a09b10d85a8b013712532d37b4d7b97a) +++ firmware/App/Services/AlarmMgmtDD.h (.../AlarmMgmtDD.h) (revision 0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d) @@ -62,7 +62,8 @@ BOOL isAnyCleaningModeInletWaterConditionActive( void ); -BOOL testClearAllAlarms( U32 key ); +BOOL testDDClearAllAlarms( MESSAGE_T *message ); +BOOL testFPClearAllAlarms( MESSAGE_T *message ); BOOL testSetAlarmInfoPublishIntervalOverride( U32 ms ); BOOL testResetAlarmInfoPublishIntervalOverride( void ); Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r1e1b46f60309736d833cad4876a43e73a148ac5a -r0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 1e1b46f60309736d833cad4876a43e73a148ac5a) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d) @@ -25,6 +25,8 @@ #include "Compatible.h" #include "ConcentratePumps.h" #include "DialysatePumps.h" +#include "Flow.h" +#include "FlowSensor.h" #include "FluidPump.h" #include "FlushConcentrate.h" #include "FlushFilter.h" @@ -213,6 +215,13 @@ { MSG_ID_FP_VALVE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testIOFPValvesStatesPublishIntervalOverride }, { MSG_ID_FP_VALVE_CMD_STATE_OVERRIDE_REQUEST, &testIOFPValveStateOverride }, { MSG_ID_FP_VALVE_SENSED_STATE_OVERRIDE_REQUEST, &testIOFPValveSensedStateOverride }, + { MSG_ID_FP_FLOWS_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testFlowSensorDataPublishIntervalOverride }, + { MSG_ID_FP_FLOW_RATE_OVERRIDE_REQUEST, &testFlowSensorReadingsOverride }, + { MSG_ID_FP_FLOW_TEMP_OVERRIDE_REQUEST, &testFlowSensorTemperatureReadingsOverride }, + { MSG_ID_FP_FILTERED_FLOW_RATE_OVERRIDE_REQUEST, &testFlowSensorFilteredReadingsOverride }, + { MSG_ID_FP_FILTERED_FLOW_TEMP_OVERRIDE_REQUEST, &testFlowSensorFilteredTemperatureReadingsOverride }, + { MSG_ID_FP_ALARM_STATE_OVERRIDE_REQUEST, &testAlarmStateOverride }, + { MSG_ID_FP_ALARM_CLEAR_ALL_ALARMS_REQUEST, &testFPClearAllAlarms } }; /// Calculation for number of entries in the incoming message function handler look-up table. @@ -471,14 +480,29 @@ // Create a message record blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_DD_EVENT; + if ( ( event >= FP_EVENT_FIRST ) && ( event <= FP_EVENT_LAST ) ) + { + msg.hdr.msgID = MSG_ID_FP_EVENT; + } + else + { + msg.hdr.msgID = MSG_ID_DD_EVENT; + } + msg.hdr.payloadLen = sizeof( EVENT_PAYLOAD_T ); memcpy( &msg.payload, &eventStruct, sizeof( EVENT_PAYLOAD_T ) ); // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer // TODO : validate the change , DD -> UI channel removed and added DD broadcast instead. - result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DD_BROADCAST, ACK_NOT_REQUIRED ); + if ( msg.hdr.msgID == MSG_ID_FP_EVENT ) + { + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_FP_BROADCAST, ACK_NOT_REQUIRED ); + } + else + { + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DD_BROADCAST, ACK_NOT_REQUIRED ); + } return result; } @@ -494,7 +518,7 @@ * @param almData2 2nd data associated with alarm * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastAlarmTriggered( U32 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ) +BOOL broadcastAlarmTriggered( U32 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2, ALARM_SOURCE_T almSource ) { BOOL result; MESSAGE_T msg; @@ -524,8 +548,16 @@ memset( payloadPtr, 0, sizeof( U32) * 3 ); // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer - result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DD_ALARM, ACK_REQUIRED ); + if ( ALM_SRC_FP == almSource ) + { + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_FP_ALARM, ACK_REQUIRED ); + } + else + { + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DD_ALARM, ACK_REQUIRED ); + } + return result; } @@ -538,7 +570,7 @@ * @param alarm ID of alarm cleared * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastAlarmCleared( U32 alarm ) +BOOL broadcastAlarmCleared( U32 alarm, ALARM_SOURCE_T almSource ) { BOOL result; MESSAGE_T msg; @@ -552,7 +584,14 @@ memcpy( payloadPtr, &alarm, sizeof( U32 ) ); // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer - result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DD_ALARM, ACK_REQUIRED ); + if ( ALM_SRC_FP == almSource ) + { + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_FP_ALARM, ACK_REQUIRED ); + } + else + { + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DD_ALARM, ACK_REQUIRED ); + } return result; } @@ -567,7 +606,7 @@ * @param alarm ID of alarm which alarm condition is cleared * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastAlarmConditionCleared( U32 alarm ) +BOOL broadcastAlarmConditionCleared( U32 alarm, ALARM_SOURCE_T almSource ) { BOOL result; MESSAGE_T msg; @@ -581,7 +620,14 @@ memcpy( payloadPtr, &alarm, sizeof( U32 ) ); // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer - result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DD_ALARM, ACK_REQUIRED ); + if ( ALM_SRC_FP == almSource ) + { + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_FP_ALARM, ACK_REQUIRED ); + } + else + { + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DD_ALARM, ACK_REQUIRED ); + } return result; } Index: firmware/App/Services/Messaging.h =================================================================== diff -u -r228773fa681489a62db5c47807a4794e5761d4f5 -r0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d --- firmware/App/Services/Messaging.h (.../Messaging.h) (revision 228773fa681489a62db5c47807a4794e5761d4f5) +++ firmware/App/Services/Messaging.h (.../Messaging.h) (revision 0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d) @@ -50,11 +50,11 @@ // Serialize message U32 serializeMessage( MESSAGE_T msg, COMM_BUFFER_T buffer, BOOL ackReq ); -BOOL broadcastAlarmTriggered( U32 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ); +BOOL broadcastAlarmTriggered( U32 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2, ALARM_SOURCE_T almSource ); -BOOL broadcastAlarmCleared( U32 alarm ); +BOOL broadcastAlarmCleared( U32 alarm, ALARM_SOURCE_T almSource ); -BOOL broadcastAlarmConditionCleared( U32 alarm ); +BOOL broadcastAlarmConditionCleared( U32 alarm, ALARM_SOURCE_T almSource ); void handleIncomingMessage( MESSAGE_T *message ); Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -r228773fa681489a62db5c47807a4794e5761d4f5 -r0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 228773fa681489a62db5c47807a4794e5761d4f5) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d) @@ -18,12 +18,15 @@ #include "gio.h" #include "lin.h" +#include "BoostPump.h" #include "ConcentratePumps.h" #include "DialysatePumps.h" #include "Heaters.h" #include "FPOperationModes.h" #include "Messaging.h" #include "OperationModes.h" +#include "PermeateTank.h" +#include "ROPump.h" #include "SystemCommDD.h" #include "TaskGeneral.h" #include "WatchdogMgmt.h" @@ -89,6 +92,15 @@ // manage concentrate pumps execConcentratePumpController(); + // Control RO pump + execROPumpController(); + + // Control Permeate Tank + execPermeateTankController(); + + // Control Boost pump + execBoostPumpController(); + // Manage switches monitor //execSwitches(); Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -r208d9299339c3b89ac7fbd2100eef3aa121bf591 -r0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 208d9299339c3b89ac7fbd2100eef3aa121bf591) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d) @@ -21,6 +21,7 @@ #include "Conductivity.h" #include "DialysatePumps.h" #include "FPGA.h" +#include "Flow.h" #include "Heaters.h" #include "InternalADC.h" #include "Level.h" @@ -98,6 +99,9 @@ // Blood leak sensor execBloodLeak(); + // Flow Sensor + execFlowMonitor(); + // Second pass for FPGA execFPGA( FALSE ); #endif Index: firmware/source/sys_main.c =================================================================== diff -u -r228773fa681489a62db5c47807a4794e5761d4f5 -r0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d --- firmware/source/sys_main.c (.../sys_main.c) (revision 228773fa681489a62db5c47807a4794e5761d4f5) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d) @@ -63,11 +63,15 @@ #include "AlarmMgmtDD.h" #include "BloodLeak.h" +#include "BoostPump.h" #include "CommBuffers.h" #include "Conductivity.h" #include "ConcentratePumps.h" #include "DDCommon.h" #include "DialysatePumps.h" +#include "Flow.h" +#include "FlowSensor.h" +#include "FluidPump.h" #include "FlushConcentrate.h" #include "FlushFilter.h" #include "FlushPermeate.h" @@ -86,7 +90,9 @@ #include "ModePreGenPermeate.h" #include "MsgQueues.h" #include "OperationModes.h" +#include "PermeateTank.h" #include "Pressure.h" +#include "ROPump.h" #include "SafetyShutdown.h" #include "SystemCommDD.h" #include "TaskBG.h" @@ -97,6 +103,7 @@ #include "Ultrafiltration.h" #include "Valves.h" #include "WatchdogMgmt.h" +#include "WaterQualityMonitor.h" static void initProcessor( void ); static void initSoftware( void ); @@ -196,7 +203,21 @@ initFPInterface(); initUltrafiltration(); - // FP modules + // FP Modules + + // FP Controllers + initBoostPump(); + initPermeateTank(); + initROPump(); + + // FP Drivers + initFlowSensor(); + initFluidPump(); + + // FP Monitors + initFlow(); + initWaterQualityMonitor(); + // FP Modes initFPOperationModes(); initFPInitAndPOSTMode();