📄 virphone.c
字号:
PromptEntry.TextPtr = dplytime;
PromptEntry.TextLen = sizeof(dplytime) - 1;
} else {
PromptEntry.TextPtr = (INT8U *)str;
PromptEntry.TextLen = strlen(str);
}
if (time > 0)
ActivatePrompt(&PromptEntry);
#if EN_HSTSMON > 0
if(CmpString(TalkRecord.tel,GuestSmon.GuestTel,TalkRecord.tellen)!=STR_EQUAL)//判断是否为召车乘客电话 add by qzc
#endif
StoreTalkRecord(); /* store talk record */
}
static void InitProc_Dial(void) //change 2004.03.31
{
INT8U *tel, tellen, result;
EntryTel.attrib = TALK_DIAL;
InitTalkRecord();
status = VIR_FREE;
tel = EntryTel.tel;
tellen = EntryTel.tellen;
if (tellen > 3 && tel[0] == '+') {
tel += 3;
tellen -= 3;
}
if ((result = RingupPhone(PHONE_COM, EntryTel.channel, tel, tellen, 0)) != PHONE_ACCEPT) {
switch (result)
{
case PHONE_NOSIM:
ExitVirPhone(" 无SIM卡", 1);
break;
case PHONE_NONETWORK:
case PHONE_SEARCHINGNETWORK:
ExitVirPhone(" 无网络", 1);
break;
default:
ExitVirPhone(" 通话结束", 1);
break;
}
} else {
status = VIR_CALLING;
Display_CALLING_INIT();
}
}
static void InitProc_Ring(void)
{
EntryTel.attrib = TALK_MISS;
InitTalkRecord();
RequestRing(HstCfg.CallRing); /* request ring beeper */
status = VIR_RINGING;
Display_RINGING();
StartTmr(waittmr, PERIOD_WAIT_AUTOPICK);
}
static void DestroyProc(void)
{
CLOCKTIME_STRUCT clocktime;
activated = FALSE;
StopTmr(waittmr);
if (status == VIR_TALKING) {
GetClockTime(PHONE_COM, &clocktime);
TalkRecord.talktime[0] = clocktime.minute;
TalkRecord.talktime[1] = clocktime.second;
}
if (status != VIR_FREE) HangupPhone(PHONE_COM,0);
TurnoffTalkIndicator(); /* turn off talk indicator */
}
static void Handler_CALLING(INT8U phonestatus)
{
if (phonestatus == PHONE_TALKING) {
status = VIR_TALKING;
RegisterTime();
InitDtmfBuf();
Display_TALKING();
} else if (phonestatus == PHONE_FREE || curkey.key == KEY_END) {
status = VIR_FREE;
if (curkey.key == KEY_END) HangupPhone(PHONE_COM,0);
}
}
static void Handler_TALKING(INT8U phonestatus)
{
CLOCKTIME_STRUCT clocktime;
if (phonestatus == PHONE_FREE || curkey.key == KEY_END) {
if (curkey.key == KEY_END && HaveDtmfChar()) {
DelDtmfChar();
Display_TALKING();
} else {
status = VIR_FREE;
RegisterTime();
GetClockTime(PHONE_COM, &clocktime);
TalkRecord.talktime[0] = clocktime.minute;
TalkRecord.talktime[1] = clocktime.second;
if (curkey.key == KEY_END) HangupPhone(PHONE_COM,0);
}
} else if ((curkey.key >= '0' && curkey.key <= '9') ||
curkey.key == '*' || curkey.key == '#' || curkey.key == '+') {
if (curkey.key == '+') curkey.key = '*';
DialDTMF(PHONE_COM, curkey.key);
AddDtmfChar(curkey.key);
Display_TALKING();
} else if (curkey.key == KEY_CLRALL && HaveDtmfChar()) {
InitDtmfBuf();
Display_TALKING();
} else if (curkey.key == KEY_UP) {
TurnupVoiceVolume(PHONE_COM);
Display_VOLUME();
} else if (curkey.key == KEY_DOWN) {
TurndownVoiceVolume(PHONE_COM);
Display_VOLUME();
} else if (curkey.key == KEY_VOICE) {
if (GetVoiceChannel(PHONE_COM) == CHA_HANDSET)
ChangeVoiceChannel(PHONE_COM, CHA_HANDSFREE);
else
ChangeVoiceChannel(PHONE_COM, CHA_HANDSET);
Display_CHANNEL();
}
}
static void Handler_RINGING(INT8U phonestatus)
{
INT8U channel;
if (phonestatus == PHONE_FREE || curkey.key == KEY_END) {
CancelRing();
if (curkey.key == KEY_END) {
status = VIR_FREE;
EntryTel.attrib = TALK_RECV;
HangupPhone(PHONE_COM,PRI_REJECT);
} else {
HstMiss.NumTel++;
ExitVirPhone(0, 0);
}
} else if (phonestatus == PHONE_CONNECTING ||
phonestatus == PHONE_TALKING || phonestatus == PHONE_DISCONNECTING) {
status = VIR_FREE;
CancelRing();
} else if (curkey.key == KEY_SND) {
status = VIR_CALLING;
EntryTel.attrib = TALK_RECV;
CancelRing();
OSQPost(SysTaskMsgQue, MSG_HANDSET_PICKUP, 0, 0); /* send message to systask */
if (HstCfg.HandsfreeChannel) {
channel = CHA_HANDSFREE;
} else {
channel = CHA_HANDSET;
}
if (!PickupPhone(PHONE_COM, channel, 0)) ExitVirPhone(0, 3);
}
}
static void HdlEventProc(INT8U phonestatus)
{
if (status > VIR_RINGING || (!activated)) {
ActivateLowestWinStack();
return;
}
switch (status)
{
case VIR_CALLING:
Handler_CALLING(phonestatus);
break;
case VIR_TALKING:
Handler_TALKING(phonestatus);
break;
case VIR_RINGING:
Handler_RINGING(phonestatus);
break;
default:
break;
}
if (status == VIR_FREE) ExitVirPhone(0, 3);
}
static void HdlKeyProc(void)
{
GetKeyMsg(&curkey);
HdlEventProc(0xff);
}
static WINSTACKENTRY_STRUCT WinStackEntry = {0, DestroyProc, 0, 0, HdlKeyProc};
void ActivateVirPhone_Dial(BOOLEAN findsk, INT8U tellen, INT8U *tel)
{
if (activated) return;
if (HstCfg.HandsfreeChannel) {
EntryTel.channel = CHA_HANDSFREE;
} else {
EntryTel.channel = CHA_HANDSET;
}
EntryTel.tellen = 0;
if (findsk && tellen == 1 && *tel >= '0' && *tel <= '9') {
EntryTel.tellen = GetSKRecTel(*tel - '0', EntryTel.tel);
}
if (EntryTel.tellen == 0) {
if (tellen > sizeof(EntryTel.tel)) tellen = sizeof(EntryTel.tel);
EntryTel.tellen = tellen;
memcpy(EntryTel.tel, tel, tellen);
}
if (!CallRHTPass(CALLRHT_DIALED, EntryTel.tellen, EntryTel.tel)) {
ActivateStringPrompt("对不起\n呼叫被限制");
return;
}
if (!AlarmerPermitTalk()) {
ActivateStringPrompt("对不起\n现正忙…");
return;
}
activated = TRUE;
WinStackEntry.InitProc = InitProc_Dial;
PushWinStack(&WinStackEntry);
}
void ActivateVirPhone_DialSuccor(INT8U tellen, INT8U *tel)
{
if (activated) return;
EntryTel.channel = CHA_HANDSFREE;
if (tellen > sizeof(EntryTel.tel)) tellen = sizeof(EntryTel.tel);
EntryTel.tellen = tellen;
memcpy(EntryTel.tel, tel, tellen);
activated = TRUE;
WinStackEntry.InitProc = InitProc_Dial;
PushWinStack(&WinStackEntry);
}
void ActivateVirPhone_Ring(void)
{
if (activated) return;
EntryTel.tellen = RingPara[PHONE_COM].len;
if (EntryTel.tellen > sizeof(EntryTel.tel))
EntryTel.tellen = sizeof(EntryTel.tel);
memcpy(EntryTel.tel, RingPara[PHONE_COM].tel, EntryTel.tellen);
activated = TRUE;
WinStackEntry.InitProc = InitProc_Ring;
PushWinStack(&WinStackEntry);
}
void HangupVirPhone(void)
{
if (activated) HangupPhone(PHONE_COM,0);
}
void ResetVirPhone(void)
{
activated = FALSE;
}
void InitVirPhone(void)
{
status = VIR_FREE;
activated = FALSE;
waittmr = CreateTimer(WaitTmrProc, 0);
}
void InformVirPhone(INT8U phonestatus)
{
if (activated) {
curkey.key = KEY_NULL;
HdlEventProc(phonestatus);
}
}
BOOLEAN VirPhoneIsActivated(void)
{
return activated;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -