Index: firmware/App/Controllers/BloodLeak.c =================================================================== diff -u -r0ddfb88172db9b6c0b41b1dc5c0cc3e0296068be -r2c9bbece8057254f8389c26a818081002fb69a77 --- firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 0ddfb88172db9b6c0b41b1dc5c0cc3e0296068be) +++ firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 2c9bbece8057254f8389c26a818081002fb69a77) @@ -40,12 +40,14 @@ #define BLOOD_LEAK_UART_COMM_ACTIVE_HIGH 1 ///< Blood leak UART communication active high command. #define BLOOD_LEAK_STARTUP_SEQ_LENGTH 5 ///< Blood leak start up sequence array length. -#define BLOOD_LEAK_SET_POINT_MAX_CHAR_LENGTH 4 -#define BLOOD_LEAK_SET_POINT_START_CHAR_ASCII 83 -#define BLOOD_LEAK_SET_POINT_START_CHAR_INDEX 0 -#define BLOOD_LEAK_CARRIAGE_RETURN_ASCII 13 -#define BLOOD_LEAK_SET_POINT_SEQ_MAX_LENGTH 7 +#define BLOOD_LEAK_SET_POINT_MAX_CHAR_LENGTH 4 ///< Blood leak set point maximum character length. +#define BLOOD_LEAK_SET_POINT_START_CHAR_ASCII 83 ///< Blood leak set point sequence start character in ASCII (letter S). +#define BLOOD_LEAK_SET_POINT_START_CHAR_INDEX 0 ///< Blood leak set point sequence start character index number. +#define BLOOD_LEAK_CARRIAGE_RETURN_ASCII 13 ///< Blood leak set point sequence carriage return character in ASCII. +#define BLOOD_LEAK_SET_POINT_SEQ_MAX_LENGTH 7 ///< Blood leak set point sequence maximum length. +#define BLOOD_LEAK_WAIT_2_READ_SET_POINT ( 0.5 * MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Blood leak wait to read set point in counts. +#define BLOOD_LEAK_MAX_SET_POINT_WRITE_TRIALS 3 ///< Blood leak maximum number of trials to write the set point. /// Defined states for the blood leak detector state machine. typedef enum BloodLeakStates @@ -75,13 +77,13 @@ static OVERRIDE_U32_T bloodLeakDataPublishInterval = { BLOOD_LEAK_PUB_INTERVAL, BLOOD_LEAK_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms) at which to publish blood leak data to CAN bus. static U32 bloodLeakDataPublicationTimerCounter = 0; ///< Timer counter used to schedule blood leak data publication to CAN bus. - static U32 bloodLeakUARTCmdIndex; ///< Blood leak UART command index. - static U32 bloodLeakSetPointSeqLength = 0; ///< Blood leak set point sequence actual length. - static U08 bloodLeakSetPointSequence[ BLOOD_LEAK_SET_POINT_SEQ_MAX_LENGTH ]; ///< Blood leak set point sequence array. +static U32 bloodLeakWait2ReadSetPointCounter = 0; ///< Blood leak wait to read delay counter. +static U32 bloodLeakCurrentSetPointWriteTry = 0; + /// Blood leak start up sequence array. static const U08 BLOOD_LEAK_START_UP_SEQUENCE[ BLOOD_LEAK_STARTUP_SEQ_LENGTH ] = { BLOOD_LEAK_RESET_TX_FIFO, BLOOD_LEAK_UART_COMM_ACTIVE_LOW, @@ -111,22 +113,27 @@ * @details Inputs: none * @details Outputs: bloodLeakState, bloodLeakStatus, bloodLeakSelfTestStatus, * bloodLeakZeroRequested, bloodLeakZeroRequested, bloodLeakSelfTestStartTime, - * bloodLeakUARTCmdIndex, bloodLeakSetPointSequence + * bloodLeakUARTCmdIndex, bloodLeakSetPointSequence, + * bloodLeakWait2ReadSetPointCounter, bloodLeakDataPublicationTimerCounter, + * bloodLeakCurrentSetPointWriteTry * @return none *************************************************************************/ void initBloodLeak( void ) { - bloodLeakState = BLOOD_LEAK_START_UP_STATE; - bloodLeakStatus.data = BLOOD_LEAK_NOT_DETECTED; - bloodLeakStatus.ovInitData = BLOOD_LEAK_NOT_DETECTED; - bloodLeakStatus.ovData = BLOOD_LEAK_NOT_DETECTED; - bloodLeakStatus.override = OVERRIDE_RESET; - bloodLeakSelfTestStatus = SELF_TEST_STATUS_IN_PROGRESS; - bloodLeakZeroRequested = FALSE; - bloodLeakZeroStartTime = 0; - bloodLeakSelfTestStartTime = 0; - bloodLeakUARTCmdIndex = 0; - bloodLeakSetPointSeqLength = 0; + bloodLeakDataPublicationTimerCounter = 0; + bloodLeakState = BLOOD_LEAK_START_UP_STATE; + bloodLeakStatus.data = BLOOD_LEAK_NOT_DETECTED; + bloodLeakStatus.ovInitData = BLOOD_LEAK_NOT_DETECTED; + bloodLeakStatus.ovData = BLOOD_LEAK_NOT_DETECTED; + bloodLeakStatus.override = OVERRIDE_RESET; + bloodLeakSelfTestStatus = SELF_TEST_STATUS_IN_PROGRESS; + bloodLeakZeroRequested = FALSE; + bloodLeakZeroStartTime = 0; + bloodLeakSelfTestStartTime = 0; + bloodLeakUARTCmdIndex = 0; + bloodLeakSetPointSeqLength = 0; + bloodLeakWait2ReadSetPointCounter = 0; + bloodLeakCurrentSetPointWriteTry = 0; // Set the blood leak set pint sequence to 0 to be initialized memset( bloodLeakSetPointSequence, 0x0, BLOOD_LEAK_SET_POINT_SEQ_MAX_LENGTH ); @@ -248,12 +255,20 @@ U32 bloodLeakSetPoint = (U32)getFPGABloodLeakDetectSetPoint(); - if ( REMOVE_LATER_SET_POINT != bloodLeakSetPoint ) + if ( bloodLeakSetPoint != REMOVE_LATER_SET_POINT ) { - prepareSetPointSeq(); + if ( bloodLeakCurrentSetPointWriteTry < BLOOD_LEAK_MAX_SET_POINT_WRITE_TRIALS ) + { + prepareSetPointSeq(); - bloodLeakUARTCmdIndex = 0; - state = BLOOD_LEAK_SET_SET_POINT_STATE; + bloodLeakUARTCmdIndex = 0; + state = BLOOD_LEAK_SET_SET_POINT_STATE; + } + else + { + // TODO fault alarm that we cannot write to blood leak? + } + } else { @@ -274,16 +289,16 @@ { BLOOD_LEAK_STATES_T state = BLOOD_LEAK_SET_SET_POINT_STATE; - U32 command = bloodLeakSetPointSequence[ bloodLeakUARTCmdIndex ]; - // Check if the current buffer index is less than the buffer length if( bloodLeakUARTCmdIndex < bloodLeakSetPointSeqLength ) { - // The active high index is the length - 2 they are the last two elements - 1 since the - // index starts from 0 + U32 command = bloodLeakSetPointSequence[ bloodLeakUARTCmdIndex ]; + + // The active high index is the length - 2 they are the last two elements U32 activeHighIndex = bloodLeakSetPointSeqLength - 2; + // Check if the current index towards the end of the buffer which are 1 and 0 - if( activeHighIndex == bloodLeakUARTCmdIndex ) + if( activeHighIndex > bloodLeakUARTCmdIndex ) { setFPGABloodLeakUARTTransmit( (U08)command ); } @@ -296,8 +311,14 @@ } else { - // Done with writing the set point - state = BLOOD_LEAK_INIT_STATE; + if ( ++bloodLeakWait2ReadSetPointCounter > BLOOD_LEAK_WAIT_2_READ_SET_POINT ) + { + bloodLeakWait2ReadSetPointCounter = 0; + bloodLeakUARTCmdIndex = 0; + + // Done with writing the set point + state = BLOOD_LEAK_CHECK_SET_POINT_STATE; + } } return state; Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -r0ddfb88172db9b6c0b41b1dc5c0cc3e0296068be -r2c9bbece8057254f8389c26a818081002fb69a77 --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision 0ddfb88172db9b6c0b41b1dc5c0cc3e0296068be) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision 2c9bbece8057254f8389c26a818081002fb69a77) @@ -87,7 +87,8 @@ /// FGPA Toggle to RPM conversion coefficient static const F32 TOGGLE_PERIOD_2_RPM_COEFFICIENT = SEC_PER_MIN / ( TOGGLE_PERIOD_RESOLUTION_SECONDS * ROTATIONAL_TO_TOGGLE_PERIOD_CONVERSION ); -static OVERRIDE_U32_T fansPublishInterval = { FANS_DATA_PUBLISH_INTERVAL, FANS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Fans publish time interval override +static OVERRIDE_U32_T fansPublishInterval = { FANS_DATA_PUBLISH_INTERVAL, + FANS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Fans publish time interval override static FANS_EXEC_STATES_T handleExecStateWaitForPOST( void ); static FANS_EXEC_STATES_T handleExecStateRun( void ); @@ -521,13 +522,14 @@ { if ( ++fansPublishCounter > getPublishFansDataInterval() ) { - FANS_DATA_T fansData; + FANS_DATA_T data; - fansData.fansDutyCycle = fansStatus.targetDutyCycle * FRACTION_TO_PERCENT_FACTOR; - fansData.fansTargetRPM = fansStatus.targetRPM; - fansData.fanInlet1RPM = getMeasuredFanRPM( FAN_INLET_1 ); + data.fansDutyCycle = fansStatus.targetDutyCycle * FRACTION_TO_PERCENT_FACTOR; + data.fansTargetRPM = fansStatus.targetRPM; + data.fanInlet1RPM = getMeasuredFanRPM( FAN_INLET_1 ); + data.rpmAlarmTimeOffset = getRPMAlarmStartTimeOffset(); - broadcastData( MSG_ID_HD_FANS_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&fansData, sizeof( FANS_DATA_T ) ); + broadcastData( MSG_ID_HD_FANS_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( FANS_DATA_T ) ); fansPublishCounter = 0; } @@ -653,11 +655,10 @@ if ( TRUE == isTestingActivated() ) { - rpmAlarmStartTimeOffset.ovData = ( ( hours * MIN_PER_HOUR * SEC_PER_MIN ) + ( minutes * SEC_PER_MIN ) ) * MS_PER_SECOND; + rpmAlarmStartTimeOffset.ovData = rpmAlarmStartTimeOffset.ovData + ( ( hours * MIN_PER_HOUR * SEC_PER_MIN ) + ( minutes * SEC_PER_MIN ) ) * MS_PER_SECOND; rpmAlarmStartTimeOffset.override = OVERRIDE_KEY; result = TRUE; - } return result; Index: firmware/App/Controllers/Fans.h =================================================================== diff -u -r2a6ac80309cb52922f856b3eb4ff2c876b44c0d6 -r2c9bbece8057254f8389c26a818081002fb69a77 --- firmware/App/Controllers/Fans.h (.../Fans.h) (revision 2a6ac80309cb52922f856b3eb4ff2c876b44c0d6) +++ firmware/App/Controllers/Fans.h (.../Fans.h) (revision 2c9bbece8057254f8389c26a818081002fb69a77) @@ -41,6 +41,7 @@ F32 fansDutyCycle; ///< Fans duty cycle F32 fansTargetRPM; ///< Fans target RPM F32 fanInlet1RPM; ///< Fan inlet 1 RPM + U32 rpmAlarmTimeOffset } FANS_DATA_T; void initFans( void ); Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r09e6cf9de34acf18f6e1138bf56ac0edb4821186 -r2c9bbece8057254f8389c26a818081002fb69a77 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 09e6cf9de34acf18f6e1138bf56ac0edb4821186) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 2c9bbece8057254f8389c26a818081002fb69a77) @@ -341,7 +341,8 @@ data.alarm = (U32)alarm; data.almData1 = alarmData1; - data.almData2 = alarmData2; + data.almData2 = alarmData2; + broadcastData( MSG_ID_ALARM_TRIGGERED, COMM_BUFFER_OUT_CAN_HD_ALARM, (U08*)&data, sizeof( ALARM_TRIGGERED_PAYLOAD_T ) ); // Send information for UI to log to treatment log if ( ( TRUE == ALARM_TABLE[ alarm ].alarmTreatmentLog ) && ( MODE_TREA == getCurrentOperationMode() ) ) Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r71b08e3335b0c111cc57a562089e8ac0b206d258 -r2c9bbece8057254f8389c26a818081002fb69a77 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 71b08e3335b0c111cc57a562089e8ac0b206d258) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision 2c9bbece8057254f8389c26a818081002fb69a77) @@ -115,7 +115,7 @@ OPN_CLS_STATE_T getFPGADoorState( void ); void setFPGAValvesControlMode( U16 bits ); -U16 getFPGAValvesStatus( void ); +U16 getFPGAValvesStatus( void ); BOOL noFPGAFluidLeakDetected( void );