Accessories
Arduino for motors and lights library.
AccessoryStepper.cpp
1 /*************************************************************
2 project: <Accessories>
3 author: <Thierry PARIS>
4 description: <Class for a stepper motor accessory>
5 *************************************************************/
6 
7 // A stepper motor moves only in relative move. So the current position is the last MovingPosition called.
8 
9 #include "Accessories.h"
10 
11 #ifndef NO_STEPPER
12 
14 {
15  this->pPort = NULL;
16 }
17 
18 void AccessoryStepper::begin(Port *inpPort, int inStepsNumber, int inReduction, unsigned int inSpeed, int inMovingPositionsNumber)
19 {
20  this->pPort = inpPort;
21 
22  ((PortStepper *) this->pPort)->SetSpeed(inSpeed);
23 
24  Accessory::begin(STATE_NONE);
25  this->prevState = STATE_NONE;
26  this->stepsNumber = inStepsNumber;
27  this->reduction = inReduction;
28  this->angleByStep = 360. / inStepsNumber / inReduction;
29  this->AdjustMovingPositionsSize(inMovingPositionsNumber);
30 }
31 
33 {
34  if (this->IsActionDelayPending())
35  return this->GetState();
36 
37 #ifdef ACCESSORIES_DEBUG_MODE
38  Serial.print(F("AccessoryStepper MoveToggle() : "));
39 #endif
40 
41  int pos = this->GetLastMovingPosition() + 1;
42  if (this->GetLastMovingPosition() == 255)
43  pos = 0;
44  if (pos >= this->GetMovingPositionSize())
45  pos = 0;
46 
47  this->Move(this->GetMovingPositionIdByIndex(pos));
48 
49  return this->GetState();
50 }
51 
52 void AccessoryStepper::Move(unsigned long inId)
53 {
54 #ifdef ACCESSORIES_DEBUG_MODE
55  Serial.println(F("AccessoryStepper Move()"));
56 #endif
57 
58  if (this->GetMovingPositionSize() == 1)
59  {
60  this->MoveToggle();
61  return;
62  }
63 
65  this->MovePosition(this->GetMovingPositionValueById(inId));
66 }
67 
68 void AccessoryStepper::MovePosition(int inAbsolutePosition)
69 {
70  if (this->IsActionDelayPending())
71  return;
72 
73 #ifdef ACCESSORIES_DEBUG_MODE
74  Serial.print(F(" AccessoryStepper MovePosition() to: "));
75  Serial.println(inAbsolutePosition);
76 #endif
77 
78  this->pPort->MovePosition(0, inAbsolutePosition);
79 }
80 
81 void AccessoryStepper::MoveRelativePosition(int inRelativePosition)
82 {
83  if (this->IsActionDelayPending())
84  return;
85 
86 #ifdef ACCESSORIES_DEBUG_MODE
87  Serial.print(F(" AccessoryStepper MoveRelativePosition() for "));
88  Serial.print(inRelativePosition);
89  Serial.print(F(" steps."));
90 #endif
91 
92  ((PortStepper *)this->pPort)->MoveRelativePosition(0, inRelativePosition);
93 }
94 
95 void AccessoryStepper::Event(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent, int inData)
96 {
97  switch (inEvent)
98  {
99  case ACCESSORIES_EVENT_TOGGLE:
100  this->MoveToggle();
101  break;
102 
103  case ACCESSORIES_EVENT_MOVE:
104  switch (inData)
105  {
106  case ACCESSORIES_MOVE_STRAIGHT:
107  case ACCESSORIES_MOVE_TOP:
108  case ACCESSORIES_MOVE_LEFT:
109  case ACCESSORIES_MOVE_DIVERGE:
110  case ACCESSORIES_MOVE_BOTTOM:
111  case ACCESSORIES_MOVE_RIGHT:
112  case ACCESSORIES_MOVE_OFF:
113  case ACCESSORIES_MOVE_STOP:
114  this->pPort->MoveStop();
115  this->ResetAction();
116  this->SetStateRaw(STATE_NONE);
117  break;
118  case ACCESSORIES_MOVE_MORE:
119  case ACCESSORIES_MOVE_LESS:
120  if (this->GetState() == CALIBRATION)
121  this->MoveRelativePosition(inData);
122  else
123  {
124  int pos = this->GetLastMovingPosition() + inData;
125  if (pos < 0)
126  pos = 0;
127  if (pos >= this->GetMovingPositionSize())
128  pos = this->GetMovingPositionSize() - 1;
129 
130  this->Move(this->GetMovingPositionIdByIndex(pos));
131  }
132  break;
133  }
134  break;
135 
136  case ACCESSORIES_EVENT_MOVEPOSITION:
137  this->MovePosition(inData); // absolute movement
138  break;
139 
140  case ACCESSORIES_EVENT_MOVEPOSITIONID:
141  this->Move(inId);
142  break;
143 
144  case ACCESSORIES_EVENT_MOVEPOSITIONINDEX:
145  this->Move(this->GetMovingPositionIdByIndex(inData));
146  break;
147 
148  case ACCESSORIES_EVENT_SETSPEED:
149  this->pPort->SetSpeed(inData);
150  break;
151 
152  case ACCESSORIES_EVENT_SETDURATION:
153  this->SetDuration(inData);
154  break;
155 
156  default:
157  break;
158  }
159 }
160 
161 bool AccessoryStepper::ActionEnded()
162 {
163  PortStepper *pStepper = (PortStepper *) this->pPort;
164 
165  if (pStepper->targetPosition() == pStepper->currentPosition())
166  return true;
167 
168  pStepper->run();
169 
170  if (pStepper->targetPosition() == pStepper->currentPosition())
171  {
172  this->pPort->MoveStop();
173  this->SetStateRaw(STATE_NONE);
174 
175 #ifdef ACCESSORIES_DEBUG_MODE
176  Serial.print(F(" AccessoryStepper end of movement. Pos : "));
177  Serial.println(((PortStepper *) this->pPort)->currentPosition());
178 #endif
179  }
180 
181  return false;
182 }
183 
184 #ifdef ACCESSORIES_PRINT_ACCESSORIES
185 void AccessoryStepper::printAccessory()
186 {
187  Serial.print(F(" Stepper : "));
188  for (int i = 0; i < this->GetMovingPositionSize(); i++)
189  {
190  Serial.print(F(" / ID "));
191  Serial.print(this->GetMovingPositionIdByIndex(i));
192  Serial.print(F(" - pos "));
193  Serial.print(this->GetMovingPositionValueByIndex(i));
194  }
195 
196  Serial.print(F(" / StepsNumber "));
197  Serial.print(this->stepsNumber);
198  Serial.print(F(" / Reduction "));
199  Serial.print(this->reduction);
200  if (this->GetPort() != NULL)
201  {
202  Serial.print(F(" / Speed: "));
203  Serial.print(this->GetPort()->GetSpeed());
204  }
205  Serial.print(F(" / Delay: "));
206  Serial.print(this->GetDebounceDelay());
207  Serial.print(F(" / "));
208  if (this->GetPort() != NULL)
209  this->GetPort()->printPort();
210  Serial.println(F(" "));
211 }
212 #endif
213 #endif
unsigned int GetDebounceDelay() const
Definition: Accessory.hpp:255
Port * GetPort() const
Definition: Accessory.hpp:205
long currentPosition()
Definition: PortStepper.hpp:83
long targetPosition()
Definition: PortStepper.hpp:87
void SetDuration(unsigned long inDuration)
Definition: Accessory.hpp:370
void SetStateRaw(ACC_STATE inNewState)
Definition: Accessory.cpp:224
virtual void MoveStop()
Definition: Port.hpp:177
void Event(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONINDEX, int inData = 0)
int GetMovingPositionValueById(unsigned long inId) const
Definition: Accessory.hpp:327
void MovePosition(int inAbsolutePosition)
uint8_t IndexOfMovingPositionById(unsigned long inId) const
Definition: Accessory.cpp:95
virtual void ResetAction()
Definition: Accessory.hpp:411
void SetLastMovingPosition(uint8_t inLastPositionIndex)
Definition: Accessory.cpp:216
void MoveRelativePosition(int inRelativePosition)
unsigned long GetMovingPositionIdByIndex(uint8_t inIndex) const
Definition: Accessory.hpp:339
void Move(unsigned long inId)
const uint8_t GetMovingPositionSize() const
Definition: Accessory.hpp:349
ACC_STATE GetState() const
Definition: Accessory.hpp:229
bool IsActionDelayPending() const
Definition: Accessory.hpp:424
ACC_STATE MoveToggle()
void begin(ACC_STATE inStartingState = STATE_NONE)
Definition: Accessory.hpp:200
virtual int SetSpeed(int inSpeed)
Definition: Port.cpp:181
const uint8_t GetLastMovingPosition() const
Definition: Accessory.hpp:344
Definition: Port.hpp:60
void AdjustMovingPositionsSize(uint8_t inNewSize)
Definition: Accessory.cpp:31
void begin(Port *inpPort, int inStepsNumber, int inReduction, unsigned int inSpeed = 0, int inMovingPositionsNumber = 1)
ACC_STATE prevState
Definition: Accessory.hpp:190
Port * pPort
Definition: Accessory.hpp:187
int GetMovingPositionValueByIndex(uint8_t inIndex) const
Definition: Accessory.hpp:333
virtual void MovePosition(unsigned long inDuration, int inEndPosition)
Definition: Port.hpp:183