Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r9b262ba08e3180f121c3cf19d8d25e565183f87d -rc2b71cdf84febca251700488647c001604ba2e7b --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 9b262ba08e3180f121c3cf19d8d25e565183f87d) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision c2b71cdf84febca251700488647c001604ba2e7b) @@ -16,6 +16,8 @@ #include "gio.h" +#include "TaskGeneral.h" +#include "SystemCommMessages.h" #include "OperationModes.h" #include "ModeInitPOST.h" @@ -30,35 +32,32 @@ // ********** private data ********** -static volatile BOOL modeRequest[ NUM_OF_MODES - 1 ]; -static OP_MODE currentMode = MODE_INIT; +#define BROADCAST_HD_OP_MODE_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< HD operation mode broadcast interval (in task interval/sec). -// this matrix determines legal transitions from one mode to another +// ********** private data ********** + +static volatile BOOL modeRequest[ NUM_OF_MODES - 1 ]; ///< Pending operation mode change requests. +static OP_MODE currentMode = MODE_INIT; ///< Current operation mode. +static U32 broadcastModeIntervalCtr = 11; ///< Interval counter used to determine when to broadcase operation mode. Initialize to 11 to stagger broadcast. + +/// This matrix determines legal transitions from one mode to another static const OP_MODE MODE_TRANSITION_TABLE[ NUM_OF_MODES - 1 ][ NUM_OF_MODES - 1 ] = { -// from to-> FAULT SERVICE INIT STANBY PRESCRIP. OP.PARAMS PRE-TREAT TREATMENT POST_TREA - /* FAUL */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, - MODE_NLEG, }, - /* SERV */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, - MODE_NLEG, }, - /* INIT */{ MODE_FAUL, MODE_NLEG, MODE_INIT, MODE_STAN, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, - MODE_NLEG, }, - /* STAN */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_STAN, MODE_PRES, MODE_NLEG, MODE_NLEG, MODE_NLEG, - MODE_NLEG, }, - /* PRES */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_PRES, MODE_OPAR, MODE_NLEG, MODE_NLEG, - MODE_NLEG, }, - /* OPAR */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_PRES, MODE_OPAR, MODE_PRET, MODE_NLEG, - MODE_NLEG, }, - /* PRET */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_PRET, MODE_TREA, - MODE_NLEG, }, - /* TREA */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_TREA, - MODE_POST, }, - /* POST */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, - MODE_POST, }, }; +// from to-> FAULT SERVICE INIT STANBY PRESCRIP. OP.PARAMS PRE-TREAT TREATMENT POST_TREA +/* FAUL */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, +/* SERV */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, +/* INIT */{ MODE_FAUL, MODE_NLEG, MODE_INIT, MODE_STAN, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, +/* STAN */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_STAN, MODE_PRES, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, +/* PRES */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_PRES, MODE_OPAR, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, +/* OPAR */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_PRES, MODE_OPAR, MODE_PRET, MODE_NLEG, MODE_NLEG, }, +/* PRET */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_PRET, MODE_TREA, MODE_NLEG, }, +/* TREA */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_TREA, MODE_POST, }, +/* POST */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_POST, }, }; // ********** private function prototypes ********** static OP_MODE arbitrateModeRequest( void ); static void transitionToNewOperationMode( OP_MODE newMode ); +static void broadcastOperationMode( void ); /************************************************************************* * @brief execOperationModes @@ -171,6 +170,9 @@ SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_STATE, currentMode ) break; } // end switch + + // broadcast current operation mode on interval + broadcastOperationMode(); } /************************************************************************* @@ -296,3 +298,20 @@ } } +/************************************************************************* + * @brief + * The broadcastOperationMode function sends the current operation mode at \n + * the prescribed interval. + * @details + * Inputs : broadcastModeIntervalCtr + * Outputs : HD operation mode broadcast message sent. + * @return none + *************************************************************************/ +static void broadcastOperationMode( void ) +{ + if ( ++broadcastModeIntervalCtr >= BROADCAST_HD_OP_MODE_INTERVAL ) + { + broadcastModeIntervalCtr = 0; + broadcastHDOperationMode( currentMode ); + } +} Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rbd738c0705e8640d2c532ecece876aaa3496ee32 -rc2b71cdf84febca251700488647c001604ba2e7b --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision bd738c0705e8640d2c532ecece876aaa3496ee32) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision c2b71cdf84febca251700488647c001604ba2e7b) @@ -24,7 +24,6 @@ #include "DGInterface.h" #include "DialInFlow.h" #include "Dialysis.h" -#include "MsgQueues.h" #include "ModeTreatment.h" #include "PresOccl.h" #include "WatchdogMgmt.h" @@ -913,6 +912,35 @@ return result; } +/************************************************************************* + * @brief + * The broadcastHDOperationMode function constructs an HD operation mode \n + * broadcast message and queues the msg for transmit on the appropriate CAN channel. + * @details + * Inputs : none + * Outputs : HD operation mode msg constructed and queued + * @param mode : current HD operation mode. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastHDOperationMode( U32 mode ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_OP_MODE; + msg.hdr.payloadLen = sizeof( U32 ); + + memcpy( payloadPtr, &mode, 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; +} + // *********************************************************************** // **************** Message Handling Helper Functions ******************** // *********************************************************************** Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r968f9908941a8f8ceeacdb6aa40655abf54c1ef4 -rc2b71cdf84febca251700488647c001604ba2e7b --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 968f9908941a8f8ceeacdb6aa40655abf54c1ef4) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision c2b71cdf84febca251700488647c001604ba2e7b) @@ -114,6 +114,9 @@ // MSG_ID_POWER_OFF_WARNING BOOL broadcastPowerOffWarning( void ); +// MSG_ID_HD_OP_MODE +BOOL broadcastHDOperationMode( U32 mode ); + // *********** public test support message functions ********** #ifdef DEBUG_ENABLED