in ev3-api/src/ev3api_motor.c [335:363]
ER ev3_motor_rotate(motor_port_t port, int degrees, uint32_t speed_abs, bool_t blocking) {
ER ercd;
// lazy_initialize();
CHECK_PORT(port);
CHECK_PORT_CONN(port);
// Float the motor first if it is busy
if (*pMotorReadyStatus & (1 << port))
ev3_motor_stop(port, false);
STEPSPEED ss;
ss.Cmd = opOUTPUT_STEP_SPEED;
ss.Speed = speed_abs * (degrees < 0 ? -1 : 1);
ss.Step1 = 0; // Up to Speed
ss.Step2 = (degrees < 0 ? -degrees : degrees); // Keep Speed
ss.Step3 = 0; // Down to Speed
ss.Brake = true;
ss.Nos = 1 << port;
motor_command(&ss, sizeof(ss));
if (blocking) // TODO: What if pMotorReadyStatus is kept busy by other tasks?
while (*pMotorReadyStatus & (1 << port));
ercd = E_OK;
error_exit:
return ercd;
}