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:
102  this->SetLastMovingPosition(this->IndexOfMovingPosition(inId));
103  this->SetState((ACC_STATE)this->GetMovingPosition(inId));
104  break;
105 
106  case ACCESSORIES_EVENT_MOVEPOSITIONINDEX:
107  this->SetLastMovingPosition(inData);
108  this->SetState((ACC_STATE)this->GetMovingPositionByIndex(inData));
109  break;
110 
111  case ACCESSORIES_EVENT_SETSPEED:
112  this->pPort->SetSpeed(inData);
113  break;
114 
115  case ACCESSORIES_EVENT_EXTERNALMOVE:
116  this->ExternalMove((ACC_STATE)inData);
117  break;
118 
119  default:
120  break;
121  }
122 }
123 
124 void AccessoryMotor::SetState(ACC_STATE inState)
125 {
126  this->SetStateRaw(inState);
127 
128  switch(this->GetState())
129  {
130  case LEFT:
131  this->StartAction();
132  this->pPort->MoveLeftDir();
133  break;
134 
135  case RIGHT:
136  this->StartAction();
137  this->pPort->MoveRightDir();
138  break;
139 
140  default:
141  this->pPort->MoveStop();
142  this->ResetAction();
143  }
144 }
145 
146 void AccessoryMotor::Move(unsigned long inId)
147 {
148  if (this->GetMovingPositionSize() == 1)
149  {
150  this->MoveToggle();
151  return;
152  }
153 
154  int position = this->IndexOfMovingPosition(inId);
155 
156  if (position != -1)
157  this->SetState((ACC_STATE)position);
158 }
159 
161 {
162  this->pPort->MoveStop();
163  this->SetStateRaw(STOP);
164 }
165 
167 {
168  bool end = Accessory::ActionEnded();
169  if (end)
170  {
171  this->MoveStop();
172  }
173 
174  return end;
175 }
176 
177 #ifndef NO_EEPROM
178 int AccessoryMotor::EEPROMLoad(int inPos)
179 {
180  inPos = this->Accessory::EEPROMLoad(inPos);
181 
182  switch (this->GetState())
183  {
184  case LEFT: this->pPort->MoveLeftDir(); break;
185  case RIGHT: this->pPort->MoveRightDir(); break;
186  case STOP: this->pPort->MoveStop(); break;
187  }
188 
189  return inPos;
190 }
191 #endif
192 #endif
int EEPROMLoad(int inPos)
const uint8_t GetMovingPositionSize() const
Definition: Accessory.hpp:323
void Move(unsigned long inId)
virtual void MoveStop()
Definition: Port.hpp:167
void ExternalMove(ACC_STATE inNewState)
int GetMovingPositionByIndex(int inIndex) const
Definition: Accessory.hpp:307
int GetMovingPosition(unsigned long inId) const
Definition: Accessory.cpp:68
void SetLastMovingPosition(uint8_t inLastPositionIndex)
Definition: Accessory.cpp:157
void SetState(ACC_STATE instate)
virtual void ResetAction()
Definition: Accessory.hpp:385
virtual void MoveStop()
virtual void MoveRight(unsigned long inDuration = 0, int inSpeed = 0)
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)
uint8_t IndexOfMovingPosition(unsigned long inId) const
Definition: Accessory.cpp:59
virtual void MoveRightDir(unsigned long inDuration = 0)
Definition: Port.hpp:147
void SetStateRaw(ACC_STATE inNewState)
Definition: Accessory.cpp:165
virtual void MoveLeftDir(unsigned long inDuration = 0)
Definition: Port.hpp:143
virtual void StartAction()
Definition: Accessory.cpp:77
unsigned long GetDuration() const
Definition: Accessory.hpp:254
bool IsActionDelayPending() const
Definition: Accessory.hpp:398
ACC_STATE GetState() const
Definition: Accessory.hpp:209
virtual ACC_STATE MoveToggle(unsigned long inDuration = 0, int inSpeed = 0) = 0
uint8_t AddMovingPosition(unsigned long inId, int inPosition)
Definition: Accessory.cpp:49
virtual bool ActionEnded()
Definition: Accessory.cpp:134
void SetDuration(unsigned long inDuration)
Definition: Accessory.hpp:344
virtual int SetSpeed(int inSpeed)
Definition: Port.cpp:108
virtual int EEPROMLoad(int inPos)
void begin(ACC_STATE inStartingState = STATE_NONE)
Definition: Accessory.hpp:180
ACC_STATE prevState
Definition: Accessory.hpp:170
Port * pPort
Definition: Accessory.hpp:167
Definition: Port.hpp:61
void begin(Port *inpPort, unsigned long inId, int inSpeed, unsigned long inDurationMilli = 0)