Allow changing displayed fields in DriverView

This commit is contained in:
2023-03-20 23:31:28 +01:00
parent c8ee51a78f
commit 0d7cc03e02
28 changed files with 603 additions and 68 deletions

View File

@ -1,5 +1,6 @@
#include "gui/common/DataField.hpp"
#include "texts/TextKeysAndLanguages.hpp"
#include "touchgfx/Color.hpp"
#include "touchgfx/Unicode.hpp"
#include <gui/containers/DriverViewField.hpp>
@ -43,6 +44,12 @@ void DriverViewField::setValue(int boolValue) {
updateValueBuffer();
}
void DriverViewField::setSelected(int selected) {
uint8_t v = selected ? 0x44 : 0x00;
box.setColor(touchgfx::Color::getColorFromRGB(v, v, v));
box.invalidate();
}
void DriverViewField::updateValueBuffer() {
switch (fieldKind) {
case DataFieldKind::Numeric: {

View File

@ -0,0 +1,17 @@
#include "touchgfx/Color.hpp"
#include <gui/containers/DriverViewFieldSelection.hpp>
DriverViewFieldSelection::DriverViewFieldSelection() {}
void DriverViewFieldSelection::initialize() {
DriverViewFieldSelectionBase::initialize();
}
void DriverViewFieldSelection::setName(const touchgfx::TypedText &name) {
this->name.setTypedText(name);
}
void DriverViewFieldSelection::setSelected(int selected) {
int val = selected ? 0x66 : 0x22;
bg.setColor(touchgfx::Color::getColorFromRGB(val, val, val));
}

View File

@ -21,17 +21,17 @@ void DriverViewPresenter::vehicleStateUpdated() {
for (size_t i = 0; i < 3; i++) {
DataFieldType field = fields[i];
void *val = dataFieldDescs[field].getValue();
switch (dataFieldDescs[field].kind) {
case DataFieldKind::Numeric:
view.setFieldValue(i, *((float *)val));
break;
case DataFieldKind::Bool:
view.setFieldValue(i, *((int *)val));
break;
case DataFieldKind::Text:
view.setFieldValue(i, (const char *)val);
break;
}
// void *val = dataFieldDescs[field].getValue();
// switch (dataFieldDescs[field].kind) {
// case DataFieldKind::Numeric:
// view.setFieldValue(i, *((float *)val));
// break;
// case DataFieldKind::Bool:
// view.setFieldValue(i, *((int *)val));
// break;
// case DataFieldKind::Text:
// view.setFieldValue(i, (const char *)val);
// break;
// }
}
}

View File

@ -1,18 +1,27 @@
#include "gui/common/DataField.hpp"
#include "gui/containers/DriverViewField.hpp"
#include "texts/TextKeysAndLanguages.hpp"
#include <gui/driverview_screen/DriverViewView.hpp>
DriverViewView::DriverViewView() {}
DriverViewView::DriverViewView()
: fieldTypes{DF_MinCellVolt, DF_Speed, DF_TSCurrent} {}
void DriverViewView::setupScreen() {
DriverViewViewBase::setupScreen();
field1.setType(dataFieldDescs[DF_MinCellVolt]);
field2.setType(dataFieldDescs[DF_Speed]);
field3.setType(dataFieldDescs[DF_TSCurrent]);
for (size_t i = 0; i < NUM_FIELDS; i++) {
getField(i).setType(dataFieldDescs[fieldTypes[i]]);
}
fieldTypeSelection.setNumberOfItems(DataFieldType_COUNT);
}
void DriverViewView::tearDownScreen() { DriverViewViewBase::tearDownScreen(); }
void DriverViewView::fieldTypeSelectionUpdateItem(
DriverViewFieldSelection &item, int16_t itemIndex) {
item.setName(dataFieldDescs[itemIndex].title);
item.setSelected(itemIndex == selectedFieldType);
}
void DriverViewView::setFieldType(size_t i, const DataFieldDescription &desc) {
getField(i).setType(desc);
}
@ -41,6 +50,59 @@ void DriverViewView::setTSSoC(uint8_t soc) {
tsSoC.invalidate();
}
void DriverViewView::selectNextField() {
if (!fieldTypeSelection.isVisible()) {
fieldTypeSelection.setVisible(true);
updateSelectedField(0);
} else {
updateSelectedField((selectedField + 1) % NUM_FIELDS);
}
}
void DriverViewView::selectPrevField() {
if (!fieldTypeSelection.isVisible()) {
fieldTypeSelection.setVisible(true);
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);
field.setType(dataFieldDescs[selectedFieldType]);
field.setSelected(false);
fieldTypeSelection.setVisible(false);
}
DriverViewField &DriverViewView::getField(size_t i) {
switch (i) {
case 0:
@ -51,3 +113,29 @@ DriverViewField &DriverViewView::getField(size_t i) {
return field3;
}
}
DriverViewFieldSelection *DriverViewView::getFieldType(size_t i) {
return static_cast<DriverViewFieldSelection *>(
fieldTypeSelectionListItems.getDrawable(i));
}
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;
updateSelectedFieldType(fieldTypes[selectedField]);
}
void DriverViewView::updateSelectedFieldType(size_t selected) {
size_t previousSelected = selectedFieldType;
selectedFieldType = selected;
// Trigger update of the background
fieldTypeSelection.itemChanged(previousSelected);
fieldTypeSelection.itemChanged(selectedFieldType);
fieldTypeSelection.animateToItem(selectedFieldType, 0);
}