LapCounter finished and working

This commit is contained in:
2026-04-03 16:20:45 +02:00
parent 2ff1024a69
commit ecccadc913
11 changed files with 283 additions and 137 deletions

View File

@@ -4,10 +4,10 @@
#include "lcd.h"
#include "data/general_store.h"
#include "modules/gps/gps.h"
#include <Wire.h>
#include <string.h>
#include "modules/gps/gps.h"
#include "data/general_store.h"
#define MOD "modules/lcd/lcd.h"
@@ -60,20 +60,23 @@ void Lcd::print(int i, int base) {
bool Lcd::isMessageTask(task::Type type) {
switch (type) {
case task::DisplayMsgGpsFix:
case task::DisplayMsgTrackDetectOk:
case task::DisplayMsgConfigNoTracks:
case task::DisplayMsgBatteryLow:
case task::DisplayMsgEngineTempLow:
case task::DisplayMsgEngineTempHigh:
return true;
case task::DisplayMsgGpsFix:
case task::DisplayMsgTrackDetectOk:
case task::DisplayMsgConfigNoTracks:
case task::DisplayMsgBatteryLow:
case task::DisplayMsgEngineTempLow:
case task::DisplayMsgEngineTempHigh:
case task::DisplayMsgLapCounterLapTime:
case task::DisplayMsgLapCounterStart:
return true;
default:
return false;
default:
return false;
}
}
void Lcd::activateMessage(screen::LcdScreen msg_screen, unsigned long duration_ms) {
void Lcd::activateMessage(screen::LcdScreen msg_screen,
unsigned long duration_ms) {
if (duration_ms == 0) {
duration_ms = frame_duration_;
}
@@ -149,19 +152,19 @@ int Lcd::renderGpsDebug() {
int Lcd::renderDriverPrimary() {
this->clear();
GpsData gps_data;
gpsGlobalRead(gps_data);
float vbat;
vbatGlobalRead(vbat);
float teng;
tengGlobalRead(teng);
int line_trigger;
gpsTriggerGlobalRead(line_trigger);
display_->setCursor(0,0);
display_->setCursor(0, 0);
this->print("GPS:");
if (gps_data.num_fix_ != 0) {
this->print("Y");
@@ -169,14 +172,13 @@ int Lcd::renderDriverPrimary() {
this->print("N");
}
display_->setCursor(7,0);
display_->setCursor(7, 0);
this->print("TRIG:");
switch (line_trigger)
{
switch (line_trigger) {
case 0:
this->print("I");
break;
case 1:
this->print("A");
break;
@@ -189,23 +191,23 @@ int Lcd::renderDriverPrimary() {
this->print("NULL");
break;
}
display_->setCursor(0,2);
display_->setCursor(0, 2);
this->print("SPD:");
if (gps_data.speed_.valid_) {
this->print(gps_data.speed_.value_, 1);
} else {
this->print("NA");
}
display_->setCursor(0,3);
display_->setCursor(0, 3);
this->print("V:");
this->print(vbat, 1);
display_->setCursor(10,3);
display_->setCursor(10, 3);
this->print("T:");
this->print(teng, 1);
return 0;
}
@@ -278,29 +280,60 @@ int Lcd::renderMsgEngineTempHigh() {
return 0;
}
int Lcd::push(const Task &task) {
return queue_.push(task);
int Lcd::renderMsgLapCounterStart() {
this->clear();
display_->setCursor(5, 1);
this->print("LAP COUNTER");
display_->setCursor(6, 2);
this->print("STARTED");
return 0;
}
int Lcd::renderMsgLapCounterLapTime() {
uint32_t time_cs;
lastLapTimeGlobalRead(time_cs);
uint32_t minutes = (time_cs / 6000);
uint32_t seconds = (time_cs / 100) % 60;
uint32_t cs = time_cs % 100;
this->clear();
display_->setCursor(6, 1);
this->print("LAP TIME");
display_->setCursor(6, 2);
if (minutes < 10) this->print('0');
this->print(minutes, 10);
this->print(':');
if (seconds < 10) this->print('0');
this->print(seconds, 10);
this->print('.');
if (cs < 10) this->print('0');
this->print(cs, 10);
return 0;
}
int Lcd::push(const Task &task) { return queue_.push(task); }
Lcd::Lcd()
: display_cleared_(false),
logger_(nullptr),
screen_(screen::Blank),
data_screen_(screen::Blank),
message_screen_(screen::Blank),
last_render_(0),
frame_duration_(2000) {
: display_cleared_(false), logger_(nullptr), screen_(screen::Blank),
data_screen_(screen::Blank), message_screen_(screen::Blank),
last_render_(0), frame_duration_(2000) {
display_ = new LiquidCrystal_I2C(0x27, 20, 4);
}
Lcd::Lcd(SystemLogger *logger)
: display_cleared_(false),
logger_(logger),
screen_(screen::Blank),
data_screen_(screen::Blank),
message_screen_(screen::Blank),
last_render_(0),
frame_duration_(2000) {
: display_cleared_(false), logger_(logger), screen_(screen::Blank),
data_screen_(screen::Blank), message_screen_(screen::Blank),
last_render_(0), frame_duration_(2000) {
display_ = new LiquidCrystal_I2C(0x27, 20, 4);
}
@@ -447,48 +480,55 @@ int Lcd::loop(unsigned long timeout_ms) {
}
switch (next_task.type_) {
case task::DisplayGpsDebug:
data_screen_ = screen::GpsDebug;
if (!message_active_) {
screen_ = data_screen_;
force_render_ = true;
}
break;
case task::DisplayGpsDebug:
data_screen_ = screen::GpsDebug;
if (!message_active_) {
screen_ = data_screen_;
force_render_ = true;
}
break;
case task::DisplayDriverPrimary:
data_screen_ = screen::DriverPrimary;
if (!message_active_) {
screen_ = data_screen_;
force_render_ = true;
}
break;
case task::DisplayDriverPrimary:
data_screen_ = screen::DriverPrimary;
if (!message_active_) {
screen_ = data_screen_;
force_render_ = true;
}
break;
case task::DisplayMsgGpsFix:
activateMessage(screen::MsgGpsFix, next_task.data_);
break;
case task::DisplayMsgGpsFix:
activateMessage(screen::MsgGpsFix, next_task.data_);
break;
case task::DisplayMsgTrackDetectOk:
activateMessage(screen::MsgTrackDetectOk, next_task.data_);
break;
case task::DisplayMsgTrackDetectOk:
activateMessage(screen::MsgTrackDetectOk, next_task.data_);
break;
case task::DisplayMsgConfigNoTracks:
activateMessage(screen::MsgConfigNoTracks, next_task.data_);
break;
case task::DisplayMsgBatteryLow:
activateMessage(screen::MsgBatteryLow, next_task.data_);
break;
case task::DisplayMsgEngineTempLow:
activateMessage(screen::MsgEngineTempLow, next_task.data_);
break;
case task::DisplayMsgEngineTempHigh:
activateMessage(screen::MsgEngineTempHigh, next_task.data_);
break;
case task::DisplayMsgConfigNoTracks:
activateMessage(screen::MsgConfigNoTracks, next_task.data_);
break;
default:
break;
case task::DisplayMsgBatteryLow:
activateMessage(screen::MsgBatteryLow, next_task.data_);
break;
case task::DisplayMsgEngineTempLow:
activateMessage(screen::MsgEngineTempLow, next_task.data_);
break;
case task::DisplayMsgEngineTempHigh:
activateMessage(screen::MsgEngineTempHigh, next_task.data_);
break;
case task::DisplayMsgLapCounterStart:
activateMessage(screen::MsgLapCounterStart, next_task.data_);
break;
case task::DisplayMsgLapCounterLapTime:
activateMessage(screen::MsgLapCounterLapTime, next_task.data_);
default:
break;
}
now = millis();
@@ -513,48 +553,56 @@ int Lcd::loop(unsigned long timeout_ms) {
}
switch (screen_) {
case screen::Blank:
this->clear();
break;
case screen::Blank:
this->clear();
break;
case screen::GpsDebug:
this->renderGpsDebug();
break;
case screen::GpsDebug:
this->renderGpsDebug();
break;
case screen::DriverPrimary:
this->renderDriverPrimary();
break;
case screen::DriverPrimary:
this->renderDriverPrimary();
break;
case screen::MsgGpsFix:
this->renderMsgGpsFix();
break;
case screen::MsgGpsFix:
this->renderMsgGpsFix();
break;
case screen::MsgGpsTrigger:
this->renderMsgGpsTrigger();
break;
case screen::MsgGpsTrigger:
this->renderMsgGpsTrigger();
break;
case screen::MsgTrackDetectOk:
this->renderMsgTrackDetectOk();
break;
case screen::MsgTrackDetectOk:
this->renderMsgTrackDetectOk();
break;
case screen::MsgConfigNoTracks:
this->renderMsgConfigNoTracks();
break;
case screen::MsgBatteryLow:
this->renderMsgBatteryLow();
break;
case screen::MsgEngineTempLow:
this->renderMsgEngineTempLow();
break;
case screen::MsgEngineTempHigh:
this->renderMsgEngineTempHigh();
break;
case screen::MsgConfigNoTracks:
this->renderMsgConfigNoTracks();
break;
default:
break;
case screen::MsgBatteryLow:
this->renderMsgBatteryLow();
break;
case screen::MsgEngineTempLow:
this->renderMsgEngineTempLow();
break;
case screen::MsgEngineTempHigh:
this->renderMsgEngineTempHigh();
break;
case screen::MsgLapCounterStart:
this->renderMsgLapCounterStart();
break;
case screen::MsgLapCounterLapTime:
this->renderMsgLapCounterLapTime();
break;
default:
break;
}
last_render_ = now;