Android-x86
Fork
Donation

  • R/O
  • HTTP
  • SSH
  • HTTPS

hardware-gps: Commit

hardware/gps


Commit MetaInfo

Revisión7bd7c2c228553b12c610f07d9c69d5d4165b37c2 (tree)
Tiempo2015-03-23 16:22:28
AutorKeith Conger <keith.conger@gmai...>
CommiterChih-Wei Huang

Log Message

*Fixed accuracy *Add property for baud rate

Cambiar Resumen

Diferencia incremental

--- a/gps.c
+++ b/gps.c
@@ -1,7 +1,7 @@
1-/* //hardware/hw/gps/gps_freerunner.c
2-**
1+/*
32 ** Copyright 2006, The Android Open Source Project
43 ** Copyright 2009, Michael Trimarchi <michael@panicking.kicks-ass.org>
4+** Copyright 2015, Keith Conger <keith.conger@gmail.com>
55 **
66 ** This program is free software; you can redistribute it and/or modify it under
77 ** the terms of the GNU General Public License as published by the Free
@@ -28,7 +28,7 @@
2828 #include <signal.h>
2929 #include <unistd.h>
3030
31-#define LOG_TAG "gps_gj"
31+#define LOG_TAG "gps_serial"
3232
3333 #include <cutils/log.h>
3434 #include <cutils/sockets.h>
@@ -61,7 +61,7 @@ static int id_in_fixed[12];
6161 #define GPS_DEV_HIGH_UPDATE_RATE (1)
6262
6363 #define GPS_DEV_LOW_BAUD (B9600)
64-#define GPS_DEV_HIGH_BAUD (B19200)
64+#define GPS_DEV_HIGH_BAUD (B115200)
6565 static void gps_dev_init(int fd);
6666 static void gps_dev_deinit(int fd);
6767 static void gps_dev_start(int fd);
@@ -104,7 +104,7 @@ nmea_tokenizer_init( NmeaTokenizer* t, const char* p, const char* end )
104104 end -= 1;
105105 }
106106
107- // get rid of checksum at the end of the sentecne
107+ // get rid of checksum at the end of the sentence
108108 if (end >= p+3 && end[-3] == '*') {
109109 end -= 3;
110110 }
@@ -146,7 +146,6 @@ nmea_tokenizer_get( NmeaTokenizer* t, int index )
146146 return tok;
147147 }
148148
149-
150149 static int
151150 str2int( const char* p, const char* end )
152151 {
@@ -193,7 +192,6 @@ str2float( const char* p, const char* end )
193192 /*****************************************************************/
194193 /*****************************************************************/
195194
196-//#define NMEA_MAX_SIZE 83
197195 #define NMEA_MAX_SIZE 255
198196
199197 typedef struct {
@@ -417,6 +415,25 @@ nmea_reader_update_altitude( NmeaReader* r,
417415 }
418416
419417
418+static int nmea_reader_update_accuracy( NmeaReader* r,
419+ Token accuracy )
420+{
421+ double acc;
422+ Token tok = accuracy;
423+
424+ if (tok.p >= tok.end)
425+ return -1;
426+
427+ r->fix.accuracy = str2float(tok.p, tok.end);
428+ if (r->fix.accuracy == 99.99){
429+ return 0;
430+ }
431+
432+ r->fix.flags |= GPS_LOCATION_HAS_ACCURACY;
433+ return 0;
434+}
435+
436+
420437 static int
421438 nmea_reader_update_bearing( NmeaReader* r,
422439 Token bearing )
@@ -487,8 +504,7 @@ nmea_reader_parse( NmeaReader* r )
487504 _gps_state->callbacks->nmea_cb(tv.tv_sec*1000+tv.tv_usec/1000, r->in, r->pos);
488505
489506 nmea_tokenizer_init(tzer, r->in, r->in + r->pos);
490-//#if GPS_DEBUG
491-#if 0
507+#if GPS_DEBUG
492508 {
493509 int n;
494510 D("Found %d tokens", tzer->count);
@@ -504,14 +520,6 @@ nmea_reader_parse( NmeaReader* r )
504520 D("sentence id '%.*s' too short, ignored.", tok.end-tok.p, tok.p);
505521 return;
506522 }
507-/*
508-$GPRMC,084537.345,V,,,,,,,270811,,,N*4F
509-$GPGGA,084538.353,,,,,0,00,,,M,0.0,M,,0000*51
510-$GPGSA,A,1,,,,,,,,,,,,,,,*1E
511-$GPGSV,3,1,11,09,80,303,,12,41,229,,15,40,178,,17,39,070,*70
512-$GPGSV,3,2,11,22,20,295,,18,18,256,,14,13,317,,26,10,154,*72
513-$GPGSV,3,3,11,25,08,234,,28,08,056,,24,04,011,*40
514-*/
515523 // ignore first two characters.
516524 tok.p += 2;
517525 if ( !memcmp(tok.p, "GGA", 3) ) {
@@ -521,6 +529,7 @@ $GPGSV,3,3,11,25,08,234,,28,08,056,,24,04,011,*40
521529 Token tok_latitudeHemi = nmea_tokenizer_get(tzer,3);
522530 Token tok_longitude = nmea_tokenizer_get(tzer,4);
523531 Token tok_longitudeHemi = nmea_tokenizer_get(tzer,5);
532+ Token tok_accuracy = nmea_tokenizer_get(tzer,8);
524533 Token tok_altitude = nmea_tokenizer_get(tzer,9);
525534 Token tok_altitudeUnits = nmea_tokenizer_get(tzer,10);
526535
@@ -531,6 +540,8 @@ $GPGSV,3,3,11,25,08,234,,28,08,056,,24,04,011,*40
531540 tok_longitudeHemi.p[0]);
532541 nmea_reader_update_altitude(r, tok_altitude, tok_altitudeUnits);
533542
543+ nmea_reader_update_accuracy(r, tok_accuracy);
544+
534545 } else if ( !memcmp(tok.p, "GSA", 3) ) {
535546 //Satellites are handled by RPC-side code.
536547 /*
@@ -552,6 +563,7 @@ $GPGSV,3,3,11,25,08,234,,28,08,056,,24,04,011,*40
552563 Token tok_pdop = nmea_tokenizer_get(tzer,15);
553564 Token tok_hdop = nmea_tokenizer_get(tzer,16);
554565 Token tok_vdop = nmea_tokenizer_get(tzer,17);
566+
555567 int i;
556568 for ( i=0; i<12; i++ ) {
557569 Token tok_id = nmea_tokenizer_get(tzer,3+i);
@@ -641,12 +653,25 @@ $GPGSV,3,3,11,25,08,234,,28,08,056,,24,04,011,*40
641653 nmea_reader_update_bearing( r, tok_bearing );
642654 nmea_reader_update_speed ( r, tok_speed );
643655 }
656+ } else if ( !memcmp(tok.p, "VTG", 3) ) {
657+ Token tok_fixStatus = nmea_tokenizer_get(tzer,9);
658+
659+ if (tok_fixStatus.p[0] != '\0' && tok_fixStatus.p[0] != 'N') {
660+ Token tok_bearing = nmea_tokenizer_get(tzer,1);
661+ Token tok_speed = nmea_tokenizer_get(tzer,5);
662+
663+ nmea_reader_update_bearing( r, tok_bearing );
664+ nmea_reader_update_speed ( r, tok_speed );
665+ }
644666 } else {
645667 tok.p -= 2;
646668 D("unknown sentence '%.*s", tok.end-tok.p, tok.p);
647669 }
648- if (r->fix.flags != 0) {
670+
671+
649672 #if GPS_DEBUG
673+ if (r->fix.flags) {
674+
650675 char temp[256];
651676 char* p = temp;
652677 char* end = p + sizeof(temp);
@@ -670,22 +695,16 @@ $GPGSV,3,3,11,25,08,234,,28,08,056,,24,04,011,*40
670695 }
671696 gmtime_r( (time_t*) &r->fix.timestamp, &utc );
672697 p += snprintf(p, end-p, " time=%s", asctime( &utc ) );
698+ ALOGD("%s\n", temp);
699+ }
673700 #endif
674- if (_gps_state->callbacks->location_cb) {
675- _gps_state->callbacks->location_cb( &r->fix );
676- r->fix.flags = 0;
677- } else {
678- D("no callback, keeping data until needed !");
679- }
680-
681-/*
682- if (r->callback) {
683- r->callback( &r->fix );
701+ if (r->fix.flags & GPS_LOCATION_HAS_ACCURACY) {
702+ if (_gps_state->callbacks->location_cb) {
703+ _gps_state->callbacks->location_cb( &r->fix );
684704 r->fix.flags = 0;
685705 } else {
686706 D("no callback, keeping data until needed !");
687707 }
688-*/
689708 }
690709 }
691710
@@ -729,10 +748,6 @@ enum {
729748 CMD_STOP = 2
730749 };
731750
732-
733-
734-
735-
736751 static void
737752 gps_state_done( GpsState* s )
738753 {
@@ -845,7 +860,6 @@ gps_state_thread( void* arg )
845860 ALOGE("epoll_wait() unexpected error: %s", strerror(errno));
846861 continue;
847862 }
848-// D("gps thread received %d events", nevents);
849863 for (ne = 0; ne < nevents; ne++) {
850864 if ((events[ne].events & (EPOLLERR|EPOLLHUP)) != 0) {
851865 ALOGE("EPOLLERR or EPOLLHUP after epoll_wait() !?");
@@ -882,7 +896,6 @@ gps_state_thread( void* arg )
882896 }
883897 } else if (fd == gps_fd) {
884898 char buff[32];
885-// D("gps fd event");
886899 for (;;) {
887900 int nn, ret;
888901
@@ -894,11 +907,9 @@ gps_state_thread( void* arg )
894907 ALOGE("error while reading from gps daemon socket: %s:", strerror(errno));
895908 break;
896909 }
897-// D("received %d bytes: %.*s", ret, ret, buff);
898910 for (nn = 0; nn < ret; nn++)
899911 nmea_reader_addc( reader, buff[nn] );
900912 }
901-// D("gps fd event end");
902913 } else {
903914 ALOGE("epoll_wait() returned unkown fd %d ?", fd);
904915 }
@@ -912,6 +923,7 @@ static void
912923 gps_state_init( GpsState* state, GpsCallbacks* callbacks )
913924 {
914925 char prop[PROPERTY_VALUE_MAX];
926+ char baud[PROPERTY_VALUE_MAX];
915927 char device[256];
916928 int ret;
917929 int done = 0;
@@ -932,10 +944,6 @@ gps_state_init( GpsState* state, GpsCallbacks* callbacks )
932944 return;
933945 }
934946
935- //if ( snprintf(device, sizeof(device), "/dev/%s", prop) >= (int)sizeof(device) ) {
936- // ALOGE("gps serial device name too long: '%s'", prop);
937- // return;
938- //}
939947 snprintf(device, sizeof(device), "/dev/%s",prop);
940948 do {
941949 state->fd = open( device, O_RDWR );
@@ -956,10 +964,29 @@ gps_state_init( GpsState* state, GpsCallbacks* callbacks )
956964 ios.c_oflag &= (~ONLCR); /* Stop \n -> \r\n translation on output */
957965 ios.c_iflag &= (~(ICRNL | INLCR)); /* Stop \r -> \n & \n -> \r translation on input */
958966 ios.c_iflag |= (IGNCR | IXOFF); /* Ignore \r & XON/XOFF on input */
959- ios.c_cflag = B115200 | CRTSCTS | CS8 | CLOCAL | CREAD; // baud 115200, cs8
960-//GJ
967+ // set baud rate and other flags
968+ property_get("ro.kernel.android.gpsttybaud",baud,"9600");
969+ if (strcmp(baud, "9600") == 0) {
970+ ALOGE("setting gps baud rate to 9600");
971+ ios.c_cflag = B9600 | CRTSCTS | CS8 | CLOCAL | CREAD;
972+ } else if (strcmp(baud, "19200") == 0) {
973+ ALOGE("setting gps baud rate to 19200");
974+ ios.c_cflag = B19200 | CRTSCTS | CS8 | CLOCAL | CREAD;
975+ } else if (strcmp(baud, "38400") == 0) {
976+ ALOGE("setting gps baud rate to 38400");
977+ ios.c_cflag = B38400 | CRTSCTS | CS8 | CLOCAL | CREAD;
978+ } else if (strcmp(baud, "57600") == 0) {
979+ ALOGE("setting gps baud rate to 57600");
980+ ios.c_cflag = B57600 | CRTSCTS | CS8 | CLOCAL | CREAD;
981+ } else if (strcmp(baud, "115200") == 0) {
982+ ALOGE("setting gps baud rate to 115200");
983+ ios.c_cflag = B115200 | CRTSCTS | CS8 | CLOCAL | CREAD;
984+ } else {
985+ ALOGE("gps baud rate unknown: '%s'", baud);
986+ return;
987+ }
988+
961989 tcsetattr( state->fd, TCSANOW, &ios );
962-//EGJ
963990 }
964991
965992 if ( socketpair( AF_LOCAL, SOCK_STREAM, 0, state->control ) < 0 ) {
@@ -993,9 +1020,9 @@ Fail:
9931020
9941021
9951022 static int
996-freerunner_gps_init(GpsCallbacks* callbacks)
1023+serial_gps_init(GpsCallbacks* callbacks)
9971024 {
998- D("freerunner_gps_init");
1025+ D("serial_gps_init");
9991026 GpsState* s = _gps_state;
10001027
10011028 if (!s->init)
@@ -1004,13 +1031,11 @@ freerunner_gps_init(GpsCallbacks* callbacks)
10041031 if (s->fd < 0)
10051032 return -1;
10061033
1007-
1008-
10091034 return 0;
10101035 }
10111036
10121037 static void
1013-freerunner_gps_cleanup(void)
1038+serial_gps_cleanup(void)
10141039 {
10151040 GpsState* s = _gps_state;
10161041
@@ -1020,7 +1045,7 @@ freerunner_gps_cleanup(void)
10201045
10211046
10221047 static int
1023-freerunner_gps_start()
1048+serial_gps_start()
10241049 {
10251050 GpsState* s = _gps_state;
10261051
@@ -1036,7 +1061,7 @@ freerunner_gps_start()
10361061
10371062
10381063 static int
1039-freerunner_gps_stop()
1064+serial_gps_stop()
10401065 {
10411066 GpsState* s = _gps_state;
10421067
@@ -1052,32 +1077,28 @@ freerunner_gps_stop()
10521077
10531078
10541079 static int
1055-freerunner_gps_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty)
1080+serial_gps_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty)
10561081 {
10571082 return 0;
10581083 }
10591084
10601085
10611086 static int
1062-freerunner_gps_inject_location(double latitude, double longitude, float accuracy)
1087+serial_gps_inject_location(double latitude, double longitude, float accuracy)
10631088 {
10641089 return 0;
10651090 }
10661091
10671092 static void
1068-freerunner_gps_delete_aiding_data(GpsAidingData flags)
1093+serial_gps_delete_aiding_data(GpsAidingData flags)
10691094 {
10701095 }
10711096
1072-static int freerunner_gps_set_position_mode(GpsPositionMode mode, GpsPositionRecurrence recurrence,
1097+static int serial_gps_set_position_mode(GpsPositionMode mode, GpsPositionRecurrence recurrence,
10731098 uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time)
10741099 {
10751100 GpsState* s = _gps_state;
10761101
1077- // only standalone supported for now.
1078-// if (mode != GPS_POSITION_MODE_STANDALONE)
1079-// return -1;
1080-
10811102 if (!s->init) {
10821103 D("%s: called with uninitialized state !!", __FUNCTION__);
10831104 return -1;
@@ -1090,28 +1111,28 @@ static int freerunner_gps_set_position_mode(GpsPositionMode mode, GpsPositionRec
10901111 }
10911112
10921113 static const void*
1093-freerunner_gps_get_extension(const char* name)
1114+serial_gps_get_extension(const char* name)
10941115 {
10951116 return NULL;
10961117 }
10971118
1098-static const GpsInterface freerunnerGpsInterface = {
1119+static const GpsInterface serialGpsInterface = {
10991120 sizeof(GpsInterface),
1100- freerunner_gps_init,
1101- freerunner_gps_start,
1102- freerunner_gps_stop,
1103- freerunner_gps_cleanup,
1104- freerunner_gps_inject_time,
1105- freerunner_gps_inject_location,
1106- freerunner_gps_delete_aiding_data,
1107- freerunner_gps_set_position_mode,
1108- freerunner_gps_get_extension,
1121+ serial_gps_init,
1122+ serial_gps_start,
1123+ serial_gps_stop,
1124+ serial_gps_cleanup,
1125+ serial_gps_inject_time,
1126+ serial_gps_inject_location,
1127+ serial_gps_delete_aiding_data,
1128+ serial_gps_set_position_mode,
1129+ serial_gps_get_extension,
11091130 };
11101131
11111132 const GpsInterface* gps_get_hardware_interface()
11121133 {
11131134 D("gps dev get_hardware_interface");
1114- return &freerunnerGpsInterface;
1135+ return &serialGpsInterface;
11151136 }
11161137
11171138
@@ -1237,9 +1258,8 @@ static void gps_dev_set_message_rate(int fd, int rate)
12371258 unsigned int i;
12381259
12391260 char *msg[] = {
1240- "GGA", "GLL", "ZDA",
1241- "VTG", "GSA", "GSV",
1242- "RMC"
1261+ "GGA", "GLL", "VTG",
1262+ "GSA", "GSV", "RMC"
12431263 };
12441264
12451265 for (i = 0; i < sizeof(msg)/sizeof(msg[0]); ++i) {
@@ -1308,7 +1328,7 @@ struct hw_module_t HAL_MODULE_INFO_SYM = {
13081328 .version_major = 1,
13091329 .version_minor = 0,
13101330 .id = GPS_HARDWARE_MODULE_ID,
1311- .name = "USB GPS Module",
1331+ .name = "Serial GPS Module",
13121332 .author = "The Android-x86 Open Source Project",
13131333 .methods = &gps_module_methods,
13141334 };
Show on old repository browser