📄 mygps.c
字号:
/**
* @file mygps.c
*
* @brief Operations for controlling GPS
*
* @copyright Copyright (C) 2006, dmatek
* @author chris_zhang <www.dmatek.com>
* @author modified, Tang-Hsun Tu (crilit), NTU GINM, Lab 408, 2008/7/4, R96944013@ntu.edu.tw
* @version 1.0
* @date 2008
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
//---------------------------------------------------
// global data
//---------------------------------------------------
#define GPGGA_MSG "$GPGGA"
#define GPGLL_MSG "$GPGLL"
#define GPGSA_MSG "$GPGSA"
#define GPGSV_MSG "$GPGSV"
#define GPRMC_MSG "$GPRMC"
#define GPVTG_MSG "$GPVTG"
#define GPMSS_MSG "$GPMSS"
#define GPZDA_MSG "$GPZDA"
//---------------------------------------------------
//---------------------------------------------------
// function prototype
//---------------------------------------------------
//---------------------------------------------------
/**
* @brief strtok split by , & 0
*
* @param
* arg split argument
*/
static char *mystrtok(char *arg)
{
/* loop counter */
int i;
/* len */
int len;
/* start ptr */
static char *fptr;
/* check stop split */
static unsigned char chk_flag;
/* return ptr */
char *rptr;
if(arg){ /* first */
chk_flag = 0;
len = strlen(arg);
rptr = arg;
fptr = arg;
}else{ /* next split */
len = strlen(fptr);
rptr = fptr;
}
if(len == 0 || chk_flag) return NULL; /* check out ? */
for(i=0; i<=len; ++i){ /* start split */
if(fptr[i] == ','){
fptr[i] = 0;
fptr = fptr + i + 1;
return rptr;
}else if(fptr[i] == '\0'){
chk_flag = 1;
return rptr;
}
}
return NULL;
}
//---------------------------------------------------
/**
* @brief handle GPS GGA command
*
* @param
* cmd GPS command
*/
static void handle_GPGGA(char *cmd)
{
/* ptr */
char *sptr;
/* checksum */
char chk_sum[6];
printf("Global Positioning System Fix Data (GGA)\n");
/* get checksum */
if((sptr = strrchr(cmd, '*'))){
strcpy(chk_sum, sptr + 1);
*sptr = '\0';
}
/* get msg id */
mystrtok(cmd);
/* get UTC Time */
if((sptr = mystrtok(NULL))){
printf("\tUTC Time: %s\n", sptr);
}
/* get Latitude */
if((sptr = mystrtok(NULL))){
printf("\tLatitude: %s\n", sptr);
}
/* get N/S Indictor */
if((sptr = mystrtok(NULL))){
printf("\tN/S Indictor: %s\n", sptr);
}
/* get Longitude */
if((sptr = mystrtok(NULL))){
printf("\tLongitude: %s\n", sptr);
}
/* get E/W Indictor */
if((sptr = mystrtok(NULL))){
printf("\tE/W Indictor: %s\n", sptr);
}
/* get Position Fix Indictor */
if((sptr = mystrtok(NULL))){
printf("\tPosition Fix Indictor: %s, ", sptr);
switch(atoi(sptr)){
case 0: printf("Fix not avaiable or invalid\n"); break;
case 1: printf("GPS SPS Mode, fix valid\n"); break;
case 2: printf("Differential GPS, SPS Mode, fix valid\n"); break;
case 3: printf("GPS PPS Mode, fix valid\n"); break;
}
}
/* get Satellites Used */
if((sptr = mystrtok(NULL))){
printf("\tSatellites Used: %d\n", atoi(sptr));
}
/* get HDOP */
if((sptr = mystrtok(NULL))){
printf("\tHDOP: %s\n", sptr);
}
/* get MSL Altitude */
if((sptr = mystrtok(NULL))){
printf("\tMSL Altitude: %s meters\n", sptr);
}
/* get Units */
if((sptr = mystrtok(NULL))){
printf("\tUnits: %s meters\n", sptr);
}
/* get Geoid Spearation */
if((sptr = mystrtok(NULL))){
printf("\tGeoid Spearation: %s meters\n", sptr);
}
/* get Units */
if((sptr = mystrtok(NULL))){
printf("\tUnits: %s meters\n", sptr);
}
/* Age of Diff. Corr. */
if((sptr = mystrtok(NULL))){
printf("\tAge of Diff. Corr.: %s seconds\n", sptr);
}
/* get diff. ref. station ID */
if((sptr = mystrtok(NULL))){
printf("\tDiff. Ref. station ID: %s\n", sptr);
}else{
printf("\tDiff. Ref. station ID:\n");
}
/* show checksum */
printf("\tChecksum: 0x%s\n", chk_sum);
}
//---------------------------------------------------
/**
* @brief handle GPS GSA command
*
* @param
* cmd GPS command
*/
static void handle_GPGSA(char *cmd)
{
/* ptr */
char *sptr;
/* loop counter */
int i;
/* checksum */
char chk_sum[6];
printf("GNSS DOP and Active Satellites (GSA)\n");
/* get checksum */
if((sptr = strrchr(cmd, '*'))){
strcpy(chk_sum, sptr + 1);
*sptr = '\0';
}
/* get msg id */
mystrtok(cmd);
/* get Mode 1 */
if((sptr = mystrtok(NULL))){
printf("\tMode 1: %s, ", sptr);
switch(sptr[0]){
case 'M': printf("Manual - forced to operate in 2D or 3D mode\n"); break;
case 'A': printf("2DAutomatic - allowed to automatically switch 2D/3D\n"); break;
}
}
/* get Mode 2 */
if((sptr = mystrtok(NULL))){
printf("\tMode 2: %s, ", sptr);
switch(sptr[0]){
case '1': printf("Fix Not Avaiable\n"); break;
case '2': printf("2D\n"); break;
case '3': printf("3D\n"); break;
}
}
/* show channels */
for(i=1; i<=12; ++i){
/* Satellite Used */
if((sptr = mystrtok(NULL))){
if(sptr[0] != '\0')
printf("\tSatellite Used (Sv on Channel %d): %s\n", i, sptr);
}
}
/* get PDOP */
if((sptr = mystrtok(NULL))){
printf("\tPDOP: %s\n", sptr);
}
/* get HDOP */
if((sptr = mystrtok(NULL))){
printf("\tHDOP: %s\n", sptr);
}
/* get VDOP */
if((sptr = mystrtok(NULL))){
printf("\tVDOP: %s\n", sptr);
}else{
printf("\tVDOP: %s\n");
}
/* show checksum */
printf("\tChecksum: 0x%s\n", chk_sum);
}
//---------------------------------------------------
/**
* @brief handle GPS GLL command
*
* @param
* cmd GPS command
*/
static void handle_GPGLL(char *cmd)
{
/* ptr */
char *sptr;
/* checksum */
char chk_sum[6];
printf("Geographic Position with Latitude/Longitude (GLL)\n");
/* get checksum */
if((sptr = strrchr(cmd, '*'))){
strcpy(chk_sum, sptr + 1);
*sptr = '\0';
}
/* get msg id */
mystrtok(cmd);
/* get Latitude */
if((sptr = mystrtok(NULL))){
printf("\tLatitude: %s\n", sptr);
}
/* get N/S Indictor */
if((sptr = mystrtok(NULL))){
printf("\tN/S Indictor: %s\n", sptr);
}
/* get Longitude */
if((sptr = mystrtok(NULL))){
printf("\tLongitude: %s\n", sptr);
}
/* get E/W Indictor */
if((sptr = mystrtok(NULL))){
printf("\tE/W Indictor: %s\n", sptr);
}
/* get UTC Position */
if((sptr = mystrtok(NULL))){
printf("\tUTC Position: %s\n", sptr);
}
/* get Status */
if((sptr = mystrtok(NULL))){
printf("\tStatus: %s\n", sptr);
}else{
printf("\tStatus:\n");
}
/* show checksum */
printf("\tChecksum: 0x%s\n", chk_sum);
}
//---------------------------------------------------
/**
* @brief handle GPS GSV command
*
* @param
* cmd GPS command
*/
static void handle_GPGSV(char *cmd)
{
/* ptr */
char *sptr, *cptr;
/* satellites in view */
int sate_in_view = 0;
/* start sate */
static int start_sate = 1;
/* do message */
int num_of_msg, msg_num;
/* checksum */
char chk_sum[6];
printf("GNSS Satellites in View (GSV)\n");
/* get checksum */
if((sptr = strrchr(cmd, '*'))){
strcpy(chk_sum, sptr + 1);
*sptr = '\0';
}
/* get msg id */
mystrtok(cmd);
/* get number of mesages */
if((sptr = mystrtok(NULL))){
printf("\tNumber of Mesages: %s\n", sptr);
num_of_msg = atoi(sptr);
}
/* get Message Number */
if((sptr = mystrtok(NULL))){
printf("\tMessage Number: %s\n", sptr);
msg_num = atoi(sptr);
/* reset start satellites */
if(msg_num == 1)
start_sate = 1;
}
/* get Satellites in View */
if((sptr = mystrtok(NULL))){
printf("\tSatellites in View: %s\n", sptr);
sate_in_view = atoi(sptr);
}
/* handle satellites */
for(; start_sate<=sate_in_view; ++start_sate){
/* get Satellite ID */
if((sptr = mystrtok(NULL))){
printf("\tSatellite %d (ID: %s)\n", start_sate, sptr);
}else break; /* no item */
/* get Elevation */
if((sptr = mystrtok(NULL))){
printf("\tElevation: %s\n", sptr);
}
/* get Azimuth */
if((sptr = mystrtok(NULL))){
printf("\tAzimuth: %s\n", sptr);
}
/* get SNR (C/No), check with checksum */
if((sptr = mystrtok(NULL))){
printf("\tSNR (C/No): %s\n", sptr);
}else{
printf("\tSNR (C/No):\n");
}
}
/* show checksum */
printf("\tChecksum: 0x%s\n", chk_sum);
}
//---------------------------------------------------
/**
* @brief handle GPS RMC command
*
* @param
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -