⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hstsmon.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/**************************
**  FILE:  HSTSMON.C      *
**  By  :  QZC 2004.1.7   *
**************************/
#define HSTSMON_GLOBALS

#include "includes.h"
#include "bsp.h"
#include "tools.h"
#include "timetask.h"
#include "Public.h"
#include "Printer.h"
#include "Stream.h"
#include "SYSFrame.h"
#include "gprsdrv.h"
#include "winstack.h"
#include "HstCtl.h"
#include "keyboard.h"
#include "Prompt.h"
#include "itemmenu.h"
#include "VirPhone.h"
#include "PhoneDrv.h"
#include "HstSmon.h"

#if EN_HANDSET > 0
#if EN_HSTSMON > 0

#define DEBUG_HSTSMON  0//1

static KEY_STRUCT curkey;
static TMR_TSK *WaitTmr;
static STREAM *Smonstrm;
static PROMPT_STRUCT InfoPrompt;
void GetKeyMsg(KEY_STRUCT *key);

static BOOLEAN INAnswer=FALSE;
static INT8U CarInfoBuf[100];
static INT8U AckBuf[5];
#if DEBUG_HSTSMON > 0
static INT8S curstack;
#endif
static void WaitTmrProc(void)
{
	StopTmr(WaitTmr);
	RemoveTmr(WaitTmr);
	CancelRing();
	ActivateLowestWinStack();
	INAnswer=FALSE;
}

static void Informer_054c(INT8U result)
{
    if(result==_SUCCESS)
     {
		 GuestSmon.INSMON=FALSE;
		 ActivateStringPrompt("抢答发送成功");
		 #if DEBUG_HSTSMON > 0
		 curstack=GetCurstack();
		 PrintFromUART(0x01,"\ncurstack5:");
		 FormatPrintDataBlock(FORMAT_HEX,0x01,(INT8U *)&curstack,1);
		 #endif
	  }
    else ActivateStringPrompt("抢答发送失败");
    INAnswer=FALSE;
}

static void SendSmonAck(void)
{
	INT8U tellen;
	INT16U attrib;

	Smonstrm=GetSYSFrameStream();
	ASMSYSFrameHead_MODE2(Smonstrm,EgCode.egcode,0x057c);
   if(PubParaValid(ATTEMPERTEL_)) tellen=AttemperTel.len;
   else tellen=0;
   attrib = GetServiceAttrib(SER_ATTEMPER);
   if(!SendSYSFrame_MODE2(Smonstrm,AttemperTel.tel,tellen,SM_ATTR_SUCCESS|attrib,Informer_054c))
   	Informer_054c(_FAILURE);
}

static void KeyAck1(void)
{
	GetKeyMsg(&curkey);
	switch(curkey.key)
	 {
		case	KEY_ACK:
				StopTmr(WaitTmr);
	 			RemoveTmr(WaitTmr);
	 			CancelRing();
	 			PopWinStack();
	 			#if DEBUG_HSTSMON > 0
				curstack=GetCurstack();
				PrintFromUART(0x01,"\ncurstack4:");
				FormatPrintDataBlock(FORMAT_HEX,0x01,(INT8U *)&curstack,1);
				#endif
				SendSmonAck();
				break;
		case	KEY_NAK:
				StopTmr(WaitTmr);
				RemoveTmr(WaitTmr);
				CancelRing();
				PopWinStack();
				INAnswer=FALSE;
				break;
		default: break;
	 }
}

static void InitProc1(void)
{
	#if DEBUG_HSTSMON > 0
	curstack=GetCurstack();
	PrintFromUART(0x01,"\ncurstack2:");
	FormatPrintDataBlock(FORMAT_HEX,0x01,(INT8U *)&curstack,1);
	#endif
	WaitTmr=CreateTimer(WaitTmrProc,0);
	StartTmr(WaitTmr,SECOND,30);
	ActivateStringPrompt_TIME_KEY("电召抢答?",30,KeyAck1);
	#if DEBUG_HSTSMON > 0
	curstack=GetCurstack();
	PrintFromUART(0x01,"\ncurstack3:");
	FormatPrintDataBlock(FORMAT_HEX,0x01,(INT8U *)&curstack,1);
	#endif
}

static void HdlKeyProc1(void)
{
	PopWinStack();
	#if DEBUG_HSTSMON > 0
	curstack=GetCurstack();
	PrintFromUART(0x01,"\ncurstack6:");
	FormatPrintDataBlock(FORMAT_HEX,0x01,(INT8U *)&curstack,1);
	#endif
}

static WINSTACKENTRY_STRUCT WinStackEntry1 = {InitProc1,0,0,0,HdlKeyProc1};

