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

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?

UserRevisionLine numberNew 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