25 Timeout time_based_action_timeout;
26 char brake_when_done = 0;
30 motor_left_speed = speed;
37 motor_right_speed = speed;
38 motor_right_brake = 0;
51 motor_right_speed = 0;
52 motor_right_brake = 1;
59 motor_right_speed = 0;
61 motor_right_brake = 1;
68 motor_right_speed = 0;
70 motor_right_brake = 0;
76 motor_left_speed = speed;
77 motor_right_speed = speed;
79 motor_right_brake = 0;
85 motor_left_speed = -speed;
86 motor_right_speed = -speed;
88 motor_right_brake = 0;
95 motor_left_speed = speed;
96 motor_right_speed = -speed;
98 motor_right_brake = 0;
106 IF_check_time_for_existing_time_based_action();
110 brake_when_done =
brake;
111 time_based_action_timeout.attach_us(
this,&Motors::IF_end_time_based_action,microseconds);
118 IF_check_time_for_existing_time_based_action();
122 brake_when_done =
brake;
123 time_based_action_timeout.attach_us(
this,&Motors::IF_end_time_based_action,microseconds);
127 float Motors::get_maximum_turn_angle(
int microseconds)
130 return (microseconds * 0.00027);
134 int Motors::get_time_based_turn_time(
float speed,
float degrees)
137 if(degrees < 0) degrees =- degrees;
140 float turn_time = degrees / ((290 * speed));
145 }
else turn_time += 0.002;
149 float mul_fact = 0.31 - speed;
150 if(mul_fact < 0) mul_fact = 0;
153 turn_time *= mul_fact;
158 float short_offset_multiplier = 1.0 + (0.9 / degrees);
159 turn_time *= short_offset_multiplier;
163 turn_time *= 1000000;
165 return (
int) turn_time;
169 int Motors::time_based_turn_degrees(
float speed,
float degrees,
char brake)
171 if(speed < 0 || speed > 1 || degrees == 0) {
172 psi.
debug(
"Invalid values to time based turn: speed=%f degrees=$f\n",speed,degrees);
176 IF_check_time_for_existing_time_based_action();
179 int turn_time = get_time_based_turn_time(speed,degrees);
190 brake_when_done =
brake;
191 time_based_action_timeout.attach_us(
this,&Motors::IF_end_time_based_action,turn_time);
197 void Motors::IF_check_time_for_existing_time_based_action()
199 if(time_based_motor_action == 1) {
200 time_based_action_timeout.detach();
201 psi.
debug(
"WARNING: New time-based action called before previous action finished!\n");
202 }
else time_based_motor_action = 1;
205 void Motors::IF_end_time_based_action()
207 if(brake_when_done == 1)
brake();
209 time_based_motor_action = 0;
212 void Motors::IF_update_motors()
214 if(motor_left_speed > 1.0) {
215 motor_left_speed = 1.0;
218 if(motor_right_speed > 1.0) {
219 motor_right_speed = 1.0;
222 if(motor_left_speed < -1.0) {
223 motor_left_speed = -1.0;
226 if(motor_right_speed < -1.0) {
227 motor_right_speed = -1.0;
230 if(motor_left_brake) {
231 motor_left_f.write(1);
232 motor_left_r.write(1);
233 if(motor_left_speed!=0) {
234 motor_left_speed = 0;
238 if(motor_left_speed >= 0) {
239 motor_left_f.write(0);
240 motor_left_r.write(IF_calibrated_left_speed(motor_left_speed));
243 motor_left_r.write(0);
244 motor_left_f.write(IF_calibrated_left_speed(-motor_left_speed));
247 if(motor_right_brake) {
248 motor_right_f.write(1);
249 motor_right_r.write(1);
250 if(motor_right_speed!=0) {
251 motor_right_speed = 0;
255 if(motor_right_speed >= 0) {
256 motor_right_f.write(0);
257 motor_right_r.write(IF_calibrated_right_speed(motor_right_speed));
259 motor_right_r.write(0);
260 motor_right_f.write(IF_calibrated_right_speed(-motor_right_speed));
267 float Motors::IF_calibrated_left_speed(
float speed)
270 float adjusted = IF_calibrated_speed(speed);
271 if(use_motor_calibration) {
272 adjusted *= left_motor_calibration_value;
277 float Motors::IF_calibrated_right_speed(
float speed)
280 float adjusted = IF_calibrated_speed(speed);
281 if(use_motor_calibration) {
282 adjusted *= right_motor_calibration_value;
287 float Motors::IF_calibrated_speed(
float speed)
289 if(speed == 0)
return 0;
291 float adjusted = speed;
302 motor_left_f.period_us(40);
303 motor_right_f.period_us(40);
304 motor_left_r.period_us(40);
305 motor_right_r.period_us(40);
306 motor_left_speed = 0;
307 motor_right_speed = 0;
308 motor_left_brake = 0;
309 motor_right_brake = 0;
void time_based_turn(float speed, int microseconds, char brake)
void brake_right_motor(void)
void time_based_forward(float speed, int microseconds, char brake)
void set_left_motor_speed(float speed)
void backward(float speed)
void brake_left_motor(void)
void debug(const char *format,...)
void set_right_motor_speed(float speed)
void forward(float speed)