libpropeller
Making PropellerGCC Easier
 All Classes Files Functions Variables Enumerations Enumerator Macros Pages
mtk3339.h
Go to the documentation of this file.
1 
19 #ifndef LIBPROPELLER_MTK3339_H_
20 #define LIBPROPELLER_MTK3339_H_
21 
23 #include <propeller.h>
24 
25 class MTK3339 : public GPSParser {
26 public:
27 
48  bool Start(int rxPin, int txPin, int ppsPin = -1){
49  GPSParser::Start(rxPin, txPin, 9600);
50  gpsStatus = CheckBaud();
51  if (gpsStatus == true) { //GPS running at 9600
52  //Update to 115200
53  gps_serial_.PutFormatted(kPMTK_SET_NMEA_BAUDRATE_115200);
54  waitcnt(CLKFREQ / 19 + CNT); //Make sure it's transmitted.
55  gps_serial_.SetBaud(115200);
56  } else { //GPS may be runnning at 115200
57  gps_serial_.SetBaud(115200);
58  gpsStatus = CheckBaud();
59  if (gpsStatus == false) {
60  return false;
61  }
62  }
63 
64  gps_serial_.PutFormatted(kPMTK_API_SET_NMEA_OUTPUT);
65  gps_serial_.PutFormatted(kPMTK_SET_NMEA_UPDATE_10HZ);
66 
67  return GetStatus();
68 
69  }
70 
71  bool GetStatus(void) {
72  return gpsStatus;
73  }
74 
75  //TODO(SRLM): Add enter standby mode
76  // PMTK_CMD_STANDBY_MODE
77 
78 private:
79 
91  bool CheckBaud(void) {
93  waitcnt(CLKFREQ / 10 + CNT);
95  for (int i = 0; i < 50; i++) {
96  unsigned char byte = (unsigned char) gps_serial_.Get();
97  if (byte > (0x7F)) {
98  return false;
99  }
100  }
101  return true;
102  }
103 
104  bool gpsStatus;
105 
106  static constexpr const char * kPMTK_SET_NMEA_UPDATE_10HZ = "$PMTK220,100*2F\r\n";
107  static constexpr const char * kPMTK_SET_NMEA_BAUDRATE_115200 = "$PMTK251,115200*1F\r\n";
108  static constexpr const char * kPMTK_API_SET_NMEA_OUTPUT = "$PMTK314,0,1,0,1,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n";
109 
110 
111 
112 
113 };
114 
115 #endif // LIBPROPELLER_MTK3339_H_