/// <summary> /// [Native] Sync two motors as driving motors, specifying whether to brake or coast and the turn ratio. /// </summary> /// <param name="port">The ports of the selected motors. Exactly two motors must be selected.</param> /// <param name="power">The power at which to move the motors, between -100 and 100.</param> /// <param name="stop">Whether to brake or coast during operation. Braking uses far more power.</param> /// <param name="turnratio">The turn ratio of the two motors, between -100 and 100. A ratio of zero will make both motors move straight. /// A negative ratio will move the left motor more and a positive ratio would move the right motor more.</param> public void MoveMotors(MotorPortSyncable port, int power, MotorStop stop, int turnratio) { int[] pow = new int[] { power, power }; //Arc and Point rotation //Both arc and point rotation may be used for joystick control double ratio = (double)turnratio; double powr = (double)power; //pow = new int[] { Convert.ToInt32(Math.Floor(((50 - diff) / 100) * powr)), //Convert.ToInt32(Math.Floor(((50 + diff) / 100) * powr)) }; //pow = new int[] { Convert.ToInt32(Math.Floor(((50 - diff) / 100) * powr)), //Convert.ToInt32(Math.Floor(((50 + diff) / 100) * powr)) }; //slave motor power = master power * turn ratio //find which motor is the master if (turnratio != 0) { bool masterleft = true; if (power < 0) { if (turnratio < 0) { masterleft = true; } else { masterleft = false; } } else { if (turnratio <= 0) { masterleft = false; } else { masterleft = true; } } double equ = ((-2 * Math.Abs(ratio)) + 100) / 100 * powr; if (masterleft == true) { pow = new int[] { power, Convert.ToInt32(Math.Floor(equ)) }; } else { pow = new int[] { Convert.ToInt32(Math.Floor(equ)), power }; } } MotorMode mode = MotorMode.MotorOn; if (stop == MotorStop.Coast) { mode = MotorMode.On_Regulated; if ((power < 75) && (power > -75)) { mode = MotorMode.MotorOn; } } if (stop == MotorStop.Brake) { mode = MotorMode.On_Brake_Regulated; if ((power < 75) && (power > -75)) { mode = MotorMode.On_Brake; } } Motor[] motors = new Motor[] { }; if (port == MotorPortSyncable.AB) { motors = new Motor[] { Motor.A, Motor.B }; } if (port == MotorPortSyncable.AC) { motors = new Motor[] { Motor.A, Motor.C }; } if (port == MotorPortSyncable.BC) { motors = new Motor[] { Motor.B, Motor.C }; } if (port == MotorPortSyncable.BA) { motors = new Motor[] { Motor.B, Motor.A }; } if (port == MotorPortSyncable.CA) { motors = new Motor[] { Motor.C, Motor.A }; } if (port == MotorPortSyncable.CB) { motors = new Motor[] { Motor.C, Motor.B }; } SetOutputState(motors[0], (sbyte)pow[0], mode, MotorReg.Speed, (sbyte)turnratio, MotorState.Running, (uint)0); SetOutputState(motors[1], (sbyte)pow[1], mode, MotorReg.Speed, (sbyte)turnratio, MotorState.Running, (uint)0); return; }
/// <summary> /// [Native] Smoothly start or stop motors, specifying whether to brake or coast. /// </summary> /// <param name="port">The ports of the selected motors.</param> /// <param name="power">The power at which to move the motors, between -100 and 100.</param> /// <param name="stop">Whether to brake or coast during operation. Braking uses far more power.</param> /// <param name="smooth">Whether to smoothly spin up or down the motors.</param> /// <param name="degrees">The number of degrees the motor revolves until is it fully spun up or down. Smaller values /// make the motors move more smoothly. Set degrees to zero to run infinitely.</param> public void MoveMotors(MotorPort port, int power, MotorStop stop, MotorSmooth smooth, int degrees) { MotorMode mode = MotorMode.On_Regulated; if (stop == MotorStop.Coast) { mode = MotorMode.On_Regulated; if ((power < 75) && (power > -75)) { mode = MotorMode.MotorOn; } } if (stop == MotorStop.Brake) { mode = MotorMode.On_Brake_Regulated; if ((power < 75) && (power > -75)) { mode = MotorMode.On_Brake; } } if (port != MotorPort.AB && port != MotorPort.AC && port != MotorPort.BC) { SetOutputState((Motor)((byte)port), (sbyte)power, mode, MotorReg.Speed, 0, MotorState.Running, 0); } else { MotorState state = MotorState.Rampup; if (smooth == MotorSmooth.Smooth_Stop) { state = MotorState.RampDown; } Motor[] motors = new Motor[] { }; if (port == MotorPort.AB) { motors = new Motor[] { Motor.A, Motor.B }; } if (port == MotorPort.AC) { motors = new Motor[] { Motor.A, Motor.C }; } if (port == MotorPort.BC) { motors = new Motor[] { Motor.B, Motor.C }; } SetOutputState(motors[0], (sbyte)power, mode, MotorReg.Sync, 0, state, (uint)degrees); SetOutputState(motors[1], (sbyte)power, mode, MotorReg.Sync, 0, state, (uint)degrees); } return; }