void display_menu(void) { DEBUGP("display menu"); screenmutex++; displayClearScreen(); displaySetAddress(0, 0); displayPutStr("Configuration Menu", NORMAL); displaySetAddress(MENU_INDENT, 1); displayPutStr("Set Alarm: ", NORMAL); print_alarmhour(alarm_h, NORMAL); displayWriteChar(':', NORMAL); printnumber(alarm_m, NORMAL); displaySetAddress(MENU_INDENT, 2); displayPutStr("Set Time: ", NORMAL); print_timehour(time_h, NORMAL); displayWriteChar(':', NORMAL); printnumber(time_m, NORMAL); displayWriteChar(':', NORMAL); printnumber(time_s, NORMAL); if (time_format == TIME_12H) { displayWriteChar(' ', NORMAL); if (time_h >= 12) { displayWriteChar('P', NORMAL); } else { displayWriteChar('A', NORMAL); } } print_date(date_m,date_d,date_y,SET_DATE); print_region_setting(NORMAL); #ifdef BACKLIGHT_ADJUST displaySetAddress(MENU_INDENT, 5); displayPutStr("Set Backlight: ", NORMAL); printnumber(OCR2B>>OCR2B_BITSHIFT,NORMAL); #endif displaySetAddress(0, 6); displayPutStr("Press MENU to advance", NORMAL); displaySetAddress(0, 7); displayPutStr("Press SET to set", NORMAL); screenmutex--; }
static void osdDrawElements(void) { displayClearScreen(osdDisplayPort); // Hide OSD when OSDSW mode is active if (IS_RC_MODE_ACTIVE(BOXOSD)) { return; } if (sensors(SENSOR_ACC)) { osdDrawSingleElement(OSD_ARTIFICIAL_HORIZON); } for (unsigned i = 0; i < sizeof(osdElementDisplayOrder); i++) { osdDrawSingleElement(osdElementDisplayOrder[i]); } #ifdef USE_GPS if (sensors(SENSOR_GPS)) { osdDrawSingleElement(OSD_GPS_SATS); osdDrawSingleElement(OSD_GPS_SPEED); osdDrawSingleElement(OSD_GPS_LAT); osdDrawSingleElement(OSD_GPS_LON); osdDrawSingleElement(OSD_HOME_DIST); osdDrawSingleElement(OSD_HOME_DIR); } #endif // GPS #ifdef USE_ESC_SENSOR if (feature(FEATURE_ESC_SENSOR)) { osdDrawSingleElement(OSD_ESC_TMP); osdDrawSingleElement(OSD_ESC_RPM); } #endif #ifdef USE_RTC_TIME osdDrawSingleElement(OSD_RTC_DATETIME); #endif #ifdef USE_OSD_ADJUSTMENTS osdDrawSingleElement(OSD_ADJUSTMENT_RANGE); #endif #ifdef USE_ADC_INTERNAL osdDrawSingleElement(OSD_CORE_TEMPERATURE); #endif }
void osdInit(displayPort_t *osdDisplayPortToUse) { if (!osdDisplayPortToUse) { return; } BUILD_BUG_ON(OSD_POS_MAX != OSD_POS(31,31)); osdDisplayPort = osdDisplayPortToUse; #ifdef USE_CMS cmsDisplayPortRegister(osdDisplayPort); #endif armState = ARMING_FLAG(ARMED); memset(blinkBits, 0, sizeof(blinkBits)); displayClearScreen(osdDisplayPort); osdDrawLogo(3, 1); char string_buffer[30]; tfp_sprintf(string_buffer, "V%s", FC_VERSION_STRING); displayWrite(osdDisplayPort, 20, 6, string_buffer); #ifdef USE_CMS displayWrite(osdDisplayPort, 7, 8, CMS_STARTUP_HELP_TEXT1); displayWrite(osdDisplayPort, 11, 9, CMS_STARTUP_HELP_TEXT2); displayWrite(osdDisplayPort, 11, 10, CMS_STARTUP_HELP_TEXT3); #endif #ifdef USE_RTC_TIME char dateTimeBuffer[FORMATTED_DATE_TIME_BUFSIZE]; if (osdFormatRtcDateTime(&dateTimeBuffer[0])) { displayWrite(osdDisplayPort, 5, 12, dateTimeBuffer); } #endif displayResync(osdDisplayPort); resumeRefreshAt = micros() + (4 * REFRESH_1S); }
void osdSlaveInit(displayPort_t *osdDisplayPortToUse) { if (!osdDisplayPortToUse) return; osdDisplayPort = osdDisplayPortToUse; delay(100); // need max7456 to be ready before using the displayPort API further. displayClearScreen(osdDisplayPort); displayResync(osdDisplayPort); delay(100); // wait a little for video to stabilise osdDrawLogo(3, 1); char string_buffer[30]; tfp_sprintf(string_buffer, "V%s", FC_VERSION_STRING); displayWrite(osdDisplayPort, 20, 6, string_buffer); displayWrite(osdDisplayPort, 13, 6, "OSD"); displayResync(osdDisplayPort); }
void osdSlaveClearScreen(void) { displayClearScreen(osdDisplayPort); receivingScreen = true; }
STATIC_UNIT_TESTED void osdRefresh(timeUs_t currentTimeUs) { static timeUs_t lastTimeUs = 0; static bool osdStatsEnabled = false; static bool osdStatsVisible = false; static timeUs_t osdStatsRefreshTimeUs; static uint16_t endBatteryVoltage; // detect arm/disarm if (armState != ARMING_FLAG(ARMED)) { if (ARMING_FLAG(ARMED)) { osdStatsEnabled = false; osdStatsVisible = false; osdResetStats(); osdShowArmed(); resumeRefreshAt = currentTimeUs + (REFRESH_1S / 2); } else if (isSomeStatEnabled() && (!(getArmingDisableFlags() & ARMING_DISABLED_RUNAWAY_TAKEOFF) || !VISIBLE(osdConfig()->item_pos[OSD_WARNINGS]))) { // suppress stats if runaway takeoff triggered disarm and WARNINGS element is visible osdStatsEnabled = true; resumeRefreshAt = currentTimeUs + (60 * REFRESH_1S); endBatteryVoltage = getBatteryVoltage(); } armState = ARMING_FLAG(ARMED); } if (ARMING_FLAG(ARMED)) { osdUpdateStats(); timeUs_t deltaT = currentTimeUs - lastTimeUs; flyTime += deltaT; stats.armed_time += deltaT; } else if (osdStatsEnabled) { // handle showing/hiding stats based on OSD disable switch position if (displayIsGrabbed(osdDisplayPort)) { osdStatsEnabled = false; resumeRefreshAt = 0; stats.armed_time = 0; } else { if (IS_RC_MODE_ACTIVE(BOXOSD) && osdStatsVisible) { osdStatsVisible = false; displayClearScreen(osdDisplayPort); } else if (!IS_RC_MODE_ACTIVE(BOXOSD)) { if (!osdStatsVisible) { osdStatsVisible = true; osdStatsRefreshTimeUs = 0; } if (currentTimeUs >= osdStatsRefreshTimeUs) { osdStatsRefreshTimeUs = currentTimeUs + REFRESH_1S; osdShowStats(endBatteryVoltage); } } } } lastTimeUs = currentTimeUs; if (resumeRefreshAt) { if (cmp32(currentTimeUs, resumeRefreshAt) < 0) { // in timeout period, check sticks for activity to resume display. if (IS_HI(THROTTLE) || IS_HI(PITCH)) { resumeRefreshAt = currentTimeUs; } displayHeartbeat(osdDisplayPort); return; } else { displayClearScreen(osdDisplayPort); resumeRefreshAt = 0; osdStatsEnabled = false; stats.armed_time = 0; } } blinkState = (currentTimeUs / 200000) % 2; #ifdef USE_ESC_SENSOR if (feature(FEATURE_ESC_SENSOR)) { escDataCombined = getEscSensorData(ESC_SENSOR_COMBINED); } #endif #ifdef USE_CMS if (!displayIsGrabbed(osdDisplayPort)) { osdUpdateAlarms(); osdDrawElements(); displayHeartbeat(osdDisplayPort); #ifdef OSD_CALLS_CMS } else { cmsUpdate(currentTimeUs); #endif } #endif lastArmState = ARMING_FLAG(ARMED); }
static void osdShowArmed(void) { displayClearScreen(osdDisplayPort); displayWrite(osdDisplayPort, 12, 7, "ARMED"); }
static void osdShowStats(uint16_t endBatteryVoltage) { uint8_t top = 2; char buff[OSD_ELEMENT_BUFFER_LENGTH]; displayClearScreen(osdDisplayPort); displayWrite(osdDisplayPort, 2, top++, " --- STATS ---"); if (osdStatGetState(OSD_STAT_RTC_DATE_TIME)) { bool success = false; #ifdef USE_RTC_TIME success = osdFormatRtcDateTime(&buff[0]); #endif if (!success) { tfp_sprintf(buff, "NO RTC"); } displayWrite(osdDisplayPort, 2, top++, buff); } if (osdStatGetState(OSD_STAT_TIMER_1)) { osdFormatTimer(buff, false, (OSD_TIMER_SRC(osdConfig()->timers[OSD_TIMER_1]) == OSD_TIMER_SRC_ON ? false : true), OSD_TIMER_1); osdDisplayStatisticLabel(top++, osdTimerSourceNames[OSD_TIMER_SRC(osdConfig()->timers[OSD_TIMER_1])], buff); } if (osdStatGetState(OSD_STAT_TIMER_2)) { osdFormatTimer(buff, false, (OSD_TIMER_SRC(osdConfig()->timers[OSD_TIMER_2]) == OSD_TIMER_SRC_ON ? false : true), OSD_TIMER_2); osdDisplayStatisticLabel(top++, osdTimerSourceNames[OSD_TIMER_SRC(osdConfig()->timers[OSD_TIMER_2])], buff); } if (osdStatGetState(OSD_STAT_MAX_SPEED) && STATE(GPS_FIX)) { itoa(stats.max_speed, buff, 10); osdDisplayStatisticLabel(top++, "MAX SPEED", buff); } if (osdStatGetState(OSD_STAT_MAX_DISTANCE)) { tfp_sprintf(buff, "%d%c", osdGetMetersToSelectedUnit(stats.max_distance), osdGetMetersToSelectedUnitSymbol()); osdDisplayStatisticLabel(top++, "MAX DISTANCE", buff); } if (osdStatGetState(OSD_STAT_MIN_BATTERY)) { tfp_sprintf(buff, "%d.%1d%c", stats.min_voltage / 10, stats.min_voltage % 10, SYM_VOLT); osdDisplayStatisticLabel(top++, "MIN BATTERY", buff); } if (osdStatGetState(OSD_STAT_END_BATTERY)) { tfp_sprintf(buff, "%d.%1d%c", endBatteryVoltage / 10, endBatteryVoltage % 10, SYM_VOLT); osdDisplayStatisticLabel(top++, "END BATTERY", buff); } if (osdStatGetState(OSD_STAT_BATTERY)) { tfp_sprintf(buff, "%d.%1d%c", getBatteryVoltage() / 10, getBatteryVoltage() % 10, SYM_VOLT); osdDisplayStatisticLabel(top++, "BATTERY", buff); } if (osdStatGetState(OSD_STAT_MIN_RSSI)) { itoa(stats.min_rssi, buff, 10); strcat(buff, "%"); osdDisplayStatisticLabel(top++, "MIN RSSI", buff); } if (batteryConfig()->currentMeterSource != CURRENT_METER_NONE) { if (osdStatGetState(OSD_STAT_MAX_CURRENT)) { itoa(stats.max_current, buff, 10); strcat(buff, "A"); osdDisplayStatisticLabel(top++, "MAX CURRENT", buff); } if (osdStatGetState(OSD_STAT_USED_MAH)) { tfp_sprintf(buff, "%d%c", getMAhDrawn(), SYM_MAH); osdDisplayStatisticLabel(top++, "USED MAH", buff); } } if (osdStatGetState(OSD_STAT_MAX_ALTITUDE)) { osdFormatAltitudeString(buff, stats.max_altitude); osdDisplayStatisticLabel(top++, "MAX ALTITUDE", buff); } #ifdef USE_BLACKBOX if (osdStatGetState(OSD_STAT_BLACKBOX) && blackboxConfig()->device && blackboxConfig()->device != BLACKBOX_DEVICE_SERIAL) { osdGetBlackboxStatusString(buff); osdDisplayStatisticLabel(top++, "BLACKBOX", buff); } if (osdStatGetState(OSD_STAT_BLACKBOX_NUMBER) && blackboxConfig()->device && blackboxConfig()->device != BLACKBOX_DEVICE_SERIAL) { itoa(blackboxGetLogNumber(), buff, 10); osdDisplayStatisticLabel(top++, "BB LOG NUM", buff); } #endif }