/************************************************************************** * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file Common.h * * @date 19-Sep-2019 * @author S. Nash * * @brief Header file for common definitions and types. * **************************************************************************/ #ifndef __TEST_SUPPORT_H__ #define __TEST_SUPPORT_H__ // ***************************** OVERRIDE DEFINITIONS & MACROS ************************************* #define OVERRIDE_KEY 0xCCC33C33 #define OVERRIDE_RESET 0x00000000 #pragma pack(push,1) typedef union { U32 u32; F32 f32; } TEST_OVERRIDE_PAYLOAD_TYPE_T; typedef struct { BOOL reset; TEST_OVERRIDE_PAYLOAD_TYPE_T state; } TEST_OVERRIDE_PAYLOAD_T; typedef struct { BOOL reset; TEST_OVERRIDE_PAYLOAD_TYPE_T state; U32 index; } TEST_OVERRIDE_ARRAY_PAYLOAD_T; #pragma pack(pop) typedef struct \ { \ U32 data; \ U32 ovInitData; \ U32 ovData; \ U32 override; \ } OVERRIDE_U32_T; typedef struct \ { \ F32 data; \ F32 ovInitData; \ F32 ovData; \ U32 override; \ } OVERRIDE_F32_T; // DATA_DECL - declares an overrideable data variable // t = data's type // t_name = name for data's structure type // d_name = name for data's variable // i_val = data's initial value // o_val = data's initial override value #define DATA_DECL( t, t_name, d_name, i_val, o_val ) \ struct t_name \ { \ t data; \ t ovInitData; \ t ovData; \ U32 override; \ }; \ static struct t_name d_name = { i_val, o_val, o_val, OVERRIDE_RESET } // DATA_ARRAY_DECL - declares an overrideable data array // t = data's type // t_name = name for data's structure type // s = array's size // d_name = name for data array #define DATA_ARRAY_DECL( t, t_name, s, d_name ) \ struct t_name \ { \ t data; \ t ovInitData; \ t ovData; \ U32 override; \ }; \ static struct t_name d_name[ s ] // DATA_GET_PROTOTYPE - declares a function prototype for a DATA getter function // t = data's type // f_name = name for DATA getter function #define DATA_GET_PROTOTYPE( t, f_name ) t f_name( void ) // DATA_ARRAY_GET_PROTOTYPE - declares a function prototype for a DATA array getter function // t = data's type // f_name = name for DATA getter function // i_name = name for array's index parameter #define DATA_ARRAY_GET_PROTOTYPE( t, f_name, i_name ) t f_name( U32 i_name ) // DATA_GET - creates a getter function for a DATA // t = data's type // f_name = name for DATA getter function // d_name = name of data's variable #define DATA_GET( t, f_name, d_name ) \ t f_name( void ) \ { \ t result = d_name.data; \ if ( OVERRIDE_KEY == d_name.override ) \ { \ result = d_name.ovData; \ } \ return result; \ } // DATA_ARRAY_GET - creates a getter function for a DATA // t = data's type // f_name = name for DATA getter function // i_name = name for DATA array's index parameter // max = DATA array's maximum index // d_name = name of data's variable // f_val = value to return if index is out of range #define DATA_ARRAY_GET( t, f_name, i_name, max, d_name, f_val ) \ t f_name( U32 i_name ) \ { \ t result = f_val; \ if ( i_name <= max ) \ { \ if ( OVERRIDE_KEY == d_name[ i_name ].override ) \ { \ result = d_name[ i_name ].ovData; \ } \ else \ { \ result = d_name[ i_name ].data; \ } \ } \ else \ { \ activateAlarmNoData( ALARM_ID_SOFTWARE_FAULT ); \ } \ return result; \ } // DATA_OVERRIDE_FUNC - creates an override and a reset override function for a DATA // t = data's type // o_name = name for override function // r_name = name for reset override function // d_name = name of data's variable #define DATA_OVERRIDE_FUNC( t, o_name, r_name, d_name ) \ BOOL o_name( t value ) \ { \ BOOL result = FALSE; \ if ( TRUE == isTestingActivated() ) \ { \ result = TRUE; \ d_name.ovData = value; \ d_name.override = OVERRIDE_KEY; \ } \ return result; \ } \ BOOL r_name( void ) \ { \ BOOL result = FALSE; \ if ( TRUE == isTestingActivated() ) \ { \ result = TRUE; \ d_name.override = OVERRIDE_RESET; \ d_name.ovData = d_name.ovInitData; \ } \ return result; \ } // DATA_ARRAY_OVERRIDE_FUNC - creates an override and a reset override function for a DATA array // t = data's type // o_name = name for override function // r_name = name for reset override function // d_name = name of data's variable // i_name = name of DATA array's index parameter // max = DATA array's maximum index #define DATA_ARRAY_OVERRIDE_FUNC( t, o_name, r_name, d_name, i_name, max ) \ BOOL o_name( U32 i_name, t value ) \ { \ BOOL result = FALSE; \ if ( i_name <= max ) \ { \ if ( TRUE == isTestingActivated() ) \ { \ result = TRUE; \ d_name[ i_name ].ovData = value; \ d_name[ i_name ].override = OVERRIDE_KEY; \ } \ } \ return result; \ } \ BOOL r_name( U32 i_name ) \ { \ BOOL result = FALSE; \ if ( i_name <= max ) \ { \ if ( TRUE == isTestingActivated() ) \ { \ result = TRUE; \ d_name[ i_name ].override = OVERRIDE_RESET; \ d_name[ i_name ].ovData = d_name[ i_name ].ovInitData; \ } \ } \ return result; \ } // DATA_OVERRIDE_HANDLER_FUNC_U32 - creates an override and a reset override handler function for a DATA // t = data's type // h_name = name of handler function // o_name = name of override function // r_name = name of reset override function #define DATA_OVERRIDE_HANDLER_FUNC_U32( t, h_name, o_name, r_name ) \ void h_name( 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 = o_name( (t)(payload.state.u32) ); \ } \ else \ { \ result = r_name(); \ } \ } \ /* respond to request */ \ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); \ } // DATA_OVERRIDE_HANDLER_FUNC_F32 - creates an override and a reset override handler function for a DATA // t = data's type // h_name = name of handler function // o_name = name of override function // r_name = name of reset override function #define DATA_OVERRIDE_HANDLER_FUNC_F32( t, h_name, o_name, r_name ) \ void h_name( 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 = o_name( (t)(payload.state.f32) ); \ } \ else \ { \ result = r_name(); \ } \ } \ /* respond to request */ \ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); \ } // DATA_ARRAY_OVERRIDE_HANDLER_FUNC_U32 - creates an override and a reset override handler function for a DATA array // t = data's type // h_name = name of handler function // o_name = name of override function // r_name = name of reset override function #define DATA_ARRAY_OVERRIDE_HANDLER_FUNC_U32( t, h_name, o_name, r_name ) \ void h_name( 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 = o_name( payload.index, (t)(payload.state.u32) ); \ } \ else \ { \ result = r_name( payload.index ); \ } \ } \ /* respond to request */ \ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); \ } // DATA_ARRAY_OVERRIDE_HANDLER_FUNC_F32 - creates an override and a reset override handler function for a DATA array // t = data's type // h_name = name of handler function // o_name = name of override function // r_name = name of reset override function #define DATA_ARRAY_OVERRIDE_HANDLER_FUNC_F32( t, h_name, o_name, r_name ) \ void h_name( 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 = o_name( payload.index, (t)(payload.state.f32) ); \ } \ else \ { \ result = r_name( payload.index ); \ } \ } \ /* respond to request */ \ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); \ } #endif