FreeCalypso > hg > fc-magnetite
diff src/g23m-gsm/cc/cc_em.c @ 104:27a4235405c6
src/g23m-gsm: import from LoCosto source
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 04 Oct 2016 18:24:05 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gsm/cc/cc_em.c Tue Oct 04 18:24:05 2016 +0000 @@ -0,0 +1,349 @@ +/* ++----------------------------------------------------------------------------- +| Project : +| Modul : ++----------------------------------------------------------------------------- +| 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 engineering mode (EM) device driver for the +| G23 protocol stack. This driver is used to control all engineering +| mode related functions. ++----------------------------------------------------------------------------- +*/ + +#ifndef CC_EM_C +#define CC_EM_C + +#define ENTITY_CC + +/*==== INCLUDES ===================================================*/ + +#include <string.h> +#include "typedefs.h" +#include "pcm.h" +#include "vsi.h" +#include "custom.h" +#include "gsm.h" +#include "message.h" +#include "ccdapi.h" +#include "prim.h" +#include "cnf_cc.h" +#include "mon_cc.h" +#include "pei.h" +#include "tok.h" +#include "cc.h" +#include "cc_em.h" + +/*==== EXPORT =====================================================*/ + +/*==== PRIVAT =====================================================*/ + +/*==== VARIABLES ==================================================*/ + +#ifdef FF_EM_MODE +GLOBAL UBYTE em_cc_event_buffer[EM_CC_BUFFER_SIZE]; +GLOBAL UBYTE em_cc_buffer_write; + +/* Event tracing flags for EM */ +GLOBAL BOOL cc_v[EM_MAX_CC_EVENTS]; + +static UBYTE em_cc_trace_occured; +#endif /* FF_EM_MODE */ + +/*==== FUNCTIONS ==================================================*/ + +#ifdef FF_EM_MODE + +/* ++------------------------------------------------------------------------------ +| Function : em_write_buffer_2 ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number +| +| Return : TRUE/FALSE +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE em_write_buffer_2 (UBYTE event_no) +{ + TRACE_FUNCTION ("cc_em_write_buffer_2()"); + if (check_write_index(2)) + { + em_cc_event_buffer[em_cc_buffer_write++] = event_no; /* Tag: Event number */ + em_cc_event_buffer[em_cc_buffer_write++] = 0; /* Length: 0 means no value */ + return FALSE; /* Data is stored inside buffer, reset flag */ + } + else + return TRUE; /* No more space inside buffer, serve flag next time */ +} + +/* ++------------------------------------------------------------------------------ +| Function : em_write_buffer_3 ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number, data value +| +| Return : TRUE/FALSE +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE em_write_buffer_3 (UBYTE event_no, UBYTE value) +{ + TRACE_FUNCTION ("cc_em_write_buffer_3()"); + + if (check_write_index(3)) + { + em_cc_event_buffer[em_cc_buffer_write++] = event_no; /* Tag: Event number */ + em_cc_event_buffer[em_cc_buffer_write++] = 1; /* Length: 0 means no value */ + em_cc_event_buffer[em_cc_buffer_write++] = value; /* Data to be stored */ + return FALSE; /* Data is stored inside buffer, reset flag */ + } + else + return TRUE; /* No more space inside buffer, serve flag next time */ +} + +/* ++------------------------------------------------------------------------------ +| Function : em_write_buffer_3a ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number, data value (USHORT) +| +| Return : TRUE/FALSE +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE em_write_buffer_3a (UBYTE event_no, USHORT value) +{ + TRACE_FUNCTION ("cc_em_write_buffer_3a()"); + + if (check_write_index(4)) + { + em_cc_event_buffer[em_cc_buffer_write++] = event_no; /* Tag: Event number */ + em_cc_event_buffer[em_cc_buffer_write++] = 2; /* Length: 0 means no value */ + + /* Value: Data to be stored. MSB first, LSB second */ + em_cc_event_buffer[em_cc_buffer_write++] = (UBYTE)(value >> 8); + em_cc_event_buffer[em_cc_buffer_write++] = (UBYTE)(value); + return FALSE; /* Data is stored inside buffer, reset flag */ + } + else + return TRUE; /* No more space inside buffer, serve flag next time */ +} + +/* ++------------------------------------------------------------------------------ +| Function : em_write_buffer_4 ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number, data value1, data value2 +| +| Return : TRUE/FALSE +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE em_write_buffer_4 (UBYTE event_no, UBYTE value1, UBYTE value2) +{ + TRACE_FUNCTION ("cc_em_write_buffer_4()"); + + if (check_write_index(4)) + { + em_cc_event_buffer[em_cc_buffer_write++] = event_no; /* Tag: Event number */ + em_cc_event_buffer[em_cc_buffer_write++] = 2; /* Length: 0 means no value */ + em_cc_event_buffer[em_cc_buffer_write++] = value1; /* Data to be stored, first */ + em_cc_event_buffer[em_cc_buffer_write++] = value2; /* Data to be stored, second */ + return FALSE; /* Data is stored inside buffer, reset flag */ + } + else + return TRUE; /* No more space inside buffer, serve flag next time */ +} + + +/* ++------------------------------------------------------------------------------ +| Function : em_write_buffer_4a ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number, data value1 (UBYTE *), data value2 +| +| Return : TRUE/FALSE +| +| Purpose : Stores Bearer Capabilitys ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE em_write_buffer_4a (UBYTE event_no, UBYTE *ptr1, UBYTE value2) +{ + + UBYTE bc_len; + UBYTE i, em_report_len = 3; /* Initial 2 + TI */ + + TRACE_FUNCTION ("cc_em_write_buffer_4a()"); + + ptr1++; /* Skip message type --> ptr1 shows now to BC-Tag*/ + if (*ptr1++ EQ 0x04) /* BC tag (0x04) --> ptr1 shows now to length field*/ + { + TRACE_FUNCTION ("EM_CC: BC tag found (0x04)"); + if(*ptr1 > MNCC_MAX_BC_LEN) /* Field length exceeded */ + { + ; /*better to insert some kind of trace here*/ + bc_len = MNCC_MAX_BC_LEN; /*Just trace the maximum of BC's - skip the rest*/ + } + else /* Field length not exceeded */ + { + bc_len = *ptr1; /*trace all BC's possible */ + } + + ptr1++; /* ptr1 shows now the first BC */ + + em_report_len += bc_len; /* Length of encoded bearer caps */ + + if(check_write_index((UBYTE)(em_report_len))) /* just to ensure no buffer overflow */ + { + em_cc_event_buffer[em_cc_buffer_write++] = event_no; + em_cc_event_buffer[em_cc_buffer_write++] = (em_report_len - 2); + for (i=0; i<(bc_len); i++) /* Starting with the bearercap IEI */ + { + em_cc_event_buffer[em_cc_buffer_write++] = *ptr1++; /* Bearer caps encoded */ + } + /* Only bearer caps should be recorded, therefore decrement em_cc_buffer_write */ + em_cc_event_buffer[em_cc_buffer_write++] = value2; /* TI */ + + return FALSE; /* Data is stored inside buffer, reset flag */ + } /* check_write_index */ + } /* BC tag 0x04*/ + else + { + TRACE_FUNCTION ("EM_CC: No BC tag found"); + }/* no BC tag 0x04*/ + return TRUE; /* No more space inside buffer or no BC tag, serve flag next time */ +} + + +/* ++------------------------------------------------------------------------------ +| Function : check_write_index ++------------------------------------------------------------------------------ +| Description : Checks the write index inside the buffer. No reset when +| buffer is full. +| +| Parameters : Number of bytes to be stored in buffer +| +| Return : TRUE/FALSE +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE check_write_index (UBYTE n) +{ + TRACE_FUNCTION ("cc_check_write_index()"); + + if (em_cc_buffer_write + n < EM_CC_BUFFER_SIZE) + { + /* + * ACI is informed about the first event trace, + * used for later data processing. + */ + if (em_cc_trace_occured == 0) + { + PALLOC(data, EM_DATA_IND); + data->entity = EM_CC; + PSENDX(MMI, data); + em_cc_trace_occured++; + } + return TRUE; + } + else + { + TRACE_ERROR("EM_CC: buffer overflow"); + return FALSE; + } +} + + +/* ++------------------------------------------------------------------------------ +| Function : em_init_cc_event_trace ++------------------------------------------------------------------------------ +| Description : Initialize the event tracing flags for SMS +| +| Parameters : +| +| Return : +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL void em_init_cc_event_trace(void) +{ + UBYTE i; + + TRACE_FUNCTION ("em_init_cc_event_trace()"); + + for (i = 1; i < EM_MAX_CC_EVENTS; i++) + cc_v[i] = 0; + + em_cc_buffer_write = 0; +} + + +/* ++------------------------------------------------------------------------------ +| Function : cc_em_cc_event_req ++------------------------------------------------------------------------------ +| Description : Set the event tracing flags according the bitmask +| +| Parameters : Primitive - Bitmask +| +| Return : +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL void cc_em_cc_event_req (T_EM_CC_EVENT_REQ *em_cc_event_req) +{ + UBYTE i; + + TRACE_FUNCTION ("cc_em_cc_event_req()"); + + /* + * The event tracing flags are set according the bitmask. cc_v[i] are + * the flags belonging to the event number described in 8443.601 + */ + for(i = 1; i < 33; i++) + cc_v[i] = ((em_cc_event_req->bitmask_cc_l & (0x01<<(i-1))) > 0) ? TRUE : FALSE; + + for(i = 33; i < EM_MAX_CC_EVENTS; i++) + cc_v[i] = ((em_cc_event_req->bitmask_cc_h & (0x01<<(i-1))) > 0) ? TRUE : FALSE; + + /* + * A new event trace is generated therefor the flag is reset. + */ + em_cc_trace_occured = 0; + + PFREE(em_cc_event_req); +} + +#endif /* FF_EM_MODE */ + +#endif /* CC_EM_C */