Partial frame rendering
This commit is contained in:
@@ -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);
|
||||||
@@ -163,128 +163,166 @@ int Lcd::renderDriverPrimary() {
|
|||||||
|
|
||||||
int line_trigger;
|
int line_trigger;
|
||||||
gpsTriggerGlobalRead(line_trigger);
|
gpsTriggerGlobalRead(line_trigger);
|
||||||
|
|
||||||
uint16_t num_laps;
|
uint16_t num_laps;
|
||||||
lapCountGlobalRead(num_laps);
|
lapCountGlobalRead(num_laps);
|
||||||
|
|
||||||
display_->setCursor(0, 0);
|
if (!base_rendered_) {
|
||||||
this->print("GPS:");
|
this->clear();
|
||||||
|
display_->setCursor(0, 0);
|
||||||
|
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() {
|
||||||
this->clear();
|
if (!base_rendered_) {
|
||||||
display_->setCursor(6, 1);
|
this->clear();
|
||||||
this->print("GPS INFO");
|
display_->setCursor(6, 1);
|
||||||
display_->setCursor(7, 2);
|
this->print("GPS INFO");
|
||||||
this->print("FIX OK");
|
display_->setCursor(7, 2);
|
||||||
|
this->print("FIX OK");
|
||||||
|
base_rendered_ = true;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Lcd::renderMsgGpsTrigger() {
|
int Lcd::renderMsgGpsTrigger() {
|
||||||
this->clear();
|
if (!base_rendered_) {
|
||||||
display_->setCursor(6, 1);
|
this->clear();
|
||||||
this->print("GPS INFO");
|
display_->setCursor(6, 1);
|
||||||
display_->setCursor(4, 2);
|
this->print("GPS INFO");
|
||||||
this->print("LINE TRIGGER");
|
display_->setCursor(4, 2);
|
||||||
|
this->print("LINE TRIGGER");
|
||||||
|
base_rendered_ = true;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Lcd::renderMsgTrackDetectOk() {
|
int Lcd::renderMsgTrackDetectOk() {
|
||||||
this->clear();
|
if (!base_rendered_) {
|
||||||
display_->setCursor(6, 0);
|
this->clear();
|
||||||
this->print("GPS INFO");
|
display_->setCursor(6, 0);
|
||||||
display_->setCursor(3, 1);
|
this->print("GPS INFO");
|
||||||
this->print("TRACK DETECTED");
|
display_->setCursor(3, 1);
|
||||||
|
this->print("TRACK DETECTED");
|
||||||
|
|
||||||
GlobalTrackData track_data;
|
GlobalTrackData track_data;
|
||||||
trackGlobalRead(track_data);
|
trackGlobalRead(track_data);
|
||||||
|
|
||||||
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() {
|
||||||
this->clear();
|
if (!base_rendered_) {
|
||||||
display_->setCursor(4, 1);
|
this->clear();
|
||||||
this->print("CONFIG INFO");
|
display_->setCursor(4, 1);
|
||||||
display_->setCursor(2, 2);
|
this->print("CONFIG INFO");
|
||||||
this->print("NO TRACKS LOADED");
|
display_->setCursor(2, 2);
|
||||||
|
this->print("NO TRACKS LOADED");
|
||||||
|
base_rendered_ = true;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Lcd::renderMsgBatteryLow() {
|
int Lcd::renderMsgBatteryLow() {
|
||||||
this->clear();
|
if (!base_rendered_) {
|
||||||
display_->setCursor(6, 1);
|
this->clear();
|
||||||
this->print("WARNING");
|
display_->setCursor(6, 1);
|
||||||
display_->setCursor(6, 2);
|
this->print("WARNING");
|
||||||
this->print("VBAT LOW");
|
display_->setCursor(6, 2);
|
||||||
|
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);
|
||||||
|
|
||||||
uint32_t minutes = (time_cs / 6000);
|
uint32_t minutes = (time_cs / 6000);
|
||||||
uint32_t seconds = (time_cs / 100) % 60;
|
uint32_t seconds = (time_cs / 100) % 60;
|
||||||
uint32_t cs = time_cs % 100;
|
uint32_t cs = time_cs % 100;
|
||||||
|
|
||||||
this->clear();
|
this->clear();
|
||||||
|
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user