1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-15 20:35:33 +03:00

Add DISPLAY feature to enable/disable the OLED display. Add ARMED page

which is displayed upon arming.  Resume page cycling when disarmed.
This commit is contained in:
Dominic Clifton 2014-09-16 01:33:15 +01:00
parent 1790e082fe
commit 0d37bcdf5b
7 changed files with 59 additions and 20 deletions

View file

@ -98,7 +98,7 @@ void mixerUseConfigs(servoParam_t *servoConfToUse, flight3DConfig_t *flight3DCon
master_t masterConfig; // master config struct with data independent from profiles master_t masterConfig; // master config struct with data independent from profiles
profile_t *currentProfile; // profile config struct profile_t *currentProfile; // profile config struct
static const uint8_t EEPROM_CONF_VERSION = 77; static const uint8_t EEPROM_CONF_VERSION = 78;
static void resetAccelerometerTrims(flightDynamicsTrims_t *accelerometerTrims) static void resetAccelerometerTrims(flightDynamicsTrims_t *accelerometerTrims)
{ {

View file

@ -34,8 +34,9 @@ typedef enum {
FEATURE_RX_PARALLEL_PWM = 1 << 13, FEATURE_RX_PARALLEL_PWM = 1 << 13,
FEATURE_RX_MSP = 1 << 14, FEATURE_RX_MSP = 1 << 14,
FEATURE_RSSI_ADC = 1 << 15, FEATURE_RSSI_ADC = 1 << 15,
FEATURE_LED_STRIP = 1 << 16 FEATURE_LED_STRIP = 1 << 16,
} AvailableFeatures; FEATURE_DISPLAY = 1 << 17
} features_e;
bool feature(uint32_t mask); bool feature(uint32_t mask);
void featureSet(uint32_t mask); void featureSet(uint32_t mask);

View file

@ -54,23 +54,33 @@ uint32_t nextPageAt = 0;
char lineBuffer[SCREEN_CHARACTER_COLUMN_COUNT]; char lineBuffer[SCREEN_CHARACTER_COLUMN_COUNT];
typedef enum { typedef enum {
PAGE_ARMED,
PAGE_BATTERY, PAGE_BATTERY,
PAGE_SENSORS PAGE_SENSORS
} pageId_e; } pageId_e;
const char* pageTitles[] = { const char* pageTitles[] = {
"ARMED",
"BATTERY", "BATTERY",
"SENSORS" "SENSORS"
}; };
#define PAGE_COUNT (PAGE_SENSORS + 1) #define PAGE_COUNT (PAGE_SENSORS + 1)
const uint8_t cyclePageIds[] = {
PAGE_BATTERY,
PAGE_SENSORS
};
#define CYCLE_PAGE_ID_COUNT (sizeof(cyclePageIds) / sizeof(cyclePageIds[0]))
static const char* tickerCharacters = "|/-\\"; static const char* tickerCharacters = "|/-\\";
#define TICKER_CHARACTER_COUNT (sizeof(tickerCharacters) / sizeof(char)) #define TICKER_CHARACTER_COUNT (sizeof(tickerCharacters) / sizeof(char))
typedef struct pageState_s { typedef struct pageState_s {
bool pageChanging; bool pageChanging;
pageId_e pageId; pageId_e pageId;
uint8_t cycleIndex;
} pageState_t; } pageState_t;
static pageState_t pageState; static pageState_t pageState;
@ -131,6 +141,10 @@ void handlePageChange(void)
showTitle(); showTitle();
} }
void showArmedPage(void)
{
}
void showBatteryPage(void) void showBatteryPage(void)
{ {
tfp_sprintf(lineBuffer, "volts: %d.%d, cells: %d", vbat / 10, vbat % 10, batteryCellCount); tfp_sprintf(lineBuffer, "volts: %d.%d, cells: %d", vbat / 10, vbat % 10, batteryCellCount);
@ -170,6 +184,7 @@ void showSensorsPage(void)
void updateDisplay(void) void updateDisplay(void)
{ {
uint32_t now = micros(); uint32_t now = micros();
static uint8_t previousArmedState = 0;
bool updateNow = (int32_t)(now - nextDisplayUpdateAt) >= 0L; bool updateNow = (int32_t)(now - nextDisplayUpdateAt) >= 0L;
if (!updateNow) { if (!updateNow) {
@ -178,20 +193,35 @@ void updateDisplay(void)
nextDisplayUpdateAt = now + DISPLAY_UPDATE_FREQUENCY; nextDisplayUpdateAt = now + DISPLAY_UPDATE_FREQUENCY;
if (ARMING_FLAG(ARMED)) { bool armedState = ARMING_FLAG(ARMED) ? true : false;
bool armedStateChanged = armedState != previousArmedState;
previousArmedState = armedState;
if (armedState) {
if (!armedStateChanged) {
return; return;
} }
pageState.pageId = PAGE_ARMED;
pageState.pageChanging = true;
} else {
if (armedStateChanged) {
nextPageAt = now;
pageState.cycleIndex = CYCLE_PAGE_ID_COUNT;
}
pageState.pageChanging = (int32_t)(now - nextPageAt) >= 0L; pageState.pageChanging = (int32_t)(now - nextPageAt) >= 0L;
if (pageState.pageChanging) { if (pageState.pageChanging) {
nextPageAt = now + PAGE_CYCLE_FREQUENCY; nextPageAt = now + PAGE_CYCLE_FREQUENCY;
pageState.pageId++; pageState.cycleIndex++;
pageState.pageId = pageState.pageId % PAGE_COUNT; pageState.cycleIndex = pageState.cycleIndex % CYCLE_PAGE_ID_COUNT;
pageState.pageId = cyclePageIds[pageState.cycleIndex];
handlePageChange(); }
} }
if (pageState.pageChanging) {
handlePageChange();
}
switch(pageState.pageId) { switch(pageState.pageId) {
case PAGE_BATTERY: case PAGE_BATTERY:
showBatteryPage(); showBatteryPage();
@ -199,9 +229,13 @@ void updateDisplay(void)
case PAGE_SENSORS: case PAGE_SENSORS:
showSensorsPage(); showSensorsPage();
break; break;
case PAGE_ARMED:
showArmedPage();
break;
} }
if (!armedState) {
updateTicker(); updateTicker();
}
} }

View file

@ -99,7 +99,7 @@ uint8_t cliMode = 0;
static char cliBuffer[48]; static char cliBuffer[48];
static uint32_t bufferIndex = 0; static uint32_t bufferIndex = 0;
// sync this with MultiType enum from mw.h // sync this with mutiType_e
static const char * const mixerNames[] = { static const char * const mixerNames[] = {
"TRI", "QUADP", "QUADX", "BI", "TRI", "QUADP", "QUADX", "BI",
"GIMBAL", "Y6", "HEX6", "GIMBAL", "Y6", "HEX6",
@ -109,15 +109,15 @@ static const char * const mixerNames[] = {
"CUSTOM", NULL "CUSTOM", NULL
}; };
// sync this with AvailableFeatures enum from board.h // sync this with features_e
static const char * const featureNames[] = { static const char * const featureNames[] = {
"RX_PPM", "VBAT", "INFLIGHT_ACC_CAL", "RX_SERIAL", "MOTOR_STOP", "RX_PPM", "VBAT", "INFLIGHT_ACC_CAL", "RX_SERIAL", "MOTOR_STOP",
"SERVO_TILT", "SOFTSERIAL", "GPS", "FAILSAFE", "SERVO_TILT", "SOFTSERIAL", "GPS", "FAILSAFE",
"SONAR", "TELEMETRY", "CURRENT_METER", "3D", "RX_PARALLEL_PWM", "SONAR", "TELEMETRY", "CURRENT_METER", "3D", "RX_PARALLEL_PWM",
"RX_MSP", "RSSI_ADC", "LED_STRIP", NULL "RX_MSP", "RSSI_ADC", "LED_STRIP", "DISPLAY", NULL
}; };
// sync this with AvailableSensors enum from board.h // sync this with sensors_e
static const char * const sensorNames[] = { static const char * const sensorNames[] = {
"GYRO", "ACC", "BARO", "MAG", "SONAR", "GPS", "GPS+MAG", NULL "GYRO", "ACC", "BARO", "MAG", "SONAR", "GPS", "GPS+MAG", NULL
}; };

View file

@ -139,7 +139,9 @@ void init(void)
initBoardAlignment(&masterConfig.boardAlignment); initBoardAlignment(&masterConfig.boardAlignment);
#ifdef DISPLAY #ifdef DISPLAY
if (feature(FEATURE_DISPLAY)) {
displayInit(); displayInit();
}
#endif #endif
// We have these sensors; SENSORS_SET defined in board.h depending on hardware platform // We have these sensors; SENSORS_SET defined in board.h depending on hardware platform

View file

@ -434,7 +434,9 @@ void executePeriodicTasks(void)
#endif #endif
#ifdef DISPLAY #ifdef DISPLAY
case UPDATE_DISPLAY_TASK: case UPDATE_DISPLAY_TASK:
if (feature(FEATURE_DISPLAY)) {
updateDisplay(); updateDisplay();
}
break; break;
#endif #endif
} }

View file

@ -29,7 +29,7 @@ typedef enum {
SENSOR_SONAR = 1 << 4, SENSOR_SONAR = 1 << 4,
SENSOR_GPS = 1 << 5, SENSOR_GPS = 1 << 5,
SENSOR_GPSMAG = 1 << 6, SENSOR_GPSMAG = 1 << 6,
} AvailableSensors; } sensors_e;
typedef enum { typedef enum {
ALIGN_DEFAULT = 0, // driver-provided alignment ALIGN_DEFAULT = 0, // driver-provided alignment