ER ev3_motor_rotate()

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;
}