ESP_IOT v2.5
IOT ESP Coding
MultipleSatellite.h
Go to the documentation of this file.
1/*
2 *SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
3 *
4 *SPDX-License-Identifier: MIT
5 */
6
7#ifndef __MULITIPLESATELITE_H
8#define __MULITIPLESATELITE_H
9
10#include <Arduino.h>
11#include "TinyGPS.h"
12
13typedef enum {
14 SATELLITE_MODE_GPS = 0, // GPS mode
15 SATELLITE_MODE_BDS, // BDS mode
16 SATELLITE_MODE_GLONASS, // GLONASS mode
17 SATELLITE_MODE_GALILEO, // GALILEO mode
18 SATELLITE_MODE_QZSS, // QZSS mode
20
21typedef enum {
22 BOOT_HOST_START = 0, // Hot start
23 BOOT_WARM_START, // Warm start
24 BOOT_COLD_START, // Cold start
25 BOOT_FACTORY_START, // Factory start
26 BOOT_FACTORY_DISABLE_SERIAL_RADIO, // Factory starts, disables the serial port output and radio parts, and can
27 // respond to serial port configurations.
28 BOOT_FACTORY_ENABLE_SERIAL_RADIO, // Factory start enables the serial port output and radio frequency parts
30
32public:
33 MultipleSatellite(HardwareSerial& serialPort, long baudRate, uint32_t config, int rxPin, int txPin)
34 : _serial(serialPort), _baudRate(baudRate), _config(config), _rxPin(rxPin), _txPin(txPin)
35 {
36 }
37 void begin()
38 {
39 _serial.begin(_baudRate, _config, _rxPin, _txPin);
40 }
41
42 bool available()
43 {
44 return _serial.available() > 0;
45 }
46
47 char read()
48 {
49 return _serial.read();
50 }
51
52 void write(const char* data)
53 {
54 _serial.print(data);
55 }
56
57 void updateGPS()
58 {
59 while (available()) {
60 char c = read();
61 encode(c);
62 }
63 }
64
66 {
67 write("$PCAS06,0*1B\r\n");
68 return findCharacter("SW=");
69 }
70
72 {
73 return findCharacter("ANTENNA");
74 }
75
77 {
78 write("$PCAS06,2*19\r\n");
79 String mode = findCharacter("MO=");
80 if (mode == "G") {
81 return "GPS";
82 } else if (mode == "B") {
83 return "BDS";
84 } else if (mode == "R") {
85 return "GLONASS";
86 } else if (mode == "E") {
87 return "GALILEO";
88 } else if (mode == "Q") {
89 return "QZSS";
90 } else {
91 return "Unknown";
92 }
93 }
94
96 {
97 switch (mode) {
99 write("$PCAS04,1*18\r\n");
100 break;
102 write("$PCAS04,2*1B\r\n");
103 break;
105 write("$PCAS04,4*1D\r\n");
106 break;
108 write("$PCAS04,8*11\r\n");
109 break;
111 write("$PCAS04,20*2B\r\n");
112 break;
113 default:
114 break;
115 }
116 }
117
119 {
120 switch (mode) {
121 case BOOT_HOST_START:
122 write("$PCAS10,0*1C\r\n");
123 break;
124 case BOOT_WARM_START:
125 write("$PCAS10,1*1D\r\n");
126 break;
127 case BOOT_COLD_START:
128 write("$PCAS10,2*1E\r\n");
129 break;
131 reset();
132 write("$PCAS10,3*1F\r\n");
133 break;
135 write("$PCAS10,8*14\r\n");
136 break;
138 write("$PCAS10,9*15\r\n");
139 break;
140 default:
141 break;
142 }
143 }
144
146 write("$PCAS12,65535*1E\r\n");
147 }
148
149private:
150 HardwareSerial& _serial;
151 long _baudRate;
152 uint32_t _config;
153 int _rxPin;
154 int _txPin;
155 String findCharacter(const char* searchStr)
156 {
157 delay(100);
158 char GNSSbuf[100];
159 int GNSSbufindexsum = 0;
160
161 while (true) {
162 if (available()) {
163 char d = read();
164
165 if (d == '\n') {
166 GNSSbuf[GNSSbufindexsum] = 0;
167 // Serial.printf("%s\n", GNSSbuf);
168 GNSSbufindexsum = 0;
169 if (strstr(GNSSbuf, searchStr) != nullptr) {
170 break;
171 }
172 } else {
173 GNSSbuf[GNSSbufindexsum++] = d;
174 if (GNSSbufindexsum >= sizeof(GNSSbuf) - 1) {
175 GNSSbufindexsum = sizeof(GNSSbuf) - 1;
176 }
177 }
178 }
179 }
180 char* p = strstr(GNSSbuf, searchStr);
181 if (p != nullptr) {
182 strcpy(GNSSbuf, p + strlen(searchStr));
183 }
184
185 char* q = strstr(GNSSbuf, "*");
186 if (q != nullptr) {
187 *q = 0;
188 }
189 return String(GNSSbuf);
190 }
191};
192
193#endif
boot_mode_t
@ BOOT_FACTORY_ENABLE_SERIAL_RADIO
@ BOOT_HOST_START
@ BOOT_COLD_START
@ BOOT_WARM_START
@ BOOT_FACTORY_DISABLE_SERIAL_RADIO
@ BOOT_FACTORY_START
satellite_mode_t
@ SATELLITE_MODE_QZSS
@ SATELLITE_MODE_BDS
@ SATELLITE_MODE_GALILEO
@ SATELLITE_MODE_GLONASS
@ SATELLITE_MODE_GPS
void setSystemBootMode(boot_mode_t mode)
MultipleSatellite(HardwareSerial &serialPort, long baudRate, uint32_t config, int rxPin, int txPin)
void write(const char *data)
void setSatelliteMode(satellite_mode_t mode)
void reset()
Definition: TinyGPS.h:255
bool encode(char c)
Definition: TinyGPS.cpp:67