@@ -30,20 +30,23 @@ type (
3030)
3131
3232var (
33- // setPeriodPrefix is the prefix for the log message when setting the PWM period
34- setPeriodPrefix = []byte ("Set Servo PWM period to:" )
35-
3633 // setAnglePrefix is the prefix message for new angle setting
3734 setAnglePrefix = []byte ("Set servo angle degrees to:" )
3835
3936 // setPulseWidthPrefix is the prefix message for new pulse width setting
4037 setPulseWidthPrefix = []byte ("Set servo pulse width to:" )
38+
39+ // setPeriodPrefix is the prefix for the log message when setting the PWM period
40+ setPeriodPrefix = []byte ("Set Servo PWM period to:" )
41+
42+ // setLeftLimitAnglePrefix is the prefix message for left limit angle
43+ setLeftLimitAnglePrefix = []byte ("\t Servo left limit angle set to:" )
4144
42- // logLeftLimitAnglePrefix is the prefix message for left limit angle
43- logLeftLimitAnglePrefix = []byte ("Servo left limit angle set to:" )
45+ // setCenterAnglePrefix is the prefix message for center angle
46+ setCenterAnglePrefix = []byte ("\t Servo center angle set to:" )
4447
45- // logRightLimitAnglePrefix is the prefix message for right limit angle
46- logRightLimitAnglePrefix = []byte ("Servo right limit angle set to:" )
48+ // setRightLimitAnglePrefix is the prefix message for right limit angle
49+ setRightLimitAnglePrefix = []byte ("\t Servo right limit angle set to:" )
4750)
4851
4952// NewDefaultHandler creates a new instance of DefaultHandler
@@ -96,18 +99,6 @@ func NewDefaultHandler(
9699 return nil , ErrorCodeServoFailedToConfigurePWM
97100 }
98101
99- // Log the configured period
100- if logger != nil {
101- logger .AddMessageWithUint32 (
102- setPeriodPrefix ,
103- uint32 (period ),
104- true ,
105- true ,
106- false ,
107- )
108- logger .Debug ()
109- }
110-
111102 // Get the channel from the pin
112103 channel , err := pwm .Channel (pin )
113104 if err != nil {
@@ -148,22 +139,37 @@ func NewDefaultHandler(
148139 rightLimitAngle = actuationRange
149140 }
150141
151- // If the direction is inverted, swap the left and right limit angles
142+ // If the direction is inverted, swap the left and right limit angles and recalculate the center angle
152143 if isDirectionInverted {
144+ centerAngle = actuationRange - centerAngle
153145 leftLimitAngle , rightLimitAngle = actuationRange - rightLimitAngle , actuationRange - leftLimitAngle
154146 }
155147
156148 // Log the left and right limit angles if logger is provided
157149 if logger != nil {
150+ logger .AddMessageWithUint32 (
151+ setPeriodPrefix ,
152+ uint32 (period ),
153+ true ,
154+ true ,
155+ false ,
156+ )
158157 logger .AddMessageWithUint16 (
159- logLeftLimitAnglePrefix ,
158+ setLeftLimitAnglePrefix ,
160159 leftLimitAngle ,
161160 true ,
162161 true ,
163162 false ,
164163 )
165164 logger .AddMessageWithUint16 (
166- logRightLimitAnglePrefix ,
165+ setCenterAnglePrefix ,
166+ centerAngle ,
167+ true ,
168+ true ,
169+ false ,
170+ )
171+ logger .AddMessageWithUint16 (
172+ setRightLimitAnglePrefix ,
167173 rightLimitAngle ,
168174 true ,
169175 true ,
@@ -212,11 +218,6 @@ func (h *DefaultHandler) GetAngle() uint16 {
212218//
213219// angle: The angle to set the servo motor to, must be between 0 and the actuation range
214220func (h * DefaultHandler ) SetAngle (angle uint16 ) tinygoerrors.ErrorCode {
215- // Check if the direction is inverted
216- if h .isDirectionInverted {
217- angle = h .actuationRange - angle
218- }
219-
220221 // Check if the angle is within the valid range
221222 if angle < h .leftLimitAngle || angle > h .rightLimitAngle {
222223 return ErrorCodeServoAngleOutOfRange
@@ -287,11 +288,16 @@ func (h *DefaultHandler) SetAngleToCenter() tinygoerrors.ErrorCode {
287288// An error if the relative angle is not within the left and right limits
288289func (h * DefaultHandler ) SetAngleRelativeToCenter (relativeAngle int16 ) tinygoerrors.ErrorCode {
289290 // Calculate the absolute angle based on the center angle and relative angle
291+ if h .isDirectionInverted {
292+ relativeAngle = - relativeAngle
293+ }
290294 absoluteAngle := int16 (h .centerAngle ) + relativeAngle
291295
292296 // Check if the absolute angle is within the left and right limits
293- if absoluteAngle < int16 (h .leftLimitAngle ) || absoluteAngle > int16 (h .rightLimitAngle ) {
294- return ErrorCodeServoAngleOutOfRange
297+ if absoluteAngle < int16 (h .leftLimitAngle ) {
298+ absoluteAngle = int16 (h .leftLimitAngle )
299+ } else if absoluteAngle > int16 (h .rightLimitAngle ) {
300+ absoluteAngle = int16 (h .rightLimitAngle )
295301 }
296302
297303 // Set the servo angle
@@ -308,15 +314,6 @@ func (h *DefaultHandler) SetAngleRelativeToCenter(relativeAngle int16) tinygoerr
308314//
309315// An error if the angle is not within the right limit
310316func (h * DefaultHandler ) SetAngleToRight (angle uint16 ) tinygoerrors.ErrorCode {
311- // Check if the angle is negative
312- if angle < 0 {
313- angle = 0
314- }
315-
316- // Check if the angle is within the right limit
317- if angle > h .rightLimitAngle - h .centerAngle {
318- angle = h .rightLimitAngle - h .centerAngle
319- }
320317 return h .SetAngleRelativeToCenter (int16 (angle ))
321318}
322319
@@ -330,14 +327,5 @@ func (h *DefaultHandler) SetAngleToRight(angle uint16) tinygoerrors.ErrorCode {
330327//
331328// An error if the angle is not within the left limit
332329func (h * DefaultHandler ) SetAngleToLeft (angle uint16 ) tinygoerrors.ErrorCode {
333- // Check if the angle is negative
334- if angle < 0 {
335- angle = 0
336- }
337-
338- // Check if the angle is within the left limit
339- if angle > h .centerAngle - h .leftLimitAngle {
340- angle = h .centerAngle - h .leftLimitAngle
341- }
342330 return h .SetAngleRelativeToCenter (- int16 (angle ))
343331}
0 commit comments