Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r520a29bd1dc8d34710d96c21679d636563fc1c2c -r90ff6d5060b3f679d17fada9057e4dcecdecae9c --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 520a29bd1dc8d34710d96c21679d636563fc1c2c) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 90ff6d5060b3f679d17fada9057e4dcecdecae9c) @@ -35,6 +35,7 @@ #include "DialOutFlow.h" // ********** private definitions ********** +#define DIALOUT_SIMULATOR 1 #define DIAL_OUT_FLOW_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) // interval (ms/task time) at which the dialIn flow data is published on the CAN bus @@ -111,10 +112,15 @@ static F32 dialOutPumpSpeedInRPM; static F32 dialOutPumpCurrentInMA; +#ifdef DIALOUT_SIMULATOR + // Simulator static volatile F32 simulator_volume_in_ml_per_min; static volatile F32 simulator_inlet_flow_rate; +#endif + + // ********** private function prototypes ********** static DIALOUT_FLOW_STATE_T handleDialOutFlowStopState( void ); @@ -130,9 +136,12 @@ static void publishDialOutFlowData( void ); +#ifdef DIALOUT_SIMULATOR + static F32 UFSimulator( F32 pwm ); static void ResetSimulator( void ); +#endif /************************************************************************* * @brief setDialOutFlowNewState @@ -208,15 +217,14 @@ *************************************************************************/ static void setControlSignalPWM( F32 newPWM ) { - etpwmSetCmpA( etpwmREG3, (U16)( FLOAT_TO_INT_WITH_ROUND( newPWM * (F32)(etpwmREG3->TBPRD) ) ) ); + etpwmSetCmpA( etpwmREG3, (U16)( FLOAT_TO_INT_WITH_ROUND( newPWM * (F32)( etpwmREG3->TBPRD ) ) ) ); } /************************************************************************* * @brief updateTargetVolume * The updateTargetVolume function updates the next sample for total target * volume based on rate of UF * - * @param newPWM a fraction of between 0.0 and 1.0. * @return none *************************************************************************/ static void updateTargetVolume( void ) @@ -232,12 +240,11 @@ * @param rxTotalVolumeInMl Total Volume requested for ultra-filtration * @param rxTotalTimeInMinutes Total Rx time in minutes * @param rxFlowRateinMlPerMin - * @return none + * @return TRUE if settings are correct and save, false if parameters are + * saved. *************************************************************************/ BOOL setDialOutFlowRxTotalVolumeAndRxTime( U16 rxTotalVolumeInMl, U16 rxTotalTimeInMinutes, U16 rxFlowRateinMlPerMin) { - #define SECS_IN_MIN 60 - #define DOP_REV_PER_LITER 124.0 // rotor revolutions per liter #define DOP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( DOP_REV_PER_LITER / ML_PER_LITER ) #define DOP_GEAR_RATIO 32.0 // dialIn pump motor to dialIn pump gear ratio @@ -248,7 +255,6 @@ #define MAX_RX_TOTAL_VOLUME_ML 8000 #define MIN_RX_TOTAL_VOLUME_ML 100 - #define MIN_PER_HOUR 60.0 #define MAX_UF_RATE_ML_PER_HOUR 2500.0 @@ -257,7 +263,7 @@ F32 rxUFPatientRate = ((F32) rxTotalVolumeInMl * MIN_PER_HOUR )/ rxTotalTimeInMinutes; - if ( rxTotalVolumeInMl > MAX_RX_TOTAL_VOLUME_ML || rxTotalVolumeInMl < MIN_RX_TOTAL_VOLUME_ML) + if ( rxTotalVolumeInMl > MAX_RX_TOTAL_VOLUME_ML || rxTotalVolumeInMl < MIN_RX_TOTAL_VOLUME_ML ) { returnValue = FALSE; } @@ -274,7 +280,7 @@ rxTotalTargetVolumeInMl = (F32) rxTotalVolumeInMl; rxTargetTimeInSamples = (U32) rxTotalTimeInMinutes * SEC_PER_MIN * DIAL_OUT_CONTROLLER_SAMPLE_FREQ ; - rxInitialTargetFlowRatePWM = RANGE(DOP_PWM_FROM_ML_PER_MIN(rxFlowRateinMlPerMin), MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_OUT_PUMP_PWM_DUTY_CYCLE); + rxInitialTargetFlowRatePWM = RANGE( DOP_PWM_FROM_ML_PER_MIN( rxFlowRateinMlPerMin ), MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_OUT_PUMP_PWM_DUTY_CYCLE ); resetPIController( PI_CONTROLLER_ID_LOAD_CELL, rxInitialTargetFlowRatePWM ); @@ -296,14 +302,14 @@ stopDialOutPump(); setDialOutPumpDirection( MOTOR_DIR_FORWARD ); - initializeFilter(FILTER_ID_LOAD_CELL_WEIGHT, 0); + initializeFilter(FILTER_ID_LOAD_CELL_WEIGHT, ZERO ); setDialOutFlowNewState( DIALOUT_FLOW_STOP_STATE , TRUE ); // initialize dialysate outlet flow PI controller initializePIController( PI_CONTROLLER_ID_LOAD_CELL, rxInitialTargetFlowRatePWM, DOP_P_COEFFICIENT, DOP_I_COEFFICIENT, - MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_OUT_PUMP_PWM_DUTY_CYCLE); + MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_OUT_PUMP_PWM_DUTY_CYCLE ); } @@ -314,7 +320,7 @@ * @param signal is a measured signal enum. * @return actual signal as float. *************************************************************************/ -F32 getMeasuredVariable( DIALOUT_MEASURED_SIGNALS_T signal) +F32 getMeasuredVariable( DIALOUT_MEASURED_SIGNALS_T signal ) { #define DIP_SPEED_ADC_TO_RPM_FACTOR 1.375 // conversion factor from ADC counts to RPM for dialIn pump motor #define DIP_CURRENT_ADC_TO_MA_FACTOR 2.65 // conversion factor from ADC counts to mA for dialIn pump motor @@ -370,20 +376,24 @@ publishDialOutFlowData(); } +#ifdef DIALOUT_SIMULATOR /* * TODO: Delete UFSimulator when hardware is ready */ F32 UFSimulator(F32 pwm) { + #define SIMULATOR_PWM_TO_ML_PER_MIN 678.0 + #define SIMULATOR_ZERO_CROSSING_ML_PER_MIN 67.80 + F32 flow; if(dialOutFlowState == DIALOUT_FLOW_STOP_STATE) { - flow = 0; + flow = ZERO; } else { - flow = ( ((678.0*pwm - simulator_inlet_flow_rate - 67.80) * (F32) TASK_PRIORITY_INTERVAL )/ (F32) MS_PER_SECOND ); + flow = ( ((SIMULATOR_PWM_TO_ML_PER_MIN*pwm - simulator_inlet_flow_rate - SIMULATOR_ZERO_CROSSING_ML_PER_MIN) * (F32) TASK_PRIORITY_INTERVAL )/ (F32) MS_PER_SECOND ); } simulator_volume_in_ml_per_min += flow; @@ -397,6 +407,7 @@ simulator_volume_in_ml_per_min = 0.0; } +#endif /************************************************************************* * @brief execDialOutFlowController * The execDialOutFlowController function executes the dialIn flow controller. @@ -423,7 +434,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_STATE, dialOutFlowState ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_STATE, dialOutFlowState ); break; } } @@ -501,7 +512,7 @@ *************************************************************************/ static void stopDialOutPump( void ) { - setControlSignalPWM(0.0); + setControlSignalPWM(ZERO); SET_DOP_STOP(); } @@ -529,7 +540,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_DIRECTION, dir ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_DIRECTION, dir ); break; } }