-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathFencingStateMachine.h
241 lines (219 loc) · 10.1 KB
/
FencingStateMachine.h
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
//Copyright (c) Piet Wauters 2022 <[email protected]>
#ifndef FENCINGSTATEMACHINE_H
#define FENCINGSTATEMACHINE_H
#include "SubjectObserverTemplate.h"
#include "Singleton.h"
#include "3WeaponSensor.h"
#include "FencingTimer.h"
#include "UW2FTimer.h"
#include "EFP1Message.h"
#include "RepeaterSender.h"
enum Priority_t {NO_PRIO, PRIO_LEFT, PRIO_RIGHT};
enum TimerState_t{FIGHTING, BREAK, INJURY, ADDITIONAL_MINUTE, MATCH_ENDED,UNDEFINED};
//enum weapon_t{FOIL, EPEE, SABRE, UNKNOWN};
//enum WeaponSelectionMode_t {MANUAL, AUTO, HYBRID};
class UDPIOHandler;
class CyranoHandler;
class FencingStateMachine : public Subject<FencingStateMachine> , public Observer<MultiWeaponSensor> , public Observer<UDPIOHandler> , public Observer<CyranoHandler>, public SingletonMixin<FencingStateMachine>
{
public:
/** Default destructor */
virtual ~FencingStateMachine();
//void StateChanged () {notify();}
void DoStateMachineTick();
void update (MultiWeaponSensor *subject, uint32_t eventtype);
// void update (BlynkIOHandler *subject, uint32_t eventtype);
void update (UDPIOHandler *subject, uint32_t eventtype);
void update (CyranoHandler *subject, uint32_t eventtype){};
void update (CyranoHandler *subject, string eventtype);
void TransmitFullStateToDisplay (class RepeaterSender *TheRepeater);
void StateChanged (uint32_t eventtype) {notify(eventtype);}
void ProcessDisplayMessage (const EFP1Message &input);
void PeriodicallyBroadcastFullState(class RepeaterSender *TheRepeater,long Period = 7919);
/** Access m_Red
* \return The current value of m_Red
*/
bool GetRed() { return m_Lights & MASK_RED; }
/** Set m_Red
* \param val New value to set
*/
void SetRed(bool val) { if(val != m_Red){m_Red = val; m_StateChanged = true;}}
/** Access m_Green
* \return The current value of m_Green
*/
bool GetGreen() { return m_Lights & MASK_GREEN; }
/** Set m_Green
* \param val New value to set
*/
void SetGreen(bool val) { if(val != m_Green){m_Green = val; m_StateChanged = true;}}
/** Access m_WhiteL
* \return The current value of m_WhiteL
*/
bool GetWhiteL() { return m_Lights & MASK_WHITE_L; }
/** Set m_WhiteL
* \param val New value to set
*/
void SetWhiteL(bool val) { if(val != m_WhiteL){m_WhiteL = val; m_StateChanged = true;}}
/** Access m_WhiteR
* \return The current value of m_WhiteL
*/
bool GetWhiteR() { return m_Lights & MASK_WHITE_R; }
/** Access m_OrangeL
* \return The current value of m_OrangeL
*/
bool GetOrangeL() { return m_Lights & MASK_ORANGE_L; }
/** Set m_OrangeL
* \param val New value to set
*/
void SetOrangeL(bool val) { if(val != m_OrangeL){m_OrangeL = val; m_StateChanged = true;}}
/** Access m_OrangeR
* \return The current value of m_OrangeR
*/
bool GetOrangeR() { return m_Lights & MASK_ORANGE_R; }
/** Set m_OrangeR
* \param val New value to set
*/
void SetOrangeR(bool val) { if(val != m_OrangeR){m_OrangeR = val; m_StateChanged = true;}}
/** Access m_Priority&
* \return The current value of m_Priority
*/
Priority_t GetPriority() { return m_Priority; }
/** Set m_Priority
* \param val New value to set
*/
void SetPriority(Priority_t val) { if(val != m_Priority){m_Priority = val; m_StateChanged = true;}}
/** Access m_YellowCardLeft
* \return The current value of m_YellowCardLeft
*/
int GetYellowCardLeft() { return m_YellowCardLeft; }
/** Set m_YellowCardLeft
* \param val New value to set
*/
void SetYellowCardLeft(int val) { if(val != m_YellowCardLeft){m_YellowCardLeft = val; m_StateChanged = true;}}
/** Access m_YellowCardRight
* \return The current value of m_YellowCardRight
*/
int GetYellowCardRight() { return m_YellowCardRight; }
/** Set m_YellowCardRight
* \param val New value to set
*/
void SetYellowCardRight(int val) {if(val != m_YellowCardRight){ m_YellowCardRight = val; m_StateChanged = true;}}
/** Access m_RedCardLeft
* \return The current value of m_RedCardLeft
*/
int GetRedCardLeft() { return m_RedCardLeft; }
/** Set m_RedCardLeft
* \param val New value to set
*/
void SetRedCardLeft(int val) { if(val != m_RedCardLeft){m_RedCardLeft = val; m_StateChanged = true;}}
/** Access m_RedCardRightm_timeToRearm
* \return The current value of m_RedCardRight
*/
int GetRedCardRight() { return m_RedCardRight; }
/** Set m_RedCardRight
* \param val New value to set
*/
void SetRedCardRight(int val) { if(val != m_RedCardRight){m_RedCardRight = val; m_StateChanged = true;}}
/** Access m_Timerstate
* \return The current value of m_Timerstate
*/
TimerState_t GetTimerstate() { return m_Timerstate; }
/** Set m_Timerstate
* \param val New value to set
*/
void SetTimerstate(TimerState_t val) { if(val != m_Timerstate){m_Timerstate = val; m_StateChanged = true;}}
/** Access m_ScoreLeft
* \return The current value of m_ScoreLeft
*/
unsigned int GetScoreLeft() { return m_ScoreLeft; }
/** Set m_ScoreLeft
* \param val New value to set
*/
void SetScoreLeft(unsigned int val) { if(val != m_ScoreLeft){m_ScoreLeft = val; m_StateChanged = true;}}
/** Access m_ScoreRight
* \return The current value of m_ScoreRight
*/
unsigned int GetScoreRight() { return m_ScoreRight; }
/** Set m_ScoreRight
* \param val New value to set
*/
void SetScoreRight(unsigned int val) { if(val != m_ScoreRight){m_ScoreRight = val; m_StateChanged = true;}}
/** Access m_MachineWeapon
* \return The current value of m_MachineWeapon
*/
weapon_t GetMachineWeapon() { return m_MachineWeapon; }
/** Set m_MachineWeapon
* \param val New value to set
*/
void SetMachineWeapon(weapon_t val) { if(val != m_MachineWeapon){m_MachineWeapon = val; m_WeaponChanged = true;}}
void SetMachineLights(unsigned char val) { if(val != m_Lights){m_Lights = val; m_LightsChanged = true; }}
void RegisterMultiWeaponSensor(MultiWeaponSensor *MySensor){m_TheSensor = MySensor;SetMachineWeapon(MySensor->GetActualWeapon());}
void ResetAll();
uint32_t MakeTimerEvent();
void GetFormattedStringTime(char *Destination, int MinutePrecision, int HundredthsPrecision){m_Timer.GetFormattedStringTime(Destination, MinutePrecision, HundredthsPrecision);};
bool IsConnectedToRemote(){return m_IsConnectedToRemote;};
void SetConnectedToRemote(bool value){m_IsConnectedToRemote = value;};
void ClearAllCards();
void ProcessSpecialSetting (uint32_t eventtype);
bool incrementScoreAndCheckForMinuteBreak(bool bLeftFencer);
uint32_t get_max_score();
bool GoToSleep() {return m_GoToSleep;};
void begin();
protected:
private:
// private methods
/** Default constructor */
friend class SingletonMixin<FencingStateMachine>;
FencingStateMachine(int hw_timer_nr=2, int tickPeriod=10); // tickPeriod in miliseconds
bool ShouldBlockHitsOnTimerZero();
void SetNextTimerStateAndRoundAndNewTimeOnTimerZero();
void ProcessUW2F();
// private member variables
bool m_Red; //!< Member variable "m_Red"
bool m_Green; //!< Member variable "m_Green"
bool m_WhiteL; //!< Member variable "m_WhiteL"
bool m_OrangeL; //!< Member variable "m_OrangeL"
bool m_OrangeR; //!< Member variable "m_OrangeR"
bool m_StateChanged;
Priority_t m_Priority; //!< Member variable "m_Priority"
int m_YellowCardLeft; //!< Member variable "m_YellowCardLeft"
int m_YellowCardRight; //!< Member variable "m_YellowCardRight"
int m_RedCardLeft; //!< Member variable "m_RedCardLeft"
int m_RedCardRight; //!< Member variable "m_RedCardRight"
int m_BlackCardLeft; //!< Member variable "m_RedCardLeft"
int m_BlackCardRight; //!< Member variable "m_RedCardRight"
int m_YellowPCardLeft; //!< Member variable "m_YellowCardLeft"
int m_YellowPCardRight; //!< Member variable "m_YellowCardRight"
int m_RedPCardLeft; //!< Member variable "m_RedCardLeft"
int m_RedPCardRight; //!< Member variable "m_RedCardRight"
int m_BlackPCardLeft; //!< Member variable "m_RedCardLeft"
int m_BlackPCardRight; //!< Member variable "m_RedCardRight"
int m_PCardLeft = 0;
int m_PCardRight = 0;
unsigned int m_ScoreLeft; //!< Member variable "m_ScoreLeft"
unsigned int m_ScoreRight; //!< Member variable "m_ScoreRight"
weapon_t m_MachineWeapon; //!< Member variable "m_MachineWeapon"
bool m_WeaponChanged = true; //!< Member variable "m_StateChanged"
unsigned char m_Lights = 0;
bool m_LightsChanged = true; //!< Member variable "m_LightsChanged"
TimerState_t m_Timerstate; //!< Member variable "m_Timerstate"
uint32_t m_timeToRearm = 0;
int m_currentRound=1;
int m_nrOfRounds=1;
FencingTimer m_Timer;
UW2FTimer m_UW2FTimer;
long m_UW2FSeconds = 0;
bool m_NoHitsAllowed = false;
hw_timer_t * timer_FSMPeriod = NULL;
MultiWeaponSensor *m_TheSensor = NULL;
long m_NextIdleTime = 0;
bool m_IsConnectedToRemote = false;
long m_TimeToBroadcastFullState = 0;
int m_low_prio_divider = 5;
int m_low_prio_divider_init = 7;
bool m_GlobalIdle = false;
long m_LastLightEventTime = 0;
bool m_GoToSleep = false;
bool m_HasBegun = false;
};
#endif // FENCINGSTATEMACHINE_H