diff --git a/pr133.ino b/pr133.ino index c6ee5e8..c8747dd 100644 --- a/pr133.ino +++ b/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 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)