GPS应用

GPS是智能手机必备的功能之一,在程序中加入LBS服务器无疑会具有巨大的商业价值。
本文就对个平台下PGS简单操作作个简单的总结
  1 /*************************************
  2 //转载请保留作者信息
  3 // author:   sylar xiong jian
  4 // QQ:67666938 cug@live.cn
  5 // data:      2010.4.21 PM 22:01:32
  6 //1 windows mobile
  7 //
  8 ***************************************/
  9  //很简单的代码,就不用说明什么了。
10 HANDLE m_GpsMudle;
11 DCB m_GpsDCB;
12
13 /*****************  首先是初始化******************/
14 m_GpsMudle = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL ); //打开串口
15 SetCommMask( m_GpsMudle, EV_RXCHAR|EV_BREAK|EV_ERR );
16 m_GpsDCB.DCBlength = sizeof( DCB );
17     GetCommState( m_GpsMudle, &m_GpsDCB ); //获得串口状态
18     m_GpsDCB.BaudRate = 4800//波特率
19     m_GpsDCB.ByteSize = 8;
20     m_GpsDCB.Parity = NOPARITY;          
21     m_GpsDCB.StopBits = ONESTOPBIT;
22
23     //sleep to let dcb be effect
24     Sleep(1000);
25     SetCommState( m_GpsMudle, &m_GpsDCB );//设置串口通讯信息
26     GetCommTimeouts(m_GpsMudle, &timeouts);
27     timeouts.ReadTotalTimeoutConstant = 1000;
28     timeouts.ReadTotalTimeoutMultiplier = 0;
29     timeouts.ReadIntervalTimeout = 1
30 SetCommTimeouts(m_GpsMudle, &timeouts);  //设置读取数据超时时间
31 PurgeComm(m_GpsMudle,PURGE_TXCLEAR|PURGE_RXCLEAR); //清理缓存
32
33 /*****************  设置一个线程开始读取GPS数据 ******************/
34 SetCommMask( m_GpsMudle,EV_RXCHAR|EV_CTS|EV_DSR|EV_RING);
35 while(1)
36 {
37     ReadFile( g_GpsModule.GetSafeHandle(), &bbyte, 1, &dwBytesTransferred, 0);
38     if(bbyte = '$') //表示有效的GPS信息,具体看GPS的格式,这里不说了。
39     {
40     }
41 }
42
43 /*************************************
44 // 转载请保留作者信息
45 // author:   sylar xiong jian
46 // QQ:67666938 cug@live.cn
47 // data:      2010.4.21    PM 22:20 after a shower!
48 //2 Symbian OS 5TH S60
49 // refer: http://www.newlc.com/en/playing-n95?page=2
50 // 无错误处理和析构
51 ***************************************/
52 //首先解释下 symbian 的活动对象概念,非常类似于ACE和其他服务器模型,也类似于windows消息传递机制,所以非常简单。
53 //ActiveObjec symbian 里的活动对象类似于windows里的窗口,是接收消息的基本单元。所有的ActiveObject在创建后会通过CActiveScheduler::Add 把自己加入到Scheduler里面。每个ActiveObjec里有一个iStatus标识,类似于windows里面的窗口句柄。
54 //Scheduler 是一个独立线程的调度器,也就是主线程和ActiveObjec在一个线程,而调度器Scheduler单独为一个线程,Scheduler阻塞一直到有事件到来,然后根据iStatus标识调用相对于的活动对象ActiveObjec的RunL函数。
#include <lbsposition.h>
#include <lbssatellite.h>

 

55 
#include <lbsposition.h>

RPositionServer iPosServer;  //表示定位服务器
#include <lbssatellite.h>  

 

56 RPositioner iPositioner;   //会话
57 void CCActivePositioner::ConstructL(CFirstGpsAppView *aView)
58 {
59      iView = aView;
60
61      // Connect to the position server
62     TInt error = iPosServer.Connect( ); //连接到定位服务器
63    
64     // Open subsession to the position server
65     error = iPositioner.Open(iPosServer);  //获得和定位服务器的会话
66    
67     // Set position requestor 告诉LBS谁需要位置服务
68     error = iPositioner.SetRequestor( CRequestor::ERequestorService,CRequestor::EFormatApplication , KRequestor );
69   
70    // Set update interval to one second to receive one position data per second
71     TPositionUpdateOptions upOpt;
72     upOpt.SetUpdateInterval(TTimeIntervalMicroSeconds(1000000)); //GPS位置下载时间间隔 1秒 
73     upOpt.SetUpdateTimeOut(TTimeIntervalMicroSeconds(1000000 * 15)); //超时时间 15s
74     upOpt.SetMaxUpdateAge(TTimeIntervalMicroSeconds(KMaxAge));
75   
76     // Set update options
77     error =  iPositioner.SetUpdateOptions( upOpt );  //应用上面的设置,每1秒下载一次GPS位置信息
78     
79     // Request first  position    NotifyPositionUpdate
80     iPositioner.NotifyPositionUpdate(iPositionInfo,iStatus); //开始异步的获取位置信息..
81      // Set this object active
82     SetActive();
83 }
84
85
86 void CCActivePositioner::RunL() 
87 {
88     switch (iStatus.Int())
89     {
90     // The fix is valid
91     case KErrNone:
92     case KPositionPartialUpdate:  //异步的获得了GPS信息//如果有GPS信号了则进入这里运行,触发条件就是上面的 iPositioner.NotifyPositionUpdate(iPositionInfo,iStatus);
93     {
94         com_pool_data_t *sent = NULL;
95         TUint8 sent_num, i = 0;
96         TBuf8<COM_BUFFER_ITEM_SIZE> sent_data;
97         // get the NMEASentences and add into the list
98         iPositionGeneInfo->GetValue(EPositionFieldNMEASentences, sent_num);  //
99         for (i = 0; i < sent_num; i++)
100         {
101             sent = comm_alloc_data(&com_pool_head);
102             if (sent == NULL){
103                 comm_free_all_data(&com_pool_head, &g_gps_data_head);
104                 sent = comm_alloc_data(&com_pool_head);
105             }
106             iPositionGeneInfo->GetValue(EPositionFieldNMEASentencesStart+i, sent_data);
107             memcpy(sent->data, sent_data.Ptr(), sent_data.Length());
108             list_add_before(&sent->list_node, &g_gps_data_head); //g_gps_data_head是一个linux链表,将sent的内容插入到这个链表中
109         }
110         break;
111     }
112     default:
113         break;
114     }
115 //再次请求GPS信息,这样就形成了一个循环。每1秒请求一次GPS信息
116     iPositioner.NotifyPositionUpdate(*iPositionGeneInfo, iStatus);
117     SetActive();
118 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值