Partial frame rendering

This commit is contained in:
2026-04-03 17:02:07 +02:00
parent a052888a38
commit 49a17bdffd
2 changed files with 106 additions and 52 deletions

View File

@@ -98,6 +98,7 @@ void Lcd::expireMessageIfNeeded(unsigned long now) {
message_screen_ = screen::Blank; message_screen_ = screen::Blank;
screen_ = data_screen_; screen_ = data_screen_;
force_render_ = true; force_render_ = true;
base_rendered_ = false;
} }
} }
@@ -151,7 +152,6 @@ int Lcd::renderGpsDebug() {
} }
int Lcd::renderDriverPrimary() { int Lcd::renderDriverPrimary() {
this->clear();
GpsData gps_data; GpsData gps_data;
gpsGlobalRead(gps_data); gpsGlobalRead(gps_data);
@@ -167,57 +167,77 @@ int Lcd::renderDriverPrimary() {
uint16_t num_laps; uint16_t num_laps;
lapCountGlobalRead(num_laps); lapCountGlobalRead(num_laps);
if (!base_rendered_) {
this->clear();
display_->setCursor(0, 0); display_->setCursor(0, 0);
this->print("GPS:"); this->print("GPS:");
display_->setCursor(7, 0);
this->print("LAPS:");
display_->setCursor(0, 2);
this->print("SPD:");
display_->setCursor(0, 3);
this->print("V:");
display_->setCursor(10, 3);
this->print("T:");
base_rendered_ = true;
}
display_->setCursor(4, 0);
if (gps_data.num_fix_ != 0) { if (gps_data.num_fix_ != 0) {
this->print("Y"); this->print("Y");
} else { } else {
this->print("N"); this->print("N");
} }
display_->setCursor(7, 0); display_->setCursor(12, 0);
this->print("LAPS:"); if (num_laps < 10)
if (num_laps < 10) this->print('0'); this->print('0');
this->print(num_laps, 10); this->print(num_laps, 10);
display_->setCursor(0, 2); display_->setCursor(4, 2);
this->print("SPD:"); if (gps_data.speed_.value_ < 10.0)
if (gps_data.speed_.valid_) { this->print('0');
this->print(gps_data.speed_.value_, 1); this->print(gps_data.speed_.value_, 1);
} else {
this->print("NA");
}
display_->setCursor(0, 3); display_->setCursor(2, 3);
this->print("V:");
this->print(vbat, 1); this->print(vbat, 1);
display_->setCursor(10, 3); display_->setCursor(12, 3);
this->print("T:");
this->print(teng, 1); this->print(teng, 1);
return 0; return 0;
} }
int Lcd::renderMsgGpsFix() { int Lcd::renderMsgGpsFix() {
if (!base_rendered_) {
this->clear(); this->clear();
display_->setCursor(6, 1); display_->setCursor(6, 1);
this->print("GPS INFO"); this->print("GPS INFO");
display_->setCursor(7, 2); display_->setCursor(7, 2);
this->print("FIX OK"); this->print("FIX OK");
base_rendered_ = true;
}
return 0; return 0;
} }
int Lcd::renderMsgGpsTrigger() { int Lcd::renderMsgGpsTrigger() {
if (!base_rendered_) {
this->clear(); this->clear();
display_->setCursor(6, 1); display_->setCursor(6, 1);
this->print("GPS INFO"); this->print("GPS INFO");
display_->setCursor(4, 2); display_->setCursor(4, 2);
this->print("LINE TRIGGER"); this->print("LINE TRIGGER");
base_rendered_ = true;
}
return 0; return 0;
} }
int Lcd::renderMsgTrackDetectOk() { int Lcd::renderMsgTrackDetectOk() {
if (!base_rendered_) {
this->clear(); this->clear();
display_->setCursor(6, 0); display_->setCursor(6, 0);
this->print("GPS INFO"); this->print("GPS INFO");
@@ -229,56 +249,74 @@ int Lcd::renderMsgTrackDetectOk() {
display_->setCursor((20 - strlen(track_data.root_.name_)) / 2, 2); display_->setCursor((20 - strlen(track_data.root_.name_)) / 2, 2);
this->print(track_data.root_.name_); this->print(track_data.root_.name_);
base_rendered_ = true;
}
return 0; return 0;
} }
int Lcd::renderMsgConfigNoTracks() { int Lcd::renderMsgConfigNoTracks() {
if (!base_rendered_) {
this->clear(); this->clear();
display_->setCursor(4, 1); display_->setCursor(4, 1);
this->print("CONFIG INFO"); this->print("CONFIG INFO");
display_->setCursor(2, 2); display_->setCursor(2, 2);
this->print("NO TRACKS LOADED"); this->print("NO TRACKS LOADED");
base_rendered_ = true;
}
return 0; return 0;
} }
int Lcd::renderMsgBatteryLow() { int Lcd::renderMsgBatteryLow() {
if (!base_rendered_) {
this->clear(); this->clear();
display_->setCursor(6, 1); display_->setCursor(6, 1);
this->print("WARNING"); this->print("WARNING");
display_->setCursor(6, 2); display_->setCursor(6, 2);
this->print("VBAT LOW"); this->print("VBAT LOW");
base_rendered_ = true;
}
return 0; return 0;
} }
int Lcd::renderMsgEngineTempLow() { int Lcd::renderMsgEngineTempLow() {
if (!base_rendered_) {
this->clear(); this->clear();
display_->setCursor(6, 1); display_->setCursor(6, 1);
this->print("WARNING"); this->print("WARNING");
display_->setCursor(2, 2); display_->setCursor(2, 2);
this->print("ENGINE TEMP LOW"); this->print("ENGINE TEMP LOW");
base_rendered_ = true;
}
return 0; return 0;
} }
int Lcd::renderMsgEngineTempHigh() { int Lcd::renderMsgEngineTempHigh() {
if (!base_rendered_) {
this->clear(); this->clear();
display_->setCursor(6, 1); display_->setCursor(6, 1);
this->print("WARNING"); this->print("WARNING");
display_->setCursor(2, 2); display_->setCursor(2, 2);
this->print("ENGINE TEMP HIGH"); this->print("ENGINE TEMP HIGH");
base_rendered_ = true;
}
return 0; return 0;
} }
int Lcd::renderMsgLapCounterStart() { int Lcd::renderMsgLapCounterStart() {
if (!base_rendered_) {
this->clear(); this->clear();
display_->setCursor(5, 1); display_->setCursor(5, 1);
this->print("LAP COUNTER"); this->print("LAP COUNTER");
display_->setCursor(6, 2); display_->setCursor(6, 2);
this->print("STARTED"); this->print("STARTED");
base_rendered_ = true;
}
return 0; return 0;
} }
int Lcd::renderMsgLapCounterLapTime() { int Lcd::renderMsgLapCounterLapTime() {
if (!base_rendered_) {
uint32_t time_cs; uint32_t time_cs;
lastLapTimeGlobalRead(time_cs); lastLapTimeGlobalRead(time_cs);
@@ -293,18 +331,23 @@ int Lcd::renderMsgLapCounterLapTime() {
display_->setCursor(6, 2); display_->setCursor(6, 2);
if (minutes < 10) this->print('0'); if (minutes < 10)
this->print('0');
this->print(minutes, 10); this->print(minutes, 10);
this->print(':'); this->print(':');
if (seconds < 10) this->print('0'); if (seconds < 10)
this->print('0');
this->print(seconds, 10); this->print(seconds, 10);
this->print('.'); this->print('.');
if (cs < 10) this->print('0'); if (cs < 10)
this->print('0');
this->print(cs, 10); this->print(cs, 10);
base_rendered_ = true;
}
return 0; return 0;
} }
@@ -321,7 +364,7 @@ Lcd::Lcd()
Lcd::Lcd(SystemLogger *logger) Lcd::Lcd(SystemLogger *logger)
: display_cleared_(false), logger_(logger), screen_(screen::Blank), : display_cleared_(false), logger_(logger), screen_(screen::Blank),
data_screen_(screen::Blank), message_screen_(screen::Blank), data_screen_(screen::Blank), message_screen_(screen::Blank),
last_render_(0), frame_duration_(2000) { last_render_(0), frame_duration_(500) {
display_ = new LiquidCrystal_I2C(0x27, 20, 4); display_ = new LiquidCrystal_I2C(0x27, 20, 4);
} }
@@ -469,6 +512,7 @@ int Lcd::loop(unsigned long timeout_ms) {
switch (next_task.type_) { switch (next_task.type_) {
case task::DisplayGpsDebug: case task::DisplayGpsDebug:
base_rendered_ = false;
data_screen_ = screen::GpsDebug; data_screen_ = screen::GpsDebug;
if (!message_active_) { if (!message_active_) {
screen_ = data_screen_; screen_ = data_screen_;
@@ -477,6 +521,7 @@ int Lcd::loop(unsigned long timeout_ms) {
break; break;
case task::DisplayDriverPrimary: case task::DisplayDriverPrimary:
base_rendered_ = false;
data_screen_ = screen::DriverPrimary; data_screen_ = screen::DriverPrimary;
if (!message_active_) { if (!message_active_) {
screen_ = data_screen_; screen_ = data_screen_;
@@ -485,34 +530,42 @@ int Lcd::loop(unsigned long timeout_ms) {
break; break;
case task::DisplayMsgGpsFix: case task::DisplayMsgGpsFix:
base_rendered_ = false;
activateMessage(screen::MsgGpsFix, next_task.data_); activateMessage(screen::MsgGpsFix, next_task.data_);
break; break;
case task::DisplayMsgTrackDetectOk: case task::DisplayMsgTrackDetectOk:
base_rendered_ = false;
activateMessage(screen::MsgTrackDetectOk, next_task.data_); activateMessage(screen::MsgTrackDetectOk, next_task.data_);
break; break;
case task::DisplayMsgConfigNoTracks: case task::DisplayMsgConfigNoTracks:
base_rendered_ = false;
activateMessage(screen::MsgConfigNoTracks, next_task.data_); activateMessage(screen::MsgConfigNoTracks, next_task.data_);
break; break;
case task::DisplayMsgBatteryLow: case task::DisplayMsgBatteryLow:
base_rendered_ = false;
activateMessage(screen::MsgBatteryLow, next_task.data_); activateMessage(screen::MsgBatteryLow, next_task.data_);
break; break;
case task::DisplayMsgEngineTempLow: case task::DisplayMsgEngineTempLow:
base_rendered_ = false;
activateMessage(screen::MsgEngineTempLow, next_task.data_); activateMessage(screen::MsgEngineTempLow, next_task.data_);
break; break;
case task::DisplayMsgEngineTempHigh: case task::DisplayMsgEngineTempHigh:
base_rendered_ = false;
activateMessage(screen::MsgEngineTempHigh, next_task.data_); activateMessage(screen::MsgEngineTempHigh, next_task.data_);
break; break;
case task::DisplayMsgLapCounterStart: case task::DisplayMsgLapCounterStart:
base_rendered_ = false;
activateMessage(screen::MsgLapCounterStart, next_task.data_); activateMessage(screen::MsgLapCounterStart, next_task.data_);
break; break;
case task::DisplayMsgLapCounterLapTime: case task::DisplayMsgLapCounterLapTime:
base_rendered_ = false;
activateMessage(screen::MsgLapCounterLapTime, next_task.data_); activateMessage(screen::MsgLapCounterLapTime, next_task.data_);
default: default:

View File

@@ -51,6 +51,7 @@ private:
RingBuffer<Task, 16> queue_; RingBuffer<Task, 16> queue_;
Task deferred_task_{}; Task deferred_task_{};
bool deferred_task_valid_ = false; bool deferred_task_valid_ = false;
bool base_rendered_ = false;
void clear(); void clear();
void print(const String &msg); void print(const String &msg);