NMEA0813フォーマットのGPSから情報を取り出すプログラムです。

Dependents:   GPS_test EM_Logger

nmea0813.cpp

Committer:
YSB
Date:
2013-06-02
Revision:
1:f4d3c59a4917
Parent:
0:42a334c405de

File content as of revision 1:f4d3c59a4917:

#include "nmea0813.h"
 
GPS::GPS(PinName tx,PinName rx) : Serial(tx,rx){
    //time_str[8] = {'0','0',':','0','0',':','0','0'};
    //latitude_str[9] = {'0','0','0','0','.','0','0','0','0'};
    //longitude_str[10]= {'0','0','0','0','0','.','0','0','0','0'};
    flg = 0;
    count = 0;
    attach(this, &GPS::rxHandler,Serial::RxIrq);
    T.attach(this,&GPS::update_infomation,1.0);
}
 
 
void GPS::rxHandler(void){

    rxbuf = getc();
    GPSdata[count] = rxbuf;
    if(rxbuf == '$'){       
        count++;
    }
    else if(rxbuf == LF){
        count++;
        flg++;
    }
    else{
        count++;
    }
    if(flg == 7){
        flg = 0;
        count=0;
    }
}

void GPS::update_infomation() { //repeatedlly called function
    set_GGA_RMC(GPSdata);
}

void GPS::set_GGA_RMC(char* str){
    int nullflg=0;
    char *sp;

    sp = (char*) strstr(str,"$GPGGA");
    for(int i=0;i<80;i++){
        if(nullflg ==0){
            if(sp[i] != '\n'){
                GPGGA[i] = sp[i];
            }else{
                GPGGA[i] = '\n';
                nullflg = 1;
            }
        }else{
            //break;
            GPGGA[i] = '\n';
        }           
    }
    nullflg = 0;
    sp = (char*) strstr(str,"$GPRMC");
    for(int i=0;i<80;i++){
        if(nullflg ==0){
            if(sp[i] != '\n'){
                GPRMC[i] = sp[i];
            }else{
                GPRMC[i] = '\n';
                nullflg = 1;
            }
        }else{
            //break;
            GPRMC[i] = '\n';
        }           
    }
    nullflg = 0;
}

char* GPS::get_time(){
    time_str[0]=GPGGA[7];
    time_str[1]=GPGGA[8];
    time_str[2]=':';
    time_str[3]=GPGGA[9];
    time_str[4]=GPGGA[10];
    time_str[5]=':';
    time_str[6]=GPGGA[11];
    time_str[7]=GPGGA[12];
    return time_str;
}

float GPS::get_latitude(){
    for(int i=0;i<9;i++){
        latitude_str[i]=GPGGA[18+i];
    }
    latitude = (float)(latitude_str[0]-0x30)*10.0+  \
               (float)(latitude_str[1]-0x30)+       \
               ((float)(latitude_str[2]-0x30)*10.0+ \
               (float)(latitude_str[3]-0x30)+       \
               (float)(latitude_str[5]-0x30)*0.1+   \
               (float)(latitude_str[6]-0x30)*0.01+  \
               (float)(latitude_str[7]-0x30)*0.001+ \
               (float)(latitude_str[8]-0x30)*0.0001)/60.0;
    return latitude;
}

char* GPS::get_str_latitude(){
    for(int i=0;i<9;i++){
        latitude_str[i]=GPGGA[18+i];
    }
    return latitude_str;
}

float GPS::get_longitude(){
    for(int i=0;i<10;i++){
        longitude_str[i]=GPGGA[30+i];
    }
    longitude = (float)(longitude_str[0]-0x30)*100.0+ \
               (float)(longitude_str[1]-0x30)*10.0+  \
               (float)(longitude_str[2]-0x30)+       \
               ((float)(longitude_str[3]-0x30)*10.0+ \
               (float)(longitude_str[4]-0x30)+       \
               (float)(longitude_str[6]-0x30)*0.1+   \
               (float)(longitude_str[7]-0x30)*0.01+  \
               (float)(longitude_str[8]-0x30)*0.001+ \
               (float)(longitude_str[9]-0x30)*0.0001)/60.0;
    return longitude;
}

char* GPS::get_str_longitude(){
    for(int i=0;i<10;i++){
        longitude_str[i]=GPGGA[30+i];
    }
    return longitude_str;
}

char GPS::get_status(){
    status = GPRMC[18];
    return status;
}

float GPS::get_speed(){
    for(int i=0;i<5;i++){
        speed_str[i]=GPRMC[51+i];
    }
    speed = (float)(speed_str[0]-0x30)*100.0+\
            (float)(speed_str[1]-0x30)*10.0+\
            (float)(speed_str[2]-0x30)*1.0+\
            (float)(speed_str[4]-0x30)*0.1;
    return speed;
}

char GPS::get_satelite_number(){
    number_of_satelite = GPGGA[46];
    return number_of_satelite;
}