Much refactoring, wow.
Mostly the state/control situation
This commit is contained in:
parent
8b5e23cecb
commit
1ca611e504
Binary file not shown.
@ -2,6 +2,6 @@
|
|||||||
|
|
||||||
REM It is a nuisance to keep the filter up-to-date with whatever is printed
|
REM It is a nuisance to keep the filter up-to-date with whatever is printed
|
||||||
REM in the actual source, but the space savings are worth it.
|
REM in the actual source, but the space savings are worth it.
|
||||||
AdafruitGFXFontTrim [ 0-9\.mSTOPMenursaybto] FreeSansBold18pt7b.h
|
AdafruitGFXFontTrim [ 0-9\.mSTOPMenuER] FreeSansBold18pt7b.h
|
||||||
|
|
||||||
pause
|
pause
|
@ -58,7 +58,7 @@ class Config
|
|||||||
|
|
||||||
// How much the measurements can change to still be considered "stable"
|
// How much the measurements can change to still be considered "stable"
|
||||||
static const uint8_t HeightMeasurementDeltaStable = 10;
|
static const uint8_t HeightMeasurementDeltaStable = 10;
|
||||||
static const uint8_t HeightMeasurementDeltaStableCount = 1; // TODO: restore StableCount to 3
|
static const uint8_t HeightMeasurementDeltaStableCount = 3;
|
||||||
|
|
||||||
// How far in advance to stop the motor
|
// How far in advance to stop the motor
|
||||||
static const uint8_t HeightMeasurementDeltaStop = 0;
|
static const uint8_t HeightMeasurementDeltaStop = 0;
|
||||||
@ -104,12 +104,15 @@ class Config
|
|||||||
#define ColorDarkBlue 0x0907
|
#define ColorDarkBlue 0x0907
|
||||||
|
|
||||||
|
|
||||||
|
// Init sequence
|
||||||
static const uint16_t ColorInitSeqBackground = ColorBlack;
|
static const uint16_t ColorInitSeqBackground = ColorBlack;
|
||||||
static const uint16_t ColorInitSeqTitle = ColorYellow;
|
static const uint16_t ColorInitSeqTitle = ColorYellow;
|
||||||
static const uint16_t ColorInitSeqItems = ColorWhite;
|
static const uint16_t ColorInitSeqItems = ColorWhite;
|
||||||
static const uint16_t ColorInitSeqSuccess = ColorGreen;
|
static const uint16_t ColorInitSeqSuccess = ColorGreen;
|
||||||
static const uint16_t ColorInitSeqError = ColorRed;
|
static const uint16_t ColorInitSeqError = ColorRed;
|
||||||
|
|
||||||
|
|
||||||
|
// Home
|
||||||
static const uint16_t ColorHomeBackground = ColorBlack;
|
static const uint16_t ColorHomeBackground = ColorBlack;
|
||||||
|
|
||||||
static const uint16_t ColorHomeMenuText = ColorWhite;
|
static const uint16_t ColorHomeMenuText = ColorWhite;
|
||||||
@ -126,6 +129,7 @@ class Config
|
|||||||
static const uint16_t ColorPresetSelectedBackground = ColorSoftGreen;
|
static const uint16_t ColorPresetSelectedBackground = ColorSoftGreen;
|
||||||
|
|
||||||
|
|
||||||
|
// Move
|
||||||
static const uint16_t ColorMoveBackground = ColorBlack;
|
static const uint16_t ColorMoveBackground = ColorBlack;
|
||||||
|
|
||||||
static const uint16_t ColorMoveArrow = ColorDarkGray;
|
static const uint16_t ColorMoveArrow = ColorDarkGray;
|
||||||
@ -134,6 +138,11 @@ class Config
|
|||||||
static const uint16_t ColorMoveStop = ColorStopRed;
|
static const uint16_t ColorMoveStop = ColorStopRed;
|
||||||
|
|
||||||
|
|
||||||
|
// Move error / overcurrent
|
||||||
|
static const uint16_t ColorMoveErrorText = ColorStopRed;
|
||||||
|
|
||||||
|
|
||||||
|
// Menu
|
||||||
static const uint16_t ColorMenuHeaderText = ColorWhite;
|
static const uint16_t ColorMenuHeaderText = ColorWhite;
|
||||||
static const uint16_t ColorMenuHeaderBackground = ColorSoftBlue;
|
static const uint16_t ColorMenuHeaderBackground = ColorSoftBlue;
|
||||||
|
|
||||||
|
@ -1,31 +1,118 @@
|
|||||||
#include "./control.h"
|
#include "./control.h"
|
||||||
|
#include <Wire.h>
|
||||||
#include "./motor.h"
|
#include "./motor.h"
|
||||||
#include "./state.h"
|
#include "./Control.h"
|
||||||
#include "./settings.h"
|
#include "./settings.h"
|
||||||
#include "./debug.h"
|
#include "./debug.h"
|
||||||
#include "include/config.h"
|
#include "include/config.h"
|
||||||
|
|
||||||
|
|
||||||
void controlMoveTo(uint16_t height)
|
ControlManager Control = ControlManager();
|
||||||
{
|
|
||||||
dl("controlMoveTo: "); dln(height);
|
|
||||||
|
|
||||||
State.MoveTarget = height;
|
|
||||||
State.MoveDirection = height > State.CurrentHeight ? Direction::Up : Direction::Down;
|
VL53L0XInitResult ControlManager::init()
|
||||||
|
{
|
||||||
|
Wire.begin();
|
||||||
|
|
||||||
|
this->heightSensor.setTimeout(500);
|
||||||
|
auto result = this->heightSensor.init();
|
||||||
|
if (result != VL53L0XInitResult::Success)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
this->heightSensor.setMeasurementTimingBudget(Config::HeightSensorBudget);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ControlUpdateResult ControlManager::update()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ControlManager::stabilizeStart()
|
||||||
|
{
|
||||||
|
this->stabilizing = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ControlManager::stabilized()
|
||||||
|
{
|
||||||
|
// TODO: stabilized
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ControlManager::movePrepare(uint16_t height)
|
||||||
|
{
|
||||||
|
this->moveTarget = height;
|
||||||
|
this->moveDirection = height > this->currentHeight ? MoveDirection::Up : MoveDirection::Down;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ControlManager::moveStart()
|
||||||
|
{
|
||||||
|
// TODO: moveStart - wait for stable / timeout
|
||||||
|
|
||||||
|
this->moveDirection = MoveDirection::None;
|
||||||
|
this->stabilizeStart();
|
||||||
|
//this->sensorError = true;
|
||||||
|
return false;
|
||||||
|
|
||||||
|
motorStart(this->moveDirection == MoveDirection::Up ? MotorDirection::Up : MotorDirection::Down);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ControlManager::moveStop()
|
||||||
|
{
|
||||||
|
motorStop();
|
||||||
|
this->moveDirection = MoveDirection::None;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ControlManager::snapToPreset()
|
||||||
|
{
|
||||||
|
for (uint8_t i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
if (abs(this->currentHeight - Settings.Height.Preset[i]) <= Config::HeightMeasurementDeltaOnTarget)
|
||||||
|
{
|
||||||
|
this->currentHeight = Settings.Height.Preset[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ControlManager::getDisplayHeight(char* buffer, uint16_t value)
|
||||||
|
{
|
||||||
|
uint8_t displayValue = (value + Settings.Height.Offset) / 10;
|
||||||
|
|
||||||
|
if (displayValue > 99)
|
||||||
|
buffer[0] = '0' + ((displayValue / 100) % 10);
|
||||||
|
else
|
||||||
|
buffer[0] = '0';
|
||||||
|
|
||||||
|
buffer[1] = '.';
|
||||||
|
buffer[2] = '0' + ((displayValue / 10) % 10);
|
||||||
|
buffer[3] = '0' + (displayValue % 10);
|
||||||
|
buffer[4] = 'm';
|
||||||
|
buffer[5] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
bool controlCheckTargetReached()
|
bool controlCheckTargetReached()
|
||||||
{
|
{
|
||||||
dl("controlCheckTargetReached: direction = "); dl((uint8_t)State.MoveDirection); dl(", currentHeight = "); dln(State.CurrentHeight);
|
dl("controlCheckTargetReached: direction = "); dl((uint8_t)Control.getMoveDirection()); dl(", currentHeight = "); dln(Control.getCurrentHeight());
|
||||||
|
|
||||||
switch (State.MoveDirection)
|
switch (Control.getMoveDirection())
|
||||||
{
|
{
|
||||||
case Direction::Up:
|
case Direction::Up:
|
||||||
if (State.CurrentHeight >= State.MoveTarget - Config::HeightMeasurementDeltaStop)
|
if (Control.getCurrentHeight() >= Control.getMoveTarget() - Config::HeightMeasurementDeltaStop)
|
||||||
{
|
{
|
||||||
if (State.CurrentHeight - State.MoveTarget <= Config::HeightMeasurementDeltaOnTarget)
|
if (Control.getCurrentHeight() - Control.getMoveTarget() <= Config::HeightMeasurementDeltaOnTarget)
|
||||||
State.CurrentHeight = State.MoveTarget;
|
Control.getCurrentHeight() = Control.getMoveTarget();
|
||||||
|
|
||||||
controlStop();
|
controlStop();
|
||||||
return true;
|
return true;
|
||||||
@ -33,10 +120,10 @@ bool controlCheckTargetReached()
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Direction::Down:
|
case Direction::Down:
|
||||||
if (State.CurrentHeight <= State.MoveTarget + Config::HeightMeasurementDeltaStop)
|
if (Control.getCurrentHeight() <= Control.getMoveTarget() + Config::HeightMeasurementDeltaStop)
|
||||||
{
|
{
|
||||||
if (State.MoveTarget - State.CurrentHeight <= Config::HeightMeasurementDeltaOnTarget)
|
if (Control.getMoveTarget() - Control.getCurrentHeight() <= Config::HeightMeasurementDeltaOnTarget)
|
||||||
State.CurrentHeight = State.MoveTarget;
|
Control.getCurrentHeight() = Control.getMoveTarget();
|
||||||
|
|
||||||
controlStop();
|
controlStop();
|
||||||
return true;
|
return true;
|
||||||
@ -65,40 +152,95 @@ bool controlCheckOverCurrent()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void controlStop()
|
|
||||||
{
|
|
||||||
dln("controlStop");
|
|
||||||
|
|
||||||
motorStop();
|
|
||||||
State.MoveDirection = Direction::None;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void controlSnapToPreset()
|
if (Control.getMoveDirection() != Direction::None)
|
||||||
{
|
|
||||||
for (uint8_t i = 0; i < 2; i++)
|
|
||||||
{
|
{
|
||||||
if (abs(State.CurrentHeight - Settings.Height.Preset[i]) <= Config::HeightMeasurementDeltaOnTarget)
|
if (controlCheckOverCurrent())
|
||||||
|
screenManager.show<MoveOverCurrentScreen>();
|
||||||
|
else
|
||||||
|
updateHeight();
|
||||||
|
}
|
||||||
|
else if (Control.SensorError)
|
||||||
|
updateHeight();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void updateHeight()
|
||||||
|
{
|
||||||
|
uint16_t measurement;
|
||||||
|
|
||||||
|
if (heightSensorGetRange(&measurement))
|
||||||
|
{
|
||||||
|
Control.getCurrentHeight() = measurement;
|
||||||
|
|
||||||
|
if (Control.getMoveDirection() != Direction::None)
|
||||||
{
|
{
|
||||||
State.CurrentHeight = Settings.Height.Preset[i];
|
lastValidMeasurement = CurrentTime;
|
||||||
break;
|
|
||||||
|
if (controlCheckTargetReached())
|
||||||
|
screenManager.show<HomeScreen>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (Control.getMoveDirection() != Direction::None && CurrentTime - lastValidMeasurement >= Config::HeightMeasurementAbortTimeout)
|
||||||
|
{
|
||||||
|
dln("Out of range timeout!");
|
||||||
|
Control.moveStop();
|
||||||
|
|
||||||
|
screenManager.show<MoveSensorErrorScreen>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void getDisplayHeight(char* buffer, uint16_t value)
|
bool heightSensorGetRange(uint16_t* measurement)
|
||||||
{
|
{
|
||||||
uint8_t displayValue = (value + Settings.Height.Offset) / 10;
|
*measurement = heightSensor.readRangeSingleMillimeters();
|
||||||
|
dl("Range: "); dln(*measurement);
|
||||||
|
|
||||||
if (displayValue > 99)
|
return *measurement <= Config::HeightMeasurementMax;
|
||||||
buffer[0] = '0' + ((displayValue / 100) % 10);
|
}
|
||||||
else
|
|
||||||
buffer[0] = '0';
|
|
||||||
|
|
||||||
buffer[1] = '.';
|
|
||||||
buffer[2] = '0' + ((displayValue / 10) % 10);
|
|
||||||
buffer[3] = '0' + (displayValue % 10);
|
|
||||||
buffer[4] = 'm';
|
|
||||||
buffer[5] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
uint16_t reference = 0;
|
||||||
|
uint8_t closeCount = 0;
|
||||||
|
uint16_t measurement;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (heightSensorGetRange(&measurement))
|
||||||
|
{
|
||||||
|
initSequenceDisplayHeight(measurement);
|
||||||
|
|
||||||
|
if (abs(measurement - reference) <= Config::HeightMeasurementDeltaStable)
|
||||||
|
closeCount++;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reference = measurement;
|
||||||
|
closeCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
initSequenceDisplayHeight(0);
|
||||||
|
|
||||||
|
reference = 0;
|
||||||
|
closeCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (closeCount < Config::HeightMeasurementDeltaStableCount)
|
||||||
|
delay(500);
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
initSequenceSuccess(InitSequenceStep::HeightSensorTest);
|
||||||
|
return reference;
|
||||||
|
|
||||||
|
*/
|
@ -2,20 +2,68 @@
|
|||||||
#define __control
|
#define __control
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "./vl53l0x.h"
|
||||||
// High-level functions to control the motor and update the global state
|
|
||||||
extern void controlMoveTo(uint16_t height);
|
|
||||||
extern bool controlCheckTargetReached();
|
|
||||||
extern bool controlCheckOverCurrent();
|
|
||||||
extern void controlStop();
|
|
||||||
|
|
||||||
extern void controlSnapToPreset();
|
|
||||||
|
|
||||||
|
|
||||||
// Formats a height value as "0.00m" (always exactly 5 characters long).
|
enum class ControlUpdateResult
|
||||||
// Buffer must be at least 6 bytes long, a null character is added.
|
{
|
||||||
// The value is the raw height sensor value, the offset is added by this function.
|
Idle = 0,
|
||||||
extern void getDisplayHeight(char* buffer, uint16_t value);
|
Moving = 1,
|
||||||
|
TargetReached = 2,
|
||||||
|
SensorError = 3,
|
||||||
|
OverCurrent = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum class MoveDirection
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Up = 1,
|
||||||
|
Down = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class ControlManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
VL53L0XInitResult init();
|
||||||
|
ControlUpdateResult update();
|
||||||
|
|
||||||
|
|
||||||
|
void stabilizeStart();
|
||||||
|
bool stabilized();
|
||||||
|
|
||||||
|
void movePrepare(uint16_t height);
|
||||||
|
bool moveStart();
|
||||||
|
void moveStop();
|
||||||
|
|
||||||
|
void snapToPreset();
|
||||||
|
|
||||||
|
|
||||||
|
// Formats a height value as "0.00m" (always exactly 5 characters long).
|
||||||
|
// Buffer must be at least 6 bytes long, a null character is added.
|
||||||
|
// The value is the raw height sensor value, the offset is added by this function.
|
||||||
|
void getDisplayHeight(char* buffer, uint16_t value);
|
||||||
|
|
||||||
|
|
||||||
|
uint16_t getCurrentHeight() { return this->currentHeight; }
|
||||||
|
MoveDirection getMoveDirection() { return this->moveDirection; }
|
||||||
|
uint16_t getMoveTarget() { return this->moveTarget; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
VL53L0X heightSensor = VL53L0X();
|
||||||
|
uint16_t currentHeight;
|
||||||
|
|
||||||
|
MoveDirection moveDirection;
|
||||||
|
uint16_t moveTarget;
|
||||||
|
|
||||||
|
bool stabilizing = false;
|
||||||
|
uint32_t lastValidMeasurement = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
extern ControlManager Control;
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -2,7 +2,7 @@
|
|||||||
#define __screen_calibrate
|
#define __screen_calibrate
|
||||||
|
|
||||||
#include "../screen.h"
|
#include "../screen.h"
|
||||||
#include "../state.h"
|
#include "../control.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -4,13 +4,14 @@
|
|||||||
#include "include/metrics.h"
|
#include "include/metrics.h"
|
||||||
#include "lib/settings.h"
|
#include "lib/settings.h"
|
||||||
#include "lib/control.h"
|
#include "lib/control.h"
|
||||||
|
#include "lib/state.h"
|
||||||
#include "./menu.h"
|
#include "./menu.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void HomeScreen::onShow()
|
void HomeScreen::onShow()
|
||||||
{
|
{
|
||||||
this->showTime = State.CurrentTime;
|
this->showTime = CurrentTime;
|
||||||
|
|
||||||
auto display = this->getDisplay();
|
auto display = this->getDisplay();
|
||||||
|
|
||||||
@ -31,7 +32,7 @@ void HomeScreen::onButton(Button button)
|
|||||||
{
|
{
|
||||||
this->getScreenManager()->displayOn();
|
this->getScreenManager()->displayOn();
|
||||||
this->idle = false;
|
this->idle = false;
|
||||||
this->showTime = State.CurrentTime;
|
this->showTime = CurrentTime;
|
||||||
|
|
||||||
// Preset buttons activate immediately
|
// Preset buttons activate immediately
|
||||||
if (button == Button::Menu)
|
if (button == Button::Menu)
|
||||||
@ -41,13 +42,15 @@ void HomeScreen::onButton(Button button)
|
|||||||
switch (button)
|
switch (button)
|
||||||
{
|
{
|
||||||
case Button::Up:
|
case Button::Up:
|
||||||
controlMoveTo(Settings.Height.Preset[0]);
|
Control.movePrepare(Settings.Height.Preset[0]);
|
||||||
this->getScreenManager()->show<MoveScreen>();
|
this->getScreenManager()->show<MoveScreen>();
|
||||||
|
Control.moveStart();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Button::Down:
|
case Button::Down:
|
||||||
controlMoveTo(Settings.Height.Preset[1]);
|
Control.movePrepare(Settings.Height.Preset[1]);
|
||||||
this->getScreenManager()->show<MoveScreen>();
|
this->getScreenManager()->show<MoveScreen>();
|
||||||
|
Control.moveStart();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Button::Menu:
|
case Button::Menu:
|
||||||
@ -59,7 +62,7 @@ void HomeScreen::onButton(Button button)
|
|||||||
|
|
||||||
void HomeScreen::onTick()
|
void HomeScreen::onTick()
|
||||||
{
|
{
|
||||||
if (!this->idle && State.CurrentTime - this->showTime >= Config::DisplayIdleTime)
|
if (!this->idle && CurrentTime - this->showTime >= Config::DisplayIdleTime)
|
||||||
{
|
{
|
||||||
this->getScreenManager()->displayOff();
|
this->getScreenManager()->displayOff();
|
||||||
this->idle = true;
|
this->idle = true;
|
||||||
@ -84,11 +87,11 @@ void HomeScreen::drawNonPresetHeight()
|
|||||||
auto display = this->getDisplay();
|
auto display = this->getDisplay();
|
||||||
auto y = Metrics::LargeTextLineHeight;
|
auto y = Metrics::LargeTextLineHeight;
|
||||||
|
|
||||||
if (State.CurrentHeight != Settings.Height.Preset[0] &&
|
if (Control.getCurrentHeight() != Settings.Height.Preset[0] &&
|
||||||
State.CurrentHeight != Settings.Height.Preset[1])
|
Control.getCurrentHeight() != Settings.Height.Preset[1])
|
||||||
{
|
{
|
||||||
display->setTextColor(Config::ColorNonPresetText);
|
display->setTextColor(Config::ColorNonPresetText);
|
||||||
this->drawHeight(y, State.CurrentHeight);
|
this->drawHeight(y, Control.getCurrentHeight());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,7 +104,7 @@ void HomeScreen::drawPreset(int16_t y, uint16_t value)
|
|||||||
uint16_t arrowColor;
|
uint16_t arrowColor;
|
||||||
|
|
||||||
// An exact comparison is enough here, the movement code takes care of that if it's "close enough"
|
// An exact comparison is enough here, the movement code takes care of that if it's "close enough"
|
||||||
if (value == State.CurrentHeight)
|
if (value == Control.getCurrentHeight())
|
||||||
{
|
{
|
||||||
textColor = Config::ColorPresetSelectedText;
|
textColor = Config::ColorPresetSelectedText;
|
||||||
backgroundColor = Config::ColorPresetSelectedBackground;
|
backgroundColor = Config::ColorPresetSelectedBackground;
|
||||||
@ -127,7 +130,7 @@ void HomeScreen::drawPreset(int16_t y, uint16_t value)
|
|||||||
void HomeScreen::drawHeight(int16_t y, uint16_t value)
|
void HomeScreen::drawHeight(int16_t y, uint16_t value)
|
||||||
{
|
{
|
||||||
char textValue[6];
|
char textValue[6];
|
||||||
getDisplayHeight(&textValue[0], value);
|
Control.getDisplayHeight(&textValue[0], value);
|
||||||
|
|
||||||
this->printCentered(&textValue[0], y + Metrics::LargeTextLineYOffset);
|
this->printCentered(&textValue[0], y + Metrics::LargeTextLineYOffset);
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#define __screen_home
|
#define __screen_home
|
||||||
|
|
||||||
#include "../screen.h"
|
#include "../screen.h"
|
||||||
#include "../state.h"
|
#include "../Control.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#define __screen_manual
|
#define __screen_manual
|
||||||
|
|
||||||
#include "../screen.h"
|
#include "../screen.h"
|
||||||
#include "../state.h"
|
#include "../Control.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#define __screen_menu
|
#define __screen_menu
|
||||||
|
|
||||||
#include "../screen.h"
|
#include "../screen.h"
|
||||||
#include "../state.h"
|
#include "../Control.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#define __screen_move_overcurrent
|
#define __screen_move_overcurrent
|
||||||
|
|
||||||
#include "../screen.h"
|
#include "../screen.h"
|
||||||
#include "../state.h"
|
#include "../Control.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,11 +1,31 @@
|
|||||||
#include "./move-sensorerror.h"
|
#include "./move-sensorerror.h"
|
||||||
|
#include "include/config.h"
|
||||||
|
#include "include/metrics.h"
|
||||||
|
#include "lib/control.h"
|
||||||
|
#include "lib/state.h"
|
||||||
|
|
||||||
|
|
||||||
void MoveSensorErrorScreen::onShow()
|
void MoveSensorErrorScreen::onShow()
|
||||||
{
|
{
|
||||||
//auto display = this->getDisplay();
|
auto display = this->getDisplay();
|
||||||
|
auto y = Metrics::LargeTextLineHeight + Metrics::LargeTextLineYOffset;
|
||||||
|
|
||||||
// TODO: implement MoveSensorErrorScreen
|
display->setFont(Metrics::LargeFont);
|
||||||
|
display->setTextColor(Config::ColorMoveErrorText);
|
||||||
|
this->printCentered("ERROR", y);
|
||||||
|
y += Metrics::LargeTextLineHeight;
|
||||||
|
|
||||||
|
display->setFont(Metrics::SmallFont);
|
||||||
|
this->printCentered("height sensor failed", y);
|
||||||
|
y += Metrics::SmallTextLineHeight;
|
||||||
|
|
||||||
|
this->printCentered("waiting for stable value", y);
|
||||||
|
y += Metrics::SmallTextLineHeight + Metrics::LargeTextLineHeight;
|
||||||
|
|
||||||
|
this->currentHeightY = y;
|
||||||
|
|
||||||
|
this->lastRefresh = CurrentTime;
|
||||||
|
this->drawCurrentHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -16,4 +36,19 @@ void MoveSensorErrorScreen::onButton(Button button)
|
|||||||
|
|
||||||
void MoveSensorErrorScreen::onTick()
|
void MoveSensorErrorScreen::onTick()
|
||||||
{
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MoveSensorErrorScreen::drawCurrentHeight()
|
||||||
|
{
|
||||||
|
auto display = this->getDisplay();
|
||||||
|
|
||||||
|
char currentHeightText[6];
|
||||||
|
Control.getDisplayHeight(¤tHeightText[0], Control.getCurrentHeight());
|
||||||
|
|
||||||
|
if (this->lastTextWidth > 0)
|
||||||
|
display->fillRect((Config::DisplayWidth - this->lastTextWidth) / 2, this->currentHeightY, this->lastTextWidth, Metrics::LargeTextLineHeight, Config::ColorMoveBackground);
|
||||||
|
|
||||||
|
display->setTextColor(Config::ColorMoveTarget);
|
||||||
|
this->lastTextWidth = this->printCentered(¤tHeightText[0], this->currentHeightY + Metrics::LargeFontBaseline);
|
||||||
}
|
}
|
@ -2,7 +2,7 @@
|
|||||||
#define __screen_move_sensorerror
|
#define __screen_move_sensorerror
|
||||||
|
|
||||||
#include "../screen.h"
|
#include "../screen.h"
|
||||||
#include "../state.h"
|
#include "../Control.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -20,6 +20,11 @@ class MoveSensorErrorScreen : public BaseScreen
|
|||||||
void onTick();
|
void onTick();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
uint32_t lastRefresh;
|
||||||
|
uint8_t currentHeightY;
|
||||||
|
uint16_t lastTextWidth = 0;
|
||||||
|
|
||||||
|
void drawCurrentHeight();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include "include/metrics.h"
|
#include "include/metrics.h"
|
||||||
#include "lib/settings.h"
|
#include "lib/settings.h"
|
||||||
#include "lib/control.h"
|
#include "lib/control.h"
|
||||||
|
#include "lib/state.h"
|
||||||
|
|
||||||
|
|
||||||
void MoveScreen::onShow()
|
void MoveScreen::onShow()
|
||||||
@ -26,11 +26,11 @@ void MoveScreen::onShow()
|
|||||||
this->printCentered("STOP", stopY + Metrics::LargeTextLineYOffset);
|
this->printCentered("STOP", stopY + Metrics::LargeTextLineYOffset);
|
||||||
|
|
||||||
char targetHeightText[6];
|
char targetHeightText[6];
|
||||||
getDisplayHeight(&targetHeightText[0], State.MoveTarget);
|
Control.getDisplayHeight(&targetHeightText[0], Control.getMoveTarget());
|
||||||
display->setTextColor(Config::ColorMoveCurrent);
|
display->setTextColor(Config::ColorMoveCurrent);
|
||||||
|
|
||||||
// Target and arrow
|
// Target and arrow
|
||||||
if (State.MoveDirection == Direction::Up)
|
if (Control.getMoveDirection() == MoveDirection::Up)
|
||||||
{
|
{
|
||||||
this->currentHeightY = startY + (Metrics::LargeTextLineHeight * 2);
|
this->currentHeightY = startY + (Metrics::LargeTextLineHeight * 2);
|
||||||
|
|
||||||
@ -45,32 +45,26 @@ void MoveScreen::onShow()
|
|||||||
this->drawArrowDown(arrowX, arrowY, Config::ColorMoveArrow);
|
this->drawArrowDown(arrowX, arrowY, Config::ColorMoveArrow);
|
||||||
}
|
}
|
||||||
|
|
||||||
this->lastRefresh = State.CurrentTime;
|
this->lastRefresh = CurrentTime;
|
||||||
this->drawCurrentHeight();
|
this->drawCurrentHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MoveScreen::onButton(Button button)
|
void MoveScreen::onButton(Button button)
|
||||||
{
|
{
|
||||||
controlStop();
|
Control.moveStop();
|
||||||
this->getScreenManager()->show<HomeScreen>();
|
this->getScreenManager()->show<HomeScreen>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MoveScreen::onTick()
|
void MoveScreen::onTick()
|
||||||
{
|
{
|
||||||
if (State.MoveDirection == Direction::None)
|
|
||||||
{
|
|
||||||
this->getScreenManager()->show<HomeScreen>();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't update every tick, monitoring the current height is more
|
// Don't update every tick, monitoring the current height is more
|
||||||
// important and the flicker would be unpleasant as well.
|
// important and the flicker would be unpleasant as well.
|
||||||
if (State.CurrentTime - this->lastRefresh >= Config::DisplayMoveRefreshRate)
|
if (CurrentTime - this->lastRefresh >= Config::DisplayMoveRefreshRate)
|
||||||
{
|
{
|
||||||
this->drawCurrentHeight();
|
this->drawCurrentHeight();
|
||||||
this->lastRefresh = State.CurrentTime;
|
this->lastRefresh = CurrentTime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +74,7 @@ void MoveScreen::drawCurrentHeight()
|
|||||||
auto display = this->getDisplay();
|
auto display = this->getDisplay();
|
||||||
|
|
||||||
char currentHeightText[6];
|
char currentHeightText[6];
|
||||||
getDisplayHeight(¤tHeightText[0], State.CurrentHeight);
|
Control.getDisplayHeight(¤tHeightText[0], Control.getCurrentHeight());
|
||||||
|
|
||||||
if (this->lastTextWidth > 0)
|
if (this->lastTextWidth > 0)
|
||||||
display->fillRect((Config::DisplayWidth - this->lastTextWidth) / 2, this->currentHeightY, this->lastTextWidth, Metrics::LargeTextLineHeight, Config::ColorMoveBackground);
|
display->fillRect((Config::DisplayWidth - this->lastTextWidth) / 2, this->currentHeightY, this->lastTextWidth, Metrics::LargeTextLineHeight, Config::ColorMoveBackground);
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#define __screen_move
|
#define __screen_move
|
||||||
|
|
||||||
#include "../screen.h"
|
#include "../screen.h"
|
||||||
#include "../state.h"
|
#include "../Control.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
#include "state.h"
|
#include "Control.h"
|
||||||
|
|
||||||
StateContainer State;
|
uint32_t CurrentTime;
|
@ -3,23 +3,6 @@
|
|||||||
|
|
||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
|
|
||||||
enum class Direction
|
extern uint32_t CurrentTime;
|
||||||
{
|
|
||||||
None = 0,
|
|
||||||
Up = 1,
|
|
||||||
Down = 2
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
struct StateContainer
|
|
||||||
{
|
|
||||||
uint32_t CurrentTime;
|
|
||||||
uint16_t CurrentHeight;
|
|
||||||
|
|
||||||
Direction MoveDirection;
|
|
||||||
uint16_t MoveTarget;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern StateContainer State;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
117
src/main.cpp
117
src/main.cpp
@ -1,5 +1,4 @@
|
|||||||
#include <SPI.h>
|
#include <SPI.h>
|
||||||
#include <Wire.h>
|
|
||||||
#include <Adafruit_GFX.h>
|
#include <Adafruit_GFX.h>
|
||||||
#include <Adafruit_ST7789.h>
|
#include <Adafruit_ST7789.h>
|
||||||
#include <Bounce2.h>
|
#include <Bounce2.h>
|
||||||
@ -9,9 +8,10 @@
|
|||||||
#include "./lib/settings.h"
|
#include "./lib/settings.h"
|
||||||
#include "./lib/screen.h"
|
#include "./lib/screen.h"
|
||||||
#include "./lib/vl53l0x.h"
|
#include "./lib/vl53l0x.h"
|
||||||
#include "./lib/state.h"
|
#include "./lib/Control.h"
|
||||||
#include "./lib/motor.h"
|
#include "./lib/motor.h"
|
||||||
#include "./lib/control.h"
|
#include "./lib/control.h"
|
||||||
|
#include "./lib/state.h"
|
||||||
#include "./lib/screen/home.h"
|
#include "./lib/screen/home.h"
|
||||||
#include "./lib/screen/calibrate.h"
|
#include "./lib/screen/calibrate.h"
|
||||||
#include "./lib/screen/move-overcurrent.h"
|
#include "./lib/screen/move-overcurrent.h"
|
||||||
@ -38,12 +38,8 @@ void initSequenceError(InitSequenceStep step);
|
|||||||
void initSequenceDisplayHeight(uint16_t measurement);
|
void initSequenceDisplayHeight(uint16_t measurement);
|
||||||
void initSequenceEnd();
|
void initSequenceEnd();
|
||||||
|
|
||||||
bool heightSensorGetRange(uint16_t* measurement);
|
|
||||||
|
|
||||||
|
|
||||||
auto display = Adafruit_ST7789(Config::DisplayPinCS, Config::DisplayPinDC, Config::DisplayPinRST);
|
auto display = Adafruit_ST7789(Config::DisplayPinCS, Config::DisplayPinDC, Config::DisplayPinRST);
|
||||||
auto heightSensor = VL53L0X();
|
|
||||||
|
|
||||||
auto screenManager = ScreenManager(&display);
|
auto screenManager = ScreenManager(&display);
|
||||||
|
|
||||||
Bounce buttons[3];
|
Bounce buttons[3];
|
||||||
@ -83,13 +79,13 @@ void setup()
|
|||||||
initSequenceEnd();
|
initSequenceEnd();
|
||||||
|
|
||||||
|
|
||||||
State.CurrentTime = millis();
|
CurrentTime = millis();
|
||||||
|
|
||||||
|
|
||||||
if (initialized)
|
if (initialized)
|
||||||
{
|
{
|
||||||
State.CurrentHeight = currentHeight;
|
// Control.getCurrentHeight() = currentHeight;
|
||||||
controlSnapToPreset();
|
Control.snapToPreset();
|
||||||
|
|
||||||
screenManager.show<HomeScreen>();
|
screenManager.show<HomeScreen>();
|
||||||
}
|
}
|
||||||
@ -103,11 +99,7 @@ void setup()
|
|||||||
|
|
||||||
inline void setupHeightSensor()
|
inline void setupHeightSensor()
|
||||||
{
|
{
|
||||||
Wire.begin();
|
auto error = Control.init();
|
||||||
|
|
||||||
heightSensor.setTimeout(500);
|
|
||||||
auto error = heightSensor.init();
|
|
||||||
|
|
||||||
if (error != VL53L0XInitResult::Success)
|
if (error != VL53L0XInitResult::Success)
|
||||||
{
|
{
|
||||||
initSequenceError(InitSequenceStep::HeightSensorInit);
|
initSequenceError(InitSequenceStep::HeightSensorInit);
|
||||||
@ -138,8 +130,6 @@ inline void setupHeightSensor()
|
|||||||
while(1);
|
while(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
heightSensor.setMeasurementTimingBudget(Config::HeightSensorBudget);
|
|
||||||
|
|
||||||
initSequenceSuccess(InitSequenceStep::HeightSensorInit);
|
initSequenceSuccess(InitSequenceStep::HeightSensorInit);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,40 +137,6 @@ inline void setupHeightSensor()
|
|||||||
|
|
||||||
inline uint16_t testHeightSensor()
|
inline uint16_t testHeightSensor()
|
||||||
{
|
{
|
||||||
uint16_t reference = 0;
|
|
||||||
uint8_t closeCount = 0;
|
|
||||||
uint16_t measurement;
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
if (heightSensorGetRange(&measurement))
|
|
||||||
{
|
|
||||||
initSequenceDisplayHeight(measurement);
|
|
||||||
|
|
||||||
if (abs(measurement - reference) <= Config::HeightMeasurementDeltaStable)
|
|
||||||
closeCount++;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
reference = measurement;
|
|
||||||
closeCount = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
initSequenceDisplayHeight(0);
|
|
||||||
|
|
||||||
reference = 0;
|
|
||||||
closeCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (closeCount < Config::HeightMeasurementDeltaStableCount)
|
|
||||||
delay(500);
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
initSequenceSuccess(InitSequenceStep::HeightSensorTest);
|
|
||||||
return reference;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -190,23 +146,30 @@ inline uint16_t testHeightSensor()
|
|||||||
Loop
|
Loop
|
||||||
|
|
||||||
*/
|
*/
|
||||||
// Forward declarations
|
|
||||||
void updateHeight();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
State.CurrentTime = millis();
|
CurrentTime = millis();
|
||||||
|
|
||||||
if (State.MoveDirection != Direction::None)
|
|
||||||
|
switch (Control.update())
|
||||||
{
|
{
|
||||||
if (controlCheckOverCurrent())
|
case ControlUpdateResult::TargetReached:
|
||||||
|
screenManager.show<HomeScreen>();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ControlUpdateResult::SensorError:
|
||||||
|
screenManager.show<MoveSensorErrorScreen>();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ControlUpdateResult::OverCurrent:
|
||||||
screenManager.show<MoveOverCurrentScreen>();
|
screenManager.show<MoveOverCurrentScreen>();
|
||||||
else
|
break;
|
||||||
updateHeight();
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
buttons[0].update();
|
buttons[0].update();
|
||||||
buttons[1].update();
|
buttons[1].update();
|
||||||
buttons[2].update();
|
buttons[2].update();
|
||||||
@ -226,40 +189,6 @@ void loop()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t lastValidMeasurement;
|
|
||||||
|
|
||||||
void updateHeight()
|
|
||||||
{
|
|
||||||
uint16_t measurement;
|
|
||||||
|
|
||||||
if (heightSensorGetRange(&measurement))
|
|
||||||
{
|
|
||||||
State.CurrentHeight = measurement;
|
|
||||||
lastValidMeasurement = State.CurrentTime;
|
|
||||||
|
|
||||||
if (controlCheckTargetReached())
|
|
||||||
screenManager.show<HomeScreen>();
|
|
||||||
}
|
|
||||||
else if (State.CurrentTime - lastValidMeasurement >= Config::HeightMeasurementAbortTimeout)
|
|
||||||
{
|
|
||||||
dln("Out of range timeout!");
|
|
||||||
controlStop();
|
|
||||||
|
|
||||||
screenManager.show<MoveSensorErrorScreen>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool heightSensorGetRange(uint16_t* measurement)
|
|
||||||
{
|
|
||||||
*measurement = heightSensor.readRangeSingleMillimeters();
|
|
||||||
dl("Range: "); dln(*measurement);
|
|
||||||
|
|
||||||
return *measurement <= Config::HeightMeasurementMax;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
Helper functions for the status display during the initialization sequence
|
Helper functions for the status display during the initialization sequence
|
||||||
|
Loading…
Reference in New Issue
Block a user