68 lines
2.3 KiB
C
68 lines
2.3 KiB
C
|
#ifndef MANAGED_SERVO_H
|
||
|
#define MANAGED_SERVO_H
|
||
|
|
||
|
#if ( defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) || \
|
||
|
defined(ARDUINO_GENERIC_RP2040) ) && !defined(ARDUINO_ARCH_MBED)
|
||
|
#if !defined(RP2040_ISR_SERVO_USING_MBED)
|
||
|
#define RP2040_ISR_SERVO_USING_MBED false
|
||
|
#endif
|
||
|
|
||
|
#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_RASPBERRY_PI_PICO) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) || \
|
||
|
defined(ARDUINO_GENERIC_RP2040) ) && defined(ARDUINO_ARCH_MBED)
|
||
|
|
||
|
#if !defined(RP2040_ISR_SERVO_USING_MBED)
|
||
|
#define RP2040_ISR_SERVO_USING_MBED true
|
||
|
#endif
|
||
|
|
||
|
#else
|
||
|
#error This code is intended to run on the mbed / non-mbed RP2040 platform! Please check your Tools->Board setting.
|
||
|
#endif
|
||
|
|
||
|
#define ISR_SERVO_DEBUG 0
|
||
|
|
||
|
#include "RP2040_ISR_Servo/RP2040_ISR_Servo.hpp"
|
||
|
|
||
|
|
||
|
|
||
|
// The ManagedServo class is a wrapper around the Servo class that
|
||
|
// provides range checking and absolute limits on the servo position
|
||
|
// so that the model can't be asked to attain any position that would
|
||
|
// damage the model.
|
||
|
|
||
|
class ManagedServo {
|
||
|
|
||
|
public:
|
||
|
// Constructor
|
||
|
ManagedServo(uint8_t servoPin, uint8_t minPosition, uint8_t maxPosition, uint8_t defaultPosition, bool invertAngles);
|
||
|
virtual ~ManagedServo();
|
||
|
|
||
|
// Accessors
|
||
|
inline uint8_t getServoPin() const { return mServoPin; }
|
||
|
inline uint8_t getMinPosition() const { return mMinPosition; }
|
||
|
inline uint8_t getMaxPosition() const { return mMaxPosition; }
|
||
|
inline void setMinPosition(uint8_t minPosition) { if(minPosition > 0 && minPosition < 180) mMinPosition = minPosition; }
|
||
|
inline void setMaxPosition(uint8_t maxPosition) { if(maxPosition > 0 && maxPosition < 180) mMaxPosition = maxPosition; }
|
||
|
|
||
|
inline uint8_t getDefaultPosition() { return mDefaultPosition; }
|
||
|
|
||
|
// Initialization
|
||
|
void setupServo();
|
||
|
|
||
|
// Position control
|
||
|
void setServoPosition(uint8_t position);
|
||
|
inline uint8_t getServoPosition() const { return mCurrentPosition; }
|
||
|
void moveToMaxPosition();
|
||
|
void moveToMinPosition();
|
||
|
|
||
|
private:
|
||
|
uint8_t mServoPin;
|
||
|
uint8_t mMinPosition;
|
||
|
uint8_t mMaxPosition;
|
||
|
uint8_t mDefaultPosition;
|
||
|
uint8_t mCurrentPosition;
|
||
|
bool mInvertAngles;
|
||
|
int mISRServoIndex;
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif
|