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

@ -19,6 +19,8 @@ public:
void setValue(const char *str);
void setValue(int boolValue);
void setSelected(int selected);
protected:
private:
Unicode::UnicodeChar valueBuffer[16];

View File

@ -0,0 +1,20 @@
#ifndef DRIVERVIEWFIELDSELECTION_HPP
#define DRIVERVIEWFIELDSELECTION_HPP
#include "touchgfx/TypedText.hpp"
#include <gui_generated/containers/DriverViewFieldSelectionBase.hpp>
class DriverViewFieldSelection : public DriverViewFieldSelectionBase {
public:
DriverViewFieldSelection();
virtual ~DriverViewFieldSelection() {}
virtual void initialize();
void setName(const touchgfx::TypedText &name);
void setSelected(int selected);
protected:
};
#endif // DRIVERVIEWFIELDSELECTION_HPP

View File

@ -2,6 +2,8 @@
#define DRIVERVIEWVIEW_HPP
#include "gui/common/DataField.hpp"
#include "gui/containers/DriverViewFieldSelection.hpp"
#include "touchgfx/containers/scrollers/DrawableList.hpp"
#include "vehicle.h"
#include <gui/driverview_screen/DriverViewPresenter.hpp>
#include <gui_generated/driverview_screen/DriverViewViewBase.hpp>
@ -13,6 +15,9 @@ public:
virtual void setupScreen();
virtual void tearDownScreen();
void fieldTypeSelectionUpdateItem(DriverViewFieldSelection &item,
int16_t itemIndex) override;
void setFieldType(size_t i, const DataFieldDescription &desc);
void setFieldValue(size_t i, float value);
void setFieldValue(size_t i, const char *value);
@ -21,9 +26,25 @@ public:
void setTireTemps(const TireTemps &temps);
void setTSSoC(uint8_t soc);
void selectPrevField() override;
void selectNextField() override;
void selectPrevFieldType() override;
void selectNextFieldType() override;
void confirmFieldType() override;
static constexpr size_t NUM_FIELDS = 3;
protected:
private:
DriverViewField &getField(size_t i);
DriverViewFieldSelection *getFieldType(size_t i);
void updateSelectedField(size_t select);
void updateSelectedFieldType(size_t select);
size_t selectedField;
size_t selectedFieldType;
DataFieldType fieldTypes[NUM_FIELDS];
};
#endif // DRIVERVIEWVIEW_HPP

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);
}