Index: firmware/.launches/DG.launch =================================================================== diff -u -r3982a398c9c14a8f7688656b60055d4010328456 -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/.launches/DG.launch (.../DG.launch) (revision 3982a398c9c14a8f7688656b60055d4010328456) +++ firmware/.launches/DG.launch (.../DG.launch) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -2,6 +2,9 @@ +<<<<<<< HEAD + + @@ -19,15 +22,18 @@ + + + Index: firmware/App/DGCommon.h =================================================================== diff -u -rbbf1e3736be03a4f041ace57e0f95e23caf472dd -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/DGCommon.h (.../DGCommon.h) (revision bbf1e3736be03a4f041ace57e0f95e23caf472dd) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -23,7 +23,7 @@ #define DG_VERSION_MAJOR 0 #define DG_VERSION_MINOR 4 -#define DG_VERSION_MICRO 5 +#define DG_VERSION_MICRO 0 #define DG_VERSION_BUILD 0 // ********** build switches ********** @@ -32,8 +32,9 @@ #ifndef _VECTORCAST_ // #define RM46_EVAL_BOARD_TARGET 1 // #define SIMULATE_UI 1 + // #define CAN_TEST 1 -// #define ENABLE_DIP_SWITCHES 1 + #define ENABLE_DIP_SWITCHES 1 #include #include #endif Index: firmware/App/Drivers/SafetyShutdown.c =================================================================== diff -u -ref5ef16518466c92687b869cabfa16eaf3365dc0 -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Drivers/SafetyShutdown.c (.../SafetyShutdown.c) (revision ef5ef16518466c92687b869cabfa16eaf3365dc0) +++ firmware/App/Drivers/SafetyShutdown.c (.../SafetyShutdown.c) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -1,54 +1,145 @@ -/************************************************************************** - * - * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. - * - * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN - * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. - * - * @file SafetyShutdown.c - * - * @date 20-Sep-2019 - * @author S. Nash - * - * @brief Controller for the safety shutdown signal. - * - **************************************************************************/ - -#include "mibspi.h" - -#include "SafetyShutdown.h" - -// ********** private definitions ********** - -// pin I/O macros -#define SAFETY_SPI1_PORT_MASK 0x00000010 // (CS[4] - re-purposed as output GPIO) -#define SET_SAFETY_SHUTDOWN() {mibspiREG1->PC3 |= SAFETY_SPI1_PORT_MASK;} -#define CLR_SAFETY_SHUTDOWN() {mibspiREG1->PC3 &= ~SAFETY_SPI1_PORT_MASK;} - -/************************************************************************* - * @brief initSafetyShutdown - * The initSafetyShutdown function initializes the Buttons module. - * @details - * Inputs : none - * Outputs : Safety Shutdown module signal output set to initial state. - * @param none - * @return none - *************************************************************************/ -void initSafetyShutdown( void ) -{ - CLR_SAFETY_SHUTDOWN(); -} - -/************************************************************************* - * @brief activateSafetyShutdown - * The activateSafetyShutdown function activates the safety shutdown signal. - * @details - * Inputs : none - * Outputs : Safety Shutdown signal output set to active state. - * @param none - * @return none - *************************************************************************/ -void activateSafetyShutdown( void ) -{ - SET_SAFETY_SHUTDOWN(); -} +/**********************************************************************//** + * + * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. + * + * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN + * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. + * + * @file SafetyShutdown.c + * + * @date 20-Sep-2019 + * @author S. Nash + * + * @brief Controller for the safety shutdown signal. + * + **************************************************************************/ + +#include "mibspi.h" + +#include "SystemCommMessages.h" +#include "SafetyShutdown.h" + +/** + * @addtogroup SafetyShutdown + * @{ + */ + +// ********** private definitions ********** + +// pin I/O macros +#define SAFETY_SPI1_PORT_MASK 0x00000010 // (CS[4] - re-purposed as output GPIO) +#define SET_SAFETY_SHUTDOWN() {mibspiREG1->PC3 |= SAFETY_SPI1_PORT_MASK;} +#define CLR_SAFETY_SHUTDOWN() {mibspiREG1->PC3 &= ~SAFETY_SPI1_PORT_MASK;} + +// ********** private definitions ********** + +static BOOL safetyShutdownActivated = FALSE; ///< Status of safety shutdown signal. +static BOOL safetyShutdownOverrideResetState = FALSE; ///< Natural status of safety shutdown signal. Used to restore state on override reset. + +/************************************************************************* + * @brief + * The initSafetyShutdown function initializes the Buttons module. + * @details + * Inputs : none + * Outputs : Safety Shutdown module signal output set to initial state. + * @return none + *************************************************************************/ +void initSafetyShutdown( void ) +{ + CLR_SAFETY_SHUTDOWN(); +} + +/************************************************************************* + * @brief + * The activateSafetyShutdown function activates the safety shutdown signal. + * @details + * Inputs : none + * Outputs : Safety Shutdown signal output set to active state. + * @return none + *************************************************************************/ +void activateSafetyShutdown( void ) +{ + SET_SAFETY_SHUTDOWN(); +} + +/*********************************************************************//** + * @brief + * The isSafetyShutdownActivated function returns whether the safety shutdown \n + * signal has been activated. + * @details + * Inputs : none + * Outputs : none + * @return safetyShutdownActivated + *************************************************************************/ +BOOL isSafetyShutdownActivated( void ) +{ + return safetyShutdownActivated; +} + +/*********************************************************************//** + * @brief + * The testSetSafetyShutdownOverride function overrides the HD safety \n + * shutdown. + * @details + * Inputs : none + * Outputs : HD safety shutdown overridden + * @param value : TRUE to activate safety shutdown, FALSE to de-activate it. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetSafetyShutdownOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + MOTOR_DIR_T dir; + + // remember natural state before override so we can reset + safetyShutdownOverrideResetState = safetyShutdownActivated; + // override safety shutdown signal + if ( value > 0 ) + { + activateSafetyShutdown(); + } + else + { + safetyShutdownActivated = FALSE; + CLR_SAFETY_SHUTDOWN(); + } + result = TRUE; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetSafetyShutdownOverride function resets the override of the \n + * HD safety shutdown. + * @details + * Inputs : none + * Outputs : shutdown override reset + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetSafetyShutdownOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + if ( TRUE == safetyShutdownOverrideResetState ) + { + activateSafetyShutdown(); + } + else + { + safetyShutdownActivated = FALSE; + CLR_SAFETY_SHUTDOWN(); + } + result = TRUE; + } + + return result; +} + +/**@}*/ Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -rbbf1e3736be03a4f041ace57e0f95e23caf472dd -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision bbf1e3736be03a4f041ace57e0f95e23caf472dd) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -17,15 +17,16 @@ #include "CPLD.h" #include "FPGA.h" #include "OperationModes.h" +#include "TemperatureSensors.h" #include "WatchdogMgmt.h" #include "ModeInitPOST.h" +#include "Heaters.h" /** * @addtogroup DGInitAndPOSTMode * @{ */ -// ********** private definitions ********** // ********** private data ********** @@ -65,6 +66,7 @@ *************************************************************************/ void transitionToInitAndPOSTMode( void ) { + // TODO Will be filled up by Sean Nash } /*********************************************************************//** @@ -84,13 +86,25 @@ { case DG_POST_STATE_START: postState = DG_POST_STATE_FPGA; + // FOR TESTING REMOVE + //postState = POST_STATE_TEMPERATURE_SENSORS; break; case DG_POST_STATE_FPGA: testStatus = execFPGATest(); postState = handlePOSTStatus( testStatus ); break; + case DG_POST_STATE_TEMPERATURE_SENSORS: + testStatus = execTemperatureSensorsSelfTest(); + postState = handlePOSTStatus( testStatus ); + break; + + case DG_POST_STATE_HEATERS: + testStatus = execHeatersSelfTest(); + postState = handlePOSTStatus( testStatus ); + break; + case DG_POST_STATE_WATCHDOG: testStatus = execWatchdogTest(); handlePOSTStatus( testStatus ); // ignoring return value because last test Index: firmware/App/Modes/ModeRecirculate.c =================================================================== diff -u -rbbf1e3736be03a4f041ace57e0f95e23caf472dd -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision bbf1e3736be03a4f041ace57e0f95e23caf472dd) +++ firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -14,6 +14,7 @@ * **************************************************************************/ +#include "DrainPump.h" #include "FPGA.h" #include "Heaters.h" #include "OperationModes.h" Index: firmware/App/Modes/ModeSolo.c =================================================================== diff -u -rfbf04988794f0eaa8a7a596a349bae1dfff0e079 -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Modes/ModeSolo.c (.../ModeSolo.c) (revision fbf04988794f0eaa8a7a596a349bae1dfff0e079) +++ firmware/App/Modes/ModeSolo.c (.../ModeSolo.c) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -1,4 +1,4 @@ -/************************************************************************** +/**********************************************************************//** * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * @@ -18,46 +18,82 @@ #include "ModeSolo.h" #include "CPLD.h" +/** + * @addtogroup DGSoloStandbyMode + * @{ + */ + +// ********** private definitions ********** + // ********** private data ********** +static DG_SOLO_STANDBY_STATE_T soloState = DG_SOLO_STANDBY_STATE_START; ///< Currently active solo standby state. + // ********** private function prototypes ********** -/************************************************************************* +/*********************************************************************//** * @brief * The initSoloMode function initializes the Standby-Solo Mode module. * @details * Inputs : none * Outputs : Standby-Solo Mode module initialized. - * @param none * @return none *************************************************************************/ void initSoloMode( void ) { + soloState = DG_SOLO_STANDBY_STATE_START; } -/************************************************************************* +/*********************************************************************//** * @brief * The transitionToSoloMode function prepares for transition to standby-solo mode. * @details * Inputs : none * Outputs : - * @param none * @return none *************************************************************************/ void transitionToSoloMode( void ) { + initSoloMode(); } -/************************************************************************* +/*********************************************************************//** * @brief * The execSoloMode function executes the Standby-Solo Mode state machine. * @details * Inputs : none * Outputs : - * @param none - * @return none + * @return current state. *************************************************************************/ -void execSoloMode( void ) +U32 execSoloMode( void ) { + // execute current solo standby state + switch ( soloState ) + { + case DG_SOLO_STANDBY_STATE_START: + break; + default: + // TODO - s/w fault + soloState = DG_SOLO_STANDBY_STATE_START; + break; + } + + return soloState; } + +/*********************************************************************//** + * @brief + * The getCurrentSoloState function returns the current state of the \n + * standby-solo mode. + * @details + * Inputs : soloState + * Outputs : none + * @return the current state of standby-solo mode. + *************************************************************************/ +DG_SOLO_STANDBY_STATE_T getCurrentSoloState( void ) +{ + return soloState; +} + +/**@}*/ Index: firmware/App/Modes/ModeSolo.h =================================================================== diff -u -rfbf04988794f0eaa8a7a596a349bae1dfff0e079 -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Modes/ModeSolo.h (.../ModeSolo.h) (revision fbf04988794f0eaa8a7a596a349bae1dfff0e079) +++ firmware/App/Modes/ModeSolo.h (.../ModeSolo.h) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -18,11 +18,27 @@ #define __MODE_SOLO_H__ #include "DGCommon.h" +#include "DGDefs.h" +/** + * @defgroup DGSoloStandbyMode DGSoloStandbyMode + * @brief Solo Standby mode module. + * Manages Solo standby mode functions via a state machine. + * + * @addtogroup DGSoloStandbyMode + * @{ + */ + +// ********** public definitions ********** + // ********** private function prototypes ********** void initSoloMode( void ); // initialize this module void transitionToSoloMode( void ); // prepares for transition to standby-solo mode -void execSoloMode( void ); // execute the standby-solo mode state machine (call from OperationModes) +U32 execSoloMode( void ); // execute the standby-solo mode state machine (call from OperationModes) +DG_SOLO_STANDBY_STATE_T getCurrentSoloState( void ); // get the current state of the standby-solo mode. + +/**@}*/ + #endif Index: firmware/App/Services/FPGA.c =================================================================== diff -u -rdea90cb6d941a0d70c1666a11a0199e147dea764 -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision dea90cb6d941a0d70c1666a11a0199e147dea764) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -44,6 +44,7 @@ #define FPGA_HEADER_START_ADDR 0x0000 #define FPGA_BULK_READ_START_ADDR 0x0100 + #define FPGA_BULK_WRITE_START_ADDR 0x000C #define FPGA_WRITE_CMD_BUFFER_LEN (FPGA_PAGE_SIZE+8) @@ -91,6 +92,7 @@ U32 fpgaCD1Temp; ///< Reg 280. ADC RTD channel 0 - conductivity sensor 1 temperature. U32 fpgaCD2Temp; ///< Reg 284. ADC RTD channel 1 - conductivity sensor 2 temperature. + U32 fpgaTPoTemp; ///< Reg 288. ADC RTD channel 2 - conductivity sensor CPi temperature. U32 fpgaTPiTemp; ///< Reg 292. ADC RTD channel 3 - conductivity sensor CPo temperature. U32 fpgaRTDTemp; ///< Reg 296. ADC RTD channel 4 - internal temperature. @@ -224,6 +226,11 @@ memset( &fpgaSensorReadings, 0, sizeof(DG_FPGA_SENSORS_T) ); memset( &fpgaActuatorSetPoints, 0, sizeof(FPGA_ACTUATORS_T) ); + // TODO Remove the below line + // Initialize the valves + fpgaActuatorSetPoints.fpgaValveStates = 0x015F; + // TODO Remove the above line + // initialize fpga comm buffers memset( &fpgaWriteCmdBuffer, 0, FPGA_WRITE_CMD_BUFFER_LEN ); memset( &fpgaReadCmdBuffer, 0, FPGA_READ_CMD_BUFFER_LEN ); @@ -980,7 +987,7 @@ *************************************************************************/ U16 getFPGAStatus( void ) { - return 0;//fpgaSensorReadings.fpgaStatus; // TODO - are we going to have this or not? + return 0;//fpgaSensorReadings.fpgaStatus; } /*********************************************************************//** @@ -1184,7 +1191,7 @@ *************************************************************************/ U32 getFPGATHDoTemp( void ) { - return fpgaSensorReadings.fpgaTHDoTemp; + return fpgaSensorReadings.fpgaTHDo; } /*********************************************************************//** @@ -1228,7 +1235,7 @@ *************************************************************************/ U32 getFPGATDiTemp( void ) { - return fpgaSensorReadings.fpgaTDiTemp; + return fpgaSensorReadings.fpgaTDi; } /*********************************************************************//** @@ -1350,3 +1357,33 @@ { return fpgaSensorReadings.fpgaTrimmerHeaterReadCnt; } + +/*********************************************************************//** + * @brief + * The getFPGAPRimaryColdJunctionTemp function gets primary cold junction + * temperature + * @details + * Inputs : fpgaSensorReadings.fpgaPrimaryHeaterIntJunctionTemp + * Outputs : none + * @param none + * @return Last primary cold junction temperature + *************************************************************************/ +U16 getFPGAPRimaryColdJunctionTemp ( void ) +{ + return fpgaSensorReadings.fpgaPrimaryHeaterIntJunctionTemp; +} + +/*********************************************************************//** + * @brief + * The getFPGATrimmerColdJunctionTemp function gets trimmer cold junction + * temperature + * @details + * Inputs : fpgaSensorReadings.fpgaTrimmerHeaterIntJunctionTemp + * Outputs : none + * @param none + * @return Last trimmer cold junction temperature + *************************************************************************/ +U16 getFPGATrimmerColdJunctionTemp ( void ) +{ + return fpgaSensorReadings.fpgaTrimmerHeaterIntJunctionTemp; +} Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -rab6ac1bb140201e5737d594b3456038ea9e4725f -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision ab6ac1bb140201e5737d594b3456038ea9e4725f) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -54,9 +54,10 @@ /// PI Controllers -- initial configurations. static PI_CONTROLLER_T piControllers[ NUM_OF_PI_CONTROLLERS_IDS ] = { // Kp Ki uMax uMin ref meas err esw esum ctrl + { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // PI_CONTROLLER_ID_RO_PUMP - { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // PI_CONTROLLER_ID_PRIMARY_HEATER - { 0.0, 0.0, 0.25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } // PI_CONTROLLER_ID_TRIMMER_HEATER + { 0.0, 0.0, 0.89, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // PI_CONTROLLER_ID_PRIMARY_HEATER + { 0.0, 0.0, 0.50, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } // PI_CONTROLLER_ID_TRIMMER_HEATER }; /*********************************************************************//** Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -rfbf04988794f0eaa8a7a596a349bae1dfff0e079 -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision fbf04988794f0eaa8a7a596a349bae1dfff0e079) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -17,8 +17,11 @@ #include // for memcpy() +#include "ModeRecirculate.h" #include "OperationModes.h" #include "SystemCommMessages.h" +#include "TaskGeneral.h" +#include "Valves.h" #include "Reservoirs.h" /** @@ -29,16 +32,20 @@ // ********** private definitions ********** #define MIN_RESERVOIR_VOLUME_ML 0 ///< Minimum reservoir volume in mL. -#define MAX_RESERVOIR_VOLUME_ML 3000 ///< Maximum reservoir volume in mL. -#define DEFAULT_FILL_VOLUME_ML 1500 ///< Default fill volume for treatment in mL. -#define DISINFECT_FILL_VOLUME_ML 2900 ///> Fill volume for disinfection in mL. +#define MAX_RESERVOIR_VOLUME_ML 2500 ///< Maximum reservoir volume in mL. +#define DEFAULT_FILL_VOLUME_ML 1700 ///< Default fill volume for treatment in mL. +#define DISINFECT_FILL_VOLUME_ML 2400 ///> Fill volume for disinfection in mL. #define MAX_FILL_VOLUME_ML MAX_RESERVOIR_VOLUME_ML ///> Maximum fill volume in mL. #define DEFAULT_DRAIN_VOLUME_ML 100 ///> Default drain volume in mL. #define MAX_DRAIN_VOLUME_ML MAX_RESERVOIR_VOLUME_ML ///> Maximum drain volume in mL. #define MIN_DRAIN_VOLUME_ML 20 ///> Minimum drain volume in mL. +#define RESERVOIR_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< interval (ms/task time) at which the reservoir data is published on the CAN bus. + // ********** private data ********** +static U32 reservoirDataPublicationTimerCounter = 0; ///< used to schedule reservoir data publication to CAN bus. + static OVERRIDE_U32_T activeReservoir = { 0, 0, 0, 0 }; ///< The active reservoir that the DG is filling/draining/etc. static OVERRIDE_U32_T fillVolumeTargetMl = { 0, 0, 0, 0 }; ///< The target reservoir fill volume (in mL). static OVERRIDE_U32_T drainVolumeTargetMl = { 0, 0, 0, 0 }; ///< The target reservoir drain volume (in mL). @@ -51,42 +58,109 @@ * @details * Inputs : none * Outputs : Reservoirs module initialized. - * @param none * @return none *************************************************************************/ void initReservoirs( void ) { - activeReservoir.data = RESERVOIR_1; + activeReservoir.data = RESERVOIR_2; + setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); + setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); + setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); + setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); fillVolumeTargetMl.data = DEFAULT_FILL_VOLUME_ML; drainVolumeTargetMl.data = DEFAULT_DRAIN_VOLUME_ML; } /*********************************************************************//** * @brief + * The execReservoirs function manages periodic tasks for the Reservoirs module. + * @details + * Inputs : none + * Outputs : Reservoir data broadcast on interval. + * @return none + *************************************************************************/ +void execReservoirs( void ) +{ + // publish active reservoir, fill/drain volume targets at 1 Hz. + if ( ++reservoirDataPublicationTimerCounter >= RESERVOIR_DATA_PUB_INTERVAL ) + { + U32 actRes = getActiveReservoir(); + U32 filVol = getReservoirFillVolumeTargetMl(); + U32 drnVol = getReservoirDrainVolumeTargetMl(); + broadcastReservoirData( actRes, filVol, drnVol ); + reservoirDataPublicationTimerCounter = 0; + } +} + +/*********************************************************************//** + * @brief + * The setActiveReservoir function sets the given reservoir as active \n + * (meaning HD will be drawing from this reservoir). + * @details + * Inputs : none + * Outputs : Specified reservoir is set as active. + * @param resID : ID of reservoir to set as active. + * @return TRUE if set active reservoir command successful, FALSE if not. + *************************************************************************/ +BOOL setActiveReservoirCmd( RESERVOIR_ID_T resID ) +{ + BOOL result = FALSE; + + // switch reservoir command only valid in re-circulate mode + if ( DG_MODE_CIRC == getCurrentOperationMode() ) + { + switch ( resID ) + { + case RESERVOIR_1: + activeReservoir.data = (U32)resID; + result = TRUE; + setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); // TODO - valve states are reversed for the two reservoirs for now - revert back when load cells are fixed. + setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); + setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); + setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); + break; + + case RESERVOIR_2: + activeReservoir.data = (U32)resID; + result = TRUE; + setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); + setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); + break; + + default: + // invalid reservoir given - cmd will be NAK'd w/ false result. + break; + } + } + + return result; +} + +/*********************************************************************//** + * @brief * The startFill function handles a fill command from the HD. * @details * Inputs : none * Outputs : move to fill mode - * @param resID : Reservoir to drain. * @param fillToVolMl : Target volume (in mL) to fill reservoir to. - * @param targetPrimeTemp : Target temperature of dialysate to fill reservoir with. - * @param targetTrimTemp : Target temperature of dialysate coming out of reservoir. * @return TRUE if fill command successful, FALSE if not. *************************************************************************/ -BOOL startFill( RESERVOIR_ID_T resID, U32 fillToVolMl, F32 targetPrimeTemp, F32 targetTrimTemp ) +BOOL startFillCmd( U32 fillToVolMl ) { BOOL result = FALSE; - // fill command only valid in standby mode - if ( MODE_STAN == getCurrentOperationMode() ) + // fill command only valid in re-circulate mode + if ( ( DG_MODE_CIRC == getCurrentOperationMode() ) && + ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == getCurrentRecirculateState() ) ) { // validate parameters - if ( ( resID < NUM_OF_RESERVOIRS ) && ( fillToVolMl < MAX_FILL_VOLUME_ML ) ) + if ( fillToVolMl < MAX_FILL_VOLUME_ML ) { - activeReservoir.data = (U32)resID; fillVolumeTargetMl.data = fillToVolMl; - // TODO - relay temperature targets to the heater controller module - requestNewOperationMode( MODE_FILL ); + requestNewOperationMode( DG_MODE_FILL ); + result = TRUE; } } @@ -101,14 +175,15 @@ * Outputs : move to standby mode * @return TRUE if stop fill command successful, FALSE if not. *************************************************************************/ -BOOL stopFill( void ) +BOOL stopFillCmd( void ) { BOOL result = FALSE; // stop fill command only valid in fill mode - if ( MODE_FILL == getCurrentOperationMode() ) + if ( DG_MODE_FILL == getCurrentOperationMode() ) { - requestNewOperationMode( MODE_STAN ); + fillVolumeTargetMl.data = 0; + requestNewOperationMode( DG_MODE_CIRC ); } return result; @@ -120,24 +195,21 @@ * @details * Inputs : none * Outputs : - * @param resID : Reservoir to drain. * @param drainToVolMl : Target volume (in mL) to drain reservoir to. * @return TRUE if drain command successful, FALSE if not. *************************************************************************/ -BOOL startDrain( RESERVOIR_ID_T resID, U32 drainToVolMl ) +BOOL startDrainCmd( U32 drainToVolMl ) { BOOL result = FALSE; - // drain command only valid in standby mode - if ( MODE_STAN == getCurrentOperationMode() ) + // drain command only valid in re-circulate mode + if ( DG_MODE_CIRC == getCurrentOperationMode() ) { // validate parameters - if ( ( resID < NUM_OF_RESERVOIRS ) && - ( drainToVolMl > MIN_DRAIN_VOLUME_ML ) && ( drainToVolMl < MAX_DRAIN_VOLUME_ML ) ) + if ( ( drainToVolMl > MIN_DRAIN_VOLUME_ML ) && ( drainToVolMl < MAX_DRAIN_VOLUME_ML ) ) { - activeReservoir.data = (U32)resID; drainVolumeTargetMl.data = drainToVolMl; - requestNewOperationMode( MODE_DRAI ); + requestNewOperationMode( DG_MODE_DRAI ); } } @@ -152,19 +224,52 @@ * Outputs : move to standby mode * @return TRUE if stop drain command successful, FALSE if not. *************************************************************************/ -BOOL stopDrain( void ) +BOOL stopDrainCmd( void ) { BOOL result = FALSE; // stop drain command only valid in drain mode - if ( MODE_DRAI == getCurrentOperationMode() ) + if ( DG_MODE_DRAI == getCurrentOperationMode() ) { - requestNewOperationMode( MODE_STAN ); + drainVolumeTargetMl.data = 0; + requestNewOperationMode( DG_MODE_CIRC ); } return result; } +/*********************************************************************//** + * @brief + * The startTrimmerHeater function handles a start trimmer heater command \n + * from the HD. + * @details + * Inputs : none + * Outputs : start trimmer heater + * @return TRUE if stop drain command successful, FALSE if not. + *************************************************************************/ +BOOL startTrimmerHeaterCmd( void ) +{ + BOOL result = FALSE; + // TODO + return result; +} + +/*********************************************************************//** + * @brief + * The stopTrimmerHeater function handles a stop trimmer heater command \n + * from the HD. + * @details + * Inputs : none + * Outputs : stop trimmer heater + * @return TRUE if stop drain command successful, FALSE if not. + *************************************************************************/ +BOOL stopTrimmerHeaterCmd( void ) +{ + BOOL result = FALSE; + // TODO + return result; +} + /************************************************************************* * GET SUPPORT FUNCTIONS *************************************************************************/ @@ -200,11 +305,11 @@ *************************************************************************/ U32 getReservoirFillVolumeTargetMl( void ) { - U32 result = (RESERVOIR_ID_T)fillVolumeTargetMl.data; + U32 result = fillVolumeTargetMl.data; if ( OVERRIDE_KEY == fillVolumeTargetMl.override ) { - result = (RESERVOIR_ID_T)fillVolumeTargetMl.ovData; + result = fillVolumeTargetMl.ovData; } return result; @@ -221,11 +326,11 @@ *************************************************************************/ U32 getReservoirDrainVolumeTargetMl( void ) { - U32 result = (RESERVOIR_ID_T)drainVolumeTargetMl.data; + U32 result = drainVolumeTargetMl.data; if ( OVERRIDE_KEY == drainVolumeTargetMl.override ) { - result = (RESERVOIR_ID_T)drainVolumeTargetMl.ovData; + result = drainVolumeTargetMl.ovData; } return result; Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -rfbf04988794f0eaa8a7a596a349bae1dfff0e079 -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision fbf04988794f0eaa8a7a596a349bae1dfff0e079) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -41,11 +41,15 @@ // ********** public function prototypes ********** void initReservoirs( void ); +void execReservoirs( void ); -BOOL startFill( RESERVOIR_ID_T resID, U32 fillToVolMl, F32 targetPrimeTemp, F32 targetTrimTemp ); // handle fill command from HD -BOOL stopFill( void ); // handle stop fill command from HD -BOOL startDrain( RESERVOIR_ID_T resID, U32 drainToVolMl ); // handle drain command from HD -BOOL stopDrain( void ); // handle stop drain command from HD +BOOL setActiveReservoirCmd( RESERVOIR_ID_T resID ); // handle switch reservoirs command from HD +BOOL startFillCmd( U32 fillToVolMl ); // handle fill command from HD +BOOL stopFillCmd( void ); // handle stop fill command from HD +BOOL startDrainCmd( U32 drainToVolMl ); // handle drain command from HD +BOOL stopDrainCmd( void ); // handle stop drain command from HD +BOOL startTrimmerHeaterCmd( void ); // handle start trimmer heater control command from HD +BOOL stopTrimmerHeaterCmd( void ); // handle stop trimmer heater control command from HD DATA_GET_PROTOTYPE( RESERVOIR_ID_T, getActiveReservoir ); DATA_GET_PROTOTYPE( U32, getReservoirFillVolumeTargetMl ); Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r57007cd9fc64466a979f6613763a243d77743117 -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 57007cd9fc64466a979f6613763a243d77743117) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -29,10 +29,6 @@ #include "Utilities.h" #include "SystemCommMessages.h" -#ifdef RM46_EVAL_BOARD_TARGET - #include "CPLD.h" -#endif - // ********** private definitions ********** #define NUM_OF_CAN_OUT_BUFFERS 4 // # of CAN buffers for transmit @@ -649,7 +645,7 @@ // add new message to queue for later processing addToMsgQueue( MSG_Q_IN, &rcvMsg ); // if message from HD broadcast channel, update HD comm status - if ( COMM_BUFFER_IN_CAN_HD_BROADCAST == i ) + if ( COMM_BUFFER_IN_CAN_HD_BROADCAST == MSG_IN_BUFFERS[ i ] ) { hdIsCommunicating = TRUE; timeOfLastHDCheckIn = getMSTimerCount(); @@ -817,7 +813,9 @@ if ( TRUE == didTimeout( timeOfLastHDCheckIn, HD_COMM_TIMEOUT_IN_MS ) ) { hdIsCommunicating = FALSE; - //activateAlarmNoData( ALARM_ID_HD_COMM_TIMEOUT ); // TODO - add this alarm if we're in middle of a treatment? or if in a mode that comm loss would impact badly? +#ifndef DEBUG_ENABLED + activateAlarmNoData( ALARM_ID_HD_COMM_TIMEOUT ); // TODO - add this alarm if we're in middle of a treatment? or if in a mode that comm loss would impact badly? +#endif } } @@ -978,6 +976,42 @@ // handle any messages from other sub-systems switch ( msgID ) { + case MSG_ID_POWER_OFF_WARNING: + handlePowerOffWarning( message ); + break; + + case MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS: + handleSetDialysateTemperatureCmd( message ); + break; + + case MSG_ID_REQUEST_FW_VERSIONS: + handleFWVersionCmd( message ); + break; + + case MSG_ID_DG_SWITCH_RESERVOIR_CMD: + handleSwitchReservoirCmd( message ); + break; + + case MSG_ID_DG_FILL_CMD: + handleFillCmd( message ); + break; + + case MSG_ID_DG_DRAIN_CMD: + handleDrainCmd( message ); + break; + + case MSG_ID_STARTING_STOPPING_TREATMENT_CMD: + handleStartStopTreatmentMsg( message ); + break; + + case MSG_ID_DG_SAMPLE_WATER_CMD: + handleSampleWaterCmd( message ); + break; + + case MSG_ID_DG_START_STOP_TRIMMER_HEATER_CMD: + handleStartStopTrimmerHeaterCmd( message ); + break; + case MSG_ID_DG_TESTER_LOGIN_REQUEST: handleTesterLogInRequest( message ); break; @@ -992,14 +1026,14 @@ { switch ( msgID ) { + case MSG_ID_DG_ALARM_STATE_OVERRIDE: + handleTestAlarmStateOverrideRequest( message ); + break; + case MSG_ID_DG_WATCHDOG_TASK_CHECKIN_OVERRIDE: handleTestWatchdogCheckInStateOverrideRequest( message ); break; - case MSG_ID_ALARM_STATE_OVERRIDE: - handleTestAlarmStateOverrideRequest( message ); - break; - case MSG_ID_DG_SET_RTC_DATE_TIME: handleSetRTCTimestamp( message ); break; @@ -1012,6 +1046,49 @@ handleTestLoadCellOverrideRequest( message ); break; + case MSG_ID_LOAD_CELLL_SEND_INTERVAL_OVERRIDE: + handleTestLoadCellDataBroadcastIntervalOverrideRequest( message ); + break; + + case MSG_ID_PRESSURE_OVERRIDE: + handleTestPressureSensorOverrideRequest( message ); + break; + + case MSG_ID_PRESSURE_SEND_INTERVAL_OVERRIDE: + handleTestPressureDataBroadcastIntervalOverrideRequest( message ); + break; + + case MSG_ID_RO_PUMP_SET_PT_OVERRIDE: + handleTestROPumpSetPointOverrideRequest( message ); + break; + + case MSG_ID_RO_MEASURED_FLOW_OVERRIDE: + handleTestROMeasuredFlowOverrideRequest( message ); + break; + + case MSG_ID_RO_PUMP_SEND_INTERVAL_OVERRIDE: + handleTestROPumpDataBroadcastIntervalOverrideRequest( message ); + break; + + case MSG_ID_DRAIN_PUMP_SET_PT_OVERRIDE: + handleTestDrainPumpSetPointOverrideRequest( message ); + break; + + case MSG_ID_DRAIN_PUMP_SEND_INTERVAL_OVERRIDE: + handleTestDrainPumpDataBroadcastIntervalOverrideRequest( message ); + break; + + case MSG_ID_VALVE_STATE_OVERRIDE: + handleTestValveStateOverrideRequest( message ); + break; + + case MSG_ID_VALVES_STATES_PUBLISH_INTERVAL_OVERRIDE: + handleTestValvesStatesPublishIntervalOverrideRequest( message ); + break; + + case MSG_ID_DG_SAFETY_SHUTDOWN_OVERRIDE: + handleTestDGSafetyShutdownOverrideRequest( message ); + case MSG_ID_TEMPERATURE_SENSORS_VALUE_OVERRIDE: handleTestTemperatureSensorsOverrideRequest ( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r611e805a6547ac922154e623a9d79adeae128e81 -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 611e805a6547ac922154e623a9d79adeae128e81) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -18,9 +18,23 @@ #include // for memcpy() +#include "DrainPump.h" +#include "Heaters.h" +#include "LoadCell.h" #include "MsgQueues.h" +#include "ModeStandby.h" +#include "ModeRecirculate.h" +#include "OperationModes.h" +#include "Pressures.h" +#include "Reservoirs.h" +#include "ROPump.h" +#include "RTC.h" +#include "SystemComm.h" +#include "Utilities.h" +#include "Valves.h" #include "WatchdogMgmt.h" #include "SystemCommMessages.h" +#include "SafetyShutdown.h" #include "Utilities.h" #include "SystemComm.h" #include "RTC.h" @@ -61,6 +75,40 @@ typedef struct { + U32 setROPumpPressure; + F32 measROFlowRate; + F32 roPumpPWM; +} RO_PUMP_DATA_T; + +typedef struct +{ + U32 setDrainPumpSpeed; + U32 dacValue; +} DRAIN_PUMP_DATA_T; + +typedef struct +{ + F32 roPumpInletPressure; + F32 roPumpOutletPressure; + F32 drainPumpInletPressure; + F32 drainPumpOutletPressure; +} PRESSURES_DATA_T; + +typedef struct +{ + U32 activeReservoir; + U32 fillToVolumeMl; + U32 drainToVolumeMl; +} RESERVOIR_DATA_T; + +typedef struct +{ + U32 targetPrimaryHeaterTemp; + U32 targetTrimmerHeaterTemp; +} TARGET_TEMPS_PAYLOAD_T; + +typedef struct +{ U32 mainPrimayHeaterDC; U32 smallPrimaryHeaterDC; U32 trimmerHeaterDC; @@ -77,6 +125,7 @@ static U32 serializeMessage( MESSAGE_T msg, COMM_BUFFER_T buffer, BOOL ackReq ); static BOOL sendTestAckResponseMsg( MSG_ID_T msgID, BOOL ack ); +static BOOL sendAckResponseMsg( MSG_ID_T msgID, COMM_BUFFER_T buffer, BOOL ack ); /************************************************************************* * @brief serializeMessage @@ -191,8 +240,38 @@ return result; } +/************************************************************************* + * @brief sendTestAckResponseMsg + * The sendTestAckResponseMsg function constructs a simple response \n + * message for a handled test message and queues it for transmit on the \n + * appropriate UART channel. + * @details + * Inputs : none + * Outputs : response message constructed and queued for transmit. + * @param msgID : ID of handled message that we are responding to + * @param buffer : outgoing buffer that message should be queued in + * @param ack : TRUE if test message was handled successfully, FALSE if not + * @return TRUE if response message successfully queued for transmit, FALSE if not + *************************************************************************/ +static BOOL sendAckResponseMsg( MSG_ID_T msgID, COMM_BUFFER_T buffer, BOOL ack ) +{ + BOOL result; + MESSAGE_T msg; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = msgID; + msg.hdr.payloadLen = sizeof( U08 ); + msg.payload[ 0 ] = (U08)ack; + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, buffer, ACK_NOT_REQUIRED ); + + return result; +} + // *********************************************************************** -// ********************* MSG_ID_OFF_BUTTON_PRESS ************************* +// ***************** Message Sending Helper Functions ******************** // *********************************************************************** /************************************************************************* @@ -290,34 +369,30 @@ /************************************************************************* * @brief - * The broadcastTreatmentTime function constructs a treatment time msg to \n - * be broadcast and queues the msg for transmit on the appropriate CAN channel. + * The broadcastDGHDOperationMode function constructs a DG operation mode \n + * broadcast message and queues the msg for transmit on the appropriate CAN channel. * @details * Inputs : none - * Outputs : treatment time data msg constructed and queued - * @param secsTotTreatment : Total treatment time prescribed (in seconds). - * @param secsElapsed : Treatment time elapsed (in seconds). - * @param secsRemaining : Treatment time remaining (in seconds). + * Outputs : DG operation mode msg constructed and queued + * @param mode : current operation mode of the DG. + * @param subMode : current sub-mode of the current operation mode of the DG. * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastTreatmentTime( U32 secsTotTreatment, U32 secsElapsed, U32 secsRemaining ) +BOOL broadcastDGOperationMode( U32 mode, U32 subMode ) { BOOL result; MESSAGE_T msg; U08 *payloadPtr = msg.payload; - TREATMENT_TIME_DATA_T payload; // create a message record blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_TREATMENT_TIME; - msg.hdr.payloadLen = sizeof( TREATMENT_TIME_DATA_T ); + msg.hdr.msgID = MSG_ID_DG_OP_MODE; + msg.hdr.payloadLen = sizeof( U32 ) + sizeof( U32 ); - payload.treatmentTimePrescribedinSec = secsTotTreatment; - payload.treatmentTimeElapsedinSec = secsElapsed; - payload.treatmentTimeRemaininginSec = secsRemaining; + memcpy( payloadPtr, &mode, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &subMode, sizeof( U32 ) ); - memcpy( payloadPtr, &payload, sizeof( TREATMENT_TIME_DATA_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_DG_BROADCAST, ACK_NOT_REQUIRED ); @@ -328,7 +403,7 @@ * @brief * The broadcastLoadCellData function sends out load cell data. * @details - * Inputs : load cell data + * Inputs : none * Outputs : load cell data msg constructed and queued * @param loadCellA1 : load cell A 1 data in grams. * @param loadCellA2 : load cell A 2 data in grams. @@ -363,6 +438,35 @@ /************************************************************************* * @brief + * The broadcastValvesStates function sends out DG valves states. + * @details + * Inputs : none + * Outputs : Valves states msg constructed and queued + * @param valvesStates : valves states + * refer to setFPGAValveStates function in FPGA.c for details + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastValvesStates( U16 valvesStates ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_VALVES_STATES; + msg.hdr.payloadLen = sizeof( U16 ); + + memcpy( payloadPtr, &valvesStates, sizeof( U16 ) ); + + // 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_DG_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} + +/************************************************************************* + * @brief * The broadcastHeatersData function sends out DG heaters data * @details * Inputs : heaters data @@ -375,20 +479,55 @@ BOOL broadcastHeatersData ( U32 mainPrimaryDC, U32 smallPrimaryDC, U32 trimmerDC ) { BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + HEATERS_DATA_T payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_HEATERS_DATA; + msg.hdr.payloadLen = sizeof( HEATERS_DATA_T ); + + payload.mainPrimayHeaterDC = mainPrimaryDC; + payload.smallPrimaryHeaterDC = smallPrimaryDC; + payload.trimmerHeaterDC = trimmerDC; + + memcpy( payloadPtr, &payload, sizeof( HEATERS_DATA_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_DG_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} + +/************************************************************************* + * @brief + * The broadcastROPumpData function sends out RO pump data. + * @details + * Inputs : none + * Outputs : RO pump data msg constructed and queued + * @param tgtPressure : target pressure for RO pump in PSI. + * @param measFlow : measure RO flow rate in LPM. + * @param setPWM : set PWM duty cycle in %. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastROPumpData( U32 tgtPressure, F32 measFlow, F32 setPWM ) +{ + BOOL result; MESSAGE_T msg; U08 *payloadPtr = msg.payload; - HEATERS_DATA_T payload; + RO_PUMP_DATA_T payload; // create a message record blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_DG_HEATERS_DATA; - msg.hdr.payloadLen = sizeof( HEATERS_DATA_T ); + msg.hdr.msgID = MSG_ID_RO_PUMP_DATA; + msg.hdr.payloadLen = sizeof( RO_PUMP_DATA_T ); - payload.mainPrimayHeaterDC = mainPrimaryDC; - payload.smallPrimaryHeaterDC = smallPrimaryDC; - payload.trimmerHeaterDC = trimmerDC; + payload.setROPumpPressure = tgtPressure; + payload.measROFlowRate = measFlow; + payload.roPumpPWM = setPWM; - memcpy( payloadPtr, &payload, sizeof( HEATERS_DATA_T ) ); + memcpy( payloadPtr, &payload, sizeof( RO_PUMP_DATA_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_DG_BROADCAST, ACK_NOT_REQUIRED ); @@ -398,6 +537,111 @@ /************************************************************************* * @brief + * The broadcastDrainPumpData function sends out RO pump data. + * @details + * Inputs : none + * Outputs : Drain pump data msg constructed and queued + * @param tgtSpeed : target speed for drain pump in RPM. + * @param dac : set DAC value. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastDrainPumpData( U32 tgtSpeed, U32 dac ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + DRAIN_PUMP_DATA_T payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DRAIN_PUMP_DATA; + msg.hdr.payloadLen = sizeof( DRAIN_PUMP_DATA_T ); + + payload.setDrainPumpSpeed = tgtSpeed; + payload.dacValue = dac; + + memcpy( payloadPtr, &payload, sizeof( DRAIN_PUMP_DATA_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_DG_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} + +/************************************************************************* + * @brief + * The broadcastPressureSensorsData function sends out DG pressure data. + * @details + * Inputs : none + * Outputs : Pressure data msg constructed and queued + * @param measROIn : measured RO pump inlet pressure in PSI. + * @param measROOut : measured RO pump outlet pressure in PSI. + * @param measDrainIn : measured Drain pump inlet pressure in PSI. + * @param measDrainOut : measured Drain pump outlet pressure in PSI. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastPressureSensorsData( F32 measROIn, F32 measROOut, F32 measDrainIn, F32 measDrainOut ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + PRESSURES_DATA_T payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_PRESSURES_DATA; + msg.hdr.payloadLen = sizeof( PRESSURES_DATA_T ); + + payload.roPumpInletPressure = measROIn; + payload.roPumpOutletPressure = measROOut; + payload.drainPumpInletPressure = measDrainIn; + payload.drainPumpOutletPressure = measDrainOut; + + memcpy( payloadPtr, &payload, sizeof( PRESSURES_DATA_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_DG_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} + +/************************************************************************* + * @brief + * The broadcastReservoirData function broadcasts the DG reservoir data. + * @details + * Inputs : none + * Outputs : Reservoir data msg constructed and queued + * @param resID : ID of currently active reservoir. + * @param fillToVol : Current target fill to volume for inactive reservoir. + * @param drainToVol : Current target drain to volume for inactive reservoir. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastReservoirData( U32 resID, U32 fillToVol, U32 drainToVol ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + RESERVOIR_DATA_T payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_RESERVOIR_DATA; + msg.hdr.payloadLen = sizeof( RESERVOIR_DATA_T ); + + payload.activeReservoir = resID; + payload.fillToVolumeMl = fillToVol; + payload.drainToVolumeMl = drainToVol; + + memcpy( payloadPtr, &payload, sizeof( RESERVOIR_DATA_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_DG_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} + +/************************************************************************* + * @brief * The broadcastTemperatureSensorsData function sends out DG temperature * sensors data * Inputs : heaters data @@ -424,7 +668,248 @@ return result; } +// *********************************************************************** +// **************** Message Handling Helper Functions ******************** +// *********************************************************************** + /************************************************************************* + * @brief + * The handlePowerOffWarning function handles a power off warning message \n + * from the HD. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handlePowerOffWarning( MESSAGE_T *message ) +{ + // TODO - signal modules that require a warning +} + +/************************************************************************* + * @brief + * The handleSetDialysateTemperatureCmd function handles a dialysate temperature \n + * set points message from the HD. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleSetDialysateTemperatureCmd( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == sizeof(TARGET_TEMPS_PAYLOAD_T) ) + { + TARGET_TEMPS_PAYLOAD_T payload; + + result = TRUE; + memcpy( &payload, message->payload, sizeof(TARGET_TEMPS_PAYLOAD_T) ); + setPrimaryHeaterTargetTemperature( (F32)payload.targetPrimaryHeaterTemp ); + setTrimmerHeaterTargetTemperature( (F32)payload.targetTrimmerHeaterTemp ); + } + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); +} + +/************************************************************************* + * @brief + * The handleFWVersionCmd function handles a FW version request message. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleFWVersionCmd( MESSAGE_T *message ) +{ + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + U08 major = (U08)DG_VERSION_MAJOR; + U08 minor = (U08)DG_VERSION_MINOR; + U08 micro = (U08)DG_VERSION_MICRO; + U16 build = (U16)DG_VERSION_BUILD; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_VERSION; + msg.hdr.payloadLen = sizeof( U08 ) + sizeof( U08 ) + sizeof( U08 ) + sizeof( U16 ); + + memcpy( payloadPtr, &major, sizeof( U08 ) ); + payloadPtr += sizeof( U08 ); + memcpy( payloadPtr, &minor, sizeof( U08 ) ); + payloadPtr += sizeof( U08 ); + memcpy( payloadPtr, µ, sizeof( U08 ) ); + payloadPtr += sizeof( U08 ); + memcpy( payloadPtr, &build, sizeof( U16 ) ); + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); +} + +/************************************************************************* + * @brief + * The handleSwitchReservoirCmd function handles a switch reservoirs command \n + * from the HD. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleSwitchReservoirCmd( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == sizeof(RESERVOIR_ID_T) ) + { + RESERVOIR_ID_T reservoirID; + + result = TRUE; + memcpy( &reservoirID, message->payload, sizeof(RESERVOIR_ID_T) ); + setActiveReservoirCmd( reservoirID ); + } + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); +} + +/************************************************************************* + * @brief + * The handleFillCmd function handles a fill command from the HD. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleFillCmd( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == sizeof(U32) ) + { + U32 fillToVolumeMl; + + result = TRUE; + memcpy( &fillToVolumeMl, message->payload, sizeof(U32) ); + startFillCmd( fillToVolumeMl ); + } + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); +} + +/************************************************************************* + * @brief + * The handleDrainCmd function handles a drain command from the HD. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleDrainCmd( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == sizeof(U32) ) + { + U32 drainToVolMl; + + result = TRUE; + memcpy( &drainToVolMl, message->payload, sizeof(U32) ); + + startDrainCmd( drainToVolMl ); + } + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); +} + +/************************************************************************* + * @brief + * The handleStartStopTreatmentMsg function handles a treatment start/stop \n + * message from the HD. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleStartStopTreatmentMsg( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == sizeof(U32) ) + { + BOOL startingTreatment; + + memcpy( &startingTreatment, message->payload, sizeof(U32) ); + + if ( DG_MODE_STAN == getCurrentOperationMode() && TRUE == startingTreatment ) + { + result = requestDGStart(); + } + else if ( DG_MODE_CIRC == getCurrentOperationMode() && FALSE == startingTreatment ) + { + result = requestDGStop(); + } + } + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); +} + +/************************************************************************* + * @brief + * The handleStartStopTrimmerHeaterCmd function handles a trimmer heater start/stop \n + * command message from the HD. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleStartStopTrimmerHeaterCmd( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == sizeof(U32) ) + { + BOOL startingHeater; + + memcpy( &startingHeater, message->payload, sizeof(U32) ); + + if ( TRUE == startingHeater ) + { + result = startTrimmerHeaterCmd(); + } + else + { + result = stopTrimmerHeaterCmd(); + } + } + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); +} + +/************************************************************************* + * @brief + * The handleSampleWaterCmd function handles a sample water command from the HD. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleSampleWaterCmd( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == 0 ) + { + if ( DG_MODE_STAN == getCurrentOperationMode() ) + { + result = requestWaterSample(); + } + } + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); +} + +/************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ @@ -522,32 +1007,6 @@ } /************************************************************************* - * @brief - * The handleTestDGMessageRequest function handles a request to add a \n - * DG message to the received message queue. - * @details - * Inputs : none - * Outputs : message handled - * @param message : a pointer to the message to handle - * @return none - *************************************************************************/ -void handleTestDGMessageRequest( MESSAGE_T *message ) -{ - MESSAGE_WRAPPER_T dgMessage; - U32 msgLen = (U32)(message->hdr.payloadLen); - U08 *msgBytes = (U08*)(&(dgMessage)); - BOOL result; - - memcpy( msgBytes, message->payload, msgLen ); - - // add HD message to received message queue - result = addToMsgQueue( MSG_Q_IN, &dgMessage ); - - // respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - -/************************************************************************* * @brief handleTestWatchdogCheckInStateOverrideRequest * The handleTestWatchdogCheckInStateOverrideRequest function handles a \n * request to override the check-in status of a given task. @@ -572,6 +1031,8 @@ DATA_ARRAY_OVERRIDE_HANDLER_FUNC_U32( BOOL, handleTestAlarmStateOverrideRequest, testSetAlarmStateOverride, testResetAlarmStateOverride ) /************************************************************************* +<<<<<<< HEAD +======= * @brief * The handleTestLoadCellOverrideRequest function handles a request to \n * override the value read from the given load cell. @@ -651,6 +1112,164 @@ /************************************************************************* * @brief + * The handleTestLoadCellDataBroadcastIntervalOverrideRequest function handles \n + * a request to override the broadcast interval for load cell data. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestLoadCellDataBroadcastIntervalOverrideRequest, testSetLoadCellDataPublishIntervalOverride, testResetLoadCellDataPublishIntervalOverride ) + +/************************************************************************* + * @brief + * The handleTestPressureSensorOverrideRequest function handles a request to \n + * override the value read from the given pressure sensor. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_ARRAY_OVERRIDE_HANDLER_FUNC_F32( BOOL, handleTestPressureSensorOverrideRequest, testSetDGPressureSensorOverride, testResetDGPressureSensorOverride ) + +/************************************************************************* + * @brief + * The handleTestPressureDataBroadcastIntervalOverrideRequest function handles \n + * a request to override the broadcast interval for load cell data. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestPressureDataBroadcastIntervalOverrideRequest, testSetPressuresDataPublishIntervalOverride, testResetPressuresDataPublishIntervalOverride ) + +/************************************************************************* + * @brief + * The handleTestROPumpSetPointOverrideRequest function handles a request to \n + * override the RO pump pressure set point (in PSI). + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestROPumpSetPointOverrideRequest, testSetTargetROPumpPressureOverride, testResetTargetROPumpPressureOverride ) + +/************************************************************************* + * @brief + * The handleTestROMeasuredFlowOverrideRequest function handles a request to \n + * override the RO flow rate. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestROMeasuredFlowOverrideRequest, testSetMeasuredROFlowRateOverride, testResetMeasuredROFlowRateOverride ) + +/************************************************************************* + * @brief + * The handleTestROPumpDataBroadcastIntervalOverrideRequest function handles \n + * a request to override the broadcast interval for RO pump data. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestROPumpDataBroadcastIntervalOverrideRequest, testSetROPumpDataPublishIntervalOverride, testResetROPumpDataPublishIntervalOverride ) + +/************************************************************************* + * @brief + * The handleTestDrainPumpSetPointOverrideRequest function handles a request to \n + * override the drain pump speed set point (in RPM). + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( BOOL, handleTestDrainPumpSetPointOverrideRequest, testSetTargetDrainPumpSpeedOverride, testResetTargetDrainPumpSpeedOverride ) + +/************************************************************************* + * @brief + * The handleTestDrainPumpDataBroadcastIntervalOverrideRequest function handles \n + * a request to override the broadcast interval for drain pump data. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestDrainPumpDataBroadcastIntervalOverrideRequest, testSetDrainPumpDataPublishIntervalOverride, testResetDrainPumpDataPublishIntervalOverride ) + +/************************************************************************* + * @brief + * The handleTestValveStateOverrideRequest function handles a request to \n + * override the state value read from the given valve. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_ARRAY_OVERRIDE_HANDLER_FUNC_U32( BOOL, handleTestValveStateOverrideRequest, testSetValveStateOverride, testResetValveStateOverride ) + +/************************************************************************* + * @brief + * The handleTestValvesStatesPublishIntervalOverrideRequest function handles \n + * a request to override the publish interval of valves states from the given valve. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( BOOL, handleTestValvesStatesPublishIntervalOverrideRequest, testSetValvesStatesPublishIntervalOverride, testResetValvesStatesPublishIntervalOverride ) + +/************************************************************************* + * @brief + * The handleTestDGSafetyShutdownOverrideRequest function handles a \n + * request to override the safety shutdown signal. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestDGSafetyShutdownOverrideRequest, testSetSafetyShutdownOverride, testResetSafetyShutdownOverride ) + +#ifdef CAN_TEST +void broadcastCANTest1LargeFrequentMessage() +{ + static U16 seqNo = 0; + MESSAGE_T msg; + U32 i; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = 99; + msg.hdr.payloadLen = 96; + + for ( i = 0; i < 12; i++ ) + { + memcpy(&msg.payload[i*8], &seqNo, 2); + seqNo++; + } + memcpy(&msg.payload[94], &seqNo, 2); + seqNo++; + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); +} + +#endif + +/************************************************************************* + * @brief * The handleStartStopPrimaryHeater function handles a request start or * stop the primary heater * @details Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r57007cd9fc64466a979f6613763a243d77743117 -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 57007cd9fc64466a979f6613763a243d77743117) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -35,9 +35,54 @@ // MSG_ID_RTC_EPOCH BOOL broadcastRTCEpoch( U32 epoch ); // TODO - probably don't want DG to broadcast these +// MSG_ID_DG_OP_MODE +BOOL broadcastDGOperationMode( U32 mode, U32 subMode ); + // MSG_ID_LOAD_CELL_READINGS BOOL broadcastLoadCellData( F32 loadCellA1, F32 loadCellA2, F32 loadCellB1, F32 loadCellB2 ); +// MSG_ID_DG_VALVES_STATES +BOOL broadcastValvesStates( U16 valvesStates ); + +// MSG_ID_RO_PUMP_DATA +BOOL broadcastROPumpData( U32 tgtPressure, F32 measFlow, F32 setPWM ); + +// MSG_ID_DRAIN_PUMP_DATA +BOOL broadcastDrainPumpData( U32 tgtSpeed, U32 dac ); + +// MSG_ID_DG_PRESSURES_DATA +BOOL broadcastPressureSensorsData( F32 measROIn, F32 measROOut, F32 measDrainIn, F32 measDrainOut ); + +// MSG_ID_DG_RESERVOIR_DATA +BOOL broadcastReservoirData( U32 resID, U32 fillToVol, U32 drainToVol ); + +// MSG_ID_POWER_OFF_WARNING +void handlePowerOffWarning( MESSAGE_T *message ); + +// MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS +void handleSetDialysateTemperatureCmd( MESSAGE_T *message ); + +// MSG_ID_REQUEST_FW_VERSIONS +void handleFWVersionCmd( MESSAGE_T *message ); + +// MSG_ID_DG_SWITCH_RESERVOIR +void handleSwitchReservoirCmd( MESSAGE_T *message ); + +// MSG_ID_DG_FILL +void handleFillCmd( MESSAGE_T *message ); + +// MSG_ID_DG_DRAIN +void handleDrainCmd( MESSAGE_T *message ); + +// MSG_ID_STARTING_STOPPING_TREATMENT +void handleStartStopTreatmentMsg( MESSAGE_T *message ); + +// MSG_ID_DG_SAMPLE_WATER_CMD +void handleSampleWaterCmd( MESSAGE_T *message ); + +// MSG_ID_DG_START_STOP_TRIMMER_HEATER_CMD +void handleStartStopTrimmerHeaterCmd( MESSAGE_T *message ); + // MSG_ID_HEATERS_READINGS BOOL broadcastHeatersData ( U32 mainPrimaryDC, U32 smallPrimaryDC, U32 trimmerDC ); @@ -55,18 +100,18 @@ void handleTesterLogInRequest( MESSAGE_T *message ); BOOL isTestingActivated( void ); -// MSG_ID_DG_MESSAGE -void handleTestDGMessageRequest( MESSAGE_T *message ); +// MSG_ID_DG_ALARM_STATE_OVERRIDE +void handleTestAlarmStateOverrideRequest( MESSAGE_T *message ); // MSG_ID_WATCHDOG_TASK_CHECKIN_OVERRIDE: void handleTestWatchdogCheckInStateOverrideRequest( MESSAGE_T *message ); -// MSG_ID_ALARM_STATE_OVERRIDE -void handleTestAlarmStateOverrideRequest( MESSAGE_T *message ); - // MSG_ID_LOAD_CELL_OVERRIDE void handleTestLoadCellOverrideRequest( MESSAGE_T *message ); +// MSG_ID_LOAD_CELLL_SEND_INTERVAL_OVERRIDE: +void handleTestLoadCellDataBroadcastIntervalOverrideRequest( MESSAGE_T *message ); + // MSG_ID_TEMPERATURE_SENSORS_OVERRIDE void handleTestTemperatureSensorsOverrideRequest ( MESSAGE_T *message ); @@ -76,8 +121,42 @@ // MSG_ID_SET_RTC_TIMESTAMP void handleSetRTCTimestamp( MESSAGE_T *message ); +// MSG_ID_PRESSURE_OVERRIDE: +void handleTestPressureSensorOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_PRESSURE_SEND_INTERVAL_OVERRIDE: +void handleTestPressureDataBroadcastIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_RO_PUMP_SET_PT_OVERRIDE: +void handleTestROPumpSetPointOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_RO_MEASURED_FLOW_OVERRIDE: +void handleTestROMeasuredFlowOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_RO_PUMP_SEND_INTERVAL_OVERRIDE: +void handleTestROPumpDataBroadcastIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DRAIN_PUMP_SET_PT_OVERRIDE: +void handleTestDrainPumpSetPointOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DRAIN_PUMP_SEND_INTERVAL_OVERRIDE: +void handleTestDrainPumpDataBroadcastIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_VALVE_STATE_OVERRIDE +void handleTestValveStateOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_VALVES_STATES_PUBLISH_INTERVAL_OVERRIDE +void handleTestValvesStatesPublishIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DG_SAFETY_SHUTDOWN_OVERRIDE: +void handleTestDGSafetyShutdownOverrideRequest( MESSAGE_T *message ); + +#ifdef CAN_TEST +// MSG_ID_DG_CAN_TEST_1_LARGE_FREQ +void broadcastCANTest1LargeFrequentMessage(); +#endif + // MSG_ID_START_STOP_PRIMARY_HEATER BOOL handleStartStopPrimaryHeater( MESSAGE_T * message ); #endif - Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -ra4f914bb121154c4bd8b9f44171d3b3c00d826c6 -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision a4f914bb121154c4bd8b9f44171d3b3c00d826c6) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -84,6 +84,12 @@ // manage data to be transmitted to other sub-systems execSystemCommTx(); + // Primary heaters state machine + execPrimaryHeaters(); + + // Trimmer heater state machine + execTrimmerHeater(); + // toggle GPIO to indicate general task has executed // gioToggleBit( gioPORTB, 1 ); } Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -ra4f914bb121154c4bd8b9f44171d3b3c00d826c6 -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision a4f914bb121154c4bd8b9f44171d3b3c00d826c6) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -26,6 +26,8 @@ #include "TemperatureSensors.h" #include "Valves.h" #include "WatchdogMgmt.h" +#include "TemperatureSensors.h" +#include "Heaters.h" /************************************************************************* * @brief taskPriority @@ -66,6 +68,12 @@ // 2nd pass for FPGA execFPGAOut(); + // Temperature sensors read + execTemperatureSensors(); + + // Heaters monitor + execHeatersMonitor(); + // check in with watchdog manager checkInWithWatchdogMgmt( TASK_PRIORITY ); Index: firmware/DG.dil =================================================================== diff -u -r31b53220d894e272a8f9a8a49d3c9110150489db -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/DG.dil (.../DG.dil) (revision 31b53220d894e272a8f9a8a49d3c9110150489db) +++ firmware/DG.dil (.../DG.dil) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -1,4 +1,4 @@ -# RM46L852PGE 05/01/20 10:44:46 +# RM46L852PGE 06/03/20 14:44:45 # ARCH=RM46L852PGE # @@ -374,9 +374,9 @@ DRIVER.SYSTEM.VAR.VIM_CHANNEL_37_INT_TYPE.VALUE=IRQ DRIVER.SYSTEM.VAR.VIM_CHANNEL_32_INT_PRAGMA_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.VIM_CHANNEL_29_INT_ENABLE.VALUE=1 -DRIVER.SYSTEM.VAR.VIM_CHANNEL_29_INT_TYPE.VALUE=FIQ +DRIVER.SYSTEM.VAR.VIM_CHANNEL_29_INT_TYPE.VALUE=IRQ DRIVER.SYSTEM.VAR.VIM_CHANNEL_24_INT_PRAGMA_ENABLE.VALUE=0 -DRIVER.SYSTEM.VAR.VIM_CHANNEL_16_INT_PRAGMA_ENABLE.VALUE=1 +DRIVER.SYSTEM.VAR.VIM_CHANNEL_16_INT_PRAGMA_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.SAFETY_INIT_MIBSPI4_RAMPARITYCHECK_ENA.VALUE=0 DRIVER.SYSTEM.VAR.SAFETY_INIT_EMAC_SP_PBISTCHECK_ENA.VALUE=0x00000000 DRIVER.SYSTEM.VAR.MINIT_VALUE.VALUE=0x1E57F @@ -457,7 +457,7 @@ DRIVER.SYSTEM.VAR.VIM_CHANNEL_53_INT_PRAGMA_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.VIM_CHANNEL_45_INT_PRAGMA_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.VIM_CHANNEL_37_INT_PRAGMA_ENABLE.VALUE=0 -DRIVER.SYSTEM.VAR.VIM_CHANNEL_29_INT_PRAGMA_ENABLE.VALUE=1 +DRIVER.SYSTEM.VAR.VIM_CHANNEL_29_INT_PRAGMA_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.SAFETY_INIT_VIM1_RAMPARITYCHECK_ENA.VALUE=1 DRIVER.SYSTEM.VAR.CLKT_AVCLK4_SOURCE.VALUE=VCLK DRIVER.SYSTEM.VAR.FLASH_ADDRESS_WAIT_STATES_FREQ.VALUE=165.0 @@ -954,7 +954,7 @@ DRIVER.SYSTEM.VAR.VIM_CHANNEL_40_INT_TYPE.VALUE=FIQ DRIVER.SYSTEM.VAR.VIM_CHANNEL_32_INT_TYPE.VALUE=IRQ DRIVER.SYSTEM.VAR.VIM_CHANNEL_24_INT_TYPE.VALUE=IRQ -DRIVER.SYSTEM.VAR.VIM_CHANNEL_16_INT_TYPE.VALUE=FIQ +DRIVER.SYSTEM.VAR.VIM_CHANNEL_16_INT_TYPE.VALUE=IRQ DRIVER.SYSTEM.VAR.VIM_CHANNEL_5_INT_ENABLE.VALUE=1 DRIVER.SYSTEM.VAR.PMM_LOGIC_PD5_STATE.VALUE=1 DRIVER.SYSTEM.VAR.SAFETY_INIT_CAN2_DP_PBISTCHECK_ENA.VALUE=0x00000008 @@ -9387,10 +9387,10 @@ DRIVER.ETPWM.VAR.ETPWM1_OSHT4.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM5_OSHT_WIDTH_REG.VALUE=0 DRIVER.ETPWM.VAR.ETPWM1_OSHT5.VALUE=0x0000 -DRIVER.ETPWM.VAR.ETPWM1_PWMA_PERIOD_REG.VALUE=6888 +DRIVER.ETPWM.VAR.ETPWM1_PWMA_PERIOD_REG.VALUE=10333 DRIVER.ETPWM.VAR.ETPWM1_OSHT6.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM1_CHOPPER_PERIOD.VALUE=100.000 -DRIVER.ETPWM.VAR.ETPWM1_PWMB_PERIOD.VALUE=66666.66667 +DRIVER.ETPWM.VAR.ETPWM1_PWMB_PERIOD.VALUE=100000 DRIVER.ETPWM.VAR.ETPWM2_CBC.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM4_CLKDIV.VALUE=0 DRIVER.ETPWM.VAR.ETPWM2_PWMB_ENA.VALUE=1 @@ -9545,7 +9545,7 @@ DRIVER.ETPWM.VAR.ETPWM2_CBC4.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM1_OST.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM1_CHOPPER_ACTUALPERIOD.VALUE=77.418 -DRIVER.ETPWM.VAR.ETPWM1_PWMA_ACTUALPERIOD.VALUE=66666.667 +DRIVER.ETPWM.VAR.ETPWM1_PWMA_ACTUALPERIOD.VALUE=100004.839 DRIVER.ETPWM.VAR.ETPWM7_PWMB_DUTYTIME.VALUE=0.000 DRIVER.ETPWM.VAR.ETPWM3_FDELAY_SOURCE.VALUE=0 DRIVER.ETPWM.VAR.ETPWM2_CBC5.VALUE=0x0000 @@ -9562,7 +9562,7 @@ DRIVER.ETPWM.VAR.ETPWM6_ENABLE_SOCB.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM1_PWMB_ENA.VALUE=1 DRIVER.ETPWM.VAR.ETPWM5_CHOPPER_ACTUALPERIOD.VALUE=77.418 -DRIVER.ETPWM.VAR.ETPWM3_PWMB_PERIOD.VALUE=1666666.667 +DRIVER.ETPWM.VAR.ETPWM3_PWMB_PERIOD.VALUE=1666667 DRIVER.ETPWM.VAR.ETPWM1_DEADBAND_OUTPUT.VALUE=PWMA_PWMB_NIL DRIVER.ETPWM.VAR.ETPWM4_TB_ACTUALFREQUENCY.VALUE=103.335 DRIVER.ETPWM.VAR.ETPWM2_OSHT_WIDTH_REG.VALUE=0 @@ -9701,7 +9701,7 @@ DRIVER.ETPWM.VAR.ETPWM3_PWMB_FALLING_EDGE_DELAY_REG.VALUE=1 DRIVER.ETPWM.VAR.ETPWM6_DEADBAND_OUTPUT.VALUE=PWMA_PWMB_NIL DRIVER.ETPWM.VAR.ETPWM3_INTERRUPT_PERIOD.VALUE=1 -DRIVER.ETPWM.VAR.ETPWM1_PWMA_PERIOD.VALUE=66666.66667 +DRIVER.ETPWM.VAR.ETPWM1_PWMA_PERIOD.VALUE=100000 DRIVER.ETPWM.VAR.ETPWM7_RDELAY_SOURCE.VALUE=0 DRIVER.ETPWM.VAR.ETPWM7_PWMA_DUTYTIME.VALUE=0.000 DRIVER.ETPWM.VAR.ETPWM1_TB_FREQUENCY.VALUE=110.000 @@ -9710,7 +9710,7 @@ DRIVER.ETPWM.VAR.ETPWM7_CHOPPER_PERIOD_REG.VALUE=0 DRIVER.ETPWM.VAR.ETPWM6_CLKDIV_REG.VALUE=0 DRIVER.ETPWM.VAR.ETPWM4_SOCA_PERIOD.VALUE=1 -DRIVER.ETPWM.VAR.ETPWM1_PWMB_ACTUALPERIOD.VALUE=66666.667 +DRIVER.ETPWM.VAR.ETPWM1_PWMB_ACTUALPERIOD.VALUE=100004.839 DRIVER.ETPWM.VAR.ETPWM5_CBC1.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM5_PWMB_RISING_EDGE_DELAY.VALUE=9.091 DRIVER.ETPWM.VAR.ETPWM5_CBC2.VALUE=0x0000 @@ -9847,7 +9847,7 @@ DRIVER.ETPWM.VAR.ETPWM5_PWMA_COMPARE.VALUE=52 DRIVER.ETPWM.VAR.ETPWM3_PWMA_RISING_EDGE_DELAY_REG.VALUE=1 DRIVER.ETPWM.VAR.ETPWM1_CHOPPER_PERIOD_REG.VALUE=0 -DRIVER.ETPWM.VAR.ETPWM1_PWMB_PERIOD_REG.VALUE=6888 +DRIVER.ETPWM.VAR.ETPWM1_PWMB_PERIOD_REG.VALUE=10333 DRIVER.ETPWM.VAR.ETPWM7_PWMA_FALLING_EDGE_DELAY.VALUE=9.091 DRIVER.ETPWM.VAR.ETPWM7_PWMA_RISING_EDGE_DELAY.VALUE=9.091 DRIVER.ETPWM.VAR.ETPWM6_BASE.VALUE=0xFCF79100 @@ -9870,7 +9870,7 @@ DRIVER.ETPWM.VAR.ETPWM7_PWMA_DEADBAND_OUT.VALUE=0 DRIVER.ETPWM.VAR.ETPWM7_HSPCLKDIV_REG.VALUE=0 DRIVER.ETPWM.VAR.ETPWM2_CHOPPER_DUTY_NEW.VALUE=50.0 -DRIVER.ETPWM.VAR.ETPWM3_PWMA_PERIOD.VALUE=1666666.667 +DRIVER.ETPWM.VAR.ETPWM3_PWMA_PERIOD.VALUE=1666667 DRIVER.ETPWM.VAR.ETPWM2_TB_FREQUENCY.VALUE=110.000 DRIVER.ETPWM.VAR.ETPWM6_DCAEVT1.VALUE=0x0000 DRIVER.ETPWM.VAR.ETPWM3_PWMA_POLARITY.VALUE=0 Index: firmware/source/sys_main.c =================================================================== diff -u -rf5d0c90297a0716e1fb5a5c946436cccd35050e5 -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/source/sys_main.c (.../sys_main.c) (revision f5d0c90297a0716e1fb5a5c946436cccd35050e5) +++ firmware/source/sys_main.c (.../sys_main.c) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -82,6 +82,7 @@ #include "Timers.h" #include "Valves.h" #include "WatchdogMgmt.h" +#include "Heaters.h" static void initProcessor( void ); static void initSoftware( void ); @@ -179,6 +180,8 @@ initSystemComm(); initReservoirs(); initOperationModes(); + initTemperatureSensors(); + initHeaters(); } /*************************************************************************