Display steering angle, speed & cones in AMI
This commit is contained in:
		@ -2,9 +2,25 @@
 | 
			
		||||
#define AMIVIEW_HPP
 | 
			
		||||
 | 
			
		||||
#include "stw_defines.h"
 | 
			
		||||
#include "touchgfx/Unicode.hpp"
 | 
			
		||||
#include "touchgfx/widgets/TextArea.hpp"
 | 
			
		||||
#include "touchgfx/widgets/TextAreaWithWildcard.hpp"
 | 
			
		||||
#include "vehicle_state.h"
 | 
			
		||||
#include <gui/ami_screen/AMIPresenter.hpp>
 | 
			
		||||
#include <gui_generated/ami_screen/AMIViewBase.hpp>
 | 
			
		||||
 | 
			
		||||
class AMIDataField {
 | 
			
		||||
public:
 | 
			
		||||
  AMIDataField(touchgfx::TextAreaWithOneWildcard &textArea, const char *fmt);
 | 
			
		||||
 | 
			
		||||
  void setValue(float value);
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
  const char *fmt;
 | 
			
		||||
 | 
			
		||||
  touchgfx::TextAreaWithOneWildcard &textArea;
 | 
			
		||||
  touchgfx::Unicode::UnicodeChar buffer[16];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class AMIView : public AMIViewBase {
 | 
			
		||||
public:
 | 
			
		||||
@ -15,7 +31,20 @@ public:
 | 
			
		||||
 | 
			
		||||
  void setMission(Mission mission);
 | 
			
		||||
 | 
			
		||||
  void updateDataFields();
 | 
			
		||||
  void setJetsonTimeout(bool timeout);
 | 
			
		||||
  void setEPSCTimeout(bool timeout);
 | 
			
		||||
 | 
			
		||||
  void setConePositions(ConePosition *positions, size_t count);
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
  AMIDataField desiredAngleField;
 | 
			
		||||
  AMIDataField measuredAngleField;
 | 
			
		||||
  AMIDataField desiredSpeedField;
 | 
			
		||||
  AMIDataField measuredSpeedField;
 | 
			
		||||
 | 
			
		||||
  touchgfx::Shape<3> cones[NUM_CONES] = {cone0, cone1, cone2, cone3, cone4,
 | 
			
		||||
                                         cone5, cone6, cone7, cone8, cone9};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // AMIVIEW_HPP
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,7 @@
 | 
			
		||||
#include <gui/ami_screen/AMIPresenter.hpp>
 | 
			
		||||
#include <gui/ami_screen/AMIView.hpp>
 | 
			
		||||
 | 
			
		||||
#include "stm32h7xx_hal.h"
 | 
			
		||||
#include "vehicle_state.h"
 | 
			
		||||
 | 
			
		||||
AMIPresenter::AMIPresenter(AMIView &v) : view(v) {}
 | 
			
		||||
@ -11,4 +12,19 @@ void AMIPresenter::deactivate() {}
 | 
			
		||||
 | 
			
		||||
void AMIPresenter::vehicleStateUpdated() {
 | 
			
		||||
  view.setMission(vehicle_state.active_mission);
 | 
			
		||||
  view.updateDataFields();
 | 
			
		||||
#ifndef SIMULATOR
 | 
			
		||||
  view.setJetsonTimeout(HAL_GetTick() - vehicle_state.last_jetson_msg > 500);
 | 
			
		||||
  view.setEPSCTimeout(HAL_GetTick() - vehicle_state.last_epsc_msg > 500);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  size_t cone_count = 0;
 | 
			
		||||
  for (; cone_count < NUM_CONES; cone_count++) {
 | 
			
		||||
    // A cone position of 0xFF/0xFF indicates that there are no more cones
 | 
			
		||||
    if (vehicle_state.cone_pos[cone_count].x == 0xFF &&
 | 
			
		||||
        vehicle_state.cone_pos[cone_count].y == 0xFF) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  view.setConePositions(vehicle_state.cone_pos, cone_count);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,10 +1,28 @@
 | 
			
		||||
#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"
 | 
			
		||||
#include <gui/ami_screen/AMIView.hpp>
 | 
			
		||||
 | 
			
		||||
AMIView::AMIView() {}
 | 
			
		||||
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(), desiredAngleField(desiredAngle, "%5.2f"),
 | 
			
		||||
      measuredAngleField(measuredAngle, "%5.2f"),
 | 
			
		||||
      desiredSpeedField(desiredSpeed, "%5.1f"),
 | 
			
		||||
      measuredSpeedField(measuredSpeed, "%5.1f") {}
 | 
			
		||||
 | 
			
		||||
void AMIView::setupScreen() { AMIViewBase::setupScreen(); }
 | 
			
		||||
 | 
			
		||||
@ -34,8 +52,43 @@ void AMIView::setMission(Mission mission) {
 | 
			
		||||
  case MISSION_NONE:
 | 
			
		||||
  default:
 | 
			
		||||
    currentMission.setTypedText(TypedText(T_INVALID_HUGE));
 | 
			
		||||
    currentMission.setColor(touchgfx::Color::getColorFromRGB(0xFF, 0, 0));
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  currentMission.invalidate();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AMIView::updateDataFields() {
 | 
			
		||||
  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();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user