Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -ra0aca1a4d87df989303b4f7f41208a4916861afa -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision a0aca1a4d87df989303b4f7f41208a4916861afa) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) @@ -32,6 +32,8 @@ #define BP_SPEED_ADC_2_RPM_FACTOR 1.0 // conversion factor from ADC counts to RPM for blood pump motor TODO - set appropriate value #define BP_CURRENT_ADC_2_MA_FACTOR 1.0 // conversion factor from ADC counts to mA for blood pump motor TODO - set appropriate value +#define BLOOD_FLOW_DATA_PUB_INTERVAL (1000 / TASK_PRIORITY_INTERVAL) // interval (ms) at which the blood flow data is published on the CAN bus + typedef enum BloodPump_States { BLOOD_PUMP_OFF_STATE = 0, @@ -60,21 +62,23 @@ // ********** private data ********** -static BLOOD_PUMP_STATE_T bloodPumpState = BLOOD_PUMP_OFF_STATE; // current state of blood flow controller state machine -static BOOL isBloodPumpOn = FALSE; // blood pump is currently running -DATA_DECL( U32, TargetBloodFlowRate, targetBloodFlowRate, 0, 0 ); // requested blood flow rate -static U32 targetBloodFlowRateSet = 0; // currently set blood flow rate -static F32 bloodPumpPWMDutyCyclePct = 0.0; // initial blood pump PWM duty cycle -static F32 bloodPumpPWMDutyCyclePctSet = 0.0; // currently set blood pump PWM duty cycle -static MOTOR_DIR_T bloodPumpDirection = MOTOR_DIR_FORWARD; // requested blood flow direction -static MOTOR_DIR_T bloodPumpDirectionSet = MOTOR_DIR_FORWARD; // currently set blood flow direction +static BLOOD_PUMP_STATE_T bloodPumpState = BLOOD_PUMP_OFF_STATE; // current state of blood flow controller state machine +static U32 bloodFlowDataPublicationTimerCounter = 0; // used to schedule blood flow data publication to CAN bus +DATA_DECL( U32, BloodFlowDataPub, bloodFlowDataPublishInterval, BLOOD_FLOW_DATA_PUB_INTERVAL, BLOOD_FLOW_DATA_PUB_INTERVAL ); // interval (in ms) at which to publish blood flow data to CAN bus +static BOOL isBloodPumpOn = FALSE; // blood pump is currently running +static F32 bloodPumpPWMDutyCyclePct = 0.0; // initial blood pump PWM duty cycle +static F32 bloodPumpPWMDutyCyclePctSet = 0.0; // currently set blood pump PWM duty cycle +static MOTOR_DIR_T bloodPumpDirection = MOTOR_DIR_FORWARD; // requested blood flow direction +static MOTOR_DIR_T bloodPumpDirectionSet = MOTOR_DIR_FORWARD; // currently set blood flow direction -DATA_DECL( F32, MeasuredBloodFlowRate, measuredBloodFlowRate, 0.0, 0.0 ); // requested blood flow rate -DATA_DECL( F32, MeasuredBloodPumpSpeed, adcBloodPumpSpeedRPM, 0.0, 0.0 ); // requested blood flow rate -DATA_DECL( F32, MeasuredBloodPumpCurrent, adcBloodPumpCurrentmA, 0.0, 0.0 ); // requested blood flow rate +DATA_DECL( U32, TargetBloodFlowRate, targetBloodFlowRate, 0, 0 ); // requested blood flow rate +static U32 targetBloodFlowRateSet = 0; // currently set blood flow rate +DATA_DECL( F32, MeasuredBloodFlowRate, measuredBloodFlowRate, 0.0, 0.0 ); // measured blood flow rate +DATA_DECL( F32, MeasuredBloodPumpSpeed, adcBloodPumpSpeedRPM, 0.0, 0.0 ); // measured blood pump speed +DATA_DECL( F32, MeasuredBloodPumpCurrent, adcBloodPumpCurrentmA, 0.0, 0.0 ); // measured blood pump motor current -static BLOOD_FLOW_SELF_TEST_STATE_T bloodPumpSelfTestState = BLOOD_FLOW_SELF_TEST_STATE_START; -static U32 bloodPumpSelfTestTimerCount = 0; +static BLOOD_FLOW_SELF_TEST_STATE_T bloodPumpSelfTestState = BLOOD_FLOW_SELF_TEST_STATE_START; // current blood pump self test state +static U32 bloodPumpSelfTestTimerCount = 0; // timer counter for blood pump self test // ********** private function prototypes ********** @@ -181,6 +185,18 @@ adcBloodPumpSpeedRPM.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpRPM)) * BP_SPEED_ADC_2_RPM_FACTOR; adcBloodPumpCurrentmA.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpmA)) * BP_CURRENT_ADC_2_MA_FACTOR; + + // publish blood flow data on interval + if ( ++bloodFlowDataPublicationTimerCounter > getPublishBloodFlowDataInterval() ) + { + U32 flowStPt = getTargetBloodFlowRate(); + F32 measFlow = getMeasuredBloodFlowRate(); + F32 measSpd = getMeasuredBloodPumpSpeed(); + F32 measCurr = getMeasuredBloodPumpCurrent(); + + broadcastBloodFlowData( flowStPt, measFlow, measSpd, measCurr ); + bloodFlowDataPublicationTimerCounter = 0; + } } /************************************************************************* @@ -360,7 +376,6 @@ static void stopBloodPump( void ) { SET_BP_STOP(); -// CLR_BP_STOP(); } /************************************************************************* @@ -375,7 +390,6 @@ static void releaseBloodPumpStop( void ) { CLR_BP_STOP(); -// SET_BP_STOP(); } /************************************************************************* @@ -409,6 +423,18 @@ } /************************************************************************* + * @brief getPublishBloodFlowDataInterval + * The getPublishBloodFlowDataInterval function gets the blood flow data \n + * publication interval. + * @details + * Inputs : bloodFlowDataPublishInterval + * Outputs : none + * @param none + * @return the current blood flow data publication interval (in ms). + *************************************************************************/ +DATA_GET( U32, getPublishBloodFlowDataInterval, bloodFlowDataPublishInterval ) + +/************************************************************************* * @brief getTargetBloodFlowRate * The getTargetBloodFlowRate function gets the current target blood flow \n * rate. @@ -463,6 +489,55 @@ /************************************************************************* + * @brief testSetBloodFlowDataPublishIntervalOverride + * The testSetBloodFlowDataPublishIntervalOverride function overrides the \n + * blood flow data publish interval. \n + * @details + * Inputs : none + * Outputs : bloodFlowDataPublishInterval + * @param value : override blood flow data publish interval with (in ms) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetBloodFlowDataPublishIntervalOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = value / TASK_PRIORITY_INTERVAL; + + result = TRUE; + bloodFlowDataPublishInterval.ovData = intvl; + bloodFlowDataPublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/************************************************************************* + * @brief testResetBloodFlowDataPublishIntervalOverride + * The testResetBloodFlowDataPublishIntervalOverride function resets the override \n + * of the blood flow data publish interval. + * @details + * Inputs : none + * Outputs : bloodFlowDataPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetBloodFlowDataPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + bloodFlowDataPublishInterval.override = OVERRIDE_RESET; + bloodFlowDataPublishInterval.ovData = bloodFlowDataPublishInterval.ovInitData; + } + + return result; +} + +/************************************************************************* * @brief testSetTargetBloodFlowRateOverride and testResetTargetBloodFlowRateOverride * The testSetTargetBloodFlowRateOverride function overrides the target \n * blood flow rate. \n Index: firmware/App/Controllers/BloodFlow.h =================================================================== diff -u -r6c801cb0b32cba0e754cb6b1b57c1a8bd4e2bcf7 -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb --- firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 6c801cb0b32cba0e754cb6b1b57c1a8bd4e2bcf7) +++ firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) @@ -32,11 +32,14 @@ SELF_TEST_STATUS_T execBloodFlowTest( void ); +DATA_GET_PROTOTYPE( U32, getPublishBloodFlowDataInterval ); DATA_GET_PROTOTYPE( U32, getTargetBloodFlowRate ); DATA_GET_PROTOTYPE( F32, getMeasuredBloodFlowRate); DATA_GET_PROTOTYPE( F32, getMeasuredBloodPumpSpeed ); DATA_GET_PROTOTYPE( F32, getMeasuredBloodPumpCurrent ); +BOOL testSetBloodFlowDataPublishIntervalOverride( U32 value ); +BOOL testResetBloodFlowDataPublishIntervalOverride( void ); BOOL testSetTargetBloodFlowRateOverride( U32 value ); BOOL testResetTargetBloodFlowRateOverride( void ); BOOL testSetMeasuredBloodFlowRateOverride( F32 value ); Index: firmware/App/Controllers/Buttons.c =================================================================== diff -u -ra0aca1a4d87df989303b4f7f41208a4916861afa -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb --- firmware/App/Controllers/Buttons.c (.../Buttons.c) (revision a0aca1a4d87df989303b4f7f41208a4916861afa) +++ firmware/App/Controllers/Buttons.c (.../Buttons.c) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) @@ -32,6 +32,13 @@ NUM_OF_BUTTON_SELF_TEST_STATES } BUTTON_SELF_TEST_STATE_T; +typedef enum Buttons +{ + BUTTON_OFF = 0, + BUTTON_STOP, + NUM_OF_BUTTONS +} BUTTON_T; + #define OFF_REQUEST_PULSE_COUNT 4 #define OFF_REQUEST_PULSE_INTVL 50 // ms #define STOP_BUTTON_PENDING_TIMEOUT 500 // ms @@ -211,14 +218,16 @@ case BUTTON_SELF_TEST_STATE_IN_PROGRESS: if ( ( dataOffButtonState.data == BUTTON_STATE_RELEASED ) && ( dataStopButtonState.data == BUTTON_STATE_RELEASED ) ) { - result = SELF_TEST_STATUS_PASSED; buttonSelfTestState = BUTTON_SELF_TEST_STATE_COMPLETE; + result = SELF_TEST_STATUS_PASSED; } else if ( TRUE == didTimeout( buttonSelfTestTimerCount, STUCK_BUTTON_TIMEOUT ) ) { - result = SELF_TEST_STATUS_FAILED; - // TODO - trigger stuck button POST failure + U32 almData = ( dataStopButtonState.data == BUTTON_STATE_PRESSED ? BUTTON_STOP : BUTTON_OFF ); + + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_STUCK_BUTTON_TEST_FAILED, almData ) buttonSelfTestState = BUTTON_SELF_TEST_STATE_COMPLETE; + result = SELF_TEST_STATUS_FAILED; } // else just stay in progress and wait for next call break; Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -ra0aca1a4d87df989303b4f7f41208a4916861afa -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision a0aca1a4d87df989303b4f7f41208a4916861afa) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) @@ -200,14 +200,19 @@ { POST_STATE_T result = postState; - if ( ( testStatus == SELF_TEST_STATUS_PASSED ) || ( testStatus == SELF_TEST_STATUS_FAILED ) ) + if ( testStatus == SELF_TEST_STATUS_PASSED ) { result = (POST_STATE_T)((int)postState + 1); // move on to next POST test - if ( testStatus == SELF_TEST_STATUS_FAILED ) - { - tempPOSTPassed = FALSE; - } } + else if ( testStatus == SELF_TEST_STATUS_FAILED ) + { + tempPOSTPassed = FALSE; + result = POST_STATE_FAILED; + } + else + { + // test still in progress - do nothing + } return result; } Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -ra0aca1a4d87df989303b4f7f41208a4916861afa -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision a0aca1a4d87df989303b4f7f41208a4916861afa) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) @@ -64,6 +64,8 @@ { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE } // ALARM_ID_SOFTWARE_FAULT }; +const ALARM_DATA_T blankAlarmData = { ALARM_DATA_TYPE_U32, 0 }; + // ********** private data ********** DATA_ARRAY_DECL( BOOL, AlarmStates, NUM_OF_ALARM_IDS, alarmIsActive ); @@ -172,11 +174,11 @@ { alarmIsActive[alarm].data = TRUE; alarmStartedAt[alarm].data = getMSTimerCount(); - // TODO - send alarm broadcast msg + //broadcastAlarmTriggered( alarm, blankAlarmData, blankAlarmData ); } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE, alarm ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE_NO_DATA, alarm ) } } @@ -199,11 +201,11 @@ { alarmIsActive[alarm].data = TRUE; alarmStartedAt[alarm].data = getMSTimerCount(); - // TODO - send alarm broadcast msg w/ alarm data + //broadcastAlarmTriggered( alarm, alarmData, blankAlarmData ); } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE1, alarm ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE_1_DATA, alarm ) } } @@ -227,11 +229,11 @@ { alarmIsActive[alarm].data = TRUE; alarmStartedAt[alarm].data = getMSTimerCount(); - // TODO - send alarm broadcast msg w/ alarm data + //broadcastAlarmTriggered( alarm, alarmData1, alarmData2 ); } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE2, alarm ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE_2_DATA, alarm ) } } @@ -260,7 +262,7 @@ { resetAlarmPriorityFIFO( alarmTable[alarm].alarmPriority ); } - // TODO - send alarm broadcast msg w/ alarm data + broadcastAlarmCleared( alarm ); } } else @@ -479,19 +481,63 @@ DATA_ARRAY_OVERRIDE_FUNC( BOOL, testSetAlarmStateOverride, testResetAlarmStateOverride, alarmIsActive, alarmID, NUM_OF_ALARM_IDS-1 ) /************************************************************************* - * @brief testSetAlarmStartOverride and testResetAlarmStartOverride + * @brief testSetAlarmStartOverride * The testSetAlarmStartOverride function overrides the start time \n * for a given alarm with the alarm management with a given start time. \n - * The testResetAlarmStartOverride function resets the override of the \n - * start time for a given alarm with the alarm management. * @details * Inputs : none * Outputs : alarmStartedAt[] * @param alarmID : ID of alarm to override start time for - * @param value : override start time for the given alarm ID + * @param value : override time since start (in ms) for the given alarm ID * @return TRUE if override successful, FALSE if not *************************************************************************/ -DATA_ARRAY_OVERRIDE_FUNC( U32, testSetAlarmStartOverride, testResetAlarmStartOverride, alarmStartedAt, alarmID, NUM_OF_ALARM_IDS-1 ) +BOOL testSetAlarmStartOverride( U32 alarmID, U32 value ) +{ + BOOL result = FALSE; + if ( alarmID < NUM_OF_ALARM_IDS ) + { + if ( TRUE == isTestingActivated() ) + { + U32 tim = getMSTimerCount(); + if ( tim > value ) + { + result = TRUE; + alarmStartedAt[alarmID].ovData = (tim - value); + alarmStartedAt[alarmID].override = OVERRIDE_KEY; + } + } + } + return result; +} + +/************************************************************************* + * @brief testResetAlarmStartOverride + * The testResetAlarmStartOverride function resets the override of the \n + * start time for a given alarm with the alarm management. + * @details + * Inputs : none + * Outputs : alarmStartedAt[] + * @param alarmID : ID of alarm to reset override of start time for + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetAlarmStartOverride( U32 alarmID ) +{ + BOOL result = FALSE; + + if ( alarmID < NUM_OF_ALARM_IDS ) + { + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + alarmStartedAt[alarmID].override = OVERRIDE_RESET; + alarmStartedAt[alarmID].ovData = alarmStartedAt[alarmID].ovInitData; + } + } + + return result; +} + + Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -ra0aca1a4d87df989303b4f7f41208a4916861afa -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision a0aca1a4d87df989303b4f7f41208a4916861afa) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) @@ -23,6 +23,9 @@ { ALARM_ID_NO_ALARM = 0, ALARM_ID_SOFTWARE_FAULT, + ALARM_ID_STUCK_BUTTON_TEST_FAILED, + ALARM_ID_FPGA_POST_TEST_FAILED, + ALARM_ID_WATCHDOG_POST_TEST_FAILED, NUM_OF_ALARM_IDS } ALARM_ID_T; @@ -98,9 +101,9 @@ SW_FAULT_ID_OP_MODES_INVALID_MODE_STATE, SW_FAULT_ID_OP_MODES_INVALID_MODE_REQUESTED, SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_TRANSITION_TO, - SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE, - SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE1, - SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE2, + SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE_NO_DATA, + SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE_1_DATA, + SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE_2_DATA, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_CLEAR, SW_FAULT_ID_ALARM_MGMT_LAMP_INVALID_ALARM_STATE, SW_FAULT_ID_COMM_BUFFERS_ADD_TOO_MUCH_DATA, Index: firmware/App/Services/CommBuffers.c =================================================================== diff -u -ra0aca1a4d87df989303b4f7f41208a4916861afa -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb --- firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision a0aca1a4d87df989303b4f7f41208a4916861afa) +++ firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) @@ -178,7 +178,7 @@ result += remNumOfBytes; } } - else // invalid peek size given + else // invalid get size given { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_GET_TOO_MUCH_DATA, len ) } Index: firmware/App/Services/FPGA.c =================================================================== diff -u -ra0aca1a4d87df989303b4f7f41208a4916861afa -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision a0aca1a4d87df989303b4f7f41208a4916861afa) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) @@ -632,13 +632,18 @@ *************************************************************************/ SELF_TEST_STATUS_T execFPGATest( void ) { - SELF_TEST_STATUS_T result = SELF_TEST_STATUS_FAILED; + SELF_TEST_STATUS_T result; // check FPGA reported correct ID if ( FPGA_EXPECTED_ID == fpgaHeader.fpgaId ) { result = SELF_TEST_STATUS_PASSED; } + else + { + result = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_FPGA_POST_TEST_FAILED, (U32)fpgaHeader.fpgaId ) + } return result; } Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r6fc5e3596bfb7f27e93e4bfbe4909b9f58c17b48 -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 6fc5e3596bfb7f27e93e4bfbe4909b9f58c17b48) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) @@ -412,14 +412,20 @@ *************************************************************************/ static void transmitNextUARTPacket( void ) { - U32 dataSize = getFromCommBuffer( COMM_BUFFER_OUT_UART_PC, pcXmitPacket, PC_MESSAGE_PACKET_SIZE ); + U32 dataPend = numberOfBytesInCommBuffer( COMM_BUFFER_OUT_UART_PC ); + U32 dataSize; - // if there's another UART packet to send, send it - if ( dataSize == PC_MESSAGE_PACKET_SIZE ) + if ( dataPend >= PC_MESSAGE_PACKET_SIZE ) { - dmaSetCtrlPacket( DMA_CH3, pcDMAXmitControlRecord ); - dmaSetChEnable( DMA_CH3, DMA_HW ); - setSCI1DMATransmitInterrupt(); + dataSize = getFromCommBuffer( COMM_BUFFER_OUT_UART_PC, pcXmitPacket, PC_MESSAGE_PACKET_SIZE ); + + // if there's another UART packet to send, send it + if ( dataSize == PC_MESSAGE_PACKET_SIZE ) + { + dmaSetCtrlPacket( DMA_CH3, pcDMAXmitControlRecord ); + dmaSetChEnable( DMA_CH3, DMA_HW ); + setSCI1DMATransmitInterrupt(); + } } } Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r6fc5e3596bfb7f27e93e4bfbe4909b9f58c17b48 -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 6fc5e3596bfb7f27e93e4bfbe4909b9f58c17b48) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) @@ -145,8 +145,125 @@ userConfirmOffButton( cargo.confirmed ); } +/************************************************************************* + * @brief broadcastAlarmTriggered + * The broadcastAlarmTriggered function constructs an alarm triggered msg to \n + * be broadcast and queues the msg for transmit on the appropriate CAN channel. + * @details + * Inputs : none + * Outputs : alarm triggered msg constructed and queued. + * @param alarm : ID of alarm triggered + * @param almData1 : 1st data associated with alarm + * @param almData2 : 2nd data associated with alarm + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastAlarmTriggered( ALARM_ID_T alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ) +{ + BOOL result; + MESSAGE_T msg; + U32 msgSize; + U08 data[sizeof(MESSAGE_WRAPPER_T)+1+CAN_MESSAGE_CARGO_SIZE]; // must hold full (wrapped) message + sync + any CAN padding + U08 *cargoPtr = msg.cargo; + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_ALARM_TRIGGERED; + msg.hdr.cargoLen = sizeof(ALARM_ID_T) + sizeof(ALARM_DATA_T) + sizeof(ALARM_DATA_T); + + memcpy( cargoPtr, &alarm, sizeof(ALARM_ID_T) ); + cargoPtr += sizeof(ALARM_ID_T); + memcpy( cargoPtr, &almData1, sizeof(ALARM_DATA_T) ); + cargoPtr += sizeof(ALARM_DATA_T); + memcpy( cargoPtr, &almData2, sizeof(ALARM_DATA_T) ); + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) + msgSize = serializeMessage( msg, data ); + + // add serialized message data to appropriate comm buffer + result = addToCommBuffer( COMM_BUFFER_OUT_CAN_HD_ALARM, data, msgSize ); + + return result; +} /************************************************************************* + * @brief broadcastAlarmCleared + * The broadcastAlarmCleared function constructs an alarm cleared msg to be \n + * broadcast and queues the msg for transmit on the appropriate CAN channel. + * @details + * Inputs : none + * Outputs : alarm cleared msg constructed and queued. + * @param alarm : ID of alarm cleared + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastAlarmCleared( ALARM_ID_T alarm ) +{ + BOOL result; + MESSAGE_T msg; + U32 msgSize; + U08 data[sizeof(MESSAGE_WRAPPER_T)+1+CAN_MESSAGE_CARGO_SIZE]; // must hold full (wrapped) message + sync + any CAN padding + U08 *cargoPtr = msg.cargo; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_ALARM_CLEARED; + msg.hdr.cargoLen = sizeof(ALARM_ID_T); + + memcpy( cargoPtr, &alarm, sizeof(ALARM_ID_T) ); + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) + msgSize = serializeMessage( msg, data ); + + // add serialized message data to appropriate comm buffer + result = addToCommBuffer( COMM_BUFFER_OUT_CAN_HD_ALARM, data, msgSize ); + + return result; +} + +/************************************************************************* + * @brief broadcastBloodFlowData + * The broadcastBloodFlowData function constructs a blood flow data msg to \n + * be broadcast and queues the msg for transmit on the appropriate CAN channel. + * @details + * Inputs : none + * Outputs : blood flow data msg constructed and queued. + * @param flowStPt : Current set point for blood flow + * @param measFlow : Latest measured blood flow + * @param measSpd : Latest measured blood pump speed + * @param measSpd : Latest measured blood pump motor current + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastBloodFlowData( U32 flowStPt, F32 measFlow, F32 measSpd, F32 measCurr ) +{ + BOOL result; + MESSAGE_T msg; + U32 msgSize; + U08 data[sizeof(MESSAGE_WRAPPER_T)+1+CAN_MESSAGE_CARGO_SIZE]; // must hold full (wrapped) message + sync + any CAN padding + U08 *cargoPtr = msg.cargo; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_BLOOD_FLOW_DATA; + msg.hdr.cargoLen = sizeof(U32) + sizeof(F32) + sizeof(F32) + sizeof(F32); + + memcpy( cargoPtr, &flowStPt, sizeof(U32) ); + cargoPtr += sizeof(U32); + memcpy( cargoPtr, &measFlow, sizeof(F32) ); + cargoPtr += sizeof(F32); + memcpy( cargoPtr, &measSpd, sizeof(F32) ); + cargoPtr += sizeof(F32); + memcpy( cargoPtr, &measCurr, sizeof(F32) ); + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) + msgSize = serializeMessage( msg, data ); + + // add serialized message data to appropriate comm buffer + result = addToCommBuffer( COMM_BUFFER_OUT_CAN_HD_BROADCAST, data, msgSize ); + + return result; + +} + + +/************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r6fc5e3596bfb7f27e93e4bfbe4909b9f58c17b48 -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 6fc5e3596bfb7f27e93e4bfbe4909b9f58c17b48) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) @@ -23,10 +23,17 @@ // ********** public definitions ********** typedef enum Msg_IDs -{ +{ // normal CAN messages MSG_ID_UNUSED = 0, - MSG_ID_OFF_BUTTON_PRESS, - MSG_ID_FIRST_TESTER_MESSAGE = 0x8000, + MSG_ID_OFF_BUTTON_PRESS, // 1 + MSG_ID_ALARM_STATUS, // 2 + MSG_ID_ALARM_TRIGGERED, // 3 + MSG_ID_ALARM_CLEARED, // 4 + MSG_ID_BLOOD_FLOW_DATA, // 5 + + // service/test CAN messages + + MSG_ID_FIRST_TESTER_MESSAGE = 0x8000, // 0x8000 MSG_ID_TESTER_LOGIN_REQUEST = MSG_ID_FIRST_TESTER_MESSAGE, MSG_ID_HD_MESSAGE, // 0x8001 MSG_ID_OFF_BUTTON_STATE_OVERRIDE, // 0x8002 @@ -48,6 +55,14 @@ BOOL sendOffButtonMsgToUI( void ); void handleOffButtonConfirmMsgFromUI( MESSAGE_T *message ); +// MSG_ID_ALARM_TRIGGERED +BOOL broadcastAlarmTriggered( ALARM_ID_T alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ); +// MSG_ID_ALARM_CLEARED +BOOL broadcastAlarmCleared( ALARM_ID_T alarm ); + +// MSG_ID_BLOOD_FLOW_DATA +BOOL broadcastBloodFlowData( U32 flowStPt, F32 measFlow, F32 measSpd, F32 measCurr ); + // *********** public test support message functions ********** // DEBUG OUTPUT Index: firmware/App/Services/WatchdogMgmt.c =================================================================== diff -u -ra0aca1a4d87df989303b4f7f41208a4916861afa -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb --- firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision a0aca1a4d87df989303b4f7f41208a4916861afa) +++ firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) @@ -160,8 +160,8 @@ } else { + activateAlarm( ALARM_ID_WATCHDOG_POST_TEST_FAILED ); result = SELF_TEST_STATUS_FAILED; - // TODO - trigger watchdog POST failure } watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_COMPLETE; break; Index: firmware/App/TestSupport.h =================================================================== diff -u -r51c6a24b30643c8ce296ebfe1d703f289ffafe97 -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb --- firmware/App/TestSupport.h (.../TestSupport.h) (revision 51c6a24b30643c8ce296ebfe1d703f289ffafe97) +++ firmware/App/TestSupport.h (.../TestSupport.h) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) @@ -174,10 +174,6 @@ d_name[i_name].override = OVERRIDE_KEY; \ } \ } \ - else \ - { \ - activateAlarm( ALARM_ID_SOFTWARE_FAULT ); \ - } \ return result; \ } \ BOOL r_name( U32 i_name ) \ @@ -192,10 +188,6 @@ d_name[i_name].ovData = d_name[i_name].ovInitData; \ } \ } \ - else \ - { \ - activateAlarm( ALARM_ID_SOFTWARE_FAULT ); \ - } \ return result; \ }