void HdlHstSmon(void)
{
	if(INAnswer) return;
	else INAnswer=TRUE;
	#if DEBUG_HSTSMON > 0
	PrintFromUART(0x01,"\nHdlHstSmon");
	curstack=GetCurstack();
	PrintFromUART(0x01,"\ncurstack1:");
	FormatPrintDataBlock(FORMAT_HEX,0x01,(INT8U *)&curstack,1);
	#endif
 	RequestRing(0x03);
 	PushWinStack(&WinStackEntry1);
}

static void SendCarInfoToGuest(void)
{
	INT8U *Ptr,Len,TelLen;
	Ptr=CarInfoBuf;
	if(GuestSmon.GuestTel[0]=='1'&&GuestSmon.GuestTel[1]=='3')
	 {
	 	Len=strlen("您好,召车成功!车牌号:");
		memcpy(Ptr,"您好,召车成功!车牌号:",Len);
		Ptr+=Len;
		Len=DecodeTel(Ptr,GuestSmon.CarNo,sizeof(GuestSmon.CarNo));
		Ptr+=Len;
	 	Len=strlen("车载电话:");
		memcpy(Ptr,"车载电话:",Len);
		Ptr+=Len;
	 	memcpy(Ptr,MyTel.tel,MyTel.len);
	 	Ptr+=MyTel.len;
	 	Len=strlen("车随后就到。谢谢使用!");
		memcpy(Ptr,"车随后就到。谢谢使用!",Len);
		Ptr+=Len;
		#if DEBUG_HSTSMON > 0
		PrintFromUART(0x01,"\nSendCarInfoToGuest");
		FormatPrintDataBlock(FORMAT_HEX,0x01,CarInfoBuf,Ptr-CarInfoBuf);
		#endif
		TelLen=DecodeTellen(GuestSmon.GuestTel,sizeof(GuestSmon.GuestTel));
		SendSM(SM_ATTR_COMMON | SM_ATTR_DISCODE6 | SM_ATTR_AUTOCODE,
				 GuestSmon.GuestTel,TelLen,CarInfoBuf,Ptr-CarInfoBuf,0);
	 }
	else return;
}

static void KeyAck2(void)
{
	GetKeyMsg(&curkey);
	switch(curkey.key)
	 {
		case	KEY_ACK:
		case	KEY_NAK:
				CancelRing();
				PopWinStack();
				#if DEBUG_HSTSMON > 0
				curstack=GetCurstack();
				FormatPrintDataBlock(FORMAT_HEX,0x01,(INT8U *)&curstack,1);
				#endif
				ActivateStringPrompt_TIME("请到电召菜单查看详细信息",0);
				#if DEBUG_HSTSMON > 0
				curstack=GetCurstack();
				FormatPrintDataBlock(FORMAT_HEX,0x01,(INT8U *)&curstack,1);
				#endif
				break;
		default: break;
	 }
}

static void InitProc2(void)
{
	RequestRing(0x03);
	ActivateStringPrompt_TIME_KEY("电召确认信息",0,KeyAck2);
	#if DEBUG_HSTSMON > 0
	curstack=GetCurstack();
	FormatPrintDataBlock(FORMAT_HEX,0x01,(INT8U *)&curstack,1);
	#endif
}

static void HdlKeyProc2(void)
{
	GetKeyMsg(&curkey);
	switch(curkey.key)
	 {
		case	KEY_ACK:
				PopWinStack();
				InfoPrompt.Mode        = 0;
    			InfoPrompt.LiveTime    = 0;
    			InfoPrompt.TextPtr     = (INT8U *)GuestSmon.GuestInfo;
    			InfoPrompt.TextLen     = DecodeTellen(GuestSmon.GuestInfo,50);
    			InfoPrompt.ExitProc    = 0;
    			InfoPrompt.ExitKeyProc = 0;
    			ActivatePrompt(&InfoPrompt);
    			break;
		case	KEY_NAK:
				PopWinStack();
				break;
		default: break;
	 }
}

static WINSTACKENTRY_STRUCT WinStackEntry2 = {InitProc2,0,0,0,HdlKeyProc2};

void HdlCenterAck(INT8U *data,INT8U len)
{
	#if DEBUG_HSTSMON > 0
	PrintFromUART(0x01,"\nHdlCenterAck");
	curstack=GetCurstack();
	FormatPrintDataBlock(FORMAT_HEX,0x01,(INT8U *)&curstack,1);
	#endif
	memcpy(GuestSmon.GuestTel,data,len);
	GuestSmon.INSMON=TRUE;
	StorePubPara(GUESTSMONINFO_);
	SendCarInfoToGuest();
	PushWinStack(&WinStackEntry2);
	#if DEBUG_HSTSMON > 0
	curstack=GetCurstack();
	FormatPrintDataBlock(FORMAT_HEX,0x01,(INT8U *)&curstack,1);
	#endif
}

