Accessories
Arduino for motors and lights library.
AccessoryMotor.cpp
1 /*************************************************************
2 project: <Accessories>
3 author: <Thierry PARIS>
4 description: <Class for a motorized accessory>
5 *************************************************************/
6 
7 #include "Accessories.h"
8 
9 #ifndef NO_MOTOR
10 
12 {
13 }
14 
15 void AccessoryMotor::begin(Port *inpPort, unsigned long inId, int inSpeed, unsigned long inDurationMilli)
16 {
17  this->pPort = inpPort;
18  Accessory::begin(STOP);
19  this->pPort->SetSpeed(inSpeed);
20  this->SetDuration(inDurationMilli);
21  this->prevState = STOP;
22  this->AddMovingPosition(inId, RIGHT);
23 }
24 
25 ACC_STATE AccessoryMotor::MoveToggle(unsigned long inDuration, int inSpeed)
26 {
27  if (this->prevState == LEFT)
28  this->InternalMove(RIGHT, inDuration, inSpeed);
29  else
30  this->InternalMove(LEFT, inDuration, inSpeed);
31 
32  return this->GetState();
33 }
34 
35 ACC_STATE AccessoryMotor::InternalMove(ACC_STATE inStateToReach, unsigned long inDuration, int inSpeed)
36 {
37  if (this->IsActionDelayPending())
38  return this->GetState();
39 
40  unsigned long duration = inDuration == 0 ? this->GetDuration() : inDuration;
41  if (duration > 0)
42  StartAction();
43 
44  if (inSpeed > 0)
45  this->pPort->SetSpeed(inSpeed);
46  if (inStateToReach == RIGHT)
47  {
48 #ifdef ACCESSORIES_DEBUG_MODE
49  Serial.println(F("AccessoryMotor InternalMove() RIGHT"));
50 #endif
51  this->pPort->MoveLeftDir();
52  this->SetStateRaw(RIGHT);
53  }
54  else
55  {
56 #ifdef ACCESSORIES_DEBUG_MODE
57  Serial.println(F("AccessoryMotor InternalMove() LEFT"));
58 #endif
59  this->pPort->MoveRightDir();
60  this->SetStateRaw(LEFT);
61  }
62 
63  this->prevState = this->GetState();
64 
65  return this->GetState();
66 }
67 
68 void AccessoryMotor::Event(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent, int inData)
69 {
70  switch (inEvent)
71  {
72  case ACCESSORIES_EVENT_TOGGLE:
73  this->MoveToggle();
74  break;
75 
76  case ACCESSORIES_EVENT_MOVE:
77  switch (inData)
78  {
79  case ACCESSORIES_MOVE_STRAIGHT:
80  case ACCESSORIES_MOVE_TOP:
81  case ACCESSORIES_MOVE_LEFT:
82  this->MoveLeft();
83  break;
84  case ACCESSORIES_MOVE_DIVERGE:
85  case ACCESSORIES_MOVE_BOTTOM:
86  case ACCESSORIES_MOVE_RIGHT:
87  this->MoveRight();
88  break;
89  case ACCESSORIES_MOVE_OFF:
90  case ACCESSORIES_MOVE_STOP:
91  this->MoveStop();
92  this->ResetAction();
93  break;
94  }
95  break;
96 
97  case ACCESSORIES_EVENT_MOVEPOSITION:
98  this->SetState((ACC_STATE) inData);
99  break;
100 
101  case ACCESSORIES_EVENT_MOVEPOSITIONID:
103  this->SetState((ACC_STATE)this->GetMovingPositionValueById(inId));
104  break;
105 
106  case ACCESSORIES_EVENT_MOVEPOSITIONINDEX:
107  this->SetLastMovingPosition(inData);
108  this->SetState((ACC_STATE)this->GetMovingPositionValueByIndex(inData));
109  break;
110 
111  case ACCESSORIES_EVENT_SETSPEED:
112  this->pPort->SetSpeed(inData);
113  break;
114 
115  case ACCESSORIES_EVENT_SETDURATION:
116  this->SetDuration(inData);
117  break;
118 
119  case ACCESSORIES_EVENT_EXTERNALMOVE:
120  this->ExternalMove((ACC_STATE)inData);
121  break;
122 
123  default:
124  break;
125  }
126 }
127 
128 void AccessoryMotor::SetState(ACC_STATE inState)
129 {
130  this->SetStateRaw(inState);
131 
132  switch(this->GetState())
133  {
134  case LEFT:
135  this->StartAction();
136  this->pPort->MoveLeftDir();
137  break;
138 
139  case RIGHT:
140  this->StartAction();
141  this->pPort->MoveRightDir();
142  break;
143 
144  default:
145  this->pPort->MoveStop();
146  this->ResetAction();
147  }
148 }
149 
150 void AccessoryMotor::Move(unsigned long inId)
151 {
152  if (this->GetMovingPositionSize() == 1)
153  {
154  this->MoveToggle();
155  return;
156  }
157 
158  int position = this->IndexOfMovingPositionById(inId);
159 
160  if (position != -1)
161  this->SetState((ACC_STATE)position);
162 }
163 
165 {
166  this->pPort->MoveStop();
167  this->SetStateRaw(STOP);
168 }
169 
171 {
172  bool end = Accessory::ActionEnded();
173  if (end)
174  {
175  this->MoveStop();
176  }
177 
178  return end;
179 }
180 
181 #ifndef NO_EEPROM
182 int AccessoryMotor::EEPROMLoad(int inPos)
183 {
184  inPos = this->Accessory::EEPROMLoad(inPos);
185 
186  switch (this->GetState())
187  {
188  case LEFT: this->pPort->MoveLeftDir(); break;
189  case RIGHT: this->pPort->MoveRightDir(); break;
190  case STOP: this->pPort->MoveStop(); break;
191  }
192 
193  return inPos;
194 }
195 #endif
196 #endif
int EEPROMLoad(int inPos)
const uint8_t GetMovingPositionSize() const
Definition: Accessory.hpp:349
void Move(unsigned long inId)
void ExternalMove(ACC_STATE inNewState)
int GetMovingPositionValueByIndex(uint8_t inIndex) const
Definition: Accessory.hpp:333
virtual void MoveStop()
Definition: Port.hpp:177
int GetMovingPositionValueById(unsigned long inId) const
Definition: Accessory.hpp:327
uint8_t IndexOfMovingPositionById(unsigned long inId) const
Definition: Accessory.cpp:95
void SetState(ACC_STATE instate)
void SetLastMovingPosition(uint8_t inLastPositionIndex)
Definition: Accessory.cpp:216
virtual void ResetAction()
Definition: Accessory.hpp:411
virtual void MoveStop()
virtual void MoveLeft(unsigned long inDuration = 0, int inSpeed = 0)
void Event(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
virtual void MoveRightDir(unsigned long inDuration = 0)
Definition: Port.hpp:157
virtual void MoveRight(unsigned long inDuration = 0, int inSpeed = 0)
virtual void MoveLeftDir(unsigned long inDuration = 0)
Definition: Port.hpp:153
virtual void StartAction()
Definition: Accessory.cpp:136
bool IsActionDelayPending() const
Definition: Accessory.hpp:424
ACC_STATE GetState() const
Definition: Accessory.hpp:229
virtual ACC_STATE MoveToggle(unsigned long inDuration = 0, int inSpeed = 0) = 0
uint8_t AddMovingPosition(unsigned long inId, int inPosition)
Definition: Accessory.cpp:58
virtual bool ActionEnded()
Definition: Accessory.cpp:193
void SetDuration(unsigned long inDuration)
Definition: Accessory.hpp:370
unsigned long GetDuration() const
Definition: Accessory.hpp:266
virtual int SetSpeed(int inSpeed)
Definition: Port.cpp:190
virtual int EEPROMLoad(int inPos)
void begin(ACC_STATE inStartingState = STATE_NONE)
Definition: Accessory.hpp:200
void SetStateRaw(ACC_STATE inNewState)
Definition: Accessory.cpp:224
ACC_STATE prevState
Definition: Accessory.hpp:190
Port * pPort
Definition: Accessory.hpp:187
Definition: Port.hpp:60
void begin(Port *inpPort, unsigned long inId, int inSpeed, unsigned long inDurationMilli = 0)