From 15a786d7f194849944317283b924e28367a6e4d1 Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Sun, 4 Jun 2017 13:36:57 +0100 Subject: [PATCH] Merge pull request #2839 from cleanflight/cleanup-dashboard-1 Cleanup some dashboard code. --- src/main/io/dashboard.c | 158 ++++++++++--------------- src/main/io/dashboard.h | 2 + src/main/target/SPRACINGF3EVO/target.h | 2 - 3 files changed, 64 insertions(+), 98 deletions(-) diff --git a/src/main/io/dashboard.c b/src/main/io/dashboard.c index a185da7a32..129b629762 100644 --- a/src/main/io/dashboard.c +++ b/src/main/io/dashboard.c @@ -88,43 +88,17 @@ static char lineBuffer[SCREEN_CHARACTER_COLUMN_COUNT + 1]; #define HALF_SCREEN_CHARACTER_COLUMN_COUNT (SCREEN_CHARACTER_COLUMN_COUNT / 2) #define IS_SCREEN_CHARACTER_COLUMN_COUNT_ODD (SCREEN_CHARACTER_COLUMN_COUNT & 1) -static const char* const pageTitles[] = { - "CLEANFLIGHT", - "ARMED", - "BATTERY", - "SENSORS", - "RX", - "PROFILE" -#ifndef SKIP_TASK_STATISTICS - ,"TASKS" -#endif -#ifdef GPS - ,"GPS" -#endif -#ifdef ENABLE_DEBUG_DASHBOARD_PAGE - ,"DEBUG" -#endif -}; +typedef void (*pageFnPtr)(void); -#define PAGE_COUNT (PAGE_RX + 1) +#define PAGE_FLAGS_NONE 0 +#define PAGE_FLAGS_SKIP_CYCLING (1 << 0) -const pageId_e cyclePageIds[] = { - PAGE_PROFILE, -#ifdef GPS - PAGE_GPS, -#endif - PAGE_RX, - PAGE_BATTERY, - PAGE_SENSORS -#ifndef SKIP_TASK_STATISTICS - ,PAGE_TASKS -#endif -#ifdef ENABLE_DEBUG_DASHBOARD_PAGE - ,PAGE_DEBUG, -#endif -}; - -#define CYCLE_PAGE_ID_COUNT (sizeof(cyclePageIds) / sizeof(cyclePageIds[0])) +typedef struct pageEntry_s { + pageId_e id; + char *title; + pageFnPtr drawFn; + uint8_t flags; +} pageEntry_t; static const char* tickerCharacters = "|/-\\"; // use 2/4/8 characters so that the divide is optimal. #define TICKER_CHARACTER_COUNT (sizeof(tickerCharacters) / sizeof(char)) @@ -132,13 +106,12 @@ static const char* tickerCharacters = "|/-\\"; // use 2/4/8 characters so that t typedef enum { PAGE_STATE_FLAG_NONE = 0, PAGE_STATE_FLAG_CYCLE_ENABLED = (1 << 0), - PAGE_STATE_FLAG_FORCE_PAGE_CHANGE = (1 << 1) + PAGE_STATE_FLAG_FORCE_PAGE_CHANGE = (1 << 1), } pageFlags_e; typedef struct pageState_s { bool pageChanging; - pageId_e pageId; - pageId_e pageIdBeforeArming; + const pageEntry_t *page; uint8_t pageFlags; uint8_t cycleIndex; uint32_t nextPageAt; @@ -256,7 +229,7 @@ void updateFailsafeStatus(void) void showTitle() { i2c_OLED_set_line(0); - i2c_OLED_send_string(pageTitles[pageState.pageId]); + i2c_OLED_send_string(pageState.page->title); } void handlePageChange(void) @@ -362,6 +335,12 @@ void showProfilePage(void) #ifdef GPS void showGpsPage() { + + if (!feature(FEATURE_GPS)) { + pageState.pageFlags |= PAGE_STATE_FLAG_FORCE_PAGE_CHANGE; + return; + } + uint8_t rowIndex = PAGE_TITLE_LINE_COUNT; static uint8_t gpsTicker = 0; @@ -571,9 +550,7 @@ void showTasksPage(void) void showDebugPage(void) { - uint8_t rowIndex; - - for (rowIndex = 0; rowIndex < 4; rowIndex++) { + for (int rowIndex = 0; rowIndex < 4; rowIndex++) { tfp_sprintf(lineBuffer, "%d = %5d", rowIndex, debug[rowIndex]); padLineBuffer(); i2c_OLED_set_line(rowIndex + PAGE_TITLE_LINE_COUNT); @@ -582,6 +559,36 @@ void showDebugPage(void) } #endif +static const pageEntry_t pages[PAGE_COUNT] = { + { PAGE_WELCOME, "CLEANFLIGHT", showWelcomePage, PAGE_FLAGS_SKIP_CYCLING }, + { PAGE_ARMED, "ARMED", showArmedPage, PAGE_FLAGS_SKIP_CYCLING }, + { PAGE_PROFILE, "PROFILE", showProfilePage, PAGE_FLAGS_NONE }, +#ifdef GPS + { PAGE_GPS, "GPS", showGpsPage, PAGE_FLAGS_NONE }, +#endif + { PAGE_RX, "RX", showRxPage, PAGE_FLAGS_NONE }, + { PAGE_BATTERY, "BATTERY", showBatteryPage, PAGE_FLAGS_NONE }, + { PAGE_SENSORS, "SENSORS", showSensorsPage, PAGE_FLAGS_NONE }, +#ifndef SKIP_TASK_STATISTICS + { PAGE_TASKS, "TASKS", showTasksPage, PAGE_FLAGS_NONE }, +#endif +#ifdef ENABLE_DEBUG_DASHBOARD_PAGE + { PAGE_DEBUG, "DEBUG", showDebugPage, PAGE_FLAGS_NONE }, +#endif +}; + + +void dashboardSetPage(pageId_e pageId) +{ + for (int i = 0; i < PAGE_COUNT; i++) { + const pageEntry_t *candidatePage = &pages[i]; + if (candidatePage->id == pageId) { + pageState.page = candidatePage; + } + } + pageState.pageFlags |= PAGE_STATE_FLAG_FORCE_PAGE_CHANGE; +} + void dashboardUpdate(timeUs_t currentTimeUs) { static uint8_t previousArmedState = 0; @@ -607,21 +614,22 @@ void dashboardUpdate(timeUs_t currentTimeUs) if (!armedStateChanged) { return; } - pageState.pageIdBeforeArming = pageState.pageId; - pageState.pageId = PAGE_ARMED; + dashboardSetPage(PAGE_ARMED); pageState.pageChanging = true; } else { if (armedStateChanged) { pageState.pageFlags |= PAGE_STATE_FLAG_FORCE_PAGE_CHANGE; - pageState.pageId = pageState.pageIdBeforeArming; } pageState.pageChanging = (pageState.pageFlags & PAGE_STATE_FLAG_FORCE_PAGE_CHANGE) || (((int32_t)(currentTimeUs - pageState.nextPageAt) >= 0L && (pageState.pageFlags & PAGE_STATE_FLAG_CYCLE_ENABLED))); if (pageState.pageChanging && (pageState.pageFlags & PAGE_STATE_FLAG_CYCLE_ENABLED)) { - pageState.cycleIndex++; - pageState.cycleIndex = pageState.cycleIndex % CYCLE_PAGE_ID_COUNT; - pageState.pageId = cyclePageIds[pageState.cycleIndex]; + + do { + pageState.cycleIndex++; + pageState.cycleIndex = pageState.cycleIndex % PAGE_COUNT; + pageState.page = &pages[pageState.cycleIndex]; + } while (pageState.page->flags & PAGE_FLAGS_SKIP_CYCLING); } } @@ -644,45 +652,8 @@ void dashboardUpdate(timeUs_t currentTimeUs) return; } - switch(pageState.pageId) { - case PAGE_WELCOME: - showWelcomePage(); - break; - case PAGE_ARMED: - showArmedPage(); - break; - case PAGE_BATTERY: - showBatteryPage(); - break; - case PAGE_SENSORS: - showSensorsPage(); - break; - case PAGE_RX: - showRxPage(); - break; - case PAGE_PROFILE: - showProfilePage(); - break; -#ifndef SKIP_TASK_STATISTICS - case PAGE_TASKS: - showTasksPage(); - break; -#endif -#ifdef GPS - case PAGE_GPS: - if (feature(FEATURE_GPS)) { - showGpsPage(); - } else { - pageState.pageFlags |= PAGE_STATE_FLAG_FORCE_PAGE_CHANGE; - } - break; -#endif -#ifdef ENABLE_DEBUG_DASHBOARD_PAGE - case PAGE_DEBUG: - showDebugPage(); - break; -#endif - } + pageState.page->drawFn(); + if (!armedState) { updateFailsafeStatus(); updateRxStatus(); @@ -691,12 +662,6 @@ void dashboardUpdate(timeUs_t currentTimeUs) } -void dashboardSetPage(pageId_e pageId) -{ - pageState.pageId = pageId; - pageState.pageFlags |= PAGE_STATE_FLAG_FORCE_PAGE_CHANGE; -} - void dashboardInit(void) { delay(200); @@ -713,9 +678,10 @@ void dashboardInit(void) memset(&pageState, 0, sizeof(pageState)); dashboardSetPage(PAGE_WELCOME); - dashboardUpdate(micros()); + uint32_t now = micros(); + dashboardUpdate(now); - dashboardSetNextPageChangeAt(micros() + (1000 * 1000 * 5)); + dashboardSetNextPageChangeAt(now + PAGE_CYCLE_FREQUENCY); } void dashboardShowFixedPage(pageId_e pageId) @@ -736,7 +702,7 @@ void dashboardEnablePageCycling(void) void dashboardResetPageCycling(void) { - pageState.cycleIndex = CYCLE_PAGE_ID_COUNT - 1; // start at first page + pageState.cycleIndex = PAGE_COUNT - 1; // start at first page } diff --git a/src/main/io/dashboard.h b/src/main/io/dashboard.h index 357f0778be..e7cc81f1fc 100644 --- a/src/main/io/dashboard.h +++ b/src/main/io/dashboard.h @@ -35,6 +35,8 @@ typedef enum { #ifdef ENABLE_DEBUG_DASHBOARD_PAGE PAGE_DEBUG, #endif + + PAGE_COUNT } pageId_e; void dashboardInit(void); diff --git a/src/main/target/SPRACINGF3EVO/target.h b/src/main/target/SPRACINGF3EVO/target.h index b9a8708a4c..ba0819bb95 100755 --- a/src/main/target/SPRACINGF3EVO/target.h +++ b/src/main/target/SPRACINGF3EVO/target.h @@ -166,8 +166,6 @@ #define USE_OSD_OVER_MSP_DISPLAYPORT #define USE_MSP_CURRENT_METER -#undef USE_DASHBOARD - #define TRANSPONDER #define ENABLE_BLACKBOX_LOGGING_ON_SDCARD_BY_DEFAULT