Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r134d96d197007eeafb2e8e41de941742f348f9db -re6471488a8342e5b23f8a4dc977980e1e442d923 --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 134d96d197007eeafb2e8e41de941742f348f9db) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision e6471488a8342e5b23f8a4dc977980e1e442d923) @@ -68,6 +68,7 @@ /// Interval (in ms) at which to publish air trap data to CAN bus. static OVERRIDE_U32_T airTrapDataPublishInterval = { AIR_TRAP_DATA_PUB_INTERVAL, AIR_TRAP_DATA_PUB_INTERVAL, AIR_TRAP_DATA_PUB_INTERVAL, 0 }; static OVERRIDE_U32_T airTrapLevels[ NUM_OF_AIR_TRAP_LEVEL_SENSORS ]; ///< Detected air trap level for each level sensor. +static OVERRIDE_U32_T rawAirTrapLevels[ NUM_OF_AIR_TRAP_LEVEL_SENSORS ]; ///< raw air trap level before debouncing time static U32 airTrapLevelsDebounceStartTime[ NUM_OF_AIR_TRAP_LEVEL_SENSORS ]; ///< Debounce start time for airtrap level sensor. static BOOL pendingStartAirTrapController = FALSE; ///< Flag indicates an air trap controller start request is pending. @@ -103,11 +104,15 @@ for ( i = 0; i < NUM_OF_AIR_TRAP_LEVEL_SENSORS; i++ ) { - airTrapLevels[i].data = 0; - airTrapLevels[i].ovData = 0; - airTrapLevels[i].ovInitData = 0; - airTrapLevels[i].override = OVERRIDE_RESET; - airTrapLevelsDebounceStartTime[i] = 0; + airTrapLevels[i].data = 0; + airTrapLevels[i].ovData = 0; + airTrapLevels[i].ovInitData = 0; + airTrapLevels[i].override = OVERRIDE_RESET; + rawAirTrapLevels[i].data = 0; + rawAirTrapLevels[i].ovData = 0; + rawAirTrapLevels[i].ovInitData = 0; + rawAirTrapLevels[i].override = OVERRIDE_RESET; + airTrapLevelsDebounceStartTime[i] = 0; } initPersistentAlarm( ALARM_ID_HD_AIR_TRAP_ILLEGAL_LEVELS, AIR_TRAP_ILLEGAL_LEVELS_TIMEOUT_MS, AIR_TRAP_ILLEGAL_LEVELS_TIMEOUT_MS ); @@ -193,18 +198,17 @@ BOOL isAirTrapLevelsValid = FALSE; AIR_TRAP_LEVELS_T lowerAirTrap, upperAirTrap; AIR_TRAP_LEVEL_SENSORS_T airTrapLevelSensor; - AIR_TRAP_LEVELS_T currentLevelStatus[ NUM_OF_AIR_TRAP_LEVEL_SENSORS ]; - // Get latest level readings + // Get latest raw level readings getFPGAAirTrapLevels( &lower, &upper ); - currentLevelStatus[ AIR_TRAP_LEVEL_SENSOR_LOWER ] = ( TRUE == lower ? AIR_TRAP_LEVEL_AIR : AIR_TRAP_LEVEL_FLUID ); - currentLevelStatus[ AIR_TRAP_LEVEL_SENSOR_UPPER ] = ( TRUE == upper ? AIR_TRAP_LEVEL_AIR : AIR_TRAP_LEVEL_FLUID ); + rawAirTrapLevels[ AIR_TRAP_LEVEL_SENSOR_LOWER ].data = (U32)( TRUE == lower ? AIR_TRAP_LEVEL_AIR : AIR_TRAP_LEVEL_FLUID ); + rawAirTrapLevels[ AIR_TRAP_LEVEL_SENSOR_UPPER ].data = (U32)( TRUE == upper ? AIR_TRAP_LEVEL_AIR : AIR_TRAP_LEVEL_FLUID ); // Read the level after expiry of debouncing time - for( airTrapLevelSensor = AIR_TRAP_LEVEL_SENSOR_LOWER; airTrapLevelSensor < NUM_OF_AIR_TRAP_LEVEL_SENSORS; airTrapLevelSensor++ ) + for( airTrapLevelSensor = AIR_TRAP_LEVEL_SENSOR_LOWER; airTrapLevelSensor < NUM_OF_AIR_TRAP_LEVEL_SENSORS; airTrapLevelSensor++ ) { - // Check if the current level sensor status is not the same as the recorded data - if ( currentLevelStatus[ airTrapLevelSensor ] != (AIR_TRAP_LEVELS_T)airTrapLevels[ airTrapLevelSensor ].data ) + // Check if the raw level sensor status is not the same as the recorded data + if ( rawAirTrapLevels[ airTrapLevelSensor ].data != airTrapLevels[ airTrapLevelSensor ].data ) { // If the debounce time is 0, start the timer if ( 0 == airTrapLevelsDebounceStartTime[ airTrapLevelSensor ] ) @@ -217,7 +221,7 @@ // reset the debounce time airTrapLevelsDebounceStartTime[ airTrapLevelSensor ] = 0; // update recent level status - airTrapLevels[ airTrapLevelSensor ].data = (U32)currentLevelStatus[ airTrapLevelSensor ]; + airTrapLevels[ airTrapLevelSensor ].data = rawAirTrapLevels[ airTrapLevelSensor ].data; } } else @@ -465,8 +469,34 @@ /*********************************************************************//** * @brief + * The getRawAirTrapLevel function gets the raw level reading for the given + * level sensor. + * @details Inputs: rawAirTrapLevels[] + * @details Outputs: none + * @param sensor ID of level sensor to get reading for + * @return the raw level sensor reading for the given sensor (air or fluid). + *************************************************************************/ +AIR_TRAP_LEVELS_T getRawAirTrapLevel( AIR_TRAP_LEVEL_SENSORS_T sensor ) +{ + AIR_TRAP_LEVELS_T result; + + if ( sensor < NUM_OF_AIR_TRAP_LEVEL_SENSORS ) + { + result = (AIR_TRAP_LEVELS_T)getU32OverrideValue( &rawAirTrapLevels[ sensor ] ); + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, (U32)SW_FAULT_ID_AIR_TRAP_INVALID_LEVEL_SENSOR, (U32)sensor ) + result = AIR_TRAP_LEVEL_AIR; + } + + return result; +} + +/*********************************************************************//** + * @brief * The publishAirTrapData function publishes air trap data at the set interval. - * @details Inputs: airTrapLevels[] + * @details Inputs: airTrapLevels[], rawAirTrapLevels[] * @details Outputs: if broadcast is due, send air trap data * @return none *************************************************************************/ @@ -477,8 +507,10 @@ { AIR_TRAP_PAYLOAD_T data; - data.lowerLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ); - data.upperLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ); + data.lowerLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ); + data.upperLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ); + data.rawLowerLevel = getRawAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ); + data.rawUpperLevel = getRawAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ); broadcastData( MSG_ID_HD_AIR_TRAP_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( AIR_TRAP_PAYLOAD_T ) ); airTrapDataPublicationTimerCounter = 0; @@ -608,4 +640,57 @@ return result; } +/*********************************************************************//** + * @brief + * The testSetRawAirTrapLevelOverride function overrides the measured raw level + * for a given level sensor. + * @details Inputs: none + * @details Outputs: rawAirTrapLevels[] + * @param sensor ID of level sensor to override + * @param level override level sensor with this + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetRawAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor, AIR_TRAP_LEVELS_T level ) +{ + BOOL result = FALSE; + + if ( ( sensor < NUM_OF_AIR_TRAP_LEVEL_SENSORS ) && ( level < NUM_OF_AIR_TRAP_LEVELS ) ) + { + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + rawAirTrapLevels[ sensor ].ovData = (U32)level; + rawAirTrapLevels[ sensor ].override = OVERRIDE_KEY; + } + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetRawAirTrapLevelOverride function resets the override of the + * level sensor. + * @details Inputs: none + * @details Outputs: rawAirTrapLevels[] + * @param sensor ID of level sensor to reset override + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetRawAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor ) +{ + BOOL result = FALSE; + + if ( sensor < NUM_OF_AIR_TRAP_LEVEL_SENSORS ) + { + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + rawAirTrapLevels[ sensor ].override = OVERRIDE_RESET; + rawAirTrapLevels[ sensor ].ovData = rawAirTrapLevels[ sensor ].ovInitData; + } + } + + return result; +} + /**@}*/ Index: firmware/App/Controllers/AirTrap.h =================================================================== diff -u -r736cc5b56cc9c784ab1d8fc8687a73d190c35759 -re6471488a8342e5b23f8a4dc977980e1e442d923 --- firmware/App/Controllers/AirTrap.h (.../AirTrap.h) (revision 736cc5b56cc9c784ab1d8fc8687a73d190c35759) +++ firmware/App/Controllers/AirTrap.h (.../AirTrap.h) (revision e6471488a8342e5b23f8a4dc977980e1e442d923) @@ -53,6 +53,8 @@ { U32 lowerLevel; ///< Lower air trap level sensor state U32 upperLevel; ///< Upper air trap level sensor state + U32 rawLowerLevel; ///< Raw Lower air trap level sensor state + U32 rawUpperLevel; ///< Raw Upper air trap level sensor state } AIR_TRAP_PAYLOAD_T; // ********** public function prototypes ********** @@ -68,11 +70,14 @@ BOOL isAirTrapControlling( void ); AIR_TRAP_LEVELS_T getAirTrapLevel( AIR_TRAP_LEVEL_SENSORS_T sensor ); +AIR_TRAP_LEVELS_T getRawAirTrapLevel( AIR_TRAP_LEVEL_SENSORS_T sensor ); BOOL testSetAirTrapDataPublishIntervalOverride( U32 value ); BOOL testResetAirTrapDataPublishIntervalOverride( void ); BOOL testSetAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor, AIR_TRAP_LEVELS_T level ); -BOOL testResetAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor ); +BOOL testResetAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor ); +BOOL testSetRawAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor, AIR_TRAP_LEVELS_T level ); +BOOL testResetRawAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor ); /**@}*/ Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r20d0c02f453b6dae1884fb1b5ba542053852ffc1 -re6471488a8342e5b23f8a4dc977980e1e442d923 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 20d0c02f453b6dae1884fb1b5ba542053852ffc1) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision e6471488a8342e5b23f8a4dc977980e1e442d923) @@ -1414,6 +1414,10 @@ handleSetAirTrapLevelSensorOverrideRequest( message ); break; + case MSG_ID_HD_RAW_AIR_TRAP_LEVEL_SENSOR_OVERRIDE: + handleSetRawAirTrapLevelSensorOverrideRequest( message ); + break; + case MSG_ID_HD_SOFTWARE_RESET_REQUEST: handleHDSoftwareResetRequest( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r20d0c02f453b6dae1884fb1b5ba542053852ffc1 -re6471488a8342e5b23f8a4dc977980e1e442d923 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 20d0c02f453b6dae1884fb1b5ba542053852ffc1) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision e6471488a8342e5b23f8a4dc977980e1e442d923) @@ -5210,6 +5210,38 @@ /*********************************************************************//** * @brief + * The handleSetRawAirTrapLevelSensorOverrideRequest function handles a request to + * override an air trap level sensor raw value. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleSetRawAirTrapLevelSensorOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetRawAirTrapLevelOverride( (AIR_TRAP_LEVEL_SENSORS_T)payload.index, (AIR_TRAP_LEVELS_T)( payload.state.u32 ) ); + } + else + { + result = testResetRawAirTrapLevelOverride( (AIR_TRAP_LEVEL_SENSORS_T)payload.index ); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief * The handleSetFluidLeakBroadcastIntervalOverrideRequest function handles a * request to override the fluid leak state broadcast interval. * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r20d0c02f453b6dae1884fb1b5ba542053852ffc1 -re6471488a8342e5b23f8a4dc977980e1e442d923 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 20d0c02f453b6dae1884fb1b5ba542053852ffc1) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision e6471488a8342e5b23f8a4dc977980e1e442d923) @@ -721,6 +721,9 @@ // MSG_ID_HD_AIR_TRAP_LEVEL_SENSOR_OVERRIDE void handleSetAirTrapLevelSensorOverrideRequest( MESSAGE_T *message ); +// MSG_ID_HD_RAW_AIR_TRAP_LEVEL_SENSOR_OVERRIDE +void handleSetRawAirTrapLevelSensorOverrideRequest( MESSAGE_T *message ); + // MSG_ID_HD_FLUID_LEAK_SEND_INTERVAL_OVERRIDE void handleSetFluidLeakBroadcastIntervalOverrideRequest( MESSAGE_T *message );