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

GPS编程

开发平台:

Others

  1. /********************************************************
  2. * 文件名:  Do_Other.C
  3. * 创建时间:2004年12月7日
  4. * 创建人:  
  5. * 版本号:  1.00
  6. * 功能:   针对一些其他外部操作,比如报警检测等等
  7. * 文件属性:公共文件
  8. * 修改历史:(每条详述)
  9. ********************************************************/
  10. #include <msp430x14x.h>
  11. #include <math.h>
  12. #include <stdlib.h>
  13. #include "Define_Bit.h"
  14. #include "Other_Define.h"
  15. #include "General.h"
  16. #include "Uart01.h"
  17. #include "W_Protocol.h"
  18. #include "D_Buffer.h"
  19. #include "SPI45DB041.h"
  20. #include "Sub_C.h"
  21. #include "TA_Uart.h"
  22. #include "M22_AT.h"
  23. #include "Do_Other.h"
  24. #include "Do_Handle.h"
  25. #include "Handle_Protocol.h"
  26. #include "Disp_Protocol.h"
  27. #include "Do_SRAM.h"
  28. #include "Record_Protocol.h"
  29. #include "Do_M22.h"
  30. /*
  31. #include "Main_Init.h"
  32. #include "Check_GSM.h"
  33. #include "Do_Reset.h"
  34. #include "Do_GPS.h"
  35. #include "Do_Disp.h"
  36. */
  37. //#define Debug_GSM_COM1
  38. unsigned int Circle_Data_GSM( unsigned char nCount,unsigned char nCommand,unsigned char nACK,unsigned int iCheckOutTemp );
  39. unsigned int Circle_Data_GSM_Sub(unsigned int iCheckOutTemp);
  40. unsigned int Dichotomy_PassData_First(unsigned int iFirst_Page,unsigned int iEnd_Page);
  41. unsigned long int Max_Result(unsigned long int x,unsigned long int y);
  42. unsigned long int Min_Result(unsigned long int x,unsigned long int y);
  43. unsigned char Check_Area_Alarm(unsigned char Num);
  44. unsigned char Account_Mid_Dot(double x1,double y1,double x2,double y2);
  45. unsigned char  Check_Line_Data(unsigned char S_Num_ID);
  46. //unsigned int ADC_NORMAIL_VCC[2]={ 0x0850,0x0EF0 };
  47. //unsigned int ADC_STOP_VCC[2]={ 0x01F0,0x02EF };
  48. /********************************************************
  49. 补充说明:ADC_NORMAIL_VCC[2]根据实际的电路(分压电阻的不同)在正常状态下检测ADC转换的数值的范围
  50.   ADC_STOP_VCC[2]根据实际电路,已经执行了制动后,检测ADC转换的数值的范围
  51. ********************************************************/
  52. void GSM_WORK_Data(void);
  53. void TCP_WORK_Data(unsigned int Timer,unsigned char nCommand);
  54. /********************************************************
  55. * 函数名:Do_Other_Module
  56. 作用域:外部文件调用
  57. * 功能:
  58. * 参数:
  59. * 返回值:
  60. * 创建人:
  61. *
  62. * 修改历史:(每条详述)
  63. ********************************************************/
  64. void Do_Other_Module(void)
  65. {
  66. static unsigned char Test_Alarm_Step=0;
  67. static unsigned char Ring_Test_Step=0;
  68. static unsigned char Test_Status_Step=0;
  69. unsigned int i=0,j=0,k=0,h=0;
  70. unsigned long int x=0,y=0;
  71. unsigned char Check_Result=0;
  72. unsigned char Area_All=0;
  73. unsigned char Check_Record=0;
  74. unsigned char Area_Out_Num=0;
  75. double Distance_Temp=0;
  76. unsigned long int Dis_Data=0;
  77. //每间隔30分钟验证存储在buffer1中的参数是否有效
  78. if(gCheck_Par_Timer>CHECK_SYS_PAR_TIME)
  79. {
  80. gCheck_Par_Timer=0;
  81. k=Check_ParNum();
  82. if( (k==0)||(k==1) )
  83. {
  84. i=Check_Vaild(GPRS_IP_ADDRESS1_2,GPRS_IP_ADDRESS1_CHECK_2);
  85. j=Check_Port();
  86. h=Check_Vaild(GPRS_APN_ADDRESS2_2,GPRS_APN_END_2);
  87. if( (i==1)||(j==1)||(h==1))
  88. {
  89. //事先得先保存短消息中心号码,防止操作擦除掉目标号码
  90. gGeneral_Buffer[CENTER_NUM_2]=SRAM_Read(CENTER_NUM_2);
  91. for(i=CENTER_NUM_2+1;i<=CENTER_NUM_CHECK_2;i++)
  92. {
  93. gGeneral_Buffer[i]=SRAM_Read(i);
  94. }
  95. OperateSPIEnd();
  96. Load_Flash_Par_Buffer1();
  97. }
  98. }
  99. if(gInternal_Flag&SET_CSCA_F_1) gTimer_CSQ=GSM_CHECKCSQ_TIME-2;
  100. }
  101. if(gCommon_Flag&ALLOW_HANGUP_PHONE_F_1)
  102. {
  103. gCommon_Flag&=~ALLOW_HANGUP_PHONE_F_1;
  104. SRAM_Init();
  105. SRAM_Write(PHONE_AT_2+0,VAILD_2);
  106. SRAM_Write(PHONE_AT_2+1,H_HUNGUP);
  107. SRAM_Write(PHONE_AT_2+2,0);
  108. Send_COM3_Load(4,MAIN_HANG_UP,0);
  109. gSys_Handle=MAIN_HANG_UP;
  110. }
  111. /********************************************************
  112. A0;增加处理在来电或者拨出状态下的超时处理
  113. ********************************************************/
  114. if(gHangUp_Timer>HANGUP_COUNT)
  115. {
  116. if( (gGeneral_Flag&RING_F_1)||(gGeneral_Flag&DAILING_UP_F_1)||(gGeneral_Flag&MONITOR_ON_F_1) )
  117. {
  118. gHangUp_Timer=0;
  119. SRAM_Init();
  120. SRAM_Write(PHONE_AT_2+0,VAILD_2);
  121. SRAM_Write(PHONE_AT_2+1,H_HUNGUP);
  122. SRAM_Write(PHONE_AT_2+2,0);
  123. Send_COM3_Load(4,MAIN_HANG_UP,0);
  124. gSys_Handle=MAIN_HANG_UP;
  125. }
  126. }
  127. /********************************************************
  128. A1;如果未接收到登陆响应,则进行再次发送登陆命令
  129. ********************************************************/
  130. if(   (gLand_Interval_Timer>M22_LAND_TIME)
  131. &&((gGeneral_Flag&LAND_TCP_SUCCESS_F_1)==0) )
  132. {
  133. gOther_Flag|=ALLOW_SENDLAND_F_1;
  134. gLand_Interval_Timer=0;
  135. gWait_Land_Echo_Count++;
  136. if(gWait_Land_Echo_Count>10)
  137. {
  138. gWait_Land_Echo_Count=0;
  139. TCP_Land_Error_Return();
  140. }
  141. }
  142. /********************************************************
  143. A2;清除相关数据
  144. ********************************************************/
  145. if( ((gGeneral_Flag&TCP_PHONE_F_1)==0)&&(gDTMF_SAVE[0]!=0 ) )
  146. {
  147. for(i=0;i<sizeof(gDTMF_SAVE);i++) gDTMF_SAVE[i]=0;
  148. }
  149. /********************************************************
  150. A2-1;上报数据的状态位,1,无周期数据,2,按时间间隔上报数据
  151. 3,按行使间隔上报数据,4,报警类型数据
  152. ********************************************************/
  153. //1,无周期数据
  154. if(gCycle_Send_Status==NOP_DATA)
  155. {
  156. gStatus3_Flag&=~M22_WORK_0_F_1;
  157. gStatus3_Flag&=~M22_WORK_1_F_1;
  158. }
  159. //2,按时间间隔上报数据
  160. else if(gCycle_Send_Status==TRACK_DATA_TIME)
  161. {
  162. gStatus3_Flag|=M22_WORK_0_F_1;
  163. gStatus3_Flag&=~M22_WORK_1_F_1;
  164. }
  165. //3,按行使间隔上报数据
  166. else if(gCycle_Send_Status==TRACK_DATA_DISTANCE)
  167. {
  168. gStatus3_Flag&=~M22_WORK_0_F_1;
  169. gStatus3_Flag|=M22_WORK_1_F_1;
  170. }
  171. //4,报警类型的上报数据
  172. else if(gCycle_Send_Status==ALARM_DATA)
  173. {
  174. gStatus3_Flag|=M22_WORK_0_F_1;
  175. gStatus3_Flag|=M22_WORK_1_F_1;
  176. }
  177. /********************************************************
  178. A2-2;进行线路报警的标志
  179. ********************************************************/
  180. if(   (gCommon_Flag&ALLOW_LINE_DATA_F_1)
  181. &&(gCommon_Flag&ALLOW_LINE_DIS_F_1)  )
  182. {
  183. gStatus3_Flag|=LINE_LIMIT_F_1;
  184. }
  185. else
  186. {
  187. gStatus3_Flag&=~LINE_LIMIT_F_1;
  188. if(gAlarm_Type==OVER_LINE_ALARM)
  189. {
  190. gAlarm_Type=NOP_ALARM;
  191. gCycle_Send_Status=NOP_DATA;
  192. gAlarm_Count=0;
  193. gStatus2_Flag&=~ROB_ALARM_F_1;
  194. gCommon_Flag&=~STOP_OVERLINE_F_1;
  195. gCircle_Timer=0;
  196. gOver_Line_Count=0;
  197. }
  198. }
  199. /********************************************************
  200. A3;每间隔3秒向显示终端发送一次系统状态(GPS的数据有效果无效,GSM的信号强度,TCP的在线状态,当前速度值)
  201. 已经转移到下面的速度处理部分,以1秒发送一个速度处理,已经放在下一个部分处理
  202. ********************************************************/
  203. /********************************************************
  204. A3-1;每间隔10秒向手柄发送一个场强信号
  205. ********************************************************/
  206. if(gHandle_Single_Count>10)
  207. {
  208. if( (gM22_Status==TCP_ONLINE_WORK)&&(gSignal<10) )  gSignal=30;
  209. gHandle_Single_Count=0;
  210. Send_Handle_Signal(gSignal);
  211. }
  212. /********************************************************
  213. A4;如果在接收记录仪大量数据的存储区中还有未发送完的数据,则在这里处理
  214. ********************************************************/
  215. if(   (gOther_Flag&RECORD_DATA_F_1)
  216. &&(gSend_RecordData_Timer>=3)
  217. &&((gOther_Flag&ALLOW_SEND_RECORD_F_1)==0)  )
  218. {
  219. gSend_RecordData_Timer=0;
  220. gOther_Flag|=ALLOW_SEND_RECORD_F_1;
  221. }
  222. /********************************************************
  223. A4;处理每一秒速度相关的处理
  224. ********************************************************/
  225. if(gDo_Speed_Count>=1)
  226. {
  227. gDo_Speed_Count=0;
  228. i=0;
  229. if( (gPublic_Flag&RECORD_NULL_F_1)==0 )
  230. {
  231. gSpeed_Disp=gSpeed_Record;
  232. gSpeed=(gSpeed_Record/3.6)+0.5;
  233. i=1;
  234. }
  235. else if(  (gPublic_Flag&RECORD_NULL_F_1)
  236. &&( (gPublic_Flag&GPS_NULL_F_1)==0) )
  237. {
  238. gSpeed_Disp=(gSpeed_Gps*3.6)+0.5;
  239. gSpeed=gSpeed_Gps;
  240. i=1;
  241. }
  242. if(i==1)
  243. {
  244. //1;判断与超速报警相关的处理
  245. if( (gSpeed>=gMAX_Speed)&&(gSpeed<80)&&(gMAX_Speed>=10) )
  246. {
  247. gOver_Speed_Count++;
  248. }
  249. else
  250. {
  251. gOver_Speed_Count=0;
  252. if(gAlarm_Type==OVER_SPEED_ALARM) gInternal_Flag|=STOP_OVERSPEED_F_1;
  253. }
  254. //2;判断关于制动方面的处理,在GPS数据有效的状态下,判断速度是否小于某一个值,并且持续5秒
  255. if( (gSpeed==0)||(gSpeed<=2) ) gSTOP_Speed_Count++;
  256. else gSTOP_Speed_Count=0;
  257. }
  258. //每秒向显示终端发送数据
  259. //===================================================
  260. if(  (gDisp_Buffer_Point+14<=sizeof(gDisp_Buffer))
  261.    &&((gCommon_Flag&ALLOW_OUT_DISP_F_1)==0)   )
  262. {
  263. gDisp_Buffer[gDisp_Buffer_Point]=14;
  264. gDisp_Buffer_Point++;
  265. gDisp_Buffer[gDisp_Buffer_Point]=0;
  266. gDisp_Buffer_Point++;
  267. gDisp_Buffer[gDisp_Buffer_Point]='@';
  268. gDisp_Buffer_Point++;
  269. gDisp_Buffer[gDisp_Buffer_Point]='%';
  270. gDisp_Buffer_Point++;
  271. gDisp_Buffer[gDisp_Buffer_Point]=12;
  272. gDisp_Buffer_Point++;
  273. gDisp_Buffer[gDisp_Buffer_Point]=DISP_MAIN_SYS_STATUS_DOWN;
  274. gDisp_Buffer_Point++;
  275. if(gGeneral_Flag&GPS_VALID_F_1)
  276. {
  277. gDisp_Buffer[gDisp_Buffer_Point]=0x01; //GPS有效
  278. }
  279. else
  280. {
  281. gDisp_Buffer[gDisp_Buffer_Point]=0x00; //GPS无效
  282. }
  283. gDisp_Buffer_Point++;
  284. gDisp_Buffer[gDisp_Buffer_Point]=gSignal; //信号强度
  285. gDisp_Buffer_Point++;
  286. if(gM22_Status==TCP_ONLINE_WORK)
  287. {
  288. gDisp_Buffer[gDisp_Buffer_Point]=1; //TCP的在线状态
  289. }
  290. else
  291. {
  292. gDisp_Buffer[gDisp_Buffer_Point]=0;
  293. }
  294. gDisp_Buffer_Point++;
  295. gDisp_Buffer[gDisp_Buffer_Point]=gSpeed_Disp; //当前速度
  296. gDisp_Buffer_Point++;
  297. gDisp_Buffer[gDisp_Buffer_Point]=gDisp_Status; //预留
  298. gDisp_Buffer_Point++;
  299. gDisp_Buffer[gDisp_Buffer_Point]=0; //预留
  300. gDisp_Buffer_Point++;
  301. gDisp_Buffer[gDisp_Buffer_Point]='$';
  302. gDisp_Buffer_Point++;
  303. gDisp_Buffer[gDisp_Buffer_Point]='&';
  304. gDisp_Buffer_Point++;
  305. }
  306. }
  307. /********************************************************
  308. A5; 判断是否产生超速度报警的条件和结束超速报警的条件
  309. ********************************************************/
  310. if( gOver_Speed_Count>4 )
  311. {
  312. gOver_Speed_Count=0;
  313. if(gAlarm_Type==NOP_ALARM)
  314. {
  315. gAlarm_Type = OVER_SPEED_ALARM;
  316. gCycle_Send_Status=ALARM_DATA;
  317. gCircle_Timer=0;
  318. gCycle_Alarm=ALARM_CIRCLE_TIME;
  319. gSMS_ACK[ALARM_ACK]=0;
  320. Circle_Data_TCP(ALARM_UP,gSMS_ACK[ALARM_ACK]);
  321. Send_Over_Alarm_to_Disp(gAlarm_Type);
  322. gInternal_Flag|=SEND_CIRCLE_F_1;
  323. Judge_SMS_Way();
  324. }
  325. }
  326. else if( (gAlarm_Type==OVER_SPEED_ALARM)&&(gInternal_Flag&STOP_OVERSPEED_F_1) )
  327. {
  328. gAlarm_Type=NOP_ALARM;
  329. gCycle_Send_Status=NOP_DATA;
  330. gAlarm_Count=0;
  331. gStatus2_Flag&=~ROB_ALARM_F_1;
  332. gInternal_Flag&=~STOP_OVERSPEED_F_1;
  333. gCircle_Timer=0;
  334. gOver_Speed_Count=0;
  335. Circle_Data_TCP(VEHICLE_RUNDATA_UP,0);
  336. gInternal_Flag|=SEND_CIRCLE_F_1;
  337. Judge_SMS_Way();
  338. }
  339. /********************************************************
  340. A6;判断是否产生疲劳驾驶报警和结束疲劳驾驶报警的条件
  341. ********************************************************/
  342. //A6-1:产生疲劳驾驶报警的条件
  343. if( gOver_Tire_Count>4 )
  344. {
  345. gOver_Speed_Count=0;
  346. if(gAlarm_Type==NOP_ALARM)
  347. {
  348. gAlarm_Type = OVER_TIRE_ALARM;
  349. gCycle_Send_Status=ALARM_DATA;
  350. gCircle_Timer=0;
  351. gCycle_Alarm=ALARM_CIRCLE_TIME;
  352. gSMS_ACK[ALARM_ACK]=0;
  353. Circle_Data_TCP(ALARM_UP,gSMS_ACK[ALARM_ACK]);
  354. Send_Over_Alarm_to_Disp(gAlarm_Type);
  355. gInternal_Flag|=SEND_CIRCLE_F_1;
  356. Judge_SMS_Way();
  357. }
  358. }
  359. //A6-2:结束疲劳驾驶报警的条件
  360. else if (gStop_Tire_Count>4)
  361. {
  362. gStop_Tire_Count=0;
  363. if(gAlarm_Type==OVER_TIRE_ALARM)
  364. {
  365. gAlarm_Type = NOP_ALARM;
  366. gCycle_Send_Status = NOP_DATA;
  367. gAlarm_Count=0;
  368. gCircle_Timer=0;
  369. gCycle_Alarm=0;
  370. Circle_Data_TCP(VEHICLE_RUNDATA_UP,0);
  371. gInternal_Flag|=SEND_CIRCLE_F_1;
  372.   Judge_SMS_Way();
  373. }
  374. }
  375. /********************************************************
  376. A7;如果ACC检测线处于开启的状态,则需要进行开启模块电源的操作
  377. 但如果处于关闭状态,则进行时间统计,如果超过48小时仍然为关闭状态,
  378. 则需要进行关闭两个模块的电源供电,以达到节省用电的目的
  379. ********************************************************/
  380. //ACC检测处于开启状态
  381. if(gStatus1_Flag&ACC_ON_F_1)
  382. {
  383. if(   (gPublic_Flag&ACCOFF_TRACK_F_1)
  384. ||(gPublic_Flag&ACCOFF_OK_F_1) )
  385. {
  386. if((gCommon_Flag&ALLOW_RESET_MCU_F_1)==0)
  387. {
  388. P6OUT&=~POWER_ON_OFF;
  389. gCommon_Flag|=ALLOW_RESET_MCU_F_1;
  390. gRload_Flash_Par_Timer=RLAOD_FLASH_TIME-5;
  391. }
  392. //      Send_COM1_String((unsigned char *)POWER_OFF,sizeof(POWER_OFF));
  393. // gOther_Flag|=RESET_PROGRAME_F_1;
  394. // while(1);
  395. }
  396. else if(gPublic_Flag&ACC_OFF_UP_F_1)
  397. {
  398. gPublic_Flag&=~ACC_OFF_UP_F_1;
  399. }
  400. }
  401. //ACC检测处于关闭状态
  402. else
  403. {
  404. //1,先发送一个信息上传
  405. if(   ((gPublic_Flag&ACC_OFF_UP_F_1)==0)
  406. &&((gPublic_Flag&ACCOFF_TRACK_F_1)==0)
  407. &&((gPublic_Flag&ACCOFF_OK_F_1)==0)
  408. &&(gCycle_Send_Status!=WATCH_DATA)
  409. &&(gCycle_Send_Status!=ALARM_DATA) )
  410. {
  411. gPublic_Flag|=ACC_OFF_UP_F_1;
  412. ACC_OFF_Timer=0;
  413. Circle_Data_TCP(VEHICLE_RUNDATA_UP,0);
  414. gInternal_Flag|=SEND_CIRCLE_F_1;
  415. Send_COM1_String( (unsigned char *)OFF_ACC,sizeof(OFF_ACC) );
  416.   Judge_SMS_Way();
  417. }
  418. //2,ACC持续关闭时间达到满足改变上传行车轨迹的时间间隔
  419. else if(  (ACC_OFF_Timer<ACC_LASTOFF_TIME)
  420.         &&(ACC_OFF_Timer>=ACC_CHANGEOFF_TIME)
  421. &&(gPublic_Flag&ACC_OFF_UP_F_1 )
  422. &&((gPublic_Flag&ACCOFF_TRACK_F_1)==0)
  423. &&((gPublic_Flag&ACCOFF_OK_F_1)==0)
  424. &&(gCycle_Send_Status!=WATCH_DATA)
  425. &&(gCycle_Send_Status!=ALARM_DATA)  )
  426. {
  427. if(   (gCycle_TCP<ACCOFF_TRACK_TIME)
  428. &&(gCycle_TCP>0) )
  429. {
  430. gCycle_TCP=ACCOFF_TRACK_TIME;
  431. }
  432. gPublic_Flag|=ACCOFF_TRACK_F_1;
  433. }
  434. //3,持续规定的一段时间后,则需要关闭模块电源
  435. else if(   (ACC_OFF_Timer>ACC_LASTOFF_TIME)
  436. &&(gPublic_Flag&ACC_OFF_UP_F_1)
  437. &&(gPublic_Flag&ACCOFF_TRACK_F_1 )
  438. &&((gPublic_Flag&ACCOFF_OK_F_1)==0)
  439. &&(gCycle_Send_Status!=WATCH_DATA)
  440. &&(gCycle_Send_Status!=ALARM_DATA)  )
  441. {
  442. P6OUT|=POWER_ON_OFF;
  443. gPublic_Flag|=ACCOFF_OK_F_1;
  444. gReset_M22_On_Setp=0;
  445. gGeneral_Flag&=~RESET_GSM_ON_F_1;
  446. gM22_Status=GSM_WORK;
  447. gGeneral_Flag&=~LAND_TCP_SUCCESS_F_1;
  448. gGSM_Oper_Type=GSM_PHONE;
  449. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  450. gPhone_Step=0;gTimer_GSM_AT=0;
  451. }
  452. //3,关闭模块电源
  453. else if( gPublic_Flag&ACCOFF_OK_F_1 )
  454. {
  455. P6OUT|=POWER_ON_OFF;
  456. gGeneral_Flag&=~OFF_M22_F_1;
  457. gGeneral_Flag&=~OFF_GPS_F_1;
  458. gM22_GSM_ECHO_Timer=0;
  459. gFF0D_Receive_Timer=0;
  460. gGPS_No_Output_Timer=0;
  461. gGPS_Invaild_Timer=0;
  462. gGeneral_Flag&=~RESET_GSM_ON_F_1;
  463. }
  464. }
  465. /********************************************************
  466. A8;判断是否可以执行制动或者解除制动操作,制动方面的信息不存储在Flash中
  467. ********************************************************/
  468. //1,是否允许执行制动操作
  469. /*
  470. if( (gM22_Stop_Status==ALLOW_SET_STOP)&&(gSTOP_Speed_Count>=5) )
  471. {
  472. gM22_Stop_Status=ASK_SET_STOP;
  473. P6OUT|=STOP_Q1;
  474. P6OUT|=STOP_Q2;
  475. P6OUT|=STOP_Q1;
  476. P6OUT|=STOP_Q2;
  477. gOK_Count=0;gError_Count=0;
  478. }
  479. //2,是否允许执行解除制动操作
  480. else if(gM22_Stop_Status==ALLOW_FREE_STOP)
  481. {
  482. gM22_Stop_Status=ASK_FREE_STOP;
  483. P6OUT&=~STOP_Q1;
  484. P6OUT&=~STOP_Q2;
  485. P6OUT&=~STOP_Q1;
  486. P6OUT&=~STOP_Q2;
  487. gOK_Count=0;gError_Count=0;
  488. }
  489. */
  490. /********************************************************
  491. A9; 制动结果的检测和判断
  492. ********************************************************/
  493. if(gCheck_Stop_Timer>500)
  494. {
  495. gCheck_Stop_Timer=0;
  496. /*
  497. if(   (gM22_Stop_Status==ASK_SET_STOP) //执行制动动作的状态下
  498. ||(gM22_Stop_Status==STOP_STATUS) ) //已经制动的状态下
  499. {
  500. if(P2IN&CHECK_ON_OFF) gOK_Count++;
  501. else gError_Count++;
  502. if( (gOK_Count+gError_Count)>60)
  503. {
  504. if(gOK_Count>45)
  505. {
  506. gStatus1_Flag|=STOP_SUCCESS_F_1;
  507. gM22_Stop_Status=STOP_STATUS;
  508. }
  509. else
  510. {
  511. gStatus1_Flag&=~STOP_SUCCESS_F_1;
  512. gM22_Stop_Status=NOP_READY;
  513. }
  514. gOK_Count=0;gError_Count=0;
  515. }
  516. }
  517. else if(   (gM22_Stop_Status==ASK_FREE_STOP) //执行解除制动动作的状态下
  518.  ||(gM22_Stop_Status==NOP_READY) ) //已经确定解除制动的状态下
  519. {
  520. if( (P2IN&CHECK_ON_OFF)==0 ) gOK_Count++;
  521. else gError_Count++;
  522. if( (gOK_Count+gError_Count)>60)
  523. {
  524. if(gOK_Count>45)
  525. {
  526. gStatus1_Flag&=~STOP_SUCCESS_F_1;
  527. gM22_Stop_Status=NOP_READY;
  528. }
  529. else
  530. {
  531. gStatus1_Flag|=STOP_SUCCESS_F_1;
  532. gM22_Stop_Status=STOP_STATUS;
  533. }
  534. gOK_Count=0;gError_Count=0;
  535. }
  536. }
  537. */
  538. }
  539. /********************************************************
  540. A12;判断周期数据发送的状态(这里是处理如果有行车轨迹,后来又有了类似报警,后来报警解除后的行车轨迹的继续上传的操作)
  541. ********************************************************/
  542. if( (gGeneral_Flag&TCP_IP_VALID_1)&&((gON_OFF_Temp0&TCP_LAND_ON_OFF_1)==0) )
  543. {
  544. if( (gCycle_TCP>0)&&(gCycle_Send_Status==NOP_DATA) )
  545. {
  546. gCycle_Send_Status=TRACK_DATA_TIME;gCircle_Timer=0;
  547. gInternal_Flag&=~SEND_CIRCLE_F_1;gGSM_Work_Count=0;gCheck_Data=0;
  548. }
  549. else if(    (gCycle_Distance>0)
  550.   &&(gCycle_Send_Status==NOP_DATA) )
  551. {
  552. gCycle_Send_Status=TRACK_DATA_DISTANCE;gCircle_Timer=0;
  553. gInternal_Flag&=~SEND_CIRCLE_F_1;gGSM_Work_Count=0;gCheck_Data=0;
  554. }
  555. }
  556. else
  557. {
  558. if(   (gCycle_GSM>0)
  559. &&(gCycle_Send_Status==NOP_DATA) )
  560. {
  561. gCycle_Send_Status=TRACK_DATA_TIME;gCircle_Timer=0;
  562. gInternal_Flag&=~SEND_CIRCLE_F_1;gGSM_Work_Count=0;gCheck_Data=0;
  563. }
  564. else if(   (gCycle_Distance>0)
  565.  &&(gCycle_Send_Status==NOP_DATA) )
  566. {
  567. gCycle_Send_Status=TRACK_DATA_DISTANCE;gCircle_Timer=0;
  568. gInternal_Flag&=~SEND_CIRCLE_F_1;gGSM_Work_Count=0;gCheck_Data=0;
  569. }
  570. }
  571. /********************************************************
  572. A13;在TCP在线的工作方式下,如果检测到有来电(通过管脚电平变化的检测)
  573. ********************************************************/
  574. if(gM22_Status==TCP_ONLINE_WORK)
  575. {
  576. if(Ring_Test_Step==0)
  577. {
  578. if( (P1IN&RING_TEST)==0 )
  579. {
  580. Ring_Test_Step=1;
  581. gRing_Test_Timer=0;
  582. }
  583. }
  584. else if(Ring_Test_Step==1)
  585. {
  586. if(P1IN&RING_TEST)
  587. {
  588. Ring_Test_Step=0;
  589. gRing_Test_Timer=0;
  590. }
  591. else if(gRing_Test_Timer>RING_TEST_TIME)
  592. {
  593. if( (gGeneral_Flag&TCP_PHONE_F_1)==0 )
  594. {
  595. if((gGeneral_Flag&RING_F_1)==0) gHangUp_Timer=0;
  596. gGeneral_Flag|=TCP_PHONE_F_1;
  597. gStatus1_Flag|=PHONE_ONLINE_F_1;
  598. gGeneral_Flag|=RING_F_1;
  599. }
  600. Ring_Test_Step=0;gRing_Test_Timer=0;
  601. }
  602. }
  603. else
  604. {
  605. Ring_Test_Step=0;
  606. gRing_Test_Timer=0;
  607. }
  608. }
  609. /********************************************************
  610. A14;如果判断接收驾驶员信息未成功,则需要周期向记录仪发送查询驾驶员信息。
  611. 直到设置成功为止
  612. 这里取消GPS主动查询驾驶员信息的程序操作
  613. ********************************************************/
  614. /*
  615. //1,判断是否需要查询记录仪的驾驶员信息数据
  616. if(   (gGet_Driver_Info_Count>GET_DRIVER_INFO_TIME)
  617. &&(gDriver_Info==READY_READ_DRIVER_INFO)
  618. &&(gStatus==NORMAL_TYPE)   )
  619. {
  620.      Send_COM1_Byte(gStatus);
  621.      Check_Record = gStatus;
  622.      Send_COM1_Byte(0xAA);
  623.      Check_Record ^= 0xAA;
  624.      Send_COM1_Byte(0x75);
  625.      Check_Record ^= 0x75;
  626.      Send_COM1_Byte(K_GET_DRIVEDATA_E_ECHO);
  627.      Check_Record ^= K_GET_DRIVEDATA_E_ECHO;
  628.      Send_COM1_Byte(0x00);
  629.      Check_Record ^= 0;
  630.      Send_COM1_Byte(0x00);
  631.      Check_Record ^= 0;
  632.      Send_COM1_Byte(0x00);
  633.      Check_Record ^= 0;
  634.      Send_COM1_Byte(Check_Record); //校验核
  635.      Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a); //包尾
  636.      gGet_Driver_Info_Count=0;
  637.      gDriver_Info=WAIT_RETURN_DRIVER_INFO;
  638. }
  639. //2,等待查询记录仪的驾驶员信息返回失败,则需要从新开始计算时间等下一个周期的查询
  640. else if(  (gDriver_Info==WAIT_RETURN_DRIVER_INFO)
  641. &&(gGet_Driver_Info_Count>WAIT_RETURNINFO_TIME) )
  642. {
  643. gGet_Driver_Info_Count=0;
  644. gDriver_Info=READY_READ_DRIVER_INFO;
  645. }
  646. */
  647. //3,判断是否满足需要想显示终端发送驾驶员信息的数据条件
  648. /*
  649. if(   (gGet_Driver_Info_Count>READY_SENDINFO_TIME)
  650.  &&(gDriver_Info==GET_DRIVER_INFO)
  651.  &&(gInternal_Flag&DISP_ON_F_1)     )
  652. {
  653. //发送记录仪的驾驶员当前信息给显示屏
  654. if(gDisp_Buffer_Point+37<=sizeof(gDisp_Buffer))
  655. {
  656. gDisp_Buffer[gDisp_Buffer_Point]=37;
  657. gDisp_Buffer_Point++;
  658. gDisp_Buffer[gDisp_Buffer_Point]=0;
  659. gDisp_Buffer_Point++;
  660. gDisp_Buffer[gDisp_Buffer_Point]='@';
  661. gDisp_Buffer_Point++;
  662. gDisp_Buffer[gDisp_Buffer_Point]='%';
  663. gDisp_Buffer_Point++;
  664. gDisp_Buffer[gDisp_Buffer_Point]=35;
  665. gDisp_Buffer_Point++;
  666. gDisp_Buffer[gDisp_Buffer_Point]=DISP_MAIN_IC_INFO_DOWN;
  667. gDisp_Buffer_Point++;
  668. SRAM_Init();
  669. for(i=0;i<29;i++)
  670. {
  671.   gDisp_Buffer[gDisp_Buffer_Point]=SRAM_Read(SRAM_DRIVER_INFO_CODE+i);
  672. gDisp_Buffer_Point++;
  673. }
  674. gDisp_Buffer[gDisp_Buffer_Point]='$';
  675. gDisp_Buffer_Point++;
  676. gDisp_Buffer[gDisp_Buffer_Point]='&';
  677. gDisp_Buffer_Point++;
  678. gGet_Driver_Info_Count=0;
  679. gDriver_Info=WAIT_SEND_DRIVER_INFO;
  680. }
  681. }
  682. //4,如果等待显示屏幕接收到驾驶员信息超时间无响应,则应该重新发送
  683. else if(   (gGet_Driver_Info_Count>WAIT_DISPINFO_TIME)
  684.  &&(gDriver_Info==WAIT_SEND_DRIVER_INFO)  )
  685. {
  686. gGet_Driver_Info_Count=0;
  687. gDriver_Info=GET_DRIVER_INFO;
  688. }
  689. */
  690. /********************************************************
  691. A15,判断接收记录仪是否长时间没有向主控发送数据
  692. ********************************************************/
  693. if( gRecord_Data_Timer > OVER_RECORD_DATA_TIME )
  694. {
  695. //超时,如果记录仪显示为正常状态,则认为记录仪故障
  696. if( (gStatus2_Flag&RECORD_VAILD_F_1)==0 )
  697. {
  698. gStatus2_Flag|=RECORD_VAILD_F_1;
  699. gRecord_Status=0;
  700. }
  701. }
  702. /********************************************************
  703. A16,每间隔12个小时,需要重新启动程序一次
  704. 这部分的功能已经转移到中断中去执行
  705. ********************************************************/
  706. /********************************************************
  707. A17;如果需要向记录仪发送设置间隔距离的是否成功,如果成功收到记录仪
  708. 的响应,则不需要进行此操作,如果超过5秒仍然未收到响应,则间隔发送设置命令
  709. 连续发送5次,如果仍然无响应,则停止发送
  710. ********************************************************/
  711. if(   ((gPublic_Flag&SET_DISTANCE_OK_F_1)==0)
  712. &&(gSet_Distance_Info_Count>WAIT_DISPINFO_TIME)
  713. &&(gStatus==NORMAL_TYPE)
  714. &&(gSend_Record_Count<5) )
  715. {
  716. gSend_Record_Count++;
  717.      Send_COM1_Byte(gStatus);
  718.      Check_Record = gStatus;
  719.      Send_COM1_Byte(0xAA);
  720.      Check_Record ^= 0xAA;
  721.      Send_COM1_Byte(0x75);
  722.      Check_Record ^= 0x75;
  723.      Send_COM1_Byte(K_SET_INTERDISTANCE);
  724.      Check_Record ^= K_SET_INTERDISTANCE;
  725.      Send_COM1_Byte(0x00);
  726.      Check_Record ^= 0;
  727.      Send_COM1_Byte(0x02); //长度
  728.      Check_Record ^= 0x02;
  729.      Send_COM1_Byte(0x00); //预留
  730.      Check_Record ^= 0;
  731.      Send_COM1_Byte(gCycle_Distance/0x100); //距离值的高位字节
  732.      Check_Record ^= gCycle_Distance/0x100;
  733.      Send_COM1_Byte(gCycle_Distance%0x100); //距离值的低位字节
  734.      Check_Record ^= gCycle_Distance%0x100;
  735.      Send_COM1_Byte(Check_Record); //校验核
  736.      Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a); //包尾
  737.      gSet_Distance_Info_Count=0;
  738. }
  739. /********************************************************
  740. A18;判断是否向显示屏发送显示屏上行信息的响应,
  741. ********************************************************/
  742. if(gPublic_Flag&DISP_SEND_INFO_F_1)
  743. {
  744. i=SRAM_Read(OTHER_SMS_2);
  745. if(i==VAILD_2);
  746. else
  747. {
  748. gPublic_Flag &= ~DISP_SEND_INFO_F_1;
  749. if(gDisp_Buffer_Point+7+2<=sizeof(gDisp_Buffer))
  750. {
  751. gDisp_Buffer[gDisp_Buffer_Point]=7+2;
  752. gDisp_Buffer_Point++;
  753. gDisp_Buffer[gDisp_Buffer_Point]=0;
  754. gDisp_Buffer_Point++;
  755. gDisp_Buffer[gDisp_Buffer_Point]='@';
  756. gDisp_Buffer_Point++;
  757. gDisp_Buffer[gDisp_Buffer_Point]='%';
  758. gDisp_Buffer_Point++;
  759. gDisp_Buffer[gDisp_Buffer_Point]=7;
  760. gDisp_Buffer_Point++;
  761. gDisp_Buffer[gDisp_Buffer_Point]=DISP_MAIN_INFO_ECHO_DOWN;
  762. gDisp_Buffer_Point++;
  763. gDisp_Buffer[gDisp_Buffer_Point]=COMMAND_OK;
  764. gDisp_Buffer_Point++;
  765. gDisp_Buffer[gDisp_Buffer_Point]='$';
  766. gDisp_Buffer_Point++;
  767. gDisp_Buffer[gDisp_Buffer_Point]='&';
  768. gDisp_Buffer_Point++;
  769. }
  770. }
  771. }
  772. /********************************************************
  773. B1;关于判断ACC检测和车载的空载/重载方面的程序检测
  774. 补充说明:
  775. 1, Test_Status_Step=0的时候检测ACC的检测线的状态,分为两种情况,如果此时ACC检测线处于开启状态标志或者关闭状态的标志,
  776. 则需要检测ACC检测线的实际状态量是否发生变化,如果没有,则直接设置Test_Status_Step=2,如果有则设置Test_Status_Step=1。
  777. 2,Test_Status_Step=1的时候,则说明检测到ACC的检测线实际状态量有变化,则在这个步骤中检测状态量的变化是否持续符合条件的时间
  778. 如果检测符合时间条件,则改变ACC的状态量标志,设置Test_Status_Step=0;
  779. 3,Test_Status_Step=2的时候,则说明ACC的检测无变化,则进行车载的空载/重载线的状态检测,如果分为两种情况如果此时检测空载/重载是处于空或者
  780. 重,则需要检测空载/重载线的实际状态量是否改变,如过检测到有改变则设置Test_Status_Step=3.否则设置Test_Status_Step=0
  781. 4,Test_Status_Step=3的时候,则说明空载/重载线检测到有所变化,则在这个步骤中检测状态量的变化持续时间是否符合要求,如果符合要求
  782. 则改变空载/重载线的状态量的标志。同时设置Test_Status_Step=0
  783. ********************************************************/
  784. if(Test_Status_Step==0)
  785. {
  786. //1,如果ACC检测线开启标志的状态下,检测是否ACC检测线关闭
  787. if(gStatus1_Flag&ACC_ON_F_1)
  788. {
  789. if(P3IN&ACC_TEST)
  790. {
  791. gTest_Status_Timer=0;
  792. Test_Status_Step=1;
  793. }
  794. }
  795. //2,如果已经存在ACC线关闭标志的状态下,检测是否ACC检测线开启
  796. else
  797. {
  798. if( (P3IN&ACC_TEST)==0)
  799. {
  800. gTest_Status_Timer=0;
  801. Test_Status_Step=2;
  802. }
  803. }
  804. }
  805. else if(Test_Status_Step==1)
  806. {
  807. if( (P3IN&ACC_TEST)==0 )
  808. {
  809. gTest_Status_Timer=0;
  810. Test_Status_Step=0;
  811. }
  812. //判断延迟时间内检测到,则认为ACC关闭
  813. else if(gTest_Status_Timer>TEST_ACC_TIME)
  814. {
  815. gStatus1_Flag&=~ACC_ON_F_1;
  816. gTest_Status_Timer=0;
  817. Test_Status_Step=0;
  818. }
  819. }
  820. else if(Test_Status_Step==2)
  821. {
  822. if(P3IN&ACC_TEST)
  823. {
  824. gTest_Status_Timer=0;
  825. Test_Status_Step=0;
  826. }
  827. //判断延迟时间内检测到,则认为ACC开启
  828. else if(gTest_Status_Timer>TEST_ACC_TIME)
  829. {
  830. gStatus1_Flag|=ACC_ON_F_1;
  831. gTest_Status_Timer=0;
  832. Test_Status_Step=0;
  833. }
  834. }
  835. else
  836. {
  837. gTest_Status_Timer=0;
  838. Test_Status_Step=0;
  839. }
  840. /********************************************************
  841. B3;关于判断是否被劫报警方面的程序处理
  842. ********************************************************/
  843. if(Test_Alarm_Step==0)
  844. {
  845. if((P2IN&ARALM)==0 )
  846. {
  847. Test_Alarm_Step=1;
  848. gTest_Alarm_Timer=0;
  849. }
  850. }
  851. else if(Test_Alarm_Step==1)
  852. {
  853. if(P2IN&ARALM)
  854. {
  855. Test_Alarm_Step=0;
  856. gTest_Alarm_Timer=0;
  857. }
  858. else if(gTest_Alarm_Timer>=ROB_TIME)
  859. {
  860. if(gM22_Status==GSM_WORK) gAlarm_Count=ALARM_COUNT;
  861. if( gAlarm_Type!=ROB_ALARM )
  862. {
  863. gAlarm_Type=ROB_ALARM;
  864. gStatus2_Flag|=ROB_ALARM_F_1;
  865. #ifdef Debug_GSM_COM1
  866. Send_COM1_Byte('S');Send_COM1_Byte('O');Send_COM1_Byte('S');
  867. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  868. #endif
  869. gCycle_Alarm=ALARM_CIRCLE_TIME;
  870. gCycle_Send_Status=ALARM_DATA;
  871. //被劫报警的上报的处理方式
  872. //1,组织数据包
  873. gCircle_Timer=0;
  874. Circle_Data_TCP(ALARM_UP,gSMS_ACK[ALARM_ACK]);
  875. gInternal_Flag|=SEND_CIRCLE_F_1;
  876. Judge_SMS_Way();
  877. }
  878. Test_Alarm_Step=0;
  879. gTest_Alarm_Timer=0;
  880. }
  881. }
  882. else
  883. {
  884. Test_Alarm_Step=0;
  885. gTest_Alarm_Timer=0;
  886. }
  887. /********************************************************
  888. B4;判断是否有报警报警信息的发送(暂时增加一个条件)
  889. ********************************************************/
  890. if(   (gAlarm_Type!=NOP_ALARM)
  891.     &&(gCycle_Send_Status==ALARM_DATA)
  892.     &&(gCycle_Alarm>4) )
  893. {
  894. if( gCircle_Timer>gCycle_Alarm )
  895. {
  896. gCircle_Timer=0;
  897. Circle_Data_TCP(ALARM_UP,gSMS_ACK[ALARM_ACK]);
  898. //如果属于超速报警,则同时发送一个信息给显示终端
  899. if(   (gAlarm_Type==OVER_AREA_ALARM) //区域报警
  900. ||(gAlarm_Type==OVER_SPEED_ALARM) //超速报警
  901. ||(gAlarm_Type==OVER_TIRE_ALARM) //疲劳驾驶报警
  902. ||(gAlarm_Type==OVER_LINE_ALARM) ) //线路偏移报警
  903. {
  904. Send_Over_Alarm_to_Disp(gAlarm_Type);
  905. }
  906. gInternal_Flag|=SEND_CIRCLE_F_1;
  907. if(gM22_Status==GSM_WORK)
  908. {
  909. if(gAlarm_Count==0)
  910. {
  911. gInternal_Flag&=~SEND_CIRCLE_F_1;
  912. gInternal_Flag&=~ALLOW_DATA_F_1;
  913. gCircle_Buffer_Point=0;
  914. }
  915. else
  916. {
  917. gAlarm_Count--;
  918. gInternal_Flag|=ALLOW_DATA_F_1;
  919. }
  920. }
  921. }
  922. }
  923. /********************************************************
  924. B4-1;判断是否处于重点监控的传输方式
  925. ********************************************************/
  926. if( gCycle_Send_Status==WATCH_DATA )
  927. {
  928. //1,如果处于按定时间传输数据的方式
  929. if(gWatch_Type==WATCH_TYPE_TIME)
  930. {
  931. if(gWatch_Time==0)
  932. {
  933. gWatch_Count=0;gWatch_Time=0;
  934. gCycle_Send_Status=NOP_DATA;
  935. gWatch_Type=WATCH_TYPE_NULL;
  936. Load_Buffer1_Echo(ASK_FREEWATCH_UP,gGeneral_Buffer[5]);
  937. }
  938. else
  939. {
  940. TCP_WORK_Data(gWatch_Circle,VEHICLE_WATCHECHO_UP);
  941. if(gM22_Status==GSM_WORK) gInternal_Flag|=ALLOW_DATA_F_1;
  942. }
  943. }
  944. else if(gWatch_Type==WATCH_TYPE_COUNT)
  945. {
  946. if(gWatch_Count==0)
  947. {
  948. gWatch_Count=0;gWatch_Time=0;
  949. gCycle_Send_Status=NOP_DATA;
  950. gWatch_Type=WATCH_TYPE_NULL;
  951. Load_Buffer1_Echo(ASK_FREEWATCH_UP,gGeneral_Buffer[5]);
  952. }
  953. else
  954. {
  955. TCP_WORK_Data(gWatch_Circle,VEHICLE_WATCHECHO_UP);
  956. if(   (gInternal_Flag&SEND_CIRCLE_F_1)
  957. &&( gWatch_Count>0 ) )
  958. {
  959. if(gM22_Status==GSM_WORK) gInternal_Flag|=ALLOW_DATA_F_1;
  960. }
  961. }
  962. }
  963. }
  964. /********************************************************
  965. B5;关于区域报警的检测程序
  966. 说明:区域报警方式和超速度报警方式一样,每隔5秒种进行一次区域报警的检测
  967. 累计5次,检测有效,则认为属于区域报警,一旦检测无满足条件的区域
  968. 则立刻停止区域报警。(所有的检测条件必须是在GPS数据有效的状态下判断)
  969. ********************************************************/
  970. if( (gTimer_Area_Test>INTER_ATRA_TEST)&&(gGeneral_Flag&GPS_VALID_F_1)&&(gArea_Par!=0) )
  971. {
  972. gTimer_Area_Test=0;
  973. Area_All=0;
  974. Check_Result=0;
  975. // Send_COM1_Byte('(');
  976. for(i=1;i<=4;i++)
  977. {
  978. //依次检查4个区域的数据
  979. Check_Result=Check_Area_Alarm(i);
  980. //Send_COM1_Byte(ASCII(Check_Result));
  981. //返回1,则说明当前点在禁入区域内
  982. if(Check_Result==1)
  983. {
  984. //满足条件,则跳出此循环
  985. Area_All=1;break;
  986. }
  987. //返回2,则说明当前点的在禁出区域内
  988. else if(Check_Result==2)
  989. {
  990. Area_All=0;
  991. //go on
  992. }
  993. //返回3,则说明当前点不在禁入区域内
  994. else if(Check_Result==3)
  995. {
  996. //go on
  997. }
  998. //返回4,则说明当前点不在禁出区域内
  999. else if(Check_Result==4)
  1000. {
  1001. //需要判断完所有的禁出区域,如果当前点只要在一个禁出区域内,则认为无满足条件
  1002. Area_Out_Num++;
  1003. }
  1004. //返回0。则说明当前判断区域数据无效
  1005. else if(Check_Result==0)
  1006. {
  1007. //go on
  1008. }
  1009. }
  1010. /*
  1011. Send_COM1_Byte(')');
  1012. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  1013. */
  1014. SRAM_Init();
  1015. j=SRAM_Read(SAREA_OUT_NUM);
  1016. if( (Area_All==0)&&(Area_Out_Num>=j)&&(j<=4)&&(j>0))
  1017. {
  1018. Area_All=1;
  1019. }
  1020. else if( (Area_All==0)&&(gAlarm_Type==OVER_AREA_ALARM))
  1021. {
  1022. gAlarm_Type=NOP_ALARM;
  1023. gCycle_Send_Status=NOP_DATA;
  1024. gAlarm_Count=0;
  1025. gCircle_Timer=0;
  1026. gArea_No_Count=0;
  1027. Circle_Data_TCP(VEHICLE_RUNDATA_UP,0);
  1028. gInternal_Flag|=SEND_CIRCLE_F_1;
  1029.   Judge_SMS_Way();
  1030. }
  1031. if( (Area_All==1)&&(gAlarm_Type==NOP_ALARM) )
  1032. {
  1033. gArea_No_Count++;
  1034. }
  1035. }
  1036. if( (gArea_No_Count>5)&&(gAlarm_Type==NOP_ALARM) )
  1037. {
  1038. gArea_No_Count=0;
  1039. gAlarm_Type = OVER_AREA_ALARM;
  1040. gCycle_Send_Status=ALARM_DATA;
  1041. gCircle_Timer=0;
  1042. gCycle_Alarm=ALARM_CIRCLE_TIME;
  1043. gSMS_ACK[ALARM_ACK]=0;
  1044. Circle_Data_TCP(ALARM_UP,gSMS_ACK[ALARM_ACK]);
  1045. Send_Over_Alarm_to_Disp(gAlarm_Type);
  1046. gInternal_Flag|=SEND_CIRCLE_F_1;
  1047. if(gM22_Status==GSM_WORK)
  1048. {
  1049. gAlarm_Count=ALARM_COUNT;
  1050. }
  1051. Judge_SMS_Way();
  1052. }
  1053. /********************************************************
  1054. B6;与行车轨迹相关的一些处理流程:
  1055. 1,先判断IP地址和开关量
  1056.  1-1:如果IP地址有效果,且开关量处于开启状态
  1057.  1-2:IP地址无效或者开关量未开启
  1058.   1-1-1:如果gCycle_GSM>4且为行车轨迹状态
  1059. ********************************************************/
  1060. //IP地址有效,开关量开启
  1061. if( (gGeneral_Flag&TCP_IP_VALID_1)&&((gON_OFF_Temp0&TCP_LAND_ON_OFF_1)==0) )
  1062. {
  1063. //如果处于GSM工作方式
  1064. if(gM22_Status==GSM_WORK)
  1065. {
  1066. //如果间隔属于大于20分钟
  1067. if( (gCycle_TCP>=TCP_TRACK_MINTIME)&&(gCycle_Send_Status==TRACK_DATA_TIME) )
  1068. {
  1069. TCP_WORK_Data(gCycle_TCP,VEHICLE_RUNDATA_UP);
  1070. }
  1071. //如果间隔属于小于20分钟
  1072. else if( (gCycle_TCP>4)&&(gCycle_TCP<TCP_TRACK_MINTIME)&&(gCycle_Send_Status==TRACK_DATA_TIME) )
  1073. {
  1074. TCP_WORK_Data(SMS_DATA_TIME,VEHICLE_RUNDATA_UP);
  1075. }
  1076. }
  1077. //如果处于TCP的工作方式
  1078. else if( gM22_Status==TCP_ONLINE_WORK )
  1079. {
  1080. if(gCycle_Send_Status==TRACK_DATA_TIME)
  1081. {
  1082. TCP_WORK_Data(gCycle_TCP,VEHICLE_RUNDATA_UP);
  1083. }
  1084. }
  1085. }
  1086. //如果IP地址无效,或者开关量关闭
  1087. else
  1088. {
  1089. if( (gCycle_GSM>4)
  1090. &&(gCycle_Send_Status==TRACK_DATA_TIME)
  1091. &&(gM22_Status==GSM_WORK) )
  1092. {
  1093. GSM_WORK_Data();
  1094. }
  1095. }
  1096. /********************************************************
  1097. ********************************************************/
  1098. /********************************************************
  1099. B7; 关于线路报警的程序部分
  1100. 说明:
  1101. ********************************************************/
  1102. if(   (gStatus3_Flag&LINE_LIMIT_F_1)
  1103. &&(gGeneral_Flag&GPS_VALID_F_1)
  1104. &&(gLine_Num>0)&&(gLine_Num<=60) )
  1105. {
  1106. if(gLine_Timer>8)
  1107. {
  1108. gLine_Timer=0;
  1109. gCommon_Flag&=~LINE_OUT_F_1;
  1110. for(i=0;i<gLine_Num-1;i++)
  1111. {
  1112. Check_Result=Check_Line_Data(i);
  1113. Clear_Exter_WatchDog();
  1114. //Send_COM1_Byte(ASCII(Check_Result%10));
  1115. //计算垂直点在当前线段内,属于需要统计计算距离
  1116. //1,返回0,则表示异常
  1117. if(Check_Result==0);
  1118. //2,返回1,则表示垂直点没落在当前线段内
  1119. else if(Check_Result==1);
  1120. //3,返回2,则说明垂直点落在当前线段内,但距离大于最大限制的值
  1121. else if(Check_Result==2)
  1122. {
  1123. gOver_Line_Count++;
  1124. gCommon_Flag|=LINE_OUT_F_1;
  1125. }
  1126. //4,返回3,说明不满足偏离线路的条件
  1127. else if(Check_Result==3)
  1128. {
  1129. gOver_Line_Count=0;
  1130. gCommon_Flag|=LINE_OUT_F_1;
  1131. if(gAlarm_Type==OVER_LINE_ALARM)
  1132. {
  1133. gCommon_Flag|=STOP_OVERLINE_F_1;
  1134. }
  1135. break;
  1136. }
  1137. }
  1138. if(   (i==gLine_Num-1)
  1139. &&((gCommon_Flag&LINE_OUT_F_1)==0) )
  1140. {
  1141. gOver_Line_Count++;
  1142. }
  1143. }
  1144. }
  1145. if(gOver_Line_Count>2)
  1146. {
  1147. //满足条件,则产生偏离报警
  1148. gOver_Line_Count=0;
  1149. if(gAlarm_Type==NOP_ALARM)
  1150. {
  1151. gAlarm_Type = OVER_LINE_ALARM;
  1152. gCycle_Send_Status=ALARM_DATA;
  1153. gCircle_Timer=0;
  1154. gCycle_Alarm=ALARM_CIRCLE_TIME;
  1155. gSMS_ACK[ALARM_ACK]=0;
  1156. Circle_Data_TCP(ALARM_UP,gSMS_ACK[ALARM_ACK]);
  1157. Send_Over_Alarm_to_Disp(gAlarm_Type);
  1158. gInternal_Flag|=SEND_CIRCLE_F_1;
  1159. if(gM22_Status==GSM_WORK)
  1160. {
  1161. gAlarm_Count=ALARM_COUNT;
  1162. }
  1163. Judge_SMS_Way();
  1164. }
  1165. }
  1166. else if( (gAlarm_Type==OVER_LINE_ALARM)&&(gCommon_Flag&STOP_OVERLINE_F_1) )
  1167. {
  1168. gAlarm_Type=NOP_ALARM;
  1169. gCycle_Send_Status=NOP_DATA;
  1170. gAlarm_Count=0;
  1171. gStatus2_Flag&=~ROB_ALARM_F_1;
  1172. gCommon_Flag&=~STOP_OVERLINE_F_1;
  1173. gCircle_Timer=0;
  1174. gOver_Line_Count=0;
  1175. Circle_Data_TCP(VEHICLE_RUNDATA_UP,0);
  1176. gInternal_Flag|=SEND_CIRCLE_F_1;
  1177. Judge_SMS_Way();
  1178. }
  1179. }
  1180. /********************************************************
  1181. 下面是程序 的子模块部分
  1182. ********************************************************/
  1183. /********************************************************
  1184. * 函数名:Circle_Data_TCP
  1185. 作用域:本地文件调用
  1186. * 功能:  在TCP的工作方式下,如果是报警,或者行车轨迹,或者监控数据,
  1187. 组织到gCircle_Buffer[]缓冲中
  1188. * 参数:
  1189. * 返回值:
  1190. * 创建人:
  1191. *
  1192. * 修改历史:(每条详述)
  1193. ********************************************************/
  1194. void Circle_Data_TCP(unsigned char nCommand,unsigned char nACK )
  1195. {
  1196. unsigned char nInput=29+4;
  1197. unsigned int iCheckOut=0;
  1198. unsigned char nFlag=0;
  1199. nFlag=gAlarm_Type;
  1200. gCircle_Buffer_Point=0;
  1201. gCircle_Buffer[gCircle_Buffer_Point]=SOH;
  1202. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1203. gCircle_Buffer_Point++;
  1204. gCircle_Buffer[gCircle_Buffer_Point]=nCommand;
  1205. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1206. gCircle_Buffer_Point++;
  1207. gCircle_Buffer[gCircle_Buffer_Point]=(char)(~nCommand);
  1208. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1209. gCircle_Buffer_Point++;
  1210. gCircle_Buffer[gCircle_Buffer_Point]=nInput-4;
  1211. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1212. gCircle_Buffer_Point++;
  1213. gCircle_Buffer[gCircle_Buffer_Point]=nACK;
  1214. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1215. gCircle_Buffer_Point++;
  1216. gCircle_Buffer[gCircle_Buffer_Point]=gKind;
  1217. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1218. gCircle_Buffer_Point++;
  1219. gCircle_Buffer[gCircle_Buffer_Point]=gGroup;
  1220. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1221. gCircle_Buffer_Point++;
  1222. gCircle_Buffer[gCircle_Buffer_Point]=gVID/0x100;
  1223. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1224. gCircle_Buffer_Point++;
  1225. gCircle_Buffer[gCircle_Buffer_Point]=gVID%0x100;
  1226. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1227. gCircle_Buffer_Point++;
  1228. gCircle_Buffer[gCircle_Buffer_Point]=gLongitude/0x1000000;
  1229. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1230. gCircle_Buffer_Point++;
  1231. gCircle_Buffer[gCircle_Buffer_Point]=gLongitude%0x1000000/0x10000;
  1232. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1233. gCircle_Buffer_Point++;
  1234. gCircle_Buffer[gCircle_Buffer_Point]=gLongitude%0x10000/0x100;
  1235. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1236. gCircle_Buffer_Point++;
  1237. gCircle_Buffer[gCircle_Buffer_Point]=gLongitude%0x100;
  1238. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1239. gCircle_Buffer_Point++;
  1240. gCircle_Buffer[gCircle_Buffer_Point]=gLatitude/0x1000000;
  1241. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1242. gCircle_Buffer_Point++;
  1243. gCircle_Buffer[gCircle_Buffer_Point]=gLatitude%0x1000000/0x10000;
  1244. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1245. gCircle_Buffer_Point++;
  1246. gCircle_Buffer[gCircle_Buffer_Point]=gLatitude%0x10000/0x100;
  1247. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1248. gCircle_Buffer_Point++;
  1249. gCircle_Buffer[gCircle_Buffer_Point]=gLatitude%0x100;
  1250. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1251. gCircle_Buffer_Point++;
  1252. gCircle_Buffer[gCircle_Buffer_Point]=gSpeed;
  1253. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1254. gCircle_Buffer_Point++;
  1255. gCircle_Buffer[gCircle_Buffer_Point]=gAzimuth;
  1256. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1257. gCircle_Buffer_Point++;
  1258. if(gGeneral_Flag&GPS_VALID_F_1) nFlag|=FLAG_GPSVAILD_1;
  1259. else nFlag&=~FLAG_GPSVAILD_1;
  1260. gCircle_Buffer[gCircle_Buffer_Point]=nFlag;
  1261. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1262. gCircle_Buffer_Point++;
  1263. gCircle_Buffer[gCircle_Buffer_Point]=gYear;
  1264. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1265. gCircle_Buffer_Point++;
  1266. gCircle_Buffer[gCircle_Buffer_Point]=gMonth;
  1267. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1268. gCircle_Buffer_Point++;
  1269. gCircle_Buffer[gCircle_Buffer_Point]=gDate;
  1270. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1271. gCircle_Buffer_Point++;
  1272. gCircle_Buffer[gCircle_Buffer_Point]=gHour;
  1273. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1274. gCircle_Buffer_Point++;
  1275. gCircle_Buffer[gCircle_Buffer_Point]=gMinute;
  1276. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1277. gCircle_Buffer_Point++;
  1278. gCircle_Buffer[gCircle_Buffer_Point]=gSecond;
  1279. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1280. gCircle_Buffer_Point++;
  1281. //增加4个状态量的发送
  1282. gCircle_Buffer[gCircle_Buffer_Point]=0;
  1283. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1284. gCircle_Buffer_Point++;
  1285. gCircle_Buffer[gCircle_Buffer_Point]=gStatus3_Flag;
  1286. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1287. gCircle_Buffer_Point++;
  1288. gCircle_Buffer[gCircle_Buffer_Point]=gStatus2_Flag;
  1289. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1290. gCircle_Buffer_Point++;
  1291. gCircle_Buffer[gCircle_Buffer_Point]=gStatus1_Flag;
  1292. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1293. gCircle_Buffer_Point++;
  1294. //增加long int型的里程数据
  1295. /*
  1296. gCircle_Buffer[gCircle_Buffer_Point]=gALL_Distance/0x1000000;
  1297. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1298. gCircle_Buffer_Point++;
  1299. gCircle_Buffer[gCircle_Buffer_Point]=gALL_Distance%0x1000000/0x10000;
  1300. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1301. gCircle_Buffer_Point++;
  1302. gCircle_Buffer[gCircle_Buffer_Point]=gALL_Distance%0x10000/0x100;
  1303. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1304. gCircle_Buffer_Point++;
  1305. gCircle_Buffer[gCircle_Buffer_Point]=gALL_Distance%0x100;
  1306. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1307. gCircle_Buffer_Point++;
  1308. */
  1309. //==================================================
  1310. gCircle_Buffer[gCircle_Buffer_Point]=iCheckOut/0x100;
  1311. gCircle_Buffer_Point++;
  1312. gCircle_Buffer[gCircle_Buffer_Point]=iCheckOut%0x100;
  1313. gCircle_Buffer_Point++;
  1314. gCircle_Buffer[gCircle_Buffer_Point]=EOT;
  1315. gCircle_Buffer_Point++;
  1316. //gCircle_Buffer_Point的值是数据区的长度
  1317. }
  1318. /********************************************************
  1319. * 函数名:Circle_Data_GSM
  1320. 作用域:本地文件调用
  1321. * 功能:  在GSM的工作方式下,如果是报警,或者行车轨迹,或者监控数据,
  1322. 组织到gCircle_Buffer[]缓冲中
  1323. * 参数:
  1324. * 返回值:
  1325. * 创建人:
  1326. *
  1327. * 修改历史:(每条详述)
  1328. AT+CMGS=045
  1329. > 001100|0D 91683196818735F4 000400 1D FF43BC19010101001018739A9A04D63C2200008003093010164306460D
  1330. ********************************************************/
  1331. unsigned int Circle_Data_GSM( unsigned char nCount,unsigned char nCommand,unsigned char nACK,unsigned int iCheckOutTemp )
  1332. {
  1333. unsigned char nInput;
  1334. unsigned int  iCheckOut;
  1335. unsigned int  i;
  1336. iCheckOut=iCheckOutTemp;
  1337. nInput=12+4+17*2;
  1338. if(nCount==1)
  1339. {
  1340. gCircle_Buffer_Point=0;
  1341. gCircle_Buffer[gCircle_Buffer_Point]=SOH;
  1342. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1343. gCircle_Buffer_Point++;
  1344. gCircle_Buffer[gCircle_Buffer_Point]=nCommand;
  1345. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1346. gCircle_Buffer_Point++;
  1347. gCircle_Buffer[gCircle_Buffer_Point]=(char)(~nCommand);
  1348. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1349. gCircle_Buffer_Point++;
  1350. gCircle_Buffer[gCircle_Buffer_Point]=nInput-4;
  1351. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1352. gCircle_Buffer_Point++;
  1353. gCircle_Buffer[gCircle_Buffer_Point]=nACK;
  1354. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1355. gCircle_Buffer_Point++;
  1356. gCircle_Buffer[gCircle_Buffer_Point]=gKind;
  1357. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1358. gCircle_Buffer_Point++;
  1359. gCircle_Buffer[gCircle_Buffer_Point]=gGroup;
  1360. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1361. gCircle_Buffer_Point++;
  1362. gCircle_Buffer[gCircle_Buffer_Point]=gVID/0x100;
  1363. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1364. gCircle_Buffer_Point++;
  1365. gCircle_Buffer[gCircle_Buffer_Point]=gVID%0x100;
  1366. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1367. gCircle_Buffer_Point++;
  1368. i=Circle_Data_GSM_Sub(iCheckOut);
  1369. return(i);
  1370. }
  1371. else if(nCount==2)
  1372. {
  1373. i=Circle_Data_GSM_Sub(iCheckOut);
  1374. return(i);
  1375. }
  1376. /*
  1377. else if(nCount==3)
  1378. {
  1379. i=Circle_Data_GSM_Sub(iCheckOut);
  1380. return(i);
  1381. }
  1382. else if(nCount==4)
  1383. {
  1384. i=Circle_Data_GSM_Sub(iCheckOut);
  1385. return(i);
  1386. }
  1387. */
  1388. else if(nCount==3)
  1389. {
  1390. i=Circle_Data_GSM_Sub(iCheckOut);
  1391. return(i);
  1392. }
  1393. else if(nCount==4)
  1394. {
  1395. /////////////////////////////////////////////////
  1396. i=Circle_Data_GSM_Sub(iCheckOut);
  1397. //增加4个车载终端的状态量
  1398. gCircle_Buffer[gCircle_Buffer_Point]=0;
  1399. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1400. gCircle_Buffer_Point++;
  1401. gCircle_Buffer[gCircle_Buffer_Point]=gStatus3_Flag;
  1402. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1403. gCircle_Buffer_Point++;
  1404. gCircle_Buffer[gCircle_Buffer_Point]=gStatus2_Flag;
  1405. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1406. gCircle_Buffer_Point++;
  1407. gCircle_Buffer[gCircle_Buffer_Point]=gStatus1_Flag;
  1408. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1409. gCircle_Buffer_Point++;
  1410. //增加long int型的里程数据
  1411. /*
  1412. gCircle_Buffer[gCircle_Buffer_Point]=gALL_Distance/0x1000000;
  1413. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1414. gCircle_Buffer_Point++;
  1415. gCircle_Buffer[gCircle_Buffer_Point]=gALL_Distance%0x1000000/0x10000;
  1416. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1417. gCircle_Buffer_Point++;
  1418. gCircle_Buffer[gCircle_Buffer_Point]=gALL_Distance%0x10000/0x100;
  1419. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1420. gCircle_Buffer_Point++;
  1421. gCircle_Buffer[gCircle_Buffer_Point]=gALL_Distance%0x100;
  1422. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1423. gCircle_Buffer_Point++;
  1424. */
  1425. //////////////////////////////////////////////
  1426. gCircle_Buffer[gCircle_Buffer_Point]=i/0x100;
  1427. gCircle_Buffer_Point++;
  1428. gCircle_Buffer[gCircle_Buffer_Point]=i%0x100;
  1429. gCircle_Buffer_Point++;
  1430. gCircle_Buffer[gCircle_Buffer_Point]=EOT;
  1431. gCircle_Buffer_Point++;
  1432. return(0);
  1433. }
  1434. else
  1435. {
  1436.   return(0);
  1437. }
  1438. }
  1439. /********************************************************
  1440. * 函数名:Circle_Data_GSM_Sub
  1441. 作用域:本地文件调用
  1442. * 功能:  在GSM的工作方式下,如果是报警,或者行车轨迹,或者监控数据,
  1443. 组织到gCircle_Buffer[]缓冲中
  1444. * 参数:
  1445. * 返回值:
  1446. * 创建人:
  1447. * 修改历史:(每条详述)
  1448. ********************************************************/
  1449. unsigned int Circle_Data_GSM_Sub(unsigned int iCheckOutTemp)
  1450. {
  1451. unsigned int iCheckOut;
  1452. unsigned char nFlag;
  1453. nFlag=gAlarm_Type;
  1454. iCheckOut=iCheckOutTemp;
  1455. gCircle_Buffer[gCircle_Buffer_Point]=gLongitude/0x1000000;
  1456. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1457. gCircle_Buffer_Point++;
  1458. gCircle_Buffer[gCircle_Buffer_Point]=gLongitude%0x1000000/0x10000;
  1459. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1460. gCircle_Buffer_Point++;
  1461. gCircle_Buffer[gCircle_Buffer_Point]=gLongitude%0x10000/0x100;
  1462. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1463. gCircle_Buffer_Point++;
  1464. gCircle_Buffer[gCircle_Buffer_Point]=gLongitude%0x100;
  1465. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1466. gCircle_Buffer_Point++;
  1467. gCircle_Buffer[gCircle_Buffer_Point]=gLatitude/0x1000000;
  1468. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1469. gCircle_Buffer_Point++;
  1470. gCircle_Buffer[gCircle_Buffer_Point]=gLatitude%0x1000000/0x10000;
  1471. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1472. gCircle_Buffer_Point++;
  1473. gCircle_Buffer[gCircle_Buffer_Point]=gLatitude%0x10000/0x100;
  1474. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1475. gCircle_Buffer_Point++;
  1476. gCircle_Buffer[gCircle_Buffer_Point]=gLatitude%0x100;
  1477. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1478. gCircle_Buffer_Point++;
  1479. gCircle_Buffer[gCircle_Buffer_Point]=gSpeed;
  1480. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1481. gCircle_Buffer_Point++;
  1482. gCircle_Buffer[gCircle_Buffer_Point]=gAzimuth;
  1483. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1484. gCircle_Buffer_Point++;
  1485. if(gGeneral_Flag&GPS_VALID_F_1) nFlag|=FLAG_GPSVAILD_1;
  1486. else nFlag&=~FLAG_GPSVAILD_1;
  1487. gCircle_Buffer[gCircle_Buffer_Point]=nFlag;
  1488. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1489. gCircle_Buffer_Point++;
  1490. gCircle_Buffer[gCircle_Buffer_Point]=gYear;
  1491. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1492. gCircle_Buffer_Point++;
  1493. gCircle_Buffer[gCircle_Buffer_Point]=gMonth;
  1494. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1495. gCircle_Buffer_Point++;
  1496. gCircle_Buffer[gCircle_Buffer_Point]=gDate;
  1497. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1498. gCircle_Buffer_Point++;
  1499. gCircle_Buffer[gCircle_Buffer_Point]=gHour;
  1500. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1501. gCircle_Buffer_Point++;
  1502. gCircle_Buffer[gCircle_Buffer_Point]=gMinute;
  1503. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1504. gCircle_Buffer_Point++;
  1505. gCircle_Buffer[gCircle_Buffer_Point]=gSecond;
  1506. iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
  1507. gCircle_Buffer_Point++;
  1508. return(iCheckOut);
  1509. }
  1510. /********************************************************
  1511. * 函数名:Dichotomy_PassData_First
  1512. 作用域:本地文件调用
  1513. * 功能:  二分法寻找历史轨迹的第一个满足条件的扇区
  1514. * 参数:
  1515. * 返回值:
  1516. * 创建人:
  1517. *
  1518. * 修改历史:(每条详述)
  1519. ********************************************************/
  1520. unsigned int Dichotomy_PassData_First(unsigned int iFirst_Page,unsigned int iEnd_Page)
  1521. {
  1522. unsigned int iMiddle_Page;
  1523. iMiddle_Page=(iFirst_Page+iEnd_Page)/2;
  1524. return(iMiddle_Page);
  1525. }
  1526. /********************************************************
  1527. * 函数名:GSM_WORK_Data
  1528. 作用域:
  1529. * 功能:
  1530. * 参数:
  1531. * 返回值:
  1532. * 创建人:
  1533. *
  1534. * 修改历史:(每条详述)
  1535. ********************************************************/
  1536. void GSM_WORK_Data(void)
  1537. {
  1538. if(gCircle_Timer>0)
  1539. {
  1540. if( (gGeneral_Flag&GPS_VALID_F_1)&&( (gInternal_Flag&LOAD_ONEVALID_F_1)==0) )
  1541. {
  1542. gInternal_Flag|=LOAD_ONEVALID_F_1;
  1543. //在0--gCycle_GSM内判断到一个有效的数据
  1544. gGSM_Work_Count++;
  1545. gCheck_Data += Circle_Data_GSM(gGSM_Work_Count,VEHICLE_RUNDATA_UP,0,gCheck_Data);
  1546. if(gGSM_Work_Count>=4)
  1547. {
  1548. gInternal_Flag|=SEND_CIRCLE_F_1;gGSM_Work_Count=0;gCheck_Data=0;
  1549. Judge_SMS_Way();
  1550. }
  1551. }
  1552. else if( gCircle_Timer>gCycle_GSM )
  1553. {
  1554. if( gInternal_Flag&LOAD_ONEVALID_F_1 )
  1555. {
  1556. gCircle_Timer=0;
  1557. gInternal_Flag&=~LOAD_ONEVALID_F_1;
  1558. }
  1559. else
  1560. {
  1561. gCircle_Timer=0;
  1562. gInternal_Flag&=~LOAD_ONEVALID_F_1;
  1563. //在0--gCycle_GSM内仍然未判断到一个有效的数据,则将这个作为一个点存储
  1564. gGSM_Work_Count++;
  1565. gCheck_Data += Circle_Data_GSM(gGSM_Work_Count,VEHICLE_RUNDATA_UP,0,gCheck_Data);
  1566. if(gGSM_Work_Count>=4)
  1567. {
  1568. gInternal_Flag|=SEND_CIRCLE_F_1;gGSM_Work_Count=0;gCheck_Data=0;
  1569. Judge_SMS_Way();
  1570. }
  1571. }
  1572. }
  1573. }
  1574. }
  1575. /********************************************************
  1576. * 函数名:TCP_WORK_Data
  1577. 作用域:
  1578. * 功能:
  1579. * 参数:
  1580. * 返回值:
  1581. * 创建人:
  1582. *
  1583. * 修改历史:(每条详述)
  1584. ********************************************************/
  1585. void TCP_WORK_Data(unsigned int Timer,unsigned char nCommand)
  1586. {
  1587. if(gCircle_Timer>0)
  1588. {
  1589. if( (gGeneral_Flag&GPS_VALID_F_1)&&( (gInternal_Flag&LOAD_ONEVALID_F_1)==0) )
  1590. {
  1591. gInternal_Flag|=LOAD_ONEVALID_F_1;
  1592. //在0--gCycle_TCP内判断到一个有效的数据
  1593. Circle_Data_TCP(nCommand,0);
  1594. gInternal_Flag|=SEND_CIRCLE_F_1;
  1595. Judge_SMS_Way();
  1596. }
  1597. else if( gCircle_Timer>Timer )
  1598. {
  1599. if( gInternal_Flag&LOAD_ONEVALID_F_1 )
  1600. {
  1601. gCircle_Timer=0;
  1602. gInternal_Flag&=~LOAD_ONEVALID_F_1;
  1603. }
  1604. else
  1605. {
  1606. gCircle_Timer=0;
  1607. gInternal_Flag&=~LOAD_ONEVALID_F_1;
  1608. //在0--gCycle_TCP内仍然未判断到一个有效的数据,则将这个作为一个点存储
  1609. Circle_Data_TCP(nCommand,0);
  1610. gInternal_Flag|=SEND_CIRCLE_F_1;
  1611. Judge_SMS_Way();
  1612. }
  1613. }
  1614. }
  1615. }
  1616. /********************************************************
  1617. * 函数名:Max_Result()
  1618. 作用域:
  1619. * 功能:
  1620. * 参数:
  1621. * 返回值:
  1622. * 创建人:
  1623. *
  1624. * 修改历史:(每条详述)
  1625. ********************************************************/
  1626. unsigned long int Max_Result(unsigned long int x,unsigned long int y)
  1627. {
  1628. if(x>y) return(x);
  1629. else return(y);
  1630. }
  1631. /********************************************************
  1632. * 函数名:Min_Result()
  1633. 作用域:
  1634. * 功能:
  1635. * 参数:
  1636. * 返回值:
  1637. * 创建人:
  1638. *
  1639. * 修改历史:(每条详述)
  1640. ********************************************************/
  1641. unsigned long int Min_Result(unsigned long int x,unsigned long int y)
  1642. {
  1643. if(x<y) return(x);
  1644. else return(y);
  1645. }
  1646. /********************************************************
  1647. * 函数名:Account_Mid_Dot()
  1648. 作用域:
  1649. * 功能:
  1650. * 参数:
  1651. * 返回值:
  1652. * 创建人:
  1653. *
  1654. ********************************************************/
  1655. unsigned char Account_Mid_Dot(double x1,double y1,double x2,double y2)
  1656. {
  1657. unsigned char Line_Flag=0;
  1658. double k,b,k1,b1;
  1659. double ak;
  1660. double Max_gLongitude=0,Max_gLatitude=0;
  1661. double Min_gLongitude=0,Min_gLatitude=0;
  1662. double Longitude_Temp=0,Latitude_Temp=0;
  1663. unsigned long int nLength=0;
  1664. //先判断当前点与判断的线段的第一个点的距离,如果此点的距离就不满足偏离条件,则返回5
  1665. //1,计算两点经度差值所表示的实际距离
  1666. nLength=labs(gLatitude-(long int)(y1*3600000) );
  1667. Latitude_Temp=(double)((nLength/1000.0)*DIS_LAT);
  1668. //2,计算两点纬度差值所表示的实际距离
  1669. nLength=labs(gLongitude-(long int)(x1*3600000) );
  1670. Longitude_Temp=(double)((nLength/1000.0)*DIS_LON);
  1671. if( (Longitude_Temp<gMax_Limit_Distance)&&(Latitude_Temp<gMax_Limit_Distance) )
  1672. {
  1673. Latitude_Temp=Latitude_Temp*Latitude_Temp+Longitude_Temp*Longitude_Temp;
  1674. Latitude_Temp=sqrt(Latitude_Temp);
  1675. if(Latitude_Temp<gMax_Limit_Distance) return(5);
  1676. }
  1677. /////////////////////////////////////////////////////////////////////
  1678. Longitude_Temp=(double)(gLongitude/3600000.0);
  1679. Latitude_Temp=(double)(gLatitude/3600000.0);
  1680. if(x1>=x2)
  1681. {
  1682. Max_gLongitude=x1;Min_gLongitude=x2;
  1683. }
  1684. else
  1685. {
  1686. Max_gLongitude=x2;Min_gLongitude=x1;
  1687. }
  1688. if(y1>=y2)
  1689. {
  1690. Max_gLatitude=y1;Min_gLatitude=y2;
  1691. }
  1692. else
  1693. {
  1694. Max_gLatitude=y2;Min_gLatitude=y1;
  1695. }
  1696. if(   ((Max_gLongitude-Min_gLongitude)<0.0003)
  1697. &&((Max_gLatitude-Min_gLatitude)>0.0003)  )
  1698. {
  1699. Line_Flag=1;
  1700. }
  1701. else if(   ((Max_gLongitude-Min_gLongitude)>0.0003)
  1702.  &&((Max_gLatitude-Min_gLatitude)<0.0003)  )
  1703. {
  1704. Line_Flag=2;
  1705. }
  1706. else if(   ((Max_gLongitude-Min_gLongitude)>0.0003)
  1707.  &&((Max_gLatitude-Min_gLatitude)>0.0003)  )
  1708. {
  1709. k=(y2-y1)/(x2-x1);
  1710. ak=fabs(k);
  1711. if(ak>1000) Line_Flag=1; //相当于垂直,相当于x相同
  1712. else if(ak<0.001) Line_Flag=2; //相当于平行,相当于y相同
  1713. else Line_Flag=0; //可以有计算的斜率
  1714. }
  1715. else //两个点重合
  1716. {
  1717. return(0);
  1718. }
  1719. /*
  1720. k=(y2-y1)/(x2-x1);
  1721. ak=fabs(k);
  1722. if(ak>100) Line_Flag=1; //相当于垂直,相当于x相同
  1723. else if(ak<0.01) Line_Flag=2; //相当于平行,相当于y相同
  1724. else Line_Flag=0; //可以有计算的斜率
  1725. */
  1726. //1,如果两个点的纬度数据相同,则判断经度,y相同,判断x
  1727. if(Line_Flag==2) //gLatitude
  1728. {
  1729. if(Longitude_Temp>Max_gLongitude) return(1);
  1730. else if(Longitude_Temp<Min_gLongitude) return(1);
  1731. else
  1732. {
  1733. gLongitude_mid=gLongitude;
  1734. gLatitude_mid=(long int)(3600000*(y1+y2)/2);
  1735. return(2);
  1736. }
  1737. }
  1738. //2,如果两个点的经度数据相同,则判断纬度,x相同,判断y
  1739. else if(Line_Flag==1) //gLongitude
  1740. {
  1741. if(Latitude_Temp>Max_gLatitude) return(1);
  1742. else if(Latitude_Temp<Min_gLatitude) return(1);
  1743. else
  1744. {
  1745. gLongitude_mid=(long int)(3600000*(x1+x2)/2); //经度,相当于y
  1746. gLatitude_mid=gLatitude; //纬度,相当于x
  1747. return(3);
  1748. }
  1749. }
  1750. //3,如果可以计算斜率
  1751. else if(Line_Flag==0)
  1752. {
  1753. b=y1-k*x1;
  1754. k1=-1/k;
  1755. b1=(double)(gLatitude/3600000.0)-k1*(double)(gLongitude/3600000.0);//b1=
  1756. Longitude_Temp=(b1-b)/(k-k1);
  1757. Latitude_Temp= k1*Longitude_Temp+b1;
  1758. gLongitude_mid=(long int)(Longitude_Temp*3600000);
  1759. gLatitude_mid=(long int)(Latitude_Temp*3600000);
  1760. if(gLongitude_mid>(long int)(Max_gLongitude*3600000)) return(1);
  1761. else if(gLongitude_mid<(long int)(Min_gLongitude*3600000)) return(1);
  1762. else if(gLatitude_mid>(long int)(Max_gLatitude*3600000)) return(1);
  1763. else if(gLatitude_mid<(long int)(Min_gLatitude*3600000)) return(1);
  1764. else
  1765. {
  1766. return(4);
  1767. }
  1768. }
  1769. return(0);
  1770. //返回0,则属于异常
  1771. //返回1,表示垂线的交点不在当前线段内,则此线段的判断结束,进行下一个线段的判断
  1772. //返回2,垂线的交点在当前线段内,但两个点的经度相同,纬度不同
  1773. //返回3,垂线的交点在当前线段内,但两个点的纬度相同,经度不同
  1774. //返回4,垂线的交点在单前线段内,并且两个点的经度,纬度君不相同
  1775. //返回5,说明当前点离线段的第一个点的距离已经不满足偏离距离的条件
  1776. }
  1777. /********************************************************
  1778. * 函数名:Check_Sram_AreaData()
  1779. 作用域:
  1780. * 功能:
  1781. * 参数:
  1782. * 返回值:
  1783. * 创建人:
  1784. *
  1785. * 修改历史:(每条详述)
  1786. ********************************************************/
  1787. /*
  1788. unsigned char Check_Sram_AreaData(void)
  1789. {
  1790. unsigned int i=0;
  1791. SRAM_Init();
  1792. if( (SRAM_Read(SAREA_DATA_FS)==0x55)&&(SRAM_Read(SAREA_DATA_FE)==0xAA) )
  1793. {
  1794. return(1);
  1795. }
  1796. else
  1797. {
  1798. return(0);
  1799. }
  1800. }
  1801. */
  1802. /********************************************************
  1803. * 函数名:Check_Area_Alarm()
  1804. 作用域:
  1805. * 功能:
  1806. * 参数:
  1807. * 返回值:
  1808. * 创建人:
  1809. *
  1810. * 修改历史:(每条详述)
  1811. ********************************************************/
  1812. unsigned char Check_Area_Alarm(unsigned char Num)
  1813. {
  1814. unsigned long int gLongitude_1=0,gLatitude_1=0;
  1815. unsigned long int gLongitude_2=0,gLatitude_2=0;
  1816. unsigned long int Max_gLongitude=0,Max_gLatitude=0;
  1817. unsigned long int Min_gLongitude=0,Min_gLatitude=0;
  1818. unsigned char Area_Flag=0;
  1819. unsigned int Area_Add=0;
  1820. unsigned int Aflag_Add=0;
  1821. Area_Add=SAREA1_LON_1_2+(Num-1)*17; //区域的首地址
  1822. Aflag_Add=Area_Add+16; //区域标志的地址
  1823. //先判断对应的Num区域是禁出还是禁入
  1824. SRAM_Init();
  1825. Area_Flag=SRAM_Read(Aflag_Add);
  1826. if( (Area_Flag!=0xaa)&&(Area_Flag!=0x55) ) return(0);
  1827. //2,第一个点的经,纬度
  1828. gLongitude_1 = SRAM_Read(Area_Add);
  1829. gLongitude_1<<=8;
  1830. gLongitude_1 += SRAM_Read(Area_Add+1);
  1831. gLongitude_1<<=8;
  1832. gLongitude_1 += SRAM_Read(Area_Add+2);
  1833. gLongitude_1<<=8;
  1834. gLongitude_1 += SRAM_Read(Area_Add+3);
  1835. gLatitude_1 = SRAM_Read(Area_Add+4);
  1836. gLatitude_1<<=8;
  1837. gLatitude_1 += SRAM_Read(Area_Add+5);
  1838. gLatitude_1<<=8;
  1839. gLatitude_1 += SRAM_Read(Area_Add+6);
  1840. gLatitude_1<<=8;
  1841. gLatitude_1 += SRAM_Read(Area_Add+7);
  1842. //3,第二个点的经,纬度
  1843. gLongitude_2 = SRAM_Read(Area_Add+8);
  1844. gLongitude_2<<=8;
  1845. gLongitude_2 += SRAM_Read(Area_Add+9);
  1846. gLongitude_2<<=8;
  1847. gLongitude_2 += SRAM_Read(Area_Add+10);
  1848. gLongitude_2<<=8;
  1849. gLongitude_2 += SRAM_Read(Area_Add+11);
  1850. gLatitude_2 = SRAM_Read(Area_Add+12);
  1851. gLatitude_2<<=8;
  1852. gLatitude_2 += SRAM_Read(Area_Add+13);
  1853. gLatitude_2<<=8;
  1854. gLatitude_2 += SRAM_Read(Area_Add+14);
  1855. gLatitude_2<<=8;
  1856. gLatitude_2 += SRAM_Read(Area_Add+15);
  1857. Max_gLongitude=Max_Result(gLongitude_1,gLongitude_2);
  1858. Max_gLatitude=Max_Result(gLatitude_1,gLatitude_2);
  1859. Min_gLongitude=Min_Result(gLongitude_1,gLongitude_2);
  1860. Min_gLatitude=Min_Result(gLatitude_1,gLatitude_2);
  1861. //判断对应点在这个区域范围内
  1862. if(   (gLongitude>Min_gLongitude)&&(gLongitude<Max_gLongitude)
  1863. &&(gLatitude>Min_gLatitude)&&(gLatitude<Max_gLatitude) )
  1864. {
  1865. //当前点在此区域范围内
  1866. //1,如果此区域属于禁入标志
  1867. if(Area_Flag==0xaa) return(1); //可以产生报警
  1868. //2,如果此区域属于禁出标志,
  1869. else if(Area_Flag==0x55) return(2); //
  1870. }
  1871. //判断这个点对应不在这个区域内
  1872. else
  1873. {
  1874. //当前点不在这个区域范围内
  1875. //1,如果此区域属于禁入标志,
  1876. if(Area_Flag==0xaa) return(3); //此区域PASS
  1877. //2,如果此区域属于禁出标志,则返回2
  1878. else if(Area_Flag==0x55) return(4); //此区域计数
  1879. }
  1880. return(0);
  1881. }
  1882. /********************************************************
  1883. * 函数名:Account_Distance()
  1884. 作用域:
  1885. * 功能:
  1886. * 参数:
  1887. * 返回值:
  1888. * 创建人:
  1889. *
  1890. * 修改历史:(每条详述)
  1891. 统计计算告诉了两个精度,两个纬度,计算出,中间点的精度,纬度值
  1892. ********************************************************/
  1893. /********************************************************
  1894. * 函数名:Send_Over_Speed_to_Disp
  1895. 作用域:
  1896. * 功能:  定期送给显示终端超速报警信息
  1897. * 参数:
  1898. * 返回值:
  1899. * 创建人:
  1900. *
  1901. * 修改历史:(每条详述)
  1902. ********************************************************/
  1903. void Send_Over_Alarm_to_Disp(unsigned char Alarm_Style)
  1904. {
  1905. if(gDisp_Buffer_Point+8+2<=sizeof(gDisp_Buffer))
  1906. {
  1907. gDisp_Buffer[gDisp_Buffer_Point]=8+2;
  1908. gDisp_Buffer_Point++;
  1909. gDisp_Buffer[gDisp_Buffer_Point]=0;
  1910. gDisp_Buffer_Point++;
  1911. gDisp_Buffer[gDisp_Buffer_Point]='@';
  1912. gDisp_Buffer_Point++;
  1913. gDisp_Buffer[gDisp_Buffer_Point]='%';
  1914. gDisp_Buffer_Point++;
  1915. gDisp_Buffer[gDisp_Buffer_Point]=8;
  1916. gDisp_Buffer_Point++;
  1917. gDisp_Buffer[gDisp_Buffer_Point]=DISP_MAIN_ARALM_DOWN;
  1918. gDisp_Buffer_Point++;
  1919. gDisp_Buffer[gDisp_Buffer_Point]=Alarm_Style;
  1920. gDisp_Buffer_Point++;
  1921. gDisp_Buffer[gDisp_Buffer_Point]=0;
  1922. gDisp_Buffer_Point++;
  1923. gDisp_Buffer[gDisp_Buffer_Point]='$';
  1924. gDisp_Buffer_Point++;
  1925. gDisp_Buffer[gDisp_Buffer_Point]='&';
  1926. gDisp_Buffer_Point++;
  1927. }
  1928. }
  1929. /********************************************************
  1930. * 函数名:Check_Line_Data
  1931. 作用域:
  1932. * 功能:  定期送给显示终端超速报警信息
  1933. * 参数:
  1934. * 返回值:
  1935. * 创建人:
  1936. *
  1937. * 修改历史:(每条详述)
  1938. S_Num_ID的值的范围为1----61
  1939. ********************************************************/
  1940. unsigned char  Check_Line_Data(unsigned char S_Num_ID)
  1941. {
  1942. unsigned long int gLatitude_1,gLatitude_2;
  1943. unsigned long int gLongitude_1,gLongitude_2;
  1944. unsigned long int nLength=0;
  1945. unsigned char nR_Value=0;
  1946. double gLat_1,gLon_1,gLat_2,gLon_2;
  1947. unsigned int SLine_Address;
  1948. double  Distance_LAT=0,Distance_LON=0;
  1949. //先根据ID号计算相邻的两个点的第一个点的在SRAM中的位置
  1950. SLine_Address=SLINE_DATA_1+8*S_Num_ID;
  1951. //依次读取数据
  1952. SRAM_Init();
  1953. //第一个点的经,纬度
  1954. gLongitude_1 = SRAM_Read(SLine_Address);
  1955. gLongitude_1<<=8;
  1956. gLongitude_1 += SRAM_Read(SLine_Address+1);
  1957. gLongitude_1<<=8;
  1958. gLongitude_1 += SRAM_Read(SLine_Address+2);
  1959. gLongitude_1<<=8;
  1960. gLongitude_1 += SRAM_Read(SLine_Address+3);
  1961. gLatitude_1 = SRAM_Read(SLine_Address+4);
  1962. gLatitude_1<<=8;
  1963. gLatitude_1 += SRAM_Read(SLine_Address+5);
  1964. gLatitude_1<<=8;
  1965. gLatitude_1 += SRAM_Read(SLine_Address+6);
  1966. gLatitude_1<<=8;
  1967. gLatitude_1 += SRAM_Read(SLine_Address+7);
  1968. //第二个点的经度,纬度
  1969. gLongitude_2 = SRAM_Read(SLine_Address+8);
  1970. gLongitude_2<<=8;
  1971. gLongitude_2 += SRAM_Read(SLine_Address+9);
  1972. gLongitude_2<<=8;
  1973. gLongitude_2 += SRAM_Read(SLine_Address+10);
  1974. gLongitude_2<<=8;
  1975. gLongitude_2 += SRAM_Read(SLine_Address+11);
  1976. gLatitude_2 = SRAM_Read(SLine_Address+12);
  1977. gLatitude_2<<=8;
  1978. gLatitude_2 += SRAM_Read(SLine_Address+13);
  1979. gLatitude_2<<=8;
  1980. gLatitude_2 += SRAM_Read(SLine_Address+14);
  1981. gLatitude_2<<=8;
  1982. gLatitude_2 += SRAM_Read(SLine_Address+15);
  1983. //==============
  1984. //==============
  1985. //开始计算两个点的相关数据
  1986. gLat_1=(double)(gLatitude_1/3600000.0);
  1987. gLon_1=(double)(gLongitude_1/3600000.0);
  1988. gLat_2=(double)(gLatitude_2/3600000.0);
  1989. gLon_2=(double)(gLongitude_2/3600000.0);
  1990. nR_Value=Account_Mid_Dot(gLon_1,gLat_1,gLon_2,gLat_2);
  1991. //1,异常
  1992. if(nR_Value==0) return(0);
  1993. //2,垂直点落在线段外
  1994. else if(nR_Value==1) return(1);
  1995. //3,当前离第一个判断点的距离就不满足偏离条件
  1996. else if(nR_Value==5) return(3);
  1997. //4,有需要进行计算距离的,计算的垂直的交点在当前线段内
  1998. else
  1999. {
  2000. //1,计算两点经度差值所表示的实际距离
  2001. nLength=labs(gLatitude_mid-gLatitude);
  2002. Distance_LAT=(double)((nLength/1000.0)*DIS_LAT);
  2003. //2,计算两点纬度差值所表示的实际距离
  2004. nLength=labs(gLongitude_mid-gLongitude);
  2005. Distance_LON=(double)((nLength/1000.0)*DIS_LON);
  2006. //A:需要计算两个点经度相同
  2007. if(nR_Value==2)
  2008. {
  2009. if(Distance_LAT>gMax_Limit_Distance) return(2);
  2010. else return(3);
  2011. }
  2012. //B:需要计算两个点纬度相同
  2013. else if(nR_Value==3)
  2014. {
  2015. if(Distance_LON>gMax_Limit_Distance) return(2);
  2016. else return(3);
  2017. }
  2018. //C:需要计算两个点的经度,纬度均不相同
  2019. else if(nR_Value==4)
  2020. {
  2021. if( (Distance_LAT>gMax_Limit_Distance)||(Distance_LON>gMax_Limit_Distance) )
  2022. {
  2023. return(2);
  2024. }
  2025. else
  2026. {
  2027. Distance_LAT=Distance_LAT*Distance_LAT+Distance_LON*Distance_LON;
  2028. Distance_LAT=sqrt(Distance_LAT);
  2029. if(Distance_LAT>gMax_Limit_Distance) return(2);
  2030. else
  2031. {
  2032. return(3);
  2033. }
  2034. //计算两点的距离
  2035. }
  2036. }
  2037. return(0);
  2038. }
  2039. }