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 };
59 
60 #define ACCESSORIESSCONFIG(address, value) ( ((int)address<<8) | value )
61 #define ACCESSORIESCONFIGADDRESS(data) highByte((int)data)
62 #define ACCESSORIESCONFIGVALUE(data) lowByte((int)data)
63 
66 enum ACC_STATE
67 {
68  STATE_NONE = 0,
69  STATE_FIRST = 1,
70  STATE_SECOND = 2
71 };
72 
75 {
76  unsigned long Id;
77  int Position;
78 };
79 
141 {
142 private:
143  static Accessory *pFirstAccessory;
144  Accessory *pNextAccessory;
145 
146  uint8_t movingPositionsSize;
147  uint8_t movingPositionsAddCounter;
148  MovingPosition *pMovingPositions;
149 
150  unsigned long duration;
151  unsigned long startingMillis;
152  uint8_t lastMovingPosition;
153  unsigned int debounceDelay;
154  unsigned long lastMoveTime;
155 
156  ACC_STATE state;
157 
158  static void Add(Accessory *inpAccessory);
159  static Accessory *GetById(unsigned long inId);
160  static bool CanMove(unsigned long inId);
161  static bool Toggle(unsigned long inId);
162  static bool MovePosition(unsigned long inId);
163 
164 protected:
168 
170  ACC_STATE prevState;
171 
172 public:
174  Accessory();
175 
180  inline void begin(ACC_STATE inStartingState = STATE_NONE) { this->state = inStartingState; }
181 
185  inline Port *GetPort() const { return this->pPort; }
186 
188  static void ExecuteEvent(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0);
192  static uint8_t GetCount();
193 
197  static bool IsActionPending();
198 
199 #ifdef ACCESSORIES_DEBUG_MODE
200 
203  virtual void CheckPort() const;
204 #endif
205 
209  inline ACC_STATE GetState() const { return this->state; }
210 
215  inline ACC_STATE GetPreviousState() const { return this->prevState; }
216 
220  inline bool IsNone() const { return this->state == STATE_NONE; }
221 
225  inline bool IsFirst() const { return this->state == STATE_FIRST; }
226 
230  inline bool IsSecond() const { return this->state == STATE_SECOND; }
231 
238  uint8_t AddMovingPosition(unsigned long inId, int inPosition);
239 
243  inline unsigned int GetDebounceDelay() const { return this->debounceDelay; }
244 
249  inline unsigned long GetLastMoveTime() const { return this->lastMoveTime; }
250 
254  inline unsigned long GetDuration() const { return this->duration; }
255 
259  inline bool loop() { return this->ActionEnded(); }
260 
266  inline virtual void Event(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0) {}
267 
268 public: //but should be protected !
269 #ifndef NO_EEPROM
270 
273  virtual int EEPROMSave(int inPos, bool inSimulate = false);
274 
278  virtual int EEPROMLoad(int inPos);
279 
280 #endif
281 
284  void AdjustMovingPositionsSize(uint8_t inNewSize);
285 
289  inline bool IsEmpty() const { return this->pMovingPositions == NULL; }
290 
295  uint8_t IndexOfMovingPosition(unsigned long inId) const;
296 
301  int GetMovingPosition(unsigned long inId) const;
302 
307  inline int GetMovingPositionByIndex(int inIndex) const { return this->pMovingPositions[inIndex].Position; }
308 
313  inline unsigned long GetMovingPositionIdByIndex(int inIndex) const { return this->pMovingPositions[inIndex].Id; }
314 
318  inline const uint8_t GetLastMovingPosition() const { return this->lastMovingPosition; }
319 
323  inline const uint8_t GetMovingPositionSize() const { return this->movingPositionsSize; }
324 
329  void SetLastMovingPosition(uint8_t inLastPositionIndex);
330 
334  inline void SetDebounceDelay(unsigned int inDebounceDelay) { this->debounceDelay = inDebounceDelay; }
335 
339  inline void SetLastMoveTime() { this->lastMoveTime = millis(); }
340 
344  inline void SetDuration(unsigned long inDuration) { this->duration = inDuration; }
345 
350  inline void SetNextAccessory(Accessory *inAccessory) { this->pNextAccessory = inAccessory; }
351 
355  inline static Accessory *GetFirstAccessory() { return pFirstAccessory; }
356 
360  inline Accessory *GetNextAccessory() const { return this->pNextAccessory; }
361 
366  inline unsigned long GetActionStartingMillis() const { return this->startingMillis; }
367 
371  virtual void StartAction();
372 
377  virtual void StartAction(ACC_STATE inState);
378 
379 #ifdef ACCESSORIES_DEBUG_VERBOSE_MODE
380  virtual void ResetAction();
381 #else
382 
385  inline virtual void ResetAction() { this->startingMillis = 0; }
386 #endif
387 
392  virtual bool ActionEnded();
393 
398  inline bool IsActionDelayPending() const { return this->startingMillis > 0; }
399 
404  inline virtual bool IsGroupActionPending() const { return this->IsActionDelayPending(); }
405 
409  virtual void Move(unsigned long inMovingPositionId) = 0;
410 
414  virtual ACC_STATE Toggle() = 0;
415 
419  inline virtual bool CanBePositional() const { return false; }
420 
425  inline virtual void MovePosition(int inPosition) {}
426 
430  inline virtual void SetState(ACC_STATE inNewState) { this->SetStateRaw(inNewState); }
431 
436  void SetStateRaw(ACC_STATE inNewState);
437 
441  inline void SetStartingMillis() { this->startingMillis = millis(); }
442 
446  inline void ResetStartingMillis() { this->startingMillis = 0; }
447 
448 #ifdef ACCESSORIES_PRINT_ACCESSORIES
449 
452  virtual void printAccessory() {
453  if (this->GetPort() != NULL)
454  this->GetPort()->printPort();
455 
456  this->printMovingPositions();
457  }
458 
462  void Accessory::printMovingPositions();
463 #endif
464 };
465 
466 //-------------------------------------------------------------------
467 #endif
468 //-------------------------------------------------------------------
void SetStartingMillis()
Definition: Accessory.hpp:441
virtual void SetState(ACC_STATE inNewState)
Definition: Accessory.hpp:430
virtual void MovePosition(int inPosition)
Definition: Accessory.hpp:425
virtual bool CanBePositional() const
Definition: Accessory.hpp:419
virtual void Move(unsigned long inMovingPositionId) = 0
virtual bool IsGroupActionPending() const
Definition: Accessory.hpp:404
unsigned long GetActionStartingMillis() const
Definition: Accessory.hpp:366
ACC_STATE GetState() const
Definition: Accessory.hpp:209
bool IsActionDelayPending() const
Definition: Accessory.hpp:398
Port * GetPort() const
Definition: Accessory.hpp:185
bool IsEmpty() const
Definition: Accessory.hpp:289
uint8_t AddMovingPosition(unsigned long inId, int inPosition)
Definition: Accessory.cpp:49
virtual ACC_STATE Toggle() = 0
Definition: Port.hpp:61
virtual int EEPROMLoad(int inPos)
Port * pPort
Definition: Accessory.hpp:167
ACC_STATE prevState
Definition: Accessory.hpp:170
static void ExecuteEvent(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
Definition: Accessory.cpp:388
virtual int EEPROMSave(int inPos, bool inSimulate = false)
unsigned long GetDuration() const
Definition: Accessory.hpp:254
unsigned long Id
Definition: Accessory.hpp:76
void SetDebounceDelay(unsigned int inDebounceDelay)
Definition: Accessory.hpp:334
void SetLastMoveTime()
Definition: Accessory.hpp:339
static uint8_t GetCount()
Definition: Accessory.cpp:233
virtual void ResetAction()
Definition: Accessory.hpp:385
static bool IsActionPending()
Definition: Accessory.cpp:260
void begin(ACC_STATE inStartingState = STATE_NONE)
Definition: Accessory.hpp:180
bool IsFirst() const
Definition: Accessory.hpp:225
bool IsSecond() const
Definition: Accessory.hpp:230
virtual void Event(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
Definition: Accessory.hpp:266
unsigned long GetLastMoveTime() const
Definition: Accessory.hpp:249
unsigned int GetDebounceDelay() const
Definition: Accessory.hpp:243
bool loop()
Definition: Accessory.hpp:259
uint8_t IndexOfMovingPosition(unsigned long inId) const
Definition: Accessory.cpp:59
void AdjustMovingPositionsSize(uint8_t inNewSize)
Definition: Accessory.cpp:29
int GetMovingPosition(unsigned long inId) const
Definition: Accessory.cpp:68
int GetMovingPositionByIndex(int inIndex) const
Definition: Accessory.hpp:307
void SetStateRaw(ACC_STATE inNewState)
Definition: Accessory.cpp:165
ACC_STATE GetPreviousState() const
Definition: Accessory.hpp:215
unsigned long GetMovingPositionIdByIndex(int inIndex) const
Definition: Accessory.hpp:313
const uint8_t GetLastMovingPosition() const
Definition: Accessory.hpp:318
bool IsNone() const
Definition: Accessory.hpp:220
const uint8_t GetMovingPositionSize() const
Definition: Accessory.hpp:323
void SetLastMovingPosition(uint8_t inLastPositionIndex)
Definition: Accessory.cpp:157
virtual void StartAction()
Definition: Accessory.cpp:77
virtual bool ActionEnded()
Definition: Accessory.cpp:134
void SetDuration(unsigned long inDuration)
Definition: Accessory.hpp:344
void ResetStartingMillis()
Definition: Accessory.hpp:446
void SetNextAccessory(Accessory *inAccessory)
Definition: Accessory.hpp:350
static Accessory * GetFirstAccessory()
Definition: Accessory.hpp:355
Accessory * GetNextAccessory() const
Definition: Accessory.hpp:360