Accessories
Arduino for motors and lights library.
Accessory.hpp
1 //-------------------------------------------------------------------
2 #ifndef __accessory_H__
3 #define __accessory_H__
4 //-------------------------------------------------------------------
5 
6 #include "DIO2.h"
7 
8 //-------------------------------------------------------------------
9 
10 #ifndef UNDEFINED_ID
11 
12 #define UNDEFINED_ID ((unsigned long)-1)
13 #endif
14 
15 #ifndef UNDEFINED_POS
16 
17 #define UNDEFINED_POS (-32767)
18 #endif
19 
24 enum ACCESSORIES_MOVE_TYPE
25 {
26  ACCESSORIES_MOVE_MORE = +1,
27  ACCESSORIES_MOVE_LESS = -1,
28  ACCESSORIES_MOVE_STOP = 0,
29  ACCESSORIES_MOVE_LEFT = -2,
30  ACCESSORIES_MOVE_RIGHT = -3,
31  ACCESSORIES_MOVE_CENTER = -4,
32  ACCESSORIES_MOVE_TOP = -5,
33  ACCESSORIES_MOVE_BOTTOM = -6,
34  ACCESSORIES_MOVE_STRAIGHT = -7,
35  ACCESSORIES_MOVE_DIVERGE = -8,
36  ACCESSORIES_MOVE_ON = -9,
37  ACCESSORIES_MOVE_OFF = -10
38 };
39 
44 enum ACCESSORIES_EVENT_TYPE
45 {
46  ACCESSORIES_EVENT_NONE = 0,
47  ACCESSORIES_EVENT_TOGGLE = 1,
48  ACCESSORIES_EVENT_MOVE = 2,
49  ACCESSORIES_EVENT_MOVEPOSITION = 3,
50  ACCESSORIES_EVENT_MOVEPOSITIONINDEX = 4,
51  ACCESSORIES_EVENT_MOVEPOSITIONID = 5,
52  ACCESSORIES_EVENT_CONFIG = 6,
54  ACCESSORIES_EVENT_DIRECTION = 20,
55  ACCESSORIES_EVENT_SETSTARTPOSITION = 21,
56  ACCESSORIES_EVENT_SETSPEED = 22,
57  ACCESSORIES_EVENT_EXTERNALMOVE = 23,
58  ACCESSORIES_EVENT_SETDURATION = 24,
59 };
60 
61 #define ACCESSORIESSCONFIG(address, value) ( ((int)address<<8) | value )
62 #define ACCESSORIESCONFIGADDRESS(data) highByte((int)data)
63 #define ACCESSORIESCONFIGVALUE(data) lowByte((int)data)
64 
67 enum ACC_STATE
68 {
69  STATE_NONE = 0,
70  STATE_FIRST = 1,
71  STATE_SECOND = 2
72 };
73 
76 {
77  unsigned long Id;
78  int Position;
79 };
80 
142 {
143 private:
144  static Accessory *pFirstAccessory;
145  Accessory *pNextAccessory;
146 
147  uint8_t movingPositionsSize;
148  uint8_t movingPositionsAddCounter;
149 
150  // RAM storage for moving positions
151  MovingPosition *pMovingPositions;
152 
153  // Program memory storage for moving positions
154  const MovingPosition *pMovingPositions_P;
155 
156  unsigned long duration;
157  unsigned long startingMillis;
158  uint8_t lastMovingPosition;
159  unsigned int debounceDelay;
160  unsigned long lastMoveTime;
161 
162  ACC_STATE state;
163 
164  static void Add(Accessory *inpAccessory);
165  static Accessory *GetById(unsigned long inId);
166  static bool CanMove(unsigned long inId);
167  bool IsMovementPending();
168  static bool Toggle(unsigned long inId);
169  static bool MovePosition(unsigned long inId);
170 
175  MovingPosition *GetMovingPositionByIndex(uint8_t inIndex, MovingPosition *inPosition) const;
180  MovingPosition *GetMovingPositionById(unsigned long inId, MovingPosition *inPosition) const;
181 
182  bool IsPPointer() const { return this->pMovingPositions_P != NULL; }
183 
184 protected:
188 
190  ACC_STATE prevState;
191 
192 public:
194  Accessory();
195 
200  inline void begin(ACC_STATE inStartingState = STATE_NONE) { this->state = inStartingState; }
201 
205  inline Port *GetPort() const { return this->pPort; }
206 
208  static void ExecuteEvent(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0);
212  static uint8_t GetCount();
213 
217  static bool IsActionPending();
218 
219 #ifdef ACCESSORIES_DEBUG_MODE
220 
223  virtual void CheckPort() const;
224 #endif
225 
229  inline ACC_STATE GetState() const { return this->state; }
230 
235  inline ACC_STATE GetPreviousState() const { return this->prevState; }
236 
240  inline bool IsNone() const { return this->state == STATE_NONE; }
241 
245  inline bool IsFirst() const { return this->state == STATE_FIRST; }
246 
250  inline bool IsSecond() const { return this->state == STATE_SECOND; }
251 
255  inline unsigned int GetDebounceDelay() const { return this->debounceDelay; }
256 
261  inline unsigned long GetLastMoveTime() const { return this->lastMoveTime; }
262 
266  inline unsigned long GetDuration() const { return this->duration; }
267 
271  inline bool loop() { return this->ActionEnded(); }
272 
278  inline virtual void Event(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0) {}
279 
280 public: //but should be protected !
281 #ifndef NO_EEPROM
282 
285  virtual int EEPROMSave(int inPos, bool inSimulate = false);
286 
290  virtual int EEPROMLoad(int inPos);
291 
292 #endif
293 
299  uint8_t AddMovingPosition(unsigned long inId, int inPosition);
300 
305  uint8_t AddMovingPositions(const MovingPosition *inMovingPositions_P);
306 
310  void AdjustMovingPositionsSize(uint8_t inNewSize);
311 
315  inline bool IsEmpty() const { return this->pMovingPositions == NULL && this->pMovingPositions_P == NULL; }
316 
321  uint8_t IndexOfMovingPositionById(unsigned long inId) const;
322 
327  inline int GetMovingPositionValueById(unsigned long inId) const { MovingPosition mp; return this->GetMovingPositionById(inId, &mp)->Position; }
328 
333  inline int GetMovingPositionValueByIndex(uint8_t inIndex) const { MovingPosition mp; return this->GetMovingPositionByIndex(inIndex, &mp)->Position; }
334 
339  inline unsigned long GetMovingPositionIdByIndex(uint8_t inIndex) const { MovingPosition mp; return this->GetMovingPositionByIndex(inIndex, &mp)->Id; }
340 
344  inline const uint8_t GetLastMovingPosition() const { return this->lastMovingPosition; }
345 
349  inline const uint8_t GetMovingPositionSize() const { return this->movingPositionsSize; }
350 
355  void SetLastMovingPosition(uint8_t inLastPositionIndex);
356 
360  inline void SetDebounceDelay(unsigned int inDebounceDelay) { this->debounceDelay = inDebounceDelay; }
361 
365  inline void SetLastMoveTime() { this->lastMoveTime = millis(); }
366 
370  inline void SetDuration(unsigned long inDuration) { this->duration = inDuration; }
371 
376  inline void SetNextAccessory(Accessory *inAccessory) { this->pNextAccessory = inAccessory; }
377 
381  inline static Accessory *GetFirstAccessory() { return pFirstAccessory; }
382 
386  inline Accessory *GetNextAccessory() const { return this->pNextAccessory; }
387 
392  inline unsigned long GetActionStartingMillis() const { return this->startingMillis; }
393 
397  virtual void StartAction();
398 
403  virtual void StartAction(ACC_STATE inState);
404 
405 #ifdef ACCESSORIES_DEBUG_VERBOSE_MODE
406  virtual void ResetAction();
407 #else
408 
411  inline virtual void ResetAction() { this->startingMillis = 0; }
412 #endif
413 
418  virtual bool ActionEnded();
419 
424  inline bool IsActionDelayPending() const { return this->startingMillis > 0; }
425 
430  inline virtual bool IsGroupActionPending() const { return this->IsActionDelayPending(); }
431 
435  virtual void Move(unsigned long inMovingPositionId) = 0;
436 
440  virtual ACC_STATE Toggle() = 0;
441 
445  inline virtual bool CanBePositional() const { return false; }
446 
451  inline virtual void MovePosition(int inPosition) {}
452 
456  inline virtual void SetState(ACC_STATE inNewState) { this->SetStateRaw(inNewState); }
457 
462  void SetStateRaw(ACC_STATE inNewState);
463 
467  inline void SetStartingMillis() { this->startingMillis = millis(); }
468 
472  inline void ResetStartingMillis() { this->startingMillis = 0; }
473 
474 #ifdef ACCESSORIES_PRINT_ACCESSORIES
475 
478  virtual void printAccessory() {
479  if (this->GetPort() != NULL)
480  this->GetPort()->printPort();
481 
482  this->printMovingPositions();
483  }
484 
488  void printMovingPositions();
489 #endif
490 };
491 
492 //-------------------------------------------------------------------
493 #endif
494 //-------------------------------------------------------------------
void SetStartingMillis()
Definition: Accessory.hpp:467
virtual void MovePosition(int inPosition)
Definition: Accessory.hpp:451
virtual bool CanBePositional() const
Definition: Accessory.hpp:445
virtual void Move(unsigned long inMovingPositionId) = 0
virtual bool IsGroupActionPending() const
Definition: Accessory.hpp:430
static uint8_t GetCount()
Definition: Accessory.cpp:294
unsigned long Id
Definition: Accessory.hpp:77
Accessory * GetNextAccessory() const
Definition: Accessory.hpp:386
unsigned long GetMovingPositionIdByIndex(uint8_t inIndex) const
Definition: Accessory.hpp:339
virtual void SetState(ACC_STATE inNewState)
Definition: Accessory.hpp:456
Definition: Port.hpp:60
ACC_STATE prevState
Definition: Accessory.hpp:190
Port * pPort
Definition: Accessory.hpp:187
bool IsActionDelayPending() const
Definition: Accessory.hpp:424
Port * GetPort() const
Definition: Accessory.hpp:205
ACC_STATE GetState() const
Definition: Accessory.hpp:229
static void ExecuteEvent(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
Definition: Accessory.cpp:462
virtual int EEPROMSave(int inPos, bool inSimulate = false)
int GetMovingPositionValueById(unsigned long inId) const
Definition: Accessory.hpp:327
void SetDebounceDelay(unsigned int inDebounceDelay)
Definition: Accessory.hpp:360
void SetLastMoveTime()
Definition: Accessory.hpp:365
static bool IsActionPending()
Definition: Accessory.cpp:321
void SetStateRaw(ACC_STATE inNewState)
Definition: Accessory.cpp:224
ACC_STATE GetPreviousState() const
Definition: Accessory.hpp:235
virtual void ResetAction()
Definition: Accessory.hpp:411
void SetLastMovingPosition(uint8_t inLastPositionIndex)
Definition: Accessory.cpp:216
void begin(ACC_STATE inStartingState = STATE_NONE)
Definition: Accessory.hpp:200
bool IsFirst() const
Definition: Accessory.hpp:245
bool IsSecond() const
Definition: Accessory.hpp:250
virtual void Event(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
Definition: Accessory.hpp:278
unsigned int GetDebounceDelay() const
Definition: Accessory.hpp:255
unsigned long GetLastMoveTime() const
Definition: Accessory.hpp:261
virtual int EEPROMLoad(int inPos)
virtual ACC_STATE Toggle() = 0
unsigned long GetDuration() const
Definition: Accessory.hpp:266
bool loop()
Definition: Accessory.hpp:271
uint8_t AddMovingPosition(unsigned long inId, int inPosition)
Definition: Accessory.cpp:58
uint8_t AddMovingPositions(const MovingPosition *inMovingPositions_P)
Definition: Accessory.cpp:69
void AdjustMovingPositionsSize(uint8_t inNewSize)
Definition: Accessory.cpp:31
bool IsEmpty() const
Definition: Accessory.hpp:315
uint8_t IndexOfMovingPositionById(unsigned long inId) const
Definition: Accessory.cpp:95
int GetMovingPositionValueByIndex(uint8_t inIndex) const
Definition: Accessory.hpp:333
const uint8_t GetLastMovingPosition() const
Definition: Accessory.hpp:344
bool IsNone() const
Definition: Accessory.hpp:240
const uint8_t GetMovingPositionSize() const
Definition: Accessory.hpp:349
virtual bool ActionEnded()
Definition: Accessory.cpp:193
void SetDuration(unsigned long inDuration)
Definition: Accessory.hpp:370
void ResetStartingMillis()
Definition: Accessory.hpp:472
void SetNextAccessory(Accessory *inAccessory)
Definition: Accessory.hpp:376
static Accessory * GetFirstAccessory()
Definition: Accessory.hpp:381
unsigned long GetActionStartingMillis() const
Definition: Accessory.hpp:392
virtual void StartAction()
Definition: Accessory.cpp:136