testrepo/ManagedServo.h

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