122 lines
3.6 KiB
C++

#include "touchgfx/Color.hpp"
#include "touchgfx/Unicode.hpp"
#include "vehicle_state.h"
#include <climits>
#include <cmath>
#include <gui/endurance_screen/EnduranceView.hpp>
EnduranceView::EnduranceView()
: lastLapDelta(lastLapBox, lastLapBat),
overallDelta(overallBox, overallBat), plimBuffer(powerLimit, 2, 0),
slimBuffer(speedLimit, 2, 0), socBuffer(soc, 3, 0),
tbatBuffer(batTemp, 2, 1) {}
void EnduranceView::setupScreen() {
EnduranceViewBase::setupScreen();
lastLapDelta.setField(lastLapBat);
lastLapDelta.setBox(lastLapBox);
overallDelta.setField(overallBat);
overallDelta.setBox(overallBox);
plimBuffer.setField(powerLimit);
slimBuffer.setField(speedLimit);
socBuffer.setField(soc);
tbatBuffer.setField(batTemp);
}
void EnduranceView::tearDownScreen() { EnduranceViewBase::tearDownScreen(); }
void EnduranceView::updateBatDelta() {
lastLapDelta.setDelta(vehicle_state.bat_delta_last);
overallDelta.setDelta(vehicle_state.bat_delta_overall);
}
void EnduranceView::updateDetails() {
plimBuffer.setIntValue(vehicle_state.power_limit);
slimBuffer.setIntValue(vehicle_state.speed_limit);
socBuffer.setIntValue(vehicle_state.soc_ts);
tbatBuffer.setFloatValue(vehicle_state.max_cell_temp);
}
void EnduranceView::updateProgress() { progressBar.update(); }
BatDelta::BatDelta(touchgfx::BoxWithBorder &box,
touchgfx::TextAreaWithOneWildcard &field)
: box(box), field(field), value(INT_MIN) {}
void BatDelta::setField(touchgfx::TextAreaWithOneWildcard &field) {
this->field = field;
}
void BatDelta::setBox(touchgfx::BoxWithBorder &box) { this->box = box; }
void BatDelta::setDelta(float delta) {
int deltaRounded = std::round(delta);
if (deltaRounded == value) {
return;
}
value = deltaRounded;
touchgfx::Unicode::snprintf(buffer, sizeof(buffer) / sizeof(*buffer), "%+3d",
value);
field.setWildcard(buffer);
field.invalidate();
if (value > 10) {
box.setColor(touchgfx::Color::getColorFromRGB(0xa8, 0x08, 0x08));
} else if (value > 5) {
box.setColor(touchgfx::Color::getColorFromRGB(0xc7, 0x71, 0x08));
} else if (value > 0) {
box.setColor(touchgfx::Color::getColorFromRGB(0xdb, 0xb2, 0x0b));
} else if (value > -5) {
box.setColor(touchgfx::Color::getColorFromRGB(0x80, 0xba, 0x14));
} else if (value > -10) {
box.setColor(touchgfx::Color::getColorFromRGB(0x09, 0x96, 0x3b));
} else {
box.setColor(touchgfx::Color::getColorFromRGB(0x05, 0x77, 0xa8));
}
box.invalidate();
}
ValueBuffer::ValueBuffer(touchgfx::TextAreaWithOneWildcard &field,
size_t intDigits, size_t decimalDigits)
: field(field), intDigits(intDigits), decimalDigits(decimalDigits) {
value.f = NAN;
}
void ValueBuffer::setField(touchgfx::TextAreaWithOneWildcard &field) {
this->field = field;
}
void ValueBuffer::setIntValue(int value) {
if (value == this->value.i) {
return;
}
this->value.i = value;
touchgfx::Unicode::snprintf(buffer, sizeof(buffer) / sizeof(*buffer), "%*d",
static_cast<int>(intDigits), value);
field.setWildcard(buffer);
field.invalidate();
}
void ValueBuffer::setFloatValue(float value) {
if (value == this->value.f) {
return;
}
this->value.f = value;
size_t width = intDigits;
if (decimalDigits > 0) {
width += 1 + decimalDigits; // 1 for the decimal point
}
float params[3] = {static_cast<float>(width),
static_cast<float>(decimalDigits), value};
touchgfx::Unicode::snprintfFloats(buffer, sizeof(buffer) / sizeof(*buffer),
"%*.*f", params);
field.setWildcard(buffer);
field.invalidate();
}