Do_Record.C
上传用户:zanguozi01
上传日期:2014-02-19
资源大小:155k
文件大小:15k
源码类别:

GPS编程

开发平台:

Others

  1. /********************************************************
  2. * 文件名:  Do_Record.h
  3. * 创建时间:2005年6月21日
  4. * 创建人:  
  5. * 版本号:  1.00
  6. * 功能:
  7. *
  8. * 修改历史:(每条详述)
  9. 补充说明:与外接的行使记录仪相连接,串口1,9600,奇校验,全双工通讯方式
  10. ********************************************************/
  11. #include <msp430x14x.h>
  12. #include <stdlib.h>
  13. #include "General.h"
  14. #include "Do_SRAM.h"
  15. #include "D_Buffer.h"
  16. #include "Other_Define.h"
  17. #include "Uart01.h"
  18. #include "Sub_C.h"
  19. #include "Record_Protocol.h"
  20. #include "Define_Bit.h"
  21. #include "M22_AT.h"
  22. #include "Disp_Protocol.h"
  23. #include "Do_Other.h"
  24. #include "W_Protocol.h"
  25. #include "Record_Protocol.h"
  26. #include "TA_Uart.h"
  27. /*
  28. #include "SPI45DB041.h"
  29. #include "W_Protocol.h"
  30. #include "Handle_Protocol.h"
  31. #include "Do_Record.h"
  32. #include "Define_Bit.h"
  33. #include "Main_Init.h"
  34. #include "Check_GSM.h"
  35. #include "Do_Reset.h"
  36. #include "Do_M22.h"
  37. #include "Do_Handle.h"
  38. #include "Do_GPS.h"
  39. #include "Do_Disp.h"
  40. #include "Do_Other.h"
  41. */
  42. void Deal_Record_Data(unsigned int Length);
  43. unsigned char Check_Record_Time(void);
  44. /********************************************************
  45. * 函数名:Do_Record_Module()
  46. 作用域:外部文件调用
  47. * 功能:
  48. * 参数:
  49. * 返回值:
  50. * 创建人:
  51. *
  52. * 修改历史:(每条详述)
  53. ********************************************************/
  54. void Do_Record_Module(void)
  55. {
  56. unsigned int i;
  57. unsigned int k;
  58. unsigned char DataTemp=0;
  59. if( (gReceive1_Over_Count>60)&&(gReceive1_Point>SRAM_RECORD_S)&&((gOther_Flag&RECORD_DATA_F_1)==0) )
  60. {
  61. //判断是否正确的数据包
  62. i=gReceive1_Point;
  63. //先判断包尾
  64. if( (SRAM_Read(i-1)==0x0a)&&(SRAM_Read(i-2)==0x0d) )
  65. {
  66. //如果包尾正确,则需要判断包长
  67. k=0;
  68. k=SRAM_Read(SRAM_RECORD_S+4);
  69. k<<=8;
  70. k=k+SRAM_Read(SRAM_RECORD_S+5);
  71. k=k+10;
  72. if( (i-SRAM_RECORD_S)==k )
  73. {
  74. if((gGeneral_Flag&TCP_PHONE_F_1)==0 )
  75. {
  76. #ifdef Debug_GSM_COM1
  77.             Send_COM1_Byte(ASCII((i-SRAM_RECORD_S)/0x100));
  78.             Send_COM1_Byte(ASCII(((i-SRAM_RECORD_S)%0x100)/0x10));
  79.             Send_COM1_Byte(ASCII((i-SRAM_RECORD_S)%0x10));
  80.             Send_COM1_Byte(':');
  81.             Send_COM1_Byte(ASCII(k/0x100));
  82.             Send_COM1_Byte(ASCII((k%0x100)/0x10));
  83.             Send_COM1_Byte(ASCII(k%0x10));
  84. Send_COM1_Byte('[');
  85. for(n=SRAM_RECORD_S;n<i;n++)
  86. {
  87. DataTemp=SRAM_Read(n);
  88. Send_COM1_Byte(ASCII(DataTemp/0x10));
  89. Send_COM1_Byte(ASCII(DataTemp%0x10));
  90. Clear_Exter_WatchDog();
  91. }
  92. Send_COM1_Byte(']');
  93. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  94. #endif
  95. }
  96. Deal_Record_Data(i-SRAM_RECORD_S);
  97. gNO_Sram_Data_Timer=0;
  98. }
  99. }
  100. gReceive1_Point=SRAM_RECORD_S;
  101. }
  102. //如果超过20秒无记录仪的数据发送,则需要清除外部SRAM.
  103. if(gNO_Sram_Data_Timer>20)
  104. {
  105. gNO_Sram_Data_Timer=0;
  106. gReceive1_Point=SRAM_RECORD_S;
  107. gReceive1_Over_Count=0;
  108. Send_COM1_String((unsigned char *)CLEAR_SRAM,sizeof(CLEAR_SRAM));
  109. }
  110. }
  111. /********************************************************
  112. * 函数名:Deal_Record_Command()
  113. 作用域:本地文件调用
  114. * 功能:
  115. * 参数:
  116. * 返回值:
  117. * 创建人:
  118. *
  119. * 修改历史:(每条详述)
  120. 补充说明:将接收到的完整的数据包已经放在
  121. 外部SRAM的SRAM_DO_S-----SRAM_DO_E区域。
  122. 则这个子程序部分是需要将命令字提取并分析出来
  123. ********************************************************/
  124. void Deal_Record_Data(unsigned int Length)
  125. {
  126. unsigned char nCmd=0;
  127. unsigned int iLength=0,i=0;
  128. unsigned char nStatus;
  129. unsigned char nTemp=0;
  130. unsigned char Check_Record=0;
  131. iLength=Length;
  132. SRAM_Init();
  133. nStatus=SRAM_Read(SRAM_RECORD_S);
  134. switch(nStatus)
  135. {
  136. //1,消息类型为0的消息包
  137. case NORMAL_TYPE:
  138. {
  139. gRecord_Data_Timer=0;
  140. gStatus2_Flag&=~RECORD_VAILD_F_1;
  141. gReceive_Record_Info_Timer=0;
  142. gStatus=NORMAL_TYPE;
  143. SRAM_Init();
  144. //读取命令字
  145. nCmd=SRAM_Read(SRAM_RECORD_S+3);
  146. /**************************************************************************************
  147. 1, 返回记录仪发送的记录仪系统数据:信息有,当前速度(米/秒)
  148. 年,月,日,时,分,秒,记录仪状态字节1,记录仪状态字节2
  149. 补充说明:A:速度需要用来做超速和制动方面的处理。同时定期向显示屏显示
  150.   B:如果判断记录仪的时间和GPS有效的状态下,误差超过2秒则,需要对记录仪的时间进行矫正,
  151.      同时,如果GPS无效果的状态下,GPS的时间也无效果,则转发记录仪的时间到显示屏。
  152.   C:记录仪的状态字节1的信息包括如下: BIT0;间隔距离上发的数据时间到。
  153.    BIT1;疲劳驾驶提示标志。
  154.    BIT2;疲劳报警标志
  155.    BIT3;记录仪打印机的工作状态
  156.    BIT4;记录仪USB的工作状态
  157. 00 55 7A 40 00 09 00 00 05 09 02 11 37 09 02 00 45 0D 0A
  158. ************************************************************************************/
  159. if(nCmd==K_RECEIVE_RECORDDATA)
  160. {
  161. //1,速度的处理
  162. SRAM_Init();
  163. gSpeed_Record=SRAM_Read(SRAM_RECORD_S+7);
  164. gSpeed_Disp=gSpeed_Record;
  165. gRecord_Null_Count=0;
  166. gPublic_Flag &=~ RECORD_NULL_F_1;
  167. //2,年月日时分秒的处理,如果判断记录仪的时间与GPS的时间误差超过,则需要对记录仪进行时间矫正的设置,但只设置一次
  168. i=Check_Record_Time();
  169. if(   (i==1)
  170. &&((gPublic_Flag&CHECK_TIME_F_1)==0) )
  171. {
  172. gPublic_Flag|=SET_RECORD_TIME_F_1;
  173. }
  174. //------------------------------
  175. //3,状态位的处理
  176. gRecord_Status=SRAM_Read(SRAM_RECORD_S+14);
  177. //3-1,判断BIT0,属于需要发送当前定位点的数据
  178. if(   (gRecord_Status&J_DISTANCE_DATA_F_1)
  179. &&(gCycle_Send_Status==TRACK_DATA_DISTANCE)
  180. &&((gPublic_Flag&ALLOW_SEND_DISTANCE_F_1)==0)  )
  181. {
  182. // Send_COM1_String( (unsigned char *)DISTANCE_DATA,sizeof(DISTANCE_DATA) );
  183. gPublic_Flag|=ALLOW_SEND_DISTANCE_F_1;
  184. }
  185. else
  186. {
  187. if(gPublic_Flag&ALLOW_SEND_DISTANCE_F_1)
  188. {
  189. if( (gInternal_Flag&SEND_CIRCLE_F_1)==0 )
  190. {
  191. Circle_Data_TCP(VEHICLE_RUNDATA_UP,0);
  192. gInternal_Flag|=SEND_CIRCLE_F_1;
  193. gPublic_Flag&=~ALLOW_SEND_DISTANCE_F_1;
  194. //处于GSM的工作方式下
  195. if(gM22_Status==GSM_WORK)
  196. {
  197. //属于常连在线的方式
  198. if((gON_OFF_Temp1&DISTANCE_TCP_ON_1)==0)
  199. {
  200. gInternal_Flag&=~SEND_CIRCLE_F_1;
  201. gInternal_Flag&=~ALLOW_DATA_F_1;
  202. gCircle_Buffer_Point=0;
  203. }
  204. //属于不常在线的方式,则需要登陆
  205. else
  206. {
  207. //在登陆部分有处理和判断
  208. }
  209. }
  210. }
  211. }
  212. }
  213. //3-2,判断BIT1,属于疲劳驾驶提示的标志
  214. if(gRecord_Status&J_TIRE_NOTICE_F_1)
  215. {
  216. gFore_Tire_Count++;
  217. if(gFore_Tire_Count>20)
  218. {
  219. gDisp_Status|=S_TIRE_NOTICE_F_1;
  220. gFore_Tire_Count=0;
  221. }
  222. else
  223. {
  224. gDisp_Status&=~S_TIRE_NOTICE_F_1;
  225. }
  226. }
  227. else
  228. {
  229. gFore_Tire_Count=0;
  230. gDisp_Status&=~S_TIRE_NOTICE_F_1;
  231. }
  232. //3-3,判断BIT2,属于疲劳驾驶报警的标志
  233. if(gRecord_Status&J_TIRE_ALARM_F_1)
  234. {
  235. gOver_Tire_Count++;
  236. gStop_Tire_Count=0;
  237. }
  238. else
  239. {
  240. gOver_Tire_Count=0;
  241. gStop_Tire_Count++;
  242. }
  243. //3-4,判断BIT3,属于打印机的工作状态
  244. if(gRecord_Status&J_PRINTER_STATUS_F_1) gDisp_Status|=S_PRINTER_STATUS_F_1;
  245. else gDisp_Status&=~S_PRINTER_STATUS_F_1;
  246. //3-5,判断BIT4,属于USB的工作状态
  247. if(gRecord_Status&J_USB_STATUS_F_1) gDisp_Status|=S_USB_STATUS_F_1;
  248. else gDisp_Status&=~S_USB_STATUS_F_1;
  249. //4,接收到记录仪的数据,则需要返回一个状态包,包括经度,纬度.
  250. //------------------------------
  251.      Send_COM1_Byte(gStatus);
  252.      Check_Record = gStatus;
  253.      Send_COM1_Byte(0xAA);
  254.      Check_Record ^= 0xAA;
  255.      Send_COM1_Byte(0x75);
  256.      Check_Record ^= 0x75;
  257.      Send_COM1_Byte(K_SEND_GPSDATA);
  258.      Check_Record ^= K_SEND_GPSDATA;
  259.      Send_COM1_Byte(0);
  260.      Check_Record ^= 0;
  261.      Send_COM1_Byte(10);
  262.      Check_Record ^= 10;
  263.      Send_COM1_Byte(0x00);
  264.      Check_Record ^= 0x00;
  265.      if(gGeneral_Flag&GPS_VALID_F_1)
  266.      {
  267.      Send_COM1_Byte(0x01);
  268.      Check_Record ^= 0x01;
  269.      }
  270. else
  271. {
  272. Send_COM1_Byte(0x00);
  273. Check_Record ^= 0x00;
  274. }
  275.      Send_COM1_Byte(gLongitude/0x1000000);
  276.      Check_Record ^= gLongitude/0x1000000;
  277.      Send_COM1_Byte(gLongitude%0x1000000/0x10000);
  278.      Check_Record ^= gLongitude%0x1000000/0x10000;
  279.      Send_COM1_Byte(gLongitude%0x10000/0x100);
  280.      Check_Record ^= gLongitude%0x10000/0x100;
  281.      Send_COM1_Byte(gLongitude%0x100);
  282.      Check_Record ^= gLongitude%0x100;
  283.      Send_COM1_Byte(gLatitude/0x1000000);
  284.      Check_Record ^= gLatitude/0x1000000;
  285.      Send_COM1_Byte(gLatitude%0x1000000/0x10000);
  286.      Check_Record ^= gLatitude%0x1000000/0x10000;
  287.      Send_COM1_Byte(gLatitude%0x10000/0x100);
  288.      Check_Record ^= gLatitude%0x10000/0x100;
  289.      Send_COM1_Byte(gLatitude%0x100);
  290.      Check_Record ^= gLatitude%0x100;
  291.      Send_COM1_Byte(gRecord_Status);
  292.      Check_Record ^= gRecord_Status;
  293.      Send_COM1_Byte(0);
  294.      Check_Record ^= 0;
  295.      Send_COM1_Byte(Check_Record); //校验核
  296.      Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a); //包尾
  297. }
  298. /**************************************************************************************
  299. 2,主控接收记录仪的驾驶员信息的响应(不管是主控主动查询的还是记录仪主动发送的,均为同一个命令字)
  300. 因为需要显示屏实时的显示当前记录仪IC卡中的驾驶员信息。所以有一些特殊的处理方式
  301. A,主控系统重新上电或者是系统程序重新启动的时候,则需要先进行一次进行采集记录仪当前驾驶员信息
  302. 的命令。
  303. B,主控已经开机,正常运行的过程中,如果此时记录仪的驾驶员信息更新,则需要记录仪主动发送一个
  304. 当前驾驶员信息的命令给主控。
  305. 不管是通过什么方式,主控系统只要得到一次当前记录仪的驾驶员信息,则需要将此驾驶员的信息
  306. 存储在FLASH中。并设置需要发送驾驶员信息给显示屏的标志。
  307. 在系统程序运行过程中,如果判断显示中断处于开机的状态,并有发送驾驶员标志给显示屏。
  308. **************************************************************************************/
  309. else if(nCmd==K_GET_DRIVEDATA_E_ECHO)
  310. {
  311. gReceive_Record_Info_Timer=0;
  312. SRAM_Init();
  313. SRAM_Write(SRAM_DRIVER_INFO_VAILD,VAILD_2);
  314. for(i=0;i<29;i++)
  315. {
  316. nTemp=SRAM_Read(SRAM_RECORD_S+7+i);
  317. SRAM_Write(SRAM_DRIVER_INFO_CODE+i,nTemp);
  318. }
  319. ///////////////////////////////
  320. gDisp_Buffer_Point=0;
  321. if(gDisp_Buffer_Point+37<=sizeof(gDisp_Buffer))
  322. {
  323. gDisp_Buffer[gDisp_Buffer_Point]=37;
  324. gDisp_Buffer_Point++;
  325. gDisp_Buffer[gDisp_Buffer_Point]=0;
  326. gDisp_Buffer_Point++;
  327. gDisp_Buffer[gDisp_Buffer_Point]='@';
  328. gDisp_Buffer_Point++;
  329. gDisp_Buffer[gDisp_Buffer_Point]='%';
  330. gDisp_Buffer_Point++;
  331. gDisp_Buffer[gDisp_Buffer_Point]=35;
  332. gDisp_Buffer_Point++;
  333. gDisp_Buffer[gDisp_Buffer_Point]=DISP_MAIN_IC_INFO_DOWN;
  334. gDisp_Buffer_Point++;
  335. SRAM_Init();
  336. for(i=0;i<29;i++)
  337. {
  338.   gDisp_Buffer[gDisp_Buffer_Point]=SRAM_Read(SRAM_DRIVER_INFO_CODE+i);
  339. gDisp_Buffer_Point++;
  340. }
  341. gDisp_Buffer[gDisp_Buffer_Point]='$';
  342. gDisp_Buffer_Point++;
  343. gDisp_Buffer[gDisp_Buffer_Point]='&';
  344. gDisp_Buffer_Point++;
  345. gGet_Driver_Info_Count=0;
  346. //gDriver_Info=WAIT_SEND_DRIVER_INFO;
  347. }
  348. /////////////////////////////////
  349. }
  350. /**************************************************************************************
  351. 3,收到主控向记录仪设置间隔记录的记录仪的响应
  352. **************************************************************************************/
  353. else if(nCmd==K_SET_INTERDISTANCE_ECHO)
  354. {
  355. gPublic_Flag|=SET_DISTANCE_OK_F_1;
  356. gSet_Distance_Info_Count=0;
  357. }
  358. /**************************************************************************************
  359. 4,收到主控向记录仪设置时间的记录仪的响应
  360. **************************************************************************************/
  361. else if(nCmd==G_SET_TIME_EHCO)
  362. {
  363. gPublic_Flag&=~SET_RECORD_TIME_F_1;
  364. gPublic_Flag|=CHECK_TIME_F_1;
  365. }
  366. break;
  367. }
  368. /*
  369. ========================================================================
  370. 二,消息类型为1的消息包(转移给中心的数据)
  371. 如果记录仪有数据发送给中心,则首先需要进行TCP登陆操作
  372. 如果登陆操作失败,则可以判断是否允许SMS的形式发送
  373. ========================================================================
  374. */
  375. case CENTER_TYPE:
  376. {
  377. gRecord_Data_Timer=0;
  378. gStatus2_Flag&=~RECORD_VAILD_F_1;
  379. gReceive_Record_Info_Timer=0;
  380. gStatus=CENTER_TYPE;
  381. gOther_Flag|=RECORD_DATA_F_1;
  382. gOther_Flag|=ALLOW_SEND_RECORD_F_1;
  383. SRAM_Init();
  384. SRAM_Write(SRAM_SEND_VAILD,VAILD_2);
  385. SRAM_Write(SRAM_SEND_LENGTH_H,(iLength-3)/0x100);
  386. SRAM_Write(SRAM_SEND_LENGTH_L,(iLength-3)%0x100);
  387. for(i=0;i<iLength-3;i++)
  388. {
  389. nTemp=SRAM_Read(SRAM_RECORD_S+1+i);
  390. SRAM_Write(SRAM_SEND_S+i,nTemp);
  391. }
  392. Judge_SMS_Way();
  393. break;
  394. }
  395. /*
  396. ========================================================================
  397. 三,消息类型为2的消息包(转移给显示屏的数据)
  398. ========================================================================
  399. */
  400. case DISP_TYPE:
  401. {
  402. gRecord_Data_Timer=0;
  403. gStatus2_Flag&=~RECORD_VAILD_F_1;
  404. gStatus=DISP_TYPE;
  405. if(gDisp_Buffer_Point+iLength+8<=sizeof(gDisp_Buffer))
  406. {
  407. gDisp_Buffer[gDisp_Buffer_Point]=iLength+8;
  408. gDisp_Buffer_Point++;
  409. gDisp_Buffer[gDisp_Buffer_Point]=0;
  410. gDisp_Buffer_Point++;
  411. gDisp_Buffer[gDisp_Buffer_Point]='@';
  412. gDisp_Buffer_Point++;
  413. gDisp_Buffer[gDisp_Buffer_Point]='%';
  414. gDisp_Buffer_Point++;
  415. gDisp_Buffer[gDisp_Buffer_Point]=iLength+6;
  416. gDisp_Buffer_Point++;
  417. gDisp_Buffer[gDisp_Buffer_Point]=DISP_ASK_RECORD_INFO_ECHO_DOWM;
  418. gDisp_Buffer_Point++;
  419. for(i=0;i<iLength;i++)
  420. {
  421. gDisp_Buffer[gDisp_Buffer_Point] = SRAM_Read(SRAM_RECORD_S+i) ;
  422. gDisp_Buffer_Point++;
  423. }
  424. gDisp_Buffer[gDisp_Buffer_Point]='$';
  425. gDisp_Buffer_Point++;
  426. gDisp_Buffer[gDisp_Buffer_Point]='&';
  427. gDisp_Buffer_Point++;
  428. }
  429. break;
  430. }
  431. default:
  432. break;
  433. }
  434. }
  435. /********************************************************
  436. * 函数名:Deal_Record_Command()
  437. 作用域:本地文件调用
  438. * 功能:
  439. * 参数:
  440. * 返回值:
  441. * 创建人:
  442. *
  443. * 修改历史:(每条详述)
  444. ********************************************************/
  445. unsigned char Check_Record_Time(void)
  446. {
  447. SRAM_Init();
  448. if(   (gGeneral_Flag&GPS_VALID_F_1)
  449. &&((gPublic_Flag&SET_RECORD_TIME_F_1)==0)
  450. &&(gSecond>=55) )
  451. {
  452. if(gYear!=SRAM_Read(SRAM_RECORD_S+8) ) return(1);
  453. else if(gMonth!=SRAM_Read(SRAM_RECORD_S+9)) return(1);
  454. else if(gDate !=SRAM_Read(SRAM_RECORD_S+10)) return(1);
  455. else if(gHour !=SRAM_Read(SRAM_RECORD_S+11)) return(1);
  456. else if(gMinute!=SRAM_Read(SRAM_RECORD_S+12)) return(1);
  457. else return(0);
  458. }
  459. else
  460. {
  461. return(0);
  462. }
  463. }