📄 mfw_cm.c
字号:
if ((phb_read_entries(PHB_ADN, (UBYTE)para->dialIdx.index,
MFW_PHB_INDEX, 1,
&entries) EQ MFW_PHB_OK)
AND ((int)entries.num_entries > 0))
{
res = cm_check_mo_number(entries.entry->number);
if (res NEQ CM_OK)
return res;
}
else
{
res = cm_check_mo_number(0);
if (res NEQ CM_OK)
return res;
}
/* set the outgoing call status */
call_stat = OUTGOING_CALL;
redial_count = 0;
cc_stat.type = OUTGOING_CALL;
cm_set_call_mode(mode);
//RM 19_09_2000 instead change in ksd structure T_KSD_SEQPARAM etc., later to change !!!!
#ifdef NO_ASCIIZ
if(para->dialIdx.str NEQ NULL)
{
mfwpbText.cs = CS_GsmDef;
mfwpbText.len = strlen(para->dialIdx.str);
memcpy(mfwpbText.data,para->dialIdx.str,mfwpbText.len);
}
else
{
mfwpbText.cs = CS_NotPresent;
mfwpbText.len = 0;
}
res = sAT_Dm(CMD_SRC_LCL, &mfwpbText,
para->dialIdx.mem, para->dialIdx.index,
para->dialIdx.clirOvrd, para->dialIdx.cugCtrl,
para->dialIdx.callType);
#else
res = sAT_Dm(CMD_SRC_LCL, para->dialIdx.str,
para->dialIdx.mem, para->dialIdx.index,
para->dialIdx.clirOvrd, para->dialIdx.cugCtrl,
para->dialIdx.callType);
#endif
if ((res == AT_FAIL) OR (res == AT_BUSY))
{
call_stat = MFW_CALL_FREE;
return cm_error_code(AT_CMD_D);
}
return CM_OK;
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
| STATE : code ROUTINE: cm_mo_call |
+--------------------------------------------------------------------+
PURPOSE : start mobile originated call
*/
T_MFW cm_mo_call(UBYTE *number, T_MFW_CM_CALL_TYPE type)
{
CHAR * rest;
T_KSD_SEQPARAM para;
T_MFW_SS_RETURN typ;
T_MFW_SS_RETURN new_typ;
CHAR * string;
UBYTE cm_grp;
UBYTE clir_status;
UBYTE colr_status;
UBYTE prefix;
char buf[80];
UBYTE phone[MFW_NUM_LEN];
UBYTE num_save[MFW_STRING_LEN];
SHORT id;
T_ACI_RETURN res;
TRACE_FUNCTION ("cm_mo_call()");
strncpy((char *)num_save, (char *)number, MFW_STRING_LEN-1);
num_save[MFW_STRING_LEN-1] = 0;
/* check the type of number (key sequence), current no function */
typ = ss_decode(number, &rest, ¶);
TRACE_EVENT_P1("Type: %d", typ);
if (typ == MFW_SS_DIAL)
{
strcpy((char *)phone, para.dial.number);
}
if (typ == MFW_SS_HOLD)
{
cm_set_cmd_status(para.chld.mode, para.chld.call);
if (sAT_PlusCHLD(CMD_SRC_LCL, para.chld.mode, para.chld.call) != AT_EXCT)
return CM_ERROR;
return CM_CTRL_STR;
}
//MC 11.04.02
if (typ == MFW_SS_ECT)
{
cm_set_cmd_status(para.chld.mode, para.chld.call);
if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_Ect, 0) != AT_EXCT)
return CM_ERROR;
else
return CM_CTRL_STR;
}
//MC
if (typ == MFW_SS_DIAL_IDX)
{
return cm_mo_idx(¶, type);
}
switch (typ)
{
//NM
case MFW_SS_CLIR: //jgg wrong not CM_OK should be CM_SS, however cm_grp not used after funtion callnumber called
case MFW_SS_DIAL:
cm_grp = CM_OK;
break;
case MFW_SS_DTMF:
case MFW_SS_CF:
case MFW_SS_CB:
case MFW_SS_CLIP:
case MFW_SS_COLR:
case MFW_SS_COLP:
case MFW_SS_WAIT:
case MFW_SS_HOLD:
case MFW_SS_REG_PW:
cm_grp = CM_SS;
break;
case MFW_SS_USSD:
cm_grp = CM_USSD;
break;
case MFW_SS_SIM_LOCK:
case MFW_SS_SIM_REG_PW:
case MFW_SS_SIM_UNBLCK_PIN:
cm_grp = CM_SIM;
break;
case MFW_SS_MMI:
cm_grp = CM_MMI;
break;
/* SPR#1352 - SH - TTY
* If an SS string has been entered, temporarily enable or disable
* TTY for this call only. */
case MFW_SS_TTY_NEXTCALL_ON:
case MFW_SS_TTY_NEXTCALL_OFF:
{
if (typ==MFW_SS_TTY_NEXTCALL_ON)
{
cm_tty_enable(TRUE);
}
else
{
cm_tty_enable(FALSE);
}
strcpy((char *)num_save, (char *)&num_save[4]); /* Ignore SS string when dialling */
rest = (char *)&number[4]; /* Look at number following SS string */
}
break;
/* SH end */
default:
return CM_ERROR;
}
string = rest;
clir_status = 0;
colr_status = 0;
buf[0] = '\0';
cc_stat.prefix[0] = '\0';
while(strlen(string))
{
TRACE_EVENT("In the while");
new_typ = ss_decode((UBYTE *)string, &rest, ¶);
// /*
if (new_typ == MFW_SS_CLIR)
{
clir_status = 1;
if (para.Clir.mode == CLIR_MOD_Supp)
{
strcat((char *)cc_stat.prefix, "*31#");
TRACE_EVENT ("CLIR_MOD_Supp");
}
if (para.Clir.mode == CLIR_MOD_Invoc)
{
strcat((char *)cc_stat.prefix, "#31#");
TRACE_EVENT ("CLIR_MOD_Invoc");
}
}
if (new_typ == MFW_SS_COLR)
colr_status = 1;
if (new_typ == MFW_SS_DIAL)
{
TRACE_EVENT("It's a dial");
/* SPR#1352 - SH - only copy string to dial, not whole string */
if (typ==MFW_SS_TTY_NEXTCALL_ON || typ==MFW_SS_TTY_NEXTCALL_OFF)
{
typ = new_typ;
TRACE_EVENT_P1("phone now holds: %s", phone);
}
else
/* end SH */
{
typ = new_typ;
strcpy((char *)phone, para.dial.number);
}
}
string = rest;
}
if (!colr_status AND (typ == MFW_SS_DIAL))
{
prefix = cli_prefix & 0xc0;
if (prefix == 0x80)
{
strcat(buf, "*77#");
strcat((char *)cc_stat.prefix, "*77#");
}
if (prefix == 0xc0)
{
strcat(buf, "#77#");
strcat((char *)cc_stat.prefix, "#77#");
}
}
if (typ == MFW_SS_DIAL)
{
res = cm_check_mo_number(phone);
if ( res != CM_OK)
return res;
/* set the outgoing call status */
call_stat = OUTGOING_CALL;
redial_count = 0;
cc_stat.type = OUTGOING_CALL;
cm_grp = CM_OK;
currConnecting = 1;
cm_set_call_mode(type);
}
strcat(buf, (char *)num_save);
if (cm_search_callId(CAL_STAT_Active, &id) EQ CM_OK)
{
/*
* at least one active, this must be put on hold
* by ACI first, then dial
*/
cm_set_cmd_status(CHLD_MOD_HldActDial, "");
cc_id = id;
}
if (type == DATA_CALL)
para.dial.callType = D_TOC_Data;
res = sAT_Dn(CMD_SRC_LCL, buf, -1, -1, para.dial.callType);
if ((res == AT_FAIL) OR (res == AT_BUSY))
{
if (typ == MFW_SS_CLIP)
return CM_CLI;
call_stat = MFW_CALL_FREE;
return cm_error_code(AT_CMD_D);
}
if (res == AT_CMPL)
{
switch (typ)
{
case MFW_SS_CLIR:
case MFW_SS_CLIP:
case MFW_SS_COLR:
case MFW_SS_COLP:
return CM_CLI;
default:
break;
}
}
return cm_grp;
}
/*
+--------------------------------------------------------------------+
| PROJECT: GSM-MFW (8417) MODULE: MFW_CB |
| STATE : code ROUTINE: rAT_PlusCRING_OFF |
+--------------------------------------------------------------------+
PURPOSE : Alert Off indication from ACI
*/
GLOBAL void rAT_PlusCRING_OFF ( SHORT cId )
{
T_MFW_CM_CALL_STAT stat;
UBYTE ton;
USHORT report; /* Marcus: Extended error reporting: 12/11/2002 */
UBYTE mode;
TRACE_FUNCTION ("rAT_PlusCRING_OFF()");
if (cm_search_callStat(cId, &stat, &ton, &mode) == CM_OK)
{
call_stat = MFW_CALL_FREE;
call_type = MFW_CALL_FREE;
if (stat == CALL_DEACTIVE)
{
dis_connect.call_number = cId;
qAT_PlusCEER( CMD_SRC_LCL, &report);
/* Marcus: Extended error reporting: 12/11/2002: Start */
TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);
if (GET_CAUSE_DEFBY(report) == DEFBY_CONDAT)
{
/* Treat Condat defined cause values as if no cause given */
dis_connect.cause = NOT_PRESENT_8BIT;
}
else
{
/* Standards defined cause value is given */
dis_connect.cause = GET_CAUSE_VALUE(report);
}
TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
/* Marcus: Extended error reporting: 12/11/2002: End */
cm_signal(E_CM_DISCONNECT, &dis_connect);
return;
}
cm_signal(E_CM_RING_OFF, 0);
}
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
| STATE : code ROUTINE : rAT_PlusCRING |
+--------------------------------------------------------------------+
PURPOSE : Alert indication from ACI
*/
void rAT_PlusCRING(T_ACI_CRING_MOD mode,
T_ACI_CRING_TYP type1,
T_ACI_CRING_TYP type2)
{
SHORT call_number;
TRACE_FUNCTION ("rAT_PlusCRING()");
in_call.result = Present;
/* search the call identifier */
if (cm_search_callId(CAL_STAT_Wait, &call_number) == CM_OK)
in_call.call_number = call_number;
else
in_call.call_number = 0;
/* If redial is active, it must be stoped. */
if (call_stat == REDIALING_CALL)
{
cm_stop_redialTim();
rdl.redial_mode = CM_REDIAL_INCOMING;
cm_signal(E_CM_REDIAL, &rdl);
}
if (mode EQ CRING_MOD_Direct)
{
switch (type1)
{
/* Voice call */
case CRING_TYP_Voice:
if (type2 EQ CRING_TYP_NotPresent)
{
in_call.type = VOICE_CALL;
cm_set_call_mode(VOICE_CALL);
}
else
{
switch (type2)
{
case CRING_TYP_Sync:
case CRING_TYP_Async:
case CRING_TYP_RelSync:
case CRING_TYP_RelAsync:
in_call.type = VFD_VOICE;
cm_bc_parameter(type2);
cm_set_call_mode(VFD_VOICE);
break;
/*MC, SPR 1026, check for line1 and line2*/
case CRING_TYP_Voice:
in_call.type = VOICE_CALL;
cm_set_call_mode(VOICE_CALL);
break;
case CRING_TYP_AuxVoice:
cm_set_call_mode(AuxVOICE_CALL);
in_call.type = AuxVOICE_CALL;
break;
/*MC, end*/
default:
in_call.type = VOICE_CALL;
cm_set_call_mode(VOICE_CALL);
break;
}
}
break;
/*MC, SPR 1026, Added case of Type1=CRING_TYP_AuxVoice*/
/*assuming line 2 is handled like line 1*/
case CRING_TYP_AuxVoice:
if (type2 EQ CRING_TYP_NotPresent)
{
in_call.type = AuxVOICE_CALL;
cm_set_call_mode(AuxVOICE_CALL);
}
else
{
switch (type2)
{
case CRING_TYP_Sync:
case CRING_TYP_Async:
case CRING_TYP_RelSync:
case CRING_TYP_RelAsync:
in_call.type = VFD_VOICE;
cm_bc_parameter(type2);
cm_set_call_mode(VFD_VOICE);
break;
case CRING_TYP_Voice:
in_call.type = VOICE_CALL;
cm_set_call_mode(VOICE_CALL);
break;
case CRING_TYP_AuxVoice:
cm_set_call_mode(AuxVOICE_CALL);
in_call.type = AuxVOICE_CALL;
break;
default:
in_call.type = VOICE_CALL;
cm_set_call_mode(VOICE_CALL);
break;
}
}
break;
/*MC, end*/
/* Data call */
case CRING_TYP_Sync:
case CRING_TYP_Async:
case CRING_TYP_RelSync:
case CRING_TYP_RelAsync:
in_call.type = DATA_CALL;
cm_bc_parameter(type1);
cm_set_call_mode(DATA_CALL);
break;
case CRING_TYP_Fax:
in_call.type = FAX_CALL;
in_call.bc1.conn_elem = Transparent;
cm_set_call_mode(FAX_CALL);
break;
default:
in_call.result = NotPresent;
break;
}
call_stat = INCOMING_CALL;
}
if (mode EQ CRING_MOD_Alternate)
{
cm_build_callType(type1, type2);
cm_bc_parameter(type1);
cm_bc_parameter(type2);
cm_set_call_mode(in_call.type);
}
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
| STATE : code ROUTINE: rAT_PlusCLIP |
+--------------------------------------------------------------------+
PURPOSE : The calling line identification for an incomming call.
*/
#ifdef NO_ASCIIZ
void rAT_PlusCLIP(T_ACI_CLIP_STAT stat,
CHAR * number,
T_ACI_TOA * type,
U8 validity,
CHAR * subaddr,
T_ACI_TOS * satype,
T_ACI_PB_TEXT * alpha)
{
int flag;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -