2023-04-04 18:31:06 +02:00
|
|
|
#include "gui/common/NamedField.hpp"
|
2023-03-20 23:31:28 +01:00
|
|
|
#include "gui/containers/DriverViewField.hpp"
|
2023-03-21 18:37:50 +01:00
|
|
|
#include "gui/driverview_screen/DriverViewPresenter.hpp"
|
2023-03-18 22:51:13 +01:00
|
|
|
#include "texts/TextKeysAndLanguages.hpp"
|
2023-03-15 18:43:38 +01:00
|
|
|
#include <gui/driverview_screen/DriverViewView.hpp>
|
2023-03-21 18:37:50 +01:00
|
|
|
#include <stddef.h>
|
2023-03-15 18:43:38 +01:00
|
|
|
|
2023-03-20 23:31:28 +01:00
|
|
|
DriverViewView::DriverViewView()
|
|
|
|
: fieldTypes{DF_MinCellVolt, DF_Speed, DF_TSCurrent} {}
|
2023-03-15 18:43:38 +01:00
|
|
|
|
2023-03-18 22:51:13 +01:00
|
|
|
void DriverViewView::setupScreen() {
|
|
|
|
DriverViewViewBase::setupScreen();
|
2023-03-20 23:31:28 +01:00
|
|
|
for (size_t i = 0; i < NUM_FIELDS; i++) {
|
2023-03-21 18:37:50 +01:00
|
|
|
getField(i).setType(fieldTypes[i]);
|
2023-03-20 23:31:28 +01:00
|
|
|
}
|
|
|
|
fieldTypeSelection.setNumberOfItems(DataFieldType_COUNT);
|
2023-03-18 22:51:13 +01:00
|
|
|
}
|
2023-03-15 18:43:38 +01:00
|
|
|
|
|
|
|
void DriverViewView::tearDownScreen() { DriverViewViewBase::tearDownScreen(); }
|
|
|
|
|
2023-03-20 23:31:28 +01:00
|
|
|
void DriverViewView::fieldTypeSelectionUpdateItem(
|
|
|
|
DriverViewFieldSelection &item, int16_t itemIndex) {
|
|
|
|
item.setName(dataFieldDescs[itemIndex].title);
|
|
|
|
item.setSelected(itemIndex == selectedFieldType);
|
|
|
|
}
|
|
|
|
|
2023-03-21 18:37:50 +01:00
|
|
|
void DriverViewView::setFieldType(size_t i, DataFieldType type) {
|
|
|
|
getField(i).setType(type);
|
2023-03-20 19:35:30 +01:00
|
|
|
}
|
|
|
|
|
2023-03-21 18:37:50 +01:00
|
|
|
void DriverViewView::updateFieldValues() {
|
|
|
|
for (size_t i = 0; i < NUM_FIELDS; i++) {
|
|
|
|
getField(i).updateValue();
|
|
|
|
}
|
2023-03-20 19:35:30 +01:00
|
|
|
}
|
|
|
|
|
2023-03-15 18:43:38 +01:00
|
|
|
void DriverViewView::setTireTemps(const TireTemps &temps) {
|
|
|
|
tireTempFL.setTemp(temps.fl);
|
|
|
|
tireTempFR.setTemp(temps.fr);
|
|
|
|
tireTempRL.setTemp(temps.rl);
|
|
|
|
tireTempRR.setTemp(temps.rr);
|
|
|
|
}
|
2023-03-18 23:06:27 +01:00
|
|
|
|
|
|
|
void DriverViewView::setTSSoC(uint8_t soc) {
|
|
|
|
tsSoC.setValue(soc);
|
|
|
|
tsSoC.invalidate();
|
|
|
|
}
|
|
|
|
|
2023-03-21 19:05:54 +01:00
|
|
|
void DriverViewView::setPrecharge(bool active, float progress) {
|
|
|
|
if (active) {
|
|
|
|
prechargeLabel.setVisible(true);
|
|
|
|
prechargeLabel.invalidate();
|
|
|
|
prechargeProgress.setVisible(true);
|
|
|
|
prechargeProgress.setValue(progress);
|
|
|
|
prechargeProgress.invalidate();
|
|
|
|
} else if (prechargeLabel.isVisible() || prechargeProgress.isVisible()) {
|
|
|
|
prechargeLabel.setVisible(false);
|
|
|
|
prechargeLabel.invalidate();
|
|
|
|
prechargeProgress.setVisible(false);
|
|
|
|
prechargeProgress.invalidate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-20 23:31:28 +01:00
|
|
|
void DriverViewView::selectNextField() {
|
|
|
|
if (!fieldTypeSelection.isVisible()) {
|
|
|
|
fieldTypeSelection.setVisible(true);
|
2023-03-21 18:37:50 +01:00
|
|
|
fieldTypeSelection.invalidate();
|
2023-03-20 23:31:28 +01:00
|
|
|
updateSelectedField(0);
|
|
|
|
} else {
|
|
|
|
updateSelectedField((selectedField + 1) % NUM_FIELDS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DriverViewView::selectPrevField() {
|
|
|
|
if (!fieldTypeSelection.isVisible()) {
|
|
|
|
fieldTypeSelection.setVisible(true);
|
2023-03-21 18:37:50 +01:00
|
|
|
fieldTypeSelection.invalidate();
|
2023-03-20 23:31:28 +01:00
|
|
|
updateSelectedField(NUM_FIELDS - 1);
|
|
|
|
} else {
|
|
|
|
if (selectedField == 0) {
|
|
|
|
updateSelectedField(NUM_FIELDS - 1);
|
|
|
|
} else {
|
|
|
|
updateSelectedField(selectedField - 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DriverViewView::selectNextFieldType() {
|
|
|
|
if (!fieldTypeSelection.isVisible()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
updateSelectedFieldType((selectedFieldType + 1) % DataFieldType_COUNT);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DriverViewView::selectPrevFieldType() {
|
|
|
|
if (!fieldTypeSelection.isVisible()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (selectedFieldType == 0) {
|
|
|
|
updateSelectedFieldType(DataFieldType_COUNT - 1);
|
|
|
|
} else {
|
|
|
|
updateSelectedFieldType(selectedFieldType - 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DriverViewView::confirmFieldType() {
|
|
|
|
if (!fieldTypeSelection.isVisible()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
DriverViewField &field = getField(selectedField);
|
2023-03-21 18:37:50 +01:00
|
|
|
presenter->setFieldType(selectedField,
|
|
|
|
static_cast<DataFieldType>(selectedFieldType));
|
2023-03-20 23:31:28 +01:00
|
|
|
field.setSelected(false);
|
2023-03-20 23:46:19 +01:00
|
|
|
fieldTypes[selectedField] = static_cast<DataFieldType>(selectedFieldType);
|
2023-03-20 23:31:28 +01:00
|
|
|
fieldTypeSelection.setVisible(false);
|
2023-03-21 18:37:50 +01:00
|
|
|
fieldTypeSelection.invalidate();
|
2023-03-20 23:31:28 +01:00
|
|
|
}
|
|
|
|
|
2023-03-20 19:35:30 +01:00
|
|
|
DriverViewField &DriverViewView::getField(size_t i) {
|
|
|
|
switch (i) {
|
|
|
|
case 0:
|
|
|
|
return field1;
|
|
|
|
case 1:
|
|
|
|
return field2;
|
|
|
|
default:
|
|
|
|
return field3;
|
|
|
|
}
|
2023-03-18 23:06:27 +01:00
|
|
|
}
|
2023-03-20 23:31:28 +01:00
|
|
|
|
|
|
|
void DriverViewView::updateSelectedField(size_t selected) {
|
|
|
|
getField(selectedField).setSelected(false);
|
|
|
|
DriverViewField &field = getField(selected);
|
|
|
|
field.setSelected(true);
|
|
|
|
fieldTypeSelection.moveTo(field.getX(), fieldTypeSelection.getY());
|
|
|
|
fieldTypeSelection.invalidate();
|
|
|
|
selectedField = selected;
|
|
|
|
|
2023-04-12 16:04:20 +02:00
|
|
|
updateSelectedFieldType(fieldTypes[selectedField], false);
|
2023-03-20 23:31:28 +01:00
|
|
|
}
|
|
|
|
|
2023-04-12 16:04:20 +02:00
|
|
|
void DriverViewView::updateSelectedFieldType(size_t selected, bool animate) {
|
2023-03-20 23:31:28 +01:00
|
|
|
size_t previousSelected = selectedFieldType;
|
|
|
|
selectedFieldType = selected;
|
|
|
|
// Trigger update of the background
|
|
|
|
fieldTypeSelection.itemChanged(previousSelected);
|
|
|
|
fieldTypeSelection.itemChanged(selectedFieldType);
|
|
|
|
|
2023-04-12 16:04:20 +02:00
|
|
|
int16_t steps = animate ? 2 : 0;
|
|
|
|
if (selectedFieldType == 0) {
|
|
|
|
// Just animating to 0 looks very broken when scrolling forwards. Animating
|
|
|
|
// to DataFieldType_COUNT looks good in both directions.
|
|
|
|
fieldTypeSelection.animateToItem(DataFieldType_COUNT, steps);
|
|
|
|
} else {
|
|
|
|
fieldTypeSelection.animateToItem(selectedFieldType, steps);
|
|
|
|
}
|
2023-03-20 23:31:28 +01:00
|
|
|
}
|