FreeCalypso > hg > freecalypso-citrine
diff g23m-glue/gdi/rx.c @ 0:75a11d740a02
initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 09 Jun 2016 00:02:41 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/g23m-glue/gdi/rx.c Thu Jun 09 00:02:41 2016 +0000 @@ -0,0 +1,333 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-PS +| Modul : DRV_RX ++----------------------------------------------------------------------------- +| Copyright 2002 Texas Instruments Berlin, AG +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments Berlin, AG +| The receipt of or possession of this file does not convey +| any rights to reproduce or disclose its contents or to +| manufacture, use, or sell anything it may describe, in +| whole, or in part, without the specific written consent of +| Texas Instruments Berlin, AG. ++----------------------------------------------------------------------------- +| Purpose : This Module defines the fieldstrength management +| device driver for the G23 protocol stack. +| +| This driver is used to control all fieldstrength related +| functions. The driver does support multiple devices and +| therefore no open and close functionality is supported. +| The driver can be configured to signal different state +| transitions. This is done by setting an OS signal or +| calling a specified call-back function. ++----------------------------------------------------------------------------- +*/ + +#ifndef DRV_RX_C +#define DRV_RX_C +#endif +#define ENTITY_CST +/*==== INCLUDES ===================================================*/ + +#include "config.h" +#include "fixedconf.h" +#include "condat-features.h" + +#if defined (NEW_FRAME) + +#include <string.h> +#include "typedefs.h" +#include "vsi.h" +#include "custom.h" +#include "gsm.h" +#include "prim.h" +#include "gdi.h" +#include "rx.h" + +#else + +#include <string.h> +#include "stddefs.h" +#include "custom.h" +#include "gsm.h" +#include "prim.h" +#include "vsi.h" +#include "gdi.h" +#include "rx.h" + +#endif +/*==== EXPORT =====================================================*/ +EXTERN USHORT RX_GetValue ( void ); +EXTERN UBYTE RX_GetRxQual ( void ); +EXTERN void RX_Enable (T_VOID_FUNC rx_indication); + +#if defined (NEW_FRAME) +EXTERN USHORT cst_handle; +#endif /* NEW_FRAME */ + +/*==== CONSTANTS ==================================================*/ +#define RX_INDICATION_WITHOUT_TIMER +#if defined (NEW_FRAME) +#define CST_RXTIMER 1 +#endif /* NEW_FRAME */ + +/*==== VARIABLES ==================================================*/ +drv_SignalCB_Type rx_signal_callback = NULL; +rx_DCB_Type rx_DCB; +rx_Status_Type rx_Status; +#if !defined (NEW_FRAME) +T_VSI_THANDLE rx_handle = VSI_ERROR; +#endif /* !NEW_FRAME */ + +/*==== FUNCTIONS ==================================================*/ +#if 0 + #if defined(NEW_FRAME) + #define SYST_TRACE(a) vsi_o_ttrace(0, 0xFFFF,a) + #define SYST 0, 0xffff + #define SYST_TRACE_P(a) vsi_o_ttrace a + #else /* NEW_FRAME */ + #define SYST_TRACE(a) vsi_o_trace("", 0xFFFF,a) + #define SYST "", 0xffff + #define SYST_TRACE_P(a) vsi_o_trace a + #endif /* NEW_FRAME */ + /* + * use it as showed next line... + * SYST_TRACE_P((SYST, "e.g. two parameter: %d %d", p1, p2)); + */ +#else /* 0|1 */ + #define SYST_TRACE(a) + #define SYST_TRACE_P(a) +#endif /* 0|1 */ + + +LOCAL void RX_Indication (void) +{ + if (rx_signal_callback) + { + USHORT new_rx_value; + UBYTE calculated_level; + drv_SignalID_Type signal_params; + + new_rx_value = RX_GetValue (); + rx_Status.gsmLevel = ( UBYTE ) new_rx_value; + + calculated_level = (new_rx_value * rx_DCB.Steps) / 64; + + SYST_TRACE_P ((SYST, "RX_Indication(): rx=%u new, %u old", + calculated_level, rx_Status.actLevel)); + + if (calculated_level NEQ rx_Status.actLevel) + { + signal_params.SignalType = RX_SIGTYPE_RXLEVEL; + #if defined (NEW_FRAME) + signal_params.UserData = (void*)&rx_Status; + #else + signal_params.SignalValue = 0; + signal_params.UserData = (ULONG)&rx_Status; + #endif /* NEW_FRAME */ + rx_Status.actLevel = calculated_level; + rx_Status.rxQuality = RX_GetRxQual (); + + #if !defined (WIN32) + /* + * suppress for windows to avoid disturb of regression tests + */ + (*rx_signal_callback)(&signal_params); + #endif /* !WIN32 */ + } + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_RX | +| STATE : code ROUTINE : rx_Init | ++--------------------------------------------------------------------+ + + PURPOSE : The function initializes the driverīs internal data. + The function returns DRV_OK in case of a successful + completition. The function returns DRV_INITIALIZED if + the driver has already been initialized and is ready to + be used or is already in use. In case of an initialization + failure, which means the that the driver cannot be used, + the function returns DRV_INITFAILURE. + +*/ + +GLOBAL UBYTE rx_Init (drv_SignalCB_Type in_SignalCBPtr) +{ + rx_signal_callback = in_SignalCBPtr; /* store call-back function */ + rx_DCB.Steps = 4; /* 4 Steps */ + rx_Status.actLevel = 255; + rx_Status.gsmLevel = 255; + +#if defined (RX_INDICATION_WITHOUT_TIMER) + if (in_SignalCBPtr) + { + SYST_TRACE_P ((SYST, "rx_Init(): enable RX_Indication (%p)", in_SignalCBPtr)); + RX_Enable (RX_Indication); + } + else + { + SYST_TRACE ("rx_Init() without in_SignalCBPtr"); + } +#else /* RX_INDICATION_WITHOUT_TIMER */ + #if !defined (NEW_FRAME) + rx_handle = vsi_t_open (VSI_CALLER "RX"); + + if (rx_handle < VSI_OK) + return DRV_INITFAILURE; + + vsi_t_start (VSI_CALLER rx_handle, T_RX_VALUE); + #else /* !NEW_FRAME */ + vsi_t_start (VSI_CALLER CST_RXTIMER, T_RX_VALUE); + #endif /* !NEW_FRAME */ +#endif /* RX_INDICATION_WITHOUT_TIMER */ + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_RX | +| STATE : code ROUTINE : rx_Exit | ++--------------------------------------------------------------------+ + + PURPOSE : The function is used to indicate RX that the driver + and its functionality isnīt needed anymore. + +*/ + +GLOBAL void rx_Exit (void) +{ + rx_signal_callback = NULL; + +#if !defined (RX_INDICATION_WITHOUT_TIMER) + #if !defined (NEW_FRAME) + vsi_t_close (VSI_CALLER rx_handle); + rx_handle = VSI_ERROR; + #else /* !NEW_FRAME */ + vsi_t_stop (VSI_CALLER CST_RXTIME); + #endif /* !NEW_FRAME */ +#endif /* RX_INDICATION_WITHOUT_TIMER */ +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_RX | +| STATE : code ROUTINE : rx_SetConfig | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to configure the driver. + If any value of this configuration is out of range or + invalid in combination with any other value of the + configuration, the function returns DRV_INVALID_PARAMS. + Call the rx_GetConfig() function to retrieve the drivers + configuration. + +*/ + +GLOBAL UBYTE rx_SetConfig (rx_DCB_Type * in_DCBPtr) +{ + memcpy (&rx_DCB, in_DCBPtr, sizeof (rx_DCB_Type)); + rx_Status.actLevel = 255; + rx_Status.gsmLevel = 255; + + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_RX | +| STATE : code ROUTINE : rx_GetConfig | ++--------------------------------------------------------------------+ + + PURPOSE : The function is used to retrieve the configuration of + the driver. The configuration is returned in the driver + control block to which the pointer out_DCBPtr points. + If the driver is not configured, the function returns + DRV_NOTCONFIGURED. + Call the rx_SetConfig() function to configure the driver. + +*/ + +GLOBAL UBYTE rx_GetConfig (rx_DCB_Type * out_DCBPtr) +{ + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_RX | +| STATE : code ROUTINE : rx_GetStatus | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to retrieve the status of the driver. + In case of a successful completion the driver returns + DRV_OK and the current status of the driver in the buffer + out_StatusPtr points to. + In case the driver is not configured yet, it returns + DRV_NOTCONFIGURED. In this case the contents of the + buffer out_StatusPtr is invalid. + In case out_StatusPtr equals NULL the driver returns + DRV_INVALID_PARAMS. + +*/ + +GLOBAL UBYTE rx_GetStatus (rx_Status_Type * out_StatusPtr) +{ + USHORT new_rx_value = RX_GetValue (); + + rx_Status.gsmLevel = ( UBYTE ) new_rx_value; + rx_Status.actLevel = (new_rx_value * rx_DCB.Steps) / 64; + rx_Status.rxQuality = RX_GetRxQual (); + + out_StatusPtr->actLevel = rx_Status.actLevel; + out_StatusPtr->gsmLevel = rx_Status.gsmLevel; + out_StatusPtr->rxQuality = rx_Status.rxQuality; + + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_RX | +| STATE : code ROUTINE : rx_timeout | ++--------------------------------------------------------------------+ + + PURPOSE : This function calculates a new rxlevel after timeout. + If a change has occured, the new level is forwarded to + MMI using the callback function. The timer is started + again. + +*/ +#if defined (NEW_FRAME) +GLOBAL void rx_timeout (USHORT index) +#else +GLOBAL void rx_timeout (T_VSI_THANDLE handle) +#endif +{ +#if !defined (RX_INDICATION_WITHOUT_TIMER) + #if defined (NEW_FRAME) + if (index EQ CST_RXTIMER) + #else + if (handle EQ rx_handle) + #endif + { + /* + * only if it is the fieldstrength timer + */ + SYST_TRACE ("rx_timeout()"); + + RX_Indication (); + + #if defined (NEW_FRAME) + vsi_t_start (VSI_CALLER CST_RXTIMER, T_RX_VALUE); + #else + vsi_t_start (VSI_CALLER rx_handle, T_RX_VALUE); + #endif + } +#endif /* !RX_INDICATION_WITHOUT_TIMER */ +}