line source
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) $Workfile:: mfw_em.c $|
| $Author:: MC $ CONDAT UK $Revision:: 1 $|
| CREATED: 23.09.02 $|
| STATE : code |
+--------------------------------------------------------------------+
MODULE : MFW_EM
PURPOSE : Engineering Mode functions
*/
/*
********************************Include Files**********************************************
**/
#define ENTITY_MFW
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "typedefs.h"
#include "vsi.h"
#include "pei.h"
#include "custom.h"
#include "gsm.h"
#ifndef PCM_2_FFS
#include "pcm.h"
#endif
#include "ffs/ffs.h"
#include "message.h"
#include "prim.h"
#include "aci_cmh.h"
#if defined (FAX_AND_DATA)
#include "aci_fd.h"
#endif
#ifdef GPRS
#include "gprs.h"
#endif
#include "dti_conn_mng.h"
#include "phb.h"
#include "psa.h"
#include "cmh.h"
#include "cmh_phb.h"
#include "psa.h"
#include "psa_sim.h"
#include "cus_aci.h"
#include "cmh_mm.h"
#include "cmh_sim.h"
#include "Mfw_em.h"
#include "aci_em.h"
#include "mfw_win.h"
#define ASCII_OFFSET 0x30 /*SPR 1554*/
/*
********************************Internal data types**********************************************
**/
typedef union
{
MFW_EM_Mobile_Info MobileInfo;
MFW_EM_Serving_Cell_Parameters SCInfo;
MFW_EM_Neighbour_Cell_Parameters NCInfo;
MFW_EM_Location_Parameters LocInfo;
MFW_EM_Ciph_hop_DTX_Parameters CHDTXInfo;
MFW_EM_GPRS_Parameter GPRSInfo;
}
T_MFW_EM_PARA;
typedef struct
{
T_MFW_EVENT emask; /* events of interest */
T_MFW_EVENT event; /* current event */
T_MFW_CB handler;
T_MFW_EM_PARA para;
} T_MFW_EM;
/*
********************************Global variables**********************************************
**/
MFW_EM_Data* MfwEmData= NULL;
EXTERN MfwHdr *current_mfw_elem;
/*
********************************Prototypes**********************************************
**/
int Mfw_em_sign_exec(T_MFW_HDR * hdr, T_MFW_EVENT event,T_MFW_EM_PARA *para);
void Mfw_em_signal(MfwEvt event, void *para);
void Mfw_em_cb(T_DRV_SIGNAL_EM* signal);
static int emCommand (U32 cmd, void *h);
/**************************************Public Functions*****************************************/
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EM |
| STATE : code ROUTINE : Mfw_em_init |
+--------------------------------------------------------------------+
PURPOSE : initialise module
*/
int Mfw_em_init()
{ TRACE_EVENT("Mfw_em_init()");
em_Init(Mfw_em_cb, NULL); /*init EM driver*/
mfwCommand[MfwTypEm] = (MfwCb) emCommand;
return TRUE;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EM |
| STATE : code ROUTINE : Mfw_em_create |
+--------------------------------------------------------------------+
PURPOSE : binds passed callback function to event mask
*/
MfwHnd Mfw_em_create(MfwHnd hWin, MfwEvt event, MfwCb cb_func)
{
MfwHdr *hdr;
T_MFW_EM *em_para;
TRACE_EVENT("em_create()");
hdr = (MfwHdr *) mfwAlloc(sizeof(MfwHdr));
em_para = (T_MFW_EM *) mfwAlloc(sizeof(T_MFW_EM));
if (!hdr || !em_para)
return 0;
em_para->emask = event;
em_para->handler = cb_func;
hdr->data = em_para;
hdr->type = MfwTypEm;
return mfwInsert((MfwHdr *) hWin,hdr);
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EM |
| STATE : code ROUTINE : Mfw_em_exit |
+--------------------------------------------------------------------+
PURPOSE : exit module
*/
void Mfw_em_exit()
{ TRACE_EVENT("Mfw_em_exit()");
if (MfwEmData != NULL)
mfwFree((void*)MfwEmData, sizeof(MFW_EM_Data));
em_Exit();
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EM |
| STATE : code ROUTINE : Mfw_em_get_data |
+--------------------------------------------------------------------+
PURPOSE : requests data from ACI EM driver
*/
int Mfw_em_get_data(MfwEmDataType type)
{
TRACE_EVENT("Mfw_em_get_data()");
//#define _EM_MMI_MFW_TEST
#ifndef _EM_MMI_MFW_TEST
/*If not already allocated, Allocate memory to store data in*/
if (MfwEmData == NULL)
if ((MfwEmData = (MFW_EM_Data*)mfwAlloc(sizeof(MFW_EM_Data))) == NULL)
return FALSE;
/*Request appropriate data from Em driver*/
switch(type)
{
case EM_MOBILE_INFO:
/*MC SPR 1554, added call to request software version and identity param*/
em_Read_Data_Parameter(EM_CLASS_MOBILE_DATA, EM_SUBCLASS_SW_VERSION, 1,Mfw_em_cb);
em_Read_Data_Parameter(EM_CLASS_MOBILE_DATA,EM_SUBCLASS_ID, 1, Mfw_em_cb);
break;
case EM_SERVING_CELL_PARAMS:
em_Read_Data_Parameter(EM_CLASS_INFRA_DATA, EM_SUBCLASS_SC, 1, Mfw_em_cb);
break;
case EM_NEIGHBOURING_CELL_PARAMS:
em_Read_Data_Parameter(EM_CLASS_INFRA_DATA, EM_SUBCLASS_SC, 1, Mfw_em_cb);
em_Read_Data_Parameter(EM_CLASS_INFRA_DATA, EM_SUBCLASS_NC, 1, Mfw_em_cb);
break;
case EM_LOCATION_PARAMS:
em_Read_Data_Parameter(EM_CLASS_INFRA_DATA, EM_SUBCLASS_LOC_PAG, 1, Mfw_em_cb);
em_Read_Data_Parameter(EM_CLASS_INFRA_DATA, EM_SUBCLASS_SC, 1, Mfw_em_cb);
break;
case EM_CIPH_HOP_DTX_PARAMS:
em_Read_Data_Parameter(EM_CLASS_INFRA_DATA, EM_SUBCLASS_CIPH_HOP_DTX, 1, Mfw_em_cb);
break;
case EM_GPRS_PARAMS:
em_Read_Data_Parameter(EM_CLASS_INFRA_DATA, EM_SUBCLASS_SC_GPRS, 1, Mfw_em_cb);
break;
}
return TRUE;
#endif
#ifdef _EM_MMI_MFW_TEST
/*Test harness, just returns made-up data to MMI*/
if (MfwEmData == NULL)
if ((MfwEmData = (MFW_EM_Data*)mfwAlloc(sizeof(MFW_EM_Data))) == NULL)
return FALSE;
switch(type)
{
case EM_MOBILE_INFO:
{ //MfwEmData->MobileInfo.software_version = 0x44;
strcpy(MfwEmData->MobileInfo.IMEI, "123456789ABC");
strcpy(MfwEmData->MobileInfo.IMSI, "123456789ABC");
MfwEmData->MobileInfo.TMSI = 76;
Mfw_em_signal(EM_MOBILE_INFO, (void*)&MfwEmData->MobileInfo);
}
break;
case EM_SERVING_CELL_PARAMS:
{
MfwEmData->SCInfo.arfcn= 0x44;
MfwEmData->SCInfo.RSSI= 86;
MfwEmData->SCInfo.RXQ = 67;
MfwEmData->SCInfo.RLT = 67;
Mfw_em_signal(EM_SERVING_CELL_PARAMS, (void*)&MfwEmData->SCInfo);
}
break;
case EM_NEIGHBOURING_CELL_PARAMS:
{ MfwEmData->NCInfo.NUM= 0x05;
strcpy((char*)MfwEmData->NCInfo.arfcn, "WERTYUIOPAS");
strcpy((char*)MfwEmData->NCInfo.RSSI, "12345");
Mfw_em_signal(EM_NEIGHBOURING_CELL_PARAMS, (void*)&MfwEmData->NCInfo);
}
break;
case EM_LOCATION_PARAMS:
{ strcpy((char*)MfwEmData->LocInfo.MCC, "123");
strcpy((char*)MfwEmData->LocInfo.MNC, "456");
MfwEmData->LocInfo.LAC = 12345;
MfwEmData->LocInfo.CI = 12045;
Mfw_em_signal(EM_LOCATION_PARAMS, (void*)&MfwEmData->LocInfo);
}
break;
case EM_GPRS_PARAMS:
{ MfwEmData->GPRSInfo.ULS= 0;
MfwEmData->GPRSInfo.DLS= 0;
MfwEmData->GPRSInfo.coding_scheme = 0;
Mfw_em_signal(EM_GPRS_PARAMS, (void*)&MfwEmData->GPRSInfo);
}
break;
case EM_CIPH_HOP_DTX_PARAMS:
{ MfwEmData->CHDTXInfo.ciph_status= 0;
MfwEmData->CHDTXInfo.hopping_channels= 0;
MfwEmData->CHDTXInfo.DTX_status = 1;
Mfw_em_signal(EM_CIPH_HOP_DTX_PARAMS, (void*)&MfwEmData->CHDTXInfo);
}
break;
}
return TRUE;
#endif
}
/***********************************************Private functions:********************************/
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EM |
| STATE : code ROUTINE : emCommand |
+--------------------------------------------------------------------+
PURPOSE : handle mfw windows command
*/
static int emCommand (U32 cmd, void *h)
{TRACE_EVENT("emCommand()");
switch (cmd)
{
case MfwCmdDelete: /* delete me */
if (!h)
return 0;
em_delete(h);
return 1;
default:
break;
}
return 0;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EM |
| STATE : code ROUTINE : em_delete |
+--------------------------------------------------------------------+
PURPOSE : delete EM event handler
*/
MfwRes em_delete (MfwHnd h)
{
TRACE_EVENT("em_delete()");
if (!h || !((MfwHdr *) h)->data)
return MfwResIllHnd;
if (!mfwRemove((MfwHdr *) h))
return MfwResIllHnd;
mfwFree((U8 *) ((MfwHdr *) h)->data,sizeof(T_MFW_EM));
mfwFree((U8 *) h,sizeof(MfwHdr));
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EM |
| STATE : code ROUTINE : Mfw_em_sign_exec |
+--------------------------------------------------------------------+
PURPOSE : send event to MMI
*/
int Mfw_em_sign_exec(T_MFW_HDR * cur_elem, T_MFW_EVENT event,T_MFW_EM_PARA *para)
{
TRACE_EVENT("Mfw_em_sign_exec()");
while (cur_elem)
{
if (cur_elem->type == MfwTypEm)
{
T_MFW_EM *em_data;
em_data = (T_MFW_EM *) cur_elem->data;
if (em_data->emask & event)
{
em_data->event = event;
switch (event)
{
case EM_MOBILE_INFO:
memcpy(&em_data->para.MobileInfo,
para,sizeof(MFW_EM_Mobile_Info));
break;
case EM_SERVING_CELL_PARAMS:
memcpy(&em_data->para.SCInfo,
para,sizeof(MFW_EM_Serving_Cell_Parameters));
break;
case EM_NEIGHBOURING_CELL_PARAMS:
memcpy(&em_data->para.NCInfo,
para,sizeof(MFW_EM_Neighbour_Cell_Parameters));
break;
case EM_LOCATION_PARAMS:
memcpy(&em_data->para.LocInfo,
para,sizeof(MFW_EM_Location_Parameters));
break;
case EM_CIPH_HOP_DTX_PARAMS:
memcpy(&em_data->para.CHDTXInfo,
para,sizeof(MFW_EM_Ciph_hop_DTX_Parameters));
break;
case EM_GPRS_PARAMS:
memcpy(&em_data->para.GPRSInfo,
para,sizeof(MFW_EM_GPRS_Parameter));
break;
}
if (em_data->handler)
{
// store current mfw elem
current_mfw_elem = cur_elem;
if ((*(em_data->handler))(em_data->event,
(void *) &em_data->para))
return TRUE;
}
}
}
cur_elem = cur_elem->next;
}
return FALSE;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EM |
| STATE : code ROUTINE : Mfw_em_signal |
+--------------------------------------------------------------------+
PURPOSE : sends event to MMi via Mfw_em_sign_exec()
*/
void Mfw_em_signal(MfwEvt event, void *para)
{
UBYTE temp = dspl_Enable(0);
TRACE_EVENT ("em_signal()");
if (mfwSignallingMethod EQ 0)
{
if (mfwFocus)
if (Mfw_em_sign_exec(mfwFocus,event,para))
{
dspl_Enable(temp);
return;
}
if (mfwRoot)
Mfw_em_sign_exec(mfwRoot,event,para);
}
else
{
MfwHdr * h = 0;
/*
* Focus set, then start here
*/
if (mfwFocus)
h = mfwFocus;
/*
* Focus not set, then start root
*/
if (!h)
h = mfwRoot;
/*
* No elements available, return
*/
while (h)
{
/*
* Signal consumed, then return
*/
if (Mfw_em_sign_exec (h, event, para))
{
dspl_Enable(temp);
return;
}
/*
* All windows tried inclusive root
*/
if (h == mfwRoot)
{
dspl_Enable(temp);
return;
}
/*
* get parent window
*/
h = mfwParent(mfwParent(h));
if(h)
h = ((MfwWin * )(h->data))->elems;
}
Mfw_em_sign_exec (mfwRoot, event, para);
}
dspl_Enable(temp);
return;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EM |
| STATE : code ROUTINE : Mfw_em_cb |
+--------------------------------------------------------------------+
PURPOSE : Handles events from the ACI EM driver
*/
void Mfw_em_cb(T_DRV_SIGNAL_EM* signal)
{
TRACE_EVENT_P1("Mfw_em_cb, signalType: %d", signal->SignalType);
switch(signal->SignalType)
{
case EM_SUBCLASS_SC:
{ /*copy Serving Cell Information to appropriate data structure*/
T_EM_SC_INFO_CNF *serv_cell = (T_EM_SC_INFO_CNF*)&signal->UserData.sc;
MfwEmData->SCInfo.arfcn = serv_cell->arfcn;
MfwEmData->SCInfo.RSSI = serv_cell->rxlev;
MfwEmData->SCInfo.RXQ = serv_cell->rxqual_f;
MfwEmData->SCInfo.RLT = serv_cell->rlt;
MfwEmData->SCInfo.C1 = serv_cell->c1;
MfwEmData->SCInfo.C2 = serv_cell->c2;
MfwEmData->SCInfo.BSIC = serv_cell->bsic;
MfwEmData->SCInfo.TAV = serv_cell->tav;
MfwEmData->SCInfo.LAC = serv_cell->lac;
MfwEmData->NCInfo.arfcn[6] = MfwEmData->SCInfo.arfcn;
MfwEmData->NCInfo.RSSI[6] = MfwEmData->SCInfo.RSSI;
MfwEmData->NCInfo.C2[6] = MfwEmData->SCInfo.C2;
MfwEmData->NCInfo.LAC_NC[6] = MfwEmData->SCInfo.LAC;
MfwEmData->NCInfo.BSIC_NC[6] = MfwEmData->SCInfo.BSIC;
/* copy Location Info*/
MfwEmData->LocInfo.LAC = serv_cell->lac;
/*send event to MMI*/
Mfw_em_signal(EM_SERVING_CELL_PARAMS, (void*)&MfwEmData->SCInfo);
}
break;
case EM_SUBCLASS_SC_GPRS:
{ /*MC, SPR 1554 added code to copy NMOinto GPRS data structure*/
T_EM_SC_GPRS_INFO_CNF *gprs_info = (T_EM_SC_GPRS_INFO_CNF*)&signal->UserData.sc_gprs;
MfwEmData->GPRSInfo.NMO = gprs_info->nmo;
MfwEmData->GPRSInfo.NDTS = gprs_info->tn;
MfwEmData->GPRSInfo.RAC = gprs_info->rac;
MfwEmData->GPRSInfo.C31 = gprs_info->c31;
MfwEmData->GPRSInfo.C32 = gprs_info->c32;
Mfw_em_signal(EM_GPRS_PARAMS, (void*)&MfwEmData->GPRSInfo);
}
break;
case EM_SUBCLASS_NC:
{ T_EM_NC_INFO_CNF *neighbour_cell = (T_EM_NC_INFO_CNF*)&signal->UserData.nc;
MfwEmData->NCInfo.NUM = neighbour_cell->no_ncells;
memcpy(MfwEmData->NCInfo.arfcn, neighbour_cell->arfcn_nc, 6*sizeof(USHORT));
memcpy(MfwEmData->NCInfo.RSSI, neighbour_cell->rxlev_nc, 6*sizeof(UBYTE));
memcpy(MfwEmData->NCInfo.C2, neighbour_cell->c2_nc, 6*sizeof(SHORT));
memcpy(MfwEmData->NCInfo.LAC_NC, neighbour_cell->lac_nc, 6*sizeof(USHORT));
memcpy(MfwEmData->NCInfo.BSIC_NC, neighbour_cell->bsic_nc, 6*sizeof(UBYTE));
Mfw_em_signal(EM_NEIGHBOURING_CELL_PARAMS, (void*)&MfwEmData->NCInfo);
}
case EM_SUBCLASS_LOC_PAG:
{ MfwEmData->LocInfo.LUP = signal->UserData.log_pag.t3212;
/*Convert MCC & MNC to ASCII strings from BCD*/
utl_BCD2DialStr (signal->UserData.log_pag.mcc, MfwEmData->LocInfo.MCC, 3);
utl_BCD2DialStr (signal->UserData.log_pag.mnc, MfwEmData->LocInfo.MNC, 3);
Mfw_em_signal(EM_LOCATION_PARAMS, (void*)&MfwEmData->LocInfo);
}
case EM_SUBCLASS_CIPH_HOP_DTX:
{ MfwEmData->CHDTXInfo.ciph_status = signal->UserData.cip.ciph_stat;
MfwEmData->CHDTXInfo.HSN = signal->UserData.cip.hsn;
//!!!!!HOPPING CHANNELS!!!!!!!!!!!!!!
/* memcpy(MfwEmData->CHDTXInfo.ma, signal->UserData.cip.hop_chn.ma, 65);
if (signal->UserData.cip.hop_chn.v_start)
{
memcpy(MfwEmData->CHDTXInfo.ma2, signal->UserData.cip.hop_chn.ma2, 65);
}*/
MfwEmData->CHDTXInfo.DTX_status = signal->UserData.cip.dtx_stat;
Mfw_em_signal(EM_CIPH_HOP_DTX_PARAMS, (void*)&MfwEmData->CHDTXInfo);
}
case EM_SUBCLASS_ID:
{ /*MC, SPR 1554 added conversion of IMEI and IMSI from numbers to ASCII*/
int i;
/*convert to ASCII digits*/
for (i=0; i < 15; i++)
{
MfwEmData->MobileInfo.IMEI[i]= signal->UserData.id.em_imeisv.ident_dig[i] + ASCII_OFFSET;
MfwEmData->MobileInfo.IMSI[i]=signal->UserData.id.em_imsi.ident_dig[i] +ASCII_OFFSET;
}
MfwEmData->MobileInfo.IMEI[15] = NULL;
MfwEmData->MobileInfo.IMSI[15] = NULL;
MfwEmData->MobileInfo.TMSI = signal->UserData.id.tmsi;
Mfw_em_signal(EM_MOBILE_INFO, (void*)&MfwEmData->MobileInfo);
}
case EM_SUBCLASS_SW_VERSION:
{
T_EM_SW_VER* sw_ver = &signal->UserData.version;
memcpy(MfwEmData->MobileInfo.SIM_version, sw_ver->sim, MAX_VER*sizeof(char));
memcpy(MfwEmData->MobileInfo.CC_version , sw_ver->cc, MAX_VER*sizeof(char));
memcpy(MfwEmData->MobileInfo.SS_version , sw_ver->ss, MAX_VER*sizeof(char));
memcpy(MfwEmData->MobileInfo.SMS_version , sw_ver->sms, MAX_VER*sizeof(char));
memcpy(MfwEmData->MobileInfo.MM_version, sw_ver->mm, MAX_VER*sizeof(char));
memcpy(MfwEmData->MobileInfo.RR_version , sw_ver->rr, MAX_VER*sizeof(char));
memcpy(MfwEmData->MobileInfo.DL_version , sw_ver->dl, MAX_VER*sizeof(char));
memcpy(MfwEmData->MobileInfo.ALR_version , sw_ver->alr, MAX_VER*sizeof(char));
}
default:
TRACE_EVENT("Unknown EM data type");
}
}