Code for autonomous rover for Sparkfun AVC. DataBus won 3rd in 2012 and the same code was used on Troubled Child, a 1986 Jeep Grand Wagoneer to win 1st in 2014.
Dependencies: mbed Watchdog SDFileSystem DigoleSerialDisp
Sensors/GPS/Sirf3.cpp@0:a6a169de725f, 2013-05-27 (annotated)
- Committer:
- shimniok
- Date:
- Mon May 27 13:26:03 2013 +0000
- Revision:
- 0:a6a169de725f
- Child:
- 2:fbc6e3cf3ed8
Working version with priorities set and update time display
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shimniok | 0:a6a169de725f | 1 | #include "mbed.h" |
shimniok | 0:a6a169de725f | 2 | #include "Sirf3.h" |
shimniok | 0:a6a169de725f | 3 | |
shimniok | 0:a6a169de725f | 4 | // TODO: parameterize LED |
shimniok | 0:a6a169de725f | 5 | |
shimniok | 0:a6a169de725f | 6 | Sirf3::Sirf3(PinName tx, PinName rx): |
shimniok | 0:a6a169de725f | 7 | serial(tx, rx) |
shimniok | 0:a6a169de725f | 8 | { |
shimniok | 0:a6a169de725f | 9 | setBaud(4800); |
shimniok | 0:a6a169de725f | 10 | enable(); |
shimniok | 0:a6a169de725f | 11 | } |
shimniok | 0:a6a169de725f | 12 | |
shimniok | 0:a6a169de725f | 13 | void Sirf3::init(void) |
shimniok | 0:a6a169de725f | 14 | { |
shimniok | 0:a6a169de725f | 15 | disableVerbose(); |
shimniok | 0:a6a169de725f | 16 | } |
shimniok | 0:a6a169de725f | 17 | |
shimniok | 0:a6a169de725f | 18 | void Sirf3::setBaud(int baud) |
shimniok | 0:a6a169de725f | 19 | { |
shimniok | 0:a6a169de725f | 20 | serial.baud(baud); |
shimniok | 0:a6a169de725f | 21 | } |
shimniok | 0:a6a169de725f | 22 | |
shimniok | 0:a6a169de725f | 23 | Serial *Sirf3::getSerial(void) |
shimniok | 0:a6a169de725f | 24 | { |
shimniok | 0:a6a169de725f | 25 | return &serial; |
shimniok | 0:a6a169de725f | 26 | } |
shimniok | 0:a6a169de725f | 27 | |
shimniok | 0:a6a169de725f | 28 | void Sirf3::enable(void) |
shimniok | 0:a6a169de725f | 29 | { |
shimniok | 0:a6a169de725f | 30 | reset_available(); |
shimniok | 0:a6a169de725f | 31 | serial.attach(this, &Sirf3::recv_handler, Serial::RxIrq); |
shimniok | 0:a6a169de725f | 32 | } |
shimniok | 0:a6a169de725f | 33 | |
shimniok | 0:a6a169de725f | 34 | void Sirf3::disable(void) |
shimniok | 0:a6a169de725f | 35 | { |
shimniok | 0:a6a169de725f | 36 | serial.attach(NULL, Serial::RxIrq); |
shimniok | 0:a6a169de725f | 37 | } |
shimniok | 0:a6a169de725f | 38 | |
shimniok | 0:a6a169de725f | 39 | /** |
shimniok | 0:a6a169de725f | 40 | * Enable verbose messages for debugging |
shimniok | 0:a6a169de725f | 41 | */ |
shimniok | 0:a6a169de725f | 42 | void Sirf3::enableVerbose(void) |
shimniok | 0:a6a169de725f | 43 | { |
shimniok | 0:a6a169de725f | 44 | gsaMessage(true); |
shimniok | 0:a6a169de725f | 45 | gsvMessage(true); |
shimniok | 0:a6a169de725f | 46 | } |
shimniok | 0:a6a169de725f | 47 | |
shimniok | 0:a6a169de725f | 48 | /** |
shimniok | 0:a6a169de725f | 49 | * Disable verbose messages for debugging |
shimniok | 0:a6a169de725f | 50 | */ |
shimniok | 0:a6a169de725f | 51 | void Sirf3::disableVerbose(void) |
shimniok | 0:a6a169de725f | 52 | { |
shimniok | 0:a6a169de725f | 53 | gsaMessage(false); |
shimniok | 0:a6a169de725f | 54 | gsvMessage(false); |
shimniok | 0:a6a169de725f | 55 | } |
shimniok | 0:a6a169de725f | 56 | |
shimniok | 0:a6a169de725f | 57 | double Sirf3::latitude(void) |
shimniok | 0:a6a169de725f | 58 | { |
shimniok | 0:a6a169de725f | 59 | double latitude, longitude; |
shimniok | 0:a6a169de725f | 60 | unsigned long age; |
shimniok | 0:a6a169de725f | 61 | nmea.f_get_position(&latitude, &longitude, &age); |
shimniok | 0:a6a169de725f | 62 | return latitude; |
shimniok | 0:a6a169de725f | 63 | } |
shimniok | 0:a6a169de725f | 64 | |
shimniok | 0:a6a169de725f | 65 | double Sirf3::longitude(void) |
shimniok | 0:a6a169de725f | 66 | { |
shimniok | 0:a6a169de725f | 67 | double latitude, longitude; |
shimniok | 0:a6a169de725f | 68 | unsigned long age; |
shimniok | 0:a6a169de725f | 69 | nmea.f_get_position(&latitude, &longitude, &age); |
shimniok | 0:a6a169de725f | 70 | return longitude; |
shimniok | 0:a6a169de725f | 71 | } |
shimniok | 0:a6a169de725f | 72 | |
shimniok | 0:a6a169de725f | 73 | float Sirf3::hdop(void) |
shimniok | 0:a6a169de725f | 74 | { |
shimniok | 0:a6a169de725f | 75 | return nmea.f_hdop(); |
shimniok | 0:a6a169de725f | 76 | } |
shimniok | 0:a6a169de725f | 77 | |
shimniok | 0:a6a169de725f | 78 | int Sirf3::sat_count(void) |
shimniok | 0:a6a169de725f | 79 | { |
shimniok | 0:a6a169de725f | 80 | return nmea.sat_count(); |
shimniok | 0:a6a169de725f | 81 | } |
shimniok | 0:a6a169de725f | 82 | |
shimniok | 0:a6a169de725f | 83 | float Sirf3::speed_mps(void) |
shimniok | 0:a6a169de725f | 84 | { |
shimniok | 0:a6a169de725f | 85 | return nmea.f_speed_mps(); |
shimniok | 0:a6a169de725f | 86 | } |
shimniok | 0:a6a169de725f | 87 | |
shimniok | 0:a6a169de725f | 88 | float Sirf3::heading_deg(void) |
shimniok | 0:a6a169de725f | 89 | { |
shimniok | 0:a6a169de725f | 90 | return nmea.f_course(); |
shimniok | 0:a6a169de725f | 91 | } |
shimniok | 0:a6a169de725f | 92 | |
shimniok | 0:a6a169de725f | 93 | bool Sirf3::available(void) |
shimniok | 0:a6a169de725f | 94 | { |
shimniok | 0:a6a169de725f | 95 | return nmea.ready(); |
shimniok | 0:a6a169de725f | 96 | } |
shimniok | 0:a6a169de725f | 97 | |
shimniok | 0:a6a169de725f | 98 | void Sirf3::reset_available(void) |
shimniok | 0:a6a169de725f | 99 | { |
shimniok | 0:a6a169de725f | 100 | nmea.reset_ready(); |
shimniok | 0:a6a169de725f | 101 | } |
shimniok | 0:a6a169de725f | 102 | |
shimniok | 0:a6a169de725f | 103 | void Sirf3::recv_handler(void) |
shimniok | 0:a6a169de725f | 104 | { |
shimniok | 0:a6a169de725f | 105 | while (serial.readable()) { |
shimniok | 0:a6a169de725f | 106 | nmea.encode(serial.getc()); |
shimniok | 0:a6a169de725f | 107 | } |
shimniok | 0:a6a169de725f | 108 | } |
shimniok | 0:a6a169de725f | 109 | |
shimniok | 0:a6a169de725f | 110 | void Sirf3::gsaMessage(bool enable) |
shimniok | 0:a6a169de725f | 111 | { |
shimniok | 0:a6a169de725f | 112 | if (enable) { |
shimniok | 0:a6a169de725f | 113 | serial.printf("$PSRF103,02,00,01,01*27\r\n"); // Enable GSA |
shimniok | 0:a6a169de725f | 114 | } else { |
shimniok | 0:a6a169de725f | 115 | serial.printf("$PSRF103,02,00,00,01*26\r\n"); // Disable GSA |
shimniok | 0:a6a169de725f | 116 | } |
shimniok | 0:a6a169de725f | 117 | |
shimniok | 0:a6a169de725f | 118 | return; |
shimniok | 0:a6a169de725f | 119 | } |
shimniok | 0:a6a169de725f | 120 | |
shimniok | 0:a6a169de725f | 121 | void Sirf3::gsvMessage(bool enable) |
shimniok | 0:a6a169de725f | 122 | { |
shimniok | 0:a6a169de725f | 123 | if (enable) { |
shimniok | 0:a6a169de725f | 124 | serial.printf("$PSRF103,03,00,01,01*26\r\n"); // Enable GSV |
shimniok | 0:a6a169de725f | 125 | } else { |
shimniok | 0:a6a169de725f | 126 | serial.printf("$PSRF103,03,00,00,01*27\r\n"); // Disable GSV |
shimniok | 0:a6a169de725f | 127 | } |
shimniok | 0:a6a169de725f | 128 | |
shimniok | 0:a6a169de725f | 129 | return; |
shimniok | 0:a6a169de725f | 130 | } |
shimniok | 0:a6a169de725f | 131 |