long cmsMenuExit(displayPort_t *pDisplay, const void *ptr) { if (ptr) { displayClear(pDisplay); displayWrite(pDisplay, 5, 3, "REBOOTING..."); displayResync(pDisplay); // Was max7456RefreshAll(); why at this timing? stopMotors(); stopPwmAllMotors(); delay(200); cmsTraverseGlobalExit(&menuMain); if (currentMenu->onExit) currentMenu->onExit((OSD_Entry *)NULL); // Forced exit saveConfigAndNotify(); } cmsInMenu = false; displayRelease(pDisplay); currentMenu = NULL; if (ptr) systemReset(); ENABLE_ARMING_FLAG(OK_TO_ARM); return 0; }
static long cmsx_EraseFlash(displayPort_t *pDisplay, const void *ptr) { UNUSED(ptr); displayClear(pDisplay); displayWrite(pDisplay, 5, 3, "ERASING FLASH..."); displayResync(pDisplay); // Was max7456RefreshAll(); Why at this timing? flashfsEraseCompletely(); while (!flashfsIsReady()) { delay(100); } displayClear(pDisplay); displayResync(pDisplay); // Was max7456RefreshAll(); wedges during heavy SPI? return 0; }
void osdSlaveHeartbeat(void) { timeoutAt = micros() + (1000 * 1000); if (stalled) { stalled = false; displayResync(osdDisplayPort); } }
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); }
bool osdSlaveCheck(timeUs_t currentTimeUs, timeDelta_t currentDeltaTimeUs) { UNUSED(currentTimeUs); UNUSED(currentDeltaTimeUs); if (!stalled && (cmp32(currentTimeUs, timeoutAt) > 0)) { stalled = true; displayWrite(osdDisplayPort, 8, 12, "WAITING FOR FC"); displayResync(osdDisplayPort); } if (!receivingScreen && !displayIsSynced(osdDisplayPort)) { // queue a screen draw to ensure any remaining characters not written to the screen yet // remember that displayDrawScreen() may return WITHOUT having fully updated the screen. displayDrawScreenQueued = true; } return receivingScreen || displayDrawScreenQueued; }
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); }