Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r952a79dda24f4fb84937c8cc4e4dc9ef18c040f6 -r22a8500467c47070dff55824e2ec567c007434ce --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 952a79dda24f4fb84937c8cc4e4dc9ef18c040f6) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 22a8500467c47070dff55824e2ec567c007434ce) @@ -92,6 +92,9 @@ #define SIZE_OF_ROLLING_AVG 20 ///< Number of pump speed samples in rolling average. +#define BP_TORQUE_PERIOD_RESOLUTION_US 10.0F ///< Blood pump torque period resolution in microseconds (10 us). +#define BP_1KHZ_TO_TORQUE_CONVERSION_MNM 10.0F ///< Blood pump 1kHz to torque conversion in milli-newtonmeter + /// Enumeration of blood pump controller states. typedef enum BloodPump_States { @@ -131,6 +134,7 @@ static OVERRIDE_F32_T measuredBloodFlowRate; ///< Measured (calculated now) blood flow rate. static OVERRIDE_F32_T bloodPumpRotorSpeedRPM; ///< Measured blood pump rotor speed. static OVERRIDE_F32_T bloodPumpSpeedRPM; ///< Measured blood pump motor speed. +static OVERRIDE_F32_T bloodPumpTorquemNm; ///< Measured blood pump torque in mNm. static F32 rpmReadings[ SIZE_OF_ROLLING_AVG ]; ///< Holds RPM samples for a rolling average. static U32 rpmReadingsIdx; ///< Index for next sample in rolling average array. @@ -167,6 +171,7 @@ static F32 getBPFlowWearBTerm( void ); static void resetBloodPumpRPMMovingAverage( void ); static void filterBloodPumpRPMReadings( F32 rpm ); +static F32 calcBloodPumpTorque( void ); static void publishBloodFlowData( void ); @@ -219,6 +224,10 @@ bloodPumpRotorCounter.ovData = 0; bloodPumpRotorCounter.ovInitData = 0; bloodPumpRotorCounter.override = OVERRIDE_RESET; + bloodPumpTorquemNm.data = 0.0F; + bloodPumpTorquemNm.ovData = 0.0F; + bloodPumpTorquemNm.ovInitData = 0.0F; + bloodPumpTorquemNm.override = OVERRIDE_RESET; bpFlowAlphaYIntercept.data = BP_FLOW_ALPHA_Y_INTERCEPT; bpFlowAlphaYIntercept.ovData = BP_FLOW_ALPHA_Y_INTERCEPT; bpFlowAlphaYIntercept.ovInitData = BP_FLOW_ALPHA_Y_INTERCEPT; @@ -501,6 +510,7 @@ bloodPumpSpeedRPM.data = filteredBloodPumpSpeed; bloodPumpDirection = ( getMeasuredBloodPumpSpeed() < 0.0F ? MOTOR_DIR_REVERSE : MOTOR_DIR_FORWARD ); measuredBloodFlowRate.data = calcBloodFlow(); + bloodPumpTorquemNm.data = calcBloodPumpTorque(); // Do not start enforcing checks until out of init/POST mode TODO-add checks later // if ( opMode != MODE_INIT ) @@ -881,6 +891,7 @@ payload.h4PresFlow = 0; } payload.h6RotorHallState = ( hallSensor > 0 ? 0 : 1 ); // 1=home, 0=not home + payload.h4MeasTorquemNm = getF32OverrideValue( &bloodPumpTorquemNm ); //payload.bPstate = bloodPumpState; //payload.bpRotorStatus = (U32)getH6RotorStatus(); broadcastData( MSG_ID_TD_BLOOD_PUMP_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&payload, sizeof( BLOOD_PUMP_STATUS_PAYLOAD_T ) ); @@ -928,6 +939,24 @@ /*********************************************************************//** * @brief + * The calcBloodPumpTorque function calculates the blood pump's torque from + * the resolution count. + * @details \b Inputs: none + * @details \b Outputs: none + * @return calculated blood pump torque (mN.m) + *************************************************************************/ +static F32 calcBloodPumpTorque( void ) +{ + F32 torqueResolutionUS = (F32)getH4Period() * BP_TORQUE_PERIOD_RESOLUTION_US; + F32 frequencyHz = 1.0F / ( (F32)US_PER_SECOND / torqueResolutionUS ); + F32 frequencyKHz = (F32)HZ_PER_KHZ / frequencyHz; + F32 torquemNm = frequencyKHz * BP_1KHZ_TO_TORQUE_CONVERSION_MNM; + + return torquemNm; +} + +/*********************************************************************//** + * @brief * The checkBloodPumpRotor function checks the rotor for the blood * pump. If pump is off or running very slowly, rotor speed will be set to zero. * @details \b Alarm: ALARM_ID_HD_BLOOD_PUMP_ROTOR_SPEED_TOO_HIGH if rotor speed Index: firmware/App/Controllers/BloodFlow.h =================================================================== diff -u -r927c47388ab6bd716b857f76e2026c116dd52e69 -r22a8500467c47070dff55824e2ec567c007434ce --- firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 927c47388ab6bd716b857f76e2026c116dd52e69) +++ firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 22a8500467c47070dff55824e2ec567c007434ce) @@ -48,6 +48,7 @@ U32 h4RotorCount; ///< Rotor count. U32 h4PresFlow; ///< Prescribed blood flow in mL/min. U32 h6RotorHallState; ///< Rotor hall state (1=home, 0=not home). + F32 h4MeasTorquemNm; ///< Measured torque in mN.m. //U32 bPstate; //U32 bpRotorStatus; } BLOOD_PUMP_STATUS_PAYLOAD_T; Index: firmware/App/Modes/ModeFault.c =================================================================== diff -u -rfe9b77e60850fe37da225d4348f0a6a8defc28db -r22a8500467c47070dff55824e2ec567c007434ce --- firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision fe9b77e60850fe37da225d4348f0a6a8defc28db) +++ firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 22a8500467c47070dff55824e2ec567c007434ce) @@ -81,7 +81,7 @@ initFaultMode(); transitionToModeFaultState( faultState ); -// requestAlarmLampPattern( LAMP_PATTERN_FAULT ); // in case we get here before LED POST can take alarm lamp out of manual control. + requestAlarmLampPattern( LAMP_PATTERN_FAULT ); // in case we get here before LED POST can take alarm lamp out of manual control. doorClosedRequired( FALSE ); // syringeDetectionRequired( FALSE ); setVenousBubbleDetectionEnabled( H18_BBLD, FALSE ); Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r285b5d82539c96524c93703d52a66fff76fb64fc -r22a8500467c47070dff55824e2ec567c007434ce --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 285b5d82539c96524c93703d52a66fff76fb64fc) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 22a8500467c47070dff55824e2ec567c007434ce) @@ -123,10 +123,12 @@ // resetWatchdogPOSTState(); // resetSafetyShutdownPOSTState(); // resetValvesPOSTState(); -// resetAlarmAudioPOSTState(); -// resetAlarmLampPOSTState(); + resetAlarmAudioPOSTState(); + resetAlarmLampPOSTState(); // resetStuckButtonPOSTState(); + requestAlarmLampPattern( LAMP_PATTERN_OK ); // TODO remove once POST is setup correctly + return postState; } Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -re7fc14ea1f82609c49bd3e82480523fe312a27f2 -r22a8500467c47070dff55824e2ec567c007434ce --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision e7fc14ea1f82609c49bd3e82480523fe312a27f2) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 22a8500467c47070dff55824e2ec567c007434ce) @@ -25,7 +25,7 @@ U32 execPreTreatmentMode( void ) { - if ( TRUE == didTimeout( testTimeRemove, 30000 ) ) // TODO temporary remove + if ( TRUE == didTimeout( testTimeRemove, 10000 ) ) // TODO temporary remove { requestNewOperationMode( MODE_TREA ); } Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rc06a32218bad65414ccda5d41293e5349e46d241 -r22a8500467c47070dff55824e2ec567c007434ce --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision c06a32218bad65414ccda5d41293e5349e46d241) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 22a8500467c47070dff55824e2ec567c007434ce) @@ -812,13 +812,13 @@ payload.treatmentTimeRemaininginSec = 0; } } - sendMessage( MSG_ID_TD_TREATMENT_TIME_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)(&payload), sizeof( TREATMENT_TIME_DATA_T ) ); + broadcastData( MSG_ID_TD_TREATMENT_TIME_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)(&payload), sizeof( TREATMENT_TIME_DATA_T ) ); // Build and send treatment set points message. spPayload.bloodFlow = getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ); spPayload.dialFlow = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); spPayload.dialTemp = getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ); - sendMessage( MSG_ID_TD_TREATMENT_SET_POINTS, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)(&spPayload), sizeof( TREATMENT_SET_POINTS_T ) ); + broadcastData( MSG_ID_TD_TREATMENT_SET_POINTS, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)(&spPayload), sizeof( TREATMENT_SET_POINTS_T ) ); } // Broadcast treatment state data at interval @@ -838,8 +838,7 @@ payload.txEndState = 0; // getCurrentTreatmentEndState(); payload.txSalBolusState = 0; // payload.txHepState = 0; // - - sendMessage( MSG_ID_TD_TREATMENT_STATE_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)(&payload), sizeof( TREATMENT_STATE_DATA_T ) ); + broadcastData( MSG_ID_TD_TREATMENT_STATE_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)(&payload), sizeof( TREATMENT_STATE_DATA_T ) ); } } Index: firmware/App/Services/DDInterface.c =================================================================== diff -u -r20aa85c56d664c77799b77e7d56abc1095a787f8 -r22a8500467c47070dff55824e2ec567c007434ce --- firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision 20aa85c56d664c77799b77e7d56abc1095a787f8) +++ firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision 22a8500467c47070dff55824e2ec567c007434ce) @@ -271,7 +271,9 @@ } else { +#ifndef TEST_UI_ONLY SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_DD_PRESSURE_DATA, (U32)message->hdr.payloadLen ); +#endif } ddDialysatePressureFreshFlag = TRUE; Index: firmware/App/Services/FpgaTD.c =================================================================== diff -u -ra074eec2ed7d04a1ea90072d7c9c013bf27a6e90 -r22a8500467c47070dff55824e2ec567c007434ce --- firmware/App/Services/FpgaTD.c (.../FpgaTD.c) (revision a074eec2ed7d04a1ea90072d7c9c013bf27a6e90) +++ firmware/App/Services/FpgaTD.c (.../FpgaTD.c) (revision 22a8500467c47070dff55824e2ec567c007434ce) @@ -576,6 +576,20 @@ /*********************************************************************//** * @brief + * The getH4TorqueCount function gets the latest blood pump + * torque count. Count is the period in 10 uS resolution. Firmware converts + * the period to frequency and 1kHz = 10mN.m. + * @details \b Inputs: fpgaSensorReadings.h4Torque + * @details \b Outputs: none + * @return Latest blood pump torque sensor count reading. + *************************************************************************/ +S16 getH4TorqueCount( void ) +{ + return fpgaSensorReadings.h4Torque; +} + +/*********************************************************************//** + * @brief * The setH5ControlFlags function sets the control flags for the H5 ejector * stepper motor. * @note Bit 0 - MS1 (bit 1 of microstepping configuration setting) Index: firmware/App/Services/FpgaTD.h =================================================================== diff -u -r0054e875bf1b9a85d017e6e388b225f51ae6d032 -r22a8500467c47070dff55824e2ec567c007434ce --- firmware/App/Services/FpgaTD.h (.../FpgaTD.h) (revision 0054e875bf1b9a85d017e6e388b225f51ae6d032) +++ firmware/App/Services/FpgaTD.h (.../FpgaTD.h) (revision 22a8500467c47070dff55824e2ec567c007434ce) @@ -76,6 +76,7 @@ void setH4BrakeAndHoldTorque( void ); S16 getH4RotorCount( void ); +S16 getH4TorqueCount( void ); U08 getH6Status( void ); U08 getH6RotorStatus( void );