// Called the first time that a client tries to kick the GPS to update. // // We detect the real GPS, then update the pointer we have been called through // and return. // bool AP_GPS_Auto::read(void) { static uint32_t last_baud_change_ms; static uint8_t last_baud; GPS *gps; uint32_t now = hal.scheduler->millis(); if (now - last_baud_change_ms > 1200) { // its been more than 1.2 seconds without detection on this // GPS - switch to another baud rate _port->begin(pgm_read_dword(&baudrates[last_baud]), 256, 16); last_baud++; last_baud_change_ms = now; if (last_baud == sizeof(baudrates) / sizeof(baudrates[0])) { last_baud = 0; } // write config strings for the types of GPS we support _send_progstr(_port, _mtk_set_binary, sizeof(_mtk_set_binary)); _send_progstr(_port, AP_GPS_UBLOX::_ublox_set_binary, AP_GPS_UBLOX::_ublox_set_binary_size); _send_progstr(_port, _sirf_set_binary, sizeof(_sirf_set_binary)); } _update_progstr(); if (NULL != (gps = _detect())) { // configure the detected GPS gps->init(_port, _nav_setting); hal.console->println_P(PSTR("OK")); *_gps = gps; return true; } return false; }
// Called the first time that a client tries to kick the GPS to update. // // We detect the real GPS, then update the pointer we have been called through // and return. // /// @todo This routine spends a long time trying to detect a GPS. That's not strictly /// desirable; it might be a good idea to rethink the logic here to make it /// more asynchronous, so that other parts of the system can get a chance /// to run while GPS detection is in progress. /// bool AP_GPS_Auto::read(void) { GPS *gps; uint8_t i; uint32_t then; // Loop through possible baudrates trying to detect a GPS at one of them. // // Note that we need to have a FastSerial rather than a Stream here because // Stream has no idea of line speeds. FastSerial is quite OK with us calling // ::begin any number of times. // for (i = 0; i < (sizeof(baudrates) / sizeof(baudrates[0])); i++) { _fs->begin(baudrates[i]); if (NULL != (gps = _detect())) { // configure the detected GPS and give it a chance to listen to its device gps->init(); then = millis(); while ((millis() - then) < 1200) { // if we get a successful update from the GPS, we are done gps->new_data = false; gps->update(); if (gps->new_data) { Serial.println_P(PSTR("OK")); Serial.print("GPS:"); Serial.println(baudrates[i]); *_gps = gps; return true; } } // GPS driver failed to parse any data from GPS, // delete the driver and continue the process. Serial.println_P(PSTR("failed, retrying")); delete gps; } } return false; }
void setup() { pinMode((byte)10, OUTPUT); pinMode((byte)13, OUTPUT); so.init(); sd.init(); press.init(); pressext.init(); gps.init(); temp.init(); conduct.init(); chamallow.init(); ph.init(); co2.init(); press.addOut(&so); pressext.addOut(&so); temp.addOut(&so); gps.addOut(&so); pile.addOut(&so); conduct.addOut(&so); chamallow.addOut(&so); ph.addOut(&so); co2.addOut(&so); press.addOut(&sd); pressext.addOut(&sd); temp.addOut(&sd); gps.addOut(&sd); pile.addOut(&sd); conduct.addOut(&sd); chamallow.addOut(&sd); ph.addOut(&sd); co2.addOut(&sd); }