-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathTouchScreen.hpp
More file actions
114 lines (95 loc) · 3.62 KB
/
TouchScreen.hpp
File metadata and controls
114 lines (95 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#ifndef PREVIEW_TOUCH_SCREEN_HPP
#define PREVIEW_TOUCH_SCREEN_HPP
#include "hal/interfaces/AnalogToDigitalPin.hpp"
#include "hal/interfaces/Gpio.hpp"
#include "infra/timer/Timer.hpp"
#include "infra/util/AutoResetFunction.hpp"
#include "infra/util/Optional.hpp"
#include "infra/util/PolymorphicVariant.hpp"
#include "infra/util/ProxyCreator.hpp"
#include "preview/interfaces/Geometry.hpp"
namespace services
{
class TouchScreen
{
public:
using PixelPosition = infra::Quantity<infra::Identity, uint16_t>;
using AnalogToDigitalPin = hal::AnalogToDigitalPin<infra::Identity, uint16_t>;
TouchScreen(hal::GpioPin& xPlus, hal::GpioPin& xMinus, hal::GpioPin& yPlus, hal::GpioPin& yMinus, infra::CreatorBase<AnalogToDigitalPin, void()>& xPlusAnalogPin, infra::CreatorBase<AnalogToDigitalPin, void()>& yPlusAnalogPin, uint32_t touchDelta);
void Measure(const infra::Function<void(std::optional<infra::Point> position)>& onTouched);
private:
class State
{
public:
State() = default;
State(const State& other) = delete;
State& operator=(const State& other) = delete;
virtual ~State() = default;
};
class StateIdle
: public State
{};
class StateTouchMeasurement
: public State
{
public:
StateTouchMeasurement(TouchScreen& touchScreen, bool finalMeasurement);
private:
void OnMeasurementXDone(uint32_t xTouchResult);
void OnMeasurementYDone(uint32_t yTouchResult);
private:
TouchScreen& touchScreen;
hal::OutputPin xMinus;
hal::OutputPin yMinus;
infra::ProxyCreator<AnalogToDigitalPin, void()> xPlusAnalogPin;
infra::ProxyCreator<AnalogToDigitalPin, void()> yPlusAnalogPin;
infra::TimerSingleShot startConversion;
bool finalMeasurement;
uint32_t xTouchResult;
PixelPosition pixelPosition;
};
class StateXMeasurement
: public State
{
public:
explicit StateXMeasurement(TouchScreen& touchScreen);
private:
void OnMeasurementDone(uint32_t pixelPosition);
private:
TouchScreen& touchScreen;
hal::OutputPin yPlus;
hal::OutputPin yMinus;
infra::ProxyCreator<AnalogToDigitalPin, void()> xPlusAnalogPin;
infra::TimerSingleShot startConversion;
PixelPosition pixelPosition;
};
class StateYMeasurement
: public State
{
public:
explicit StateYMeasurement(TouchScreen& touchScreen);
private:
void OnMeasurementDone(uint32_t pixelPosition);
private:
TouchScreen& touchScreen;
hal::OutputPin xPlus;
hal::OutputPin xMinus;
infra::ProxyCreator<AnalogToDigitalPin, void()> yPlusAnalogPin;
infra::TimerSingleShot startConversion;
PixelPosition pixelPosition;
};
private:
hal::GpioPin& xPlus;
hal::GpioPin& xMinus;
hal::GpioPin& yPlus;
hal::GpioPin& yMinus;
infra::CreatorBase<AnalogToDigitalPin, void()>& xPlusAnalogPin;
infra::CreatorBase<AnalogToDigitalPin, void()>& yPlusAnalogPin;
uint32_t touchDelta;
infra::AutoResetFunction<void(std::optional<infra::Point> position)> onTouched;
infra::PolymorphicVariant<State, StateIdle, StateTouchMeasurement, StateXMeasurement, StateYMeasurement> state;
uint32_t xResult;
uint32_t yResult;
};
}
#endif