10 #include "ActionsStack.hpp" 15 this->minimumPosition = 0;
16 this->maximumPosition = 180;
17 this->powerState = PowerNoAction;
21 int inMinimumPosition,
int inMaximumPosition,
int inMovingPositionsNumber)
23 this->
pPort = inpPort;
27 this->minimumPosition = inMinimumPosition;
28 this->maximumPosition = inMaximumPosition;
32 this->currentPosition = this->minimumPosition;
33 this->targetPosition = -1;
34 this->targetSpeed = 0;
35 this->powerCommandPin = (GPIO_pin_t)DP_INVALID;
37 this->powerState = PowerNoAction;
43 this->powerCommandPin = Arduino_to_GPIO_pin(inPin);
45 pinMode2f(this->powerCommandPin, OUTPUT);
46 digitalWrite2f(this->powerCommandPin, HIGH);
48 this->powerDelay = inDelay;
53 #ifdef ACCESSORIES_DEBUG_MODE 54 Serial.println(F(
"AccessoryServo MoveMinimum()"));
62 #ifdef ACCESSORIES_DEBUG_MODE 63 Serial.println(F(
"AccessoryServo MoveMaximum()"));
74 #ifdef ACCESSORIES_DEBUG_MODE 75 Serial.print(F(
"AccessoryServo MoveToggle() : "));
86 void AccessoryServo::SetState(ACC_STATE inState)
88 #ifdef ACCESSORIES_DEBUG_MODE 89 Serial.print(F(
"AccessoryServo SetState("));
95 #ifdef ACCESSORIES_DEBUG_MODE 96 Serial.println(F(
"MINIMUM)"));
102 #ifdef ACCESSORIES_DEBUG_MODE 103 Serial.println(F(
"MAXIMUM)"));
115 #ifdef ACCESSORIES_DEBUG_MODE 116 Serial.println(F(
"AccessoryServo Move()"));
128 if (position == MINIMUM || position == MAXIMUM)
129 this->SetState((ACC_STATE)position);
139 this->InternalMovePosition(inPosition);
146 case ACCESSORIES_EVENT_TOGGLE:
150 case ACCESSORIES_EVENT_MOVE:
153 case ACCESSORIES_MOVE_STRAIGHT:
154 case ACCESSORIES_MOVE_TOP:
155 case ACCESSORIES_MOVE_LEFT:
158 case ACCESSORIES_MOVE_DIVERGE:
159 case ACCESSORIES_MOVE_BOTTOM:
160 case ACCESSORIES_MOVE_RIGHT:
163 case ACCESSORIES_MOVE_OFF:
164 case ACCESSORIES_MOVE_STOP:
169 case ACCESSORIES_MOVE_MORE:
170 case ACCESSORIES_MOVE_LESS:
172 int pos = this->currentPosition + inData;
173 if (pos > this->maximumPosition)
174 pos = this->maximumPosition;
175 if (pos < this->minimumPosition)
176 pos = this->minimumPosition;
183 case ACCESSORIES_EVENT_MOVEPOSITION:
187 case ACCESSORIES_EVENT_MOVEPOSITIONID:
191 case ACCESSORIES_EVENT_MOVEPOSITIONINDEX:
195 case ACCESSORIES_EVENT_SETSPEED:
204 void AccessoryServo::InternalMovePosition(
int inPosition)
206 if (this->currentPosition == inPosition)
208 #ifdef ACCESSORIES_DEBUG_MODE 209 Serial.println(F(
"AccessoryServo::MovePosition : same position - no move!"));
214 #ifdef ACCESSORIES_DEBUG_MODE 215 Serial.println(F(
"AccessoryServo InternalMovePosition()"));
224 this->currentPosition = inPosition;
228 for (
int pos = this->currentPosition; pos < inPosition; pos++)
230 this->currentPosition = inPosition;
233 case ServoActionStack:
235 this->targetPosition = inPosition;
236 this->targetSpeed = (this->currentPosition < this->targetPosition) ? 1 : -1;
242 this->targetPosition = inPosition;
243 this->targetSpeed = (this->currentPosition < this->targetPosition) ? 1 : -1;
247 if (inPosition == this->minimumPosition)
253 if (inPosition == this->maximumPosition)
265 bool AccessoryServo::ActionEnded()
270 if (this->powerCommandPin == DP_INVALID || this->powerState == PowerRunning)
274 if (this->targetSpeed == 0)
277 this->targetPosition = -1;
279 if (this->powerState == PowerRunning && this->powerCommandPin != DP_INVALID)
281 #ifdef ACCESSORIES_DEBUG_MODE 282 Serial.println(F(
"AccessoryServo after running"));
284 this->powerState = PowerAfterRunning;
293 this->currentPosition += this->targetSpeed;
296 if (this->targetPosition == this->currentPosition)
298 this->targetPosition = -1;
299 this->targetSpeed = 0;
301 if (this->powerState == PowerRunning && this->powerCommandPin != DP_INVALID)
303 #ifdef ACCESSORIES_DEBUG_MODE 304 Serial.println(F(
"AccessoryServo after running"));
306 this->powerState = PowerAfterRunning;
318 if (this->powerState == PowerNoAction)
320 #ifdef ACCESSORIES_DEBUG_MODE 321 Serial.println(F(
"AccessoryServo start power command"));
323 digitalWrite2f(this->powerCommandPin, LOW);
324 this->powerState = PowerBeforeRunning;
332 if (this->powerState == PowerBeforeRunning)
334 #ifdef ACCESSORIES_DEBUG_MODE 335 Serial.println(F(
"AccessoryServo running"));
337 this->powerState = PowerRunning;
342 if (this->powerState == PowerAfterRunning)
344 #ifdef ACCESSORIES_DEBUG_MODE 345 Serial.println(F(
"AccessoryServo end running"));
347 this->powerState = PowerNoAction;
348 digitalWrite2f(this->powerCommandPin, HIGH);
365 return ServoActionStack;
374 if (this->powerCommandPin != DP_INVALID)
375 digitalWrite2f(this->powerCommandPin, HIGH);
378 if (this->powerCommandPin != DP_INVALID)
379 digitalWrite2f(this->powerCommandPin, LOW);
385 #ifdef ACCESSORIES_PRINT_ACCESSORIES 386 void AccessoryServo::printAccessory()
388 Serial.print(F(
" Servo : "));
391 Serial.print(F(
" / ID "));
393 Serial.print(F(
" - "));
399 Serial.print(F(
" / Speed "));
400 Serial.print(this->
GetPort()->GetSpeed());
402 if (this->powerCommandPin != (GPIO_pin_t)DP_INVALID)
404 Serial.print(F(
" / PowerPin "));
405 Port::printPortPin(this->powerCommandPin, DIGITAL);
406 Serial.print(F(
" / PowerDelay "));
407 Serial.print(this->powerDelay);
409 Serial.print(F(
" / Delay "));
411 Serial.print(F(
"ms / "));
414 Serial.println(F(
" "));
unsigned int GetDebounceDelay() const
int EEPROMLoad(int inPos)
unsigned long GetActionStartingMillis() const
virtual void StartAction()
unsigned long GetDuration() const
MovementSpeed GetMovementSpeed() const
virtual int SetSpeed(int inSpeed)
unsigned long GetMovingPositionIdByIndex(int inIndex) const
void SetStateRaw(ACC_STATE inNewState)
int GetMovingPosition(unsigned long inId) const
uint8_t IndexOfMovingPosition(unsigned long inId) const
void SetLastMovingPosition(uint8_t inLastPositionIndex)
const uint8_t GetMovingPositionSize() const
int GetMovingPositionByIndex(int inIndex) const
void Move(unsigned long inId)
virtual void ResetAction()
ACC_STATE GetState() const
virtual void MovePosition(unsigned long inDuration, int inEndPosition)
bool IsActionDelayPending() const
void MovePosition(int inPosition)
void Event(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent = ACCESSORIES_EVENT_MOVEPOSITIONID, int inData = 0)
void SetPowerCommand(int inPin, unsigned long inDelay = 100)
void AdjustMovingPositionsSize(uint8_t inNewSize)
virtual void beginByAccessory(int inStartingPosition)
virtual int EEPROMLoad(int inPos)
void begin(ACC_STATE inStartingState = STATE_NONE)
void SetDuration(unsigned long inDuration)
void begin(Port *inpPort, unsigned long inDurationMilli = 0, int inMinimumPosition = 0, int inMaximumPosition = 180, int inMovingPositionsNumber = 1)