leo: updated to libgps 2.1 NMEA (thanks to tytung)

This commit is contained in:
Arif Ali 2011-08-31 22:43:39 +01:00
parent 43c99f3a9e
commit 491578e176
2 changed files with 52 additions and 16 deletions

View File

@ -40,7 +40,6 @@
#define ENABLE_NMEA 1
#define MEASUREMENT_PRECISION 10.0f // in meters
#define DUMP_DATA 0
#define GPS_DEBUG 0
@ -96,6 +95,13 @@ static struct CLIENT *_clnt;
static struct timeval timeout;
static SVCXPRT *_svc;
static uint8_t CHECKED[4] = {0};
static uint8_t XTRA_AUTO_DOWNLOAD_ENABLED = 0;
static uint8_t XTRA_DOWNLOAD_INTERVAL = 24; // hours
static uint8_t CLEANUP_ENABLED = 1;
static uint8_t SESSION_TIMEOUT = 2; // seconds
static uint8_t MEASUREMENT_PRECISION = 10; // meters
struct params {
uint32_t *data;
int length;
@ -691,7 +697,7 @@ void dispatch_pdsm_pd(uint32_t *data) {
if (ntohl(data[75])) {
fix.flags |= GPS_LOCATION_HAS_ACCURACY;
float hdop = (float)ntohl(data[75]) / 10.0f / 2.0f;
fix.accuracy = hdop * MEASUREMENT_PRECISION;
fix.accuracy = hdop * (float)MEASUREMENT_PRECISION;
}
union {
@ -752,7 +758,6 @@ void dispatch_pdsm_ext(uint32_t *data) {
no_fix++;
if (no_fix < 2) return;
if (no_fix == UINT32_MAX) no_fix = 2; // avoid overflow
ret.num_svs=ntohl(data[8]);
D("%s() is called. num_svs=%d", __FUNCTION__, ret.num_svs);
@ -838,17 +843,16 @@ void dispatch(struct svc_req* a, registered_server* svc) {
svc_sendreply(svc, xdr_int, &result);
}
static uint8_t CHECKED[4] = {0};
static uint8_t XTRA_AUTO_DOWNLOAD_ENABLED = 0;
static uint8_t XTRA_DOWNLOAD_INTERVAL = 24; // hours
static uint8_t CLEANUP_ENABLED = 1;
static uint8_t SESSION_TIMEOUT = 2; // seconds
uint8_t get_cleanup_value() {
D("%s() is called: %d", __FUNCTION__, CLEANUP_ENABLED);
return CLEANUP_ENABLED;
}
uint8_t get_precision_value() {
D("%s() is called: %d", __FUNCTION__, MEASUREMENT_PRECISION);
return MEASUREMENT_PRECISION;
}
int parse_gps_conf() {
FILE *file = fopen("/system/etc/gps.conf", "r");
if (!file) {
@ -860,6 +864,7 @@ int parse_gps_conf() {
char *check_interval = "GPS1_XTRA_DOWNLOAD_INTERVAL";
char *check_cleanup = "GPS1_CLEANUP_ENABLED";
char *check_timeout = "GPS1_SESSION_TIMEOUT";
char *check_precision = "GPS1_MEASUREMENT_PRECISION";
char *result;
char str[256];
int i = -1;
@ -905,8 +910,23 @@ int parse_gps_conf() {
CHECKED[3] = 1;
}
}
if (!CHECKED[4]) {
result = strstr(str, check_precision);
if (result != NULL) {
result = result+strlen(check_precision)+1;
i = atoi(result);
if (i>0 && i<16)
MEASUREMENT_PRECISION = i;
CHECKED[4] = 1;
}
}
}
fclose(file);
LOGD("%s() is called: GPS1_XTRA_AUTO_DOWNLOAD_ENABLED = %d", __FUNCTION__, XTRA_AUTO_DOWNLOAD_ENABLED);
LOGD("%s() is called: GPS1_XTRA_DOWNLOAD_INTERVAL = %d", __FUNCTION__, XTRA_DOWNLOAD_INTERVAL);
LOGD("%s() is called: GPS1_CLEANUP_ENABLED = %d", __FUNCTION__, CLEANUP_ENABLED);
LOGD("%s() is called: GPS1_SESSION_TIMEOUT = %d", __FUNCTION__, SESSION_TIMEOUT);
LOGD("%s() is called: GPS1_MEASUREMENT_PRECISION = %d", __FUNCTION__, MEASUREMENT_PRECISION);
return 0;
}
@ -952,6 +972,11 @@ int init_leo()
pdsm_client_act(clnt, 4);
if (!CHECKED[0]) {
if (use_nmea)
LOGD("%s() is called: %s version", __FUNCTION__, "NMEA");
else
LOGD("%s() is called: %s version", __FUNCTION__, "RPC");
parse_gps_conf();
if (XTRA_AUTO_DOWNLOAD_ENABLED)
gps_xtra_set_auto_params();

View File

@ -40,7 +40,6 @@
#define XTRA_BLOCK_SIZE 400
#define ENABLE_NMEA 1
#define MEASUREMENT_PRECISION 10.0f // in meters
#define DUMP_DATA 0
#define GPS_DEBUG 1
@ -83,6 +82,7 @@ void update_gps_svstatus(GpsSvStatus *svstatus);
void update_gps_nmea(GpsUtcTime timestamp, const char* nmea, int length);
extern uint8_t get_cleanup_value();
extern uint8_t get_precision_value();
/*****************************************************************/
/*****************************************************************/
@ -445,7 +445,8 @@ nmea_reader_update_accuracy( NmeaReader* r,
return -1;
r->fix.flags |= GPS_LOCATION_HAS_ACCURACY;
r->fix.accuracy = (float)str2float(tok.p, tok.end) * MEASUREMENT_PRECISION;
float precision = (float)get_precision_value();
r->fix.accuracy = (float)str2float(tok.p, tok.end) * precision;
return 0;
}
@ -835,7 +836,9 @@ void update_gps_status(GpsStatusValue value) {
}
void update_gps_svstatus(GpsSvStatus *svstatus) {
#if DUMP_DATA
D("%s(): GpsSvStatus.num_svs=%d", __FUNCTION__, svstatus->num_svs);
#endif
GpsState* state = _gps_state;
//Should be made thread safe...
if(state->callbacks.sv_status_cb)
@ -1125,8 +1128,16 @@ static int gps_xtra_inject_xtra_data(char* data, int length) {
total_parts += 1;
}
uint8_t part_no = total_parts % 10;
if (part_no > 0)
part_no = total_parts - part_no;
else
part_no = total_parts - 5;
len_injected = 0; // O bytes injected
// XTRA injection starts with part 1
D("gps_xtra_inject_xtra_data: inject part = %d/%d, len = %d\n", 1, total_parts, XTRA_BLOCK_SIZE);
D("gps_xtra_inject_xtra_data: ......");
for (part = 1; part <= total_parts; part++)
{
part_len = XTRA_BLOCK_SIZE;
@ -1136,7 +1147,8 @@ static int gps_xtra_inject_xtra_data(char* data, int length) {
}
xtra_data_ptr = data + len_injected;
D("gps_xtra_inject_xtra_data: inject part = %d/%d, len = %d\n", part, total_parts, part_len);
if (part > part_no) // reduce the number of the xtra debugging info
D("gps_xtra_inject_xtra_data: inject part = %d/%d, len = %d\n", part, total_parts, part_len);
if (part < total_parts)
{
@ -1306,11 +1318,10 @@ static int gps_set_position_mode(GpsPositionMode mode, int fix_frequency) {
//We don't handle single shot requests atm...
//So one every 1 seconds will it be.
fix_frequency = 1;
} else if (fix_frequency > 8) {
//Ok, A9 will timeout with so high value.
//Set it to 8.
fix_frequency = 8;
} else if (fix_frequency > 1800) { //30mins
fix_frequency = 1800;
}
// fix_frequency is only used by NMEA version
s->fix_freq = fix_frequency;
return 0;
}