#include #include "gui/containers/DriverViewStatusItem.hpp" #include "gui_generated/ami_screen/AMIViewBase.hpp" #include "stw_defines.h" #include "texts/TextKeysAndLanguages.hpp" #include "touchgfx/Color.hpp" #include "touchgfx/TypedText.hpp" #include "touchgfx/Unicode.hpp" #include "touchgfx/widgets/TextAreaWithWildcard.hpp" #include "vehicle_state.h" AMIDataField::AMIDataField(touchgfx::TextAreaWithOneWildcard &textArea, const char *fmt) : fmt(fmt), textArea(textArea) {} void AMIDataField::setValue(float value) { Unicode::snprintfFloat(buffer, sizeof(buffer) / sizeof(*buffer), fmt, value); textArea.setWildcard(buffer); textArea.invalidate(); } AMIView::AMIView() : AMIViewBase(), paField(pressA, "%5.1f"), pbField(pressB, "%5.1f"), pfField(pressFront, "%5.1f"), prField(pressRear, "%5.1f"), desiredAngleField(desiredAngle, "%5.2f"), measuredAngleField(measuredAngle, "%5.2f"), desiredSpeedField(desiredSpeed, "%5.1f"), measuredSpeedField(measuredSpeed, "%5.1f") {} void AMIView::setupScreen() { AMIViewBase::setupScreen(); } void AMIView::tearDownScreen() { AMIViewBase::tearDownScreen(); } void AMIView::setMission(Mission mission) { switch (mission) { case MISSION_ACCEL: currentMission.setTypedText(TypedText(T_ACCEL_HUGE)); break; case MISSION_SKIDPAD: currentMission.setTypedText(TypedText(T_SKIDPAD_HUGE)); break; case MISSION_AUTOX: currentMission.setTypedText(TypedText(T_AUTOX_HUGE)); break; case MISSION_TRACKDRIVE: currentMission.setTypedText(TypedText(T_TRACKDRIVE_HUGE)); break; case MISSION_EBS: currentMission.setTypedText(TypedText(T_EBS_HUGE)); break; case MISSION_INSPECTION: currentMission.setTypedText(TypedText(T_INSPECTION_HUGE)); break; case MISSION_MANUAL: case MISSION_NONE: default: currentMission.setTypedText(TypedText(T_INVALID_HUGE)); break; } currentMission.invalidate(); } void AMIView::setASState(ASState state) { if (state == AS_READY || state == AS_DRIVING) { init.setVisible(false); driving.setVisible(true); } else { init.setVisible(true); driving.setVisible(false); } init.invalidate(); driving.invalidate(); } void AMIView::setIniChkState(IniChkState state) { if (state == INICHK_ERROR) { progressBar.setColor(DriverViewStatusItem::COLOR_ERROR); progressBar.setValue(100); } else { if (state == INICHK_WAIT_TS) { progressBar.setColor(DriverViewStatusItem::COLOR_TS); } else { progressBar.setColor(DriverViewStatusItem::COLOR_OK); } float prog = ((float)vehicle_state.ini_chk_state) / INICHK_DONE; progressBar.setValue(prog * 100); } progressBar.invalidate(); const char *label = "UNKNOWN"; switch (vehicle_state.ini_chk_state) { case INICHK_START: label = "START"; break; case INICHK_WD_CHECK: label = "WD CHK"; break; case INICHK_WD_OK: label = "WD OK"; break; case INICHK_ASB_CHECK_1: label = "ASB CHK 1"; break; case INICHK_ASB_CHECK_2: label = "ASB CHK 2"; break; case INICHK_WAIT_TS: label = "WAIT TS"; break; case INICHK_EBS_CHECK_A: label = "EBS CHK A"; break; case INICHK_EBS_CHECK_B: label = "EBS CHK B"; break; case INICHK_DONE: label = "DONE"; break; case INICHK_ERROR: label = "ERROR"; break; } touchgfx::Unicode::strncpy(progressBuffer, label, sizeof(progressBuffer) / sizeof(*progressBuffer)); progressLabel.setWildcard(progressBuffer); progressLabel.invalidate(); } void AMIView::updateDataFields() { paField.setValue(vehicle_state.hyd_press_a); pbField.setValue(vehicle_state.hyd_press_b); pfField.setValue(vehicle_state.brake_press_f); prField.setValue(vehicle_state.brake_press_r); desiredAngleField.setValue(vehicle_state.desired_angle); measuredAngleField.setValue(vehicle_state.measured_angle); desiredSpeedField.setValue(vehicle_state.desired_speed); measuredSpeedField.setValue(vehicle_state.speed); } void AMIView::setJetsonTimeout(bool timeout) { if (timeout) { desiredAngle.setColor(touchgfx::Color::getColorFromRGB(0xFF, 0, 0)); } else { desiredAngle.setColor(touchgfx::Color::getColorFromRGB(0xFF, 0xFF, 0xFF)); } } void AMIView::setEPSCTimeout(bool timeout) { if (timeout) { measuredAngle.setColor(touchgfx::Color::getColorFromRGB(0xFF, 0, 0)); } else { measuredAngle.setColor(touchgfx::Color::getColorFromRGB(0xFF, 0xFF, 0xFF)); } } void AMIView::setConePositions(ConePosition *cone_positions, size_t count) { for (size_t i = 0; i < count; i++) { cones[i].setX(cone_positions[i].x); cones[i].setY(cone_positions[i].y); cones[i].setVisible(true); cones[i].invalidate(); } for (size_t i = count; i < NUM_CONES; i++) { cones[i].setVisible(false); cones[i].invalidate(); } }