📄 gps.c
字号:
//////////////////////////////////////
int gps(void) //GPS操作线程
{ char databuf[4097];
char gpsbuf[4097];
int rdlen, i;
char *p_addr=NULL;
//char *p;
struct timeval tv;
int count;
tv.tv_sec = 1;
tv.tv_usec = 0;
//ptv_t ptv=NULL; //struct time out;
//while(1) //read the data
// {
bzero(databuf, sizeof(databuf));
bzero(gpsbuf, sizeof(gpsbuf));
bzero(ngps_w_d, sizeof(ngps_w_d));
bzero(ngps_w_f, sizeof(ngps_w_f));
bzero(ngps_j_d, sizeof(ngps_j_d));
bzero(ngps_j_f, sizeof(ngps_j_f));
bzero(ngps_stime, sizeof(ngps_stime));
bzero(ngps_speed, sizeof(ngps_speed));
bzero(ngps_sate_num, sizeof(ngps_sate_num));
//sleep(1);
rdlen = collgps_recPort(fd_gps, databuf, &tv, GPSMFLAG);
if(rdlen > 0)
// for(i=0; i<rdlen; i++)
// printf("0x%.2x,",databuf[i]);
sprintf(gpsbuf, "%s", databuf); //put the data in gpsbuf
#ifdef GPSDEBUG
printf("recv:\n%s", gpsbuf);
#endif
// getchar();
if(( p_addr = strstr(gpsbuf, "RMC")) != NULL)
{
// p_addr = p;
#ifdef GPSDEBUG
printf("$GPRMC:\n");
#endif
count = 0;
// printf("p-addr= %c\n", *p_addr);
while(*p_addr != '*')
{
// printf("test5 if ,,\n");
if(*p_addr == ',')
{
// printf("test1 if ,,\n");
count++;
#ifdef GPSDEBUG
printf("%d ", count);
#endif
p_addr++;
}
else{
//printf("p_addr= %c\n", *p_addr);
p_addr++;
continue;
}
//printf("test2 if ,,\n");
if(*p_addr != ',')
{
switch(count)
{
case 1:
{
strget(p_addr, 0, 6, ngps_stime);
// ngps_stime[6]='\0';
// printf("jl test ngps_stime=%s\n", ngps_stime);
#ifdef GPSDEBUG
printf("tt\n");
#endif
p_addr +=6;
// printf("tt2\n");
break;
}
case 2:
{
if(*p_addr == 'A')
{
#ifdef GPSDEBUG
printf("the gps data A or V:: %c ! \n", *p_addr);
#endif
// printf("the gps data availability!\n");
// printf("please input write_lamp 1\n");
}
p_addr +=1;
break;
}
case 3://w
{
strget(p_addr, 0, 2, ngps_w_d);
ngps_w_d[2] = '\0';
#ifdef GPSDEBUG
printf("dtest gps_w_d=%s\n", ngps_w_d);
#endif
p_addr +=2;
strget(p_addr, 0, 2, ngps_w_f);
p_addr +=3; //.
strput(ngps_w_f, 2, p_addr, 0, 4);
ngps_w_f[6] = '\0';
#ifdef GPSDEBUG
printf("dtest gps_w_f=%s\n", ngps_w_f);
#endif
p_addr +=4;
// printf("test test\n");
break;
}
case 4:
{
ngps_w = *p_addr;
p_addr +=1;
#ifdef GPSDEBUG
printf("dtest gps_w=%c\n", ngps_w);
#endif
break;
}
case 5://J
{
strget(p_addr, 0, 3, ngps_j_d);
ngps_j_d[3] = '\0';
#ifdef GPSDEBUG
printf("dtest gps_j_d=%s\n", ngps_j_d);
#endif
p_addr +=3;
strget(p_addr, 0, 2, ngps_j_f);
p_addr +=3;//.
strput(ngps_j_f, 2, p_addr, 0, 4);
ngps_j_f[6] = '\0';
#ifdef GPSDEBUG
printf("dtest gps_j_f=%s\n", ngps_j_f);
#endif
p_addr +=4;
break;
}
case 6:
{
ngps_j = *p_addr;
p_addr +=1;
#ifdef GPSDEBUG
printf("dtest gps_j=%c\n", ngps_j);
#endif
break;
}
case 7:
{
strget(p_addr, 0, 3, ngps_speed);
p_addr +=4;//.
strput(ngps_speed, 3, p_addr, 0, 1);
ngps_speed[4] = '\0';
p_addr +=1;
#ifdef GPSDEBUG
printf("dtest speed ::%s\n ", ngps_speed);
#endif
break;
}
case 8:
{
p_addr +=4;//.
p_addr +=1;//,
// printf("course over groud\n");
break;
}
case 9:
{
strput(ngps_stime, 6, p_addr, 0, 6);
p_addr +=6;
p_addr +=1;
ngps_stime[12] = '\0';
// printf("gps set time\n");
// gps_set_time(ngps_stime); //ok
#ifdef GPSDEBUG
printf("UTC time ::%s\n ", ngps_stime);
#endif
break;
}
default :
{
break;
}
}
}
else
{
//p_addr++;
continue;
}
}
}
// getchar();
if((p_addr = strstr(gpsbuf, "GGA")) != NULL)
{
#ifdef GPSDEBUG
printf("\n$GPGGA:\n");
#endif
// p_addr = p;
count = 0;
while(*p_addr != '*')
{
if(*p_addr == ',')
{
count++;
#ifdef GPSDEBUG
printf("%d ", count);
#endif
p_addr++;
}
else{
//printf("p_addr= %c\n", *p_addr);
p_addr++;
continue;
}
if(*p_addr != ',')
{
switch(count)
{
case 6:
{
gps_status = *p_addr;
if(gps_status == '0')
alarm_enable = 1;
// else
// alarm_enable = 0;
#ifdef GPSDEBUG
printf("gps_status = %c\n", gps_status);
#endif
p_addr +=1;
break;
}
case 7:
{
strget(p_addr, 0, 2, ngps_sate_num);
ngps_sate_num[2] = '\0';
#ifdef GPSDEBUG
printf("gps sate %s nums.\n", ngps_sate_num);
#endif
p_addr +=2;
break;
}
default:
{
break;
}
}
}
else
continue;
}
}
// }
//close(fd_gps);
return 0;
}
void catch_alrm(int signo)
{
//Block signal
char data_buf[128];
//sigprocmask(SIG_BLOCK, &sig_set, NULL);
//check ONLINE?
//printf("~~0_o~~\n");
//printf("B: %3d,%1d C: %2d,%1d W: %2d,%1d \n", poll_flag,poll_enable, track_flag,track_enable, alarm_flag,alarm_enable);
if(ON_LINE == 0)
pthread_exit(NULL); //exit circle pthread
if((poll_enable == 1 )&&(poll_flag == 0 ))
{
poll_flag = atoi(polling_interval) *60;
B_FLAG = 1;
#if 0
send_flag = 'B';
coll_data(NULL, 'L', data_buf);
send_data_mc(data_buf);
#endif
//send_data();
}
else if(poll_enable == 1) poll_flag--;
if((track_enable ==1 )&&(track_flag == 0 ))
{
track_flag = atoi(track_interval)*60;
C_FLAG = 1;
#if 0
send_flag = 'C';
coll_data(NULL, 'L', data_buf);
send_data_mc(data_buf);
#endif
//send_data();
}
else if(track_enable ==1 ) track_flag--;
if((sw_enable ==1 )&&(sw_flag == 0 ))
{
sw_flag = atoi(sw_interval)*60;
N_FLAG = 1;
#if 0
send_flag = 'N';
coll_data(NULL, 'N', data_buf);
send_data_mcsw(data_buf);
#endif
//send_data();
}
else if(sw_enable ==1 ) sw_flag--;
if((alarm_enable ==1 )&&(alarm_flag == 0 ))
{
alarm_flag = atoi(alarm_interval)*60;
W_FLAG = 1;
#if 0
send_flag = 'W';
coll_data(NULL, 'L', data_buf);
send_data_mc(data_buf);
#endif
//send_data();
}
else if(alarm_enable ==1 ) alarm_flag--;
//flush
write_lamp=1;
gps(); //GPS操作线程
write_lamp=0;
//signal(SIGALRM, catch_alrm);
//sigprocmask(SIG_UNBLOCK, &sig_set, NULL);
//write_lamp = 1;
//write_lamp =0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -