mobile station: person icon, speed in km/h
This commit is contained in:
49
pr133.ino
49
pr133.ino
@@ -43,6 +43,8 @@ struct Station {
|
||||
float wxTemp;
|
||||
int wxHumidity;
|
||||
float wxPressure;
|
||||
int speed;
|
||||
bool isMobile;
|
||||
};
|
||||
|
||||
Station stations[MAX_STATIONS];
|
||||
@@ -130,6 +132,21 @@ bool parseWxData(const String& body, float& tempC, int& humidity, float& pressur
|
||||
return found;
|
||||
}
|
||||
|
||||
int parseSpeed(const String& body) {
|
||||
int len = body.length();
|
||||
if (len > 80) len = 80;
|
||||
for (int i = 0; i < len - 7; i++) {
|
||||
if (isDigit(body[i]) && isDigit(body[i + 1]) && isDigit(body[i + 2]) &&
|
||||
body[i + 3] == '/' &&
|
||||
isDigit(body[i + 4]) && isDigit(body[i + 5]) && isDigit(body[i + 6])) {
|
||||
int c = body.substring(i, i + 3).toInt();
|
||||
int s = body.substring(i + 4, i + 7).toInt();
|
||||
if (c >= 0 && c <= 360 && s >= 0 && s <= 999) return s;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// ============== APRS PARSER ==============
|
||||
bool parsePosition(const String& data, float& lat, float& lon) {
|
||||
int nsIdx = -1;
|
||||
@@ -230,6 +247,8 @@ void handleMessage(std::shared_ptr<APRSMessage> msg) {
|
||||
s.hasPos = parsePosition(body, s.lat, s.lon);
|
||||
s.comment = stripPosition(body);
|
||||
s.isWx = parseWxData(body, s.wxTemp, s.wxHumidity, s.wxPressure);
|
||||
s.speed = parseSpeed(body);
|
||||
s.isMobile = s.speed > 0;
|
||||
|
||||
if (s.hasPos) {
|
||||
s.distance = haversine(HOME_LAT, HOME_LON, s.lat, s.lon);
|
||||
@@ -345,6 +364,21 @@ void drawWxStation(int idx) {
|
||||
u8g2.drawUTF8(wx, y, wl.c_str());
|
||||
}
|
||||
|
||||
const unsigned char person_bits[] = {
|
||||
0x0C, 0x00,
|
||||
0x0C, 0x00,
|
||||
0x1E, 0x00,
|
||||
0x0C, 0x00,
|
||||
0x1E, 0x00,
|
||||
0x33, 0x00,
|
||||
0x21, 0x00,
|
||||
0x40, 0x80,
|
||||
0x40, 0x80,
|
||||
0x01, 0x40,
|
||||
0x00, 0x80,
|
||||
0x00, 0x00,
|
||||
};
|
||||
|
||||
void drawStationScreen(int idx) {
|
||||
Station& s = stations[idx];
|
||||
if (s.isWx) {
|
||||
@@ -361,8 +395,14 @@ void drawStationScreen(int idx) {
|
||||
return;
|
||||
}
|
||||
|
||||
int cx = 2;
|
||||
if (s.isMobile) {
|
||||
u8g2.drawXBM(cx, 16, 12, 12, person_bits);
|
||||
cx = 18;
|
||||
}
|
||||
|
||||
u8g2.setFont(u8g2_font_10x20_t_cyrillic);
|
||||
u8g2.drawUTF8(2, 34, s.callsign.c_str());
|
||||
u8g2.drawUTF8(cx, 34, s.callsign.c_str());
|
||||
|
||||
u8g2.setFont(u8g2_font_6x12_t_cyrillic);
|
||||
int y = 50;
|
||||
@@ -383,7 +423,12 @@ void drawStationScreen(int idx) {
|
||||
y += 14;
|
||||
}
|
||||
|
||||
if (s.comment.length() > 0) {
|
||||
if (s.isMobile) {
|
||||
char sp[24];
|
||||
float kmh = s.speed * 1.852;
|
||||
snprintf(sp, sizeof(sp), "Speed: %.0f km/h", kmh);
|
||||
u8g2.drawUTF8(2, y, sp);
|
||||
} else if (s.comment.length() > 0) {
|
||||
String c = s.comment;
|
||||
if (u8g2.getUTF8Width(c.c_str()) > 124) {
|
||||
while (u8g2.getUTF8Width(c.c_str()) > 120 && c.length() > 0)
|
||||
|
||||
Reference in New Issue
Block a user