@@ -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