Add screen for configuring vehicle parameters

This commit is contained in:
2023-04-04 20:58:34 +02:00
parent 09f65fcf22
commit a5f10be4fd
35 changed files with 1976 additions and 104 deletions

View File

@ -1,6 +1,7 @@
#include "gui/common/NamedField.hpp"
#include "texts/TextKeysAndLanguages.hpp"
#include "params.h"
#include "touchgfx/Unicode.hpp"
#include "vehicle.h"
@ -275,6 +276,24 @@ static_assert(sizeof(dataFieldDescs) / sizeof(dataFieldDescs[0]) ==
DataFieldType_COUNT,
"Incorrect number of data field descriptions");
#define PARAM_FIELD(FIELD) []() { return (void *)&params.FIELD; }
NamedFieldDescription paramFieldDescs[] = {
[PF_BBAL] = {NamedFieldKind::Float, "BBAL", 2, 1, PARAM_FIELD(bbal)},
[PF_TC1] = {NamedFieldKind::Int, "TC1", 2, 0, PARAM_FIELD(tc1)},
[PF_TC2] = {NamedFieldKind::Int, "TC2", 2, 0, PARAM_FIELD(tc2)},
[PF_TORQUEMAP] = {NamedFieldKind::Int, "MAP", 2, 0,
PARAM_FIELD(torque_map)},
[PF_TEST1] = {NamedFieldKind::Int, "TEST1", 2, 0, PARAM_FIELD(test[0])},
[PF_TEST2] = {NamedFieldKind::Int, "TEST2", 2, 0, PARAM_FIELD(test[1])},
[PF_TEST3] = {NamedFieldKind::Int, "TEST3", 2, 0, PARAM_FIELD(test[2])},
[PF_TEST4] = {NamedFieldKind::Int, "TEST4", 2, 0, PARAM_FIELD(test[3])},
};
static_assert(sizeof(paramFieldDescs) / sizeof(paramFieldDescs[0]) ==
ParamFieldType_COUNT,
"Incorrect number of param field descriptions");
template <class T>
NamedField<T>::NamedField(const NamedFieldDescription *fieldDescs)
: fieldDescs{fieldDescs} {}
@ -291,6 +310,8 @@ template <class T> void NamedField<T>::setType(T type) {
updateValue();
}
template <class T> const T &NamedField<T>::getType() { return type; }
template <class T> void NamedField<T>::updateValue() {
void *val = desc->getValue();
switch (desc->kind) {
@ -362,3 +383,4 @@ template <class T> void NamedField<T>::updateValueBuffer() {
}
template class NamedField<DataFieldType>;
template class NamedField<ParamFieldType>;

View File

@ -0,0 +1,38 @@
#include <gui/containers/ConfigItem.hpp>
#include "texts/TextKeysAndLanguages.hpp"
#include "touchgfx/Color.hpp"
ConfigItem::ConfigItem() : NamedField(paramFieldDescs) {}
void ConfigItem::initialize() { ConfigItemBase::initialize(); }
void ConfigItem::setSelected(int selected) {
uint8_t v = selected ? 0x44 : 0x00;
bg.setColor(touchgfx::Color::getColorFromRGB(v, v, v));
bg.invalidate();
}
void ConfigItem::typeUpdated() {
switch (desc->kind) {
case NamedFieldKind::Float:
case NamedFieldKind::Int:
value.setTypedText(T_NUMBERWILDCARD);
break;
case NamedFieldKind::Bool:
case NamedFieldKind::Text:
value.setTypedText(T_DEFAULTWILDCARD_CENTERED);
break;
}
value.invalidate();
}
void ConfigItem::titleBufferUpdated() {
title.setWildcard(titleBuffer);
title.invalidate();
}
void ConfigItem::valueBufferUpdated() {
value.setWildcard(valueBuffer);
value.invalidate();
}

View File

@ -0,0 +1,18 @@
#include <gui/vehicleconfig_screen/VehicleConfigView.hpp>
#include <gui/vehicleconfig_screen/VehicleConfigPresenter.hpp>
VehicleConfigPresenter::VehicleConfigPresenter(VehicleConfigView& v)
: view(v)
{
}
void VehicleConfigPresenter::activate()
{
}
void VehicleConfigPresenter::deactivate()
{
}

View File

@ -0,0 +1,97 @@
#include "gui/common/NamedField.hpp"
#include "gui/containers/ConfigItem.hpp"
#include "main.h"
#include <cstdint>
#include <gui/vehicleconfig_screen/VehicleConfigView.hpp>
VehicleConfigView::VehicleConfigView() : selectedParam{0} {}
void VehicleConfigView::setupScreen() {
VehicleConfigViewBase::setupScreen();
params.setNumberOfItems(ParamFieldType_COUNT);
}
void VehicleConfigView::tearDownScreen() {
VehicleConfigViewBase::tearDownScreen();
}
void VehicleConfigView::paramsUpdateItem(ConfigItem &item, int16_t itemIndex) {
item.setType(static_cast<ParamFieldType>(itemIndex));
item.setSelected(itemIndex == selectedParam);
}
void VehicleConfigView::selectPrevParam() {
if (selectedParam == 0) {
updateSelectedParam(ParamFieldType_COUNT - 1);
} else {
updateSelectedParam(selectedParam - 1);
}
}
void VehicleConfigView::selectNextParam() {
updateSelectedParam((selectedParam + 1) % ParamFieldType_COUNT);
}
void VehicleConfigView::decParam() {
// TODO: How to handle this for different parameter types?
}
void VehicleConfigView::incParam() {
// TODO: How to handle this for different parameter types?
}
void VehicleConfigView::confirmParam() {
// TODO: How to handle this for different parameter types?
}
void VehicleConfigView::updateSelectedParam(int select) {
int previousSelected = selectedParam;
selectedParam = select;
params.itemChanged(previousSelected);
params.itemChanged(selectedParam);
ConfigItem *firstItem = nullptr;
int16_t firstY = INT16_MAX;
ConfigItem *lastItem = nullptr;
int16_t lastY = INT16_MIN;
for (int16_t i = 0; i < paramsListItems.getNumberOfDrawables(); ++i) {
ConfigItem *item =
static_cast<ConfigItem *>(paramsListItems.getDrawable(i));
int16_t y = item->getY();
if (y + item->getHeight() > params.getHeight() || y < 0) {
continue;
}
if (y < firstY) {
firstY = y;
firstItem = item;
}
if (y > lastY) {
lastY = y;
lastItem = item;
}
}
int16_t firstVisible = firstItem->getType();
int16_t lastVisible = lastItem->getType();
if (lastVisible < firstVisible) {
Error_Handler();
}
int16_t numVisible = lastVisible - firstVisible + 1;
if (selectedParam >= firstVisible && selectedParam <= lastVisible) {
return;
}
int16_t firstWanted;
if (selectedParam == 0 && previousSelected == ParamFieldType_COUNT - 1) {
firstWanted = 0;
} else if (selectedParam > previousSelected) {
firstWanted = selectedParam - numVisible + 1;
} else {
firstWanted = selectedParam;
}
if (firstWanted < 0) {
firstWanted = 0;
} else if (firstWanted > ParamFieldType_COUNT - 1) {
firstWanted = ParamFieldType_COUNT - 1;
}
params.animateToItem(firstWanted, 0);
}