Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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);
}