Index: Utilities.c =================================================================== diff -u -r47f8ae76f4eed444ce98feec1635e62394afccf5 -rb65b35c0e1f3fd789707845d03e765a5ff4b5481 --- Utilities.c (.../Utilities.c) (revision 47f8ae76f4eed444ce98feec1635e62394afccf5) +++ Utilities.c (.../Utilities.c) (revision b65b35c0e1f3fd789707845d03e765a5ff4b5481) @@ -94,8 +94,8 @@ static U32 timeWindowedCountsWindowMs[ NUM_OF_TIME_WINDOWED_COUNTS ]; ///< Time windows (in ms) for time windowed counts static U32 timeWindowedCounts[ NUM_OF_TIME_WINDOWED_COUNTS ][ MAX_TIME_WINDOWED_COUNT ]; ///< Time stamps for instances for time windowed counts static U32 timeWindowedCountIndexes[ NUM_OF_TIME_WINDOWED_COUNTS ]; ///< List indexes for time windowed counts -static U32 timeWindowedCountCounts[ NUM_OF_TIME_WINDOWED_COUNTS ]; ///< Current counts for time windowed counts - +static U32 timeWindowedCountCounts[ NUM_OF_TIME_WINDOWED_COUNTS ]; ///< Current counts for time windowed counts + /*********************************************************************//** * @brief * The crc16 function calculates a 16-bit CRC for a given range of bytes @@ -265,7 +265,8 @@ result = d.data; // verify data integrity if ( ( ~d.data.uInt != d.comp ) || - ( TRUE != d.set ) || + ( isCriticalDataInRange( &d ) != TRUE ) || + ( d.set != TRUE ) || ( data->typ >= NUM_OF_CRITICAL_DATA_TYPES ) ) { result.uInt = 0; @@ -281,24 +282,73 @@ /*********************************************************************//** * @brief + * The isCriticalDataInRange function determines whether a critical data + * value is within the range set for that critical data. + * @details + * Inputs: none + * Outputs: none + * @param data Ptr to a critical data record + * @return TRUE if given data is in range, FALSE if not + *************************************************************************/ +BOOL isCriticalDataInRange( CRITICAL_DATA_T *data ) +{ + BOOL result = FALSE; + + if ( CRITICAL_DATA_TYPE_F32 == data->typ ) + { + if ( ( data->data.sFlt >= data->minimum.sFlt ) && ( data->data.sFlt <= data->maximum.sFlt ) ) + { + result = TRUE; + } + } + else if ( CRITICAL_DATA_TYPE_S32 == data->typ ) + { + if ( ( data->data.sInt >= data->minimum.sInt ) && ( data->data.sInt <= data->maximum.sInt ) ) + { + result = TRUE; + } + } + else + { + if ( ( data->data.uInt >= data->minimum.uInt ) && ( data->data.uInt <= data->maximum.uInt ) ) + { + result = TRUE; + } + } + + return result; +} + +/*********************************************************************//** + * @brief * The setCriticalData function sets the value for a given critical data * record. * @details * Inputs: none * Outputs: alarm if HD critical error occurred * @param data Ptr to a critical data record * @param value a value to set - * @return none + * @return TRUE if set was successful, FALSE if not (out of range) *************************************************************************/ -void setCriticalData( CRITICAL_DATA_T *data, CRITICAL_DATAS_T value ) +BOOL setCriticalData( CRITICAL_DATA_T *data, CRITICAL_DATAS_T value ) { + BOOL result = FALSE; + if ( data->typ < NUM_OF_CRITICAL_DATA_TYPES ) { - _disable_IRQ(); - data->data = value; - data->comp = ~data->data.uInt; - data->set = TRUE; - _enable_IRQ(); + CRITICAL_DATA_T tmp = *data; + + // test set on temporary data record so it can have its range pre-checked + tmp.data = value; + if ( TRUE == isCriticalDataInRange( &tmp ) ) + { + _disable_IRQ(); + data->data = value; + data->comp = ~data->data.uInt; + data->set = TRUE; + _enable_IRQ(); + result = TRUE; + } } else { @@ -308,22 +358,24 @@ SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_CRITICAL_DATA_ERROR, (U32)&data[0], 1 ) #endif } + + return result; } /*********************************************************************//** * @brief * The resetCriticalData function resets a critical data record. * @details * Inputs: none - * Outputs: none + * Outputs: Given critical data record is reset to unset w/ default value. * @param data Ptr to a critical data record * @return none *************************************************************************/ void resetCriticalData( CRITICAL_DATA_T *data ) { _disable_IRQ(); data->set = FALSE; - data->data.uInt = 0; + data->data.uInt = data->defValue.uInt; data->comp = ~data->data.uInt; _enable_IRQ(); } Index: Utilities.h =================================================================== diff -u -re216986bd18d5272655ddb016eafb15e8b0bcfd6 -rb65b35c0e1f3fd789707845d03e765a5ff4b5481 --- Utilities.h (.../Utilities.h) (revision e216986bd18d5272655ddb016eafb15e8b0bcfd6) +++ Utilities.h (.../Utilities.h) (revision b65b35c0e1f3fd789707845d03e765a5ff4b5481) @@ -72,6 +72,9 @@ typedef struct { CRITICAL_DATA_TYPES_T typ; ///< Type of data + CRITICAL_DATAS_T minimum; ///< Minimum value for valid data + CRITICAL_DATAS_T maximum; ///< Maximum value for valid data + CRITICAL_DATAS_T defValue; ///< Default value CRITICAL_DATAS_T data; ///< Data value U32 comp; ///< One's compliment of value BOOL set; ///< Flag indicates data has been set @@ -84,7 +87,8 @@ void initTimeWindowedCount( TIME_WINDOWED_COUNT_T cnt, U32 maxCnt, U32 winMs ); BOOL incTimeWindowedCount( TIME_WINDOWED_COUNT_T cnt ); CRITICAL_DATAS_T getCriticalData( CRITICAL_DATA_T *data ); -void setCriticalData( CRITICAL_DATA_T *data, CRITICAL_DATAS_T value ); +BOOL setCriticalData( CRITICAL_DATA_T *data, CRITICAL_DATAS_T value ); +BOOL isCriticalDataInRange( CRITICAL_DATA_T *data ); void resetCriticalData( CRITICAL_DATA_T *data ); /**@}*/