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

@ -20,6 +20,8 @@ CountedEnum(DataFieldType, size_t, DF_TSState, DF_ASState, DF_ActiveMission,
DF_TireTempRL, DF_TireTempRR, DF_MinCellVolt, DF_MaxCellTemp,
DF_TSSoC, DF_LVSoC, DF_TSCurrent, DF_TSVoltageBat, DF_TSVoltageVeh,
DF_Speed, DF_BBal);
CountedEnum(ParamFieldType, size_t, PF_BBAL, PF_TC1, PF_TC2, PF_TORQUEMAP,
PF_TEST1, PF_TEST2, PF_TEST3, PF_TEST4);
enum class NamedFieldKind { Float, Bool, Text, Int };
@ -33,6 +35,7 @@ struct NamedFieldDescription {
};
extern NamedFieldDescription dataFieldDescs[];
extern NamedFieldDescription paramFieldDescs[];
template <class T> class NamedField {
public:
@ -40,7 +43,7 @@ public:
virtual ~NamedField() {}
void setType(T type);
T getType();
const T &getType();
virtual void updateValue();

View File

@ -0,0 +1,23 @@
#ifndef CONFIGITEM_HPP
#define CONFIGITEM_HPP
#include "gui/common/NamedField.hpp"
#include <gui_generated/containers/ConfigItemBase.hpp>
class ConfigItem : public ConfigItemBase, public NamedField<ParamFieldType> {
public:
ConfigItem();
virtual ~ConfigItem() {}
virtual void initialize() override;
void setSelected(int selected);
protected:
private:
virtual void typeUpdated() override;
virtual void titleBufferUpdated() override;
virtual void valueBufferUpdated() override;
};
#endif // CONFIGITEM_HPP

View File

@ -0,0 +1,36 @@
#ifndef VEHICLECONFIGPRESENTER_HPP
#define VEHICLECONFIGPRESENTER_HPP
#include <gui/model/ModelListener.hpp>
#include <mvp/Presenter.hpp>
using namespace touchgfx;
class VehicleConfigView;
class VehicleConfigPresenter : public touchgfx::Presenter, public ModelListener
{
public:
VehicleConfigPresenter(VehicleConfigView& v);
/**
* The activate function is called automatically when this screen is "switched in"
* (ie. made active). Initialization logic can be placed here.
*/
virtual void activate();
/**
* The deactivate function is called automatically when this screen is "switched out"
* (ie. made inactive). Teardown functionality can be placed here.
*/
virtual void deactivate();
virtual ~VehicleConfigPresenter() {};
private:
VehicleConfigPresenter();
VehicleConfigView& view;
};
#endif // VEHICLECONFIGPRESENTER_HPP

View File

@ -0,0 +1,29 @@
#ifndef VEHICLECONFIGVIEW_HPP
#define VEHICLECONFIGVIEW_HPP
#include <gui/vehicleconfig_screen/VehicleConfigPresenter.hpp>
#include <gui_generated/vehicleconfig_screen/VehicleConfigViewBase.hpp>
class VehicleConfigView : public VehicleConfigViewBase {
public:
VehicleConfigView();
virtual ~VehicleConfigView() {}
virtual void setupScreen() override;
virtual void tearDownScreen() override;
void paramsUpdateItem(ConfigItem &item, int16_t itemIndex) override;
void selectPrevParam() override;
void selectNextParam() override;
void decParam() override;
void incParam() override;
void confirmParam() override;
protected:
private:
int selectedParam;
void updateSelectedParam(int select);
};
#endif // VEHICLECONFIGVIEW_HPP

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