static void resync(displayPort_t *displayPort) { UNUSED(displayPort); max7456RefreshAll(); displayPort->rows = max7456GetRowsCount() + displayPortProfileMax7456()->rowAdjust; displayPort->cols = 30 + displayPortProfileMax7456()->colAdjust; }
void max7456ReInitIfRequired(void) { static uint32_t lastSigCheckMs = 0; static uint32_t videoDetectTimeMs = 0; static uint16_t reInitCount = 0; __spiBusTransactionBegin(busdev); const uint8_t stallCheck = max7456Send(MAX7456ADD_VM0|MAX7456ADD_READ, 0x00); __spiBusTransactionEnd(busdev); const timeMs_t nowMs = millis(); if (stallCheck != videoSignalReg) { max7456ReInit(); } else if ((videoSignalCfg == VIDEO_SYSTEM_AUTO) && ((nowMs - lastSigCheckMs) > MAX7456_SIGNAL_CHECK_INTERVAL_MS)) { // Adjust output format based on the current input format. __spiBusTransactionBegin(busdev); const uint8_t videoSense = max7456Send(MAX7456ADD_STAT, 0x00); __spiBusTransactionEnd(busdev); DEBUG_SET(DEBUG_MAX7456_SIGNAL, DEBUG_MAX7456_SIGNAL_MODEREG, videoSignalReg & VIDEO_MODE_MASK); DEBUG_SET(DEBUG_MAX7456_SIGNAL, DEBUG_MAX7456_SIGNAL_SENSE, videoSense & 0x7); DEBUG_SET(DEBUG_MAX7456_SIGNAL, DEBUG_MAX7456_SIGNAL_ROWS, max7456GetRowsCount()); if (videoSense & STAT_LOS) { videoDetectTimeMs = 0; } else { if ((VIN_IS_PAL(videoSense) && VIDEO_MODE_IS_NTSC(videoSignalReg)) || (VIN_IS_NTSC_alt(videoSense) && VIDEO_MODE_IS_PAL(videoSignalReg))) { if (videoDetectTimeMs) { if (millis() - videoDetectTimeMs > VIDEO_SIGNAL_DEBOUNCE_MS) { max7456ReInit(); DEBUG_SET(DEBUG_MAX7456_SIGNAL, DEBUG_MAX7456_SIGNAL_REINIT, ++reInitCount); } } else { // Wait for signal to stabilize videoDetectTimeMs = millis(); } } } lastSigCheckMs = nowMs; } //------------ end of (re)init------------------------------------- }
void osdOpenMenu(void) { if (inMenu) return; if (feature(FEATURE_LED_STRIP)) featureLedstrip = 1; if (feature(FEATURE_BLACKBOX)) featureBlackbox = 1; #if defined(VTX) || defined(USE_RTC6705) if (feature(FEATURE_VTX)) featureVtx = 1; #endif // VTX || USE_RTC6705 #ifdef VTX vtxBand = masterConfig.vtxBand; vtxChannel = masterConfig.vtx_channel + 1; #endif // VTX #ifdef USE_RTC6705 vtxBand = masterConfig.vtx_channel / 8; vtxChannel = masterConfig.vtx_channel % 8 + 1; #endif // USE_RTC6705 osdRows = max7456GetRowsCount(); inMenu = true; refreshTimeout = 0; max7456ClearScreen(); currentMenu = &menuMain[0]; osdResetAlarms(); osdChangeScreen(currentMenu); #ifdef LED_STRIP getLedColor(); #endif // LED_STRIP }
void max7456DrawScreen(void) { uint8_t stallCheck; uint8_t videoSense; static uint32_t lastSigCheckMs = 0; uint32_t nowMs; static uint32_t videoDetectTimeMs = 0; static uint16_t pos = 0; int k = 0, buff_len=0; if (!max7456Lock && !fontIsLoading) { // (Re)Initialize MAX7456 at startup or stall is detected. max7456Lock = true; ENABLE_MAX7456; stallCheck = max7456Send(MAX7456ADD_VM0|MAX7456ADD_READ, 0x00); DISABLE_MAX7456; nowMs = millis(); if (stallCheck != videoSignalReg) { max7456ReInit(); } else if ((videoSignalCfg == VIDEO_SYSTEM_AUTO) && ((nowMs - lastSigCheckMs) > MAX7456_SIGNAL_CHECK_INTERVAL_MS)) { // Adjust output format based on the current input format. ENABLE_MAX7456; videoSense = max7456Send(MAX7456ADD_STAT, 0x00); DISABLE_MAX7456; #ifdef DEBUG_MAX7456_SIGNAL debug[0] = videoSignalReg & VIDEO_MODE_MASK; debug[1] = videoSense & 0x7; debug[3] = max7456GetRowsCount(); #endif if (videoSense & STAT_LOS) { videoDetectTimeMs = 0; } else { if ((VIN_IS_PAL(videoSense) && VIDEO_MODE_IS_NTSC(videoSignalReg)) || (VIN_IS_NTSC_alt(videoSense) && VIDEO_MODE_IS_PAL(videoSignalReg))) { if (videoDetectTimeMs) { if (millis() - videoDetectTimeMs > VIDEO_SIGNAL_DEBOUNCE_MS) { max7456ReInit(); #ifdef DEBUG_MAX7456_SIGNAL debug[2]++; #endif } } else { // Wait for signal to stabilize videoDetectTimeMs = millis(); } } } lastSigCheckMs = nowMs; } //------------ end of (re)init------------------------------------- for (k=0; k< MAX_CHARS2UPDATE; k++) { if (screenBuffer[pos] != shadowBuffer[pos]) { spiBuff[buff_len++] = MAX7456ADD_DMAH; spiBuff[buff_len++] = pos >> 8; spiBuff[buff_len++] = MAX7456ADD_DMAL; spiBuff[buff_len++] = pos & 0xff; spiBuff[buff_len++] = MAX7456ADD_DMDI; spiBuff[buff_len++] = screenBuffer[pos]; shadowBuffer[pos] = screenBuffer[pos]; k++; } if (++pos >= maxScreenSize) { pos = 0; break; } }