Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rc83c2987e2665c22484eed45d8e514d08d48fb4b -re65a2e67337ef5fff12de02db85ba101305fb006 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision c83c2987e2665c22484eed45d8e514d08d48fb4b) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision e65a2e67337ef5fff12de02db85ba101305fb006) @@ -236,7 +236,7 @@ execPrime(); - if ( TRUE == isPrimingPassed() ) + if ( TRUE == isPrimingCompleted() ) { state = HD_PRE_TREATMENT_SELF_TEST_WET_STATE; } Index: firmware/App/Modes/Prime.c =================================================================== diff -u -rc83c2987e2665c22484eed45d8e514d08d48fb4b -re65a2e67337ef5fff12de02db85ba101305fb006 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision c83c2987e2665c22484eed45d8e514d08d48fb4b) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision e65a2e67337ef5fff12de02db85ba101305fb006) @@ -22,6 +22,7 @@ #include "DialOutFlow.h" #include "DGInterface.h" #include "Prime.h" +#include "SystemCommMessages.h" #include "TaskGeneral.h" #include "Timers.h" #include "Valves.h" @@ -33,13 +34,18 @@ // ********** private definitions ********** +#define MAX_PRIME_TIME ( 10 * SEC_PER_MIN ) ///< Maximum prime time (in seconds). +#define PRIME_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the prime data is published on the CAN bus. + #define BLOOD_PUMP_FLOW_RATE_PURGE_AIR 100 ///< Blood pump flow rate during prime purge air state. #define BLOOD_PUMP_FLOW_RATE_CIRC_BLOOD_CIRCUIT 300 ///< Blood pump flow rate during prime recirculate blood circuit state. #define DIALYSATE_PUMP_PRIME_FLOW_RATE 300 ///< Dialysate pump flow rate during priming fluid path. #define LOAD_CELL_VOLUME_NOISE_TOLERANCE 0.05 ///< Allow 5% tolerance on load cell readings. -#define PRIME_DRAIN_RESERVOIR_TO_VOLUME_ML 100 ///< Drain reservoir to this volume (in mL) during prime. +#define PRIME_DRAIN_RESERVOIR_TO_VOLUME_ML 0 ///< Drain reservoir to this volume (in mL) during prime. + +// TODO: Determine the appropriate fill volume for each reservoir during prime state #define PRIME_FILL_RESERVOIR_TO_VOLUME_ML ( FILL_RESERVOIR_TO_VOLUME_ML / 2 ) ///< Fill reservoir to this volume (in mL) during prime. #define NO_AIR_DETECTED_COUNT ( 10 * MS_PER_SECOND ) ///< No air detected time period count. @@ -57,6 +63,7 @@ PRIME_RESERVOIR_MGMT_START_FILL_STATE, ///< Command DG to start filling reservoir. PRIME_RESERVOIR_MGMT_FILL_STATE, ///< Wait for fill to complete. PRIME_RESERVOIR_MGMT_FILL_COMPLETE_STATE, ///< Reservoir fill has completed. + PRIME_RESERVOIR_MGMT_WAIT_RESERVOIR_TWO_INACTIVE, ///< Wait for reservoir 2 become inactive. NUM_OF_PRIME_RESERVOIR_MGMT_STATES ///< Number of prime reservoir mgmt. states. } PRIME_RESERVOIR_MGMT_STATE_T; @@ -65,6 +72,9 @@ static HD_PRE_TREATMENT_PRIME_STATE_T currentPrimeState; ///< Current state of the prime sub-mode state machine. static PRIME_RESERVOIR_MGMT_STATE_T currentReservoirMgmtState; ///< Current reservoir management state. +static U32 primeStartTime; ///< Starting time of priming (in ms). +static U32 primeStatusBroadcastTimerCounter; ///< Prime status data broadcast timer counter used to schedule when to transmit data. + static BOOL isPrimeCompleted; ///< Status if prime sequence has been completed. static BOOL primeStartReqReceived; ///< Flag to indicate if a request to start priming has been received. static BOOL reservoirFilledStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Flag to indicate if a reservoir has been filled. @@ -78,6 +88,7 @@ // ********** private function prototypes ********** +static void broadcastPrimingStatus( void ); static void execPreTreatmentReservoirMgmt( void ); static void purgeAirValvesBloodPumpControl( void ); @@ -114,7 +125,10 @@ { currentPrimeState = HD_PRIME_START_STATE; currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_START_STATE; + isPrimeCompleted = FALSE; + primeStartTime = getMSTimerCount(); + primeStatusBroadcastTimerCounter = 0; // TODO: set to false after integration with UI primeStartReqReceived = TRUE; @@ -173,6 +187,10 @@ break; } + // Broadcast priming data + broadcastPrimingStatus(); + + // Exec reservoir management for priming execPreTreatmentReservoirMgmt(); } @@ -190,6 +208,35 @@ /*********************************************************************//** * @brief + * The broadcastPrimeTimeAndStatus function broadcasts prime status + * data during priming. + * @details Inputs: pre-treatment time and state data + * @details Outputs: pre-treatment time and state messages sent on interval + * @return none + *************************************************************************/ +static void broadcastPrimingStatus( void ) +{ + U32 const elapsedPrimeTimeInSecs = calcTimeSince( primeStartTime ) / MS_PER_SECOND; + + if ( elapsedPrimeTimeInSecs > MAX_PRIME_TIME ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_PRIME_OUT_OF_TIME, elapsedPrimeTimeInSecs, MAX_PRIME_TIME ); + } + + if ( ++primeStatusBroadcastTimerCounter >= PRIME_DATA_PUB_INTERVAL ) + { + PRIMING_DATA_PAYLOAD_T primeData; + primeData.currentPrimeState = currentPrimeState; + primeData.totalTime = MAX_PRIME_TIME; + primeData.remainingTime = MAX_PRIME_TIME - elapsedPrimeTimeInSecs; + + broadcastPrimeData( &primeData ); + primeStatusBroadcastTimerCounter = 0; + } +} + +/*********************************************************************//** + * @brief * The execPreTreatmentReservoirMgmt function executes the state machine for the * reservoir management during pre-treatment mode. * @details Inputs: currentReservoirMgmtState @@ -258,15 +305,23 @@ if ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) { reservoirFilledStatus[ DG_RESERVOIR_1 ] = TRUE; - cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE; + currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_WAIT_RESERVOIR_TWO_INACTIVE; } else if ( ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) && ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_2 ] ) ) { reservoirFilledStatus[ DG_RESERVOIR_2 ] = TRUE; } break; + case PRIME_RESERVOIR_MGMT_WAIT_RESERVOIR_TWO_INACTIVE: + currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_WAIT_RESERVOIR_TWO_INACTIVE; + + if ( DG_RESERVOIR_2 == getDGInactiveReservoir() ) + { + currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE; + } + break; + default: currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_START_STATE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRIME_RESERVOIR_MGMT_INVALID_STATE, (U32)currentReservoirMgmtState ); @@ -391,6 +446,8 @@ if ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) { + cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); + setValvePosition( VDI, VALVE_POSITION_B_OPEN ); setValvePosition( VDO, VALVE_POSITION_B_OPEN ); setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); Index: firmware/App/Modes/Prime.h =================================================================== diff -u -r4d2dcd2d5ee3c7684be139b7e560b16d8c3abc06 -re65a2e67337ef5fff12de02db85ba101305fb006 --- firmware/App/Modes/Prime.h (.../Prime.h) (revision 4d2dcd2d5ee3c7684be139b7e560b16d8c3abc06) +++ firmware/App/Modes/Prime.h (.../Prime.h) (revision e65a2e67337ef5fff12de02db85ba101305fb006) @@ -31,11 +31,25 @@ // ********** public definitions ********** +#pragma pack(push,1) + +/// Payload record structure for a priming status data broadcast message. +typedef struct +{ + U32 currentPrimeState; ///< Current state of priming. + U32 remainingTime; ///< Remaining time for priming in seconds. + U32 totalTime; ///< Total priming time in seconds. +} PRIMING_DATA_PAYLOAD_T; + +#pragma pack(pop) + // ********** public function prototypes ********** void initPrime( void ); void transitionToPrime( void ); + void execPrime( void ); +BOOL isPrimingCompleted( void ); BOOL isPrimingPassed( void ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rf3680ff380d9543102406833a48da5a2d20e6029 -re65a2e67337ef5fff12de02db85ba101305fb006 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision f3680ff380d9543102406833a48da5a2d20e6029) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision e65a2e67337ef5fff12de02db85ba101305fb006) @@ -1098,7 +1098,8 @@ * broadcast message and queues the msg for transmit on the appropriate CAN channel. * @details Inputs: none * @details Outputs: HD operation mode msg constructed and queued - * @param mode current HD operation mode + * @param mode current HD operation mode + * @param subMode current HD operation sub-mode * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ BOOL broadcastHDOperationMode( U32 mode, U32 subMode ) @@ -1128,6 +1129,7 @@ * be broadcast and queues the msg for transmit on the appropriate CAN channel. * @details Inputs: none * @details Outputs: HD valves msg constructed and queued + * @param valveData valve data record * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ BOOL broadcastHDValves( HD_VALVE_DATA_T *valveData ) @@ -1155,6 +1157,7 @@ * be broadcast and queues the msg for transmit on the appropriate CAN channel. * @details Inputs: none * @details Outputs: saline bolus data msg constructed and queued + * @param data saline bolus data record * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ BOOL broadcastSalineBolusData( SALINE_BOLUS_DATA_PAYLOAD_T data ) @@ -1182,6 +1185,8 @@ * be broadcast and queues the msg for transmit on the appropriate CAN channel. * @details Inputs: none * @details Outputs: air trap data msg constructed and queued + * @param lowerLevel air trap lower level data + * @param upperLevel air trap upper level data * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ BOOL broadcastAirTrapData( AIR_TRAP_LEVELS_T lowerLevel, AIR_TRAP_LEVELS_T upperLevel ) @@ -1207,6 +1212,34 @@ return result; } +/***********************************************************************//** + * @brief + * The broadcastAirTrapData function constructs an HD air trap data msg to \n + * be broadcast and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: air trap data msg constructed and queued + * @param primeDataPtr prime data record pointer + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastPrimeData( PRIMING_DATA_PAYLOAD_T *primeDataPtr ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_PRIMING_STATUS_DATA; + msg.hdr.payloadLen = sizeof( PRIMING_DATA_PAYLOAD_T ); + + memcpy( payloadPtr, primeDataPtr, sizeof( PRIMING_DATA_PAYLOAD_T ) ); + + // 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_HD_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} + #ifdef EMC_TEST_BUILD BOOL broadcastCANErrorCount( U32 count ) { Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r766708fceb0bdf1af8c7897df29d4f5036bfd3db -re65a2e67337ef5fff12de02db85ba101305fb006 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 766708fceb0bdf1af8c7897df29d4f5036bfd3db) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision e65a2e67337ef5fff12de02db85ba101305fb006) @@ -24,7 +24,8 @@ #include "DGInterface.h" #include "DialInFlow.h" #include "DialOutFlow.h" -#include "Dialysis.h" +#include "Dialysis.h" +#include "Prime.h" #include "ModeTreatment.h" #include "MsgQueues.h" #include "NVDataMgmt.h" @@ -237,6 +238,9 @@ // MSG_ID_HD_AIR_TRAP_DATA BOOL broadcastAirTrapData( AIR_TRAP_LEVELS_T lowerLevel, AIR_TRAP_LEVELS_T upperLevel ); +// MSG_ID_HD_PRIMING_STATUS_DATA +BOOL broadcastPrimeData( PRIMING_DATA_PAYLOAD_T *primeDataPtr ); + #ifdef EMC_TEST_BUILD // MSG_ID_CAN_ERROR_COUNT BOOL broadcastCANErrorCount( U32 count );