Index: firmware/App/Controllers/BalancingChamber.c =================================================================== diff -u -r5422509f9d8db102b62952ba9f5923e832d6b2fa -r9ff57b5ab7490ee5bbc2c51b25f738ee6c569ec1 --- firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision 5422509f9d8db102b62952ba9f5923e832d6b2fa) +++ firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision 9ff57b5ab7490ee5bbc2c51b25f738ee6c569ec1) @@ -433,10 +433,11 @@ } // On dosing completion, transition to next state based on the current switching state - if ( ( ( TRUE == isConcentratePumpDosingCompleted( D11_PUMP ) ) && - ( TRUE == isConcentratePumpDosingCompleted( D10_PUMP ) ) ) || - ( TRUE == getBalChamberSwitchingOnlyStatus() ) ) - { + // TODO : Need an updated FPGA to perform this check. For now commenting this check. +// if ( ( ( TRUE == isConcentratePumpDosingCompleted( D11_PUMP ) ) && +// ( TRUE == isConcentratePumpDosingCompleted( D10_PUMP ) ) ) || +// ( TRUE == getBalChamberSwitchingOnlyStatus() ) ) +// { if ( BAL_CHAMBER_SW_STATE1 == balChamberSWState ) { state = BAL_CHAMBER_STATE1_FILL_END; @@ -445,7 +446,7 @@ { state = BAL_CHAMBER_STATE2_FILL_END; } - } +// } return state; } Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r3cc784af591b14e5d292f92c796db70bcbd5a40b -r9ff57b5ab7490ee5bbc2c51b25f738ee6c569ec1 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 3cc784af591b14e5d292f92c796db70bcbd5a40b) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 9ff57b5ab7490ee5bbc2c51b25f738ee6c569ec1) @@ -70,7 +70,7 @@ #define CONCENTRATE_PUMP_VOLUME_PER_PULSE ( CONCENTRATE_PUMP_VOLUME_PER_REV / CONCENTRATE_PUMP_PULSE_PER_REV ) #define CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is monitored. -#define CONCENTRATE_PUMP_CONTROL_INTERVAL ( 1 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is controlled. +#define CONCENTRATE_PUMP_CONTROL_INTERVAL ( 100 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is controlled. #define CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Concentrate pumps speed out of range timeout in milliseconds. #define NUMBER_OF_ACID_AND_BICARB_NV_DATA_TO_CHECK 1 ///< Number of acid and bicarb non-volatile data to check. Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -rf6022e86136c821709ce24b61e11e8e2bdf0b11e -r9ff57b5ab7490ee5bbc2c51b25f738ee6c569ec1 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision f6022e86136c821709ce24b61e11e8e2bdf0b11e) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 9ff57b5ab7490ee5bbc2c51b25f738ee6c569ec1) @@ -372,10 +372,18 @@ heatersStatus[ heater ].heaterOnState = FALSE; control[ heater ].data = HEATERS_MIN_DUTY_CYCLE; heatersStatus[ heater ].state = HEATER_EXEC_STATE_OFF; - heatersStatus[ D5_HEAT ].controlIntervalCounter = D5_HEAT_CONTROL_INTERVAL_START_COUNT; - heatersStatus[ D45_HEAT ].controlIntervalCounter = 0; startupHeaterControl = TRUE; + //Update control interval counter + if ( D5_HEAT == heater ) + { + heatersStatus[ D5_HEAT ].controlIntervalCounter = D5_HEAT_CONTROL_INTERVAL_START_COUNT; + } + else + { + heatersStatus[ D45_HEAT ].controlIntervalCounter = 0; + } + // update duty cycle setHeaterControl( heater ); } @@ -607,7 +615,7 @@ F32 measuredTemperature = 0.0F; F32 ctrl = 0.0F; - if( ++heatersStatus[ heater ].controlIntervalCounter > controlInterval[ heater ] ) + if ( ++heatersStatus[ heater ].controlIntervalCounter >= controlInterval[ heater ] ) { if ( D5_HEAT == heater ) { Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -rf6022e86136c821709ce24b61e11e8e2bdf0b11e -r9ff57b5ab7490ee5bbc2c51b25f738ee6c569ec1 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision f6022e86136c821709ce24b61e11e8e2bdf0b11e) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 9ff57b5ab7490ee5bbc2c51b25f738ee6c569ec1) @@ -43,6 +43,8 @@ #define HYD_CHAMBER_FLUID_TEMP_C_MIN 35.0F ///< Minimum hydraulics fluid temperature in deg celcius #define GEN_DIALYSATE_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen dialysate mode data published. +//Testing +#define DELAY_BYPASS_STATE_AT_START_UP ( 1 * MS_PER_SECOND ) ///< Provide a bypass state start up delay to stabilize pump speed etc., /// Payload record structure for Gen dialysate execution state set request typedef struct { @@ -60,6 +62,9 @@ static OVERRIDE_U32_T genDialysateDataPublishInterval; ///< Generate dialysate mode data publish interval. static F32 lastDialTargetTemperatureSet; ///< last dialysate target temperature set for heater control static BOOL isTreatmentParamUpdated; ///< To indicate change in treatment parameters +//Testing +static U32 bypassStateDelayStartTimeMS; ///< Delay balancing chamber switching for a second to preapre pump steady state. +static BOOL delayBypassStateFlag; ///< To indicate change in treatment parameters // ********** private function prototypes ********** @@ -104,6 +109,9 @@ genDialysateDataPublicationTimerCounter = 0; lastDialTargetTemperatureSet = 0.0F; isTreatmentParamUpdated = FALSE; + //Testing + bypassStateDelayStartTimeMS = 0; + delayBypassStateFlag = TRUE; //Initialize balancing chamber module initBalanceChamber(); @@ -175,30 +183,36 @@ targetHydChamberFluidTemp.data = getTDTargetDialysateTemperature(); // Turn on the primary heater setHeaterTargetTemperature( D5_HEAT, getGenDialysateTargetTemperature() ); - // TODO : For A1 Testing - //startHeater( D5_HEAT ); + startHeater( D5_HEAT ); lastDialTargetTemperatureSet = getGenDialysateTargetTemperature(); setValveState( D14_VALV, VALVE_STATE_OPEN ); - setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, FALSE ); + //Testing : Enable close loop once testing is complete + //setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, FALSE ); + setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve setValveState( D35_VALV, VALVE_STATE_CLOSED ); // VDI setValveState( D40_VALV, VALVE_STATE_CLOSED ); // VDO setValveState( D34_VALV, VALVE_STATE_OPEN ); // Bypass valve - setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, FALSE ); + //setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, FALSE ); + setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, TRUE ); transitionToBalChamberFill(); + + //Testing + bypassStateDelayStartTimeMS = getMSTimerCount(); break; case DD_GEND_DIALYSATE_DELIVERY_STATE: //Previous state setValveState( M4_VALV, VALVE_STATE_OPEN ); - //TODO : For A1 Testing - //startHeater( D5_HEAT ); + startHeater( D5_HEAT ); setValveState( D14_VALV, VALVE_STATE_OPEN ); - setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, FALSE ); + //setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, FALSE ); + setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve - setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, FALSE ); + //setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, FALSE ); + setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, TRUE ); // Disable bypass valve setValveState( D34_VALV, VALVE_STATE_CLOSED ); // Bypass valve @@ -381,8 +395,19 @@ { DD_GEND_MODE_STATE_T state = DD_GEND_DIALYSATE_BYPASS_STATE; - //Execute balancing chamber - execBalancingChamberControl(); + //Testing + if ( TRUE == delayBypassStateFlag ) + { + if ( TRUE == didTimeout( bypassStateDelayStartTimeMS, DELAY_BYPASS_STATE_AT_START_UP ) ) + { + delayBypassStateFlag = FALSE; + } + } + else + { + //Execute balancing chamber + execBalancingChamberControl(); + } //if the produced dialysate is good and TD asks for dialysate delivery //move to next state Index: firmware/App/Modes/ModeGenDialysate.h =================================================================== diff -u -rf6022e86136c821709ce24b61e11e8e2bdf0b11e -r9ff57b5ab7490ee5bbc2c51b25f738ee6c569ec1 --- firmware/App/Modes/ModeGenDialysate.h (.../ModeGenDialysate.h) (revision f6022e86136c821709ce24b61e11e8e2bdf0b11e) +++ firmware/App/Modes/ModeGenDialysate.h (.../ModeGenDialysate.h) (revision 9ff57b5ab7490ee5bbc2c51b25f738ee6c569ec1) @@ -32,7 +32,7 @@ // ********** public definitions ********** #define FRESH_DIAL_PUMP_INITIAL_RPM 2500 ///< Nominal RPM target for fresh dialysate pump to maintain required pressure. -#define SPENT_DIAL_PUMP_INITIAL_RPM 2000 ///< Nominal RPM target for spent dialysate pump to maintain required pressure. +#define SPENT_DIAL_PUMP_INITIAL_RPM 2500 ///< Nominal RPM target for spent dialysate pump to maintain required pressure. /// Generate dialysate mode data structure typedef struct Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r6408d79e3a9a543e90b2fa7ab823be348befd391 -r9ff57b5ab7490ee5bbc2c51b25f738ee6c569ec1 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 6408d79e3a9a543e90b2fa7ab823be348befd391) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 9ff57b5ab7490ee5bbc2c51b25f738ee6c569ec1) @@ -24,6 +24,7 @@ #include "ConcentratePumps.h" #include "DialysatePumps.h" #include "Heaters.h" +#include "FpgaDD.h" #include "Level.h" #include "Messaging.h" #include "MessagePayloads.h" @@ -228,7 +229,7 @@ &testHeaterPWMPeriodOverride, &testDDPreGenDialysateDataPublishIntervalOverride, &testDDPostGenDialysateDataPublishIntervalOverride, - &testDDStartPreGenDialysateOverride, //65 + &testDDStartPreGenDialysateOverride, //65 &handlePreGenDialysateRequestMsg, &testDDStopPreGenDialysateOverride, &testDDStopGenDialysateOverride, @@ -249,6 +250,9 @@ /// List of message IDs that are requested not to be transmitted. //static BLOCKED_MSGS_DATA_T blockedMessagesForXmit = { 0, 0, 0, 0, 0, 0, 0, 0 }; +/// UI version information +static UI_VERSIONS_T uiVersionRecord = { 0, 0, 0, 0, 0 }; + // ********** private function prototypes ********** static BOOL sendTestAckResponseMsg( MSG_ID_T msgID, BOOL ack ); @@ -642,7 +646,43 @@ return status; } +/*********************************************************************//** + * @brief + * The handleVersionRequestMessage function handles a UI request for DD + * version information. + * @details \b Message \b Sent: MSG_ID_DD_VERSION_REPONSE + * @details \b Inputs: none + * @details \b Outputs: UI version info. + * @param message Pointer to the UI version request message which contains + * the UI version information as well. + * @return TRUE if request handled successfully, FALSE if not + *************************************************************************/ +BOOL handleVersionRequestMessage( MESSAGE_T *message ) +{ + BOOL result = FALSE; + if ( message->hdr.payloadLen == sizeof( UI_VERSIONS_T ) ) + { + DD_VERSIONS_T ddVersionRecord; + + // Record UI version information + memcpy( (U08*)(&uiVersionRecord), &message->payload, sizeof( UI_VERSIONS_T ) ); + + // Build TD version record + ddVersionRecord.major = DD_VERSION_MAJOR; + ddVersionRecord.minor = DD_VERSION_MINOR; + ddVersionRecord.micro = DD_VERSION_MICRO; + ddVersionRecord.build = DD_VERSION_BUILD; + getFPGAVersions( &ddVersionRecord.fpgaId, &ddVersionRecord.fpgaMajor, &ddVersionRecord.fpgaMinor, &ddVersionRecord.fpgaLab ); + ddVersionRecord.compatibilityRev = SW_COMPATIBILITY_REV; + + // Send TD version information + result = sendMessage( MSG_ID_DD_VERSION_REPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&ddVersionRecord, sizeof( DD_VERSIONS_T ) ); + } + + return result; +} + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/