From 7f21ddf3e42109e0577eb1447326b6e6fc896239 Mon Sep 17 00:00:00 2001 From: Hydra Date: Sat, 15 Apr 2017 11:09:01 +0100 Subject: [PATCH 1/3] CF/BF - SPRacingF3 Add OSD over MSP for SPRacingF3OSD compatibility. --- src/main/target/SPRACINGF3/target.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/target/SPRACINGF3/target.h b/src/main/target/SPRACINGF3/target.h index 332b06ec83..40abf49f29 100644 --- a/src/main/target/SPRACINGF3/target.h +++ b/src/main/target/SPRACINGF3/target.h @@ -171,6 +171,9 @@ #define CURRENT_METER_ADC_PIN PA5 #define RSSI_ADC_PIN PB2 +#define OSD +#define USE_OSD_OVER_MSP_DISPLAYPORT + #define USE_ESC_SENSOR #define REMAP_TIM17_DMA From 4d70c43c1a062b6a77719a870792937e3b269699 Mon Sep 17 00:00:00 2001 From: Hydra Date: Sat, 15 Apr 2017 12:34:17 +0100 Subject: [PATCH 2/3] CF/BF - SPRACINGF3 - Use slower MSP displayport data rate when disarmed to prevent configurator stalls. * Probably the configurator should set the MSP data rate on connect instead, but this solution works for now. --- src/main/io/displayport_max7456.c | 2 +- src/main/io/osd.c | 54 ++++++++++++++++++----------- src/main/io/osd.h | 2 +- src/main/target/SPRACINGF3/target.h | 1 + 4 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/main/io/displayport_max7456.c b/src/main/io/displayport_max7456.c index 65f1464baf..6cb4280af1 100644 --- a/src/main/io/displayport_max7456.c +++ b/src/main/io/displayport_max7456.c @@ -46,7 +46,7 @@ static int grab(displayPort_t *displayPort) UNUSED(displayPort); #ifdef OSD osdResetAlarms(); - refreshTimeout = 0; + resumeRefreshAt = 0; #endif return 0; diff --git a/src/main/io/osd.c b/src/main/io/osd.c index be4a8501c3..3bf11238d4 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -127,8 +127,8 @@ typedef struct statistic_s { static statistic_t stats; -uint16_t refreshTimeout = 0; -#define REFRESH_1S 12 // FIXME dependant on how frequently the task is scheduled +uint32_t resumeRefreshAt = 0; +#define REFRESH_1S 1000 * 1000 static uint8_t armState; @@ -621,7 +621,7 @@ void osdInit(displayPort_t *osdDisplayPortToUse) displayResync(osdDisplayPort); - refreshTimeout = 4 * REFRESH_1S; + resumeRefreshAt = micros() + (4 * REFRESH_1S); } void osdUpdateAlarms(void) @@ -803,17 +803,12 @@ static void osdShowStats(void) displayWrite(osdDisplayPort, 22, top++, buff); } #endif - - refreshTimeout = 60 * REFRESH_1S; } -// called when motors armed -static void osdArmMotors(void) +static void osdShowArmed(void) { displayClearScreen(osdDisplayPort); displayWrite(osdDisplayPort, 12, 7, "ARMED"); - refreshTimeout = REFRESH_1S / 2; - osdResetStats(); } static void osdRefresh(timeUs_t currentTimeUs) @@ -823,10 +818,14 @@ static void osdRefresh(timeUs_t currentTimeUs) // detect arm/disarm if (armState != ARMING_FLAG(ARMED)) { - if (ARMING_FLAG(ARMED)) - osdArmMotors(); // reset statistic etc - else - osdShowStats(); // show statistic + if (ARMING_FLAG(ARMED)) { + osdResetStats(); + osdShowArmed(); + resumeRefreshAt = currentTimeUs + (REFRESH_1S / 2); + } else { + osdShowStats(); + resumeRefreshAt = currentTimeUs + (60 * REFRESH_1S); + } armState = ARMING_FLAG(ARMED); } @@ -840,13 +839,18 @@ static void osdRefresh(timeUs_t currentTimeUs) lastSec = sec; } - if (refreshTimeout) { - if (IS_HI(THROTTLE) || IS_HI(PITCH)) // hide statistics - refreshTimeout = 1; - refreshTimeout--; - if (!refreshTimeout) + 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 = 0; + } + + return; + } else { displayClearScreen(osdDisplayPort); - return; + resumeRefreshAt = 0; + } } blinkState = (currentTimeUs / 200000) % 2; @@ -881,8 +885,18 @@ void osdUpdate(timeUs_t currentTimeUs) #ifdef USE_MAX7456 #define DRAW_FREQ_DENOM 5 #else -#define DRAW_FREQ_DENOM 10 // MWOSD @ 115200 baud +#define DRAW_FREQ_DENOM 10 // MWOSD @ 115200 baud ( #endif + +#ifdef USE_SLOW_MSP_DISPLAYPORT_RATE_WHEN_UNARMED + static uint32_t idlecounter = 0; + if (!ARMING_FLAG(ARMED)) { + if (idlecounter++ % 4 != 0) { + return; + } + } +#endif + if (counter++ % DRAW_FREQ_DENOM == 0) { osdRefresh(currentTimeUs); } else { // rest of time redraw screen 10 chars per idle so it doesn't lock the main idle diff --git a/src/main/io/osd.h b/src/main/io/osd.h index b2a232bb95..bc3f5bac2a 100755 --- a/src/main/io/osd.h +++ b/src/main/io/osd.h @@ -73,7 +73,7 @@ typedef struct osdConfig_s { osd_unit_e units; } osdConfig_t; -extern uint16_t refreshTimeout; +extern uint32_t resumeRefreshAt; PG_DECLARE(osdConfig_t, osdConfig); diff --git a/src/main/target/SPRACINGF3/target.h b/src/main/target/SPRACINGF3/target.h index 40abf49f29..099c8a9029 100644 --- a/src/main/target/SPRACINGF3/target.h +++ b/src/main/target/SPRACINGF3/target.h @@ -173,6 +173,7 @@ #define OSD #define USE_OSD_OVER_MSP_DISPLAYPORT +#define USE_SLOW_MSP_DISPLAYPORT_RATE_WHEN_UNARMED #define USE_ESC_SENSOR #define REMAP_TIM17_DMA From 228e457ead1defc6dea60ac666accebcc95f5b3d Mon Sep 17 00:00:00 2001 From: Hydra Date: Sat, 15 Apr 2017 12:45:53 +0100 Subject: [PATCH 3/3] CF/BF - Prevent 'waiting for fc' message on OSD slave when the osd statistics page or splash screen is shown. --- src/main/io/displayport_msp.c | 4 +++- src/main/io/osd.c | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/io/displayport_msp.c b/src/main/io/displayport_msp.c index 533ea4fb01..72c7272588 100644 --- a/src/main/io/displayport_msp.c +++ b/src/main/io/displayport_msp.c @@ -54,7 +54,9 @@ static int heartbeat(displayPort_t *displayPort) { uint8_t subcmd[] = { 0 }; - // ensure display is not released by MW OSD software + // heartbeat is used to: + // a) ensure display is not released by MW OSD software + // b) prevent OSD Slave boards from displaying a 'disconnected' status. return output(displayPort, MSP_DISPLAYPORT, subcmd, sizeof(subcmd)); } diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 3bf11238d4..c0c2b1b361 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -846,6 +846,7 @@ static void osdRefresh(timeUs_t currentTimeUs) resumeRefreshAt = 0; } + displayHeartbeat(osdDisplayPort); return; } else { displayClearScreen(osdDisplayPort); @@ -859,7 +860,7 @@ static void osdRefresh(timeUs_t currentTimeUs) if (!displayIsGrabbed(osdDisplayPort)) { osdUpdateAlarms(); osdDrawElements(); - displayHeartbeat(osdDisplayPort); // heartbeat to stop Minim OSD going back into native mode + displayHeartbeat(osdDisplayPort); #ifdef OSD_CALLS_CMS } else { cmsUpdate(currentTimeUs);