gps_data gps_get_time(void) { printf("Getting time..."); gps_data data = gps_init_data(); u8 msg[28]; gps_request(gps_time_request); gps_read_message(msg, 28); printf("done.\r\n"); if(gps_bad_header(msg)) return data; if(gps_bad_id(msg, 0x21)) return data; if(gps_bad_checksum(msg, 28)) return data; u8 valid = msg[6+19]; if(!valid & 0x01) // This checks for valid time of week, ignoring week number // and UTC (don't care if a few seconds out because we don't know // the current GPS-UTC offset, and don't care if we don't know the date // since we do not use it). return data; data.hour = msg[6+16]; data.minute = msg[6+17]; data.second = msg[6+18]; data.data_valid = 1; return data; }
gps_data gps_get_position(void) { printf("Getting position..."); gps_data data = gps_init_data(); u8 msg[36]; gps_request(gps_position_request); gps_read_message(msg, 36); printf("done.\r\n"); if(gps_bad_header(msg)) return data; if(gps_bad_id(msg, 0x02)) return data; if(gps_bad_checksum(msg, 36)) return data; s32 lon = (msg[10] | msg[11] << 8 | msg[12] << 16 | msg[13] << 24); s32 lat = (msg[14] | msg[15] << 8 | msg[16] << 16 | msg[17] << 24); s32 alt = (msg[22] | msg[23] << 8 | msg[24] << 16 | msg[25] << 24); data.latitude = (double)lat / (double)1E7; data.longitude = (double)lon / (double)1E7; data.altitude = alt / 1E3; if(data.latitude > 90.0 || data.latitude < -90.0) return data; if(data.longitude > 180.0 || data.longitude < -180.0) return data; data.data_valid = 1; return data; }
gps_data gps_get_status(void) { printf("Getting status..."); gps_data data = gps_init_data(); u8 msg[24]; gps_request(gps_status_request); gps_read_message(msg, 24); printf("done.\r\n"); if(gps_bad_header(msg)) return data; if(gps_bad_id(msg, 0x03)) return data; if(gps_bad_checksum(msg, 24)) return data; u8 gpsFix = msg[6+4]; u8 flags = msg[6+5]; if((gpsFix == 0x02 || gpsFix == 0x03 || gpsFix == 0x04) && (flags & 1)) data.lock_valid = 1; else data.lock_valid = 0; data.data_valid = 1; return data; }
int main(int argc, char **argv) { char msg[MAX_GPS_MSG_LEN+1]; struct bcm2835_i2cbb ibb; uint32_t speed = 250; uint32_t kbit = 100; if (argc > 1) { kbit = atoi(argv[1]); switch (kbit) { case 50: speed = 500; break; // 500 gives roughly 50Kbit/s case 100: speed = 250; break; // 250 gives roughly 100Kbit/s case 200: speed = 100; break; // 100 gives roughly 200Kbit/s case 300: speed = 50; break; // 50 gives roughly 300Kbit/s case 400: speed = 23; break; // 23 gives roughly 400Kbit/s default: printf("Bad speed '%s'=%u, should be 50,100,200,300 or 400\n", argv[1], kbit); exit(1); } } printf("Using speed ~ %u Kbit/s\n", kbit); // address, sda,scl,clock_freq,timeout if(bcm2835_i2cbb_open(&ibb,0x42,2,3,speed,1000000)) { printf("Failed to initialize bitbanged I2C. Aborting...\n"); exit(1); } while(1) { int len = gps_read_message(&ibb, msg); if (len > 0) { gps_process_message(msg, len); } gps_delay_ms(100); } exit(0); }