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 GetMovingPositionByIndex(int inIndex) const
unsigned long GetActionStartingMillis() const
virtual void StartAction()
unsigned long GetDuration() const
MovementSpeed GetMovementSpeed() const
unsigned long GetMovingPositionIdByIndex(int inIndex) const
void SetStateRaw(ACC_STATE inNewState)
int EEPROMLoad(int inPos)
int GetMovingPosition(unsigned long inId) const
uint8_t IndexOfMovingPosition(unsigned long inId) const
void SetLastMovingPosition(uint8_t inLastPositionIndex)
const uint8_t GetMovingPositionSize() const
void Move(unsigned long inId)
ACC_STATE GetState() const
bool IsActionDelayPending() const
virtual void MovePosition(unsigned long inDuration, int inEndPosition)
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)
virtual int SetSpeed(int inSpeed)
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)
virtual void ResetAction()