Add screen for configuring vehicle parameters
This commit is contained in:
@ -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();
|
||||
|
||||
|
||||
23
TouchGFX/gui/include/gui/containers/ConfigItem.hpp
Normal file
23
TouchGFX/gui/include/gui/containers/ConfigItem.hpp
Normal 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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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 *)¶ms.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>;
|
||||
|
||||
38
TouchGFX/gui/src/containers/ConfigItem.cpp
Normal file
38
TouchGFX/gui/src/containers/ConfigItem.cpp
Normal 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();
|
||||
}
|
||||
@ -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()
|
||||
{
|
||||
|
||||
}
|
||||
97
TouchGFX/gui/src/vehicleconfig_screen/VehicleConfigView.cpp
Normal file
97
TouchGFX/gui/src/vehicleconfig_screen/VehicleConfigView.cpp
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user