Index: firmware/App/Common.h =================================================================== diff -u -r87959deebd36964dbbee93be4663d70df01ea7d9 -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Common.h (.../Common.h) (revision 87959deebd36964dbbee93be4663d70df01ea7d9) +++ firmware/App/Common.h (.../Common.h) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -24,6 +24,12 @@ #ifndef _VECTORCAST_ // #define RM46_EVAL_BOARD_TARGET 1 // #define SIMULATE_UI 1 + #define DEBUG_ENABLED 1 + + #ifdef DEBUG_ENABLED + #include + #include + #endif #endif // ********** public definitions ********** @@ -92,7 +98,6 @@ #define GET_MSW_OF_LONG(l) ((U16)(((l) >> SHIFT_16_BITS_FOR_WORD_SHIFT) & MASK_OFF_MSW)) #define MAKE_WORD_OF_BYTES(h,l) ((((U16)(h) << SHIFT_8_BITS_FOR_BYTE_SHIFT) & MASK_OFF_LSB) | ((U16)(l) & MASK_OFF_MSB)) #define MAKE_LONG_OF_WORDS(h,l) ((((U32)(h) << SHIFT_16_BITS_FOR_WORD_SHIFT) & MASK_OFF_LSW) | ((U32)(l) & MASK_OFF_MSW)) -#define SIGN_FROM_12_BIT_VALUE(v) ((S16)(v) - 2048) #define SET_ALARM_WITH_1_U32_DATA(a,d1) { \ ALARM_DATA_T dat1; \ Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -14,10 +14,13 @@ * **************************************************************************/ +#include + #include "can.h" #include "etpwm.h" #include "Common.h" +#include "FPGA.h" #include "InternalADC.h" #include "SystemCommMessages.h" #include "TaskPriority.h" @@ -26,14 +29,27 @@ // ********** private definitions ********** -#define MAX_BLOOD_FLOW_RATE 600 // mL/min -#define MAX_BLOOD_PUMP_PWM_STEP_CHANGE 0.005 // duty cycle TODO - fixed or parameterized or set in motor controller? +#define BLOOD_FLOW_DATA_PUB_INTERVAL (1000 / TASK_PRIORITY_INTERVAL) // interval (ms) at which the blood flow data is published on the CAN bus -#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 MAX_BLOOD_FLOW_RATE 600 // mL/min -#define BLOOD_FLOW_DATA_PUB_INTERVAL (1000 / TASK_PRIORITY_INTERVAL) // interval (ms) at which the blood flow data is published on the CAN bus +#define MAX_BLOOD_PUMP_PWM_STEP_CHANGE 0.005 // duty cycle TODO - fixed or parameterized or set in motor controller? +#define MAX_BLOOD_PUMP_PWM_DUTY_CYCLE 0.88 // controller will error if PWM duty cycle > 90%, so set max to 88% +#define MIN_BLOOD_PUMP_PWM_DUTY_CYCLE 0.12 // controller will error if PWM duty cycle < 10%, so set min to 12% +#define BP_SPEED_ADC_TO_RPM_FACTOR 1.375 // conversion factor from ADC counts to RPM for blood pump motor TODO - set appropriate value +#define BP_CURRENT_ADC_TO_MA_FACTOR 2.65 // conversion factor from ADC counts to mA for blood pump motor TODO - set appropriate value + +#define BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR (80.0 / 1000.0) // 80 pump revolutions = 1 liter or 1,000 mL +#define BP_GEAR_RATIO 32.0 // blood pump motor to blood pump gear ratio +#define BP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.0003125 // ~32 BP motor RPM = 1% PWM duty cycle +#define BP_PWM_ZERO_OFFSET 0.1 // 10% PWM duty cycle = zero speed +#define BP_PWM_FROM_ML_PER_MIN(rate) ((rate) * BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * BP_GEAR_RATIO * BP_MOTOR_RPM_TO_PWM_DC_FACTOR + BP_PWM_ZERO_OFFSET) + +#define BLOODPUMP_ADC_FULL_SCALE_V 3.0 // BP analog signals are 0-3V (while int. ADC ref V is 3.3V) +#define BLOODPUMP_ADC_MID_PT_BITS ((F32)(INT_ADC_FULL_SCALE_BITS >> 1) * (BLOODPUMP_ADC_FULL_SCALE_V / INT_ADC_REF_V)) +#define SIGN_FROM_12_BIT_VALUE(v) ((S16)(v) - (S16)BLOODPUMP_ADC_MID_PT_BITS) + typedef enum BloodPump_States { BLOOD_PUMP_OFF_STATE = 0, @@ -52,13 +68,13 @@ } BLOOD_FLOW_SELF_TEST_STATE_T; // CAN3 port pin assignments for pump stop and direction outputs -#define STOP_CAN3_PORT_MASK 0x00000002 // (Tx - re-purposed as output GPIO for blood pump stop signal) -#define DIR_CAN3_PORT_MASK 0x00000002 // (Rx - re-purposed as output GPIO for blood pump direction signal) +#define STOP_CAN3_PORT_MASK 0x00000002 // (Tx - re-purposed as output GPIO for blood pump stop signal) +#define DIR_CAN3_PORT_MASK 0x00000002 // (Rx - re-purposed as output GPIO for blood pump direction signal) // blood pump stop and direction macros -#define SET_BP_DIR() {canREG3->RIOC |= DIR_CAN3_PORT_MASK;} -#define SET_BP_STOP() {canREG3->TIOC |= STOP_CAN3_PORT_MASK;} -#define CLR_BP_DIR() {canREG3->RIOC &= ~DIR_CAN3_PORT_MASK;} -#define CLR_BP_STOP() {canREG3->TIOC &= ~STOP_CAN3_PORT_MASK;} +#define SET_BP_DIR() {canREG3->RIOC |= DIR_CAN3_PORT_MASK;} +#define SET_BP_STOP() {canREG3->TIOC |= STOP_CAN3_PORT_MASK;} +#define CLR_BP_DIR() {canREG3->RIOC &= ~DIR_CAN3_PORT_MASK;} +#define CLR_BP_STOP() {canREG3->TIOC &= ~STOP_CAN3_PORT_MASK;} // ********** private data ********** @@ -71,8 +87,8 @@ 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( U32, TargetBloodFlowRate, targetBloodFlowRate, 0, 0 ); // requested blood flow rate -static U32 targetBloodFlowRateSet = 0; // currently set blood flow rate +DATA_DECL( S32, TargetBloodFlowRate, targetBloodFlowRate, 0, 0 ); // requested blood flow rate +static S32 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 @@ -126,10 +142,12 @@ // verify flow rate if ( flowRate <= MAX_BLOOD_FLOW_RATE ) { - targetBloodFlowRate.data = flowRate; + targetBloodFlowRate.data = ( dir == MOTOR_DIR_FORWARD ? (S32)flowRate : (S32)flowRate * -1 ); bloodPumpDirection = dir; - // TODO - this is temporary conversion to initial duty cycle - bloodPumpPWMDutyCyclePct = ( (F32)flowRate / 800.0 ); + // set PWM duty cycle target to an estimated initial target to ramp to based on target flow rate - then we'll control to flow when ramp completed + bloodPumpPWMDutyCyclePct = BP_PWM_FROM_ML_PER_MIN((F32)flowRate); // ~ 8% per 100 mL/min with a 10% zero offset added in (e.g. 100 mL/min = 8+10 = 18%) + bloodPumpPWMDutyCyclePct = MIN(bloodPumpPWMDutyCyclePct,MAX_BLOOD_PUMP_PWM_DUTY_CYCLE); // limit pwm duty cycle to controller maximum + switch ( bloodPumpState ) { case BLOOD_PUMP_RAMPING_UP_STATE: // see if we need to reverse direction of ramp @@ -145,7 +163,7 @@ } break; case BLOOD_PUMP_CONTROL_TO_TARGET_STATE: // start ramp in appropriate direction - if ( targetBloodFlowRateSet > getTargetBloodFlowRate() ) + if ( bloodPumpPWMDutyCyclePctSet > bloodPumpPWMDutyCyclePct ) { bloodPumpState = BLOOD_PUMP_RAMPING_DOWN_STATE; } @@ -183,17 +201,24 @@ U16 bpRPM = getIntADCReading( INT_ADC_BLOOD_PUMP_SPEED ); U16 bpmA = getIntADCReading( INT_ADC_BLOOD_PUMP_MOTOR_CURRENT ); - 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; + measuredBloodFlowRate.data = getFPGABloodFlow(); + adcBloodPumpSpeedRPM.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpRPM)) * BP_SPEED_ADC_TO_RPM_FACTOR; + adcBloodPumpCurrentmA.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpmA)) * BP_CURRENT_ADC_TO_MA_FACTOR; // publish blood flow data on interval if ( ++bloodFlowDataPublicationTimerCounter > getPublishBloodFlowDataInterval() ) { - U32 flowStPt = getTargetBloodFlowRate(); + S32 flowStPt = (S32)getTargetBloodFlowRate(); F32 measFlow = getMeasuredBloodFlowRate(); F32 measSpd = getMeasuredBloodPumpSpeed(); F32 measCurr = getMeasuredBloodPumpCurrent(); +#ifdef DEBUG_ENABLED + F32 tmp = getFPGADialysateFlow(); + char debugFlowStr[256]; + sprintf( debugFlowStr, "Target Flow:%5d, Meas. Flow:%5d, Speed:%5d RPM, Current:%5d mA \n", flowStPt, (S32)measFlow, (S32)measSpd, (S32)measCurr ); + sendDebugData( (U08*)debugFlowStr, strlen(debugFlowStr) ); +#endif broadcastBloodFlowData( flowStPt, measFlow, measSpd, measCurr ); bloodFlowDataPublicationTimerCounter = 0; } @@ -249,7 +274,7 @@ BLOOD_PUMP_STATE_T result = BLOOD_PUMP_OFF_STATE; // if we've been given a flow rate, setup ramp up and transition to ramp up state - if ( getTargetBloodFlowRate() > 0 ) + if ( getTargetBloodFlowRate() != 0 ) { // set initial PWM duty cycle bloodPumpPWMDutyCyclePctSet = MAX_BLOOD_PUMP_PWM_STEP_CHANGE; @@ -319,13 +344,8 @@ BLOOD_PUMP_STATE_T result = BLOOD_PUMP_RAMPING_DOWN_STATE; // have we essentially reached zero speed - if ( bloodPumpPWMDutyCyclePctSet < MAX_BLOOD_PUMP_PWM_STEP_CHANGE ) + if ( bloodPumpPWMDutyCyclePctSet < (MAX_BLOOD_PUMP_PWM_STEP_CHANGE + BP_PWM_ZERO_OFFSET) ) { - isBloodPumpOn = FALSE; - targetBloodFlowRateSet = 0; - bloodPumpPWMDutyCyclePctSet = 0.0; - etpwmSetCmpA( etpwmREG1, 0 ); - etpwmStopTBCLK(); stopBloodPump(); result = BLOOD_PUMP_OFF_STATE; } @@ -360,6 +380,8 @@ BLOOD_PUMP_STATE_T result = BLOOD_PUMP_CONTROL_TO_TARGET_STATE; // TODO - control +//MAX_BLOOD_PUMP_PWM_DUTY_CYCLE +//MIN_BLOOD_PUMP_PWM_DUTY_CYCLE return result; } @@ -369,12 +391,17 @@ * The stopBloodPump function sets the blood pump stop signal. * @details * Inputs : none - * Outputs : blood pump stop signal + * Outputs : blood pump stop signal activated, PWM duty cycle zeroed * @param none * @return none *************************************************************************/ static void stopBloodPump( void ) { + isBloodPumpOn = FALSE; + targetBloodFlowRateSet = 0; + bloodPumpPWMDutyCyclePctSet = 0.0; + etpwmSetCmpA( etpwmREG1, 0 ); + etpwmStopTBCLK(); SET_BP_STOP(); } @@ -444,7 +471,7 @@ * @param none * @return the current target blood flow rate (in mL/min). *************************************************************************/ -DATA_GET( U32, getTargetBloodFlowRate, targetBloodFlowRate ) +DATA_GET( S32, getTargetBloodFlowRate, targetBloodFlowRate ) /************************************************************************* * @brief getMeasuredBloodFlowRate @@ -549,7 +576,7 @@ * @param value : override target blood flow rate (in mL/min) * @return TRUE if override successful, FALSE if not *************************************************************************/ -DATA_OVERRIDE_FUNC( U32, testSetTargetBloodFlowRateOverride, testResetTargetBloodFlowRateOverride, targetBloodFlowRate ) +DATA_OVERRIDE_FUNC( S32, testSetTargetBloodFlowRateOverride, testResetTargetBloodFlowRateOverride, targetBloodFlowRate ) /************************************************************************* * @brief testSetMeasuredBloodFlowRateOverride and testResetMeasuredBloodFlowRateOverride Index: firmware/App/Controllers/BloodFlow.h =================================================================== diff -u -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) +++ firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -33,14 +33,14 @@ SELF_TEST_STATUS_T execBloodFlowTest( void ); DATA_GET_PROTOTYPE( U32, getPublishBloodFlowDataInterval ); -DATA_GET_PROTOTYPE( U32, getTargetBloodFlowRate ); +DATA_GET_PROTOTYPE( S32, 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 testSetTargetBloodFlowRateOverride( S32 value ); BOOL testResetTargetBloodFlowRateOverride( void ); BOOL testSetMeasuredBloodFlowRateOverride( F32 value ); BOOL testResetMeasuredBloodFlowRateOverride( void ); Index: firmware/App/Drivers/CPLD.c =================================================================== diff -u -r777faf1846c8cec0769db41d4a4241ed3819f1d0 -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Drivers/CPLD.c (.../CPLD.c) (revision 777faf1846c8cec0769db41d4a4241ed3819f1d0) +++ firmware/App/Drivers/CPLD.c (.../CPLD.c) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -22,11 +22,11 @@ #include "WatchdogMgmt.h" #include "CPLD.h" -#ifdef _VECTORCAST_ - static mibspiBASE_t spi5; - #undef mibspiREG5 - #define mibspiREG5 ((mibspiBASE_t *)&spi5) -#endif +//#ifdef _VECTORCAST_ +// static mibspiBASE_t spi5; +// #undef mibspiREG5 +// #define mibspiREG5 ((mibspiBASE_t *)&spi5) +//#endif // ********** private definitions ********** Index: firmware/App/Drivers/Comm.c =================================================================== diff -u -r777faf1846c8cec0769db41d4a4241ed3819f1d0 -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Drivers/Comm.c (.../Comm.c) (revision 777faf1846c8cec0769db41d4a4241ed3819f1d0) +++ firmware/App/Drivers/Comm.c (.../Comm.c) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -20,21 +20,6 @@ #include "Comm.h" -#ifdef _VECTORCAST_ - static sciBASE_t sci1; - static sciBASE_t sci2; - static dmaBASE_t dma1; - static canBASE_t can1; - #undef sciREG - #define sciREG ((sciBASE_t *)&sci1) - #undef scilinREG - #define scilinREG ((sciBASE_t *)&sci2) - #undef dmaREG - #define dmaREG ((dmaBASE_t *)&dma1) - #undef canREG1 - #define canREG1 ((canBASE_t *)&can1) -#endif - // ********** private definitions ********** #define DMA_CH_STATUS_BIT(ch) ((U32)1U << (ch)) Index: firmware/App/Drivers/InternalADC.h =================================================================== diff -u -rcb5c7321fae3036d7a3641ae49097b4b361270f5 -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Drivers/InternalADC.h (.../InternalADC.h) (revision cb5c7321fae3036d7a3641ae49097b4b361270f5) +++ firmware/App/Drivers/InternalADC.h (.../InternalADC.h) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -21,6 +21,10 @@ // ********** public definitions ********** +#define INT_ADC_BITS_PER_CHANNEL 12 +#define INT_ADC_FULL_SCALE_BITS 4096 +#define INT_ADC_REF_V 3.3 + typedef enum Int_ADC_Channels { INT_ADC_NOT_USED = 0, Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r8592c629e9e6e212c1325239a21ceb641f9dc1fe -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 8592c629e9e6e212c1325239a21ceb641f9dc1fe) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -18,6 +18,7 @@ #include "Common.h" #include "AlarmLamp.h" +#include "OperationModes.h" #include "SystemCommMessages.h" #include "Timers.h" @@ -77,6 +78,8 @@ // ********** private function prototypes ********** +static void activateAlarm( ALARM_ID_T alarm ); + static void updateAlarmsState( void ); static void setAlarmLampAndAudio( void ); static void updateAlarmsSilenceStatus( void ); @@ -159,97 +162,98 @@ /************************************************************************* * @brief activateAlarm - * The activateAlarm function activates a given alarm. Also, an alarm \n - * message is broadcast to the rest of the system. + * The activateAlarm function activates a given alarm. * @details * Inputs : none - * Outputs : AlarmStatusTable[] + * Outputs : alarmIsActive[], alarmStartedAt[] * @param alarm : ID of alarm to activate * @return none *************************************************************************/ -void activateAlarm( ALARM_ID_T alarm ) +static void activateAlarm( ALARM_ID_T alarm ) { // verify given alarm if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) { - // broadcast alarm if not already active - if ( TRUE == alarmIsActive[alarm].data ) + // if alarm is a fault and not already triggered, request transition to fault mode + if ( ( FALSE == getAlarmActive(alarm) ) && ( TRUE == alarmTable[alarm].alarmIsFault ) ) { - broadcastAlarmTriggered( alarm, blankAlarmData, blankAlarmData ); +// requestNewOperationMode( MODE_FAUL ); } // activate alarm alarmIsActive[alarm].data = TRUE; alarmStartedAt[alarm].data = getMSTimerCount(); } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE_NO_DATA, alarm ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE, alarm ) } } /************************************************************************* + * @brief activateAlarmNoData + * The activateAlarmNoData function activates a given alarm. Also, an alarm \n + * message is broadcast to the rest of the system. This function will \n + * include given data in the broadcast message for logging. + * @details + * Inputs : none + * Outputs : alarm triggered message sent, alarm activated + * @param alarm : ID of alarm to activate + * @param alarmData : supporting data to include in alarm msg + * @return none + *************************************************************************/ +void activateAlarmNoData( ALARM_ID_T alarm ) +{ + // broadcast alarm and data if alarm not already active + if ( FALSE == alarmIsActive[alarm].data ) + { + broadcastAlarmTriggered( alarm, blankAlarmData, blankAlarmData ); + } + activateAlarm( alarm ); +} + +/************************************************************************* * @brief activateAlarm1Data - * The activateAlarm function activates a given alarm. Also, an alarm \n + * The activateAlarm1Data function activates a given alarm. Also, an alarm \n * message is broadcast to the rest of the system. This function will \n * include given data in the broadcast message for logging. * @details * Inputs : none - * Outputs : AlarmStatusTable[] + * Outputs : alarm triggered message sent, alarm activated * @param alarm : ID of alarm to activate * @param alarmData : supporting data to include in alarm msg * @return none *************************************************************************/ void activateAlarm1Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData ) { - // verify given alarm - if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) + // broadcast alarm and data if alarm not already active + if ( FALSE == alarmIsActive[alarm].data ) { - // broadcast alarm if not already active - if ( TRUE == alarmIsActive[alarm].data ) - { - broadcastAlarmTriggered( alarm, alarmData, blankAlarmData ); - } - // activate alarm - alarmIsActive[alarm].data = TRUE; - alarmStartedAt[alarm].data = getMSTimerCount(); + broadcastAlarmTriggered( alarm, alarmData, blankAlarmData ); } - else - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE_1_DATA, alarm ) - } + activateAlarm( alarm ); } /************************************************************************* * @brief activateAlarm1Data - * The activateAlarm function activates a given alarm. Also, an alarm \n + * The activateAlarm2Data function activates a given alarm. Also, an alarm \n * message is broadcast to the rest of the system. This function will \n * include two given data in the broadcast message for logging. * @details * Inputs : none - * Outputs : AlarmStatusTable[] + * Outputs : alarm triggered message sent, alarm activated * @param alarm : ID of alarm to activate * @param alarmData1 : supporting data to include in alarm msg * @param alarmData2 : supporting data to include in alarm msg * @return none *************************************************************************/ void activateAlarm2Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData1, ALARM_DATA_T alarmData2 ) { - // verify given alarm - if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) + // broadcast alarm and data if alarm not already active + if ( FALSE == alarmIsActive[alarm].data ) { - // broadcast alarm if not already active - if ( TRUE == alarmIsActive[alarm].data ) - { - broadcastAlarmTriggered( alarm, alarmData1, alarmData2 ); - } - // activate alarm - alarmIsActive[alarm].data = TRUE; - alarmStartedAt[alarm].data = getMSTimerCount(); + broadcastAlarmTriggered( alarm, alarmData1, alarmData2 ); } - else - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE_2_DATA, alarm ) - } + activateAlarm( alarm ); } /************************************************************************* @@ -270,14 +274,18 @@ // verify alarm can be cleared if ( FALSE == alarmTable[alarm].alarmNoClear ) { + // broadcast alarm clear if not already cleared + if ( TRUE == alarmIsActive[alarm].data ) + { + broadcastAlarmCleared( alarm ); + } alarmIsActive[alarm].data = FALSE; alarmStartedAt[alarm].data = 0; // clear FIFO if this alarm was in it if ( alarmPriorityFIFO[alarmTable[alarm].alarmPriority] == alarm ) { resetAlarmPriorityFIFO( alarmTable[alarm].alarmPriority ); } - broadcastAlarmCleared( alarm ); } } else @@ -337,31 +345,25 @@ *************************************************************************/ static void updateAlarmsState( void ) { - ALARM_ID_T tempDisp = ALARM_ID_NO_ALARM; ALARM_PRIORITY_T tempState = ALARM_PRIORITY_NONE; ALARM_ID_T a; - ALARM_PRIORITY_T p; // update FIFOs per alarm status table for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) { if ( TRUE == getAlarmActive(a) ) { - if ( ALARM_ID_NO_ALARM == alarmPriorityFIFO[alarmTable[a].alarmPriority] ) + tempState = alarmTable[a].alarmPriority; + if ( ALARM_ID_NO_ALARM == alarmPriorityFIFO[tempState] ) { - alarmPriorityFIFO[alarmTable[a].alarmPriority] = a; + alarmPriorityFIFO[tempState] = a; } } } - // update alarms status and alarm to display per highest priority FIFO - for ( p = ALARM_PRIORITY_LOW; p < NUM_OF_ALARM_PRIORITIES; p++ ) - { - tempState = p; - tempDisp = alarmPriorityFIFO[p]; - } + // update alarm to display per highest priority FIFO alarmStatus.alarmsState = tempState; - alarmStatus.alarmTop = tempDisp; + alarmStatus.alarmTop = alarmPriorityFIFO[tempState]; } /************************************************************************* Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -101,9 +101,7 @@ 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_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_ACTIVATE, 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, @@ -133,7 +131,7 @@ void initAlarmMgmt( void ); void execAlarmMgmt( void ); -void activateAlarm( ALARM_ID_T alarm ); +void activateAlarmNoData( ALARM_ID_T alarm ); void activateAlarm1Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData ); void activateAlarm2Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData1, ALARM_DATA_T alarmData2 ); void clearAlarm( ALARM_ID_T alarm ); Index: firmware/App/Services/CommBuffers.c =================================================================== diff -u -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) +++ firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -87,16 +87,17 @@ BOOL addToCommBuffer( COMM_BUFFER_T buffer, U08* data, U32 len ) { BOOL result = FALSE; - U32 activeBuffer = activeDoubleBuffer[buffer]; // verify given buffer if ( buffer < NUM_OF_COMM_BUFFERS ) { + U32 activeBuffer; U32 currentActiveBufCount; // where to start adding new data to buffer (after existing data) // add requires brief thread protection because there may be multiple sources for transmits trying to add data to a buffer. _disable_IRQ(); + activeBuffer = activeDoubleBuffer[buffer]; currentActiveBufCount = commBufferByteCount[buffer][activeBuffer]; // check to make sure buffer is not too full to service this add Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -80,15 +80,24 @@ typedef struct // TODO - add all sensor readings to this structure per FPGA register map { - U16 bloodLeak; - U32 adc1b; - U32 adc2b; - U32 dialysateTemp1; - U32 venousPressure; - U32 arterialPressure; - U32 adc1a; - U32 adc2a; - U32 dialysateTemp2; + U08 bloodFlowMeterCommStatus; + U08 bloodFlowMeterFrameCount; + U16 bloodFlowMeterDeviceStatus; + F32 bloodFlowLast; + F32 bloodFlowAvg; + F32 bloodFlowMeterSoundSpeed; + F32 bloodFlowMeterAccFlowData; + F32 bloodFlowMeterSignalStrength; + U32 bloodFlowMeterSensorID; + U08 dialysateFlowMeterCommStatus; + U08 dialysateFlowMeterFrameCount; + U16 dialysateFlowMeterDeviceStatus; + F32 dialysateFlowLast; + F32 dialysateFlowAvg; + F32 dialysateFlowMeterSoundSpeed; + F32 dialysateFlowMeterAccFlowData; + F32 dialysateFlowMeterSignalStrength; + U32 dialysateFlowMeterSensorID; } FPGA_SENSORS_T; typedef struct // TODO - add all actuator set points to this structure per FPGA register map @@ -446,8 +455,8 @@ fpgaReadCmdBuffer[2] = 0x00; fpgaReadCmdBuffer[3] = sizeof(FPGA_HEADER_T); crc = crc16( fpgaReadCmdBuffer, FPGA_READ_CMD_HDR_LEN ); - fpgaReadCmdBuffer[4] = GET_LSB_OF_WORD( crc ); - fpgaReadCmdBuffer[5] = GET_MSB_OF_WORD( crc ); + fpgaReadCmdBuffer[4] = GET_MSB_OF_WORD( crc ); + fpgaReadCmdBuffer[5] = GET_LSB_OF_WORD( crc ); // prep DMA for sending the read cmd and receiving the response fpgaReadCommandInProgress = TRUE; setupDMAForReadResp( FPGA_READ_RSP_HDR_LEN + sizeof(FPGA_HEADER_T) + FPGA_CRC_LEN ); @@ -480,11 +489,10 @@ { U32 rspSize = FPGA_READ_RSP_HDR_LEN + sizeof(FPGA_HEADER_T); U32 crcPos = rspSize; - U16 crc = MAKE_WORD_OF_BYTES( fpgaReadResponseBuffer[crcPos+1], fpgaReadResponseBuffer[crcPos] ); + U16 crc = MAKE_WORD_OF_BYTES( fpgaReadResponseBuffer[crcPos], fpgaReadResponseBuffer[crcPos+1] ); // does the FPGA response CRC check out? -// if ( crc == crc16( fpgaReadResponseBuffer, rspSize ) ) - if ( 1 ) // TODO - remove when FPGA CRCs are implemented + if ( crc == crc16( fpgaReadResponseBuffer, rspSize ) ) { fpgaCommRetryCount = 0; // capture the read values @@ -531,22 +539,21 @@ fpgaWriteCmdBuffer[0] = FPGA_WRITE_CMD_CODE; fpgaWriteCmdBuffer[1] = 0x08; // start at FPGA address 8 fpgaWriteCmdBuffer[2] = 0x00; - fpgaWriteCmdBuffer[3] = 1; // TODO - replace 1 with sizeof(FPGA_ACTUATORS_T) -// memcpy( &(fpgaWriteCmdBuffer[FPGA_WRITE_CMD_HDR_LEN]), &fpgaActuatorSetPoints, sizeof(FPGA_ACTUATORS_T) ); - fpgaWriteCmdBuffer[FPGA_WRITE_CMD_HDR_LEN] = 99; // TODO - remove and replace with memcpy above - crc = crc16( fpgaWriteCmdBuffer, FPGA_WRITE_CMD_HDR_LEN+1 ); // TODO - replace +1 with +sizeof(FPGA_ACTUATORS_T) - fpgaWriteCmdBuffer[FPGA_WRITE_CMD_HDR_LEN+1] = GET_LSB_OF_WORD( crc ); // TODO - replace +1 with +sizeof(FPGA_ACTUATORS_T) - fpgaWriteCmdBuffer[FPGA_WRITE_CMD_HDR_LEN+1+1] = GET_MSB_OF_WORD( crc ); // TODO - replace +1 with +sizeof(FPGA_ACTUATORS_T) + fpgaWriteCmdBuffer[3] = sizeof(FPGA_ACTUATORS_T); + memcpy( &(fpgaWriteCmdBuffer[FPGA_WRITE_CMD_HDR_LEN]), &fpgaActuatorSetPoints, sizeof(FPGA_ACTUATORS_T) ); + crc = crc16( fpgaWriteCmdBuffer, FPGA_WRITE_CMD_HDR_LEN+sizeof(FPGA_ACTUATORS_T) ); + fpgaWriteCmdBuffer[FPGA_WRITE_CMD_HDR_LEN+sizeof(FPGA_ACTUATORS_T)] = GET_MSB_OF_WORD( crc ); + fpgaWriteCmdBuffer[FPGA_WRITE_CMD_HDR_LEN+sizeof(FPGA_ACTUATORS_T)+1] = GET_LSB_OF_WORD( crc ); // construct bulk read command to read sensor data registers starting at address 8 fpgaReadCmdBuffer[0] = FPGA_READ_CMD_CODE; - fpgaReadCmdBuffer[1] = 0x08; // start at FPGA address 8 - fpgaReadCmdBuffer[2] = 0x00; + fpgaReadCmdBuffer[1] = 0x08; // start at FPGA address 0x108 (264) + fpgaReadCmdBuffer[2] = 0x01; fpgaReadCmdBuffer[3] = sizeof(FPGA_SENSORS_T); crc = crc16( fpgaReadCmdBuffer, FPGA_READ_CMD_HDR_LEN ); - fpgaReadCmdBuffer[4] = GET_LSB_OF_WORD( crc ); - fpgaReadCmdBuffer[5] = GET_MSB_OF_WORD( crc ); + fpgaReadCmdBuffer[4] = GET_MSB_OF_WORD( crc ); + fpgaReadCmdBuffer[5] = GET_LSB_OF_WORD( crc ); // prep DMA for sending the bulk write cmd and receiving its response - setupDMAForWriteCmd( FPGA_WRITE_CMD_HDR_LEN + 1 + FPGA_CRC_LEN ); // TODO s/b sizeof(FPGA_ACTUATORS_T) instead of 1 + setupDMAForWriteCmd( FPGA_WRITE_CMD_HDR_LEN + sizeof(FPGA_ACTUATORS_T) + FPGA_CRC_LEN ); setupDMAForWriteResp( FPGA_WRITE_RSP_HDR_LEN + FPGA_CRC_LEN ); // prep DMA for sending the bulk read cmd and receiving its response setupDMAForReadCmd( FPGA_READ_CMD_HDR_LEN + FPGA_CRC_LEN ); @@ -589,11 +596,10 @@ { U32 rspSize = FPGA_READ_RSP_HDR_LEN + sizeof(FPGA_SENSORS_T); U32 crcPos = rspSize; - U16 crc = MAKE_WORD_OF_BYTES( fpgaReadResponseBuffer[crcPos+1], fpgaReadResponseBuffer[crcPos] ); + U16 crc = MAKE_WORD_OF_BYTES( fpgaReadResponseBuffer[crcPos], fpgaReadResponseBuffer[crcPos+1] ); // does the FPGA response CRC check out? -// if ( crc == crc16( fpgaReadResponseBuffer, rspSize ) ) - if ( 1 ) // TODO - remove when FPGA CRCs are implemented + if ( crc == crc16( fpgaReadResponseBuffer, rspSize ) ) { fpgaCommRetryCount = 0; // capture the read values @@ -846,7 +852,7 @@ * Inputs : fpgaHeader * Outputs : none * @param none - * @return fpgaDiag + * @return fpgaHeader.fpgaStatus *************************************************************************/ U16 getFPGAStatus( void ) { @@ -855,20 +861,47 @@ /************************************************************************* * @brief getFPGADiag - * The getFPGADiag function gets the version read from the diagnostic register \n - * of the FPGA. + * The getFPGADiag function sets the diagnostic register of the FPGA. * @details * Inputs : fpgaHeader * Outputs : none - * @param none - * @return fpgaDiag + * @param ctrl : value to write to diagnostic register + * @return none *************************************************************************/ void setFPGAControl( U16 ctrl ) { fpgaHeader.fpgaControl = ctrl; } /************************************************************************* + * @brief getFPGABloodFlow + * The getFPGABloodFlow function gets the latest blood flow reading. + * @details + * Inputs : fpgaSensorReadings + * Outputs : none + * @param none + * @return last blood flow reading + *************************************************************************/ +F32 getFPGABloodFlow( void ) +{ + return fpgaSensorReadings.bloodFlowLast; +} + +/************************************************************************* + * @brief getFPGADialysateFlow + * The getFPGADialysateFlow function gets the latest dialysate flow reading. + * @details + * Inputs : fpgaSensorReadings + * Outputs : none + * @param none + * @return last dialysate flow reading + *************************************************************************/ +F32 getFPGADialysateFlow( void ) +{ + return fpgaSensorReadings.dialysateFlowLast; +} + +/************************************************************************* * @brief consumeUnexpectedData * The consumeUnexpectedData function checks to see if a byte is sitting in \n * the SCI2 received data register. Index: firmware/App/Services/FPGA.h =================================================================== diff -u -reff7b1575f008f81b29ef906f6346fac6012d3ab -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision eff7b1575f008f81b29ef906f6346fac6012d3ab) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -34,5 +34,7 @@ U16 getFPGAStatus( void ); void setFPGAControl( U16 ctrl ); +F32 getFPGABloodFlow( void ); +F32 getFPGADialysateFlow( void ); #endif Index: firmware/App/Services/MsgQueues.h =================================================================== diff -u -reff7b1575f008f81b29ef906f6346fac6012d3ab -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Services/MsgQueues.h (.../MsgQueues.h) (revision eff7b1575f008f81b29ef906f6346fac6012d3ab) +++ firmware/App/Services/MsgQueues.h (.../MsgQueues.h) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -21,7 +21,7 @@ // ********** public definitions ********** -#define MAX_MSG_CARGO_SIZE 100 // bytes +#define MAX_MSG_PAYLOAD_SIZE 100 // bytes typedef enum Msg_Queues { @@ -33,13 +33,13 @@ typedef struct { U16 msgID; // ID of message - U08 cargoLen; // length of cargo in bytes + U08 payloadLen; // length of payload in bytes } MESSAGE_HEADER_T; typedef struct { MESSAGE_HEADER_T hdr; // message header - U08 cargo[MAX_MSG_CARGO_SIZE]; // message cargo + U08 payload[MAX_MSG_PAYLOAD_SIZE]; // message payload } MESSAGE_T; typedef struct Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r8592c629e9e6e212c1325239a21ceb641f9dc1fe -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 8592c629e9e6e212c1325239a21ceb641f9dc1fe) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -166,14 +166,14 @@ } else if ( TRUE == isCANBoxForRecv( srcCANBox ) ) { - U08 data[CAN_MESSAGE_CARGO_SIZE]; + U08 data[CAN_MESSAGE_PAYLOAD_SIZE]; // get CAN packet received on given CAN message box if ( FALSE != canIsRxMessageArrived( canREG1, srcCANBox ) ) { canGetData( canREG1, srcCANBox, data ); // add CAN packet to appropriate comm buffer based on the message box it came in on (s/b same #) - addToCommBuffer( srcCANBox, data, CAN_MESSAGE_CARGO_SIZE ); + addToCommBuffer( srcCANBox, data, CAN_MESSAGE_PAYLOAD_SIZE ); } } else @@ -361,7 +361,7 @@ // search for next priority CAN packet to transmit for ( i = 0; i < NUM_OF_CAN_OUT_BUFFERS; i++ ) { - if ( numberOfBytesInCommBuffer( CAN_OUT_BUFFERS[i] ) >= CAN_MESSAGE_CARGO_SIZE ) + if ( numberOfBytesInCommBuffer( CAN_OUT_BUFFERS[i] ) >= CAN_MESSAGE_PAYLOAD_SIZE ) { result = CAN_OUT_BUFFERS[i]; break; // found highest priority packet to transmit - we're done @@ -388,12 +388,12 @@ // if a buffer is found with a packet to transmit, get packet from buffer and transmit it if ( buffer != COMM_BUFFER_NOT_USED ) { - U08 data[CAN_MESSAGE_CARGO_SIZE]; - U32 dataSize = getFromCommBuffer( buffer, data, CAN_MESSAGE_CARGO_SIZE ); + U08 data[CAN_MESSAGE_PAYLOAD_SIZE]; + U32 dataSize = getFromCommBuffer( buffer, data, CAN_MESSAGE_PAYLOAD_SIZE ); CAN_MESSAGE_BOX_T mBox = buffer; // CAN message boxes and comm buffers are aligned // if there's another CAN packet to send, send it - if ( dataSize == CAN_MESSAGE_CARGO_SIZE ) + if ( dataSize == CAN_MESSAGE_PAYLOAD_SIZE ) { canTransmit( canREG1, mBox, data ); } @@ -487,9 +487,9 @@ // copy message header portion of message data to the new message memcpy( &(rcvMsg.msg.hdr), dataPtr, sizeof(MESSAGE_HEADER_T) ); dataPtr += sizeof(MESSAGE_HEADER_T); - // copy message cargo portion of message data to the new message - memcpy( &(rcvMsg.msg.cargo), dataPtr, rcvMsg.msg.hdr.cargoLen ); - dataPtr += rcvMsg.msg.hdr.cargoLen; + // copy message payload portion of message data to the new message + memcpy( &(rcvMsg.msg.payload), dataPtr, rcvMsg.msg.hdr.payloadLen ); + dataPtr += rcvMsg.msg.hdr.payloadLen; // copy CRC portion of message data to the new message rcvMsg.crc = *dataPtr; // add new message to queue for later processing @@ -546,7 +546,7 @@ static U32 parseMessageFromBuffer( U08 *data, U32 len ) { U32 i; - U32 cargoSize; + U32 payloadSize; U32 msgSize; U32 result = 0; @@ -561,8 +561,8 @@ // if a minimum sized msg would fit in remaining, continue if ( remSize >= MESSAGE_OVERHEAD_SIZE ) { - cargoSize = data[pos+sizeof(U16)]; - msgSize = MESSAGE_OVERHEAD_SIZE + cargoSize; + payloadSize = data[pos+sizeof(U16)]; + msgSize = MESSAGE_OVERHEAD_SIZE + payloadSize; // we now know the size of the message - we can now know if full message is contained in buffer if ( msgSize <= remSize ) { Index: firmware/App/Services/SystemComm.h =================================================================== diff -u -reff7b1575f008f81b29ef906f6346fac6012d3ab -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Services/SystemComm.h (.../SystemComm.h) (revision eff7b1575f008f81b29ef906f6346fac6012d3ab) +++ firmware/App/Services/SystemComm.h (.../SystemComm.h) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -24,7 +24,7 @@ #define MESSAGE_SYNC_BYTE 0xA5 -#define CAN_MESSAGE_CARGO_SIZE 8 +#define CAN_MESSAGE_PAYLOAD_SIZE 8 #define PC_MESSAGE_PACKET_SIZE 8 typedef COMM_BUFFER_T CAN_MESSAGE_BOX_T; // the first 10 comm buffers align with the 10 active CAN message boxes Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r8592c629e9e6e212c1325239a21ceb641f9dc1fe -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 8592c629e9e6e212c1325239a21ceb641f9dc1fe) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -34,7 +34,7 @@ typedef struct { U08 confirmed; // 1 = confirmed, 0 = rejected/timed out -} OFF_BUTTON_MESSAGE_FROM_UI_CARGO_T; +} OFF_BUTTON_MESSAGE_FROM_UI_PAYLOAD_T; #pragma pack(pop) @@ -74,16 +74,16 @@ memcpy( &data[msgSize], &(msg.hdr), sizeof(MESSAGE_HEADER_T) ); msgSize += sizeof(MESSAGE_HEADER_T); - // serialize message cargo (only used bytes per cargoLen field) - memcpy( &data[msgSize], &(msg.cargo), msg.hdr.cargoLen ); - msgSize += msg.hdr.cargoLen; + // serialize message payload (only used bytes per payloadLen field) + memcpy( &data[msgSize], &(msg.payload), msg.hdr.payloadLen ); + msgSize += msg.hdr.payloadLen; // TODO - calculate 8-bit CRC data[msgSize++] = 0; // TODO - s/b 8-bit CRC when calc is available - // pad with zero bytes to get length a multiple of CAN_MESSAGE_CARGO_SIZE (8) - sizeMod = msgSize % CAN_MESSAGE_CARGO_SIZE; - sizePad = ( sizeMod == 0 ? 0 : CAN_MESSAGE_CARGO_SIZE - sizeMod ); + // pad with zero bytes to get length a multiple of CAN_MESSAGE_PAYLOAD_SIZE (8) + sizeMod = msgSize % CAN_MESSAGE_PAYLOAD_SIZE; + sizePad = ( sizeMod == 0 ? 0 : CAN_MESSAGE_PAYLOAD_SIZE - sizeMod ); for ( i = 0; i < sizePad; i++ ) { data[msgSize++] = 0; @@ -111,12 +111,12 @@ 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 data[sizeof(MESSAGE_WRAPPER_T)+1+CAN_MESSAGE_PAYLOAD_SIZE]; // must hold full (wrapped) message + sync + any CAN padding // create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_OFF_BUTTON_PRESS; - msg.hdr.cargoLen = 0; + msg.hdr.payloadLen = 0; // serialize the message (w/ sync, CRC, and appropriate CAN padding) msgSize = serializeMessage( msg, data ); @@ -139,10 +139,10 @@ *************************************************************************/ void handleOffButtonConfirmMsgFromUI( MESSAGE_T *message ) { - OFF_BUTTON_MESSAGE_FROM_UI_CARGO_T cargo; + OFF_BUTTON_MESSAGE_FROM_UI_PAYLOAD_T payload; - memcpy( &cargo, message->cargo, sizeof(OFF_BUTTON_MESSAGE_FROM_UI_CARGO_T) ); - userConfirmOffButton( cargo.confirmed ); + memcpy( &payload, message->payload, sizeof(OFF_BUTTON_MESSAGE_FROM_UI_PAYLOAD_T) ); + userConfirmOffButton( payload.confirmed ); } /************************************************************************* @@ -162,19 +162,19 @@ 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; + U08 data[sizeof(MESSAGE_WRAPPER_T)+1+CAN_MESSAGE_PAYLOAD_SIZE]; // must hold full (wrapped) message + sync + any CAN padding + U08 *payloadPtr = msg.payload; // 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); + msg.hdr.payloadLen = 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) ); + memcpy( payloadPtr, &alarm, sizeof(ALARM_ID_T) ); + payloadPtr += sizeof(ALARM_ID_T); + memcpy( payloadPtr, &almData1, sizeof(ALARM_DATA_T) ); + payloadPtr += sizeof(ALARM_DATA_T); + memcpy( payloadPtr, &almData2, sizeof(ALARM_DATA_T) ); // serialize the message (w/ sync, CRC, and appropriate CAN padding) msgSize = serializeMessage( msg, data ); @@ -199,15 +199,15 @@ 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; + U08 data[sizeof(MESSAGE_WRAPPER_T)+1+CAN_MESSAGE_PAYLOAD_SIZE]; // must hold full (wrapped) message + sync + any CAN padding + U08 *payloadPtr = msg.payload; // create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_ALARM_CLEARED; - msg.hdr.cargoLen = sizeof(ALARM_ID_T); + msg.hdr.payloadLen = sizeof(ALARM_ID_T); - memcpy( cargoPtr, &alarm, sizeof(ALARM_ID_T) ); + memcpy( payloadPtr, &alarm, sizeof(ALARM_ID_T) ); // serialize the message (w/ sync, CRC, and appropriate CAN padding) msgSize = serializeMessage( msg, data ); @@ -236,21 +236,21 @@ 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; + U08 data[sizeof(MESSAGE_WRAPPER_T)+1+CAN_MESSAGE_PAYLOAD_SIZE]; // must hold full (wrapped) message + sync + any CAN padding + U08 *payloadPtr = msg.payload; // 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); + msg.hdr.payloadLen = 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) ); + memcpy( payloadPtr, &flowStPt, sizeof(U32) ); + payloadPtr += sizeof(U32); + memcpy( payloadPtr, &measFlow, sizeof(F32) ); + payloadPtr += sizeof(F32); + memcpy( payloadPtr, &measSpd, sizeof(F32) ); + payloadPtr += sizeof(F32); + memcpy( payloadPtr, &measCurr, sizeof(F32) ); // serialize the message (w/ sync, CRC, and appropriate CAN padding) msgSize = serializeMessage( msg, data ); @@ -283,13 +283,13 @@ 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 data[sizeof(MESSAGE_WRAPPER_T) + 1 + CAN_MESSAGE_PAYLOAD_SIZE]; // must hold full (wrapped) message + sync + any CAN padding // create a message record blankMessage( &msg ); msg.hdr.msgID = 2; - msg.hdr.cargoLen = len; - memcpy( msg.cargo, dbgData, len ); + msg.hdr.payloadLen = len; + memcpy( msg.payload, dbgData, len ); // serialize the message (w/ sync, CRC, and appropriate CAN padding) msgSize = serializeMessage( msg, data ); @@ -337,8 +337,8 @@ // create a message record blankMessage( &msg ); msg.hdr.msgID = msgID; - msg.hdr.cargoLen = 1; - msg.cargo[0] = (U08)ack; + msg.hdr.payloadLen = 1; + msg.payload[0] = (U08)ack; // serialize the message (w/ sync, CRC, and appropriate CAN padding) msgSize = serializeMessage( msg, data ); @@ -363,7 +363,7 @@ { // verify pass code // TODO - placeholder - how do we want to authenticate tester? - if ( ( 3 == message->hdr.cargoLen ) && ( 0x31 == message->cargo[0] ) && ( 0x32 == message->cargo[1] ) && ( 0x33 == message->cargo[2] ) ) + if ( ( 3 == message->hdr.payloadLen ) && ( 0x31 == message->payload[0] ) && ( 0x32 == message->payload[1] ) && ( 0x33 == message->payload[2] ) ) { testerLoggedIn = TRUE; } @@ -388,11 +388,11 @@ void handleTestHDMessageRequest( MESSAGE_T *message ) { MESSAGE_WRAPPER_T hdMessage; - U32 msgLen = (U32)(message->hdr.cargoLen); + U32 msgLen = (U32)(message->hdr.payloadLen); U08 *msgBytes = (U08*)(&(hdMessage)); BOOL result; - memcpy( msgBytes, message->cargo, msgLen ); + memcpy( msgBytes, message->payload, msgLen ); // add HD message to received message queue result = addToMsgQueue( MSG_Q_IN, &hdMessage ); Index: firmware/App/Services/WatchdogMgmt.c =================================================================== diff -u -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) +++ firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -160,7 +160,7 @@ } else { - activateAlarm( ALARM_ID_WATCHDOG_POST_TEST_FAILED ); + activateAlarmNoData( ALARM_ID_WATCHDOG_POST_TEST_FAILED ); result = SELF_TEST_STATUS_FAILED; } watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_COMPLETE; Index: firmware/App/TestSupport.h =================================================================== diff -u -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb -r90f6438e80dbe0a32472a076a0d1bc54db65d15a --- firmware/App/TestSupport.h (.../TestSupport.h) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) +++ firmware/App/TestSupport.h (.../TestSupport.h) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) @@ -28,14 +28,14 @@ { BOOL reset; U32 state; -} TEST_OVERRIDE_CARGO_T; +} TEST_OVERRIDE_PAYLOAD_T; typedef struct { BOOL reset; U32 state; U32 index; -} TEST_OVERRIDE_ARRAY_CARGO_T; +} TEST_OVERRIDE_ARRAY_PAYLOAD_T; #pragma pack(pop) @@ -120,7 +120,7 @@ } \ else \ { \ - activateAlarm( ALARM_ID_SOFTWARE_FAULT ); \ + activateAlarmNoData( ALARM_ID_SOFTWARE_FAULT ); \ } \ return result; \ } @@ -199,15 +199,15 @@ #define DATA_OVERRIDE_HANDLER_FUNC( t, h_name, o_name, r_name ) \ void h_name( MESSAGE_T *message ) \ { \ - TEST_OVERRIDE_CARGO_T cargo; \ + TEST_OVERRIDE_PAYLOAD_T payload; \ BOOL result = FALSE; \ - /* verify cargo length */ \ - if ( sizeof(TEST_OVERRIDE_CARGO_T) == message->hdr.cargoLen ) \ + /* verify payload length */ \ + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) \ { \ - memcpy( &cargo, message->cargo, sizeof(TEST_OVERRIDE_CARGO_T) ); \ - if ( FALSE == cargo.reset ) \ + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); \ + if ( FALSE == payload.reset ) \ { \ - result = o_name( (t)(cargo.state) ); \ + result = o_name( (t)(payload.state) ); \ } \ else \ { \ @@ -226,19 +226,19 @@ #define DATA_ARRAY_OVERRIDE_HANDLER_FUNC( t, h_name, o_name, r_name ) \ void h_name( MESSAGE_T *message ) \ { \ - TEST_OVERRIDE_ARRAY_CARGO_T cargo; \ + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; \ BOOL result = FALSE; \ - /* verify cargo length */ \ - if ( sizeof(TEST_OVERRIDE_ARRAY_CARGO_T) == message->hdr.cargoLen ) \ + /* verify payload length */ \ + if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) \ { \ - memcpy( &cargo, message->cargo, sizeof(TEST_OVERRIDE_ARRAY_CARGO_T) ); \ - if ( FALSE == cargo.reset ) \ + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); \ + if ( FALSE == payload.reset ) \ { \ - result = o_name( cargo.index, (t)(cargo.state) ); \ + result = o_name( payload.index, (t)(payload.state) ); \ } \ else \ { \ - result = r_name( cargo.index ); \ + result = r_name( payload.index ); \ } \ } \ /* respond to request */ \