static bool osdFormatRtcDateTime(char *buffer) { dateTime_t dateTime; if (!rtcGetDateTime(&dateTime)) { buffer[0] = '\0'; return false; } dateTimeFormatLocalShort(buffer, &dateTime); return true; }
bool srxlFrameGpsStat(sbuf_t *dst, timeUs_t currentTimeUs) { UNUSED(currentTimeUs); uint32_t timeBcd; uint16_t speedKnotsBcd, speedTmp; uint8_t numSatBcd, altitudeHighBcd; bool timeProvided = false; if (!featureIsEnabled(FEATURE_GPS) || !STATE(GPS_FIX) || gpsSol.numSat < 6) { return false; } // Number of sats and altitude (high bits) numSatBcd = (gpsSol.numSat > 99) ? dec2bcd(99) : dec2bcd(gpsSol.numSat); altitudeHighBcd = dec2bcd(gpsSol.llh.altCm / 100000); // Speed (knots) speedTmp = gpsSol.groundSpeed * 1944 / 1000; speedKnotsBcd = (speedTmp > 9999) ? dec2bcd(9999) : dec2bcd(speedTmp); #ifdef USE_RTC_TIME dateTime_t dt; // RTC if (rtcHasTime()) { rtcGetDateTime(&dt); timeBcd = dec2bcd(dt.hours); timeBcd = timeBcd << 8; timeBcd = timeBcd | dec2bcd(dt.minutes); timeBcd = timeBcd << 8; timeBcd = timeBcd | dec2bcd(dt.seconds); timeBcd = timeBcd << 4; timeBcd = timeBcd | dec2bcd(dt.millis / 100); timeProvided = true; } #endif timeBcd = (timeProvided) ? timeBcd : SPEKTRUM_TIME_UNKNOWN; // SRXL frame sbufWriteU8(dst, SRXL_FRAMETYPE_GPS_STAT); sbufWriteU8(dst, SRXL_FRAMETYPE_SID); sbufWriteU16(dst, speedKnotsBcd); sbufWriteU32(dst, timeBcd); sbufWriteU8(dst, numSatBcd); sbufWriteU8(dst, altitudeHighBcd); sbufFill(dst, STRU_TELE_GPS_STAT_EMPTY_FIELDS_VALUE, STRU_TELE_GPS_STAT_EMPTY_FIELDS_COUNT); return true; }