Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r44a100f8e5210a02c23b8fcc4527d8e96d577381 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 44a100f8e5210a02c23b8fcc4527d8e96d577381) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -71,7 +71,6 @@ static AIR_TRAP_STATE_T handleAirTrapValveClosedState( void ); static AIR_TRAP_STATE_T handleAirTrapValveOpenState( void ); static void publishAirTrapData( void ); -static U32 getPublishAirTrapDataInterval( void ); /*********************************************************************//** * @brief @@ -362,11 +361,7 @@ if ( sensor < NUM_OF_AIR_TRAP_LEVEL_SENSORS ) { - result = (AIR_TRAP_LEVELS_T)airTrapLevels[ sensor ].data; - if ( OVERRIDE_KEY == airTrapLevels[ sensor ].override ) - { - result = (AIR_TRAP_LEVELS_T)airTrapLevels[ sensor ].ovData; - } + result = (AIR_TRAP_LEVELS_T)getU32OverrideValue( &airTrapLevels[ sensor ] ); } else { @@ -379,26 +374,6 @@ /*********************************************************************//** * @brief - * The getPublishAirTrapDataInterval function gets the air trap data - * publication interval. - * @details Inputs: airTrapDataPublishInterval - * @details Outputs: none - * @return the current air trap data publication interval (in task intervals). - *************************************************************************/ -static U32 getPublishAirTrapDataInterval( void ) -{ - U32 result = airTrapDataPublishInterval.data; - - if ( OVERRIDE_KEY == airTrapDataPublishInterval.override ) - { - result = airTrapDataPublishInterval.ovData; - } - - return result; -} - -/*********************************************************************//** - * @brief * The publishAirTrapData function publishes air trap data at the set interval. * @details Inputs: airTrapLevels[] * @details Outputs: if broadcast is due, send air trap data @@ -407,7 +382,7 @@ static void publishAirTrapData( void ) { // Publish air trap data on interval - if ( ++airTrapDataPublicationTimerCounter >= getPublishAirTrapDataInterval() ) + if ( ++airTrapDataPublicationTimerCounter >= getU32OverrideValue( &airTrapDataPublishInterval ) ) { AIR_TRAP_LEVELS_T lowLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ); AIR_TRAP_LEVELS_T highLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ); Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -rabbad386f4cc94f315300dffef321fe8c03fbd52 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision abbad386f4cc94f315300dffef321fe8c03fbd52) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -49,10 +49,11 @@ #define MAX_BLOOD_PUMP_PWM_DUTY_CYCLE 0.89 ///< Controller will error if PWM duty cycle > 90%, so set max to 89% #define MIN_BLOOD_PUMP_PWM_DUTY_CYCLE 0.10 ///< Controller will error if PWM duty cycle < 10%, so set min to 10% +#define BP_CONTROL_INTERVAL_SEC 10 ///< Blood pump control interval (in seconds). /// Interval (ms/task time) at which the blood pump is controlled. -static const U32 BP_CONTROL_INTERVAL = ( 10000 / TASK_GENERAL_INTERVAL ); -#define BP_P_COEFFICIENT 0.00035 ///< P term for blood pump control -#define BP_I_COEFFICIENT 0.00035 ///< I term for blood pump control +static const U32 BP_CONTROL_INTERVAL = ( BP_CONTROL_INTERVAL_SEC * MS_PER_SECOND / TASK_GENERAL_INTERVAL ); +#define BP_P_COEFFICIENT 0.0001 ///< P term for blood pump control +#define BP_I_COEFFICIENT 0.00075 ///< I term for blood pump control #define BP_HOME_RATE 100 ///< Target pump speed (in estimate mL/min) for homing. #define BP_HOME_TIMEOUT_MS 10000 ///< Maximum time allowed for homing to complete (in ms). @@ -61,7 +62,9 @@ /// Number of hall sensor counts kept in buffer to hold last 1 second of count data. #define BP_SPEED_CALC_BUFFER_LEN ( MS_PER_SECOND / BP_SPEED_CALC_INTERVAL / TASK_PRIORITY_INTERVAL ) #define BP_MAX_ROTOR_SPEED_RPM 100.0 ///< Maximum rotor speed allowed for blood pump. - + +#define BP_MAX_FLOW_RATE 1320.0 ///< Maximum measured BP flow rate allowed. +#define BP_MIN_FLOW_RATE -1320.0 ///< Minimum measured BP flow rate allowed. #define BP_MAX_FLOW_VS_SPEED_DIFF_RPM 200.0 ///< Maximum difference between measured speed and speed implied by measured flow. #define BP_MAX_MOTOR_SPEED_WHILE_OFF_RPM 100.0 ///< Maximum motor speed (RPM) while motor is commanded off. #define BP_MAX_ROTOR_VS_MOTOR_DIFF_RPM 5.0 ///< Maximum difference in speed between motor and rotor (in rotor RPM). @@ -78,26 +81,25 @@ static const U32 BP_DIRECTION_ERROR_PERSIST = ( 250 ); /// Persist time period blood pump rotor speed too fast error condition. static const U32 BP_MAX_ROTOR_SPEED_ERROR_PERSIST = ( 1 * MS_PER_SECOND ); +/// Persist time (task intervals) blood flow rate out of range error condition. +static const U32 BP_MAX_FLOW_RATE_OUT_OF_RANGE_PERSIST = ((1 * MS_PER_SECOND) / TASK_PRIORITY_INTERVAL); #define BP_MAX_CURR_WHEN_STOPPED_MA 150.0 ///< Motor controller current should not exceed this when pump should be stopped #define BP_MAX_CURR_WHEN_RUNNING_MA 2000.0 ///< Motor controller current should not exceed this when pump should be running #define BP_MAX_CURR_ERROR_DURATION_MS 2000 ///< Motor controller current errors persisting beyond this duration will trigger an alarm -#ifndef V2_0_SYSTEM - #define BP_SPEED_ADC_TO_RPM_FACTOR 1.751752 ///< Conversion factor from ADC counts to RPM for blood pump motor - #define BP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00025 ///< ~40 BP motor RPM = 1% PWM duty cycle -#else - #define BP_SPEED_ADC_TO_RPM_FACTOR 1.280938 ///< Conversion factor from ADC counts to RPM for blood pump motor - #define BP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.0003125 ///< ~32 BP motor RPM = 1% PWM duty cycle -#endif +#define BP_SPEED_ADC_TO_RPM_FACTOR 1.751752 ///< Conversion factor from ADC counts to RPM for blood pump motor +#define BP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.000238 ///< ~42 BP motor RPM = 1% PWM duty cycle #define BP_CURRENT_ADC_TO_MA_FACTOR 3.002 ///< Conversion factor from ADC counts to mA for blood pump motor #define BP_REV_PER_LITER 150.0 ///< Rotor revolutions per liter #define BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( BP_REV_PER_LITER / ML_PER_LITER ) ///< Conversion factor from mL/min to motor RPM. #define BP_GEAR_RATIO 32.0 ///< Blood pump motor to blood pump gear ratio #define BP_PWM_ZERO_OFFSET 0.1 ///< 10% PWM duty cycle = zero speed -/// Conversion factor from mL/min to estimated PWM duty cycle %. -#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 ) +/// Conversion macro from mL/min to estimated PWM duty cycle %. +#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 ) +/// Conversion from PWM duty cycle % to commanded pump motor speed. +#define BP_PWM_TO_MOTOR_SPEED_RPM(pwm) ( ((pwm) - BP_PWM_ZERO_OFFSET) * 4000.0 ) #define BLOODPUMP_ADC_FULL_SCALE_V 3.0 ///< BP analog signals are 0-3V (while int. ADC ref may be different) #define BLOODPUMP_ADC_ZERO 1998 ///< Blood pump ADC channel zero offset. @@ -107,7 +109,7 @@ #define SIZE_OF_ROLLING_AVG ( ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) * 10 ) /// Blood flow sensor signal strength low alarm persistence. -#define FLOW_SIG_STRGTH_ALARM_PERSIST ( 5 * MS_PER_SECOND ) +#define FLOW_SIG_STRGTH_ALARM_PERSIST ( BP_CONTROL_INTERVAL_SEC * MS_PER_SECOND ) #define MIN_FLOW_SIG_STRENGTH 0.9 ///< Minimum flow sensor signal strength (90%). /// Blood flow fast read timeout alarm persistence. @@ -216,7 +218,6 @@ static void checkBloodPumpMCCurrent( void ); static void checkBloodFlowSensorSignalStrength( void ); static BOOL processCalibrationData( void ); -static U32 getPublishBloodFlowDataInterval( void ); /*********************************************************************//** * @brief @@ -254,11 +255,12 @@ initPersistentAlarm( ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK, 0, BP_ROTOR_SPEED_ERROR_PERSIST ); initPersistentAlarm( ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK, 0, BP_DIRECTION_ERROR_PERSIST ); initPersistentAlarm( ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_TOO_HIGH, 0, BP_MAX_ROTOR_SPEED_ERROR_PERSIST ); - initPersistentAlarm( ALARM_ID_BLOOD_FLOW_SIGNAL_STRENGTH_TOO_LOW, 0, FLOW_SIG_STRGTH_ALARM_PERSIST ); initPersistentAlarm( ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK, 0, BP_MAX_CURR_ERROR_DURATION_MS ); + initPersistentAlarm( ALARM_ID_BLOOD_FLOW_SIGNAL_STRENGTH_TOO_LOW, FLOW_SIG_STRGTH_ALARM_PERSIST, FLOW_SIG_STRGTH_ALARM_PERSIST ); initPersistentAlarm( ALARM_ID_HD_BP_FLOW_READ_TIMEOUT_ERROR, 0, BLOOD_FLOW_FAST_READ_TO_PERSIST ); initPersistentAlarm( ALARM_ID_HD_BP_FLOW_SLOW_READ_TIMEOUT_ERROR, 0, BLOOD_FLOW_SLOW_READ_TO_PERSIST ); initPersistentAlarm( ALARM_ID_HD_BP_FLOW_SENSOR_ERROR, 0, BLOOD_FLOW_COMM_ERROR_PERSIST ); + initPersistentAlarm( ALARM_ID_HD_BLOOD_FLOW_OUT_OF_RANGE, 0, BP_MAX_FLOW_RATE_OUT_OF_RANGE_PERSIST ); } /*********************************************************************//** @@ -279,8 +281,10 @@ // Direction change while pump is running is not allowed if ( ( FALSE == isBloodPumpOn ) || ( 0 == flowRate ) || ( dir == bloodPumpDirectionSet ) ) { +#ifndef NO_PUMP_FLOW_LIMITS // Verify flow rate - if ( flowRate <= MAX_BLOOD_FLOW_RATE ) + if ( flowRate <= MAX_SET_BLOOD_FLOW_RATE ) +#endif { resetBloodFlowMovingAverage(); targetBloodFlowRate = ( dir == MOTOR_DIR_FORWARD ? (S32)flowRate : (S32)flowRate * -1 ); @@ -319,10 +323,12 @@ } result = TRUE; } +#ifndef NO_PUMP_FLOW_LIMITS else // Requested flow rate too high { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_BLOOD_FLOW_SET_TOO_HIGH, flowRate ) - } + } +#endif } return result; @@ -608,14 +614,11 @@ else if ( bloodPumpPWMDutyCyclePctSet >= bloodPumpPWMDutyCyclePct ) { resetBloodFlowMovingAverage(); + bloodPumpPWMDutyCyclePctSet = bloodPumpPWMDutyCyclePct; resetPIController( PI_CONTROLLER_ID_BLOOD_FLOW, bloodPumpPWMDutyCyclePctSet ); bloodPumpControlModeSet = bloodPumpControlMode; - // If open loop mode, set PWM to requested duty cycle where it will stay during control state - if ( bloodPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) - { - bloodPumpPWMDutyCyclePctSet = bloodPumpPWMDutyCyclePct; - setBloodPumpControlSignalPWM( bloodPumpPWMDutyCyclePct ); - } + setBloodPumpControlSignalPWM( bloodPumpPWMDutyCyclePctSet ); + bpControlTimerCounter = 0; result = BLOOD_PUMP_CONTROL_TO_TARGET_STATE; } // Continue ramp up @@ -650,14 +653,11 @@ else if ( bloodPumpPWMDutyCyclePctSet <= bloodPumpPWMDutyCyclePct ) { resetBloodFlowMovingAverage(); + bloodPumpPWMDutyCyclePctSet = bloodPumpPWMDutyCyclePct; resetPIController( PI_CONTROLLER_ID_BLOOD_FLOW, bloodPumpPWMDutyCyclePctSet ); bloodPumpControlModeSet = bloodPumpControlMode; - // If open loop mode, set PWM to requested duty cycle where it will stay during control state - if ( bloodPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) - { - bloodPumpPWMDutyCyclePctSet = bloodPumpPWMDutyCyclePct; - setBloodPumpControlSignalPWM( bloodPumpPWMDutyCyclePct ); - } + setBloodPumpControlSignalPWM( bloodPumpPWMDutyCyclePctSet ); + bpControlTimerCounter = 0; result = BLOOD_PUMP_CONTROL_TO_TARGET_STATE; } // Continue ramp down @@ -725,7 +725,7 @@ static void stopBloodPump( void ) { isBloodPumpOn = FALSE; - bloodPumpPWMDutyCyclePctSet = 0.0; + bloodPumpPWMDutyCyclePctSet = BP_PWM_ZERO_OFFSET; etpwmSetCmpA( etpwmREG1, 0 ); SET_BP_STOP(); } @@ -773,33 +773,13 @@ /*********************************************************************//** * @brief - * The getPublishBloodFlowDataInterval function gets the blood flow data - * publication interval. - * @details Inputs: bloodFlowDataPublishInterval - * @details Outputs: none - * @return the current blood flow data publication interval (in task intervals). - *************************************************************************/ -U32 getPublishBloodFlowDataInterval( void ) -{ - U32 result = bloodFlowDataPublishInterval.data; - - if ( OVERRIDE_KEY == bloodFlowDataPublishInterval.override ) - { - result = bloodFlowDataPublishInterval.ovData; - } - - return result; -} - -/*********************************************************************//** - * @brief * The getMeasuredBloodFlowRate function gets the measured blood flow * rate. * @details Inputs: measuredBloodFlowRate * @details Outputs: none * @return the current blood flow rate (in mL/min). *************************************************************************/ -F32 getMeasuredBloodFlowRate( void ) +F32 getMeasuredBloodFlowRate( void ) { F32 result = measuredBloodFlowRate.data; @@ -839,7 +819,7 @@ * @details Outputs: none * @return the current blood flow rate (in mL/min). *************************************************************************/ -F32 getMeasuredBloodPumpRotorSpeed( void ) +F32 getMeasuredBloodPumpRotorSpeed( void ) { F32 result = bloodPumpRotorSpeedRPM.data; @@ -859,7 +839,7 @@ * @details Outputs: none * @return the current blood flow rate (in mL/min). *************************************************************************/ -F32 getMeasuredBloodPumpSpeed( void ) +F32 getMeasuredBloodPumpSpeed( void ) { F32 result = bloodPumpSpeedRPM.data; @@ -879,7 +859,7 @@ * @details Outputs: none * @return the current blood pump speed (in RPM). *************************************************************************/ -F32 getMeasuredBloodPumpMCSpeed( void ) +F32 getMeasuredBloodPumpMCSpeed( void ) { F32 result = adcBloodPumpMCSpeedRPM.data; @@ -899,7 +879,7 @@ * @details Outputs: none * @return the current blood pump current (in mA). *************************************************************************/ -F32 getMeasuredBloodPumpMCCurrent( void ) +F32 getMeasuredBloodPumpMCCurrent( void ) { F32 result = adcBloodPumpMCCurrentmA.data; @@ -923,7 +903,7 @@ static void publishBloodFlowData( void ) { // Publish blood flow data on interval - if ( ++bloodFlowDataPublicationTimerCounter >= getPublishBloodFlowDataInterval() ) + if ( ++bloodFlowDataPublicationTimerCounter >= getU32OverrideValue( &bloodFlowDataPublishInterval ) ) { BLOOD_PUMP_STATUS_PAYLOAD_T payload; @@ -1122,30 +1102,33 @@ static void checkBloodPumpSpeeds( void ) { F32 measMotorSpeed = fabs( getMeasuredBloodPumpSpeed() ); - S32 cmdRate = targetBloodFlowRate; + F32 measMCMotorSpeed = fabs( getMeasuredBloodPumpMCSpeed() ); // Check for pump running while commanded off - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_BLOOD_PUMP_OFF_CHECK, ( 0 == cmdRate ) && ( measMotorSpeed > BP_MAX_MOTOR_SPEED_WHILE_OFF_RPM ) ) ) + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_BLOOD_PUMP_OFF_CHECK, ( 0 == targetBloodFlowRate ) && ( measMotorSpeed > BP_MAX_MOTOR_SPEED_WHILE_OFF_RPM ) ) ) { #ifndef DISABLE_PUMP_SPEED_CHECKS SET_ALARM_WITH_1_F32_DATA( ALARM_ID_BLOOD_PUMP_OFF_CHECK, measMotorSpeed ); activateSafetyShutdown(); #endif } + // Checks that only occur when pump is running (and beyond ramp). if ( BLOOD_PUMP_CONTROL_TO_TARGET_STATE == bloodPumpState ) { - F32 cmdMotorSpeed = ( (F32)cmdRate / (F32)ML_PER_LITER ) * BP_REV_PER_LITER * BP_GEAR_RATIO; - F32 deltaMotorSpeed = fabs( measMotorSpeed - cmdMotorSpeed ); + F32 cmdMotorSpeed = BP_PWM_TO_MOTOR_SPEED_RPM( bloodPumpPWMDutyCyclePctSet ); + F32 deltaMotorSpeed = fabs( measMotorSpeed - cmdMotorSpeed ); + F32 deltaMCMotorSpeed = fabs( measMCMotorSpeed - cmdMotorSpeed ); F32 measRotorSpeed = getMeasuredBloodPumpRotorSpeed(); F32 measMotorSpeedInRotorRPM = measMotorSpeed / BP_GEAR_RATIO; F32 deltaRotorSpeed = fabs( measRotorSpeed - measMotorSpeedInRotorRPM ); // Check measured motor speed vs. commanded motor speed while controlling to target - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_BLOOD_PUMP_MOTOR_SPEED_CHECK, deltaMotorSpeed > BP_MAX_MOTOR_SPEED_ERROR_RPM ) ) + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_BLOOD_PUMP_MOTOR_SPEED_CHECK, + ( deltaMotorSpeed > BP_MAX_MOTOR_SPEED_ERROR_RPM ) || ( deltaMCMotorSpeed > BP_MAX_MOTOR_SPEED_ERROR_RPM ) ) ) { #ifndef DISABLE_PUMP_SPEED_CHECKS - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PUMP_MOTOR_SPEED_CHECK, (F32)cmdRate, measMotorSpeed ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PUMP_MOTOR_SPEED_CHECK, cmdMotorSpeed, measMotorSpeed ); #endif } @@ -1176,10 +1159,19 @@ *************************************************************************/ static void checkBloodPumpFlowAgainstSpeed( void ) { - // Check only performed while in treatment mode and while we are in control to target state + F32 flow = getMeasuredBloodFlowRate(); + + // Range check on measure BP flow rate. +#ifndef DISABLE_PUMP_FLOW_CHECKS + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BLOOD_FLOW_OUT_OF_RANGE, ( flow > BP_MAX_FLOW_RATE ) || ( flow < BP_MIN_FLOW_RATE ) ) ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_HD_BLOOD_FLOW_OUT_OF_RANGE, flow ); + } +#endif + + // Flow vs. speed check only performed while in treatment mode and while we are in control to target state if ( ( MODE_TREA == getCurrentOperationMode() ) && ( BLOOD_PUMP_CONTROL_TO_TARGET_STATE == bloodPumpState ) ) { - F32 flow = getMeasuredBloodFlowRate(); F32 speed = getMeasuredBloodPumpSpeed(); F32 impliedSpeed = ( flow / (F32)ML_PER_LITER ) * BP_REV_PER_LITER * BP_GEAR_RATIO; F32 delta = fabs( speed - impliedSpeed ); @@ -1334,6 +1326,7 @@ * TEST SUPPORT FUNCTIONS *************************************************************************/ + /*********************************************************************//** * @brief * The testSetBloodFlowDataPublishIntervalOverride function overrides the Index: firmware/App/Controllers/BloodFlow.h =================================================================== diff -u -rabbad386f4cc94f315300dffef321fe8c03fbd52 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision abbad386f4cc94f315300dffef321fe8c03fbd52) +++ firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -31,8 +31,8 @@ // ********** public definitions ********** -#define MAX_BLOOD_FLOW_RATE 500 ///< Maximum blood flow rate (in mL/min). -#define MIN_BLOOD_FLOW_RATE 100 ///< Minimum blood flow rate (in mL/min). +#define MAX_SET_BLOOD_FLOW_RATE 500 ///< Maximum blood flow rate (in mL/min). +#define MIN_SET_BLOOD_FLOW_RATE 100 ///< Minimum blood flow rate (in mL/min). #define SALINE_BOLUS_FLOW_RATE 150 ///< Saline bolus flow rate (in mL/min). #define VOLUME_PER_BP_MOTOR_REV_ML 0.2 ///< Theoretical volume (mL) of blood/saline volume per motor revolution. Index: firmware/App/Controllers/Bubble.c =================================================================== diff -u -rf007d2e06b612caed19e9c044fede4a100d2fc2f -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Controllers/Bubble.c (.../Bubble.c) (revision f007d2e06b612caed19e9c044fede4a100d2fc2f) +++ firmware/App/Controllers/Bubble.c (.../Bubble.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -60,7 +60,6 @@ static BUBBLE_STATES_T handleBubbleSelfTestState( BUBBLES_T ); static void publishBubblesData( void ); -static U32 getPublishBubblesDataInterval( void ); /*********************************************************************//** * @brief @@ -194,6 +193,7 @@ bubblesStatus[ bubble ].data = BUBBLE_DETECTED; } +#ifndef DISABLE_BUBBLE_ALARMS // Check status reading and act upon if ( BUBBLE_DETECTED == getBubbleStatus( bubble ) ) { @@ -246,6 +246,7 @@ clearAlarmCondition( ALARM_ID_HD_VENOUS_BUBBLE_DETECTED_RINSEBACK ); } } +#endif if ( TRUE == bubblesSelfTestRequested[ bubble ] ) { @@ -302,7 +303,7 @@ { activateAlarmNoData( ALARM_ID_HD_ARTERIAL_BUBBLE_SELF_TEST_FAILURE ); } - else if ( bubble == ADV ) + else // ADV { activateAlarmNoData( ALARM_ID_HD_VENOUS_BUBBLE_SELF_TEST_FAILURE ); } @@ -327,26 +328,6 @@ /*********************************************************************//** * @brief - * The getPublishBubblesDataInterval function gets the air bubbles data - * publication interval. - * @details Inputs: bubblesDataPublishInterval - * @details Outputs: none - * @return the current air bubbles data publication interval (in task intervals). - *************************************************************************/ -static U32 getPublishBubblesDataInterval( void ) -{ - U32 result = bubblesDataPublishInterval.data; - - if ( OVERRIDE_KEY == bubblesDataPublishInterval.override ) - { - result = bubblesDataPublishInterval.ovData; - } - - return result; -} - -/*********************************************************************//** - * @brief * The publishBubblesData function publishes air bubble detectors data at * the set interval. * @details Inputs: status, bubblesState @@ -356,7 +337,7 @@ static void publishBubblesData( void ) { // Publish air bubble detectors data on interval - if ( ++bubblesDataPublicationTimerCounter >= getPublishBubblesDataInterval() ) + if ( ++bubblesDataPublicationTimerCounter >= getU32OverrideValue( &bubblesDataPublishInterval ) ) { BUBBLE_STATUS_T statusADA = getBubbleStatus( ADA ); BUBBLE_STATUS_T statusADV = getBubbleStatus( ADV ); Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -rabbad386f4cc94f315300dffef321fe8c03fbd52 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision abbad386f4cc94f315300dffef321fe8c03fbd52) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -42,17 +42,18 @@ // ********** private definitions ********** /// Interval (ms/task time) at which the dialIn flow data is published on the CAN bus. -#define DIAL_IN_FLOW_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) +#define DIAL_IN_FLOW_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) -#define MAX_DIAL_IN_PUMP_PWM_STEP_UP_CHANGE 0.0133 ///< Max duty cycle change when ramping up ~ 200 mL/min/s. -#define MAX_DIAL_IN_PUMP_PWM_STEP_DN_CHANGE 0.02 ///< Max duty cycle change when ramping down ~ 300 mL/min/s. -#define MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.89 ///< Controller will error if PWM duty cycle > 90%, so set max to 89%. -#define MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.10 ///< Controller will error if PWM duty cycle < 10%, so set min to 10%. +#define MAX_DIAL_IN_PUMP_PWM_STEP_UP_CHANGE 0.0133 ///< Max duty cycle change when ramping up ~ 200 mL/min/s. +#define MAX_DIAL_IN_PUMP_PWM_STEP_DN_CHANGE 0.02 ///< Max duty cycle change when ramping down ~ 300 mL/min/s. +#define MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.89 ///< Controller will error if PWM duty cycle > 90%, so set max to 89%. +#define MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.10 ///< Controller will error if PWM duty cycle < 10%, so set min to 10%. +#define DIP_CONTROL_INTERVAL_SEC 10 ///< Dialysate inlet pump control interval (in seconds). /// Interval (ms/task time) at which the dialIn pump is controlled. -static const U32 DIP_CONTROL_INTERVAL = ( 10000 / TASK_GENERAL_INTERVAL ); -#define DIP_P_COEFFICIENT 0.00035 ///< P term for dialIn pump control. -#define DIP_I_COEFFICIENT 0.00035 ///< I term for dialIn pump control. +static const U32 DIP_CONTROL_INTERVAL = ( DIP_CONTROL_INTERVAL_SEC * MS_PER_SECOND / TASK_GENERAL_INTERVAL ); +#define DIP_P_COEFFICIENT 0.0001 ///< P term for dialIn pump control. +#define DIP_I_COEFFICIENT 0.00075 ///< I term for dialIn pump control. #define DIP_HOME_RATE 100 ///< Target pump speed (in estimate mL/min) for homing. #define DIP_HOME_TIMEOUT_MS 10000 ///< Maximum time allowed for homing to complete (in ms). @@ -62,6 +63,8 @@ #define DIP_SPEED_CALC_BUFFER_LEN ( 1000 / DIP_SPEED_CALC_INTERVAL / TASK_PRIORITY_INTERVAL ) #define DIP_HALL_EDGE_COUNTS_PER_REV 48 ///< Number of hall sensor edge counts per motor revolution. +#define DIP_MAX_FLOW_RATE 1320.0 ///< Maximum measured BP flow rate allowed. +#define DIP_MIN_FLOW_RATE -1320.0 ///< Minimum measured BP flow rate allowed. #define DIP_MAX_FLOW_VS_SPEED_DIFF_RPM 200.0 ///< Maximum difference between measured motor speed and speed implied by measured flow. #define DIP_MAX_MOTOR_SPEED_WHILE_OFF_RPM 100.0 ///< Maximum motor speed (RPM) while motor is commanded off. #define DIP_MAX_ROTOR_VS_MOTOR_DIFF_RPM 5.0 ///< Maximum difference in speed between motor and rotor (in rotor RPM). @@ -77,19 +80,15 @@ static const U32 DIP_ROTOR_SPEED_ERROR_PERSIST = ((12 * MS_PER_SECOND) / TASK_PRIORITY_INTERVAL); /// Persist time (task intervals) pump direction error condition. static const U32 DIP_DIRECTION_ERROR_PERSIST = (250 / TASK_PRIORITY_INTERVAL); +/// Persist time (task intervals) dialysate flow rate out of range error condition. +static const U32 DIP_MAX_FLOW_RATE_OUT_OF_RANGE_PERSIST = ((1 * MS_PER_SECOND) / TASK_PRIORITY_INTERVAL); - #define DIP_MAX_CURR_WHEN_STOPPED_MA 150.0 ///< Motor controller current should not exceed this when pump should be stopped. #define DIP_MAX_CURR_WHEN_RUNNING_MA 2000.0 ///< Motor controller current should not exceed this when pump should be running. #define DIP_MAX_CURR_ERROR_DURATION_MS 2000 ///< Motor controller current errors persisting beyond this duration will trigger an alarm. -#ifndef V2_0_SYSTEM - #define DIP_SPEED_ADC_TO_RPM_FACTOR 1.751752 ///< Conversion factor from ADC counts to RPM for dialIn pump motor. - #define DIP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00025 ///< ~40 BP motor RPM = 1% PWM duty cycle -#else - #define DIP_SPEED_ADC_TO_RPM_FACTOR 1.280938 ///< Conversion factor from ADC counts to RPM for blood pump motor - #define DIP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.0003125 ///< ~32 BP motor RPM = 1% PWM duty cycle -#endif +#define DIP_SPEED_ADC_TO_RPM_FACTOR 1.751752 ///< Conversion factor from ADC counts to RPM for dialIn pump motor. +#define DIP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.000193 ///< ~52 BP motor RPM = 1% PWM duty cycle #define DIP_CURRENT_ADC_TO_MA_FACTOR 3.002 ///< Conversion factor from ADC counts to mA for dialIn pump motor. #define DIP_REV_PER_LITER 150.0 ///< Rotor revolutions per liter. @@ -99,14 +98,16 @@ #define DIP_PWM_ZERO_OFFSET 0.1 ///< 10% PWM duty cycle = zero speed. /// Macro converts flow rate to estimate PWM needed to achieve it. #define DIP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * DIP_GEAR_RATIO * DIP_MOTOR_RPM_TO_PWM_DC_FACTOR + DIP_PWM_ZERO_OFFSET ) +/// Conversion from PWM duty cycle % to commanded pump motor speed. +#define DIP_PWM_TO_MOTOR_SPEED_RPM(pwm) ( ((pwm) - DIP_PWM_ZERO_OFFSET) * 4000.0 ) #define DIAL_IN_PUMP_ADC_FULL_SCALE_V 3.0 ///< BP analog signals are 0-3V (while int. ADC ref V may be different). #define DIAL_IN_PUMP_ADC_ZERO 1998 ///< Mid-point (zero) for ADC readings. ///< Macro converts a 12-bit ADC reading to a signed 16-bit value. #define SIGN_FROM_12_BIT_VALUE(v) ( (S16)(v) - (S16)DIAL_IN_PUMP_ADC_ZERO ) /// Measured dialIn flow is filtered w/ moving average. -#define SIZE_OF_ROLLING_AVG ( ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) * 10 ) +#define SIZE_OF_ROLLING_AVG ( ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) * DIP_CONTROL_INTERVAL_SEC ) /// Dialysate flow sensor signal strength low alarm persistence. #define FLOW_SIG_STRGTH_ALARM_PERSIST ( 5 * MS_PER_SECOND ) @@ -223,7 +224,6 @@ static void checkDialInPumpFlowAgainstSpeed( void ); static void checkDialInPumpMCCurrent( void ); static void checkDialInFlowSensorSignalStrength( void ); -static U32 getPublishDialInFlowDataInterval( void ); static BOOL processCalibrationData( void ); /*********************************************************************//** @@ -260,6 +260,7 @@ initPersistentAlarm( ALARM_ID_HD_DP_FLOW_READ_TIMEOUT_ERROR, 0, DIALYSATE_FLOW_FAST_READ_TO_PERSIST ); initPersistentAlarm( ALARM_ID_HD_DP_FLOW_SLOW_READ_TIMEOUT_ERROR, 0, DIALYSATE_FLOW_SLOW_READ_TO_PERSIST ); initPersistentAlarm( ALARM_ID_HD_DP_FLOW_SENSOR_ERROR, 0, DIALYSATE_FLOW_COMM_ERROR_PERSIST ); + initPersistentAlarm( ALARM_ID_HD_DIAL_IN_FLOW_OUT_OF_RANGE, 0, DIP_MAX_FLOW_RATE_OUT_OF_RANGE_PERSIST ); } /*********************************************************************//** @@ -280,8 +281,10 @@ // Direction change while pump is running is not allowed if ( ( FALSE == isDialInPumpOn ) || ( 0 == flowRate ) || ( dir == dialInPumpDirectionSet ) ) { +#ifndef NO_PUMP_FLOW_LIMITS // Verify flow rate - if ( flowRate <= MAX_DIAL_IN_FLOW_RATE ) + if ( flowRate <= MAX_DIAL_IN_FLOW_RATE ) +#endif { resetDialInFlowMovingAverage(); targetDialInFlowRate = ( dir == MOTOR_DIR_FORWARD ? (S32)flowRate : (S32)flowRate * -1 ); @@ -320,10 +323,12 @@ } result = TRUE; } +#ifndef NO_PUMP_FLOW_LIMITS else // Requested flow rate too high { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_DIAL_IN_FLOW_SET_TOO_HIGH, flowRate ) - } + } +#endif } return result; @@ -579,14 +584,11 @@ else if ( dialInPumpPWMDutyCyclePctSet >= dialInPumpPWMDutyCyclePct ) { resetDialInFlowMovingAverage(); + dialInPumpPWMDutyCyclePctSet = dialInPumpPWMDutyCyclePct; resetPIController( PI_CONTROLLER_ID_DIALYSATE_FLOW, dialInPumpPWMDutyCyclePctSet ); dialInPumpControlModeSet = dialInPumpControlMode; - // If open loop mode, set PWM to requested duty cycle where it will stay during control state - if ( dialInPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) - { - dialInPumpPWMDutyCyclePctSet = dialInPumpPWMDutyCyclePct; - setDialInPumpControlSignalPWM( dialInPumpPWMDutyCyclePct ); - } + setDialInPumpControlSignalPWM( dialInPumpPWMDutyCyclePctSet ); + dipControlTimerCounter = 0; result = DIAL_IN_PUMP_CONTROL_TO_TARGET_STATE; } // Continue ramp up @@ -621,14 +623,11 @@ else if ( dialInPumpPWMDutyCyclePctSet <= dialInPumpPWMDutyCyclePct ) { resetDialInFlowMovingAverage(); + dialInPumpPWMDutyCyclePctSet = dialInPumpPWMDutyCyclePct; resetPIController( PI_CONTROLLER_ID_DIALYSATE_FLOW, dialInPumpPWMDutyCyclePctSet ); dialInPumpControlModeSet = dialInPumpControlMode; - // If open loop mode, set PWM to requested duty cycle where it will stay during control state - if ( dialInPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) - { - dialInPumpPWMDutyCyclePctSet = dialInPumpPWMDutyCyclePct; - setDialInPumpControlSignalPWM( dialInPumpPWMDutyCyclePct ); - } + setDialInPumpControlSignalPWM( dialInPumpPWMDutyCyclePctSet ); + dipControlTimerCounter = 0; result = DIAL_IN_PUMP_CONTROL_TO_TARGET_STATE; } // Continue ramp down @@ -696,7 +695,7 @@ static void stopDialInPump( void ) { isDialInPumpOn = FALSE; - dialInPumpPWMDutyCyclePctSet = 0.0; + dialInPumpPWMDutyCyclePctSet = DIP_PWM_ZERO_OFFSET; etpwmSetCmpA( etpwmREG2, 0 ); SET_DIP_STOP(); } @@ -744,26 +743,6 @@ /*********************************************************************//** * @brief - * The getPublishDialInFlowDataInterval function gets the dialIn flow data - * publication interval. - * @details Inputs: dialInFlowDataPublishInterval - * @details Outputs: none - * @return the current dialIn flow data publication interval (in task intervals). - *************************************************************************/ -U32 getPublishDialInFlowDataInterval( void ) -{ - U32 result = dialInFlowDataPublishInterval.data; - - if ( OVERRIDE_KEY == dialInFlowDataPublishInterval.override ) - { - result = dialInFlowDataPublishInterval.ovData; - } - - return result; -} - -/*********************************************************************//** - * @brief * The processCalibrationData function gets the calibration data and makes * sure it is valid by checking the calibration date. The calibration date * should not be 0. @@ -939,6 +918,19 @@ } return result; +} + +/*********************************************************************//** + * @brief + * The getDialInPumpPWMDutyCyclePct function gets the current dialIn pump + * PWM duty cycle percentage. + * @details Inputs: dialInPumpPWMDutyCyclePctSet + * @details Outputs: none + * @return the current dialIn pump PWM duty cycle percentage (0..1). + *************************************************************************/ +F32 getDialInPumpPWMDutyCyclePct( void ) +{ + return dialInPumpPWMDutyCyclePctSet; } /*********************************************************************//** @@ -953,7 +945,7 @@ static void publishDialInFlowData( void ) { // Publish dialIn flow data on interval - if ( ++dialInFlowDataPublicationTimerCounter >= getPublishDialInFlowDataInterval() ) + if ( ++dialInFlowDataPublicationTimerCounter >= getU32OverrideValue( &dialInFlowDataPublishInterval ) ) { DIALIN_PUMP_STATUS_PAYLOAD_T payload; @@ -1147,10 +1139,10 @@ static void checkDialInPumpSpeeds( void ) { F32 measMotorSpeed = getMeasuredDialInPumpSpeed(); - S32 cmdRate = targetDialInFlowRate; + F32 measMCMotorSpeed = fabs( getMeasuredDialInPumpMCSpeed() ); // Check for pump running while commanded off - if ( 0 == cmdRate ) + if ( 0 == targetDialInFlowRate ) { if ( measMotorSpeed > DIP_MAX_MOTOR_SPEED_WHILE_OFF_RPM ) { @@ -1172,21 +1164,23 @@ errorDialInMotorOffPersistTimerCtr = 0; } + // Checks that only occur when pump is running (and beyond ramp). if ( DIAL_IN_PUMP_CONTROL_TO_TARGET_STATE == dialInPumpState ) { - F32 cmdMotorSpeed = ( (F32)cmdRate / (F32)ML_PER_LITER ) * DIP_REV_PER_LITER * DIP_GEAR_RATIO; + F32 cmdMotorSpeed = DIP_PWM_TO_MOTOR_SPEED_RPM( dialInPumpPWMDutyCyclePctSet ); F32 deltaMotorSpeed = fabs( measMotorSpeed - cmdMotorSpeed ); + F32 deltaMCMotorSpeed = fabs( measMCMotorSpeed - cmdMotorSpeed ); F32 measRotorSpeed = getMeasuredDialInPumpRotorSpeed(); F32 measMotorSpeedInRotorRPM = measMotorSpeed / DIP_GEAR_RATIO; F32 deltaRotorSpeed = fabs( measRotorSpeed - measMotorSpeedInRotorRPM ); // Check measured motor speed vs. commanded motor speed while controlling to target - if ( deltaMotorSpeed > DIP_MAX_MOTOR_SPEED_ERROR_RPM ) + if ( ( deltaMotorSpeed > DIP_MAX_MOTOR_SPEED_ERROR_RPM ) || ( deltaMCMotorSpeed > DIP_MAX_MOTOR_SPEED_ERROR_RPM ) ) { if ( ++errorDialInMotorSpeedPersistTimerCtr >= DIP_MOTOR_SPEED_ERROR_PERSIST ) { #ifndef DISABLE_PUMP_SPEED_CHECKS - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DIAL_IN_PUMP_MOTOR_SPEED_CHECK, (F32)cmdRate, measMotorSpeed ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DIAL_IN_PUMP_MOTOR_SPEED_CHECK, cmdMotorSpeed, measMotorSpeed ); #endif } } @@ -1230,6 +1224,16 @@ *************************************************************************/ static void checkDialInPumpFlowAgainstSpeed( void ) { + F32 flow = getMeasuredDialInFlowRate(); + + // Range check on measure DPi flow rate. +#ifndef DISABLE_PUMP_FLOW_CHECKS + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_DIAL_IN_FLOW_OUT_OF_RANGE, ( flow > DIP_MAX_FLOW_RATE ) || ( flow < DIP_MIN_FLOW_RATE ) ) ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_HD_DIAL_IN_FLOW_OUT_OF_RANGE, flow ); + } +#endif + // Check only performed while in treatment mode and while we are in control to target state if ( ( MODE_TREA == getCurrentOperationMode() ) && ( DIAL_IN_PUMP_CONTROL_TO_TARGET_STATE == dialInPumpState ) ) { Index: firmware/App/Controllers/DialInFlow.h =================================================================== diff -u -r60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Controllers/DialInFlow.h (.../DialInFlow.h) (revision 60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f) +++ firmware/App/Controllers/DialInFlow.h (.../DialInFlow.h) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -71,8 +71,6 @@ F32 getMeasuredDialInPumpMCCurrent( void ); F32 getDialInPumpPWMDutyCyclePct( void ); -BOOL setDialInFlowCalibration( F32 gain, F32 offset ); -void getDialInFlowCalibration( F32 *gain, F32 *offset ); BOOL testSetDialInFlowDataPublishIntervalOverride( U32 value ); BOOL testResetDialInFlowDataPublishIntervalOverride( void ); BOOL testSetTargetDialInFlowRateOverride( S32 value, U32 ctrlMode ); Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r5e85dc21e918ecdae841f8398bca20ff8823c52b -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 5e85dc21e918ecdae841f8398bca20ff8823c52b) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -44,16 +44,18 @@ #define MAX_DIAL_OUT_FLOW_RATE 650 ///< Maximum dialysate outlet pump flow rate in mL/min. #define MIN_DIAL_OUT_FLOW_RATE 100 ///< Minimum dialysate outlet pump flow rate in mL/min. -#define DPO_FLOW_ADJ_DUE_TO_HIGHER_INLET_PRES 1.200 ///< Adjustment factor to account for higher pump inlet pressure (than DPi pump inlet). #define MAX_DIAL_OUT_PUMP_PWM_STEP_UP_CHANGE 0.0133 ///< Maximum duty cycle change when ramping up ~ 200 mL/min/s. #define MAX_DIAL_OUT_PUMP_PWM_STEP_DN_CHANGE 0.02 ///< Maximum duty cycle change when ramping down ~ 300 mL/min/s. #define MAX_DIAL_OUT_PUMP_PWM_DUTY_CYCLE 0.89 ///< Controller will error if PWM duty cycle > 90%, so set max to 89%. #define MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE 0.10 ///< Controller will error if PWM duty cycle < 10%, so set min to 10%. +#define MAX_DIAL_OUT_PUMP_PWM_OFFSET_CONTROL 0.4 ///< Maximum PWM offset (added to DPi PWM duty cycle). +#define MIN_DIAL_OUT_PUMP_PWM_OFFSET_CONTROL -0.4 ///< Minimum PWM offset (added to DPi PWM duty cycle). +#define DOP_CONTROL_INTERVAL_SEC 5 ///< Dialysate outlet pump control interval (in seconds). /// Interval (ms/task time) at which the dialysate outlet pump is controlled. -static const U32 DOP_CONTROL_INTERVAL = ( 2000 / TASK_GENERAL_INTERVAL ); -#define DOP_P_COEFFICIENT 0.0050 ///< P term for dialysate outlet pump control. +static const U32 DOP_CONTROL_INTERVAL = ( DOP_CONTROL_INTERVAL_SEC * MS_PER_SECOND / TASK_GENERAL_INTERVAL ); +#define DOP_P_COEFFICIENT 0.0010 ///< P term for dialysate outlet pump control. #define DOP_I_COEFFICIENT 0.0001 ///< I term for dialysate outlet pump control. #define DOP_HOME_RATE 100 ///< Target pump speed (in estimate mL/min) for homing. @@ -81,13 +83,9 @@ #define DOP_MAX_CURR_WHEN_RUNNING_MA 2000.0 ///< Motor controller current should not exceed this when pump should be running. #define DOP_MAX_CURR_ERROR_DURATION_MS 2000 ///< Motor controller current errors persisting beyond this duration will trigger an alarm. -#ifndef V2_0_SYSTEM - #define DOP_SPEED_ADC_TO_RPM_FACTOR 1.751752 ///< Conversion factor from ADC counts to RPM for dialysate outlet pump motor. - #define DOP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00025 ///< ~40 BP motor RPM = 1% PWM duty cycle -#else - #define DOP_SPEED_ADC_TO_RPM_FACTOR 1.280938 ///< Conversion factor from ADC counts to RPM for blood pump motor - #define DOP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.0003125 ///< ~32 BP motor RPM = 1% PWM duty cycle -#endif +#define DOP_SPEED_ADC_TO_RPM_FACTOR 1.751752 ///< Conversion factor from ADC counts to RPM for dialysate outlet pump motor. +#define DOP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.000193 ///< ~52 BP motor RPM = 1% PWM duty cycle +#define UF_PWM_DC_PCT_PER_ML_PER_MIN 0.004 ///< Estimated DPo PWM duty cycle amount per each mL/min of ultrafiltration desired. #define DOP_CURRENT_ADC_TO_MA_FACTOR 3.002 ///< Conversion factor from ADC counts to mA for dialysate outlet pump motor. #define DOP_ADC_FULL_SCALE_V 3.0 ///< DPo analog signals are 0-3V (while int. ADC ref V may be different). #define DOP_ADC_ZERO 1998 ///< Mid-point (zero) for ADC readings. @@ -101,6 +99,8 @@ #define DOP_PWM_ZERO_OFFSET 0.1 ///< 10% PWM duty cycle = zero speed. /// Macro converts a flow rate to an estimated PWM duty cycle %. #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 ) +/// Conversion from PWM duty cycle % to commanded pump motor speed. +#define DOP_PWM_TO_MOTOR_SPEED_RPM(pwm) ( ((pwm) - DOP_PWM_ZERO_OFFSET) * 4000.0 ) #define PUMP_DIR_ERROR_COUNT_MASK 0x3F ///< Bit mask for pump direction error counter. @@ -190,8 +190,6 @@ static void checkDialOutPumpSpeeds( void ); static void checkDialOutPumpMCCurrent( void ); -static U32 getPublishDialOutDataInterval( void ); - /*********************************************************************//** * @brief * The initDialOutFlow function initializes the DialOutFlow module. @@ -214,9 +212,8 @@ } // Initialize dialysate outlet flow PI controller - initializePIController( PI_CONTROLLER_ID_ULTRAFILTRATION, MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE, - DOP_P_COEFFICIENT, DOP_I_COEFFICIENT, - MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_OUT_PUMP_PWM_DUTY_CYCLE ); + initializePIController( PI_CONTROLLER_ID_ULTRAFILTRATION, 0.0, DOP_P_COEFFICIENT, DOP_I_COEFFICIENT, + MIN_DIAL_OUT_PUMP_PWM_OFFSET_CONTROL, MAX_DIAL_OUT_PUMP_PWM_OFFSET_CONTROL ); } /*********************************************************************//** @@ -237,15 +234,13 @@ // Direction change while pump is running is not allowed if ( ( FALSE == isDialOutPumpOn ) || ( 0 == flowRate ) || ( dir == dialOutPumpDirectionSet ) ) { +#ifndef NO_PUMP_FLOW_LIMITS // Verify flow rate if ( flowRate <= MAX_DIAL_OUT_FLOW_RATE ) +#endif { F32 adjFlow = (F32)flowRate; - if ( PUMP_CONTROL_MODE_CLOSED_LOOP == mode ) - { - adjFlow *= DPO_FLOW_ADJ_DUE_TO_HIGHER_INLET_PRES; - } lastGivenRate = flowRate; dialOutPumpDirection = dir; dialOutPumpControlMode = mode; @@ -283,10 +278,12 @@ } result = TRUE; } +#ifndef NO_PUMP_FLOW_LIMITS else // Requested flow rate too high { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_DIAL_OUT_FLOW_SET_TOO_HIGH, flowRate ) } +#endif } return result; @@ -511,14 +508,18 @@ // Have we reached end of ramp up? else if ( dialOutPumpPWMDutyCyclePctSet >= dialOutPumpPWMDutyCyclePct ) { - resetPIController( PI_CONTROLLER_ID_ULTRAFILTRATION, dialOutPumpPWMDutyCyclePctSet ); - dialOutPumpControlModeSet = dialOutPumpControlMode; - // If open loop mode, set PWM to requested duty cycle where it will stay during control state - if ( dialOutPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) + dialOutPumpPWMDutyCyclePctSet = dialOutPumpPWMDutyCyclePct; + if ( dialOutPumpControlMode == PUMP_CONTROL_MODE_OPEN_LOOP ) { - dialOutPumpPWMDutyCyclePctSet = dialOutPumpPWMDutyCyclePct; - setDialOutPumpControlSignalPWM( dialOutPumpPWMDutyCyclePct ); + resetPIController( PI_CONTROLLER_ID_ULTRAFILTRATION, dialOutPumpPWMDutyCyclePctSet ); } + else + { // Closed loop UF control is only controlling offset from DPi PWM + resetPIController( PI_CONTROLLER_ID_ULTRAFILTRATION, (F32)( (S32)lastGivenRate - getTargetDialInFlowRate() ) * UF_PWM_DC_PCT_PER_ML_PER_MIN ); + } + dialOutPumpControlModeSet = dialOutPumpControlMode; + setDialOutPumpControlSignalPWM( dialOutPumpPWMDutyCyclePctSet ); + dopControlTimerCounter = 0; result = DIAL_OUT_PUMP_CONTROL_TO_TARGET_STATE; } // Continue ramp up @@ -552,14 +553,18 @@ // Have we reached end of ramp down? else if ( dialOutPumpPWMDutyCyclePctSet <= dialOutPumpPWMDutyCyclePct ) { - resetPIController( PI_CONTROLLER_ID_ULTRAFILTRATION, dialOutPumpPWMDutyCyclePctSet ); - dialOutPumpControlModeSet = dialOutPumpControlMode; - // If open loop mode, set PWM to requested duty cycle where it will stay during control state - if ( dialOutPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) + dialOutPumpPWMDutyCyclePctSet = dialOutPumpPWMDutyCyclePct; + if ( ( dialOutPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) || ( 0 == lastGivenRate ) ) { - dialOutPumpPWMDutyCyclePctSet = dialOutPumpPWMDutyCyclePct; - setDialOutPumpControlSignalPWM( dialOutPumpPWMDutyCyclePct ); + resetPIController( PI_CONTROLLER_ID_ULTRAFILTRATION, dialOutPumpPWMDutyCyclePctSet ); } + else + { // Closed loop UF control is only controlling offset from DPi PWM + resetPIController( PI_CONTROLLER_ID_ULTRAFILTRATION, (F32)( (S32)lastGivenRate - getTargetDialInFlowRate() ) * UF_PWM_DC_PCT_PER_ML_PER_MIN ); + } + dialOutPumpControlModeSet = dialOutPumpControlMode; + setDialOutPumpControlSignalPWM( dialOutPumpPWMDutyCyclePctSet ); + dopControlTimerCounter = 0; result = DIAL_OUT_PUMP_CONTROL_TO_TARGET_STATE; } // Continue ramp down @@ -591,22 +596,17 @@ { F32 refVol = getTotalTargetDialOutUFVolumeInMl(); F32 totVol = getTotalMeasuredUFVolumeInMl(); - F32 newPWMDutyCyclePct; - F32 deltaPWMDutyCyclePct; + F32 offsetPWMDutyCyclePct; - // Get new PWM from PI controller - newPWMDutyCyclePct = runPIController( PI_CONTROLLER_ID_ULTRAFILTRATION, refVol, totVol ); - // Limit PWM change to max - deltaPWMDutyCyclePct = newPWMDutyCyclePct - dialOutPumpPWMDutyCyclePctSet; - if ( fabs( deltaPWMDutyCyclePct ) > MAX_DIAL_OUT_PUMP_PWM_STEP_UP_CHANGE ) - { - newPWMDutyCyclePct = ( deltaPWMDutyCyclePct < 0.0 ? \ - dialOutPumpPWMDutyCyclePctSet - MAX_DIAL_OUT_PUMP_PWM_STEP_UP_CHANGE : \ - dialOutPumpPWMDutyCyclePctSet + MAX_DIAL_OUT_PUMP_PWM_STEP_UP_CHANGE ); - } - // Set new PWM - dialOutPumpPWMDutyCyclePctSet = newPWMDutyCyclePct; - setDialOutPumpControlSignalPWM( newPWMDutyCyclePct ); + // Get new PWM offset from PI controller + offsetPWMDutyCyclePct = runPIController( PI_CONTROLLER_ID_ULTRAFILTRATION, refVol, totVol ); + // Add PWM offset to DPi PWM mirror for our new DPo PWM + dialOutPumpPWMDutyCyclePctSet = getDialInPumpPWMDutyCyclePct() + offsetPWMDutyCyclePct; + // Limit PWM range + dialOutPumpPWMDutyCyclePctSet = MIN( dialOutPumpPWMDutyCyclePctSet, MAX_DIAL_OUT_PUMP_PWM_DUTY_CYCLE ); + dialOutPumpPWMDutyCyclePctSet = MAX( dialOutPumpPWMDutyCyclePctSet, MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE ); + // Apply new PWM to DPo pump + setDialOutPumpControlSignalPWM( dialOutPumpPWMDutyCyclePctSet ); } dopControlTimerCounter = 0; } @@ -638,7 +638,7 @@ *************************************************************************/ static void stopDialOutPump( void ) { - dialOutPumpPWMDutyCyclePctSet = 0.0; + dialOutPumpPWMDutyCyclePctSet = DOP_PWM_ZERO_OFFSET; setDialOutPumpControlSignalPWM( 0 ); SET_DOP_STOP(); isDialOutPumpOn = FALSE; @@ -696,7 +696,7 @@ static void publishDialOutFlowData( void ) { // Publish dialysate outlet pump and UF volume data on interval - if ( ++dialOutFlowDataPublicationTimerCounter >= getPublishDialOutDataInterval() ) + if ( ++dialOutFlowDataPublicationTimerCounter >= getU32OverrideValue( &dialOutDataPublishInterval ) ) { DIAL_OUT_FLOW_DATA_T dialOutBroadCastVariables; @@ -850,9 +850,10 @@ static void checkDialOutPumpSpeeds( void ) { F32 measMotorSpeed = getMeasuredDialOutPumpSpeed(); + F32 measMCMotorSpeed = fabs( getMeasuredDialOutPumpMCSpeed() ); // Check for pump running while commanded off - if ( FALSE == isDialOutPumpOn ) + if ( dialOutPumpPWMDutyCyclePctSet > DOP_PWM_ZERO_OFFSET ) { if ( measMotorSpeed > DOP_MAX_MOTOR_SPEED_WHILE_OFF_RPM ) { @@ -876,19 +877,20 @@ if ( DIAL_OUT_PUMP_CONTROL_TO_TARGET_STATE == dialOutPumpState ) { - F32 controllerMotorSpeed = getMeasuredDialOutPumpMCSpeed(); - F32 deltaMotorSpeed = fabs( measMotorSpeed - controllerMotorSpeed ); + F32 cmdMotorSpeed = DOP_PWM_TO_MOTOR_SPEED_RPM( dialOutPumpPWMDutyCyclePctSet ); + F32 deltaMotorSpeed = fabs( measMotorSpeed - cmdMotorSpeed ); + F32 deltaMCMotorSpeed = fabs( measMCMotorSpeed - cmdMotorSpeed ); F32 measRotorSpeed = getMeasuredDialOutPumpRotorSpeed(); F32 measMotorSpeedInRotorRPM = measMotorSpeed / DOP_GEAR_RATIO; F32 deltaRotorSpeed = fabs( measRotorSpeed - measMotorSpeedInRotorRPM ); // Check measured motor speed vs. commanded motor speed while controlling to target - if ( deltaMotorSpeed > DOP_MAX_MOTOR_SPEED_ERROR_RPM ) + if ( ( deltaMotorSpeed > DOP_MAX_MOTOR_SPEED_ERROR_RPM ) || ( deltaMCMotorSpeed > DOP_MAX_MOTOR_SPEED_ERROR_RPM ) ) { if ( ++errorDialOutMotorSpeedPersistTimerCtr >= DOP_MOTOR_SPEED_ERROR_PERSIST ) { #ifndef DISABLE_PUMP_SPEED_CHECKS - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DIAL_OUT_PUMP_MOTOR_SPEED_CHECK, controllerMotorSpeed, measMotorSpeed ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DIAL_OUT_PUMP_MOTOR_SPEED_CHECK, cmdMotorSpeed, measMotorSpeed ); #endif } } @@ -979,26 +981,6 @@ /*********************************************************************//** * @brief - * The getPublishDialOutFlowDataInterval function gets the dialysate out flow - * data publication interval. - * @details Inputs: dialOutDataPublishInterval - * @details Outputs: none - * @return the current dialysate out flow data publication interval (in ms). - *************************************************************************/ -static U32 getPublishDialOutDataInterval( void ) -{ - U32 result = dialOutDataPublishInterval.data; - - if ( OVERRIDE_KEY == dialOutDataPublishInterval.override ) - { - result = dialOutDataPublishInterval.ovData; - } - - return result; -} - -/*********************************************************************//** - * @brief * The getTotalTargetDialOutUFVolumeInMl function gets the target UF volume. * @details Inputs: referenceUFVolumeInMl * @details Outputs: none Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r3f2b9de757500da37e0ed8881e4e906d94f3076c -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 3f2b9de757500da37e0ed8881e4e906d94f3076c) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -224,7 +224,6 @@ static void resetSyringePumpRequestFlags( void ); static void execSyringePumpMonitor( void ); -static U32 getPublishSyringePumpDataInterval( void ); static S32 getSyringePumpPosition( void ); static F32 getSyringePumpMeasRate( void ); static F32 getSyringePumpSyringeDetectorV( void ); @@ -625,26 +624,6 @@ /*********************************************************************//** * @brief - * The getPublishSyringePumpDataInterval function gets the syringe pump data - * publication interval. - * @details Inputs: syringePumpDataPublishInterval - * @details Outputs: none - * @return the current syringe pump data publication interval (in task intervals). - *************************************************************************/ -static U32 getPublishSyringePumpDataInterval( void ) -{ - U32 result = syringePumpDataPublishInterval.data; - - if ( OVERRIDE_KEY == syringePumpDataPublishInterval.override ) - { - result = syringePumpDataPublishInterval.ovData; - } - - return result; -} - -/*********************************************************************//** - * @brief * The getSyringePumpVolumeDelivered function gets the current syringe pump * volume delivered. * @details Inputs: syringePumpVolumeDelivered @@ -1837,7 +1816,7 @@ static void publishSyringePumpData( void ) { // Publish syringe pump data on interval - if ( ++syringePumpDataPublicationTimerCounter >= getPublishSyringePumpDataInterval() ) + if ( ++syringePumpDataPublicationTimerCounter >= getU32OverrideValue( &syringePumpDataPublishInterval ) ) { SYRINGE_PUMP_DATA_PAYLOAD_T data; Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -rab57180655892575252175a4310d97a1c8c46e74 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision ab57180655892575252175a4310d97a1c8c46e74) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -244,7 +244,6 @@ static void setFPGAValveSetPoint( VALVE_T valve, S16 position, BOOL enableCurrentRelaxation ); static void convertAndMonitorValvesCurrent( void ); static void getAndMonitorValvesCurrentFPGAPosition( void ); -static U32 getPublishValvesDataInterval( void ); static void publishValvesData( VALVE_T valve ); static void setValveNextStep( VALVE_T valve, U32 stepChange ); static S16 getValvePositionCounts( VALVE_T valve ); @@ -568,7 +567,7 @@ { VALVE_SELF_TEST_STATE_T state = VALVE_SELF_TEST_COMPLETE; - if ( areValvesFunctional() ) + if ( TRUE == areValvesFunctional() ) { valvesSelfTestResult = SELF_TEST_STATUS_PASSED; } @@ -1213,26 +1212,6 @@ /*********************************************************************//** * @brief - * The getPublishValvesDataInterval function gets the valves data publish - * interval. - * @details Inputs: valvesDataPublishInterval - * @details Outputs: none - * @return data publish time interval - *************************************************************************/ -U32 getPublishValvesDataInterval( void ) -{ - U32 result = valvesDataPublishInterval.data; - - if ( OVERRIDE_KEY == valvesDataPublishInterval.override ) - { - result = valvesDataPublishInterval.ovData; - } - - return result; -} - -/*********************************************************************//** - * @brief * The publishValvesData function publishes the data of the valves at the * specified time interval. * @details Inputs: valvesStatus @@ -1243,7 +1222,7 @@ static void publishValvesData( VALVE_T valve ) { // Check the counter - if ( ++valvesStatus[ valve ].dataPublishCounter >= getPublishValvesDataInterval() ) + if ( ++valvesStatus[ valve ].dataPublishCounter >= getU32OverrideValue( &valvesDataPublishInterval ) ) { HD_VALVE_DATA_T valveData; valveData.valveID = (U32)valve; Index: firmware/App/Controllers/Voltages.c =================================================================== diff -u -r406b3ea2507978267a519af0e9cbfbaaf03027c7 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Controllers/Voltages.c (.../Voltages.c) (revision 406b3ea2507978267a519af0e9cbfbaaf03027c7) +++ firmware/App/Controllers/Voltages.c (.../Voltages.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -16,6 +16,7 @@ ***************************************************************************/ #include "AlarmMgmt.h" +#include "FPGA.h" #include "InternalADC.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -51,6 +52,9 @@ 28.25, // MONITORED_LINE_24V_REGEN 1.3125, // MONITORED_LINE_FPGA_REF_V 3.3, // MONITORED_LINE_PBA_REF_V + 3.3, // MONITORED_LINE_FPGA_VCC_V + 3.3, // MONITORED_LINE_FPGA_AUX_V + 1.1 // MONITORED_LINE_FPGA_PVN_V }; /// Minimum voltage/current level for each monitored signal. static const F32 MIN_VOLTAGES[ NUM_OF_MONITORED_LINES ] = @@ -60,13 +64,12 @@ 4.5, // MONITORED_LINE_5V_LOGIC 4.5, // MONITORED_LINE_5V_SENSORS 21.6, // MONITORED_LINE_24V -#ifndef V2_0_SYSTEM 22.0, // MONITORED_LINE_24V_REGEN -#else - 0.0, // MONITORED_LINE_24V_REGEN -#endif 1.1875, // MONITORED_LINE_FPGA_REF_V 2.7, // MONITORED_LINE_PBA_REF_V + 2.7, // MONITORED_LINE_FPGA_VCC_V + 2.7, // MONITORED_LINE_FPGA_AUX_V + 0.9 // MONITORED_LINE_FPGA_PVN_V }; // ********** private data ********** @@ -86,7 +89,6 @@ static VOLTAGES_STATE_T handleVoltagesMonitorState( void ); static void checkVoltageRanges( void ); static void publishVoltagesData( void ); -static U32 getPublishVoltagesDataInterval( void ); /*********************************************************************//** * @brief @@ -177,6 +179,9 @@ voltages[ MONITORED_LINE_24V_REGEN ].data = getIntADCVoltageConverted( INT_ADC_24V_ACTUATORS_REG ); voltages[ MONITORED_LINE_FPGA_REF_V ].data = getIntADCVoltageConverted( INT_ADC_1_25_FPGA_ADC_REF ); voltages[ MONITORED_LINE_PBA_REF_V ].data = getIntADCVoltageConverted( INT_ADC_PBA_ADC_REF ); + voltages[ MONITORED_LINE_FPGA_VCC_V ].data = getFPGAVcc(); + voltages[ MONITORED_LINE_FPGA_AUX_V ].data = getFPGAVccAux(); + voltages[ MONITORED_LINE_FPGA_PVN_V ].data = getFPGAVpvn(); // Check voltage ranges checkVoltageRanges(); @@ -228,26 +233,6 @@ /*********************************************************************//** * @brief - * The getPublishVoltagesDataInterval function gets the voltages monitor data - * publication interval. - * @details Inputs: voltagesDataPublishInterval - * @details Outputs: none - * @return the current voltage monitor data publication interval (in task intervals). - *************************************************************************/ -static U32 getPublishVoltagesDataInterval( void ) -{ - U32 result = voltagesDataPublishInterval.data; - - if ( OVERRIDE_KEY == voltagesDataPublishInterval.override ) - { - result = voltagesDataPublishInterval.ovData; - } - - return result; -} - -/*********************************************************************//** - * @brief * The getMonitoredLineLevel function gets the current voltage or current * level for a given signal. * @details Inputs: voltages[] @@ -287,7 +272,7 @@ static void publishVoltagesData( void ) { // Publish voltages monitor data on interval - if ( ++voltagesDataPublicationTimerCounter >= getPublishVoltagesDataInterval() ) + if ( ++voltagesDataPublicationTimerCounter >= getU32OverrideValue( &voltagesDataPublishInterval ) ) { VOLTAGES_DATA_PAYLOAD_T data; @@ -299,6 +284,9 @@ data.adc24VRegen = getMonitoredLineLevel( MONITORED_LINE_24V_REGEN ); data.adcFpgaAdcRef = getMonitoredLineLevel( MONITORED_LINE_FPGA_REF_V ); data.adcPbaRef = getMonitoredLineLevel( MONITORED_LINE_PBA_REF_V ); + data.fpgaVcc = getMonitoredLineLevel( MONITORED_LINE_FPGA_VCC_V ); + data.fpgaVaux = getMonitoredLineLevel( MONITORED_LINE_FPGA_AUX_V ); + data.fpgaVpvn = getMonitoredLineLevel( MONITORED_LINE_FPGA_PVN_V ); broadcastVoltagesData( data ); voltagesDataPublicationTimerCounter = 0; Index: firmware/App/Drivers/SafetyShutdown.h =================================================================== diff -u -ra97fcffbe7b7b2d9543358ac06868829d41cf173 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Drivers/SafetyShutdown.h (.../SafetyShutdown.h) (revision a97fcffbe7b7b2d9543358ac06868829d41cf173) +++ firmware/App/Drivers/SafetyShutdown.h (.../SafetyShutdown.h) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -41,6 +41,7 @@ void initSafetyShutdown( void ); void activateSafetyShutdown( void ); BOOL isSafetyShutdownActivated( void ); +SELF_TEST_STATUS_T execSafetyShutdownTest( void ); BOOL testSetSafetyShutdownOverride( U32 value ); BOOL testResetSafetyShutdownOverride( void ); Index: firmware/App/HDCommon.h =================================================================== diff -u -rd27dcf1fbbc9651636f211028917a1c0702bb56a -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/HDCommon.h (.../HDCommon.h) (revision d27dcf1fbbc9651636f211028917a1c0702bb56a) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -23,9 +23,9 @@ // ********** version ********** #define HD_VERSION_MAJOR 0 -#define HD_VERSION_MINOR 5 -#define HD_VERSION_MICRO 0 -#define HD_VERSION_BUILD 9037 +#define HD_VERSION_MINOR 6 +#define HD_VERSION_MICRO 5 +#define HD_VERSION_BUILD 16 // ********** development build switches ********** @@ -50,39 +50,39 @@ #define DISABLE_MOTOR_CURRENT_CHECKS 1 // Do not error on HD pump current checks // #define DISABLE_PUMP_FLOW_CHECKS 1 // Do not error on HD pump flow checks // #define DISABLE_PUMP_SPEED_CHECKS 1 // Do not error on HD pump speed checks - #define DISABLE_PUMP_DIRECTION_CHECKS 1 // Do not error on HD pump direction checks +// #define DISABLE_PUMP_DIRECTION_CHECKS 1 // Do not error on HD pump direction checks #define DISABLE_SYRINGE_PUMP 1 // Disable syringe pump functionality #define ALWAYS_ALLOW_SYRINGE_PUMP_CMDS 1 // Allow syringe pump commands at any time except when pump is busy -// #define DISABLE_PRESSURE_CHECKS 1 // Do not error on HD pressure checks + #define DISABLE_PRESSURE_CHECKS 1 // Do not error on HD pressure checks // #define DISABLE_UF_ALARMS 1 // Do not error on HD ultrafiltration checks - #define DISABLE_VALVE_ALARMS 1 // Do not error on HD valve position - #define DISABLE_CAL_CHECK 1 // Disable calibration checks +// #define DISABLE_VALVE_ALARMS 1 // Do not error on HD valve position + #define SKIP_CAL_CHECK 1 // #define RUN_PUMPS_OPEN_LOOP 1 // BP and DPi pumps will be run open loop (no flow sensor feedback) // #define RAW_FLOW_SENSOR_DATA 1 // Test build will not filter flow sensor data // #define READ_FPGA_ASYNC_DATA 1 // Test build reads non-priority register page every other time // #define EMC_TEST_BUILD 1 // EMC test build - HD/DG run separately but connected, HD pumps toggle on/off w/ stop button #define ALARMS_DEBUG 1 // Triggered alarms sent to debug UART #define ALARM_VOLUME_DEFAULT_LOW 1 // Set default alarm volume to lowest - #define SKIP_PRIMING 1 // Skip Pre-treatment Prime - #define SKIP_WET_SELF_TESTS 1 // Skip Pre-treatment prime wet self-tests -// #define V2_0_SYSTEM 1 // Build for v2.0 system - #define SKIP_SAMPLE_WATER 1 // Skip pre-treatment sample water - #define SKIP_CONSUMABLE_TESTS 1 // Skip pre-treatment consumable Self-tests - #define SKIP_DRY_SELF_TESTS 1 // Skip pre-treatment dry self-tests - #define SKIP_UI_INTERACTION 1 // Skip UI interaction. -// #define DISABLE_BATT_COMM 1 // Disable battery communication. + #define DISABLE_BATT_COMM 1 // Disable battery communication. #define SKIP_AIR_BUBBLE_CHECK 1 // Skip air bubble detector self-test. #define DISABLE_OCCLUSION_SELF_TEST 1 // Skip occlusion sensor self-test. // #define SKIP_CARTRIDGE_REMOVAL 1 // Skip cartridge removal check - #define SKIP_EMPTY_RES_CHECK 1 // Skip reservoir empty check // #define DISABLE_FPGA_COUNTER_CHECKS 1 // Disable alarms associated with FPGA read/error counters // #define DISABLE_VOLTAGE_MONITOR 1 // Disable voltage monitoring/alarms #define ALLOW_1_MIN_TREATMENT_DURATION 1 // Allow user to change treatment duration to as low as 1 minute #define DISABLE_SYRINGE_PUMP_ALARMS 1 // Disable some syringe pump alarms that are triggering intermittently // #define NO_PUMP_FLOW_LIMITS 1 // Allow any commanded flow rate for peristaltic pumps #define DISABLE_BUBBLE_ALARMS 1 // Disable bubble alarms - #define DISABLE_UI_POST_TEST 1 // Disable the UI POST +// #define DISABLE_UI_POST_TEST 1 // Disable the UI POST + // Skip Pre-Treatment and get to treatment as soon as possible +// #define SKIP_UI_INTERACTION 1 // Skip UI interaction. + #define SKIP_SAMPLE_WATER 1 // Skip pre-treatment sample water + #define SKIP_CONSUMABLE_TESTS 1 // Skip pre-treatment consumable Self-tests + #define SKIP_DRY_SELF_TESTS 1 // Skip pre-treatment dry self-tests + #define SKIP_PRIMING 1 // Skip Pre-treatment Prime + #define SKIP_WET_SELF_TESTS 1 // Skip Pre-treatment prime wet self-tests + #include #include #endif Index: firmware/App/Modes/BloodPrime.c =================================================================== diff -u -r44a100f8e5210a02c23b8fcc4527d8e96d577381 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Modes/BloodPrime.c (.../BloodPrime.c) (revision 44a100f8e5210a02c23b8fcc4527d8e96d577381) +++ firmware/App/Modes/BloodPrime.c (.../BloodPrime.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -54,32 +54,34 @@ static const U32 BLOOD_PRIME_RAMPING_INTERVAL = ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ); /// Interval at which blood prime progress is to be published to UI. -static const U32 BLOOD_PRIME_DATA_PUBLISH_INTERVAL = ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ); +#define BLOOD_PRIME_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) /// Multiplier to convert flow (mL/min) into volume (mL) for period of general task interval. static const F32 BLOOD_PRIME_FLOW_INTEGRATOR = 1.0 / (F32)( SEC_PER_MIN * ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); // ********** private data ********** -static BLOOD_PRIME_STATE_T bloodPrimeState; ///< Current state of the blood prime sub-mode. +static BLOOD_PRIME_STATE_T bloodPrimeState; ///< Current state of the blood prime sub-mode. -static F32 bloodPrimeRampFlowRate_mL_min; ///< Current blood pump ramp flow rate. -static F32 bloodPrimeRampStep_mL; ///< Blood pump volume step size for ramping. +static F32 bloodPrimeRampFlowRate_mL_min; ///< Current blood pump ramp flow rate. +static F32 bloodPrimeRampStep_mL; ///< Blood pump volume step size for ramping. -static U32 bloodPrimeRampControlTimerCtr; ///< Timer counter for determining interval for controlling BP ramp. -static U32 bloodPrimePublishTimerCtr; ///< Timer counter for determining interval for blood prime status to be published. +static U32 bloodPrimeRampControlTimerCtr; ///< Timer counter for determining interval for controlling BP ramp. +static U32 bloodPrimePublishTimerCtr; ///< Timer counter for determining interval for blood prime status to be published. +/// Interval (in task intervals) at which to publish blood prime data to CAN bus. +static OVERRIDE_U32_T bloodPrimePublishInterval = { BLOOD_PRIME_DATA_PUBLISH_INTERVAL, BLOOD_PRIME_DATA_PUBLISH_INTERVAL, BLOOD_PRIME_DATA_PUBLISH_INTERVAL, 0 }; -static F32 cumulativeBloodPrimeVolume_mL; ///< Total cumulative blood prime volume (in mL). -static S32 bloodPrimeMotorCount; ///< The cumulative sum of BP motor encoder counts used for independent blood prime volume check. -static U32 bloodPrimeLastMotorCount; ///< The last BP motor encoder count read for independent blood prime volume check. -static F32 bloodPrimeVolumeDelivered_Safety; ///< The cumulative independent blood prime volume (in mL) calculated so far. +static OVERRIDE_F32_T cumulativeBloodPrimeVolume_mL = { 0.0, 0.0, 0.0, 0 }; ///< Total cumulative blood prime volume (in mL). +static OVERRIDE_F32_T bloodPrimeVolumeDelivered_Safety = { 0.0, 0.0, 0.0, 0 }; ///< The cumulative independent blood prime volume (in mL) calculated so far. +static S32 bloodPrimeMotorCount; ///< The cumulative sum of BP motor encoder counts used for independent blood prime volume check. +static U32 bloodPrimeLastMotorCount; ///< The last BP motor encoder count read for independent blood prime volume check. // ********** private function prototypes ********** static void resetBloodPrimeFlags( void ); - +static F32 getBloodPrimeVolume( void ); +static F32 getBloodPrimeSafetyVolume( void ); static BLOOD_PRIME_STATE_T handleBloodPrimeRampState( void ); - static void publishBloodPrimeData( void ); /*********************************************************************//** @@ -97,10 +99,10 @@ bloodPrimeState = BLOOD_PRIME_RAMP_STATE; bloodPrimeRampControlTimerCtr = 0; bloodPrimePublishTimerCtr = 0; - cumulativeBloodPrimeVolume_mL = 0.0; + cumulativeBloodPrimeVolume_mL.data = 0.0; + bloodPrimeVolumeDelivered_Safety.data = 0.0; bloodPrimeMotorCount = 0; bloodPrimeLastMotorCount = getBloodPumpMotorCount(); - bloodPrimeVolumeDelivered_Safety = 0.0; resetBloodPrimeFlags(); bloodPrimeRampFlowRate_mL_min = (F32)BLOOD_PRIME_INIT_BP_FLOW_RATE_ML_MIN; @@ -124,18 +126,6 @@ /*********************************************************************//** * @brief - * The resetBloodPrimeFlags function resets the blood prime request flags. - * @details Inputs: none - * @details Outputs: Blood prime request flags reset to FALSE. - * @return none - *************************************************************************/ -static void resetBloodPrimeFlags( void ) -{ - // No flags for now -} - -/*********************************************************************//** - * @brief * The transitionToBloodPrime function prepares for transition to blood prime * sub-mode. * @details Inputs: none @@ -172,6 +162,58 @@ /*********************************************************************//** * @brief + * The resetBloodPrimeFlags function resets the blood prime request flags. + * @details Inputs: none + * @details Outputs: Blood prime request flags reset to FALSE. + * @return none + *************************************************************************/ +static void resetBloodPrimeFlags( void ) +{ + // No flags for now +} + +/*********************************************************************//** + * @brief + * The getBloodPrimeVolume function gets the calculated blood prime volume + * delivered. + * @details Inputs: cumulativeBloodPrimeVolume_mL + * @details Outputs: none + * @return the current blood prime volume delivered (in mL). + *************************************************************************/ +static F32 getBloodPrimeVolume( void ) +{ + F32 result = cumulativeBloodPrimeVolume_mL.data; + + if ( OVERRIDE_KEY == cumulativeBloodPrimeVolume_mL.override ) + { + result = cumulativeBloodPrimeVolume_mL.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getBloodPrimeSafetyVolume function gets the calculated independent + * blood prime volume delivered. + * @details Inputs: bloodPrimeVolumeDelivered_Safety + * @details Outputs: none + * @return the current blood prime safety volume delivered (in mL). + *************************************************************************/ +static F32 getBloodPrimeSafetyVolume( void ) +{ + F32 result = bloodPrimeVolumeDelivered_Safety.data; + + if ( OVERRIDE_KEY == bloodPrimeVolumeDelivered_Safety.override ) + { + result = bloodPrimeVolumeDelivered_Safety.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The execBloodPrime function executes the Blood Prime sub-mode state machine. * @details Inputs: bloodPrimeState * @details Outputs: bloodPrimeState @@ -210,32 +252,33 @@ BLOOD_PRIME_STATE_T result = BLOOD_PRIME_RAMP_STATE; // Update blood prime volume delivered so far - cumulativeBloodPrimeVolume_mL += ( getMeasuredBloodFlowRate() * BLOOD_PRIME_FLOW_INTEGRATOR ); + cumulativeBloodPrimeVolume_mL.data += ( getMeasuredBloodFlowRate() * BLOOD_PRIME_FLOW_INTEGRATOR ); // Update independent calculated safety volume delivered so far bloodPrimeMotorCount = u32BiDiffWithWrap( bloodPrimeLastMotorCount, getBloodPumpMotorCount() ) / BP_HALL_EDGE_COUNTS_PER_REV; - bloodPrimeVolumeDelivered_Safety = ( (F32)bloodPrimeMotorCount * VOLUME_PER_BP_MOTOR_REV_ML ); // TODO - include upstream pressure compensation to this calc + bloodPrimeVolumeDelivered_Safety.data = ( (F32)bloodPrimeMotorCount * VOLUME_PER_BP_MOTOR_REV_ML ); // TODO - include upstream pressure compensation to this calc // Has blood prime completed? - if ( cumulativeBloodPrimeVolume_mL >= TARGET_BLOOD_PRIME_VOLUME_ML ) + if ( getBloodPrimeVolume() >= TARGET_BLOOD_PRIME_VOLUME_ML ) { #ifndef DISABLE_PUMP_FLOW_CHECKS // check for under-delivery - if ( bloodPrimeVolumeDelivered_Safety < MIN_BLOOD_PRIME_SAFETY_VOLUME_ML ) + if ( getBloodPrimeSafetyVolume() < MIN_BLOOD_PRIME_SAFETY_VOLUME_ML ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE, TARGET_BLOOD_PRIME_VOLUME_ML, bloodPrimeVolumeDelivered_Safety ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE, TARGET_BLOOD_PRIME_VOLUME_ML, getBloodPrimeSafetyVolume() ); } else #endif { setBloodIsPrimed( TRUE ); + signalDialInPumpHardStop(); signalBloodPrimeToDialysis(); } } #ifndef DISABLE_PUMP_FLOW_CHECKS // Has independent safety volume exceeded safety limit? - else if ( bloodPrimeVolumeDelivered_Safety > MAX_BLOOD_PRIME_SAFETY_VOLUME_ML ) + else if ( getBloodPrimeSafetyVolume() > MAX_BLOOD_PRIME_SAFETY_VOLUME_ML ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE, TARGET_BLOOD_PRIME_VOLUME_ML, bloodPrimeVolumeDelivered_Safety ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE, TARGET_BLOOD_PRIME_VOLUME_ML, getBloodPrimeSafetyVolume() ); } #endif else @@ -280,15 +323,159 @@ *************************************************************************/ static void publishBloodPrimeData( void ) { - if ( ++bloodPrimePublishTimerCtr >= BLOOD_PRIME_DATA_PUBLISH_INTERVAL ) + if ( ++bloodPrimePublishTimerCtr >= getU32OverrideValue( &bloodPrimePublishInterval ) ) { BLOOD_PRIME_DATA_PAYLOAD_T data; bloodPrimePublishTimerCtr = 0; data.targetBloodPrimeVolumeMl = TARGET_BLOOD_PRIME_VOLUME_ML; - data.deliveredBloodPrimeVolumeMl = cumulativeBloodPrimeVolume_mL; + data.deliveredBloodPrimeVolumeMl = getBloodPrimeVolume(); + data.indDeliveredBloodPrimeVolumeMl = getBloodPrimeSafetyVolume(); broadcastBloodPrimeData( data ); } } + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetBloodPrimeVolumeOverride function overrides the calculated + * blood prime volume. + * @details Inputs: none + * @details Outputs: cumulativeBloodPrimeVolume_mL + * @param vol override calculated blood prime volume (in mL) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetBloodPrimeVolumeOverride( F32 vol ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + cumulativeBloodPrimeVolume_mL.ovData = vol; + cumulativeBloodPrimeVolume_mL.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetBloodPrimeVolumeOverride function resets the override of the + * calculated blood prime volume. + * @details Inputs: none + * @details Outputs: cumulativeBloodPrimeVolume_mL + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetBloodPrimeVolumeOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + cumulativeBloodPrimeVolume_mL.override = OVERRIDE_RESET; + cumulativeBloodPrimeVolume_mL.ovData = cumulativeBloodPrimeVolume_mL.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetBloodPrimeSafetyVolumeOverride function overrides the calculated + * blood prime volume. + * @details Inputs: none + * @details Outputs: bloodPrimeVolumeDelivered_Safety + * @param vol override calculated blood prime safety volume (in mL) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetBloodPrimeSafetyVolumeOverride( F32 vol ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + bloodPrimeVolumeDelivered_Safety.ovData = vol; + bloodPrimeVolumeDelivered_Safety.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetBloodPrimeSafetyVolumeOverride function resets the override of the + * calculated blood prime safety volume. + * @details Inputs: none + * @details Outputs: bloodPrimeVolumeDelivered_Safety + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetBloodPrimeSafetyVolumeOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + bloodPrimeVolumeDelivered_Safety.override = OVERRIDE_RESET; + bloodPrimeVolumeDelivered_Safety.ovData = bloodPrimeVolumeDelivered_Safety.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetBloodPrimePublishIntervalOverride function sets the override of the + * blood prime data publication interval. + * @details Inputs: none + * @details Outputs: bloodPrimePublishInterval + * @param ms milliseconds between blood prime broadcasts + * @return TRUE if override set successful, FALSE if not + *************************************************************************/ +BOOL testSetBloodPrimePublishIntervalOverride( U32 ms ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = ms / TASK_GENERAL_INTERVAL; + + result = TRUE; + bloodPrimePublishInterval.ovData = intvl; + bloodPrimePublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetBloodPrimePublishIntervalOverride function resets the override of the + * blood prime data publication interval. + * @details Inputs: none + * @details Outputs: bloodPrimePublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetBloodPrimePublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + bloodPrimePublishInterval.override = OVERRIDE_RESET; + bloodPrimePublishInterval.ovData = bloodPrimePublishInterval.ovInitData; + } + + return result; +} + /**@}*/ Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r8e08352e9e7d8749d8f093c6bc57e6dbc32605d5 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 8e08352e9e7d8749d8f093c6bc57e6dbc32605d5) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -546,7 +546,7 @@ { result = TRUE; // Set outlet pump to dialysate rate + set UF rate - setDialOutPumpTargetRate( setDialysateFlowRate + FLOAT_TO_INT_WITH_ROUND( setUFRate ), MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + setDialOutPumpTargetRate( setDialysateFlowRate + (S32)setUFRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); // Restart UF time accumulation for reference volume calculation lastUFTimeStamp = getMSTimerCount(); // Go to UF running state Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r8e50cc04fb92d9b4ee9045e445ca8451abe951ab -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 8e50cc04fb92d9b4ee9045e445ca8451abe951ab) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -23,11 +23,13 @@ #include "CPLD.h" #include "DialInFlow.h" #include "FPGA.h" +#include "Integrity.h" #include "ModeInitPOST.h" #include "NVDataMgmt.h" #include "OperationModes.h" #include "RTC.h" #include "SafetyShutdown.h" +#include "SyringePump.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "Valves.h" @@ -108,7 +110,8 @@ /*********************************************************************//** * @brief - * The execInitAndPOSTMode function executes the Initialize & POST Mode state machine. + * The execInitAndPOSTMode function executes the Initialize & POST Mode + * state machine. * @details Inputs: postState * @details Outputs: postState, postPassed, postCompleted * @return current state (sub-mode) @@ -129,17 +132,12 @@ case POST_STATE_START: sendUIVersionRequest(); postState = POST_STATE_FW_INTEGRITY; -#ifdef SKIP_POST - postState = POST_STATE_COMPLETED; -#endif -#ifdef DONT_SKIP_NV_POST - // Only run NVDataMgmt POST - postState = POST_STATE_NVDATAMGMT; -#endif break; case POST_STATE_FW_INTEGRITY: - postState = POST_STATE_WATCHDOG; + testStatus = execIntegrityTest(); + testStatus = SELF_TEST_STATUS_PASSED; + postState = handlePOSTStatus( testStatus ); break; case POST_STATE_WATCHDOG: @@ -152,17 +150,20 @@ postState = handlePOSTStatus( testStatus ); break; + // NOTE: RTC's POST must go before NVDataMgmt case POST_STATE_RTC: testStatus = execRTCSelfTest(); postState = handlePOSTStatus( testStatus ); break; case POST_STATE_NVDATAMGMT: -// testStatus = execNVDataMgmtSelfTest(); -// postState = handlePOSTStatus( testStatus ); - postState = POST_STATE_BLOOD_FLOW; // TODO - restore before merge to staging (for now, cal failure fails but does not trigger fault and so I am seeing s/w fault) + testStatus = execNVDataMgmtSelfTest(); + postState = handlePOSTStatus( testStatus ); break; + // NOTE: all the actuators and sensors must execute their POST after NVDataMgmt + // NVDataMgmt must load all the calibration data into RAM so the actuators + // can query their corresponding calibration values successfully case POST_STATE_BLOOD_FLOW: testStatus = execBloodFlowTest(); postState = handlePOSTStatus( testStatus ); @@ -179,22 +180,22 @@ break; case POST_STATE_SYRINGE_PUMP: - postState = POST_STATE_ALARM_AUDIO; + testStatus = execSyringePumpSelfTest(); + postState = handlePOSTStatus( testStatus ); break; case POST_STATE_ALARM_AUDIO: +#ifndef DISABLE_ALARM_AUDIO testStatus = execAlarmAudioSelfTest(); +#else + testStatus = SELF_TEST_STATUS_PASSED; +#endif postState = handlePOSTStatus( testStatus ); break; case POST_STATE_ALARM_LAMP: -#ifdef DONT_SKIP_NV_POST - // Skip the rest of the POSTs - postState = POST_STATE_COMPLETED; -#else testStatus = execAlarmLampTest(); postState = handlePOSTStatus( testStatus ); -#endif break; case POST_STATE_ACCELEROMETER: @@ -253,7 +254,6 @@ // Should not get here - any failed post test should have already triggered a fault and taken us to fault mode default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_INIT_POST_INVALID_POST_STATE, postState ) - postState = POST_STATE_FAILED; break; } Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -r30a8d95285f2bd81238ff5536ebe4d53feb51f00 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 30a8d95285f2bd81238ff5536ebe4d53feb51f00) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -68,6 +68,8 @@ static HD_POST_TREATMENT_STATE_T currentPostTreatmentState; ///< Current state of post-treatment mode state machine. static DRAIN_STATE_T currentDrainReservoirState; ///< Current drain reservoir state. static U32 postTreatmentPublishTimerCounter; ///< Timer counter used to schedule post-treatment data broadcast. +/// Interval (in task intervals) at which to publish post-treatment mode data to CAN bus. +static OVERRIDE_U32_T postTreatmentModePublishInterval = { POST_TREATMENT_DATA_PUB_INTERVAL, POST_TREATMENT_DATA_PUB_INTERVAL, POST_TREATMENT_DATA_PUB_INTERVAL, 0 }; static TREATMENT_LOG_DATA_PAYLOAD_T treatmentLogData; ///< Treatment parameters record for logging. @@ -171,7 +173,7 @@ break; } - if ( ++postTreatmentPublishTimerCounter >= POST_TREATMENT_DATA_PUB_INTERVAL ) + if ( ++postTreatmentPublishTimerCounter >= getU32OverrideValue( &postTreatmentModePublishInterval ) ) { broadcastPostTreatmentState( currentPostTreatmentState ); postTreatmentPublishTimerCounter = 0; @@ -606,4 +608,57 @@ return state; } + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetPostTreatmentModePublishIntervalOverride function sets the override of the + * post-treatment mode data publication interval. + * @details Inputs: none + * @details Outputs: postTreatmentModePublishInterval + * @param ms milliseconds between post-treatment mode broadcasts + * @return TRUE if override set successful, FALSE if not + *************************************************************************/ +BOOL testSetPostTreatmentModePublishIntervalOverride( U32 ms ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = ms / TASK_GENERAL_INTERVAL; + + result = TRUE; + postTreatmentModePublishInterval.ovData = intvl; + postTreatmentModePublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetPostTreatmentModePublishIntervalOverride function resets the override of the + * post-treatment mode data publication interval. + * @details Inputs: none + * @details Outputs: postTreatmentModePublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetPostTreatmentModePublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + postTreatmentModePublishInterval.override = OVERRIDE_RESET; + postTreatmentModePublishInterval.ovData = postTreatmentModePublishInterval.ovInitData; + } + + return result; +} + /**@}*/ Index: firmware/App/Modes/ModePostTreat.h =================================================================== diff -u -r6f2218c22e666aec059afbd60f3d0d268b305ad0 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Modes/ModePostTreat.h (.../ModePostTreat.h) (revision 6f2218c22e666aec059afbd60f3d0d268b305ad0) +++ firmware/App/Modes/ModePostTreat.h (.../ModePostTreat.h) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -88,6 +88,9 @@ void signalUserConfirmDisposableRemoval( void ); void signalAlarmActionToPostTreatmentMode( ALARM_ACTION_T action ); // Execute alarm action as appropriate for post-treatment mode +BOOL testSetPostTreatmentModePublishIntervalOverride( U32 ms ); +BOOL testResetPostTreatmentModePublishIntervalOverride( void ); + /**@}*/ #endif Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -re08cad8c94bec5dd7133fce8606bb4e88151ae28 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision e08cad8c94bec5dd7133fce8606bb4e88151ae28) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -22,6 +22,7 @@ #include "ModePreTreat.h" #include "ModeTreatmentParams.h" #include "OperationModes.h" +#include "PresOccl.h" #include "PreTreatmentRecirc.h" #include "Prime.h" #include "SelfTests.h" @@ -77,6 +78,8 @@ static HD_PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current state of pre-treatment mode state machine. static U32 preTreatmentPublishTimerCounter; ///< Pre-treatment data broadcast timer counter used to schedule when to transmit data. +/// Interval (in task intervals) at which to publish pre-treatment mode data to CAN bus. +static OVERRIDE_U32_T preTreatmentModePublishInterval = { PRE_TREATMENT_DATA_PUB_INTERVAL, PRE_TREATMENT_DATA_PUB_INTERVAL, PRE_TREATMENT_DATA_PUB_INTERVAL, 0 }; static U32 submodeCompleteTransitionTimeCounter; ///< Sub-mode completed transition wait time counter. static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T currentReservoirMgmtState; ///< Current pre-treatment reservoir management state. @@ -415,7 +418,7 @@ static void publishPreTreatmentState( void ) { // Broadcast treatment time and state data at interval - if ( ++preTreatmentPublishTimerCounter >= PRE_TREATMENT_DATA_PUB_INTERVAL ) + if ( ++preTreatmentPublishTimerCounter >= getU32OverrideValue( &preTreatmentModePublishInterval ) ) { PRE_TREATMENT_STATE_DATA_T preTreatmentData; @@ -659,6 +662,7 @@ { if ( submodeCompleteTransitionTimeCounter++ >= SUBMODE_COMPLETE_UI_TRANSITION_TIME_COUNT ) { + setOcclusionInstallLevels(); // Record occlusion pressure levels after a new cartridge is installed. submodeCompleteTransitionTimeCounter = 0; state = HD_PRE_TREATMENT_PRIME_STATE; transitionToPrime(); @@ -1050,4 +1054,57 @@ return state; } + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetPreTreatmentModePublishIntervalOverride function sets the override of the + * pre-treatment mode data publication interval. + * @details Inputs: none + * @details Outputs: preTreatmentModePublishInterval + * @param ms milliseconds between pre-treatment mode broadcasts + * @return TRUE if override set successful, FALSE if not + *************************************************************************/ +BOOL testSetPreTreatmentModePublishIntervalOverride( U32 ms ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = ms / TASK_GENERAL_INTERVAL; + + result = TRUE; + preTreatmentModePublishInterval.ovData = intvl; + preTreatmentModePublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetPreTreatmentModePublishIntervalOverride function resets the override of the + * pre-treatment mode data publication interval. + * @details Inputs: none + * @details Outputs: preTreatmentModePublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetPreTreatmentModePublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + preTreatmentModePublishInterval.override = OVERRIDE_RESET; + preTreatmentModePublishInterval.ovData = preTreatmentModePublishInterval.ovInitData; + } + + return result; +} + /**@}*/ Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -ra69fcb7945b0300b47ce3287f8cb22c7c26171dc -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision a69fcb7945b0300b47ce3287f8cb22c7c26171dc) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -55,10 +55,13 @@ static BOOL flushStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of flush mode. static BOOL heatDisinfectStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of heat disinfect mode. static BOOL chemDisinfectStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of chemical disinfect mode. -static U32 dataPublishCounter = 0; ///< Disinfects data publish counter. static BOOL hasDisinfectCmdBeenSet = FALSE; ///< Flag indicates that a disinfect command has been set. static DG_DISINFECT_STATE_T dgDisinfectState; ///< DG disinfect state to be boadcast to UI. +static U32 dataPublishCounter = 0; ///< Disinfects data publish counter. +/// Interval (in task intervals) at which to publish standby mode data to CAN bus. +static OVERRIDE_U32_T standbyModePublishInterval = { DISINFECTS_DATA_PUB_INTERVAL, DISINFECTS_DATA_PUB_INTERVAL, DISINFECTS_DATA_PUB_INTERVAL, 0 }; + // ********** private function prototypes ********** static HD_STANDBY_STATE_T handleStandbyModeWaitForTreatmentState( void ); @@ -128,11 +131,6 @@ BOOL stop = isStopButtonPressed(); #ifndef RUN_WITHOUT_DG - if ( TRUE == stop ) - { - activateAlarmNoData( ALARM_ID_TREATMENT_STOPPED_BY_USER ); // TODO - remove alarm? Nothing to stop here. - } - // State machine to get DG to prep a reservoir so we can start a treatment switch ( currentStandbyState ) { @@ -670,4 +668,57 @@ } } + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetStandbyModePublishIntervalOverride function sets the override of the + * standby mode data publication interval. + * @details Inputs: none + * @details Outputs: standbyModePublishInterval + * @param ms milliseconds between standby mode broadcasts + * @return TRUE if override set successful, FALSE if not + *************************************************************************/ +BOOL testSetStandbyModePublishIntervalOverride( U32 ms ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = ms / TASK_GENERAL_INTERVAL; + + result = TRUE; + standbyModePublishInterval.ovData = intvl; + standbyModePublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetStandbyModePublishIntervalOverride function resets the override of the + * standby mode data publication interval. + * @details Inputs: none + * @details Outputs: standbyModePublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetStandbyModePublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + standbyModePublishInterval.override = OVERRIDE_RESET; + standbyModePublishInterval.ovData = standbyModePublishInterval.ovInitData; + } + + return result; +} + /**@}*/ Index: firmware/App/Modes/ModeStandby.h =================================================================== diff -u -r78cee9347b3766ac7c14d413ed848be758c7e9cd -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 78cee9347b3766ac7c14d413ed848be758c7e9cd) +++ firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -57,6 +57,9 @@ BOOL signalInitiateStandbyDisinfectSubmode( void ); +BOOL testSetStandbyModePublishIntervalOverride( U32 ms ); +BOOL testResetStandbyModePublishIntervalOverride( void ); + /**@}*/ #endif Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rdbfeaf78c05fc922eba6ff8c7a31ba8a9392c642 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision dbfeaf78c05fc922eba6ff8c7a31ba8a9392c642) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -56,11 +56,11 @@ #define PREVENT_UF_VOL_CHANGE_IF_NEARLY_DONE_SEC ( 10 * SEC_PER_MIN ) ///< Prevent UF volume change if treatment within this much time from end of treatment (in seconds). /// Interval (ms/task time) at which the treatment time data is published on the CAN bus. -static const U32 TREATMENT_TIME_DATA_PUB_INTERVAL = ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ); +#define TREATMENT_TIME_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) /// Interval (ms/task time) at which the treatment state data is published on the CAN bus. -static const U32 TREATMENT_STATE_DATA_PUB_INTERVAL = ( 250 / TASK_GENERAL_INTERVAL ); +#define TREATMENT_STATE_DATA_PUB_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) /// Interval (ms/task time) at which updated, valid treatment setting ranges are published on the CAN bus. -static const U32 TREATMENT_SETTINGS_RANGES_PUB_INTERVAL = ( ( 60 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ); +#define TREATMENT_SETTINGS_RANGES_PUB_INTERVAL ( ( 60 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) /// Interval (ms) at which the treatment periodic data is published on the CAN bus. static const U32 TREATMENT_PERIODIC_DATA_PUB_INTERVAL = ( 30 * SEC_PER_MIN * MS_PER_SECOND ); /// Interval (ms) at which the treatment periodic data is logged. @@ -91,6 +91,12 @@ static U32 treatmentTimeBroadcastTimerCtr; ///< Treatment time data broadcast timer counter used to schedule when to transmit data. static U32 treatmentStateBroadcastTimerCtr; ///< Treatment state data broadcast timer counter used to schedule when to transmit data. static U32 treatmentParamsRangesBroadcastTimerCtr; ///< Treatment parameter ranges broadcast timer counter used to schedule when to transmit updated ranges. +/// Interval (in task intervals) at which to publish alarm status to CAN bus. +static OVERRIDE_U32_T treatmentTimePublishInterval = { TREATMENT_TIME_DATA_PUB_INTERVAL, TREATMENT_TIME_DATA_PUB_INTERVAL, TREATMENT_TIME_DATA_PUB_INTERVAL, 0 }; +/// Interval (in task intervals) at which to publish alarm status to CAN bus. +static OVERRIDE_U32_T treatmentStatePublishInterval = { TREATMENT_STATE_DATA_PUB_INTERVAL, TREATMENT_STATE_DATA_PUB_INTERVAL, TREATMENT_STATE_DATA_PUB_INTERVAL, 0 }; +/// Interval (in task intervals) at which to publish alarm status to CAN bus. +static OVERRIDE_U32_T treatmentParamRangesPublishInterval = { TREATMENT_SETTINGS_RANGES_PUB_INTERVAL, TREATMENT_SETTINGS_RANGES_PUB_INTERVAL, TREATMENT_SETTINGS_RANGES_PUB_INTERVAL, 0 }; static BOOL resumeTreatmentAlarmResponseRequest; ///< Flag indicates user has requested treatment resume. static BOOL initiateRinsebackAlarmResponseRequest; ///< Flag indicates user has requested rinseback. @@ -1197,7 +1203,7 @@ U32 dialVolume = dialRate * ( (U32)( (F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN ) + 1 ); // In mL // Validate new rates - if ( ( bloodRate >= MIN_BLOOD_FLOW_RATE ) && ( bloodRate <= MAX_BLOOD_FLOW_RATE ) && + if ( ( bloodRate >= MIN_SET_BLOOD_FLOW_RATE ) && ( bloodRate <= MAX_SET_BLOOD_FLOW_RATE ) && ( dialRate >= MIN_DIAL_IN_FLOW_RATE ) && ( dialRate <= MAX_DIAL_IN_FLOW_RATE ) && ( dialVolume <= MAX_DIALYSATE_VOLUME_ML ) ) { @@ -1211,7 +1217,7 @@ } else { - if ( ( bloodRate < MIN_BLOOD_FLOW_RATE ) || ( bloodRate > MAX_BLOOD_FLOW_RATE ) ) + if ( ( bloodRate < MIN_SET_BLOOD_FLOW_RATE ) || ( bloodRate > MAX_SET_BLOOD_FLOW_RATE ) ) { rejectReason = REQUEST_REJECT_REASON_BLOOD_FLOW_OUT_OF_RANGE; } @@ -1361,7 +1367,7 @@ // Update treatment time stats and broadcast - end treatment if time elapsedTreatmentTimeInSecs = CALC_ELAPSED_TREAT_TIME_IN_SECS(); // Broadcast treatment time data at interval - if ( ++treatmentTimeBroadcastTimerCtr >= TREATMENT_TIME_DATA_PUB_INTERVAL ) + if ( ++treatmentTimeBroadcastTimerCtr >= getU32OverrideValue( &treatmentTimePublishInterval ) ) { if ( isTreatmentCompleted() != TRUE ) { @@ -1376,7 +1382,7 @@ treatmentTimeBroadcastTimerCtr = 0; } // Broadcast treatment state data at interval - if ( ++treatmentStateBroadcastTimerCtr >= TREATMENT_STATE_DATA_PUB_INTERVAL ) + if ( ++treatmentStateBroadcastTimerCtr >= getU32OverrideValue( &treatmentStatePublishInterval ) ) { TREATMENT_STATE_DATA_T payload; @@ -1389,6 +1395,7 @@ payload.txStopState = getCurrentTreatmentRecircState(); payload.txEndState = getCurrentTreatmentEndState(); payload.heparinState = getHeparinState(); + payload.dialysisState = getDialysisState(); broadcastTreatmentState( payload ); treatmentStateBroadcastTimerCtr = 0; @@ -1407,7 +1414,7 @@ *************************************************************************/ static void broadcastTreatmentSettingsRanges( void ) { - if ( ++treatmentParamsRangesBroadcastTimerCtr >= TREATMENT_SETTINGS_RANGES_PUB_INTERVAL ) + if ( ++treatmentParamsRangesBroadcastTimerCtr >= getU32OverrideValue( &treatmentParamRangesPublishInterval ) ) { // Compute minimum treatment duration U32 presTime = ( presTreatmentTimeSecs / SEC_PER_MIN ); @@ -1523,4 +1530,145 @@ return result; } +/*********************************************************************//** + * @brief + * The testSetTreatmentTimePublishIntervalOverride function sets the override of the + * treatment time data publication interval. + * @details Inputs: none + * @details Outputs: treatmentTimePublishInterval + * @param ms milliseconds between treatment time broadcasts + * @return TRUE if override set successful, FALSE if not + *************************************************************************/ +BOOL testSetTreatmentTimePublishIntervalOverride( U32 ms ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = ms / TASK_GENERAL_INTERVAL; + + result = TRUE; + treatmentTimePublishInterval.ovData = intvl; + treatmentTimePublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetTreatmentTimePublishIntervalOverride function resets the override of the + * treatment time data publication interval. + * @details Inputs: none + * @details Outputs: treatmentTimePublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetTreatmentTimePublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + treatmentTimePublishInterval.override = OVERRIDE_RESET; + treatmentTimePublishInterval.ovData = treatmentTimePublishInterval.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetTreatmentStatePublishIntervalOverride function sets the override of the + * treatment state data publication interval. + * @details Inputs: none + * @details Outputs: treatmentStatePublishInterval + * @param ms milliseconds between treatment state broadcasts + * @return TRUE if override set successful, FALSE if not + *************************************************************************/ +BOOL testSetTreatmentStatePublishIntervalOverride( U32 ms ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = ms / TASK_GENERAL_INTERVAL; + + result = TRUE; + treatmentStatePublishInterval.ovData = intvl; + treatmentStatePublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetTreatmentStatePublishIntervalOverride function resets the override of the + * treatment state data publication interval. + * @details Inputs: none + * @details Outputs: treatmentStatePublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetTreatmentStatePublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + treatmentStatePublishInterval.override = OVERRIDE_RESET; + treatmentStatePublishInterval.ovData = treatmentStatePublishInterval.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetTreatmentParamRangesPublishIntervalOverride function sets the override of the + * treatment param ranges data publication interval. + * @details Inputs: none + * @details Outputs: treatmentParamRangesPublishInterval + * @param ms milliseconds between treatment param range broadcasts + * @return TRUE if override set successful, FALSE if not + *************************************************************************/ +BOOL testSetTreatmentParamRangesPublishIntervalOverride( U32 ms ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = ms / TASK_GENERAL_INTERVAL; + + result = TRUE; + treatmentParamRangesPublishInterval.ovData = intvl; + treatmentParamRangesPublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetTreatmentParamRangesPublishIntervalOverride function resets the override of the + * treatment param ranges data publication interval. + * @details Inputs: none + * @details Outputs: treatmentParamRangesPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetTreatmentParamRangesPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + treatmentParamRangesPublishInterval.override = OVERRIDE_RESET; + treatmentParamRangesPublishInterval.ovData = treatmentParamRangesPublishInterval.ovInitData; + } + + return result; +} + /**@}*/ Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -r5153afc318dad6b9a469aaba20b8746994f5c70d -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 5153afc318dad6b9a469aaba20b8746994f5c70d) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -52,6 +52,7 @@ U32 bldPrimeState; U32 txEndState; U32 txStopState; + U32 dialysisState; } TREATMENT_STATE_DATA_T; /// Payload record structure for an ultrafiltration volume change confirmation message. @@ -130,6 +131,12 @@ BOOL verifyPressureLimitsChange( PRESSURE_LIMIT_CHANGE_REQUEST_T *data ); BOOL testSetTreatmentTimeRemainingOverride( U32 value ); +BOOL testSetTreatmentTimePublishIntervalOverride( U32 ms ); +BOOL testResetTreatmentTimePublishIntervalOverride( void ); +BOOL testSetTreatmentStatePublishIntervalOverride( U32 ms ); +BOOL testResetTreatmentStatePublishIntervalOverride( void ); +BOOL testSetTreatmentParamRangesPublishIntervalOverride( U32 ms ); +BOOL testResetTreatmentParamRangesPublishIntervalOverride( void ); /**@}*/ Index: firmware/App/Modes/ModeTreatmentParams.c =================================================================== diff -u -rabd0f05c634651fec6615c0f8cb75af166610cc3 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision abd0f05c634651fec6615c0f8cb75af166610cc3) +++ firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -132,6 +132,8 @@ treatParamsRejected = FALSE; treatmentCancelled = FALSE; + setTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME, 0.0 ); + // Set user alarm recovery actions allowed in this mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); @@ -401,16 +403,13 @@ { BOOL accepted = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NONE; - F32 uFVolumeL = uFVolumeMl / (F32)ML_PER_LITER; + F32 uFVolumeL = uFVolumeMl / (F32)ML_PER_LITER; // Validate given UF volume accepted = setTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME, uFVolumeL ); - if ( FALSE == accepted ) + + if ( TRUE == accepted ) { - rejReason = REQUEST_REJECT_REASON_UF_VOLUME_OUT_OF_RANGE; - } - else - { U32 treatmentDuration = getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); if ( treatmentDuration > 0 ) @@ -429,6 +428,10 @@ rejReason = REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_MINIMUM; } } + else + { + rejReason = REQUEST_REJECT_REASON_UF_VOLUME_OUT_OF_RANGE; + } // Respond to set treatment parameters request message uFVolumeL = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ); Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -re5d1d67106a93a6cd1b5692b586625d715732e2f -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision e5d1d67106a93a6cd1b5692b586625d715732e2f) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -38,7 +38,7 @@ // ********** private data ********** /// HD operation mode broadcast interval (in task interval/sec). -static const U32 BROADCAST_HD_OP_MODE_INTERVAL = ( 250 / TASK_GENERAL_INTERVAL ); +#define BROADCAST_HD_OP_MODE_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) // ********** private data ********** @@ -47,6 +47,8 @@ static HD_OP_MODE_T currentMode = MODE_INIT; ///< Current operation mode. static U32 currentSubMode = 0; ///< The currently active state of the active mode. static U32 broadcastModeIntervalCtr = 11; ///< Interval counter used to determine when to broadcast operation mode. Initialize to 11 to stagger broadcast. +/// Interval (in task intervals) at which to publish operation mode data to CAN bus. +static OVERRIDE_U32_T opModePublishInterval = { BROADCAST_HD_OP_MODE_INTERVAL, BROADCAST_HD_OP_MODE_INTERVAL, BROADCAST_HD_OP_MODE_INTERVAL, 0 }; /// This matrix determines legal transitions from one mode to another static const HD_OP_MODE_T MODE_TRANSITION_TABLE[ NUM_OF_MODES - 1 ][ NUM_OF_MODES - 1 ] = { @@ -358,7 +360,7 @@ *************************************************************************/ static void broadcastOperationMode( void ) { - if ( ++broadcastModeIntervalCtr >= BROADCAST_HD_OP_MODE_INTERVAL ) + if ( ++broadcastModeIntervalCtr >= getU32OverrideValue( &opModePublishInterval ) ) { broadcastModeIntervalCtr = 0; broadcastHDOperationMode( (U32)currentMode, currentSubMode ); @@ -399,4 +401,51 @@ return result; } +/*********************************************************************//** + * @brief + * The testSetOpModePublishIntervalOverride function sets the override of the + * operation mode publication interval. + * @details Inputs: none + * @details Outputs: opModePublishInterval + * @param ms milliseconds between operation mode broadcasts + * @return TRUE if override set successful, FALSE if not + *************************************************************************/ +BOOL testSetOpModePublishIntervalOverride( U32 ms ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = ms / TASK_GENERAL_INTERVAL; + + result = TRUE; + opModePublishInterval.ovData = intvl; + opModePublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetOpModePublishIntervalOverride function resets the override of the + * operation mode data publication interval. + * @details Inputs: none + * @details Outputs: opModePublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetOpModePublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + opModePublishInterval.override = OVERRIDE_RESET; + opModePublishInterval.ovData = opModePublishInterval.ovInitData; + } + + return result; +} + /**@}*/ Index: firmware/App/Modes/Rinseback.c =================================================================== diff -u -racf165d4bdd93d15f77e12e4cef3af7d6fb322ca -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision acf165d4bdd93d15f77e12e4cef3af7d6fb322ca) +++ firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -52,7 +52,7 @@ #endif /// Interval at which rinseback progress is to be published to UI. -static const U32 RINSEBACK_DATA_PUBLISH_INTERVAL = ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ); +#define RINSEBACK_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) /// Maximum time allowed for rinseback operation until full volume is delivered. Timer is reset whenever BP is running. static const U32 MAX_RINSEBACK_TIME = ( 5 * SEC_PER_MIN * ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); /// Maximum time allowed for each additional rinseback volume delivery. @@ -66,14 +66,16 @@ static U32 rinsebackRate_mL_min; ///< Rinseback rate to use/adjust for this current rinseback only. static U32 rinsebackTimerCtr; ///< Timer counter for time spent in rinseback sub-mode. -static F32 cumulativeRinsebackVolume_mL; ///< Total cumulative rinseback volume (in mL). +static OVERRIDE_F32_T cumulativeRinsebackVolume_mL = { 0.0, 0.0, 0.0, 0 }; ///< Total cumulative rinseback volume (in mL). +static OVERRIDE_F32_T rinsebackVolumeDelivered_Safety = { 0.0, 0.0, 0.0, 0 }; ///< The cumulative independent rinseback volume (in mL) calculated so far. static F32 targetRinsebackVolumePlusAdditional_mL; ///< Target rinseback volume w/ additional volume(s) added (in mL). static F32 additionalRinsebackVolume_mL; ///< Total volume (in mL) delivered so far for additional volume request. static S32 rinsebackMotorCount; ///< The cumulative sum of BP motor encoder counts used for independent rinseback volume check. static U32 rinsebackLastMotorCount; ///< The last BP motor encoder count read for independent rinseback volume check. -static F32 rinsebackVolumeDelivered_Safety; ///< The cumulative independent rinseback volume (in mL) calculated so far. static U32 rinsebackAdditionalTimerCtr; ///< Timer counter for duration of an additional rinseback delivery. static U32 rinsebackPublishTimerCtr; ///< Timer counter for determining interval for rinseback status to be published. +/// Interval (in task intervals) at which to publish rinseback data to CAN bus. +static OVERRIDE_U32_T rinsebackPublishInterval = { RINSEBACK_DATA_PUBLISH_INTERVAL, RINSEBACK_DATA_PUBLISH_INTERVAL, RINSEBACK_DATA_PUBLISH_INTERVAL, 0 }; static BOOL startRinsebackRequested; ///< Flag indicates user requesting rinseback start (confirming saline bag move to arterial line end). static BOOL incrRinsebackFlowRateRequested; ///< Flag indicates user requesting rinseback flow rate be increased. @@ -93,6 +95,9 @@ static void setupForRinsebackDelivery( U32 rate ); static void setupForRinsebackStopOrPause( void ); +static F32 getRinsebackVolume( void ); +static F32 getRinsebackSafetyVolume( void ); + static RINSEBACK_STATE_T handleRinsebackStopInitState( void ); static RINSEBACK_STATE_T handleRinsebackRunState( void ); static RINSEBACK_STATE_T handleRinsebackPausedState( void ); @@ -111,6 +116,7 @@ static BOOL handleEndTreatmentUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ); static void publishRinsebackData( void ); +static U32 getPublishRinsebackInterval( void ); /*********************************************************************//** * @brief @@ -125,11 +131,11 @@ rinsebackRate_mL_min = getTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ); targetRinsebackVolumePlusAdditional_mL = TARGET_RINSEBACK_VOLUME_ML; rinsebackTimerCtr = 0; - cumulativeRinsebackVolume_mL = 0.0; + cumulativeRinsebackVolume_mL.data = 0.0; + rinsebackVolumeDelivered_Safety.data = 0.0; additionalRinsebackVolume_mL = 0.0; rinsebackMotorCount = 0; rinsebackLastMotorCount = getBloodPumpMotorCount(); - rinsebackVolumeDelivered_Safety = 0.0; rinsebackAdditionalTimerCtr = 0; rinsebackPublishTimerCtr = 0; resetRinsebackFlags(); @@ -233,6 +239,46 @@ /*********************************************************************//** * @brief + * The getRinsebackVolume function gets the calculated blood prime volume + * delivered. + * @details Inputs: cumulativeRinsebackVolume_mL + * @details Outputs: none + * @return the current rinseback volume delivered (in mL). + *************************************************************************/ +static F32 getRinsebackVolume( void ) +{ + F32 result = cumulativeRinsebackVolume_mL.data; + + if ( OVERRIDE_KEY == cumulativeRinsebackVolume_mL.override ) + { + result = cumulativeRinsebackVolume_mL.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getRinsebackSafetyVolume function gets the calculated independent + * blood prime volume delivered. + * @details Inputs: rinsebackVolumeDelivered_Safety + * @details Outputs: none + * @return the current rinseback safety volume delivered (in mL). + *************************************************************************/ +static F32 getRinsebackSafetyVolume( void ) +{ + F32 result = rinsebackVolumeDelivered_Safety.data; + + if ( OVERRIDE_KEY == rinsebackVolumeDelivered_Safety.override ) + { + result = rinsebackVolumeDelivered_Safety.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The getCurrentRinsebackState function returns the current state of the * rinseback sub-mode. * @details Inputs: rinsebackState @@ -347,10 +393,10 @@ rinsebackTimerCtr = 0; // Update rinseback volume delivered so far - cumulativeRinsebackVolume_mL += ( getMeasuredBloodFlowRate() * RINSEBACK_FLOW_INTEGRATOR ); + cumulativeRinsebackVolume_mL.data += ( getMeasuredBloodFlowRate() * RINSEBACK_FLOW_INTEGRATOR ); // update independent calculated safety volume delivered so far rinsebackMotorCount = u32BiDiffWithWrap( rinsebackLastMotorCount, getBloodPumpMotorCount() ) / BP_HALL_EDGE_COUNTS_PER_REV; - rinsebackVolumeDelivered_Safety = ( (F32)rinsebackMotorCount * VOLUME_PER_BP_MOTOR_REV_ML ); // TODO - include upstream pressure compensation to this calc + rinsebackVolumeDelivered_Safety.data = ( (F32)rinsebackMotorCount * VOLUME_PER_BP_MOTOR_REV_ML ); // TODO - include upstream pressure compensation to this calc // Has user requested to end rinseback? if ( TRUE == endRinsebackRequested ) @@ -359,16 +405,16 @@ result = RINSEBACK_STOP_STATE; } // Has rinseback completed? - else if ( cumulativeRinsebackVolume_mL >= TARGET_RINSEBACK_VOLUME_ML ) + else if ( getRinsebackVolume() >= TARGET_RINSEBACK_VOLUME_ML ) { setRinsebackIsCompleted( TRUE ); setupForRinsebackStopOrPause(); result = RINSEBACK_STOP_STATE; #ifndef DISABLE_PUMP_FLOW_CHECKS // Check for under-delivery - if ( rinsebackVolumeDelivered_Safety < MIN_RINSEBACK_SAFETY_VOLUME_ML ) + if ( getRinsebackSafetyVolume() < MIN_RINSEBACK_SAFETY_VOLUME_ML ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_RINSEBACK_VOLUME_CHECK_FAILURE, TARGET_RINSEBACK_VOLUME_ML, rinsebackVolumeDelivered_Safety ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_RINSEBACK_VOLUME_CHECK_FAILURE, TARGET_RINSEBACK_VOLUME_ML, getRinsebackSafetyVolume() ); } #endif } @@ -387,11 +433,11 @@ } #ifndef DISABLE_PUMP_FLOW_CHECKS // Has independent safety volume exceeded safety limit? - else if ( rinsebackVolumeDelivered_Safety > MAX_RINSEBACK_SAFETY_VOLUME_ML ) + else if ( getRinsebackSafetyVolume() > MAX_RINSEBACK_SAFETY_VOLUME_ML ) { setRinsebackIsCompleted( TRUE ); setupForRinsebackStopOrPause(); - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_RINSEBACK_VOLUME_CHECK_FAILURE, TARGET_RINSEBACK_VOLUME_ML, rinsebackVolumeDelivered_Safety ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_RINSEBACK_VOLUME_CHECK_FAILURE, TARGET_RINSEBACK_VOLUME_ML, getRinsebackSafetyVolume() ); result = RINSEBACK_STOP_STATE; } #endif @@ -473,7 +519,7 @@ signalRinsebackToRecirc(); } // Has rinseback operation exceeded max time w/o delivering full volume? - if ( ( rinsebackTimerCtr > MAX_RINSEBACK_TIME ) && ( cumulativeRinsebackVolume_mL < TARGET_RINSEBACK_VOLUME_ML ) ) + if ( ( rinsebackTimerCtr > MAX_RINSEBACK_TIME ) && ( getRinsebackVolume() < TARGET_RINSEBACK_VOLUME_ML ) ) { signalGoToTreatmentStopped(); activateAlarmNoData( ALARM_ID_TREATMENT_RINSEBACK_TIMEOUT_ALARM ); @@ -482,8 +528,8 @@ { additionalRinsebackRequested = FALSE; // deliver additional rinseback volume only if max volume not reached and max time not reached - if ( ( ( cumulativeRinsebackVolume_mL + TARGET_ADDITIONAL_RINSEBACK_VOLUME_ML ) <= MAX_TOTAL_RINSEBACK_VOLUME_ML ) && - ( ( rinsebackTimerCtr < MAX_RINSEBACK_TIME ) || ( cumulativeRinsebackVolume_mL >= TARGET_RINSEBACK_VOLUME_ML ) ) ) + if ( ( ( getRinsebackVolume() + TARGET_ADDITIONAL_RINSEBACK_VOLUME_ML ) <= MAX_TOTAL_RINSEBACK_VOLUME_ML ) && + ( ( rinsebackTimerCtr < MAX_RINSEBACK_TIME ) || ( getRinsebackVolume() >= TARGET_RINSEBACK_VOLUME_ML ) ) ) { rinsebackAdditionalTimerCtr = 0; additionalRinsebackVolume_mL = 0.0; @@ -522,12 +568,12 @@ // update additional rinseback volume delivered so far additionalRinsebackVolume_mL += rinsebackVolumeSinceLast; - cumulativeRinsebackVolume_mL += rinsebackVolumeSinceLast; + cumulativeRinsebackVolume_mL.data += rinsebackVolumeSinceLast; rinsebackAdditionalTimerCtr++; // Has additional rinseback completed or timed out? if ( ( additionalRinsebackVolume_mL >= TARGET_ADDITIONAL_RINSEBACK_VOLUME_ML ) || - ( cumulativeRinsebackVolume_mL >= MAX_TOTAL_RINSEBACK_VOLUME_ML ) || + ( getRinsebackVolume() >= MAX_TOTAL_RINSEBACK_VOLUME_ML ) || ( rinsebackAdditionalTimerCtr >= MAX_RINSEBACK_ADDITIONAL_TIME ) ) { setupForRinsebackStopOrPause(); @@ -815,7 +861,7 @@ if ( RINSEBACK_STOP_STATE == rinsebackState ) { - if ( ( cumulativeRinsebackVolume_mL + TARGET_ADDITIONAL_RINSEBACK_VOLUME_ML ) <= MAX_TOTAL_RINSEBACK_VOLUME_ML ) + if ( ( getRinsebackVolume() + TARGET_ADDITIONAL_RINSEBACK_VOLUME_ML ) <= MAX_TOTAL_RINSEBACK_VOLUME_ML ) { result = TRUE; additionalRinsebackRequested = TRUE; @@ -933,15 +979,15 @@ *************************************************************************/ static void publishRinsebackData( void ) { - if ( ++rinsebackPublishTimerCtr >= RINSEBACK_DATA_PUBLISH_INTERVAL ) + if ( ++rinsebackPublishTimerCtr >= getPublishRinsebackInterval() ) { RINSEBACK_DATA_PAYLOAD_T data; U32 timeout = MAX_RINSEBACK_TIME / ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ); U32 countdown = ( rinsebackTimerCtr >= MAX_RINSEBACK_TIME ? 0 : ( MAX_RINSEBACK_TIME - rinsebackTimerCtr ) / ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); rinsebackPublishTimerCtr = 0; // If we have completed rinseback, timeout is no longer in force - indicate by zeroing timeout - if ( ( rinsebackState > RINSEBACK_PAUSED_STATE ) && ( cumulativeRinsebackVolume_mL >= TARGET_RINSEBACK_VOLUME_ML ) ) + if ( ( rinsebackState > RINSEBACK_PAUSED_STATE ) && ( getRinsebackVolume() >= TARGET_RINSEBACK_VOLUME_ML ) ) { timeout = 0; } @@ -950,7 +996,8 @@ { data.targetRinsebackVolumeMl = targetRinsebackVolumePlusAdditional_mL; } - data.deliveredRinsebackVolumeMl = cumulativeRinsebackVolume_mL; + data.deliveredRinsebackVolumeMl = getRinsebackVolume(); + data.safetyRinsebackVolumeMl = getRinsebackSafetyVolume(); data.rinsebackFlowRateMlMin = rinsebackRate_mL_min; if ( RINSEBACK_RUN_ADDITIONAL_STATE == rinsebackState ) { @@ -962,4 +1009,167 @@ } } +/*********************************************************************//** + * @brief + * The getPublishRinsebackInterval function gets the rinseback data + * publication interval. + * @details Inputs: rinsebackPublishInterval + * @details Outputs: none + * @return the current rinseback publication interval (in task intervals). + *************************************************************************/ +static U32 getPublishRinsebackInterval( void ) +{ + U32 result = rinsebackPublishInterval.data; + + if ( OVERRIDE_KEY == rinsebackPublishInterval.override ) + { + result = rinsebackPublishInterval.ovData; + } + + return result; +} + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetRinsebackVolumeOverride function overrides the calculated + * rinseback volume delivered. + * @details Inputs: none + * @details Outputs: cumulativeRinsebackVolume_mL + * @param vol override calculated rinseback volume (in mL) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetRinsebackVolumeOverride( F32 vol ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + cumulativeRinsebackVolume_mL.ovData = vol; + cumulativeRinsebackVolume_mL.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetRinsebackVolumeOverride function resets the override of the + * calculated rinseback volume. + * @details Inputs: none + * @details Outputs: cumulativeRinsebackVolume_mL + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetRinsebackVolumeOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + cumulativeRinsebackVolume_mL.override = OVERRIDE_RESET; + cumulativeRinsebackVolume_mL.ovData = cumulativeRinsebackVolume_mL.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetRinsebackSafetyVolumeOverride function overrides the calculated + * rinseback volume. + * @details Inputs: none + * @details Outputs: rinsebackVolumeDelivered_Safety + * @param vol override calculated rinseback safety volume (in mL) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetRinsebackSafetyVolumeOverride( F32 vol ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + rinsebackVolumeDelivered_Safety.ovData = vol; + rinsebackVolumeDelivered_Safety.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetRinsebackSafetyVolumeOverride function resets the override of the + * calculated rinseback safety volume. + * @details Inputs: none + * @details Outputs: rinsebackVolumeDelivered_Safety + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetRinsebackSafetyVolumeOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + rinsebackVolumeDelivered_Safety.override = OVERRIDE_RESET; + rinsebackVolumeDelivered_Safety.ovData = rinsebackVolumeDelivered_Safety.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetRinsebackPublishIntervalOverride function sets the override of the + * rinseback data publication interval. + * @details Inputs: none + * @details Outputs: rinsebackPublishInterval + * @param ms milliseconds between rinseback broadcasts + * @return TRUE if override set successful, FALSE if not + *************************************************************************/ +BOOL testSetRinsebackPublishIntervalOverride( U32 ms ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = ms / TASK_GENERAL_INTERVAL; + + result = TRUE; + rinsebackPublishInterval.ovData = intvl; + rinsebackPublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetRinsebackPublishIntervalOverride function resets the override of the + * rinseback data publication interval. + * @details Inputs: none + * @details Outputs: rinsebackPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetRinsebackPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + rinsebackPublishInterval.override = OVERRIDE_RESET; + rinsebackPublishInterval.ovData = rinsebackPublishInterval.ovInitData; + } + + return result; +} + /**@}*/ Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -ra7208ef0e06ae2d91b2f144e6e25a6fefde8c022 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision a7208ef0e06ae2d91b2f144e6e25a6fefde8c022) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -36,7 +36,7 @@ // ********** private definitions ********** /// Interval to control lamp and audio and to publish alarm status data. -static const U32 ALARM_STATUS_PUBLISH_INTERVAL = ( ALARM_LAMP_AND_AUDIO_CONTROL_INTERVAL_MS / TASK_GENERAL_INTERVAL ); +#define ALARM_STATUS_PUBLISH_INTERVAL ( ALARM_LAMP_AND_AUDIO_CONTROL_INTERVAL_MS / TASK_GENERAL_INTERVAL ) /// Interval (ms/task time) at which the alarm information is published on the CAN bus. #define ALARM_INFO_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) @@ -63,8 +63,11 @@ #define CLR_BACKUP_AUDIO_ENABLE() {mibspiREG3->PC3 &= ~BACKUP_AUDIO_ENABLE_SPI3_PORT_MASK;} ///< Macro to disable backup alarm audio. #define ALARM_AUDIO_TEST_TONE 4 ///< Alarm audio state for continuous test tone. -#define ALARM_AUDIO_CURRENT_HG_MIN_MA 10.0 ///< Minimum audio current (high gain) during test tone self-test (in mA). -#define ALARM_AUDIO_CURRENT_LG_MIN_MA 10.0 ///< Minimum audio current (low gain) during test tone self-test (in mA). +#define ALARM_AUDIO_CURRENT_HG_MIN_MA 20.0 ///< Minimum audio current (high gain) during test tone self-test (in mA). // TODO - Why is HG so low? S/B same as LG I think. +#define ALARM_AUDIO_CURRENT_LG_MIN_MA 60.0 ///< Minimum audio current (low gain) during test tone self-test (in mA). +#define ALARM_AUDIO_MAX_TEST_TIME_MS 1000 ///< Maximum time for audio current to reach threshold in test. +#define MAX_ALARM_AUDIO_VOLUME_INDEX (MAX_ALARM_VOLUME_LEVEL - 1 ) ///< Index for maximum alarm audio volume. +#define MIN_ALARM_AUDIO_VOLUME_INDEX 0 ///< Index for minimum alarm audio volume. /// Alarm priority ranking record. typedef struct @@ -74,6 +77,32 @@ U32 timeSinceTriggeredMS; ///< Time (in ms) since this alarm was triggered } ALARM_PRIORITY_RANKS_T; +/// Enumeration of alarm audio self-test states. +typedef enum Alarm_Lamp_Self_Test_States +{ + ALARM_AUDIO_SELF_TEST_STATE_START = 0, ///< Start state of alarm lamp self-test. + ALARM_AUDIO_SELF_TEST_STATE_PRIMARY, ///< Red state of alarm lamp self-test. + ALARM_AUDIO_SELF_TEST_STATE_COMPLETE, ///< Completed state of alarm lamp self-test. + NUM_OF_ALARM_AUDIO_SELF_TEST_STATES ///< Number of states in alarm lamp self-test. +} ALARM_AUDIO_SELF_TEST_STATE_T; + +/// Enumeration of alarm audio volume factors. +typedef enum Alarm_Audio_Volume_Factors +{ + ALARM_AUDIO_VOLUME_GAIN = 0, + ALARM_AUDIO_VOLUME_DIVIDER, + NUM_OF_ALARM_AUDIO_VOLUME_FACTORS +} ALARM_AUDIO_VOLUME_FACTOR_T; + +/// Lookup table to determine appropriate divider for a given alarm audio volume level. +const U08 ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[MAX_ALARM_VOLUME_LEVEL][NUM_OF_ALARM_AUDIO_VOLUME_FACTORS] = { + { 1, 0 }, + { 1, 1 }, + { 3, 1 }, + { 3, 2 }, + { 4, 2 } +}; + // ********** private data ********** static BOOL alarmIsActive[ NUM_OF_ALARM_IDS ]; ///< Table - current state of each alarm @@ -82,6 +111,8 @@ static U32 alarmStatusPublicationTimerCounter = 0; ///< Used to schedule alarm status publication to CAN bus. static U32 alarmInfoPublicationTimerCounter = 0; ///< Used to schedule alarm information publication to CAN bus. +/// Interval (in task intervals) at which to publish alarm status to CAN bus. +static OVERRIDE_U32_T alarmStatusPublishInterval = { ALARM_STATUS_PUBLISH_INTERVAL, ALARM_STATUS_PUBLISH_INTERVAL, ALARM_STATUS_PUBLISH_INTERVAL, 0 }; /// Interval (in task intervals) at which to publish alarm information to CAN bus. static OVERRIDE_U32_T alarmInfoPublishInterval = { ALARM_INFO_PUB_INTERVAL, ALARM_INFO_PUB_INTERVAL, ALARM_INFO_PUB_INTERVAL, 0 }; #ifndef ALARM_VOLUME_DEFAULT_LOW @@ -102,6 +133,8 @@ static BOOL alarmUserRecoveryActionEnabled[ NUMBER_OF_ALARM_USER_ACTIONS ]; ///< Alarm user recovery actions enabled flags. +/// Current state of the alarm audio self tests. +static ALARM_AUDIO_SELF_TEST_STATE_T alarmAudioSelfTestState; /// Flag indicates whether alarm audio test tone should be output. static BOOL alarmAudioTestToneRequested; @@ -123,7 +156,6 @@ static U32 getAlarmStartTime( ALARM_ID_T alarmID ); static void publishAlarmInfo( void ); -static U32 getPublishAlarmInfoInterval( void ); /*********************************************************************//** * @brief @@ -176,7 +208,8 @@ alarmStatus.noDialRecirc = FALSE; alarmStatus.usrACKRequired = FALSE; - alarmAudioTestToneRequested = FALSE; + alarmAudioTestToneRequested = FALSE; + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_START; } /*********************************************************************//** @@ -196,7 +229,7 @@ updateAlarmsFlags(); updateAlarmsSilenceStatus(); // Publish alarm status at interval - if ( ++alarmStatusPublicationTimerCounter >= ALARM_STATUS_PUBLISH_INTERVAL ) + if ( ++alarmStatusPublicationTimerCounter >= getU32OverrideValue( &alarmStatusPublishInterval ) ) { // Lamp and audio timing sync'd with broadcast so UI can stay in sync with lamp rhythm setAlarmLamp(); @@ -697,7 +730,7 @@ alarmPrimaryAudioCurrentHG.data = getIntADCVoltageConverted( INT_ADC_PRIMARY_ALARM_CURRENT_HG ); alarmPrimaryAudioCurrentLG.data = getIntADCVoltageConverted( INT_ADC_PRIMARY_ALARM_CURRENT_LG ); - alarmBackupAudioCurrent.data = getIntADCVoltageConverted( INT_ADC_BACKUP_ALARM_CURRENT ); + alarmBackupAudioCurrent.data = getFPGABackupAlarmAudioCurrent(); // TODO - Check current vs. expected audio output @@ -844,27 +877,43 @@ { U32 volume = getAlarmAudioVolume(); + // If audio test in progress, play test tone. if ( TRUE == alarmAudioTestToneRequested ) - { // Play test tone at max volume for next 50 ms - setAlarmAudioState( ALARM_AUDIO_TEST_TONE, 0 ); - alarmAudioTestToneRequested = FALSE; + { // Play test tone at min volume + setAlarmAudioState( ALARM_AUDIO_TEST_TONE, + ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[MIN_ALARM_AUDIO_VOLUME_INDEX][ALARM_AUDIO_VOLUME_GAIN], + ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[MIN_ALARM_AUDIO_VOLUME_INDEX][ALARM_AUDIO_VOLUME_DIVIDER] ); + // If we're in Fault mode, ensure audio test tone request is cancelled. + if ( MODE_FAUL == getCurrentOperationMode() ) + { + alarmAudioTestToneRequested = FALSE; + } + } + // If alarm silenced, play no alarm audio. else if ( TRUE == alarmStatus.alarmsSilenced ) { - setAlarmAudioState( ALARM_PRIORITY_NONE, volume ); + setAlarmAudioState( ALARM_PRIORITY_NONE, + ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[volume][ALARM_AUDIO_VOLUME_GAIN], + ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[volume][ALARM_AUDIO_VOLUME_DIVIDER] ); } + // Otherwise, play alarm audio as appropriate based on current alarm status else { if ( alarmStatus.alarmsState < NUM_OF_ALARM_PRIORITIES ) { #ifndef DISABLE_ALARM_AUDIO - setAlarmAudioState( alarmStatus.alarmsState, volume ); + setAlarmAudioState( alarmStatus.alarmsState, + ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[volume][ALARM_AUDIO_VOLUME_GAIN], + ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[volume][ALARM_AUDIO_VOLUME_DIVIDER] ); #endif } else { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_AUDIO_INVALID_ALARM_STATE, alarmStatus.alarmsState ) - setAlarmAudioState( ALARM_PRIORITY_HIGH, volume ); + setAlarmAudioState( ALARM_PRIORITY_HIGH, + ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[volume][ALARM_AUDIO_VOLUME_GAIN], + ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[volume][ALARM_AUDIO_VOLUME_DIVIDER] ); } } } @@ -1116,7 +1165,7 @@ static void publishAlarmInfo( void ) { // Publish voltages monitor data on interval - if ( ++alarmInfoPublicationTimerCounter >= getPublishAlarmInfoInterval() ) + if ( ++alarmInfoPublicationTimerCounter >= getU32OverrideValue( &alarmInfoPublishInterval ) ) { ALARM_INFO_PAYLOAD_T data; @@ -1133,26 +1182,6 @@ /*********************************************************************//** * @brief - * The getPublishAlarmInfoInterval function gets the blood flow data - * publication interval. - * @details Inputs: alarmInfoPublishInterval - * @details Outputs: none - * @return the current alarm information publication interval (in task intervals). - *************************************************************************/ -static U32 getPublishAlarmInfoInterval( void ) -{ - U32 result = alarmInfoPublishInterval.data; - - if ( OVERRIDE_KEY == alarmInfoPublishInterval.override ) - { - result = alarmInfoPublishInterval.ovData; - } - - return result; -} - -/*********************************************************************//** - * @brief * The getAlarmAudioVolume function gets the current alarm audio volume level. * @details Inputs: alarmAudioVolumeLevel * @details Outputs: none @@ -1235,36 +1264,55 @@ * The execAlarmAudioSelfTest function outputs a test audio tone and * measures the audio current level. The test passes if the audio current * exceeds TBD mA. - * @details Inputs: alarmBackupAudioCurrent + * @details Inputs: alarmAudioSelfTestState * @details Outputs: none * @return the current backup alarm audio current (in mA). *************************************************************************/ SELF_TEST_STATUS_T execAlarmAudioSelfTest( void ) { SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; + static U32 testStartTime; - if ( alarmAudioTestToneRequested != TRUE ) + switch ( alarmAudioSelfTestState ) { - alarmAudioTestToneRequested = TRUE; - setAlarmAudio(); - } - else - { - F32 almHGCurrent = getIntADCVoltageConverted( INT_ADC_PRIMARY_ALARM_CURRENT_HG ); - F32 almLGCurrent = getIntADCVoltageConverted( INT_ADC_PRIMARY_ALARM_CURRENT_LG ); + case ALARM_AUDIO_SELF_TEST_STATE_START: + testStartTime = getMSTimerCount(); + // Start test tone + alarmAudioTestToneRequested = TRUE; + setAlarmAudio(); + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_PRIMARY; + break; - // Check if alarm audio current is sufficiently high indicating alarm tone is being output -// TODO - need tone to be on longer than 50ms. make duration long (1 sec) at first to characterize the audio, then change to exit test when threshold met or t/o -// if ( ( almHGCurrent > ALARM_AUDIO_CURRENT_HG_MIN_MA ) && -// ( almLGCurrent > ALARM_AUDIO_CURRENT_LG_MIN_MA ) ) - { - result = SELF_TEST_STATUS_PASSED; - } -// else -// { -// result = SELF_TEST_STATUS_FAILED; -// SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ALARM_AUDIO_SELF_TEST_FAILURE, almHGCurrent, almLGCurrent ); -// } + case ALARM_AUDIO_SELF_TEST_STATE_PRIMARY: + { + F32 almHGCurrent = getIntADCVoltageConverted( INT_ADC_PRIMARY_ALARM_CURRENT_HG ); + F32 almLGCurrent = getIntADCVoltageConverted( INT_ADC_PRIMARY_ALARM_CURRENT_LG ); + + // Check if alarm audio current is sufficiently high indicating alarm tone is being output + if ( ( almHGCurrent > ALARM_AUDIO_CURRENT_HG_MIN_MA ) && + ( almLGCurrent > ALARM_AUDIO_CURRENT_LG_MIN_MA ) ) + { + alarmAudioTestToneRequested = FALSE; + result = SELF_TEST_STATUS_PASSED; + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_COMPLETE; + } + else if ( TRUE == didTimeout( testStartTime, ALARM_AUDIO_MAX_TEST_TIME_MS ) ) + { + alarmAudioTestToneRequested = FALSE; + result = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ALARM_AUDIO_SELF_TEST_FAILURE, almHGCurrent, almLGCurrent ); + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_COMPLETE; + } + } + break; + + case ALARM_AUDIO_SELF_TEST_STATE_COMPLETE: + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_START; // Should only get here if re-starting self-tests. + break; + + default: + // TODO - s/w fault + break; } return result; @@ -1443,6 +1491,53 @@ /*********************************************************************//** * @brief + * The testSetAlarmStatusPublishIntervalOverride function sets the override of the + * alarm status publication interval. + * @details Inputs: none + * @details Outputs: alarmStatusPublishInterval + * @param ms milliseconds between alarm status broadcasts + * @return TRUE if override set successful, FALSE if not + *************************************************************************/ +BOOL testSetAlarmStatusPublishIntervalOverride( U32 ms ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = ms / TASK_GENERAL_INTERVAL; + + result = TRUE; + alarmStatusPublishInterval.ovData = intvl; + alarmStatusPublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetAlarmStatusPublishIntervalOverride function resets the override of the + * alarm status publication interval. + * @details Inputs: none + * @details Outputs: alarmStatusPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetAlarmStatusPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + alarmStatusPublishInterval.override = OVERRIDE_RESET; + alarmStatusPublishInterval.ovData = alarmStatusPublishInterval.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The testSetAlarmInfoPublishIntervalOverride function sets the override of the * alarm information publication interval. * @details Inputs: none Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -rab57180655892575252175a4310d97a1c8c46e74 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision ab57180655892575252175a4310d97a1c8c46e74) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -177,6 +177,8 @@ BOOL testSetAlarmStartOverride( U32 alarmID, U32 value ); BOOL testResetAlarmStartOverride( U32 alarmID ); BOOL testClearAllAlarms( U32 key ); +BOOL testSetAlarmStatusPublishIntervalOverride( U32 ms ); +BOOL testResetAlarmStatusPublishIntervalOverride( void ); BOOL testSetAlarmInfoPublishIntervalOverride( U32 ms ); BOOL testResetAlarmInfoPublishIntervalOverride( void ); BOOL testSetAlarmAudioVolumeLevelOverride( U32 volume ); Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r01470ee3c64ededcc77a4f7378e49013a7ee5602 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 01470ee3c64ededcc77a4f7378e49013a7ee5602) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -155,11 +155,10 @@ SW_FAULT_ID_INVALID_CONSUMABLE_SELF_TEST_STATE, SW_FAULT_ID_HD_INVALID_BUBBLE_STATE, // 125 SW_FAULT_ID_HD_INVALID_BUBBLE_ID, - SW_FAULT_ID_HD_TEMPERATURES_INALID_EXEC_STATE, - SW_FAULT_ID_HD_INVALID_TEMPERATURE_SENSOR_SELECTED, - SW_FAULT_ID_HD_FANS_INVALID_STATE, - SW_FAULT_ID_HD_INVALID_FAN_SELECTED, // 130 SW_FAULT_ID_HD_INVALID_SWITCH_ID, + SW_FAULT_ID_SAFETY_SHUTDOWN_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_PHANTOM_INTERRUPT, + SW_FAULT_ID_UNEXPECTED_DMA_INTERRUPT, // 130 NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/FPGA.c =================================================================== diff -u -rce596a29a2bd6384d70b2fe7b9c332b0f1f37a84 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision ce596a29a2bd6384d70b2fe7b9c332b0f1f37a84) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -78,6 +78,13 @@ #define MAX_COMM_ERROR_RETRIES 5 ///< Maximum consecutive FPGA communication error retries. +/// Conversion factor converts FPGA temperature counts to degrees C. +#define FPGA_TEMP_CONVERSION_FACTOR ( 503.975 / (F32)BITS_12_FULL_SCALE ) +#define FPGA_TEMP_CONVERSION_OFFSET -273.15 ///< Conversion offset for FPGA temperature. + +#define FPGA_INPUT_VOLTAGE_SCALE 3.0 ///< FPGA source and aux voltage. +#define FPGA_PVN_VOLTAGE_SCALE 1.0 ///< FPGA pvn voltage. + #define FPGA_ADC1_AUTO_READ_ENABLE 0x01 ///< Auto-read enable bit for ADC1 control register. #define FPGA_AIRTRAP_LEVEL_LOW_MASK 0x0008 ///< Bit mask for air trap lower level sensor. @@ -100,6 +107,10 @@ #define FPGA_PBO_TEMP_OFFSET 50.0 ///< Used in conversion of PBo temperature reading to deg C. #define FPGA_ALARM_AUDIO_VOLUME_SHIFT 3 ///< Shift alarm audio volume 3 bits to left before writing to register. +#define FPGA_ALARM_AUDIO_DIVIDE_SHIFT 6 ///< Shift alarm audio volume divider 6 bits to left before writing to register. + +#define FPGA_BACKUP_ALARM_AUDIO_CONVERT 0.4 ///< Converts backup (piezo) alarm audio ADC volts to amps. + #define FRONT_DOOR_SWITCH_MASK 0x0010 ///< Front door switch bit mask. Bit 4 of the GPIO register. #define PUMP_TRACK_SWITCH_MASK 0x0020 ///< Pump track switch bit mask. Bit 5 of the GPIO register. @@ -180,13 +191,13 @@ S16 VBVPosition; ///< Reg 360. Encoder position from VBV pinch valve. 0 until PID interface is enabled. S16 VDiPosition; ///< Reg 362. Encoder position from VDi pinch valve. 0 until PID interface is enabled. S16 VDoPosition; ///< Reg 364. Encoder position from VDo pinch valve. 0 until PID interface is enabled. - S16 VSparePosition; ///< Reg 366. Encoder position from VSpare pinch valve. 0 until PID interface is enabled. + S16 fpgaIntVoltage; ///< Reg 366. Internal FPGA Vcc voltage. 3V range over 12 bits (0..4095). U16 valveStatus; ///< Reg 368. Valve status register. U16 VBAPWMTarget; ///< Reg 370. PWM target duty cycle for VBA pinch valve. U16 VBVPWMTarget; ///< Reg 372. PWM target duty cycle for VBV pinch valve. U16 VDiPWMTarget; ///< Reg 374. PWM target duty cycle for VDi pinch valve. U16 VDoPWMTarget; ///< Reg 376. PWM target duty cycle for VDo pinch valve. - U16 VSparePWMTarget; ///< Reg 378. PWM target duty cycle for Vspare pinch valve. + U16 fpgaAuxVoltage; ///< Reg 378. Internal FPGA Vcc Aux voltage. 3V range over 12 bits (0..4095). U08 syringePumpStatus; ///< Reg 380. Syringe pump status register. U08 syringePumpADCReadCounter; ///< Reg 381. Syringe pump ADC read counter. U08 syringePumpADCandDACStatus; ///< Reg 382. Syringe pump ADC and DAC status register. @@ -201,12 +212,13 @@ U16 VBVCurrent; ///< Reg 400. VBV pinch valve current (Register VAUX2) U16 VDoCurrent; ///< Reg 402. VDo pinch valve current (Register VAUX3) U16 VBACurrent; ///< Reg 404. VBA pinch valve current (Register VAUX8) - U16 VDiSpeed; ///< Reg 406. VDi pinch valve current (Register VAUX9) + U16 VDiSpeed; ///< Reg 406. VDi pinch valve current (Register VAUX5) U16 VDoSpeed; ///< Reg 408. VDo pinch valve speed (Register VAUX10) - U16 VDiCurrent; ///< Reg 410. VDi pinch valve current (Register VAUX11) - U16 VSpareSpeed; ///< Reg 412. VSpare speed (Register VAUX5) - U16 VSpareCurrent; ///< Reg 414. VSpare current (Register VAUX13) - U16 fpgaTimerCount_ms; ///< Reg 416. Internal FPGA timer count in ms. + U16 VDiCurrent; ///< Reg 410. VDi pinch valve current (Register VAUX13) + U16 fpgaTemperature; ///< Reg 412. FPGA die temperature (deg C = counts x (503.975/4096) - 273.15). + U16 fpgaVpvn; ///< Reg 414. FPGA pvn voltage. 1V range over 12 bits (0..4095). + U16 fpgaTimerCount_ms; ///< Reg 416. Free running 1ms timer counter. Rolls over at 65535.Internal FPGA timer count in ms. + U16 backupAlarmAudioPeakCurrent; ///< Reg 418. Piezo alarm peak ADC current in previous 10ms. 12 bit unsigned. } FPGA_SENSORS_T; /// Record structure for FPGA continuous priority writes. @@ -1111,29 +1123,91 @@ /*********************************************************************//** * @brief + * The getFPGATemperature function gets the fpga internal die temperature. + * @details Inputs: fpgaHeader + * @details Outputs: none + * @return current internal FPGA die temperature (in deg C) + *************************************************************************/ +F32 getFPGATemperature( void ) +{ + F32 result = (F32)fpgaSensorReadings.fpgaTemperature * FPGA_TEMP_CONVERSION_FACTOR + FPGA_TEMP_CONVERSION_OFFSET; + + return result; +} + +/*********************************************************************//** + * @brief + * The getFPGAVcc function gets the fpga input voltage. + * @details Inputs: fpgaHeader + * @details Outputs: none + * @return current FPGA input voltage (in volts) + *************************************************************************/ +F32 getFPGAVcc( void ) +{ + F32 result = (F32)fpgaSensorReadings.fpgaIntVoltage * FPGA_INPUT_VOLTAGE_SCALE / (F32)BITS_12_FULL_SCALE; + + return result; +} + +/*********************************************************************//** + * @brief + * The getFPGAVccAux function gets the fpga aux. voltage. + * @details Inputs: fpgaHeader + * @details Outputs: none + * @return current FPGA aux. voltage (in volts) + *************************************************************************/ +F32 getFPGAVccAux( void ) +{ + F32 result = (F32)fpgaSensorReadings.fpgaAuxVoltage * FPGA_INPUT_VOLTAGE_SCALE / (F32)BITS_12_FULL_SCALE; + + return result; +} + +/*********************************************************************//** + * @brief + * The getFPGAVpvn function gets the fpga pvn voltage. + * @details Inputs: fpgaHeader + * @details Outputs: none + * @return current FPGA pvn voltage (in volts) + *************************************************************************/ +F32 getFPGAVpvn( void ) +{ + F32 result = (F32)fpgaSensorReadings.fpgaVpvn * FPGA_PVN_VOLTAGE_SCALE / (F32)BITS_12_FULL_SCALE; + + return result; +} + +/*********************************************************************//** + * @brief * The setAlarmAudioState function sets the fpga audio control to the given * state and volume. * @details Inputs: none * @details Outputs: alarm audio state and attenuation set - * @param state the state of alarm audio to command: + * @param state the state of alarm audio to command (3..5): * 0 - No alarm tone * 1 - Low priority alarm tone (c e) * 2 - Medium priority alarm tone (c f# c) * 3 - High priority alarm tone (c f# c - c f#) * 4 - Continuous test tone (e) - * @param volumeLevel the level of attenuation to command (0..4) + * @param volumeLevel the level of attenuation to command (0..2): * 4 - 3 dB gain * 3 - 6 dB gain * 2 - 9 dB gain * 1 - 12 dB gain * 0 - 15 dB gain + * @param volumeDivider further attenuation via divider (6..7): + * 0 - Divide by 2 + * 1 - Divide by 4 + * 2 - Divide by 8 + * 3 - Divide by 16 * @return none *************************************************************************/ -void setAlarmAudioState( U32 state, U32 volumeLevel ) +void setAlarmAudioState( U32 state, U32 volumeLevel, U32 volumeDivider ) { U08 audioCmd = (U08)state; audioCmd |= ( (U08)volumeLevel << FPGA_ALARM_AUDIO_VOLUME_SHIFT ); + audioCmd |= ( (U08)volumeDivider << FPGA_ALARM_AUDIO_DIVIDE_SHIFT ); if ( ( state <= NUM_OF_ALARM_PRIORITIES ) && ( volumeLevel <= MAX_ALARM_VOLUME_ATTENUATION ) ) { @@ -1557,6 +1631,32 @@ /*********************************************************************//** * @brief + * The getFPGAArterialPressureReadCounter function gets the latest arterial + * pressure sensor read counter. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last arterial pressure sensor read counter + *************************************************************************/ +U08 getFPGAArterialPressureReadCounter( void ) +{ + return fpgaSensorReadings.adc1SequenceCount; +} + +/*********************************************************************//** + * @brief + * The getFPGAArterialPressureErrorCounter function gets the latest arterial + * pressure sensor error counter. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last arterial pressure sensor error counter + *************************************************************************/ +U08 getFPGAArterialPressureErrorCounter( void ) +{ + return fpgaSensorReadings.adc1ErrorCount; +} + +/*********************************************************************//** + * @brief * The getFPGAVenousPressure function gets the latest venous pressure reading. * The high 2 bits are status bits: 00=ok, 01=cmd mode, 10=stale data, 11=diag * The low 14 bits are data. Zero is at 1638. Values above are positive, @@ -1843,6 +1943,22 @@ /*********************************************************************//** * @brief + * The getFPGABackupAlarmAudioCurrent function gets the latest piezo alarm + * audio current reading. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return Latest piezo alarm audio current reading + *************************************************************************/ +F32 getFPGABackupAlarmAudioCurrent( void ) +{ + U16 adcCnts = fpgaSensorReadings.backupAlarmAudioPeakCurrent; + F32 result = ( ( (F32)adcCnts / (F32)BITS_12_FULL_SCALE ) * FPGA_BACKUP_ALARM_AUDIO_CONVERT ) * (F32)MA_PER_AMP; + + return result; +} + +/*********************************************************************//** + * @brief * The getFPGAAirTrapLevels function gets the latest air trap level sensor * readings. * @details Inputs: fpgaSensorReadings Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r69b93e39861c5493d273f25d9e43cacd0b5819e2 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 69b93e39861c5493d273f25d9e43cacd0b5819e2) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -51,8 +51,12 @@ void signalFPGATransmitCompleted( void ); void getFPGAVersions( U08 *Id, U08 *Maj, U08 *Min, U08 *Lab ); +F32 getFPGATemperature( void ); +F32 getFPGAVcc( void ); +F32 getFPGAVccAux( void ); +F32 getFPGAVpvn( void ); -void setAlarmAudioState( U32 state, U32 volumeLevel ); +void setAlarmAudioState( U32 state, U32 volumeLevel, U32 volumeDivider ); F32 getFPGABloodFlowSignalStrength( void ); F32 getFPGADialysateFlowSignalStrength( void ); @@ -79,6 +83,8 @@ U08 getFPGADialOutPumpHallSensorStatus( void ); U32 getFPGAArterialPressure( void ); +U08 getFPGAArterialPressureReadCounter( void ); +U08 getFPGAArterialPressureErrorCounter( void ); U16 getFPGAVenousPressure( void ); F32 getFPGAVenousPressureTemperature( void ); U08 getFPGAVenousPressureReadCounter( void ); @@ -112,6 +118,8 @@ void getFPGAAccelMaxes( S16 *xm, S16*ym, S16*zm ); void getFPGAAccelStatus( U16 *cnt, U16 *accelFPGAFaultReg ); +F32 getFPGABackupAlarmAudioCurrent( void ); + void getFPGAAirTrapLevels( BOOL *airAtLower, BOOL *airAtUpper ); void setFPGASensorTest( U08 sensorTest ); Index: firmware/App/Services/Interrupts.c =================================================================== diff -u -r9feea867113c62088f0ce91750127972dbd9bf53 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Services/Interrupts.c (.../Interrupts.c) (revision 9feea867113c62088f0ce91750127972dbd9bf53) +++ firmware/App/Services/Interrupts.c (.../Interrupts.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -34,9 +34,6 @@ #include "TaskPriority.h" #include "TaskTimer.h" #include "Utilities.h" -#ifdef DEBUG_ENABLED - #include "SystemCommMessages.h" -#endif /** * @addtogroup Interrupts @@ -57,7 +54,6 @@ static U32 sci2FrameErrorCnt = 0; ///< FPGA serial frame error counter. static U32 sci2OverrunErrorCnt = 0; ///< FPGA serial overrun error counter. -static U32 can1PassiveCnt = 0; ///< CAN passive mode counter. static U32 can1WarningCnt = 0; ///< CAN warning mode counter. static U32 can1BusOffCnt = 0; ///< CAN buss off mode counter. static U32 can1ParityCnt = 0; ///< CAN parity error counter. @@ -74,7 +70,6 @@ void initInterrupts( void ) { // Initialize various time windowed counts for monitoring CAN & UART errors and warnings - initTimeWindowedCount( TIME_WINDOWED_COUNT_CAN_PASSIVE, MAX_COMM_ERRORS, COMM_ERROR_TIME_WINDOW_MS ); initTimeWindowedCount( TIME_WINDOWED_COUNT_CAN_OFF, MAX_COMM_ERRORS, COMM_ERROR_TIME_WINDOW_MS ); initTimeWindowedCount( TIME_WINDOWED_COUNT_CAN_PARITY, MAX_COMM_ERRORS, COMM_ERROR_TIME_WINDOW_MS ); initTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_UART_FRAME_ERROR, MAX_COMM_ERRORS, COMM_ERROR_TIME_WINDOW_MS ); @@ -90,16 +85,7 @@ *************************************************************************/ void phantomInterrupt(void) { - // TODO - what to do with phantom interrupts? -#ifdef DEBUG_ENABLED - { - char debugStr[ 256 ]; - - sprintf( debugStr, "HD-phantom interrupt\n" ); - sendDebugData( (U08*)debugStr, strlen(debugStr) ); - sendDebugDataToUI( (U08*)debugStr ); - } -#endif + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_PHANTOM_INTERRUPT ) } /*********************************************************************//** @@ -168,38 +154,33 @@ void canErrorNotification(canBASE_t *node, uint32 notification) { if ( node == canREG1 ) - { + { + // Parity error - message RAM is corrupted if ( notification & canLEVEL_PARITY_ERR ) { can1ParityCnt++; if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_CAN_PARITY ) ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_CAN_PARITY_ERROR ) } - } + } + // Bus off - our transmitter has counted 255+ errors else if ( notification & canLEVEL_BUS_OFF ) { can1BusOffCnt++; if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_CAN_OFF ) ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_CAN_OFF_ERROR ) } - } + } + // Warning - our transmitter has counted 96+ errors else if ( notification & canLEVEL_WARNING ) { can1WarningCnt++; } - else if ( notification & canLEVEL_PASSIVE ) - { - can1PassiveCnt++; - if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_CAN_PASSIVE ) ) - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_CAN_PASSIVE_WARNING ) - } - } else { - // Ignore - other notifications undefined + // Ignore other notifications - unhandled } } } @@ -279,7 +260,7 @@ break; #endif default: - // TODO - s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_UNEXPECTED_DMA_INTERRUPT, channel ) break; } } Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r3f2b9de757500da37e0ed8881e4e906d94f3076c -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 3f2b9de757500da37e0ed8881e4e906d94f3076c) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -327,14 +327,6 @@ { canTransmit( canREG1, lastCANPacketSentChannel, lastCANPacketSent ); } -#ifdef DEBUG_ENABLED - { - char debugStr[100]; - sprintf( debugStr, "SystemComm-HD resend Last Frame. %2d\n", lastCANPacketSentChannel ); - sendDebugData( (U08*)debugStr, strlen(debugStr) ); - sendDebugDataToUI( (U08*)debugStr ); - } -#endif } // We must be only node on CAN bus - nobody is ACKing our transmitted frames else @@ -343,13 +335,6 @@ canXmitRetryCtr = MAX_XMIT_RETRIES; signalCANXmitsCompleted(); // Clear pending xmit flag clearCANXmitBuffers(); // Clear xmit buffers - nothing is going out right now -#ifdef DEBUG_ENABLED - { - char debugStr[100]; - sprintf( debugStr, "SystemComm-HD is only node.\n" ); - sendDebugData( (U08*)debugStr, strlen(debugStr) ); - } -#endif } } } @@ -968,13 +953,6 @@ SET_ALARM_WITH_1_U32_DATA( ALARM_ID_COMM_TOO_MANY_BAD_CRCS, (U32)ALARM_SOURCE_HD ); #endif } -#ifdef DEBUG_ENABLED - { - char debugStr[100]; - sprintf( debugStr, "SystemComm-HD-Bad Msg CRC.\n" ); - sendDebugDataToUI( (U08*)debugStr ); - } -#endif } /*********************************************************************//** @@ -1156,8 +1134,12 @@ break; case MSG_ID_REQUEST_FW_VERSIONS: - handleFWVersionRequest( message ); - handleHDSerialNumberRequest(); + handleFWVersionRequest( message ); + handleHDSerialNumberRequest(); + break; + + case MSG_ID_DG_VERSION: + handleDGVersionResponse( message ); break; case MSG_ID_DG_TEMPERATURE_DATA: @@ -1304,6 +1286,10 @@ handleUIPOSTFinalResult( message ); break; + case MSG_ID_HD_UI_VERSION_INFO_RESPONSE: + handleUIVersionResponse( message ); + break; + case MSG_ID_UI_ACTIVE_ALARMS_LIST_REQUEST: handleUIActiveAlarmsListRequest( message ); break; @@ -1557,6 +1543,14 @@ handleTestDialOutPumpHomeRequest( message ); break; + case MSG_ID_SUPER_CLEAR_ALARMS_CMD: + handleTestSuperClearAlarmsRequest( message ); + break; + + case MSG_ID_HD_SET_OP_MODE_REQUEST: + handleTestSetOpModeRequest( message ); + break; + case MSG_ID_HD_FLUID_LEAK_SEND_INTERVAL_OVERRIDE: handleSetFluidLeakBroadcastIntervalOverrideRequest( message ); break; @@ -1589,6 +1583,10 @@ handleBubbleSelfTestRequest( message ); break; + case MSG_ID_HD_BLOOD_PRIME_VOLUME_OVERRIDE: + handleBloodPrimeVolumeOverrideRequest( message ); + break; + case MSG_ID_HD_SWITCHES_STATUS_OVERRIDE: handleSetSwitchesStatusOverrideRequest( message ); break; @@ -1601,14 +1599,18 @@ handleBatteryRemainingPercentOverrideRequest( message ); break; - case MSG_ID_HD_SET_OP_MODE_REQUEST: - handleTestSetOpModeRequest( message ); + case MSG_ID_HD_BLOOD_PRIME_SAFETY_VOLUME_OVERRIDE: + handleBloodPrimeSafetyVolumeOverrideRequest( message ); break; - case MSG_ID_SUPER_CLEAR_ALARMS_CMD: - handleTestSuperClearAlarmsRequest( message ); + case MSG_ID_HD_RINSEBACK_VOLUME_OVERRIDE: + handleRinsebackVolumeOverrideRequest( message ); break; + case MSG_ID_HD_RINSEBACK_SAFETY_VOLUME_OVERRIDE: + handleRinsebackSafetyVolumeOverrideRequest( message ); + break; + case MSG_ID_HD_SYRINGE_PUMP_SEND_INTERVAL_OVERRIDE: handleTestSyringePumpDataBroadcastIntervalOverrideRequest( message ); break; @@ -1713,6 +1715,50 @@ handleSetHDServiceRecord( message ); break; + case MSG_ID_HD_ALARM_STATUS_PUBLISH_INTERVAL_OVERRIDE: + handleTestAlarmStatusSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_TREATMENT_TIME_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestTreatmentTimeDataSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_TREATMENT_RANGES_PUBLISH_INTERVAL_OVERRIDE: + handleTestTreatmentRangesSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_TREATMENT_STOP_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestTreatmentStopDataSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_BLOOD_PRIME_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestBloodPrimeDataSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_RINSEBACK_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestRinsebackDataSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_STANDBY_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestStandbyModeDataSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_OP_MODE_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestOpModeDataSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_PRE_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestPreTreatmentModeDataSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestTreatmentModeSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_POST_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestPostTreatmentModeSendIntervalOverrideRequest( message ); + break; + default: // Unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r3f2b9de757500da37e0ed8881e4e906d94f3076c -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 3f2b9de757500da37e0ed8881e4e906d94f3076c) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -23,6 +23,7 @@ #include "AlarmLamp.h" #include "Battery.h" #include "Buttons.h" +#include "Compatible.h" #include "ConsumableSelfTest.h" #include "FPGA.h" #include "ModeStandby.h" @@ -35,7 +36,8 @@ #include "SystemComm.h" #include "SystemCommMessages.h" #include "TreatmentEnd.h" -#include "TreatmentRecirc.h" +#include "TreatmentRecirc.h" +#include "TreatmentStop.h" #include "Utilities.h" #include "WatchdogMgmt.h" @@ -266,10 +268,58 @@ msg.payload[ 0 ] = cmd; // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer - result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_2_UI, ACK_NOT_REQUIRED ); + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_2_UI, ACK_REQUIRED ); return result; -} +} + +/*********************************************************************//** + * @brief + * The sendUIVersionRequest function constructs a UI version request msg + * to the UI and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: UI version request msg constructed and queued. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendUIVersionRequest( void ) +{ + BOOL result; + MESSAGE_T msg; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_UI_VERSION_INFO_REQUEST; + msg.hdr.payloadLen = 0; + + // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_2_UI, ACK_REQUIRED ); + + return result; +} + +/*********************************************************************//** + * @brief + * The sendDGPOSTResultRequest function constructs a POST result request msg + * to the DG and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: DG POST result request msg constructed and queued. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendDGPOSTResultRequest( void ) +{ + BOOL result; + MESSAGE_T msg; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_DG_POST_RESULT_REQUEST; + msg.hdr.payloadLen = 0; + + // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_2_DG, ACK_REQUIRED ); + + return result; +} /*********************************************************************//** * @brief @@ -2947,24 +2997,13 @@ *************************************************************************/ void handleUIAlarmSilenceRequest( MESSAGE_T *message ) { -#ifndef TEMP_UI_ALARM_SILENCE_FIX if ( message->hdr.payloadLen == sizeof( U32 ) ) -#else - if ( message->hdr.payloadLen == sizeof( U08 ) ) -#endif { U08 *payloadPtr = message->payload; -#ifndef TEMP_UI_ALARM_SILENCE_FIX U32 cmd; memcpy( &cmd, payloadPtr, sizeof( U32 ) ); signalAlarmSilence( (ALARM_SILENCE_CMD_T)cmd ); -#else - U08 cmd; - - memcpy( &cmd, payloadPtr, sizeof( U08 ) ); - signalAlarmSilence( (ALARM_SILENCE_CMD_T)cmd ); -#endif } else { @@ -3077,8 +3116,7 @@ BOOL passed; memcpy( &passed, payloadPtr, sizeof( BOOL ) ); - - // TODO - handle DG POST final result + signalDGPOSTFinalResult( passed ); } else { @@ -3946,11 +3984,15 @@ HD_VERSIONS_T payload; U08 *payloadPtr = msg.payload; - // Populate payload + // Get UI version data from this request msg and have it recorded + handleUIVersionResponse( message ); + + // Populate payload for response payload.major = (U08)HD_VERSION_MAJOR; payload.minor = (U08)HD_VERSION_MINOR; payload.micro = (U08)HD_VERSION_MICRO; payload.build = (U16)HD_VERSION_BUILD; + payload.compatibilityRev = (U32)SW_COMPATIBILITY_REV; getFPGAVersions( &payload.fpgaId, &payload.fpgaMajor, &payload.fpgaMinor, &payload.fpgaLab ); // Create a message record @@ -3967,6 +4009,27 @@ /*********************************************************************//** * @brief + * The handleUIVersionResponse function handles a response to request for + * UI version information. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle. + * @return none + *************************************************************************/ +void handleUIVersionResponse( MESSAGE_T *message ) +{ + // Get UI version data and have it recorded + if ( sizeof(UI_VERSIONS_T) == message->hdr.payloadLen ) + { + UI_VERSIONS_T uiVersion; + + memcpy( &uiVersion, &message->payload[0], sizeof(UI_VERSIONS_T) ); + signalUIVersion( uiVersion ); + } +} + +/*********************************************************************//** + * @brief * The handleHDSerialNumberRequest function handles a request for HD serial * number request. * @details Inputs: none @@ -3998,6 +4061,26 @@ /*********************************************************************//** * @brief + * The handleDGVersionResponse function handles a response for DG f/w version. + * @details Inputs: none + * @details Outputs: message handled, DG version info recorded. + * @param message a pointer to the message to handle. + * @return none + *************************************************************************/ +void handleDGVersionResponse( MESSAGE_T *message ) +{ + // Get DG version data from this response msg and have it recorded + if ( sizeof(DG_VERSIONS_T) == message->hdr.payloadLen ) + { + DG_VERSIONS_T dgVersion; + + memcpy( &dgVersion, &message->payload[0], sizeof(DG_VERSIONS_T) ); + signalDGVersion( dgVersion ); + } +} + +/*********************************************************************//** + * @brief * The handleHDServiceScheduleRequest function handles a request for HD * service information. * @details Inputs: none @@ -6109,6 +6192,134 @@ /*********************************************************************//** * @brief + * The handleBloodPrimeVolumeOverrideRequest function handles a request to + * override the calculated blood prime volume (in mL). + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleBloodPrimeVolumeOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetBloodPrimeVolumeOverride( payload.state.f32 ); + } + else + { + result = testResetBloodPrimeVolumeOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleBloodPrimeSafetyVolumeOverrideRequest function handles a request to + * override the calculated safety blood prime volume (in mL). + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleBloodPrimeSafetyVolumeOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetBloodPrimeSafetyVolumeOverride( payload.state.f32 ); + } + else + { + result = testResetBloodPrimeSafetyVolumeOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleRinsebackVolumeOverrideRequest function handles a request to + * override the calculated rinseback volume (in mL). + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleRinsebackVolumeOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetRinsebackVolumeOverride( payload.state.f32 ); + } + else + { + result = testResetRinsebackVolumeOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleRinsebackSafetyVolumeOverrideRequest function handles a request to + * override the calculated safety rinseback volume (in mL). + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleRinsebackSafetyVolumeOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetRinsebackSafetyVolumeOverride( payload.state.f32 ); + } + else + { + result = testResetRinsebackSafetyVolumeOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief * The handleHDSoftwareResetRequest function handles a request to reset the * HD firmware processor. * @details Inputs: none @@ -6842,6 +7053,358 @@ /*********************************************************************//** * @brief + * The handleTestAlarmStatusSendIntervalOverrideRequest function handles a + * request to override the HD alarm status broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestAlarmStatusSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetAlarmStatusPublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetAlarmStatusPublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestTreatmentTimeDataSendIntervalOverrideRequest function handles a + * request to override the HD treatment time data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestTreatmentTimeDataSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetTreatmentTimePublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetTreatmentTimePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestTreatmentRangesSendIntervalOverrideRequest function handles a + * request to override the HD treatment param ranges broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestTreatmentRangesSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetTreatmentParamRangesPublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetTreatmentParamRangesPublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestTreatmentStopDataSendIntervalOverrideRequest function handles a + * request to override the HD treatment stop sub-mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestTreatmentStopDataSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetTreatmentStopPublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetTreatmentStopPublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestBloodPrimeDataSendIntervalOverrideRequest function handles a + * request to override the HD blood prime sub-mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestBloodPrimeDataSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetBloodPrimePublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetBloodPrimePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestRinsebackDataSendIntervalOverrideRequest function handles a + * request to override the HD rinseback sub-mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestRinsebackDataSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetRinsebackPublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetRinsebackPublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestStandbyModeDataSendIntervalOverrideRequest function handles a + * request to override the HD standby mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestStandbyModeDataSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetStandbyModePublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetStandbyModePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestOpModeDataSendIntervalOverrideRequest function handles a + * request to override the HD operation mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestOpModeDataSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetOpModePublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetOpModePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestPreTreatmentModeDataSendIntervalOverrideRequest function handles a + * request to override the HD pre-treatment mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestPreTreatmentModeDataSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetPreTreatmentModePublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetPreTreatmentModePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestTreatmentModeSendIntervalOverrideRequest function handles a + * request to override the HD treatment mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestTreatmentModeSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetTreatmentStatePublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetTreatmentStatePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestPostTreatmentModeSendIntervalOverrideRequest function handles a + * request to override the HD post-treatment mode data broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestPostTreatmentModeSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetPostTreatmentModePublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetPostTreatmentModePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief * The handleTestAlarmAudioVolumeOverrideRequest function handles a * request to override the alarm audio volume level. * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r3f2b9de757500da37e0ed8881e4e906d94f3076c -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 3f2b9de757500da37e0ed8881e4e906d94f3076c) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -29,7 +29,8 @@ #include "Dialysis.h" #include "FluidLeak.h" #include "HDCommon.h" -#include "Prime.h" +#include "Prime.h" +#include "ModeInitPOST.h" #include "ModePostTreat.h" #include "ModePreTreat.h" #include "ModeStandby.h" @@ -68,6 +69,12 @@ // MSG_ID_REQUEST_FW_VERSIONS void handleFWVersionRequest( MESSAGE_T *message ); +// MSG_ID_HD_UI_VERSION_INFO_RESPONSE +void handleUIVersionResponse( MESSAGE_T *message ); + +// MSG_ID_HD_UI_VERSION_INFO_REQUEST +BOOL sendUIVersionRequest( void ); + // MSG_ID_REQUEST_FW_VERSIONS void handleHDSerialNumberRequest( void ); @@ -77,6 +84,12 @@ // MSG_ID_REQUEST_HD_USAGE_INFO void handleHDUsageInfoRequest( MESSAGE_T *message ); +// MSG_ID_DG_VERSION +void handleDGVersionResponse( MESSAGE_T *message ); + +// MSG_ID_HD_DG_POST_RESULT_REQUEST +BOOL sendDGPOSTResultRequest( void ); + // MSG_ID_OFF_BUTTON_PRESS BOOL sendOffButtonMsgToUI( U08 cmd ); void handleOffButtonConfirmMsgFromUI( MESSAGE_T *message ); @@ -178,8 +191,8 @@ BOOL sendTreatmentPeriodicDataToUI( TREATMENT_LOG_DATA_PERIODIC_T * periodDataPtr ); // MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_REQUEST -void handleChangeBloodDialysateRateChangeRequest( MESSAGE_T *message ); - +void handleChangeBloodDialysateRateChangeRequest( MESSAGE_T *message ); + // MSG_ID_USER_SALINE_BOLUS_REQUEST void handleSalineBolusRequest( MESSAGE_T *message ); @@ -679,6 +692,18 @@ // MSG_ID_HD_BUBBLE_SELF_TEST_REQUEST void handleBubbleSelfTestRequest( MESSAGE_T *message ); +// MSG_ID_HD_BLOOD_PRIME_VOLUME_OVERRIDE +void handleBloodPrimeVolumeOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_BLOOD_PRIME_SAFETY_VOLUME_OVERRIDE +void handleBloodPrimeSafetyVolumeOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_RINSEBACK_VOLUME_OVERRIDE +void handleRinsebackVolumeOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_RINSEBACK_SAFETY_VOLUME_OVERRIDE +void handleRinsebackSafetyVolumeOverrideRequest( MESSAGE_T *message ); + // MSG_ID_HD_SWITCHES_STATUS_OVERRIDE void handleSetSwitchesStatusOverrideRequest( MESSAGE_T *message ); @@ -778,6 +803,39 @@ // MSG_ID_HD_SYRINGE_PUMP_ADC_READ_COUNTER_OVERRIDE void handleTestSyringePumpADCReadCtrOverrideRequest( MESSAGE_T *message ); +// MSG_ID_HD_ALARM_STATUS_PUBLISH_INTERVAL_OVERRIDE +void handleTestAlarmStatusSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_TREATMENT_TIME_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestTreatmentTimeDataSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_TREATMENT_RANGES_PUBLISH_INTERVAL_OVERRIDE +void handleTestTreatmentRangesSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_TREATMENT_STOP_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestTreatmentStopDataSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_BLOOD_PRIME_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestBloodPrimeDataSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_RINSEBACK_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestRinsebackDataSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_STANDBY_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestStandbyModeDataSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_OP_MODE_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestOpModeDataSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_PRE_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestPreTreatmentModeDataSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestTreatmentModeSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_POST_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestPostTreatmentModeSendIntervalOverrideRequest( MESSAGE_T *message ); + /**@}*/ #endif Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -r60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -26,6 +26,7 @@ #include "OperationModes.h" #include "PresOccl.h" #include "RTC.h" +#include "Switches.h" #include "SystemComm.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -59,7 +60,7 @@ checkInWithWatchdogMgmt( TASK_GENERAL ); // Do this first to keep timing consistent with watchdog management // Manage data received from other sub-systems - execSystemCommRx(); + execSystemCommRx(); // Prevent most processing until UI has started communicating #ifndef SIMULATE_UI @@ -80,6 +81,10 @@ execOperationModes(); #ifndef BOARD_WITH_NO_HARDWARE + + // Manage RTC + execRTC(); + // Control air trap valve execAirTrapController(); @@ -91,11 +96,11 @@ // Control dialysate outlet pump (keep after call to BP and DPi controllers) execDialOutFlowController(); -#endif - - // Manage RTC - execRTC(); + // Monitor switches + execSwitches(); +#endif + // Manage NVDataMgmt process record state machine execNVDataMgmtProcessRecord(); Index: firmware/HD.dil =================================================================== diff -u -r44a100f8e5210a02c23b8fcc4527d8e96d577381 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/HD.dil (.../HD.dil) (revision 44a100f8e5210a02c23b8fcc4527d8e96d577381) +++ firmware/HD.dil (.../HD.dil) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -1,4 +1,4 @@ -# RM46L852PGE 04/21/21 08:43:45 +# RM46L852PGE 07/27/21 12:57:43 # ARCH=RM46L852PGE # @@ -61,7 +61,7 @@ DRIVER.SYSTEM.VAR.SAFETY_INIT_MIBSPI2_RAMPARITYCHECK_ENA.VALUE=0 DRIVER.SYSTEM.VAR.CRC_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.MIBSPI1_ENABLE.VALUE=1 -DRIVER.SYSTEM.VAR.CLKT_HCLK_FREQ.VALUE=206.670 +DRIVER.SYSTEM.VAR.CLKT_HCLK_FREQ.VALUE=208.000 DRIVER.SYSTEM.VAR.CLKT_PLL2_FREQ.VALUE=220.00 DRIVER.SYSTEM.VAR.VIM_CHANNEL_81_MAPPING.VALUE=81 DRIVER.SYSTEM.VAR.VIM_CHANNEL_73_MAPPING.VALUE=73 @@ -181,7 +181,7 @@ DRIVER.SYSTEM.VAR.VIM_CHANNEL_9_INT_PRAGMA_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.ADC1_ENABLE.VALUE=1 DRIVER.SYSTEM.VAR.MIBSPI_ENABLE.VALUE=1 -DRIVER.SYSTEM.VAR.ECLK_VCLK1_FREQ.VALUE=103.335 +DRIVER.SYSTEM.VAR.ECLK_VCLK1_FREQ.VALUE=104.000 DRIVER.SYSTEM.VAR.CLKT_EXTERNAL_FREQ.VALUE=00.0 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_11_SIZE_VALUE.VALUE=0x0F DRIVER.SYSTEM.VAR.VIM_CHANNEL_125_NAME.VALUE=phantomInterrupt @@ -249,7 +249,7 @@ DRIVER.SYSTEM.VAR.CLKT_EXTERNAL_FREQ_INPUT.VALUE=16.0 DRIVER.SYSTEM.VAR.STC_INTERVAL.VALUE=24 DRIVER.SYSTEM.VAR.CLKT_LPO_HIGH_TRIM_VALUE.VALUE=16 -DRIVER.SYSTEM.VAR.CLKT_GCLK_FREQ.VALUE=206.670 +DRIVER.SYSTEM.VAR.CLKT_GCLK_FREQ.VALUE=208.000 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_1_PERMISSION_VALUE.VALUE=0x1000 DRIVER.SYSTEM.VAR.VIM_CHANNEL_80_MAPPING.VALUE=80 DRIVER.SYSTEM.VAR.VIM_CHANNEL_72_MAPPING.VALUE=72 @@ -520,7 +520,7 @@ DRIVER.SYSTEM.VAR.ETPWM_OLDCODE.VALUE=1 DRIVER.SYSTEM.VAR.SCI2_ENABLE.VALUE=1 DRIVER.SYSTEM.VAR.LIN_ENABLE.VALUE=0 -DRIVER.SYSTEM.VAR.CLKT_RTI1_FREQ.VALUE=103.335 +DRIVER.SYSTEM.VAR.CLKT_RTI1_FREQ.VALUE=104.000 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_4_SIZE_VALUE.VALUE=0x11 DRIVER.SYSTEM.VAR.VIM_CHANNEL_6_MAPPING.VALUE=6 DRIVER.SYSTEM.VAR.CLKT_PLL2_SPEADING_AMOUNT.VALUE=61 @@ -542,8 +542,8 @@ DRIVER.SYSTEM.VAR.VIM_CHANNEL_58_INT_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.SAFETY_INIT_MIBSPI5_DP_PBISTCHECK_ENA.VALUE=0x00000100 DRIVER.SYSTEM.VAR.CLKT_PLL2_RESET_ON_SLIP.VALUE=0x00000000 -DRIVER.SYSTEM.VAR.ECLK_FREQ.VALUE=12.917 -DRIVER.SYSTEM.VAR.CLKT_AVCLK1_FREQ.VALUE=103.335 +DRIVER.SYSTEM.VAR.ECLK_FREQ.VALUE=13.000 +DRIVER.SYSTEM.VAR.CLKT_AVCLK1_FREQ.VALUE=104.000 DRIVER.SYSTEM.VAR.VIM_CHANNEL_100_MAPPING.VALUE=100 DRIVER.SYSTEM.VAR.VIM_CHANNEL_93_NAME.VALUE=etpwm2TripZoneInterrupt DRIVER.SYSTEM.VAR.VIM_CHANNEL_85_NAME.VALUE=phantomInterrupt @@ -568,8 +568,8 @@ DRIVER.SYSTEM.VAR.VIM_CHANNEL_1_INT_ENABLE.VALUE=1 DRIVER.SYSTEM.VAR.SPI4_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.CLKT_AVCLK4_POST_SOURCE.VALUE=VCLKA4_DIVR -DRIVER.SYSTEM.VAR.CLKT_VCLK1_FREQ.VALUE=103.335 -DRIVER.SYSTEM.VAR.CLKT_AVCLK3_FREQ1.VALUE=103.335 +DRIVER.SYSTEM.VAR.CLKT_VCLK1_FREQ.VALUE=104.000 +DRIVER.SYSTEM.VAR.CLKT_AVCLK3_FREQ1.VALUE=104.000 DRIVER.SYSTEM.VAR.VIM_CHANNEL_93_MAPPING.VALUE=93 DRIVER.SYSTEM.VAR.VIM_CHANNEL_85_MAPPING.VALUE=85 DRIVER.SYSTEM.VAR.VIM_CHANNEL_77_MAPPING.VALUE=77 @@ -588,7 +588,7 @@ DRIVER.SYSTEM.VAR.VIM_CHANNEL_28_INT_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.VIM_CHANNEL_25_INT_TYPE.VALUE=IRQ DRIVER.SYSTEM.VAR.VIM_CHANNEL_17_INT_TYPE.VALUE=IRQ -DRIVER.SYSTEM.VAR.CLKT_PLL1_MUL.VALUE=155 +DRIVER.SYSTEM.VAR.CLKT_PLL1_MUL.VALUE=156 DRIVER.SYSTEM.VAR.VIM_CHANNEL_60_NAME.VALUE=phantomInterrupt DRIVER.SYSTEM.VAR.VIM_CHANNEL_52_NAME.VALUE=phantomInterrupt DRIVER.SYSTEM.VAR.VIM_CHANNEL_44_NAME.VALUE=phantomInterrupt @@ -709,7 +709,7 @@ DRIVER.SYSTEM.VAR.SAFETY_INIT_CAN3_RAMPARITYCHECK_ENA.VALUE=1 DRIVER.SYSTEM.VAR.SAFETY_INIT_RAMECC_SELFCHECK_ENA.VALUE=1 DRIVER.SYSTEM.VAR.ADC2_ENABLE.VALUE=0 -DRIVER.SYSTEM.VAR.CLKT_VCLK2_FREQ.VALUE=103.335 +DRIVER.SYSTEM.VAR.CLKT_VCLK2_FREQ.VALUE=104.000 DRIVER.SYSTEM.VAR.FLASH_DATA_2_WAIT_STATE_FREQ.VALUE=165.0 DRIVER.SYSTEM.VAR.VIM_CHANNEL_5_MAPPING.VALUE=5 DRIVER.SYSTEM.VAR.VIM_PARITY_INTERRUPT_MAPPED_TO_VIM.VALUE=FALSE @@ -808,7 +808,7 @@ DRIVER.SYSTEM.VAR.VIM_CHANNEL_19_INT_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.VIM_CHANNEL_13_INT_TYPE.VALUE=IRQ DRIVER.SYSTEM.VAR.SAFETY_INIT_ADC2_RAMPARITYCHECK_ENA.VALUE=1 -DRIVER.SYSTEM.VAR.CLKT_AVCLK3_FREQ.VALUE=103.335 +DRIVER.SYSTEM.VAR.CLKT_AVCLK3_FREQ.VALUE=104.000 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_9_TYPE_VALUE.VALUE=0x0010 DRIVER.SYSTEM.VAR.VIM_CHANNEL_95_NAME.VALUE=etpwm3TripZoneInterrupt DRIVER.SYSTEM.VAR.VIM_CHANNEL_87_NAME.VALUE=phantomInterrupt @@ -844,8 +844,8 @@ DRIVER.SYSTEM.VAR.DCC1_ENABLE.VALUE=1 DRIVER.SYSTEM.VAR.HET2_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.SAFETY_INIT_PBIST_ESRAM_SELECTED.VALUE=1 -DRIVER.SYSTEM.VAR.CLKT_VCLK3_FREQ.VALUE=103.335 -DRIVER.SYSTEM.VAR.CLKT_AVCLK4_FREQ1.VALUE=103.335 +DRIVER.SYSTEM.VAR.CLKT_VCLK3_FREQ.VALUE=104.000 +DRIVER.SYSTEM.VAR.CLKT_AVCLK4_FREQ1.VALUE=104.000 DRIVER.SYSTEM.VAR.PBIST_ALGO_11_12.VALUE=0 DRIVER.SYSTEM.VAR.CLKT_PLL2_SOURCE_ENABLE.VALUE=0x00000000 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_10_SUB_7_DISABLE.VALUE=0 @@ -934,7 +934,7 @@ DRIVER.SYSTEM.VAR.MIBSPI5_ENABLE.VALUE=1 DRIVER.SYSTEM.VAR.FLASH_BANK_CONFIG_0.VALUE=ACTIVE DRIVER.SYSTEM.VAR.PMM_PMCTRL_PWRDN.VALUE=0 -DRIVER.SYSTEM.VAR.CLKT_AVCLK4_FREQ.VALUE=103.335 +DRIVER.SYSTEM.VAR.CLKT_AVCLK4_FREQ.VALUE=104.000 DRIVER.SYSTEM.VAR.FLASH_BANK_CONFIG_1.VALUE=ACTIVE DRIVER.SYSTEM.VAR.VIM_CHANNEL_96_NAME.VALUE=etpwm4Interrupt DRIVER.SYSTEM.VAR.VIM_CHANNEL_91_MAPPING.VALUE=91 @@ -978,7 +978,7 @@ DRIVER.SYSTEM.VAR.VIM_CHANNEL_56_INT_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.VIM_CHANNEL_48_INT_ENABLE.VALUE=0 DRIVER.SYSTEM.VAR.SAFETY_INIT_HTU1_RAMPARITYCHECK_ENA.VALUE=1 -DRIVER.SYSTEM.VAR.CLKT_VCLK4_FREQ.VALUE=103.335 +DRIVER.SYSTEM.VAR.CLKT_VCLK4_FREQ.VALUE=104.000 DRIVER.SYSTEM.VAR.VIM_CHANNEL_60_MAPPING.VALUE=60 DRIVER.SYSTEM.VAR.VIM_CHANNEL_52_MAPPING.VALUE=52 DRIVER.SYSTEM.VAR.VIM_CHANNEL_44_MAPPING.VALUE=44 @@ -1174,10 +1174,10 @@ DRIVER.SYSTEM.VAR.SAFETY_INIT_CAN2_RAMPARITYCHECK_ENA.VALUE=1 DRIVER.SYSTEM.VAR.ERRATA_WORKAROUND_13.VALUE=1 DRIVER.SYSTEM.VAR.POM_ENABLE.VALUE=0 -DRIVER.SYSTEM.VAR.CLKT_PLL1_MUL_VAL.VALUE=9A00 +DRIVER.SYSTEM.VAR.CLKT_PLL1_MUL_VAL.VALUE=9B00 DRIVER.SYSTEM.VAR.ERRATA_WORKAROUND_14.VALUE=1 DRIVER.SYSTEM.VAR.CLKT_AVCLK3_SOURCE.VALUE=VCLK -DRIVER.SYSTEM.VAR.CLKT_PLL1_FREQ.VALUE=206.67 +DRIVER.SYSTEM.VAR.CLKT_PLL1_FREQ.VALUE=208.00 DRIVER.SYSTEM.VAR.CORE_MPU_REGION_1_SIZE_VALUE.VALUE=0x1F DRIVER.SYSTEM.VAR.VIM_CHANNEL_31_NAME.VALUE=phantomInterrupt DRIVER.SYSTEM.VAR.VIM_CHANNEL_23_NAME.VALUE=gioLowLevelInterrupt @@ -1354,7 +1354,7 @@ DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL37_ENABLE.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL29_ENABLE.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL58_INT_LEVEL.VALUE=0 -DRIVER.ESM.VAR.ESM_LOW_TIME.VALUE=158.552 +DRIVER.ESM.VAR.ESM_LOW_TIME.VALUE=157.538 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL30_ENABLE.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL22_ENABLE.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL14_ENABLE.VALUE=0 @@ -1390,7 +1390,7 @@ DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL12_ENABLE.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL56_INT_LEVEL.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL48_INT_LEVEL.VALUE=0 -DRIVER.ESM.VAR.ESM_VCLK_FREQ.VALUE=103.335 +DRIVER.ESM.VAR.ESM_VCLK_FREQ.VALUE=104 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL30_INT_ENABLE.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL22_INT_ENABLE.VALUE=0 DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL14_INT_ENABLE.VALUE=0 @@ -1472,50 +1472,50 @@ DRIVER.ESM.VAR.ESM_GROUP0_CHANNEL49_INT_LEVEL.VALUE=0 DRIVER.RTI.VAR.RTI_1_COMPARE_2_SOURCE.VALUE=0x00000100 DRIVER.RTI.VAR.RTI_1_COMPARE_3_FREQ.VALUE=0.000100000 -DRIVER.RTI.VAR.RTI_1_FREQ.VALUE=103.335 +DRIVER.RTI.VAR.RTI_1_FREQ.VALUE=104.000 DRIVER.RTI.VAR.RTI_1_COMPARE_1_ACTUALTIME.VALUE=10.000 DRIVER.RTI.VAR.RTI_1_COUNTER_1_UC_COMPARE.VALUE=9 DRIVER.RTI.VAR.RTI_1_COMPARE_1_TIME.VALUE=10.0 -DRIVER.RTI.VAR.RTI_1_COMPARE_3_UPDATE.VALUE=516675 +DRIVER.RTI.VAR.RTI_1_COMPARE_3_UPDATE.VALUE=520000 DRIVER.RTI.VAR.RTI_1_CONTINUE_ON_SUSPEND_ENABLE.VALUE=0x00000000 -DRIVER.RTI.VAR.RTI_1_COMPARE_1_INPUT_FREQ.VALUE=10.333500000 +DRIVER.RTI.VAR.RTI_1_COMPARE_1_INPUT_FREQ.VALUE=10.400000000 DRIVER.RTI.VAR.RTI_1_COMPARE_0_SOURCE.VALUE=0x00000000 DRIVER.RTI.VAR.RTI_1_COMPARE_2_TIME.VALUE=8.000 DRIVER.RTI.VAR.RTI_1_COMPARE_0_ACTUALTIME.VALUE=1.000 DRIVER.RTI.VAR.RTI_1_COUNTER_0_UC_COMPARE.VALUE=9 -DRIVER.RTI.VAR.RTI_1_COMPARE_1_UPDATE.VALUE=103335 +DRIVER.RTI.VAR.RTI_1_COMPARE_1_UPDATE.VALUE=104000 DRIVER.RTI.VAR.RTI_1_COMPARE_3_TIME.VALUE=50.0 DRIVER.RTI.VAR.RTI_1_COUNTER_0_NTU_SOURCE.VALUE=0 -DRIVER.RTI.VAR.RTI_1_COMPARE_0_INPUT_FREQ.VALUE=10.333500000 +DRIVER.RTI.VAR.RTI_1_COMPARE_0_INPUT_FREQ.VALUE=10.400000000 DRIVER.RTI.VAR.RTI_1_COUNTER_0_RTI_FREQ.VALUE=0.0 -DRIVER.RTI.VAR.RTI_1_COUNTER_0_FREQ.VALUE=10.333500000 +DRIVER.RTI.VAR.RTI_1_COUNTER_0_FREQ.VALUE=10.400000000 DRIVER.RTI.VAR.RTI_1_COUNTER_1_FREQUENCY.VALUE=10.000 DRIVER.RTI.VAR.RTI_1_COMPARE_3_SOURCE.VALUE=0x00000000 -DRIVER.RTI.VAR.RTI_1_COUNTER_1_FREQ.VALUE=10.333500000 +DRIVER.RTI.VAR.RTI_1_COUNTER_1_FREQ.VALUE=10.400000000 DRIVER.RTI.VAR.RTI_1_COUNTER_0_NTU_SOURCE_REG.VALUE=0x0 DRIVER.RTI.VAR.RTI_1_COMPARE_1_SOURCE.VALUE=0x00000000 DRIVER.RTI.VAR.RTI_1_NTU_1_FREQ.VALUE=0.0 DRIVER.RTI.VAR.RTI_1_COMPARE_3_ACTUALTIME.VALUE=50.000 DRIVER.RTI.VAR.RTI_1_COMPARE_0_FREQ.VALUE=0.001000000 -DRIVER.RTI.VAR.RTI_1_COMPARE_2_UPDATE.VALUE=82668 +DRIVER.RTI.VAR.RTI_1_COMPARE_2_UPDATE.VALUE=83200 DRIVER.RTI.VAR.RTI_1_BASE.VALUE=0xFFFFFC00 DRIVER.RTI.VAR.RTI_1_NTU_2_FREQ.VALUE=0.0 -DRIVER.RTI.VAR.RTI_1_COMPARE_3_INPUT_FREQ.VALUE=10.333500000 +DRIVER.RTI.VAR.RTI_1_COMPARE_3_INPUT_FREQ.VALUE=10.400000000 DRIVER.RTI.VAR.RTI_1_COMPARE_1_FREQ.VALUE=0.000200000 DRIVER.RTI.VAR.RTI_1_COUNTER_0_CAPTURE_SOURCE_ENABLE.VALUE=0 DRIVER.RTI.VAR.RTI_1_COUNTER_1_CAPTURE_SOURCE_ENABLE.VALUE=0 -DRIVER.RTI.VAR.RTI_1_COMPARE_0_UPDATE.VALUE=10334 +DRIVER.RTI.VAR.RTI_1_COMPARE_0_UPDATE.VALUE=10400 DRIVER.RTI.VAR.RTI_1_NTU_3_FREQ.VALUE=220.000 -DRIVER.RTI.VAR.RTI_1_COMPARE_0.VALUE=10334 +DRIVER.RTI.VAR.RTI_1_COMPARE_0.VALUE=10400 DRIVER.RTI.VAR.RTI_1_COMPARE_2_ACTUALTIME.VALUE=8.000 -DRIVER.RTI.VAR.RTI_1_COMPARE_1.VALUE=103335 -DRIVER.RTI.VAR.RTI_1_COMPARE_2.VALUE=82668 -DRIVER.RTI.VAR.RTI_1_COMPARE_3.VALUE=516675 +DRIVER.RTI.VAR.RTI_1_COMPARE_1.VALUE=104000 +DRIVER.RTI.VAR.RTI_1_COMPARE_2.VALUE=83200 +DRIVER.RTI.VAR.RTI_1_COMPARE_3.VALUE=520000 DRIVER.RTI.VAR.RTI_1_COUNTER_0_NTU_FREQ.VALUE=0.000 DRIVER.RTI.VAR.RTI_1_COMPARE_2_FREQ.VALUE=0.000125000 DRIVER.RTI.VAR.RTI_1_COMPARE_0_TIME.VALUE=1 DRIVER.RTI.VAR.RTI_1_NTU_4_FREQ.VALUE=0.000 -DRIVER.RTI.VAR.RTI_1_COMPARE_2_INPUT_FREQ.VALUE=10.333500000 +DRIVER.RTI.VAR.RTI_1_COMPARE_2_INPUT_FREQ.VALUE=10.400000000 DRIVER.RTI.VAR.RTI_1_COUNTER_0_FREQUENCY.VALUE=10.000 DRIVER.GIO.VAR.GIO_PORT1_BIT4_PULL.VALUE=1 DRIVER.GIO.VAR.GIO_PORT0_BIT5_DIR.VALUE=0 @@ -1611,14 +1611,14 @@ DRIVER.GIO.VAR.GIO_PORT1_BIT2_POL.VALUE=0 DRIVER.GIO.VAR.GIO_PORT0_BIT0_DIR.VALUE=0 DRIVER.GIO.VAR.GIO_PORT1_BIT6_ENA.VALUE=0 -DRIVER.GIO.VAR.GIO_PORT1_BIT2_PSL.VALUE=1 +DRIVER.GIO.VAR.GIO_PORT1_BIT2_PSL.VALUE=0 DRIVER.GIO.VAR.GIO_PORT1_BIT6_DIR.VALUE=0 DRIVER.GIO.VAR.GIO_BASE.VALUE=0xFFF7BC00 DRIVER.GIO.VAR.GIO_PORT1_BIT3_LVL.VALUE=0 DRIVER.GIO.VAR.GIO_PORT0_BIT1_ENA.VALUE=0 DRIVER.GIO.VAR.GIO_PORT1_BIT4_PDR.VALUE=0 DRIVER.GIO.VAR.GIO_PORT1_BIT3_POL.VALUE=0 -DRIVER.GIO.VAR.GIO_PORT1_BIT2_PULL.VALUE=2 +DRIVER.GIO.VAR.GIO_PORT1_BIT2_PULL.VALUE=1 DRIVER.GIO.VAR.GIO_PORT0_BIT1_DIR.VALUE=0 DRIVER.GIO.VAR.GIO_PORT1_BIT5_DOUT.VALUE=0 DRIVER.GIO.VAR.GIO_PORT0_BIT6_PULL.VALUE=0 @@ -1673,7 +1673,7 @@ DRIVER.SCI.VAR.SCI_PORT_BIT2_PULL.VALUE=2 DRIVER.SCI.VAR.SCILIN_PORT_BIT1_DIR.VALUE=0 DRIVER.SCI.VAR.SCI_PORT_BIT0_DIR.VALUE=0 -DRIVER.SCI.VAR.SCI_ACTUALBAUDRATE.VALUE=115329 +DRIVER.SCI.VAR.SCI_ACTUALBAUDRATE.VALUE=116071 DRIVER.SCI.VAR.SCI_EVENPARITY.VALUE=0 DRIVER.SCI.VAR.SCILIN_PORT_BIT0_FUN.VALUE=0 DRIVER.SCI.VAR.SCILIN_PORT_BIT2_DIR.VALUE=1 @@ -1752,7 +1752,7 @@ DRIVER.SCI.VAR.SCILIN_RXINTENA.VALUE=0 DRIVER.SCI.VAR.SCILIN_LENGTH.VALUE=8 DRIVER.SCI.VAR.SCILIN_FEINTLVL.VALUE=0 -DRIVER.SCI.VAR.SCILIN_ACTUALBAUDRATE.VALUE=922634 +DRIVER.SCI.VAR.SCILIN_ACTUALBAUDRATE.VALUE=928571 DRIVER.SCI.VAR.SCILIN_PORT_BIT1_PULDIS.VALUE=0 DRIVER.SCI.VAR.SCI_PORT_BIT0_PULDIS.VALUE=0 DRIVER.SCI.VAR.SCI_BASE.VALUE=0xFFF7E500 @@ -1790,7 +1790,7 @@ DRIVER.MIBSPI.VAR.MIBSPI1_PORT_BIT25_PDR.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI1_TG5_ONESHOT.VALUE=1 DRIVER.MIBSPI.VAR.MIBSPI1_TG1_PRST.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI1_C2TDELAYACTUAL.VALUE=19.355 +DRIVER.MIBSPI.VAR.MIBSPI1_C2TDELAYACTUAL.VALUE=19.231 DRIVER.MIBSPI.VAR.MIBSPI5_PORT_BIT1_DIR.VALUE=1 DRIVER.MIBSPI.VAR.MIBSPI3_PORT_BIT11_DIR.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI1_TIMEOUTLVL.VALUE=0 @@ -1817,17 +1817,17 @@ DRIVER.MIBSPI.VAR.MIBSPI3_PORT_BIT2_PSL.VALUE=1 DRIVER.MIBSPI.VAR.MIBSPI3_TG4_BUF_WDEL.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_TG0_ONESHOT.VALUE=1 -DRIVER.MIBSPI.VAR.MIBSPI3_ACTUALBAUDRATE0.VALUE=1003.252 +DRIVER.MIBSPI.VAR.MIBSPI3_ACTUALBAUDRATE0.VALUE=1000.000 DRIVER.MIBSPI.VAR.MIBSPI3_TG2_TRGSRC.VALUE=TRG_DISABLED -DRIVER.MIBSPI.VAR.MIBSPI3_ACTUALBAUDRATE1.VALUE=1003.252 +DRIVER.MIBSPI.VAR.MIBSPI3_ACTUALBAUDRATE1.VALUE=1000.000 DRIVER.MIBSPI.VAR.MIBSPI5_PORT_BIT0_FUN.VALUE=1 DRIVER.MIBSPI.VAR.MIBSPI3_PORT_BIT10_FUN.VALUE=1 -DRIVER.MIBSPI.VAR.MIBSPI3_ACTUALBAUDRATE2.VALUE=1003.252 +DRIVER.MIBSPI.VAR.MIBSPI3_ACTUALBAUDRATE2.VALUE=1000.000 DRIVER.MIBSPI.VAR.MIBSPI1_PORT_BIT3_PULL.VALUE=2 DRIVER.MIBSPI.VAR.MIBSPI1_TG0_LENGTH.VALUE=8 DRIVER.MIBSPI.VAR.MIBSPI5_TG0_CS_ENCODE.VALUE=0xFF DRIVER.MIBSPI.VAR.MIBSPI3_TG0_BUF_LOCK.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI3_ACTUALBAUDRATE3.VALUE=1003.252 +DRIVER.MIBSPI.VAR.MIBSPI3_ACTUALBAUDRATE3.VALUE=1000.000 DRIVER.MIBSPI.VAR.MIBSPI5_TG2_ONESHOT.VALUE=1 DRIVER.MIBSPI.VAR.MIBSPI3_TG7_PRST.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_C2EDELAYACTUAL.VALUE=0.000 @@ -1839,7 +1839,7 @@ DRIVER.MIBSPI.VAR.MIBSPI3_TG3_CS_ENCODE.VALUE=0xFF DRIVER.MIBSPI.VAR.MIBSPI3_TG0_BUF_MODE.VALUE=4 DRIVER.MIBSPI.VAR.MIBSPI5_TG6_BUF_WDEL.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI5_T2CDELAYACTUAL.VALUE=9.677 +DRIVER.MIBSPI.VAR.MIBSPI5_T2CDELAYACTUAL.VALUE=9.615 DRIVER.MIBSPI.VAR.MIBSPI3_PORT_BIT4_PDR.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_TG7_TRGEVT.VALUE=TRG_ALWAYS DRIVER.MIBSPI.VAR.MIBSPI3_TG5_BUF_CSHOLD_LASTBUF.VALUE=0 @@ -1885,38 +1885,38 @@ DRIVER.MIBSPI.VAR.MIBSPI1_TXINTENA.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_TG0_BUF_DFSEL.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_PORT_BIT5_PDR.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI1_PRESCALE0.VALUE=102 +DRIVER.MIBSPI.VAR.MIBSPI1_PRESCALE0.VALUE=103 DRIVER.MIBSPI.VAR.MIBSPI1_CLKMOD.VALUE=1 DRIVER.MIBSPI.VAR.MIBSPI5_TG3_TRGSRC.VALUE=TRG_DISABLED -DRIVER.MIBSPI.VAR.MIBSPI1_PRESCALE1.VALUE=102 +DRIVER.MIBSPI.VAR.MIBSPI1_PRESCALE1.VALUE=103 DRIVER.MIBSPI.VAR.MIBSPI5_TG5_BUF_CSHOLD_LASTBUF.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_TXINTLVL.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_TG2_BUF_CSHOLD.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_TG1_LENGTH.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI1_PRESCALE2.VALUE=102 +DRIVER.MIBSPI.VAR.MIBSPI1_PRESCALE2.VALUE=103 DRIVER.MIBSPI.VAR.MIBSPI5_PORT_BIT9_PULDIS.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_TIMEOUTENA.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI1_PRESCALE3.VALUE=102 +DRIVER.MIBSPI.VAR.MIBSPI1_PRESCALE3.VALUE=103 DRIVER.MIBSPI.VAR.MIBSPI5_PORT_BIT1_PDR.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_PORT_BIT11_PDR.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_TG3_BUF_DFSEL.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_PARITYENA0.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI1_PORT_BIT8_PSL.VALUE=1 DRIVER.MIBSPI.VAR.MIBSPI1_TG5_BUF_WDEL.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI1_ACTUALBAUDRATE0.VALUE=1003.252 +DRIVER.MIBSPI.VAR.MIBSPI1_ACTUALBAUDRATE0.VALUE=1000.000 DRIVER.MIBSPI.VAR.MIBSPI3_PARITYENA1.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI1_ACTUALBAUDRATE1.VALUE=1003.252 +DRIVER.MIBSPI.VAR.MIBSPI1_ACTUALBAUDRATE1.VALUE=1000.000 DRIVER.MIBSPI.VAR.MIBSPI3_PORT_BIT9_PULL.VALUE=2 DRIVER.MIBSPI.VAR.MIBSPI3_PARITYENA2.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_DLENERRLVL.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI1_TG4_TRGEVT.VALUE=TRG_ALWAYS DRIVER.MIBSPI.VAR.MIBSPI1_TG2_BUF_CSHOLD_LASTBUF.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI1_ACTUALBAUDRATE2.VALUE=1003.252 +DRIVER.MIBSPI.VAR.MIBSPI1_ACTUALBAUDRATE2.VALUE=1000.000 DRIVER.MIBSPI.VAR.MIBSPI5_PORT_BIT2_PULDIS.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_PARITYENA3.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_BITERRENA.VALUE=1 DRIVER.MIBSPI.VAR.MIBSPI1_TG1_BUF_LOCK.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI1_ACTUALBAUDRATE3.VALUE=1003.252 +DRIVER.MIBSPI.VAR.MIBSPI1_ACTUALBAUDRATE3.VALUE=1000.000 DRIVER.MIBSPI.VAR.MIBSPI5_TG4_PRST.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_PORT_BIT4_PSL.VALUE=1 DRIVER.MIBSPI.VAR.MIBSPI1_TG6_BUF_DFSEL.VALUE=0 @@ -1935,7 +1935,7 @@ DRIVER.MIBSPI.VAR.MIBSPI3_WDELAY0.VALUE=20 DRIVER.MIBSPI.VAR.MIBSPI1_PORT_BIT17_DOUT.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI1_PORT_BIT25_DOUT.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI1_T2CDELAYACTUAL.VALUE=9.677 +DRIVER.MIBSPI.VAR.MIBSPI1_T2CDELAYACTUAL.VALUE=9.615 DRIVER.MIBSPI.VAR.MIBSPI3_WDELAY1.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_TG1_TRGEVT.VALUE=TRG_ALWAYS DRIVER.MIBSPI.VAR.MIBSPI3_WDELAY2.VALUE=0 @@ -2136,7 +2136,7 @@ DRIVER.MIBSPI.VAR.MIBSPI1_TG0_BUF_MODE.VALUE=4 DRIVER.MIBSPI.VAR.MIBSPI3_TG6_BUF_WDEL.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_TG4_ONESHOT.VALUE=1 -DRIVER.MIBSPI.VAR.MIBSPI3_C2TDELAYACTUAL.VALUE=19.355 +DRIVER.MIBSPI.VAR.MIBSPI3_C2TDELAYACTUAL.VALUE=19.231 DRIVER.MIBSPI.VAR.MIBSPI1_WDELAY0.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI1_WDELAY1.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_PORT_BIT11_DIR.VALUE=1 @@ -2273,7 +2273,7 @@ DRIVER.MIBSPI.VAR.MIBSPI3_PORT_BIT5_PULDIS.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_PORT_BIT10_PSL.VALUE=1 DRIVER.MIBSPI.VAR.MIBSPI5_TG5_ONESHOT.VALUE=1 -DRIVER.MIBSPI.VAR.MIBSPI3_T2CDELAYACTUAL.VALUE=9.677 +DRIVER.MIBSPI.VAR.MIBSPI3_T2CDELAYACTUAL.VALUE=9.615 DRIVER.MIBSPI.VAR.MIBSPI3_TG1_TRGSRC.VALUE=TRG_DISABLED DRIVER.MIBSPI.VAR.MIBSPI5_TG1_BUF_CSHOLD_LASTBUF.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_TG7_BUF_MODE.VALUE=4 @@ -2398,16 +2398,16 @@ DRIVER.MIBSPI.VAR.MIBSPI3_TG1_BUF_MODE.VALUE=4 DRIVER.MIBSPI.VAR.MIBSPI5_TG7_BUF_WDEL.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_TG4_BUF_DFSEL.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI5_PRESCALE0.VALUE=102 -DRIVER.MIBSPI.VAR.MIBSPI5_PRESCALE1.VALUE=102 +DRIVER.MIBSPI.VAR.MIBSPI5_PRESCALE0.VALUE=103 +DRIVER.MIBSPI.VAR.MIBSPI5_PRESCALE1.VALUE=103 DRIVER.MIBSPI.VAR.MIBSPI5_PORT_BIT25_DIR.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_PORT_BIT17_DIR.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_TG1_LENGTH.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI5_PRESCALE2.VALUE=102 +DRIVER.MIBSPI.VAR.MIBSPI5_PRESCALE2.VALUE=103 DRIVER.MIBSPI.VAR.MIBSPI3_PORT_BIT1_DIR.VALUE=1 DRIVER.MIBSPI.VAR.MIBSPI3_TG4_BUF_CSHOLD.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_TG3_BUF_LOCK.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI5_PRESCALE3.VALUE=102 +DRIVER.MIBSPI.VAR.MIBSPI5_PRESCALE3.VALUE=103 DRIVER.MIBSPI.VAR.MIBSPI3_RAM_PARITY_ENA.VALUE=0x00000005 DRIVER.MIBSPI.VAR.MIBSPI5_PARITYENA0.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_TG7_BUF_DFSEL.VALUE=0 @@ -2509,7 +2509,7 @@ DRIVER.MIBSPI.VAR.MIBSPI5_PORT_BIT25_PDR.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_PORT_BIT17_PDR.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_TG3_ONESHOT.VALUE=1 -DRIVER.MIBSPI.VAR.MIBSPI5_C2TDELAYACTUAL.VALUE=19.355 +DRIVER.MIBSPI.VAR.MIBSPI5_C2TDELAYACTUAL.VALUE=19.231 DRIVER.MIBSPI.VAR.MIBSPI3_PORT_BIT1_PDR.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_TG7_BUF_CSNR.VALUE=CS_NONE DRIVER.MIBSPI.VAR.MIBSPI1_TG3_BUF_DFSEL.VALUE=0 @@ -2544,24 +2544,24 @@ DRIVER.MIBSPI.VAR.MIBSPI1_PORT_BIT3_PULDIS.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_TG3_BUF_WDEL.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI5_TG2_BUF_DFSEL.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI5_ACTUALBAUDRATE0.VALUE=1003.252 +DRIVER.MIBSPI.VAR.MIBSPI5_ACTUALBAUDRATE0.VALUE=1000.000 DRIVER.MIBSPI.VAR.MIBSPI3_TG6_PRST.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI3_PRESCALE0.VALUE=102 +DRIVER.MIBSPI.VAR.MIBSPI3_PRESCALE0.VALUE=103 DRIVER.MIBSPI.VAR.MIBSPI1_PORT_BIT5_DOUT.VALUE=1 -DRIVER.MIBSPI.VAR.MIBSPI5_ACTUALBAUDRATE1.VALUE=1003.252 -DRIVER.MIBSPI.VAR.MIBSPI3_PRESCALE1.VALUE=102 +DRIVER.MIBSPI.VAR.MIBSPI5_ACTUALBAUDRATE1.VALUE=1000.000 +DRIVER.MIBSPI.VAR.MIBSPI3_PRESCALE1.VALUE=103 DRIVER.MIBSPI.VAR.MIBSPI3_BASE_RAM.VALUE=0xFF0C0000 DRIVER.MIBSPI.VAR.MIBSPI5_PORT_BIT3_PULL.VALUE=2 DRIVER.MIBSPI.VAR.MIBSPI5_PORT_BIT0_DIR.VALUE=1 -DRIVER.MIBSPI.VAR.MIBSPI5_ACTUALBAUDRATE2.VALUE=1003.252 +DRIVER.MIBSPI.VAR.MIBSPI5_ACTUALBAUDRATE2.VALUE=1000.000 DRIVER.MIBSPI.VAR.MIBSPI5_PARPOL0.VALUE=0 DRIVER.MIBSPI.VAR.MIBSPI3_PORT_BIT10_DIR.VALUE=1 DRIVER.MIBSPI.VAR.MIBSPI3_TG3_BUF_CSHOLD.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI3_PRESCALE2.VALUE=102 +DRIVER.MIBSPI.VAR.MIBSPI3_PRESCALE2.VALUE=103 DRIVER.MIBSPI.VAR.MIBSPI3_CHARLEN0.VALUE=8 -DRIVER.MIBSPI.VAR.MIBSPI5_ACTUALBAUDRATE3.VALUE=1003.252 +DRIVER.MIBSPI.VAR.MIBSPI5_ACTUALBAUDRATE3.VALUE=1000.000 DRIVER.MIBSPI.VAR.MIBSPI5_PARPOL1.VALUE=0 -DRIVER.MIBSPI.VAR.MIBSPI3_PRESCALE3.VALUE=102 +DRIVER.MIBSPI.VAR.MIBSPI3_PRESCALE3.VALUE=103 DRIVER.MIBSPI.VAR.MIBSPI3_CHARLEN1.VALUE=16 DRIVER.MIBSPI.VAR.MIBSPI3_DLENERRENA.VALUE=1 DRIVER.MIBSPI.VAR.MIBSPI5_PORT_BIT26_PDR.VALUE=0 @@ -2583,7 +2583,7 @@ DRIVER.SPI.VAR.SPI5_PORT_BIT17_PULDIS.VALUE=0 DRIVER.SPI.VAR.SPI3_PHASE3.VALUE=0 DRIVER.SPI.VAR.SPI2_PORT_BIT11_PULDIS.VALUE=0 -DRIVER.SPI.VAR.SPI4_T2CDELAYACTUAL.VALUE=9.677 +DRIVER.SPI.VAR.SPI4_T2CDELAYACTUAL.VALUE=9.615 DRIVER.SPI.VAR.SPI4_POLARITY0.VALUE=0 DRIVER.SPI.VAR.SPI3_PORT_BIT1_PDR.VALUE=0 DRIVER.SPI.VAR.SPI1_PORT_BIT4_DOUT.VALUE=1 @@ -2618,15 +2618,15 @@ DRIVER.SPI.VAR.SPI1_PORT_BIT17_DIR.VALUE=0 DRIVER.SPI.VAR.SPI3_PORT_BIT0_PULDIS.VALUE=0 DRIVER.SPI.VAR.SPI4_PORT_BIT9_PDR.VALUE=0 -DRIVER.SPI.VAR.SPI3_PRESCALE0.VALUE=102 -DRIVER.SPI.VAR.SPI3_PRESCALE1.VALUE=102 +DRIVER.SPI.VAR.SPI3_PRESCALE0.VALUE=103 +DRIVER.SPI.VAR.SPI3_PRESCALE1.VALUE=103 DRIVER.SPI.VAR.SPI1_C2EDELAY.VALUE=0 DRIVER.SPI.VAR.SPI5_PORT_BIT27_DIR.VALUE=0 DRIVER.SPI.VAR.SPI5_PORT_BIT19_DIR.VALUE=0 DRIVER.SPI.VAR.SPI5_PORT_BIT0_DIR.VALUE=1 -DRIVER.SPI.VAR.SPI3_PRESCALE2.VALUE=102 +DRIVER.SPI.VAR.SPI3_PRESCALE2.VALUE=103 DRIVER.SPI.VAR.SPI1_MASTER.VALUE=1 -DRIVER.SPI.VAR.SPI3_PRESCALE3.VALUE=102 +DRIVER.SPI.VAR.SPI3_PRESCALE3.VALUE=103 DRIVER.SPI.VAR.SPI3_PORT_BIT2_PDR.VALUE=0 DRIVER.SPI.VAR.SPI3_C2TDELAY.VALUE=0 DRIVER.SPI.VAR.SPI2_BASE_PORT.VALUE=0xFFF7F618 @@ -2635,7 +2635,7 @@ DRIVER.SPI.VAR.SPI1_PORT_BIT9_PULDIS.VALUE=0 DRIVER.SPI.VAR.SPI5_PORT_BIT25_PDR.VALUE=0 DRIVER.SPI.VAR.SPI5_PORT_BIT17_PDR.VALUE=0 -DRIVER.SPI.VAR.SPI5_C2TDELAYACTUAL.VALUE=19.355 +DRIVER.SPI.VAR.SPI5_C2TDELAYACTUAL.VALUE=19.231 DRIVER.SPI.VAR.SPI4_PORT_BIT10_DOUT.VALUE=0 DRIVER.SPI.VAR.SPI4_PORT_BIT8_PSL.VALUE=1 DRIVER.SPI.VAR.SPI4_WAITENA0.VALUE=0 @@ -2714,7 +2714,7 @@ DRIVER.SPI.VAR.SPI2_PORT_BIT10_DOUT.VALUE=0 DRIVER.SPI.VAR.SPI1_PORT_BIT25_PDR.VALUE=0 DRIVER.SPI.VAR.SPI1_PORT_BIT17_PDR.VALUE=0 -DRIVER.SPI.VAR.SPI1_C2TDELAYACTUAL.VALUE=19.355 +DRIVER.SPI.VAR.SPI1_C2TDELAYACTUAL.VALUE=19.231 DRIVER.SPI.VAR.SPI1_ENABLEHIGHZ.VALUE=0 DRIVER.SPI.VAR.SPI5_WDELAY1.VALUE=0 DRIVER.SPI.VAR.SPI4_C2EDELAY.VALUE=0 @@ -2754,39 +2754,39 @@ DRIVER.SPI.VAR.SPI4_PORT_BIT9_DOUT.VALUE=0 DRIVER.SPI.VAR.SPI3_PORT_BIT5_PDR.VALUE=0 DRIVER.SPI.VAR.SPI3_C2EDELAYACTUAL.VALUE=0.000 -DRIVER.SPI.VAR.SPI1_PRESCALE0.VALUE=102 +DRIVER.SPI.VAR.SPI1_PRESCALE0.VALUE=103 DRIVER.SPI.VAR.SPI4_BASE_RAM.VALUE=0xFF0E0000 -DRIVER.SPI.VAR.SPI1_PRESCALE1.VALUE=102 +DRIVER.SPI.VAR.SPI1_PRESCALE1.VALUE=103 DRIVER.SPI.VAR.SPI4_CHARLEN0.VALUE=16 DRIVER.SPI.VAR.SPI2_PORT_BIT1_PULL.VALUE=2 -DRIVER.SPI.VAR.SPI1_PRESCALE2.VALUE=102 +DRIVER.SPI.VAR.SPI1_PRESCALE2.VALUE=103 DRIVER.SPI.VAR.SPI4_CHARLEN1.VALUE=16 DRIVER.SPI.VAR.SPI1_PORT_BIT0_PULDIS.VALUE=0 -DRIVER.SPI.VAR.SPI1_PRESCALE3.VALUE=102 +DRIVER.SPI.VAR.SPI1_PRESCALE3.VALUE=103 DRIVER.SPI.VAR.SPI5_PORT_BIT1_PDR.VALUE=0 -DRIVER.SPI.VAR.SPI5_T2CDELAYACTUAL.VALUE=9.677 +DRIVER.SPI.VAR.SPI5_T2CDELAYACTUAL.VALUE=9.615 DRIVER.SPI.VAR.SPI4_CHARLEN2.VALUE=16 DRIVER.SPI.VAR.SPI1_PORT_BIT8_PSL.VALUE=1 DRIVER.SPI.VAR.SPI4_CHARLEN3.VALUE=16 DRIVER.SPI.VAR.SPI1_BASE.VALUE=0xFFF7F400 DRIVER.SPI.VAR.SPI3_BITERRENA.VALUE=0 DRIVER.SPI.VAR.SPI3_OVRNINTENA.VALUE=0 DRIVER.SPI.VAR.SPI3_RXINTENA.VALUE=0 -DRIVER.SPI.VAR.SPI5_ACTUALBAUDRATE0.VALUE=1003.252 +DRIVER.SPI.VAR.SPI5_ACTUALBAUDRATE0.VALUE=1000.000 DRIVER.SPI.VAR.SPI3_PORT_BIT10_PDR.VALUE=0 DRIVER.SPI.VAR.SPI3_PORT_BIT4_PSL.VALUE=1 DRIVER.SPI.VAR.SPI3_PORT_BIT2_DOUT.VALUE=1 DRIVER.SPI.VAR.SPI1_PORT_BIT25_PSL.VALUE=1 DRIVER.SPI.VAR.SPI1_PORT_BIT17_PSL.VALUE=1 -DRIVER.SPI.VAR.SPI5_ACTUALBAUDRATE1.VALUE=1003.252 +DRIVER.SPI.VAR.SPI5_ACTUALBAUDRATE1.VALUE=1000.000 DRIVER.SPI.VAR.SPI5_PORT_BIT2_FUN.VALUE=1 -DRIVER.SPI.VAR.SPI5_ACTUALBAUDRATE2.VALUE=1003.252 +DRIVER.SPI.VAR.SPI5_ACTUALBAUDRATE2.VALUE=1000.000 DRIVER.SPI.VAR.SPI5_PARPOL0.VALUE=0 DRIVER.SPI.VAR.SPI5_BITERRLVL.VALUE=0 DRIVER.SPI.VAR.SPI4_SHIFTDIR0.VALUE=0 DRIVER.SPI.VAR.SPI4_OVRNINTLVL.VALUE=0 DRIVER.SPI.VAR.SPI3_PORT_BIT8_DIR.VALUE=0 -DRIVER.SPI.VAR.SPI5_ACTUALBAUDRATE3.VALUE=1003.252 +DRIVER.SPI.VAR.SPI5_ACTUALBAUDRATE3.VALUE=1000.000 DRIVER.SPI.VAR.SPI5_PARPOL1.VALUE=0 DRIVER.SPI.VAR.SPI4_SHIFTDIR1.VALUE=0 DRIVER.SPI.VAR.SPI5_PORT_BIT27_PSL.VALUE=1 @@ -2832,20 +2832,20 @@ DRIVER.SPI.VAR.SPI4_WDELAY3.VALUE=0 DRIVER.SPI.VAR.SPI3_PORT_BIT3_PULDIS.VALUE=0 DRIVER.SPI.VAR.SPI3_PORT_BIT10_PSL.VALUE=1 -DRIVER.SPI.VAR.SPI1_T2CDELAYACTUAL.VALUE=9.677 +DRIVER.SPI.VAR.SPI1_T2CDELAYACTUAL.VALUE=9.615 DRIVER.SPI.VAR.SPI4_MASTER.VALUE=1 DRIVER.SPI.VAR.SPI2_PORT_BIT2_PULL.VALUE=2 DRIVER.SPI.VAR.SPI5_PORT_BIT8_DOUT.VALUE=0 DRIVER.SPI.VAR.SPI5_PORT_BIT3_PDR.VALUE=0 -DRIVER.SPI.VAR.SPI3_ACTUALBAUDRATE0.VALUE=1003.252 +DRIVER.SPI.VAR.SPI3_ACTUALBAUDRATE0.VALUE=1000.000 DRIVER.SPI.VAR.SPI2_PORT_BIT0_PDR.VALUE=0 -DRIVER.SPI.VAR.SPI3_ACTUALBAUDRATE1.VALUE=1003.252 +DRIVER.SPI.VAR.SPI3_ACTUALBAUDRATE1.VALUE=1000.000 DRIVER.SPI.VAR.SPI2_BASE.VALUE=0xFFF7F600 DRIVER.SPI.VAR.SPI4_PORT_BIT10_DIR.VALUE=1 DRIVER.SPI.VAR.SPI3_PORT_BIT8_FUN.VALUE=1 DRIVER.SPI.VAR.SPI3_PORT_BIT0_PULL.VALUE=2 -DRIVER.SPI.VAR.SPI3_ACTUALBAUDRATE2.VALUE=1003.252 -DRIVER.SPI.VAR.SPI3_ACTUALBAUDRATE3.VALUE=1003.252 +DRIVER.SPI.VAR.SPI3_ACTUALBAUDRATE2.VALUE=1000.000 +DRIVER.SPI.VAR.SPI3_ACTUALBAUDRATE3.VALUE=1000.000 DRIVER.SPI.VAR.SPI3_PARERRENA.VALUE=0 DRIVER.SPI.VAR.SPI3_PORT_BIT3_DOUT.VALUE=1 DRIVER.SPI.VAR.SPI2_C2TDELAY.VALUE=0 @@ -2870,7 +2870,7 @@ DRIVER.SPI.VAR.SPI2_TXINTENA.VALUE=0 DRIVER.SPI.VAR.SPI5_BAUDRATE0.VALUE=1000.000 DRIVER.SPI.VAR.SPI2_PORT_BIT1_PDR.VALUE=0 -DRIVER.SPI.VAR.SPI2_C2TDELAYACTUAL.VALUE=19.355 +DRIVER.SPI.VAR.SPI2_C2TDELAYACTUAL.VALUE=19.231 DRIVER.SPI.VAR.SPI5_BAUDRATE1.VALUE=1000.000 DRIVER.SPI.VAR.SPI5_BAUDRATE2.VALUE=1000.000 DRIVER.SPI.VAR.SPI4_PORT_BIT11_DIR.VALUE=0 @@ -2909,34 +2909,34 @@ DRIVER.SPI.VAR.SPI3_T2EDELAYACTUAL.VALUE=0.000 DRIVER.SPI.VAR.SPI2_SHIFTDIR2.VALUE=0 DRIVER.SPI.VAR.SPI1_PORT_BIT8_DOUT.VALUE=0 -DRIVER.SPI.VAR.SPI1_ACTUALBAUDRATE0.VALUE=1003.252 +DRIVER.SPI.VAR.SPI1_ACTUALBAUDRATE0.VALUE=1000.000 DRIVER.SPI.VAR.SPI2_SHIFTDIR3.VALUE=0 -DRIVER.SPI.VAR.SPI1_ACTUALBAUDRATE1.VALUE=1003.252 +DRIVER.SPI.VAR.SPI1_ACTUALBAUDRATE1.VALUE=1000.000 DRIVER.SPI.VAR.SPI4_PORT_BIT10_FUN.VALUE=0 DRIVER.SPI.VAR.SPI4_PORT_BIT0_DIR.VALUE=1 DRIVER.SPI.VAR.SPI2_PORT_BIT3_PULL.VALUE=2 -DRIVER.SPI.VAR.SPI1_ACTUALBAUDRATE2.VALUE=1003.252 +DRIVER.SPI.VAR.SPI1_ACTUALBAUDRATE2.VALUE=1000.000 DRIVER.SPI.VAR.SPI5_PORT_BIT11_PULDIS.VALUE=0 -DRIVER.SPI.VAR.SPI1_ACTUALBAUDRATE3.VALUE=1003.252 +DRIVER.SPI.VAR.SPI1_ACTUALBAUDRATE3.VALUE=1000.000 DRIVER.SPI.VAR.SPI5_PORT_BIT9_DOUT.VALUE=0 DRIVER.SPI.VAR.SPI4_C2EDELAYACTUAL.VALUE=0.000 DRIVER.SPI.VAR.SPI2_PORT_BIT2_PDR.VALUE=0 DRIVER.SPI.VAR.SPI3_BASE.VALUE=0xFFF7F800 DRIVER.SPI.VAR.SPI3_PORT_BIT1_PULL.VALUE=2 DRIVER.SPI.VAR.SPI3_PORT_BIT8_PULDIS.VALUE=0 -DRIVER.SPI.VAR.SPI4_PRESCALE0.VALUE=102 +DRIVER.SPI.VAR.SPI4_PRESCALE0.VALUE=103 DRIVER.SPI.VAR.SPI3_PORT_BIT8_PSL.VALUE=1 DRIVER.SPI.VAR.SPI3_PORT_BIT4_DOUT.VALUE=1 DRIVER.SPI.VAR.SPI3_WDELAY0.VALUE=0 DRIVER.SPI.VAR.SPI1_PORT_BIT25_DOUT.VALUE=0 DRIVER.SPI.VAR.SPI1_PORT_BIT17_DOUT.VALUE=0 -DRIVER.SPI.VAR.SPI4_PRESCALE1.VALUE=102 +DRIVER.SPI.VAR.SPI4_PRESCALE1.VALUE=103 DRIVER.SPI.VAR.SPI3_C2EDELAY.VALUE=0 DRIVER.SPI.VAR.SPI3_WDELAY1.VALUE=0 -DRIVER.SPI.VAR.SPI4_PRESCALE2.VALUE=102 +DRIVER.SPI.VAR.SPI4_PRESCALE2.VALUE=103 DRIVER.SPI.VAR.SPI3_WDELAY2.VALUE=0 DRIVER.SPI.VAR.SPI2_PORT_BIT3_FUN.VALUE=1 -DRIVER.SPI.VAR.SPI4_PRESCALE3.VALUE=102 +DRIVER.SPI.VAR.SPI4_PRESCALE3.VALUE=103 DRIVER.SPI.VAR.SPI4_TIMEOUTENA.VALUE=0 DRIVER.SPI.VAR.SPI3_PORT_BIT1_PULDIS.VALUE=0 DRIVER.SPI.VAR.SPI3_WDELAY3.VALUE=0 @@ -2987,7 +2987,7 @@ DRIVER.SPI.VAR.SPI2_PORT_BIT8_PULDIS.VALUE=0 DRIVER.SPI.VAR.SPI4_PORT_BIT10_PSL.VALUE=1 DRIVER.SPI.VAR.SPI3_PARPOL2.VALUE=0 -DRIVER.SPI.VAR.SPI2_T2CDELAYACTUAL.VALUE=9.677 +DRIVER.SPI.VAR.SPI2_T2CDELAYACTUAL.VALUE=9.615 DRIVER.SPI.VAR.SPI4_BASE.VALUE=0xFFF7FA00 DRIVER.SPI.VAR.SPI3_PARPOL3.VALUE=0 DRIVER.SPI.VAR.SPI3_PORT_BIT2_PULL.VALUE=2 @@ -3030,17 +3030,17 @@ DRIVER.SPI.VAR.SPI2_WDELAY2.VALUE=0 DRIVER.SPI.VAR.SPI2_WDELAY3.VALUE=0 DRIVER.SPI.VAR.SPI3_PORT_BIT10_DOUT.VALUE=0 -DRIVER.SPI.VAR.SPI3_C2TDELAYACTUAL.VALUE=19.355 +DRIVER.SPI.VAR.SPI3_C2TDELAYACTUAL.VALUE=19.231 DRIVER.SPI.VAR.SPI5_PORT_BIT11_DIR.VALUE=0 DRIVER.SPI.VAR.SPI5_PORT_BIT9_FUN.VALUE=1 DRIVER.SPI.VAR.SPI4_PORT_BIT11_PULDIS.VALUE=0 DRIVER.SPI.VAR.SPI5_PORT_BIT11_DOUT.VALUE=0 -DRIVER.SPI.VAR.SPI2_PRESCALE0.VALUE=102 -DRIVER.SPI.VAR.SPI2_PRESCALE1.VALUE=102 +DRIVER.SPI.VAR.SPI2_PRESCALE0.VALUE=103 +DRIVER.SPI.VAR.SPI2_PRESCALE1.VALUE=103 DRIVER.SPI.VAR.SPI2_PORT_BIT8_DIR.VALUE=0 -DRIVER.SPI.VAR.SPI2_PRESCALE2.VALUE=102 +DRIVER.SPI.VAR.SPI2_PRESCALE2.VALUE=103 DRIVER.SPI.VAR.SPI3_TIMEOUTENA.VALUE=0 -DRIVER.SPI.VAR.SPI2_PRESCALE3.VALUE=102 +DRIVER.SPI.VAR.SPI2_PRESCALE3.VALUE=103 DRIVER.SPI.VAR.SPI1_PORT_BIT8_PULDIS.VALUE=0 DRIVER.SPI.VAR.SPI4_PORT_BIT0_PSL.VALUE=1 DRIVER.SPI.VAR.SPI1_PARITYENA0.VALUE=0 @@ -3139,25 +3139,25 @@ DRIVER.SPI.VAR.SPI5_PORT_BIT10_PSL.VALUE=1 DRIVER.SPI.VAR.SPI5_WAITENA0.VALUE=0 DRIVER.SPI.VAR.SPI5_ENABLEHIGHZ.VALUE=0 -DRIVER.SPI.VAR.SPI3_T2CDELAYACTUAL.VALUE=9.677 +DRIVER.SPI.VAR.SPI3_T2CDELAYACTUAL.VALUE=9.615 DRIVER.SPI.VAR.SPI1_PORT_BIT1_PDR.VALUE=0 DRIVER.SPI.VAR.SPI5_WAITENA1.VALUE=0 DRIVER.SPI.VAR.SPI5_WAITENA2.VALUE=0 DRIVER.SPI.VAR.SPI4_DEYSNCLVL.VALUE=0 DRIVER.SPI.VAR.SPI2_PORT_BIT9_FUN.VALUE=1 DRIVER.SPI.VAR.SPI5_WAITENA3.VALUE=0 DRIVER.SPI.VAR.SPI4_PORT_BIT9_PULDIS.VALUE=0 -DRIVER.SPI.VAR.SPI4_ACTUALBAUDRATE0.VALUE=1003.252 +DRIVER.SPI.VAR.SPI4_ACTUALBAUDRATE0.VALUE=1000.000 DRIVER.SPI.VAR.SPI1_PORT_BIT10_PDR.VALUE=0 DRIVER.SPI.VAR.SPI1_PORT_BIT2_DOUT.VALUE=1 -DRIVER.SPI.VAR.SPI4_ACTUALBAUDRATE1.VALUE=1003.252 +DRIVER.SPI.VAR.SPI4_ACTUALBAUDRATE1.VALUE=1000.000 DRIVER.SPI.VAR.SPI2_T2CDELAY.VALUE=0 DRIVER.SPI.VAR.SPI5_PORT_BIT27_PULL.VALUE=2 DRIVER.SPI.VAR.SPI5_PORT_BIT19_PULL.VALUE=2 DRIVER.SPI.VAR.SPI5_PORT_BIT0_PULL.VALUE=2 -DRIVER.SPI.VAR.SPI4_ACTUALBAUDRATE2.VALUE=1003.252 +DRIVER.SPI.VAR.SPI4_ACTUALBAUDRATE2.VALUE=1000.000 DRIVER.SPI.VAR.SPI1_PORT_BIT2_FUN.VALUE=1 -DRIVER.SPI.VAR.SPI4_ACTUALBAUDRATE3.VALUE=1003.252 +DRIVER.SPI.VAR.SPI4_ACTUALBAUDRATE3.VALUE=1000.000 DRIVER.SPI.VAR.SPI4_TXINTENA.VALUE=0 DRIVER.SPI.VAR.SPI5_PORT_BIT3_DOUT.VALUE=1 DRIVER.SPI.VAR.SPI2_PORT_BIT0_DOUT.VALUE=1 @@ -3188,7 +3188,7 @@ DRIVER.SPI.VAR.SPI3_SHIFTDIR1.VALUE=0 DRIVER.SPI.VAR.SPI1_PARPOL1.VALUE=0 DRIVER.SPI.VAR.SPI5_PHASE0.VALUE=0 -DRIVER.SPI.VAR.SPI4_C2TDELAYACTUAL.VALUE=19.355 +DRIVER.SPI.VAR.SPI4_C2TDELAYACTUAL.VALUE=19.231 DRIVER.SPI.VAR.SPI3_SHIFTDIR2.VALUE=0 DRIVER.SPI.VAR.SPI2_PORT_BIT8_PSL.VALUE=1 DRIVER.SPI.VAR.SPI1_PORT_BIT11_PDR.VALUE=0 @@ -3207,27 +3207,27 @@ DRIVER.SPI.VAR.SPI4_PORT_BIT8_DIR.VALUE=0 DRIVER.SPI.VAR.SPI1_PORT_BIT5_DIR.VALUE=1 DRIVER.SPI.VAR.SPI1_TXINTLVL.VALUE=0 -DRIVER.SPI.VAR.SPI5_PRESCALE0.VALUE=102 +DRIVER.SPI.VAR.SPI5_PRESCALE0.VALUE=103 DRIVER.SPI.VAR.SPI1_PORT_BIT10_PSL.VALUE=1 DRIVER.SPI.VAR.SPI5_C2EDELAY.VALUE=0 -DRIVER.SPI.VAR.SPI5_PRESCALE1.VALUE=102 -DRIVER.SPI.VAR.SPI5_PRESCALE2.VALUE=102 +DRIVER.SPI.VAR.SPI5_PRESCALE1.VALUE=103 +DRIVER.SPI.VAR.SPI5_PRESCALE2.VALUE=103 DRIVER.SPI.VAR.SPI3_PORT_BIT5_PULL.VALUE=2 DRIVER.SPI.VAR.SPI3_PORT_BIT1_DIR.VALUE=1 -DRIVER.SPI.VAR.SPI5_PRESCALE3.VALUE=102 +DRIVER.SPI.VAR.SPI5_PRESCALE3.VALUE=103 DRIVER.SPI.VAR.SPI3_PORT_BIT9_PULDIS.VALUE=0 DRIVER.SPI.VAR.SPI5_T2EDELAYACTUAL.VALUE=0.000 DRIVER.SPI.VAR.SPI3_PORT_BIT8_DOUT.VALUE=0 -DRIVER.SPI.VAR.SPI2_ACTUALBAUDRATE0.VALUE=1003.252 +DRIVER.SPI.VAR.SPI2_ACTUALBAUDRATE0.VALUE=1000.000 DRIVER.SPI.VAR.SPI1_PORT_BIT3_PDR.VALUE=0 -DRIVER.SPI.VAR.SPI2_ACTUALBAUDRATE1.VALUE=1003.252 +DRIVER.SPI.VAR.SPI2_ACTUALBAUDRATE1.VALUE=1000.000 DRIVER.SPI.VAR.SPI4_BASE_PORT.VALUE=0xFFF7FA18 DRIVER.SPI.VAR.SPI2_PORT_BIT10_DIR.VALUE=1 -DRIVER.SPI.VAR.SPI2_ACTUALBAUDRATE2.VALUE=1003.252 +DRIVER.SPI.VAR.SPI2_ACTUALBAUDRATE2.VALUE=1000.000 DRIVER.SPI.VAR.SPI1_PORT_BIT0_PULL.VALUE=2 DRIVER.SPI.VAR.SPI5_OVRNINTENA.VALUE=0 DRIVER.SPI.VAR.SPI3_PORT_BIT2_PULDIS.VALUE=0 -DRIVER.SPI.VAR.SPI2_ACTUALBAUDRATE3.VALUE=1003.252 +DRIVER.SPI.VAR.SPI2_ACTUALBAUDRATE3.VALUE=1000.000 DRIVER.SPI.VAR.SPI2_PORT_BIT9_PSL.VALUE=1 DRIVER.SPI.VAR.SPI1_PORT_BIT3_DOUT.VALUE=1 DRIVER.SPI.VAR.SPI5_PORT_BIT1_PULL.VALUE=2 @@ -3359,7 +3359,7 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_64_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_56_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_48_ENA.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_3_NOMINAL_BIT_RATE.VALUE=499.203 +DRIVER.CAN.VAR.CAN_3_NOMINAL_BIT_RATE.VALUE=500.000 DRIVER.CAN.VAR.CAN_1_MESSAGE_51_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_43_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_35_MASK.VALUE=0x000007FF @@ -3507,7 +3507,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_25_ID.VALUE=25 DRIVER.CAN.VAR.CAN_2_MESSAGE_17_ID.VALUE=17 DRIVER.CAN.VAR.CAN_1_MESSAGE_10_RTR.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_2_BRP_FREQ.VALUE=4.493 +DRIVER.CAN.VAR.CAN_2_BRP_FREQ.VALUE=4.000 DRIVER.CAN.VAR.CAN_3_MESSAGE_21_INT_ENA_REF.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_13_INT_ENA_REF.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_PORT_TX_DIR.VALUE=1 @@ -3522,7 +3522,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_11_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_6_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_4_INT_ENA.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_1_PROP_SEG.VALUE=2 +DRIVER.CAN.VAR.CAN_1_PROP_SEG.VALUE=3 DRIVER.CAN.VAR.CAN_3_MESSAGE_1_ID.VALUE=1 DRIVER.CAN.VAR.CAN_2_MESSAGE_64_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_56_INT_LEVEL.VALUE=0x00000000 @@ -3542,7 +3542,7 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_28_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_57_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_2_MESSAGE_49_MASK.VALUE=0x000007FF -DRIVER.CAN.VAR.CAN_2_NOMINAL_BIT_RATE.VALUE=499.203 +DRIVER.CAN.VAR.CAN_2_NOMINAL_BIT_RATE.VALUE=500.000 DRIVER.CAN.VAR.CAN_1_MESSAGE_64_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_1_MESSAGE_56_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_1_MESSAGE_48_BOOL_ENA.VALUE=0 @@ -3589,14 +3589,14 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_18_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_2_ID.VALUE=2 DRIVER.CAN.VAR.CAN_1_MESSAGE_6_INT_LEVEL.VALUE=0x00000040 -DRIVER.CAN.VAR.CAN_3_NOMINAL_BIT_TIME.VALUE=9 +DRIVER.CAN.VAR.CAN_3_NOMINAL_BIT_TIME.VALUE=8 DRIVER.CAN.VAR.CAN_2_MESSAGE_20_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_2_MESSAGE_12_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_2_MESSAGE_7_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_3_MESSAGE_58_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_58_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_10_INT_ENA_REF.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_2_SAMPLE_POINT.VALUE=77.778 +DRIVER.CAN.VAR.CAN_2_SAMPLE_POINT.VALUE=75.000 DRIVER.CAN.VAR.CAN_3_MESSAGE_61_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_3_MESSAGE_53_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_3_MESSAGE_45_MASK.VALUE=0x000007FF @@ -3735,15 +3735,15 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_21_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_13_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_8_ENA.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_1_NOMINAL_BIT_RATE.VALUE=249.601 +DRIVER.CAN.VAR.CAN_1_NOMINAL_BIT_RATE.VALUE=250.000 DRIVER.CAN.VAR.CAN_3_MESSAGE_5_ID.VALUE=5 DRIVER.CAN.VAR.CAN_2_MESSAGE_41_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_33_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_25_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_17_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_8_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_3_RTR.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_3_BRPE_FREQ.VALUE=4.493 +DRIVER.CAN.VAR.CAN_3_BRPE_FREQ.VALUE=4.000 DRIVER.CAN.VAR.CAN_2_MESSAGE_59_INT_ENA_REF.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_21_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_21_DIR.VALUE=0x20000000 @@ -3768,7 +3768,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_46_ID.VALUE=46 DRIVER.CAN.VAR.CAN_2_MESSAGE_38_ID.VALUE=38 DRIVER.CAN.VAR.CAN_1_MESSAGE_11_INT_LEVEL.VALUE=0x00000800 -DRIVER.CAN.VAR.CAN_2_NOMINAL_BIT_TIME.VALUE=9 +DRIVER.CAN.VAR.CAN_2_NOMINAL_BIT_TIME.VALUE=8 DRIVER.CAN.VAR.CAN_1_MESSAGE_50_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_1_MESSAGE_42_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_1_MESSAGE_34_DLC.VALUE=8 @@ -3787,7 +3787,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_45_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_37_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_29_MASK.VALUE=0x000007FF -DRIVER.CAN.VAR.CAN_1_TQ.VALUE=445.154 +DRIVER.CAN.VAR.CAN_1_TQ.VALUE=500.000 DRIVER.CAN.VAR.CAN_3_MESSAGE_63_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_55_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_47_RTR.VALUE=0x00000000 @@ -3851,7 +3851,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_17_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_2_MESSAGE_14_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_9_ENA.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_2_TQ.VALUE=222.577 +DRIVER.CAN.VAR.CAN_2_TQ.VALUE=250.000 DRIVER.CAN.VAR.CAN_1_MESSAGE_7_BOOL_ENA.VALUE=1 DRIVER.CAN.VAR.CAN_1_BRPE.VALUE=0 DRIVER.CAN.VAR.CAN_3_MESSAGE_7_ID.VALUE=7 @@ -3903,7 +3903,7 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_20_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_13_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_3_MESSAGE_12_INT_ENA.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_3_TQ.VALUE=222.577 +DRIVER.CAN.VAR.CAN_3_TQ.VALUE=250.000 DRIVER.CAN.VAR.CAN_1_MESSAGE_60_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_1_MESSAGE_52_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_1_MESSAGE_44_BOOL_ENA.VALUE=0 @@ -3956,7 +3956,7 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_11_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_1_MESSAGE_3_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_1_SAMPLE_POINT_REFERENCE.VALUE=75 -DRIVER.CAN.VAR.CAN_1_PROPAGATION_DELAY.VALUE=700 +DRIVER.CAN.VAR.CAN_1_PROPAGATION_DELAY.VALUE=1050 DRIVER.CAN.VAR.CAN_1_MESSAGE_51_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_51_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_50_INT_ENA_REF.VALUE=0x00000000 @@ -3982,7 +3982,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_5_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_1_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_11_ID.VALUE=0x400 -DRIVER.CAN.VAR.CAN_1_NOMINAL_BIT_TIME.VALUE=9 +DRIVER.CAN.VAR.CAN_1_NOMINAL_BIT_TIME.VALUE=8 DRIVER.CAN.VAR.CAN_3_MESSAGE_61_INT_ENA_REF.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_53_INT_ENA_REF.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_45_INT_ENA_REF.VALUE=0x00000000 @@ -4148,8 +4148,8 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_45_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_1_MESSAGE_37_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_1_MESSAGE_29_DLC.VALUE=8 -DRIVER.CAN.VAR.CAN_1_BRPE_FREQ.VALUE=2.246 -DRIVER.CAN.VAR.CAN_1_BRP_FREQ.VALUE=2.246 +DRIVER.CAN.VAR.CAN_1_BRPE_FREQ.VALUE=2.000 +DRIVER.CAN.VAR.CAN_1_BRP_FREQ.VALUE=2.000 DRIVER.CAN.VAR.CAN_3_MESSAGE_20_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_20_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_12_EOB.VALUE=0x00000000 @@ -4264,7 +4264,7 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_13_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_13_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_12_INT_ENA_REF.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_3_SAMPLE_POINT.VALUE=77.778 +DRIVER.CAN.VAR.CAN_3_SAMPLE_POINT.VALUE=75.000 DRIVER.CAN.VAR.CAN_1_PORT_TX_DIR.VALUE=1 DRIVER.CAN.VAR.CAN_1_MESSAGE_5_EOB.VALUE=0x00000080 DRIVER.CAN.VAR.CAN_1_MESSAGE_5_DIR.VALUE=0x00000000 @@ -4420,9 +4420,9 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_19_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_3_MESSAGE_2_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_2_DIR.VALUE=0x20000000 -DRIVER.CAN.VAR.CAN_1_BRP.VALUE=45 +DRIVER.CAN.VAR.CAN_1_BRP.VALUE=51 DRIVER.CAN.VAR.CAN_3_MESSAGE_7_BOOL_ENA.VALUE=0 -DRIVER.CAN.VAR.CAN_3_PROP_SEG.VALUE=4 +DRIVER.CAN.VAR.CAN_3_PROP_SEG.VALUE=3 DRIVER.CAN.VAR.CAN_2_MESSAGE_21_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_13_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_10_MASK.VALUE=0x000007FF @@ -4441,7 +4441,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_26_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_18_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_2_ID.VALUE=0x2 -DRIVER.CAN.VAR.CAN_1_AUTO_BUS_ON_TR.VALUE=1033350 +DRIVER.CAN.VAR.CAN_1_AUTO_BUS_ON_TR.VALUE=1040000 DRIVER.CAN.VAR.CAN_3_MESSAGE_31_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_3_MESSAGE_23_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_3_MESSAGE_15_DLC.VALUE=8 @@ -4554,7 +4554,7 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_3_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_3_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_58_INT_ENA_REF.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_2_BRP.VALUE=22 +DRIVER.CAN.VAR.CAN_2_BRP.VALUE=25 DRIVER.CAN.VAR.CAN_3_MESSAGE_57_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_3_MESSAGE_49_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_2_PORT_RX_PULDIS.VALUE=0 @@ -4691,7 +4691,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_29_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_3_MESSAGE_4_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_4_DIR.VALUE=0x20000000 -DRIVER.CAN.VAR.CAN_3_BRP.VALUE=22 +DRIVER.CAN.VAR.CAN_3_BRP.VALUE=25 DRIVER.CAN.VAR.CAN_1_MESSAGE_60_INT_ENA_REF.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_52_INT_ENA_REF.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_44_INT_ENA_REF.VALUE=0x00000000 @@ -4706,7 +4706,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_6_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_57_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_49_ENA.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_1_PHASE_SEG.VALUE=3 +DRIVER.CAN.VAR.CAN_1_PHASE_SEG.VALUE=2 DRIVER.CAN.VAR.CAN_3_MESSAGE_30_ID.VALUE=30 DRIVER.CAN.VAR.CAN_3_MESSAGE_22_ID.VALUE=22 DRIVER.CAN.VAR.CAN_3_MESSAGE_14_ID.VALUE=14 @@ -4931,7 +4931,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_9_ID.VALUE=0x100 DRIVER.CAN.VAR.CAN_1_MESSAGE_5_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_59_DLC.VALUE=8 -DRIVER.CAN.VAR.CAN_1_SJW.VALUE=3 +DRIVER.CAN.VAR.CAN_1_SJW.VALUE=2 DRIVER.CAN.VAR.CAN_3_MESSAGE_50_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_50_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_42_EOB.VALUE=0x00000000 @@ -5145,8 +5145,8 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_7_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_1_ID.VALUE=1 DRIVER.CAN.VAR.CAN_3_MESSAGE_8_DLC.VALUE=8 -DRIVER.CAN.VAR.CAN_3_BRP_FREQ.VALUE=4.493 -DRIVER.CAN.VAR.CAN_2_BRPE_FREQ.VALUE=4.493 +DRIVER.CAN.VAR.CAN_3_BRP_FREQ.VALUE=4.000 +DRIVER.CAN.VAR.CAN_2_BRPE_FREQ.VALUE=4.000 DRIVER.CAN.VAR.CAN_1_MESSAGE_10_DLC.VALUE=8 DRIVER.CAN.VAR.CAN_2_MESSAGE_64_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_64_DIR.VALUE=0x20000000 @@ -5163,7 +5163,7 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_6_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_2_MESSAGE_11_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_6_INT_ENA.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_2_PROP_SEG.VALUE=4 +DRIVER.CAN.VAR.CAN_2_PROP_SEG.VALUE=3 DRIVER.CAN.VAR.CAN_1_MESSAGE_41_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_33_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_25_MASK.VALUE=0x000007FF @@ -5214,7 +5214,7 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_8_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_10_EOB.VALUE=0x00000080 DRIVER.CAN.VAR.CAN_1_MESSAGE_10_DIR.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_1_SAMPLE_POINT.VALUE=66.667 +DRIVER.CAN.VAR.CAN_1_SAMPLE_POINT.VALUE=75.000 DRIVER.CAN.VAR.CAN_2_MESSAGE_51_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_2_MESSAGE_43_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_2_MESSAGE_35_BOOL_ENA.VALUE=0 @@ -5572,7 +5572,7 @@ DRIVER.ADC.VAR.ADC1_GROUP2_PIN4_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP0_PIN22_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP0_PIN14_ENABLE.VALUE=0x00000000 -DRIVER.ADC.VAR.ADC2_GROUP2_ACTUAL_SAMPLE_TIME.VALUE=387.08 +DRIVER.ADC.VAR.ADC2_GROUP2_ACTUAL_SAMPLE_TIME.VALUE=384.60 DRIVER.ADC.VAR.ADC2_GROUP2_SAMPLE_PRESCALER.VALUE=2 DRIVER.ADC.VAR.ADC2_GROUP2_PIN12_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP1_PIN18_ENABLE.VALUE=0x00040000 @@ -5598,7 +5598,7 @@ DRIVER.ADC.VAR.ADC2_BND.VALUE=2 DRIVER.ADC.VAR.ADC2_GROUP1_DISCHARGE_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_PORT_BIT0_PDR.VALUE=0 -DRIVER.ADC.VAR.ADC2_ACTUAL_CYCLE_TIME.VALUE=96.77 +DRIVER.ADC.VAR.ADC2_ACTUAL_CYCLE_TIME.VALUE=96.15 DRIVER.ADC.VAR.ADC2_GROUP1_SAMPLE_PRESCALER.VALUE=2 DRIVER.ADC.VAR.ADC2_GROUP1_PIN9_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP1_SAMPLE_TIME.VALUE=300.00 @@ -5623,7 +5623,7 @@ DRIVER.ADC.VAR.ADC2_GROUP2_PIN10_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP1_PIN24_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP1_PIN16_ENABLE.VALUE=0x00010000 -DRIVER.ADC.VAR.ADC1_GROUP1_ACTUAL_SAMPLE_TIME.VALUE=503.22 +DRIVER.ADC.VAR.ADC1_GROUP1_ACTUAL_SAMPLE_TIME.VALUE=500.00 DRIVER.ADC.VAR.ADC2_GROUP0_PIN6_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP2_TRIGGER_MODE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_PORT_BIT0_PSL.VALUE=1 @@ -5658,7 +5658,7 @@ DRIVER.ADC.VAR.ADC1_GROUP2_PIN7_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP0_PIN17_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_PARITY_ENABLE.VALUE=0x00000005 -DRIVER.ADC.VAR.ADC1_ACTUAL_CYCLE_TIME.VALUE=251.61 +DRIVER.ADC.VAR.ADC1_ACTUAL_CYCLE_TIME.VALUE=250.00 DRIVER.ADC.VAR.ADC2_GROUP2_HW_TRIGGER_SOURCE_ALT.VALUE=EVENT DRIVER.ADC.VAR.ADC2_GROUP2_PIN15_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP2_PIN0_ENABLE.VALUE=0x00000000 @@ -5681,7 +5681,7 @@ DRIVER.ADC.VAR.ADC2_RAM_PARITY_ENA.VALUE=0x00000005 DRIVER.ADC.VAR.ADC2_GROUP2_HW_TRIGGER_SOURCE.VALUE=EVENT DRIVER.ADC.VAR.ADC2_GROUP2_ID_ENABLE.VALUE=0x00000000 -DRIVER.ADC.VAR.ADC2_GROUP1_ACTUAL_SAMPLE_TIME.VALUE=387.08 +DRIVER.ADC.VAR.ADC2_GROUP1_ACTUAL_SAMPLE_TIME.VALUE=384.60 DRIVER.ADC.VAR.ADC1_GROUP2_LENGTH.VALUE=44 DRIVER.ADC.VAR.ADC1_GROUP0_BND.VALUE=0 DRIVER.ADC.VAR.ADC2_GROUP2_CHANNEL_TOTAL_TIME.VALUE=0.000000 @@ -5732,7 +5732,7 @@ DRIVER.ADC.VAR.ADC1_GROUP0_LENGTH.VALUE=0 DRIVER.ADC.VAR.ADC2_GROUP1_CONVERSION_TIME.VALUE=1.300 DRIVER.ADC.VAR.ADC1_GROUP0_PINS.VALUE=0 -DRIVER.ADC.VAR.ADC1_GROUP0_ACTUAL_SAMPLE_TIME.VALUE=503.22 +DRIVER.ADC.VAR.ADC1_GROUP0_ACTUAL_SAMPLE_TIME.VALUE=500.00 DRIVER.ADC.VAR.ADC2_GROUP1_PIN3_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP0_PIN10_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP0_ID_ENABLE.VALUE=0x00000000 @@ -5797,7 +5797,7 @@ DRIVER.ADC.VAR.ADC2_GROUP0_PIN5_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP2_PIN19_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_PRESCALE.VALUE=25 -DRIVER.ADC.VAR.ADC2_GROUP0_ACTUAL_SAMPLE_TIME.VALUE=387.08 +DRIVER.ADC.VAR.ADC2_GROUP0_ACTUAL_SAMPLE_TIME.VALUE=384.60 DRIVER.ADC.VAR.ADC1_GROUP2_PINS.VALUE=0 DRIVER.ADC.VAR.ADC2_PORT_BIT0_PULL.VALUE=2 DRIVER.ADC.VAR.ADC1_LENGTH.VALUE=64 @@ -5809,7 +5809,7 @@ DRIVER.ADC.VAR.ADC2_GROUP2_PIN2_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP0_CONTINUOUS_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP1_PIN5_ENABLE.VALUE=0x00000020 -DRIVER.ADC.VAR.ADC1_GROUP2_ACTUAL_SAMPLE_TIME.VALUE=503.22 +DRIVER.ADC.VAR.ADC1_GROUP2_ACTUAL_SAMPLE_TIME.VALUE=500.00 DRIVER.ADC.VAR.ADC1_GROUP0_SCAN_TIME.VALUE=0.000 DRIVER.ADC.VAR.ADC2_GROUP1_PIN6_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP0_PIN13_ENABLE.VALUE=0x00000000 @@ -5831,7 +5831,7 @@ DRIVER.LIN.VAR.LIN_BEINTLVL.VALUE=0x00000000 DRIVER.LIN.VAR.LIN_TOA3WUSINTENA.VALUE=0x00000000 DRIVER.LIN.VAR.LIN_PORT_BIT1_DOUT.VALUE=0 -DRIVER.LIN.VAR.LIN_MAXPRESCALE.VALUE=4651 +DRIVER.LIN.VAR.LIN_MAXPRESCALE.VALUE=4680 DRIVER.LIN.VAR.LIN_LENGTH.VALUE=8 DRIVER.LIN.VAR.LIN_PARITYENA.VALUE=0 DRIVER.LIN.VAR.LIN_BREAKINTENA.VALUE=0x00000000 @@ -5866,7 +5866,7 @@ DRIVER.LIN.VAR.LIN_PBEINTLVL.VALUE=0x00000000 DRIVER.LIN.VAR.LIN_PORT_BIT2_PDR.VALUE=0 DRIVER.LIN.VAR.LIN_BASE_PORT.VALUE=0xFFF7E440 -DRIVER.LIN.VAR.LIN_ACTUALBAUDRATE.VALUE=19.995 +DRIVER.LIN.VAR.LIN_ACTUALBAUDRATE.VALUE=20.000 DRIVER.LIN.VAR.LIN_PORT_BIT1_PSL.VALUE=0 DRIVER.LIN.VAR.LIN_ISFEINTENA.VALUE=0x00000000 DRIVER.LIN.VAR.LIN_FEINTENA.VALUE=0x00000000 @@ -5888,13 +5888,13 @@ DRIVER.LIN.VAR.LIN_IDINTLVL.VALUE=0x00000000 DRIVER.LIN.VAR.LIN_PEINTENA.VALUE=0x00000000 DRIVER.LIN.VAR.LIN_TOINTLVL.VALUE=0x00000000 -DRIVER.LIN.VAR.LIN_MAXBAUDRATE.VALUE=22.218 +DRIVER.LIN.VAR.LIN_MAXBAUDRATE.VALUE=22.222 DRIVER.LIN.VAR.LIN_BEINTENA.VALUE=0x00000000 DRIVER.LIN.VAR.LIN_RXINTLVL.VALUE=0x00000000 -DRIVER.LIN.VAR.LIN_PRESCALE.VALUE=322 +DRIVER.LIN.VAR.LIN_PRESCALE.VALUE=324 DRIVER.LIN.VAR.LIN_PORT_BIT0_PULDIS.VALUE=0 DRIVER.HET.VAR.HET2_EDGE5_LVL.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_PWM5_PERIOD_PRESCALER.VALUE=103296 +DRIVER.HET.VAR.HET2_PWM5_PERIOD_PRESCALER.VALUE=103936 DRIVER.HET.VAR.HET2_PWM0_PERIOD_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT0_PULL.VALUE=2 DRIVER.HET.VAR.HET2_INT_X0.VALUE=0x00000000 @@ -5912,7 +5912,7 @@ DRIVER.HET.VAR.HET2_BIT3_DOUT.VALUE=0 DRIVER.HET.VAR.HET2_INT_X2.VALUE=0x00000000 DRIVER.HET.VAR.HET2_INT_X3.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM2_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET1_PWM2_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET2_INT_X4.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM6_ACTION.VALUE=3 DRIVER.HET.VAR.HET1_PWM0_DUTY_LVL.VALUE=0x00000000 @@ -5926,7 +5926,7 @@ DRIVER.HET.VAR.HET1_BIT22_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT18_HRSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT14_PULDIS.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_PWM4_ACTUALPERIOD.VALUE=1000.862 +DRIVER.HET.VAR.HET2_PWM4_ACTUALPERIOD.VALUE=1000.615 DRIVER.HET.VAR.HET2_BIT3_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET2_INT_X6.VALUE=0x00000000 DRIVER.HET.VAR.HET1_EDGE0_PIN_SELECT.VALUE=12 @@ -5942,7 +5942,7 @@ DRIVER.HET.VAR.HET2_BIT11_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT11_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_PWM4_PIN_SELECT.VALUE=16 -DRIVER.HET.VAR.HET2_PWM4_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET2_PWM4_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET1_RAM_BASE.VALUE=0xFF460000 DRIVER.HET.VAR.HET2_EDGE6_BOTH.VALUE=0 DRIVER.HET.VAR.HET2_PWM2_DUTY_LVL.VALUE=0x00000000 @@ -5977,17 +5977,17 @@ DRIVER.HET.VAR.HET1_BIT29_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT0_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT8_DIR.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM4_PERIOD_PRESCALER.VALUE=103296 +DRIVER.HET.VAR.HET1_PWM4_PERIOD_PRESCALER.VALUE=103936 DRIVER.HET.VAR.HET2_BIT1_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT12_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET2_PWM7_ACTION.VALUE=3 -DRIVER.HET.VAR.HET2_PWM4_PERIOD_PRESCALER.VALUE=103296 +DRIVER.HET.VAR.HET2_PWM4_PERIOD_PRESCALER.VALUE=103936 DRIVER.HET.VAR.HET2_BIT18_PULL.VALUE=1 DRIVER.HET.VAR.HET2_BIT16_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_PWM3_DUTY_INTENA.VALUE=0x00000000 DRIVER.HET.VAR.HET2_PWM3_POLARITY.VALUE=3 DRIVER.HET.VAR.HET1_BIT0_XORSHARE.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_PWM1_ACTUALPERIOD.VALUE=1000.862 +DRIVER.HET.VAR.HET2_PWM1_ACTUALPERIOD.VALUE=1000.615 DRIVER.HET.VAR.HET2_BIT6_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_CAP5_PIN_SELECT.VALUE=26 DRIVER.HET.VAR.HET1_BIT28_PSL.VALUE=0x00000000 @@ -5997,7 +5997,7 @@ DRIVER.HET.VAR.HET2_BIT1_PULL.VALUE=1 DRIVER.HET.VAR.HET1_EDGE7_EVENT.VALUE=1 DRIVER.HET.VAR.HET1_EDGE5_BOTH.VALUE=0 -DRIVER.HET.VAR.HET1_PWM5_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET1_PWM5_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET1_BIT3_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_EDGE7_POLARITY.VALUE=0 DRIVER.HET.VAR.HET1_EDGE1_INTENA.VALUE=0x00040000 @@ -6013,13 +6013,13 @@ DRIVER.HET.VAR.HET2_PWM0_PERIOD_INTENA.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT2_XORSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT5_PSL.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM7_ACTUALPERIOD.VALUE=1000.862 +DRIVER.HET.VAR.HET1_PWM7_ACTUALPERIOD.VALUE=1000.615 DRIVER.HET.VAR.HET1_BIT8_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_BIT1_PDR.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_LR_ACTUALTIME.VALUE=1238.690 -DRIVER.HET.VAR.HET1_PWM5_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET2_LR_ACTUALTIME.VALUE=1230.769 +DRIVER.HET.VAR.HET1_PWM5_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET2_PWM5_PERIOD_LVL.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_PWM4_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET2_PWM4_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET2_BIT9_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM3_DUTY_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET2_PWM0_DUTY_INTENA.VALUE=0x00000000 @@ -6042,8 +6042,8 @@ DRIVER.HET.VAR.HET1_BIT29_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT0_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET_DIS_BLACKBOX.VALUE=0 -DRIVER.HET.VAR.HET2_PWM7_DUTYTIME.VALUE=501.669 -DRIVER.HET.VAR.HET2_HR_ACTUALFREQUENCY.VALUE=103.335 +DRIVER.HET.VAR.HET2_PWM7_DUTYTIME.VALUE=500.923 +DRIVER.HET.VAR.HET2_HR_ACTUALFREQUENCY.VALUE=104.000 DRIVER.HET.VAR.HET2_PWM5_DUTY_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM4_ACTION.VALUE=3 DRIVER.HET.VAR.HET1_BIT25_PULL.VALUE=1 @@ -6059,7 +6059,7 @@ DRIVER.HET.VAR.HET2_INT_X11.VALUE=0x00000000 DRIVER.HET.VAR.HET2_INT_X20.VALUE=0x00000000 DRIVER.HET.VAR.HET2_INT_X12.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM3_PERIOD_PRESCALER.VALUE=103296 +DRIVER.HET.VAR.HET1_PWM3_PERIOD_PRESCALER.VALUE=103936 DRIVER.HET.VAR.HET2_PWM6_ENA.VALUE=0 DRIVER.HET.VAR.HET2_BIT16_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET2_INT_X21.VALUE=0x00000000 @@ -6077,7 +6077,7 @@ DRIVER.HET.VAR.HET2_INT_X31.VALUE=0x00000000 DRIVER.HET.VAR.HET2_INT_X23.VALUE=0x00000000 DRIVER.HET.VAR.HET2_INT_X15.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_PWM3_PERIOD_PRESCALER.VALUE=103296 +DRIVER.HET.VAR.HET2_PWM3_PERIOD_PRESCALER.VALUE=103936 DRIVER.HET.VAR.HET2_INT_X24.VALUE=0x00000000 DRIVER.HET.VAR.HET2_INT_X16.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BASE_PORT.VALUE=0xFFF7B84C @@ -6096,19 +6096,19 @@ DRIVER.HET.VAR.HET2_BIT18_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_INT_X28.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM2_PERIOD_LVL.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM1_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET1_PWM1_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET2_PWM0_DUTY.VALUE=50 DRIVER.HET.VAR.HET2_BIT18_XORSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET2_INT_X29.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM1_ENA.VALUE=0 DRIVER.HET.VAR.HET2_CAP7_PIN_SELECT.VALUE=6 DRIVER.HET.VAR.HET2_BIT8_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM5_PERIOD.VALUE=1000.000 -DRIVER.HET.VAR.HET1_PWM4_ACTUALPERIOD.VALUE=1000.862 +DRIVER.HET.VAR.HET1_PWM4_ACTUALPERIOD.VALUE=1000.615 DRIVER.HET.VAR.HET1_PWM3_PIN_SELECT.VALUE=14 DRIVER.HET.VAR.HET1_BIT11_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_BIT1_PSL.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_PWM0_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET2_PWM0_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET2_BIT2_PULL.VALUE=1 DRIVER.HET.VAR.HET1_EDGE6_BOTH.VALUE=0 DRIVER.HET.VAR.HET1_BIT5_DIR.VALUE=0x00000000 @@ -6121,7 +6121,7 @@ DRIVER.HET.VAR.HET1_PIN_ENABLE.VALUE=0 DRIVER.HET.VAR.HET2_BIT16_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT5_DOUT.VALUE=0 -DRIVER.HET.VAR.HET2_PWM0_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET2_PWM0_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET1_BIT6_PULL.VALUE=1 DRIVER.HET.VAR.HET2_PWM7_ENA.VALUE=0 DRIVER.HET.VAR.HET1_PWM0_DUTY_INTENA.VALUE=0x00000000 @@ -6143,7 +6143,7 @@ DRIVER.HET.VAR.HET2_BIT9_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT2_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET2_EDGE0_EVENT.VALUE=1 -DRIVER.HET.VAR.HET1_PWM2_PERIOD_PRESCALER.VALUE=103296 +DRIVER.HET.VAR.HET1_PWM2_PERIOD_PRESCALER.VALUE=103936 DRIVER.HET.VAR.HET1_BIT26_PULL.VALUE=1 DRIVER.HET.VAR.HET1_BIT18_PULL.VALUE=1 DRIVER.HET.VAR.HET1_BIT6_DIR.VALUE=0x00000000 @@ -6153,19 +6153,19 @@ DRIVER.HET.VAR.HET1_CAP4_PIN_SELECT.VALUE=24 DRIVER.HET.VAR.HET1_BIT29_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_BIT0_DOUT.VALUE=0 -DRIVER.HET.VAR.HET2_PWM2_PERIOD_PRESCALER.VALUE=103296 +DRIVER.HET.VAR.HET2_PWM2_PERIOD_PRESCALER.VALUE=103936 DRIVER.HET.VAR.HET2_EDGE3_POLARITY.VALUE=0 DRIVER.HET.VAR.HET1_BIT3_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT2_HRSHARE.VALUE=0x00000002 DRIVER.HET.VAR.HET2_PWM6_PERIOD.VALUE=1000.000 DRIVER.HET.VAR.HET2_BIT8_PSL.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM1_ACTUALPERIOD.VALUE=1000.862 +DRIVER.HET.VAR.HET1_PWM1_ACTUALPERIOD.VALUE=1000.615 DRIVER.HET.VAR.HET1_BIT4_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT4_HRSHARE.VALUE=0x00000004 DRIVER.HET.VAR.HET1_BIT25_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT17_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT16_PSL.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM1_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET1_PWM1_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET2_PWM4_PERIOD_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM2_ACTION.VALUE=3 DRIVER.HET.VAR.HET2_PWM1_DUTY.VALUE=50 @@ -6191,21 +6191,21 @@ DRIVER.HET.VAR.HET1_BIT10_XORSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET1_INT_X21.VALUE=0x00000000 DRIVER.HET.VAR.HET1_INT_X13.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_PWM5_ACTUALPERIOD.VALUE=1000.862 +DRIVER.HET.VAR.HET2_PWM5_ACTUALPERIOD.VALUE=1000.615 DRIVER.HET.VAR.HET2_BIT18_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT6_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_EDGE4_PIN_SELECT.VALUE=20 DRIVER.HET.VAR.HET1_INT_X30.VALUE=0x00000000 DRIVER.HET.VAR.HET1_INT_X22.VALUE=0x00000000 DRIVER.HET.VAR.HET1_INT_X14.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_PWM3_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET2_PWM3_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET1_INT_X31.VALUE=0x00000000 DRIVER.HET.VAR.HET1_INT_X23.VALUE=0x00000000 DRIVER.HET.VAR.HET1_INT_X15.VALUE=0x00000000 DRIVER.HET.VAR.HET2_EDGE5_EVENT.VALUE=1 DRIVER.HET.VAR.HET2_PWM1_DUTY_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM7_PERIOD_LVL.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM6_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET1_PWM6_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET1_BIT7_PULL.VALUE=1 DRIVER.HET.VAR.HET1_INT_X24.VALUE=0x00000000 DRIVER.HET.VAR.HET1_INT_X16.VALUE=0x00000000 @@ -6229,16 +6229,16 @@ DRIVER.HET.VAR.HET2_BIT17_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT14_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_PWM3_PERIOD.VALUE=1000.000 -DRIVER.HET.VAR.HET2_PWM5_DUTY_PRESCALER.VALUE=51968 -DRIVER.HET.VAR.HET1_PWM1_PERIOD_PRESCALER.VALUE=103296 +DRIVER.HET.VAR.HET2_PWM5_DUTY_PRESCALER.VALUE=52224 +DRIVER.HET.VAR.HET1_PWM1_PERIOD_PRESCALER.VALUE=103936 DRIVER.HET.VAR.HET1_BIT10_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_CAP4_POLARITY.VALUE=0 DRIVER.HET.VAR.HET2_BIT8_XORSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT4_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM4_ENA.VALUE=0 DRIVER.HET.VAR.HET1_PWM0_POLARITY.VALUE=3 DRIVER.HET.VAR.HET1_BIT4_PSL.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_PWM1_PERIOD_PRESCALER.VALUE=103296 +DRIVER.HET.VAR.HET2_PWM1_PERIOD_PRESCALER.VALUE=103936 DRIVER.HET.VAR.HET1_EDGE1_LVL.VALUE=0x00040000 DRIVER.HET.VAR.HET1_PWM1_PERIOD_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT27_PULL.VALUE=1 @@ -6259,7 +6259,7 @@ DRIVER.HET.VAR.HET1_BIT8_HRSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT4_ANDSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET2_EDGE3_PIN_SELECT.VALUE=6 -DRIVER.HET.VAR.HET2_PWM2_ACTUALPERIOD.VALUE=1000.862 +DRIVER.HET.VAR.HET2_PWM2_ACTUALPERIOD.VALUE=1000.615 DRIVER.HET.VAR.HET2_BIT18_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT11_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT10_PULL.VALUE=1 @@ -6272,11 +6272,11 @@ DRIVER.HET.VAR.HET1_BIT21_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_BIT13_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_BIT5_PSL.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM4_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET1_PWM4_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET2_BIT4_PULL.VALUE=1 DRIVER.HET.VAR.HET1_EDGE2_LVL.VALUE=0x00080000 DRIVER.HET.VAR.HET1_PWM2_DUTY_LVL.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM2_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET1_PWM2_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET1_BIT9_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT6_ANDSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM6_DUTY.VALUE=50 @@ -6292,17 +6292,17 @@ DRIVER.HET.VAR.HET1_BIT15_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET1_CAP3_PIN_SELECT.VALUE=6 DRIVER.HET.VAR.HET1_BIT7_PDR.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_PWM6_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET2_PWM6_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET2_PWM4_DUTY_LVL.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_PWM1_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET2_PWM1_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET2_BIT12_PULL.VALUE=1 -DRIVER.HET.VAR.HET1_PWM0_PERIOD_PRESCALER.VALUE=103296 +DRIVER.HET.VAR.HET1_PWM0_PERIOD_PRESCALER.VALUE=103936 DRIVER.HET.VAR.HET1_PWM0_ACTION.VALUE=3 DRIVER.HET.VAR.HET1_CAP5_POLARITY.VALUE=0 DRIVER.HET.VAR.HET1_BIT26_ANDSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT18_ANDSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT15_DOUT.VALUE=0 -DRIVER.HET.VAR.HET2_PWM0_PERIOD_PRESCALER.VALUE=103296 +DRIVER.HET.VAR.HET2_PWM0_PERIOD_PRESCALER.VALUE=103936 DRIVER.HET.VAR.HET1_EDGE4_EVENT.VALUE=1 DRIVER.HET.VAR.HET1_BIT20_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT12_DIR.VALUE=0x00000000 @@ -6333,8 +6333,8 @@ DRIVER.HET.VAR.HET2_BIT2_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT2_XORSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM7_PIN_SELECT.VALUE=19 -DRIVER.HET.VAR.HET1_PWM5_ACTUALPERIOD.VALUE=1000.862 -DRIVER.HET.VAR.HET1_LR_ACTUALTIME.VALUE=1238.690 +DRIVER.HET.VAR.HET1_PWM5_ACTUALPERIOD.VALUE=1000.615 +DRIVER.HET.VAR.HET1_LR_ACTUALTIME.VALUE=1230.769 DRIVER.HET.VAR.HET1_BIT21_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT13_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT11_PULL.VALUE=1 @@ -6345,7 +6345,7 @@ DRIVER.HET.VAR.HET1_BIT22_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_BIT14_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_BIT7_PSL.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_HR_ACTUALFREQUENCY.VALUE=103.335 +DRIVER.HET.VAR.HET1_HR_ACTUALFREQUENCY.VALUE=104.000 DRIVER.HET.VAR.HET2_PWM1_ACTION.VALUE=3 DRIVER.HET.VAR.HET2_BIT5_PULL.VALUE=1 DRIVER.HET.VAR.HET1_EDGE4_LVL.VALUE=0x00000000 @@ -6356,7 +6356,7 @@ DRIVER.HET.VAR.HET1_PWM2_DUTY_INTENA.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT8_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_BIT11_PDR.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM7_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET1_PWM7_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET2_EDGE6_EVENT.VALUE=1 DRIVER.HET.VAR.HET2_MASTER.VALUE=1 DRIVER.HET.VAR.HET1_PWM5_DUTY_LVL.VALUE=0x00000000 @@ -6368,7 +6368,7 @@ DRIVER.HET.VAR.HET1_PWM1_PIN_SELECT.VALUE=10 DRIVER.HET.VAR.HET1_BIT9_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT13_PULL.VALUE=1 -DRIVER.HET.VAR.HET1_PWM7_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET1_PWM7_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET1_PWM5_PERIOD_INTENA.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT24_XORSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT16_XORSHARE.VALUE=0x00000000 @@ -6395,7 +6395,7 @@ DRIVER.HET.VAR.HET1_DIS_BLACKBOX.VALUE=0 DRIVER.HET.VAR.HET2_LR_TIME.VALUE=800.000 DRIVER.HET.VAR.HET1_INT_X3.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_PWM6_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET2_PWM6_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET1_EDGE5_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM5_ACTION.VALUE=3 DRIVER.HET.VAR.HET1_BIT29_PULL.VALUE=1 @@ -6405,12 +6405,12 @@ DRIVER.HET.VAR.HET1_BIT21_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT13_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET1_INT_X5.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM2_ACTUALPERIOD.VALUE=1000.862 +DRIVER.HET.VAR.HET1_PWM2_ACTUALPERIOD.VALUE=1000.615 DRIVER.HET.VAR.HET1_BIT20_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT12_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT3_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_INT_X6.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM0_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET1_PWM0_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET1_INT_X7.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BASE_PORT.VALUE=0xFFF7B94C DRIVER.HET.VAR.HET1_INT_X8.VALUE=0x00000000 @@ -6427,7 +6427,7 @@ DRIVER.HET.VAR.HET2_BIT10_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET1_CAP2_PIN_SELECT.VALUE=4 DRIVER.HET.VAR.HET1_BIT11_PSL.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_PWM2_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET2_PWM2_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET2_PWM0_DUTY_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT31_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT23_DIR.VALUE=0x00000000 @@ -6440,7 +6440,7 @@ DRIVER.HET.VAR.HET1_BIT30_ANDSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT22_ANDSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT14_ANDSHARE.VALUE=0x00000000 -DRIVER.HET.VAR.HET2_PWM6_ACTUALPERIOD.VALUE=1000.862 +DRIVER.HET.VAR.HET2_PWM6_ACTUALPERIOD.VALUE=1000.615 DRIVER.HET.VAR.HET1_PWM6_PERIOD.VALUE=1000.000 DRIVER.HET.VAR.HET1_BIT31_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_BIT23_DOUT.VALUE=0 @@ -6456,7 +6456,7 @@ DRIVER.HET.VAR.HET1_BIT13_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_PWM2_PERIOD_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT0_DIR.VALUE=0x00000001 -DRIVER.HET.VAR.HET1_PWM3_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET1_PWM3_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET2_CAP3_POLARITY.VALUE=0 DRIVER.HET.VAR.HET2_BIT0_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET2_PWM3_PIN_SELECT.VALUE=14 @@ -6468,7 +6468,7 @@ DRIVER.HET.VAR.HET1_BIT20_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT12_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_HR_FREQUENCY.VALUE=110.000 -DRIVER.HET.VAR.HET2_PWM2_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET2_PWM2_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET1_EDGE5_EVENT.VALUE=1 DRIVER.HET.VAR.HET1_EDGE1_BOTH.VALUE=0 DRIVER.HET.VAR.HET1_PWM5_PERIOD_LVL.VALUE=0x00000000 @@ -6496,8 +6496,8 @@ DRIVER.HET.VAR.HET1_BIT4_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET2_EDGE7_PIN_SELECT.VALUE=14 DRIVER.HET.VAR.HET2_PWM7_PERIOD.VALUE=1000.000 -DRIVER.HET.VAR.HET2_PWM3_ACTUALPERIOD.VALUE=1000.862 -DRIVER.HET.VAR.HET1_PWM3_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET2_PWM3_ACTUALPERIOD.VALUE=1000.615 +DRIVER.HET.VAR.HET1_PWM3_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET2_EDGE3_BOTH.VALUE=0 DRIVER.HET.VAR.HET1_PWM1_DUTY_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM2_PERIOD_INTENA.VALUE=0x00000000 @@ -6523,7 +6523,7 @@ DRIVER.HET.VAR.HET1_BIT11_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT24_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_BIT16_DOUT.VALUE=0 -DRIVER.HET.VAR.HET2_PWM5_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET2_PWM5_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET2_RAM_BASE.VALUE=0xFF440000 DRIVER.HET.VAR.HET2_PWM3_DUTY_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT7_PULL.VALUE=1 @@ -6560,10 +6560,10 @@ DRIVER.HET.VAR.HET2_RAM_PARITY_ENA.VALUE=0x00000005 DRIVER.HET.VAR.HET1_PWM7_PERIOD_INTENA.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM0_DUTY.VALUE=50 -DRIVER.HET.VAR.HET2_PWM0_ACTUALPERIOD.VALUE=1000.862 +DRIVER.HET.VAR.HET2_PWM0_ACTUALPERIOD.VALUE=1000.615 DRIVER.HET.VAR.HET2_BIT1_DOUT.VALUE=0 DRIVER.HET.VAR.HET1_CAP1_PIN_SELECT.VALUE=2 -DRIVER.HET.VAR.HET1_PWM7_PERIOD_PRESCALER.VALUE=103296 +DRIVER.HET.VAR.HET1_PWM7_PERIOD_PRESCALER.VALUE=103936 DRIVER.HET.VAR.HET1_BIT2_PULL.VALUE=1 DRIVER.HET.VAR.HET2_PWM6_PERIOD_INTENA.VALUE=0x00000000 DRIVER.HET.VAR.HET2_PWM4_POLARITY.VALUE=3 @@ -6574,13 +6574,13 @@ DRIVER.HET.VAR.HET1_BIT24_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT16_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT5_DOUT.VALUE=0 -DRIVER.HET.VAR.HET2_PWM7_PERIOD_PRESCALER.VALUE=103296 -DRIVER.HET.VAR.HET2_PWM7_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET2_PWM7_PERIOD_PRESCALER.VALUE=103936 +DRIVER.HET.VAR.HET2_PWM7_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET2_PWM4_ACTION.VALUE=3 DRIVER.HET.VAR.HET2_BIT3_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_EDGE5_INTENA.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT6_ANDSHARE.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM6_ACTUALPERIOD.VALUE=1000.862 +DRIVER.HET.VAR.HET1_PWM6_ACTUALPERIOD.VALUE=1000.615 DRIVER.HET.VAR.HET2_EDGE4_BOTH.VALUE=0 DRIVER.HET.VAR.HET2_PWM1_PERIOD_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT11_DIR.VALUE=0x00000000 @@ -6591,7 +6591,7 @@ DRIVER.HET.VAR.HET1_BIT31_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT23_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT15_PSL.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM6_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET1_PWM6_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET2_EDGE2_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM4_DUTY_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT30_PULL.VALUE=1 @@ -6626,7 +6626,7 @@ DRIVER.HET.VAR.HET1_BIT16_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT16_PULL.VALUE=1 DRIVER.HET.VAR.HET2_BIT12_DIR.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM4_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET1_PWM4_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET1_PWM1_ACTION.VALUE=3 DRIVER.HET.VAR.HET2_BIT0_HRSHARE.VALUE=0x00000001 DRIVER.HET.VAR.HET1_EDGE7_POLARITY.VALUE=0 @@ -6639,7 +6639,7 @@ DRIVER.HET.VAR.HET2_EDGE3_LVL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_EDGE6_EVENT.VALUE=1 DRIVER.HET.VAR.HET1_EDGE3_BOTH.VALUE=0 -DRIVER.HET.VAR.HET1_PWM6_PERIOD_PRESCALER.VALUE=103296 +DRIVER.HET.VAR.HET1_PWM6_PERIOD_PRESCALER.VALUE=103936 DRIVER.HET.VAR.HET1_BIT28_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT13_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET1_PWM5_POLARITY.VALUE=3 @@ -6649,17 +6649,17 @@ DRIVER.HET.VAR.HET2_CAP3_PIN_SELECT.VALUE=6 DRIVER.HET.VAR.HET2_BIT10_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT2_DOUT.VALUE=0 -DRIVER.HET.VAR.HET1_PWM3_ACTUALPERIOD.VALUE=1000.862 +DRIVER.HET.VAR.HET1_PWM3_ACTUALPERIOD.VALUE=1000.615 DRIVER.HET.VAR.HET2_EDGE3_EVENT.VALUE=1 -DRIVER.HET.VAR.HET2_PWM6_PERIOD_PRESCALER.VALUE=103296 -DRIVER.HET.VAR.HET2_PWM3_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET2_PWM6_PERIOD_PRESCALER.VALUE=103936 +DRIVER.HET.VAR.HET2_PWM3_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET1_BIT3_PULL.VALUE=1 DRIVER.HET.VAR.HET2_PWM1_ENA.VALUE=0 DRIVER.HET.VAR.HET2_BIT1_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT26_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT18_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT6_DOUT.VALUE=0 -DRIVER.HET.VAR.HET2_PWM1_DUTYTIME.VALUE=501.669 +DRIVER.HET.VAR.HET2_PWM1_DUTYTIME.VALUE=500.923 DRIVER.HET.VAR.HET2_BIT5_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_PWM7_POLARITY.VALUE=3 DRIVER.HET.VAR.HET2_BIT16_HRSHARE.VALUE=0x00000000 @@ -6673,7 +6673,7 @@ DRIVER.HET.VAR.HET2_BIT13_DIR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT3_PULDIS.VALUE=0x00000000 DRIVER.HET.VAR.HET1_EDGE0_POLARITY.VALUE=0 -DRIVER.HET.VAR.HET2_PWM7_ACTUALPERIOD.VALUE=1000.862 +DRIVER.HET.VAR.HET2_PWM7_ACTUALPERIOD.VALUE=1000.615 DRIVER.HET.VAR.HET2_BIT3_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT25_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT17_PSL.VALUE=0x00000000 @@ -6704,18 +6704,18 @@ DRIVER.HET.VAR.HET1_BIT27_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT19_PDR.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT6_DIR.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM0_DUTY_PRESCALER.VALUE=51968 +DRIVER.HET.VAR.HET1_PWM0_DUTY_PRESCALER.VALUE=52224 DRIVER.HET.VAR.HET2_EDGE7_INTENA.VALUE=0x00000000 DRIVER.HET.VAR.HET2_PWM0_POLARITY.VALUE=3 DRIVER.HET.VAR.HET1_BIT26_XORSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT18_XORSHARE.VALUE=0x00000000 DRIVER.HET.VAR.HET2_BIT10_PSL.VALUE=0x00000000 DRIVER.HET.VAR.HET1_EDGE6_PIN_SELECT.VALUE=22 -DRIVER.HET.VAR.HET1_PWM0_ACTUALPERIOD.VALUE=1000.862 +DRIVER.HET.VAR.HET1_PWM0_ACTUALPERIOD.VALUE=1000.615 DRIVER.HET.VAR.HET2_HR_FREQUENCY.VALUE=110.000 DRIVER.HET.VAR.HET2_BIT17_PULL.VALUE=1 DRIVER.HET.VAR.HET2_BIT14_DIR.VALUE=0x00000000 -DRIVER.HET.VAR.HET1_PWM5_PERIOD_PRESCALER.VALUE=103296 +DRIVER.HET.VAR.HET1_PWM5_PERIOD_PRESCALER.VALUE=103936 DRIVER.HET.VAR.HET2_EDGE4_POLARITY.VALUE=0 DRIVER.HET.VAR.HET2_EDGE0_INTENA.VALUE=0x00000000 DRIVER.HET.VAR.HET1_BIT7_PULDIS.VALUE=0x00000000 @@ -7090,7 +7090,7 @@ DRIVER.DCC.VAR.DCC1_VALID0_SEED.VALUE=792 DRIVER.DCC.VAR.DCC1_BASE.VALUE=0xFFFFEC00 DRIVER.DCC.VAR.DCC2_COUNT1_SEED.VALUE=0 -DRIVER.DCC.VAR.DCC1_CLOCK_SOURCE1_FREQ.VALUE=206.67 +DRIVER.DCC.VAR.DCC1_CLOCK_SOURCE1_FREQ.VALUE=208.00 DRIVER.DCC.VAR.DCC1_CLOCK_DRIFT.VALUE=1.0 DRIVER.DCC.VAR.DCC1_ENABLE.VALUE=0xA DRIVER.DCC.VAR.DCC1_ENABLE_SINGLESHOT_MODE.VALUE=0x5 @@ -7104,7 +7104,7 @@ DRIVER.DCC.VAR.DCC1_CLOCK_SOURCE0.VALUE=OSCIN DRIVER.DCC.VAR.DCC1_CLOCK_SOURCE1.VALUE=PLL1 DRIVER.DCC.VAR.CLKT_TCK_FREQ.VALUE=12.0 -DRIVER.DCC.VAR.DCC1_COUNT1_SEED.VALUE=511508 +DRIVER.DCC.VAR.DCC1_COUNT1_SEED.VALUE=514800 DRIVER.PINMUX.VAR.DMA_EIDXS_28.VALUE=0 DRIVER.PINMUX.VAR.DMA_FIDXD_20.VALUE=0 DRIVER.PINMUX.VAR.DMA_FIDXD_12.VALUE=0 @@ -10322,7 +10322,7 @@ DRIVER.FEE.VAR.FEE_FLASH_ERROR_CORRECTION_ENABLE.VALUE=STD_ON DRIVER.FEE.VAR.FEE_VIRTUAL_SECTOR_2_BANK.VALUE=7 DRIVER.FEE.VAR.FEE_DATASELECT_BITS.VALUE=0 -DRIVER.FEE.VAR.FEE_OPERATING_FREQ.VALUE=206.670 +DRIVER.FEE.VAR.FEE_OPERATING_FREQ.VALUE=208.000 DRIVER.FEE.VAR.FEE_TOTAL_SECTORS.VALUE=4 DRIVER.FEE.VAR.FEE_BLOCK_INDEX_16_NUMBER.VALUE=16 DRIVER.FEE.VAR.FEE_BLOCK_INDEX_15_WRITE_CYCLES.VALUE=0x8 Index: firmware/source/i2c.c =================================================================== diff -u -rd2d9f19fd458bad756c2468ea10fceb0c11d4200 -r8466e63f95f65a3ffb18c3af85ac99328e41167b --- firmware/source/i2c.c (.../i2c.c) (revision d2d9f19fd458bad756c2468ea10fceb0c11d4200) +++ firmware/source/i2c.c (.../i2c.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) @@ -202,7 +202,7 @@ uint32 prescale; uint32 d; uint32 ck; - float64 vclk = 103.335F * 1000000.0F; + float64 vclk = 104.000F * 1000000.0F; float64 divider= 0.0F; uint32 temp = 0U;