Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r316e7117180362d54af53818822694c4f936e550 -rc8c95741c34a1768808a40152f0f2174bacb84ee --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 316e7117180362d54af53818822694c4f936e550) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision c8c95741c34a1768808a40152f0f2174bacb84ee) @@ -121,6 +121,7 @@ static DIALOUT_FLOW_STATE_T handleDialOutFlowRunUFState( void ); static DIALOUT_FLOW_STATE_T handleDialOutFlowPauseUFState( void ); +static F32 getMeasuredVariable( DIALOUT_MEASURED_SIGNALS_T signal); static void setControlSignalPWM( F32 newPWM ); static void stopDialOutPump( void ); static void updateTargetVolume( void ); @@ -139,34 +140,56 @@ * * @param isNewBag is TRUE, if at the start of the new state a new bag will * be used. - * @return none + * @return TRUE if successful *************************************************************************/ -void setDialOutFlowNewState( DIALOUT_FLOW_STATE_T newState , BOOL isNewBag ) { +BOOL setDialOutFlowNewState( DIALOUT_FLOW_STATE_T newState , BOOL isNewBag ) +{ + BOOL isSuccess = TRUE; switch( newState ) { case DIALOUT_FLOW_RUN_UF_STATE: break; case DIALOUT_FLOW_PAUSE_UF_STATE: - bagStartVolumeInMl = (isNewBag == TRUE) ? 0.0 : bagStartVolumeInMl; + if (dialOutFlowState == DIALOUT_FLOW_STOP_STATE) + { + // We won't allow change of state to pause + newState = DIALOUT_FLOW_STOP_STATE; + isSuccess = FALSE; + } + else + { + bagStartVolumeInMl = (isNewBag == TRUE) ? 0.0 : bagStartVolumeInMl; + } break; case DIALOUT_FLOW_STOP_STATE: - // Reset total target volume - totalTargetUFVolumeInMl = 0.0; - accumulativeTotalUFVolumeInMl = 0.0; - bagStartVolumeInMl = 0.0; - sentPWM = 0.0; - bagStartVolumeInMl = (isNewBag == TRUE) ? 0.0 : bagStartVolumeInMl; - ResetSimulator(); - stopDialOutPump(); + if (dialOutFlowState == DIALOUT_FLOW_PAUSE_UF_STATE) + { + // We won't allow change of state to pause + newState = DIALOUT_FLOW_PAUSE_UF_STATE; + isSuccess = FALSE; + } + else + { + // Reset total target volume + totalTargetUFVolumeInMl = 0.0; + accumulativeTotalUFVolumeInMl = 0.0; + bagStartVolumeInMl = 0.0; + sentPWM = 0.0; + bagStartVolumeInMl = (isNewBag == TRUE) ? 0.0 : bagStartVolumeInMl; + ResetSimulator(); + stopDialOutPump(); + } break; default: break; } dialOutFlowState = newState; + + return isSuccess; } /************************************************************************* @@ -204,7 +227,7 @@ * @param rxFlowRateinMlPerMin * @return none *************************************************************************/ -BOOL setDialOutFlowRxTotalVolumeAndRxTime( U16 rxTotaVolumeInMl, U16 rxTotalTimeInMinutes, U16 rxFlowRateinMlPerMin) +BOOL setDialOutFlowRxTotalVolumeAndRxTime( U16 rxTotalVolumeInMl, U16 rxTotalTimeInMinutes, U16 rxFlowRateinMlPerMin) { #define SECS_IN_MIN 60 @@ -215,35 +238,42 @@ #define DOP_PWM_ZERO_OFFSET 0.1 // 10% PWM duty cycle = zero speed #define DOP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * DOP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * DOP_GEAR_RATIO * DOP_MOTOR_RPM_TO_PWM_DC_FACTOR + DOP_PWM_ZERO_OFFSET ) - //TODO: Verify RxFlowRate within range, rxTotalTimeInMinutes and rxTotalVolumeInMl + #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 + + BOOL returnValue = TRUE; - totalTargetUFVolumeInMl = 0.0; - simulator_inlet_flow_rate = (F32) rxFlowRateinMlPerMin; + F32 rxUFPatientRate = ((F32) rxTotalVolumeInMl * MIN_PER_HOUR )/ rxTotalTimeInMinutes; - rxTotalTargetVolumeInMl = (F32) rxTotaVolumeInMl; - 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); + if ( rxTotalVolumeInMl > MAX_RX_TOTAL_VOLUME_ML || rxTotalVolumeInMl < MIN_RX_TOTAL_VOLUME_ML) + { + returnValue = FALSE; + } + else if ( rxUFPatientRate > MAX_UF_RATE_ML_PER_HOUR ) + { + returnValue = FALSE; + } + else + { - resetPIController( PI_CONTROLLER_ID_LOAD_CELL, rxInitialTargetFlowRatePWM ); + totalTargetUFVolumeInMl = 0.0; + simulator_inlet_flow_rate = (F32) rxFlowRateinMlPerMin; - targetVolumeUFRatePerSample = (F32) rxTotalTargetVolumeInMl / (F32) rxTargetTimeInSamples; + 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); - #ifdef DEBUG_ENABLED - // TODO - temporary debug code - remove later - char debugFlowStr[ 128 ]; + resetPIController( PI_CONTROLLER_ID_LOAD_CELL, rxInitialTargetFlowRatePWM ); - sprintf( debugFlowStr, "target:%5.4f, time:%5d, InitTarget:%6.4f, RatePerSample:%8.4f", - rxTotalTargetVolumeInMl, - rxTargetTimeInSamples, - rxInitialTargetFlowRatePWM, - targetVolumeUFRatePerSample ); - sendDebugData( (U08*)debugFlowStr, strlen(debugFlowStr) ); - #endif + targetVolumeUFRatePerSample = (F32) rxTotalTargetVolumeInMl / (F32) rxTargetTimeInSamples; + } return returnValue; } @@ -518,18 +548,6 @@ // publish dialIn flow data on interval if ( ++dialOutFlowDataPublicationTimerCounter > DIAL_OUT_FLOW_DATA_PUB_INTERVAL ) { -#ifdef DEBUG_ENABLED - // TODO - temporary debug code - remove later - char debugFlowStr[ 128 ]; - - sprintf( debugFlowStr, "St:%5d, Set Pt:%5d, Meas. Vol:%5d, PWM:%5d \n", - doFlowState, - doTotalTargetUFVolumeInMl, - doTotalMeasuredUFVolumeInMl, - doControlSignalPWM ); - - sendDebugData( (U08*)debugFlowStr, strlen(debugFlowStr) ); -#endif broadcastDialOutFlowData( doFlowState, doTotalTargetUFVolumeInMl, doTotalMeasuredUFVolumeInMl, doControlSignalPWM ); dialOutFlowDataPublicationTimerCounter = 0; } Index: firmware/App/Controllers/DialOutFlow.h =================================================================== diff -u -r316e7117180362d54af53818822694c4f936e550 -rc8c95741c34a1768808a40152f0f2174bacb84ee --- firmware/App/Controllers/DialOutFlow.h (.../DialOutFlow.h) (revision 316e7117180362d54af53818822694c4f936e550) +++ firmware/App/Controllers/DialOutFlow.h (.../DialOutFlow.h) (revision c8c95741c34a1768808a40152f0f2174bacb84ee) @@ -34,14 +34,8 @@ void execDialOutFlowMonitor( void ); void execDialOutFlowController( void ); -// reset can only be done in DIALOUT_FLOW_STOP_STATE -// Rx setting can be done in DIALOUT_FLOW_STOP_STATE and DIALOUT_FLOW_PAUSE_UF_STATE -BOOL resetDialOutFlowRx(); - -DIALOUT_FLOW_STATE_T getDialOutFlowState( void ); -BOOL setdialOutFlowState( DIALOUT_FLOW_STATE_T setNewState ); -void setDialOutFlowNewState( DIALOUT_FLOW_STATE_T newState , BOOL isNewBag ); +BOOL setDialOutFlowNewState( DIALOUT_FLOW_STATE_T newState , BOOL isNewBag ); BOOL setDialOutFlowRxTotalVolumeAndRxTime( U16 rxTotaVolumeInMl, U16 rxTotalTimeInMinutes, U16 rxFlowRateinMlPerMin); Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r89a95cb8fbc537f1c7a5448a05788342f7319c01 -rc8c95741c34a1768808a40152f0f2174bacb84ee --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 89a95cb8fbc537f1c7a5448a05788342f7319c01) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision c8c95741c34a1768808a40152f0f2174bacb84ee) @@ -169,6 +169,7 @@ SW_FAULT_ID_RTC_SELF_TEST_INVALID_STATE, // 45 SW_FAULT_ID_RTC_TRANSACTION_SERVICE_INVALID_STATE, SW_FAULT_ID_DIAL_OUT_MEASURED_SIGNAL_STATE, + SW_FAULT_ID_DIAL_OUT_SET_RX_OUT_OF_RANGE, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r316e7117180362d54af53818822694c4f936e550 -rc8c95741c34a1768808a40152f0f2174bacb84ee --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 316e7117180362d54af53818822694c4f936e550) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision c8c95741c34a1768808a40152f0f2174bacb84ee) @@ -904,13 +904,14 @@ { BOOL isItAValidArgument = FALSE; DIALOUT_FLOW_STATE_T newState = (DIALOUT_FLOW_STATE_T) message->payload[0]; - BOOL isBagChanged = FALSE; //leo-del message->payload[1]; + BOOL isBagChanged = FALSE; //TODO: implement this when bag management is realized, message->payload[1]; if ( 1 == message->hdr.payloadLen && NUM_OF_DIALOUT_FLOW_STATES > newState) { - isItAValidArgument = TRUE; - setDialOutFlowNewState( newState, isBagChanged ); + DIALOUT_FLOW_STATE_T actualNewState = setDialOutFlowNewState( newState, isBagChanged ); + + isItAValidArgument = (actualNewState == newState) ? TRUE : FALSE; } // respond to would be tester