Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r125a27d5a3a116e7b7473ff180daf247270d8e57 -r53281f1ea1e79cbd6eb8720851af78f2cb543624 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 125a27d5a3a116e7b7473ff180daf247270d8e57) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 53281f1ea1e79cbd6eb8720851af78f2cb543624) @@ -23,6 +23,7 @@ #include "FPGA.h" #include "PresOccl.h" #include "SelfTests.h" +#include "SystemCommMessages.h" #include "TaskGeneral.h" #include "Timers.h" #include "Valves.h" @@ -60,6 +61,11 @@ #define WET_SELF_TEST_DISPLACEMENT_TIME_MS ( SEC_PER_MIN * MS_PER_SECOND ) ///< Time to displace dialysate in wet self-test in ms. #define RESERVOIR_SETTLE_TIME_MS ( 4 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time allotted for reservoir to settle in ms. +#define MAX_NO_CARTRIDGE_SELF_TEST_TIME SEC_PER_MIN ///< Maximum no cartridge self-test time (in seconds). +#define MAX_DRY_SELF_TEST_TIME SEC_PER_MIN ///< Maximum dry self-test time (in seconds). + +#define SELF_TEST_TIME_DATA_PUB_INTERVAL ( MS_PER_SECOND ) ///< Interval (ms/task time) at which self-test time data is published on the CAN bus. + /// Multiplier to conver flow (mL/min) into volume (mL) for period of general task interval. static const F32 SELF_TEST_FLOW_INTEGRATOR = ( ( 1.0 * TASK_GENERAL_INTERVAL ) / ( SEC_PER_MIN * MS_PER_SECOND ) ); @@ -101,6 +107,9 @@ static F32 setupDisplacementVolume; ///< Hold the setup displacement volume to get reservoir one to target volume. static BOOL isValvesSettingSent; ///< Flag indicates valve setting change has been send to DG. +static U32 selfTestStartTime; ///< Starting time of self-test (in ms). +static U32 selfTestPreviousPublishDataTime; ///< Last time self-test time data is being published (in ms). + static BOOL selfTestsResumeRequested; ///< Flag indicates user requesting self-tests resume. // ********** private function prototypes ********** @@ -145,6 +154,8 @@ *************************************************************************/ void initSelfTests( void ) { + selfTestStartTime = 0; + selfTestPreviousPublishDataTime = 0; } /*********************************************************************//** @@ -200,6 +211,8 @@ currentNoCartSelfTestsState = NO_CART_SELF_TESTS_START_STATE; runPumpStartTime = 0; havePumpsStarted = FALSE; + selfTestStartTime = getMSTimerCount(); + selfTestPreviousPublishDataTime = getMSTimerCount(); resetSelfTestsFlags(); } @@ -279,6 +292,15 @@ // Self-tests flags should be handled by now, reset if flags not handled with current state resetSelfTestsFlags(); + + // Publish current self-test time data + if ( calcTimeSince( selfTestPreviousPublishDataTime ) >= SELF_TEST_TIME_DATA_PUB_INTERVAL ) + { + U32 const elapsedSelfTestTimeInSecs = calcTimeSince( selfTestStartTime ) / MS_PER_SECOND; + + selfTestPreviousPublishDataTime = getMSTimerCount(); + broadcastNoCartSelfTestTime( MAX_NO_CARTRIDGE_SELF_TEST_TIME, ( MAX_NO_CARTRIDGE_SELF_TEST_TIME - elapsedSelfTestTimeInSecs ) ); + } } /*********************************************************************//** @@ -309,6 +331,8 @@ pressureSelfTestNormalizedStartTime = 0; previousNormalArterialPressure = 0.0; previousNormalVenousPressure = 0.0; + selfTestStartTime = getMSTimerCount(); + selfTestPreviousPublishDataTime = getMSTimerCount(); resetSelfTestsFlags(); } @@ -390,6 +414,15 @@ { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRE_TREATMENT_DRY_SELF_TEST_FAILURE, currentDrySelfTestsState ); } + + // Publish current self-test time data + if ( calcTimeSince( selfTestPreviousPublishDataTime ) >= SELF_TEST_TIME_DATA_PUB_INTERVAL ) + { + U32 const elapsedSelfTestTimeInSecs = calcTimeSince( selfTestStartTime ) / MS_PER_SECOND; + + selfTestPreviousPublishDataTime = getMSTimerCount(); + broadcastDrySelfTestTime( MAX_DRY_SELF_TEST_TIME, ( MAX_DRY_SELF_TEST_TIME - elapsedSelfTestTimeInSecs ) ); + } } /*********************************************************************//** @@ -420,6 +453,8 @@ displacementStartTime = 0; fmdIntegratedVolume = 0.0; isValvesSettingSent = FALSE; + selfTestStartTime = getMSTimerCount(); + selfTestPreviousPublishDataTime = getMSTimerCount(); resetSelfTestsFlags(); } Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rbb114842e73659f097bb8b8ec0d670bfa4f8cb73 -r53281f1ea1e79cbd6eb8720851af78f2cb543624 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision bb114842e73659f097bb8b8ec0d670bfa4f8cb73) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 53281f1ea1e79cbd6eb8720851af78f2cb543624) @@ -1593,12 +1593,73 @@ return result; } +/*********************************************************************//** + * @brief + * The broadcastNoCartSelfTestTime function sends out the no cartridge self-test + * progress data. + * @details Inputs: none + * @details Outputs: no cartridge self-test time data msg constructed and queued + * @param timeout no cartridge self-test timeout (in sec) + * @param countdown no cartridge self-test timeout count down (in sec) + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastNoCartSelfTestTime( U32 timeout, U32 countdown ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_NO_CART_SELF_TEST_PROGRESS; + msg.hdr.payloadLen = sizeof( U32 ) + sizeof( U32 ); + + memcpy( payloadPtr, &timeout, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &countdown, 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_HD_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} + +/*********************************************************************//** + * @brief + * The broadcastDrySelfTestTime function sends out the dry self-test progress data. + * @details Inputs: none + * @details Outputs: dry self-test time data msg constructed and queued + * @param timeout dry self-test timeout (in sec) + * @param countdown dry self-test timeout count down (in sec) + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastDrySelfTestTime( U32 timeout, U32 countdown ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_DRY_SELF_TEST_PROGRESS; + msg.hdr.payloadLen = sizeof( U32 ) + sizeof( U32 ); + + memcpy( payloadPtr, &timeout, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &countdown, 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_HD_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} + /***********************************************************************//** * @brief - * The broadcastAirTrapData function constructs an HD air trap data msg to \n + * The broadcastPrimeData function constructs a priming status 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 + * @details Outputs: priming data msg constructed and queued * @param primeDataPtr prime data record pointer * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -rbb114842e73659f097bb8b8ec0d670bfa4f8cb73 -r53281f1ea1e79cbd6eb8720851af78f2cb543624 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision bb114842e73659f097bb8b8ec0d670bfa4f8cb73) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 53281f1ea1e79cbd6eb8720851af78f2cb543624) @@ -288,6 +288,12 @@ // MSG_ID_HD_AIR_TRAP_DATA BOOL broadcastAirTrapData( AIR_TRAP_LEVELS_T lowerLevel, AIR_TRAP_LEVELS_T upperLevel ); +// MSG_ID_HD_NO_CART_SELF_TEST_PROGRESS +BOOL broadcastNoCartSelfTestTime( U32 timeout, U32 countdown ); + +// MSG_ID_HD_DRY_SELF_TEST_PROGRESS +BOOL broadcastDrySelfTestTime( U32 timeout, U32 countdown ); + // MSG_ID_HD_PRIMING_STATUS_DATA BOOL broadcastPrimeData( PRIMING_DATA_PAYLOAD_T *primeDataPtr );