static void DailGuest(void)
{
	INT8U tellen;

	if(GuestSmon.INSMON)
	 {
		tellen=DecodeTellen(GuestSmon.GuestTel,15);
		ActivateVirPhone_Dial(FALSE,tellen,GuestSmon.GuestTel);
	 }
	else ActivateStringPrompt("当前无电召");
}

static void ShowInfo(void)
{
	if(GuestSmon.INSMON)	//显示信息
	 {
		InfoPrompt.Mode        = 0;
    	InfoPrompt.LiveTime    = 0;
    	InfoPrompt.TextPtr     = (INT8U *)GuestSmon.GuestInfo;
    	InfoPrompt.TextLen     = DecodeTellen(GuestSmon.GuestInfo,50);
    	InfoPrompt.ExitProc    = 0;
    	InfoPrompt.ExitKeyProc = 0;
    	ActivatePrompt(&InfoPrompt);
	 }
	else ActivateStringPrompt("当前无信息");
}

static void Informer_Report(INT8U result)
{
    if(result==_SUCCESS)
     {
		 ActivateStringPrompt("发送成功");
		 GuestSmon.INSMON=FALSE;
		 StorePubPara(GUESTSMONINFO_);
	  }
    else ActivateStringPrompt("发送失败");
}

static void SendSuccess(void)
{
	INT8U  tellen;
	INT16U attrib;
	INT16U TempLen;
	INT8U  Temp=0x01;

	Smonstrm=GetSYSFrameStream();
	ASMSYSFrameHead_MODE2(Smonstrm,EgCode.egcode,0x057e);
	TempLen=CodeX_To_Code6(MODE_CODE8,AckBuf,&Temp,1,sizeof(AckBuf));
	#if DEBUG_HSTSMON > 0
	PrintFromUART(0x01,"\nACK:");
	FormatPrintDataBlock(FORMAT_HEX,0x01,AckBuf,2);
	#endif
	WriteDATA_Strm(Smonstrm,AckBuf,TempLen);
   if(PubParaValid(ATTEMPERTEL_)) tellen=AttemperTel.len;
   else tellen=0;
   attrib = GetServiceAttrib(SER_ATTEMPER);
   if(!SendSYSFrame_MODE2(Smonstrm,AttemperTel.tel,tellen,SM_ATTR_SUCCESS|attrib,Informer_Report))
     Informer_Report(_FAILURE);
}

static void SendLost(void)
{
	INT8U  tellen;
	INT16U attrib;
	INT16U TempLen;
	INT8U  Temp=0x00;

	Smonstrm=GetSYSFrameStream();
	ASMSYSFrameHead_MODE2(Smonstrm,EgCode.egcode,0x057e);
	TempLen=CodeX_To_Code6(MODE_CODE8,AckBuf,&Temp,1,sizeof(AckBuf));
	WriteDATA_Strm(Smonstrm,AckBuf,TempLen);
   if(PubParaValid(ATTEMPERTEL_)) tellen=AttemperTel.len;
   else tellen=0;
   attrib = GetServiceAttrib(SER_ATTEMPER);
   if(!SendSYSFrame_MODE2(Smonstrm,AttemperTel.tel,tellen,SM_ATTR_SUCCESS|attrib,Informer_Report))
   	Informer_Report(_FAILURE);
}

static ITEMMENU_STRUCT MENU_SMONREPORT_SUCCESS = {ITEM_FCN,"成功接到客人",SendSuccess,0,0};
static ITEMMENU_STRUCT MENU_SMONREPORT_LOST    = {ITEM_FCN,"没有接到客人",SendLost,   0,0};
static ITEMMENU_STRUCT *MENU_SMONREPORT_CHILD[]= {&MENU_SMONREPORT_SUCCESS,&MENU_SMONREPORT_LOST};

static ITEMMENU_STRUCT MENU_GUESTTEL	= {ITEM_FCN,  "拨打乘客电话",DailGuest,0,0};
static ITEMMENU_STRUCT MENU_GUESTINFO	= {ITEM_FCN,  "召车乘客信息"  ,ShowInfo ,0,0};
static ITEMMENU_STRUCT MENU_SMONREPORT = {ITEM_FMENU,"电召结果报告"  ,0        ,2,MENU_SMONREPORT_CHILD};
static ITEMMENU_STRUCT *MENU_GUESTSMON_CHILD[] ={&MENU_GUESTTEL,&MENU_GUESTINFO,&MENU_SMONREPORT};

ITEMMENU_STRUCT MENU_GUESTSMON = {ITEM_FMENU,"  电召菜单",0,3,MENU_GUESTSMON_CHILD};

#endif
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -