@@ -47,53 +47,58 @@ uint8_t Servo::attach(int pin, int min, int max)
47
47
return INVALID_SERVO;
48
48
}
49
49
bool succeeded = false ;
50
- pinMode (pin, OUTPUT); // set servo pin to output
51
- servos[this ->servoIndex ].Pin .nbr = pin;
52
50
53
- if (min < MIN_PULSE_WIDTH) {
54
- min = MIN_PULSE_WIDTH;
55
- }
56
- if (max > MAX_PULSE_WIDTH) {
57
- max = MAX_PULSE_WIDTH;
58
- }
51
+ if (min < MIN_PULSE_WIDTH) min = MIN_PULSE_WIDTH;
52
+ if (max > MAX_PULSE_WIDTH) max = MAX_PULSE_WIDTH;
59
53
60
54
// fix min if conversion to pulse cycle value is too low
61
55
if ( (min/DUTY_CYCLE_RESOLUTION) * DUTY_CYCLE_RESOLUTION < min) {
62
56
min += DUTY_CYCLE_RESOLUTION;
63
57
}
64
58
65
- this ->min = min;
66
- this ->max = max;
67
-
68
- servos[this ->servoIndex ].Pin .isActive = true ;
59
+ this ->min = min;
60
+ this ->max = max;
69
61
70
62
// Adafruit, add pin to 1 of available Hw PWM
71
63
// first, use existing HWPWM modules (already owned by Servo)
72
- for (int i=0 ; i<HWPWM_MODULE_NUM; i++) {
73
- if (HwPWMx[i]->isOwner (_servoToken) &&
74
- HwPWMx[i]->addPin (pin)) {
64
+ for ( int i = 0 ; i < HWPWM_MODULE_NUM; i++ )
65
+ {
66
+ if ( HwPWMx[i]->isOwner (_servoToken) && HwPWMx[i]->addPin (pin) )
67
+ {
75
68
this ->pwm = HwPWMx[i];
76
69
succeeded = true ;
77
70
break ;
78
71
}
79
72
}
73
+
80
74
// if could not add to existing owned PWM modules, try to add to a new PWM module
81
- if (!succeeded) {
82
- for (int i=0 ; i<HWPWM_MODULE_NUM; i++) {
83
- if (HwPWMx[i]->takeOwnership (_servoToken) &&
84
- HwPWMx[i]->addPin (pin)) {
75
+ if ( !succeeded )
76
+ {
77
+ for ( int i = 0 ; i < HWPWM_MODULE_NUM; i++ )
78
+ {
79
+ if ( HwPWMx[i]->takeOwnership (_servoToken) && HwPWMx[i]->addPin (pin) )
80
+ {
85
81
this ->pwm = HwPWMx[i];
86
82
succeeded = true ;
87
83
break ;
88
84
}
89
85
}
90
86
}
91
87
92
- if (succeeded) { // do not use this->pwm unless success above!
88
+ if ( succeeded )
89
+ {
90
+ pinMode (pin, OUTPUT);
91
+ servos[this ->servoIndex ].Pin .nbr = pin;
92
+ servos[this ->servoIndex ].Pin .isActive = true ;
93
+
93
94
this ->pwm ->setMaxValue (MAXVALUE);
94
95
this ->pwm ->setClockDiv (CLOCKDIV);
96
+
97
+ return this ->servoIndex ;
98
+ }else
99
+ {
100
+ return INVALID_SERVO;
95
101
}
96
- return succeeded ? this ->servoIndex : INVALID_SERVO; // return INVALID_SERVO on failure (zero is a valid servo index)
97
102
}
98
103
99
104
void Servo::detach ()
@@ -104,6 +109,7 @@ void Servo::detach()
104
109
105
110
uint8_t const pin = servos[this ->servoIndex ].Pin .nbr ;
106
111
servos[this ->servoIndex ].Pin .isActive = false ;
112
+
107
113
// remove pin from HW PWM
108
114
HardwarePWM * pwm = this ->pwm ;
109
115
this ->pwm = nullptr ;
0 commit comments