Index: firmware/App/Monitors/Level.c =================================================================== diff -u -r0cfab391c3a05ae7508460dfcb09041a84c92244 -r371726565d87e57f0aa571740b294be6d7310e11 --- firmware/App/Monitors/Level.c (.../Level.c) (revision 0cfab391c3a05ae7508460dfcb09041a84c92244) +++ firmware/App/Monitors/Level.c (.../Level.c) (revision 371726565d87e57f0aa571740b294be6d7310e11) @@ -51,16 +51,17 @@ // ********** private data ********** static U32 levelsDataPublicationCounter; ///< Level data publication counter. -static OVERRIDE_U32_T levelsDataPublishInterval = { LEVEL_DATA_PUB_INTERVAL, - LEVEL_DATA_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms) at which to publish Level data to CAN bus. +static U32 fplevelsDataPublicationCounter; ///< fp Level data publication counter. +static OVERRIDE_U32_T levelsDataPublishInterval; ///< Interval (in ms) at which to publish Level data to CAN bus. +static OVERRIDE_U32_T fplevelsDataPublishInterval; ///< Interval (in ms/task interval) for FP levels at which to publish valves state to CAN bus. static LEVEL_STATUS_T levelsStatus[ NUM_OF_LEVELS ]; ///< Level status array. static OVERRIDE_U32_T status[ NUM_OF_LEVELS ]; ///< Level status. // ********** private function prototypes ********** static void publishLevelsData( void ); static BOOL processLevelCount( U16 count ); -static LEVEL_STATE_T getFloaterLevelstatus( void ); +static LEVEL_STATE_T getFloaterLevelstatus( LEVEL_T levelId ); /*********************************************************************//** * @brief @@ -73,7 +74,15 @@ { U32 i; - levelsDataPublicationCounter = DATA_PUBLISH_COUNTER_START_COUNT; + levelsDataPublicationCounter = DATA_PUBLISH_COUNTER_START_COUNT; + fplevelsDataPublishInterval.data = LEVEL_DATA_PUB_INTERVAL; + fplevelsDataPublishInterval.ovData = LEVEL_DATA_PUB_INTERVAL; + fplevelsDataPublishInterval.ovInitData = 0; + fplevelsDataPublishInterval.override = OVERRIDE_RESET; + levelsDataPublishInterval.data = LEVEL_DATA_PUB_INTERVAL; + levelsDataPublishInterval.ovData = LEVEL_DATA_PUB_INTERVAL; + levelsDataPublishInterval.ovInitData = 0; + levelsDataPublishInterval.override = OVERRIDE_RESET; // Initialize all the Level for ( i = 0; i < NUM_OF_LEVELS; i++ ) @@ -109,7 +118,7 @@ { // Process the status of the Level case D6_LEVL: - currentLevelStatus = getFloaterLevelstatus(); + currentLevelStatus = getFloaterLevelstatus( D6_LEVL ); break; case D63_LEVL: @@ -121,7 +130,7 @@ break; case P25_LEVL: - currentLevelStatus = getFloaterLevelstatus(); + currentLevelStatus = getFloaterLevelstatus( P25_LEVL ); break; #ifndef _VECTORCAST_ @@ -188,7 +197,7 @@ * @param levelId which is the sensor that its status is requested * @return level status *************************************************************************/ -LEVEL_STATE_T getLevelStatus( LELVEL_T levelId ) +LEVEL_STATE_T getLevelStatus( LEVEL_T levelId ) { U32 stat = 0; @@ -244,28 +253,54 @@ * @details \b Outputs: level * @return level status *************************************************************************/ -static LEVEL_STATE_T getFloaterLevelstatus( void ) +static LEVEL_STATE_T getFloaterLevelstatus( LEVEL_T levelId ) { LEVEL_STATE_T currentLevelStatus = LEVEL_STATE_HIGH; - if ( FPGA_LEVEL_LOW == getFPGAD6LevelStatus() ) + if ( D6_LEVL == levelId ) { - currentLevelStatus = LEVEL_STATE_HIGH ; + if ( FPGA_LEVEL_LOW == getFPGAD6LevelStatus() ) + { + currentLevelStatus = LEVEL_STATE_HIGH ; + } + else if ( FPGA_LEVEL_MEDIUM == getFPGAD6LevelStatus() ) + { + currentLevelStatus = LEVEL_STATE_MEDIUM ; + } + else if ( FPGA_LEVEL_HIGH == getFPGAD6LevelStatus() ) + { + currentLevelStatus = LEVEL_STATE_LOW ; + } + else + { + // TODO - Handle invalid level alarm + currentLevelStatus = LEVEL_STATE_ILLEGAL ; + } } - else if ( FPGA_LEVEL_MEDIUM == getFPGAD6LevelStatus() ) + else if ( P25_LEVL == levelId ) { - currentLevelStatus = LEVEL_STATE_MEDIUM ; + if ( FPGA_LEVEL_LOW == getFPGAP25FloaterState() ) + { + currentLevelStatus = LEVEL_STATE_LOW ; + } + else if ( FPGA_LEVEL_MEDIUM == getFPGAP25FloaterState() ) + { + currentLevelStatus = LEVEL_STATE_MEDIUM ; + } + else if ( FPGA_LEVEL_HIGH == getFPGAP25FloaterState() ) + { + currentLevelStatus = LEVEL_STATE_HIGH ; + } + else + { + // TODO - Handle invalid level alarm + currentLevelStatus = LEVEL_STATE_ILLEGAL ; + } } - else if ( FPGA_LEVEL_HIGH == getFPGAD6LevelStatus() ) - { - currentLevelStatus = LEVEL_STATE_LOW ; - } else { - // TODO - Handle invalid level alarm - currentLevelStatus = LEVEL_STATE_ILLEGAL ; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_DD_INVALID_LEVEL_ID, (U32)levelId ) } - return currentLevelStatus; } @@ -283,16 +318,26 @@ { if ( ++levelsDataPublicationCounter >= getU32OverrideValue( &levelsDataPublishInterval ) ) { - LEVEL_DATA_T data; + DD_LEVEL_DATA_T data; data.d6Level = (U32)getLevelStatus( D6_LEVL ); data.d63Level = (U32)getLevelStatus( D63_LEVL ); data.d46Level = (U32)getLevelStatus( D46_LEVL ); levelsDataPublicationCounter = 0; - broadcastData( MSG_ID_DD_LEVEL_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( LEVEL_DATA_T ) ); + broadcastData( MSG_ID_DD_LEVEL_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( DD_LEVEL_DATA_T ) ); } + + // publish IOFP float states on interval + if ( ++fplevelsDataPublicationCounter >= getU32OverrideValue( &fplevelsDataPublishInterval ) ) + { + FP_LEVEL_DATA_T data; + + data.p25Level = (U32)getLevelStatus( P25_LEVL ); + fplevelsDataPublicationCounter = 0; + broadcastData( MSG_ID_FP_LEVEL_DATA, COMM_BUFFER_OUT_CAN_FP_BROADCAST, (U08*)&data, sizeof( FP_LEVEL_DATA_T ) ); + } } @@ -335,4 +380,45 @@ return result; } +/*********************************************************************//** + * @brief + * The testFPLevelsDataPublishIntervalOverride function overrides the Level + * data publish interval. + * @details \b Inputs: levelsDataPublishInterval + * @details \b Outputs: levelsDataPublishInterval + * @param Override message from Dialin which includes the interval + * (in ms) to override the level data broadcast interval to. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testFPLevelsDataPublishIntervalOverride( MESSAGE_T *message ) +{ + BOOL result = u32BroadcastIntervalOverride( message, &fplevelsDataPublishInterval, TASK_PRIORITY_INTERVAL ); + + return result; +} + +/*********************************************************************//** + * @brief + * The testFPLevelStateOverride function sets the override state for the floater + * level sensor. + * @details \b Inputs: none + * @details \b Outputs: levelState + * @param message Override message from Dialin which includes the state to + * override the floater level sensor to. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testFPLevelStateOverride( MESSAGE_T *message ) +{ + BOOL result = FALSE; + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &payload ); + + if ( ( payload.index >= FIRST_FP_LEVL ) && ( payload.index <= LAST_FP_LEVL ) ) + { + BOOL result = u32Override( message, &status[0], 0, NUM_OF_LEVELS_STATES -1 ); + } + + return result; +} + /**@}*/