improved motion control

This commit is contained in:
True Zhuanjia committed 2026-06-21 15:29:40 +08:00
1 parent f4b161ed06
commit adb5091dc2
4 files changed
+86 -47

No files matched your search

+6 -6
View File
@@ -89,7 +89,7 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
bool _captureMouse; bool _captureMouse;
bool _controllerGyroSwitchEnabled; bool _controllerGyroSwitchEnabled;
bool _gyroEnabledFlag; bool _gyroEnabledFlag; // bool flag for both DS4 gyro & VL motion control
int _controllerGyroSwitchToggle; int _controllerGyroSwitchToggle;
int _controllerGyroSwitchHold; int _controllerGyroSwitchHold;
bool _reverseHoldButton; bool _reverseHoldButton;
@@ -1059,10 +1059,10 @@ double rc_expo(double x, double expo) {
||self->tempSettings.gyroMode.intValue==GyroModeOff; ||self->tempSettings.gyroMode.intValue==GyroModeOff;
} }
- (void)switchGyroOnOffByControllerButton{ - (void)switchMotionControlOnOffByControllerButton{
self->_gyroEnabledFlag = self->_gyroEnabledFlag && self->_controllerGyroSwitchEnabled; self->_gyroEnabledFlag = self->_gyroEnabledFlag && self->_controllerGyroSwitchEnabled;
if([self useMotionHandler]){ if([self useMotionHandler]){
if(self->_gyroEnabledFlag) [self->motionHandler startGyroByControllerButton]; if(self->_gyroEnabledFlag) [self->motionHandler startMotionControlByControllerButton];
else [self->motionHandler stopMotionUpdateWithInterruptNoneGyroInput:false]; else [self->motionHandler stopMotionUpdateWithInterruptNoneGyroInput:false];
} }
else self->_gyroEnabledFlag = self->_gyroEnabledFlag || !self->_controllerGyroSwitchEnabled; else self->_gyroEnabledFlag = self->_gyroEnabledFlag || !self->_controllerGyroSwitchEnabled;
@@ -1187,14 +1187,14 @@ double rc_expo(double x, double expo) {
self->_controllerGyroSwitchTogglePressed = true; self->_controllerGyroSwitchTogglePressed = true;
self->_gyroEnabledFlag = !self->_gyroEnabledFlag; self->_gyroEnabledFlag = !self->_gyroEnabledFlag;
[self switchGyroOnOffByControllerButton]; [self switchMotionControlOnOffByControllerButton];
} }
if (buttonFlagId.intValue == self->_controllerGyroSwitchHold if (buttonFlagId.intValue == self->_controllerGyroSwitchHold
&& !self->_controllerGyroSwitchHoldPressed) { && !self->_controllerGyroSwitchHoldPressed) {
self->_controllerGyroSwitchHoldPressed = true; self->_controllerGyroSwitchHoldPressed = true;
self->_gyroEnabledFlag = !self->_reverseHoldButton; self->_gyroEnabledFlag = !self->_reverseHoldButton;
[self switchGyroOnOffByControllerButton]; [self switchMotionControlOnOffByControllerButton];
} }
} }
else{ else{
@@ -1207,7 +1207,7 @@ double rc_expo(double x, double expo) {
self->_controllerGyroSwitchHoldPressed = false; self->_controllerGyroSwitchHoldPressed = false;
self->_gyroEnabledFlag = self->_reverseHoldButton; self->_gyroEnabledFlag = self->_reverseHoldButton;
[self switchGyroOnOffByControllerButton]; [self switchMotionControlOnOffByControllerButton];
} }
} }
} }
+64 -27
View File
@@ -39,7 +39,7 @@ import CoreMotion
} }
public func gyroMixInputStarted() -> Bool { public func gyroMixInputStarted() -> Bool {
return gyroIsWorking return motionIsWorking
} }
private static let sharedInstance = MotionHandler() private static let sharedInstance = MotionHandler()
@@ -61,16 +61,19 @@ import CoreMotion
return sharedInstance return sharedInstance
} }
@objc public var gyroControlStarted: Bool = false @objc public var motionControlStarted: Bool = false
@objc var useBuiltinGyro: Bool = true @objc var useBuiltinGyro: Bool = true
@objc var swapYawAndRoll: Bool = false @objc var swapYawAndRoll: Bool = false
private var gyroIsWorking: Bool = false private var motionIsWorking: Bool = false
private var accelControlStarted: Bool = false private var accelControlStarted: Bool = false
private let motionManager = CMMotionManager() private let motionManager = CMMotionManager()
private weak var activeGCController:GCController? private weak var activeGCController:GCController?
private var synthesizePhysicalStick:Bool = false private var synthesizePhysicalStick:Bool = false
private var mapGyroTo:MapGyroTo = .mapGyroToControllerStick private var mapGyroTo:MapGyroTo = .mapGyroToControllerStick
private var rollToLeftStick:Bool = false private var rollToLeftStick:Bool = false
private var gravityYAngleRef:Double?
private var previousGravityYAngle:Double?
private var gravityYUnwrappedAngle:Double = 0
private var yawPitchToRightStick:Bool = false private var yawPitchToRightStick:Bool = false
public var sensitvityYaw:CGFloat = 1.0 public var sensitvityYaw:CGFloat = 1.0
public var sensitvityPitch:CGFloat = 1.0 public var sensitvityPitch:CGFloat = 1.0
@@ -81,7 +84,7 @@ import CoreMotion
@objc public var previousWidgetYawFactor:CGFloat = 1.0 @objc public var previousWidgetYawFactor:CGFloat = 1.0
@objc public var previousWidgetPitchFactor:CGFloat = 1.0 @objc public var previousWidgetPitchFactor:CGFloat = 1.0
@objc public var previousWidgetRollFactor:CGFloat = 1.0 @objc public var previousWidgetRollFactor:CGFloat = 1.0
public var gyroStarter:Any? public var motionStarter:Any?
private var windowScene: Any? private var windowScene: Any?
@objc public var onScreenControls: OnScreenControls? @objc public var onScreenControls: OnScreenControls?
@@ -91,7 +94,7 @@ import CoreMotion
private var yaw:Double = 0 private var yaw:Double = 0
private var pitch:Double = 0 private var pitch:Double = 0
private var roll:Double = 0 private var roll:Double = 0
private var rollIntegral:Double = 0 private var leftStickMotion:Double = 0
private var isCalibrating: Bool = false private var isCalibrating: Bool = false
private var sumX: Double = 0 private var sumX: Double = 0
@@ -141,7 +144,7 @@ import CoreMotion
motionManager.gyroUpdateInterval = updateInterval motionManager.gyroUpdateInterval = updateInterval
} }
public func startGyroByOnScreenButton(_ sender: OnScreenWidgetView, yawFactor:CGFloat, pitchFactor:CGFloat, rollFactor:CGFloat){ public func startMotionControlByOnScreenButton(_ sender: OnScreenWidgetView, yawFactor:CGFloat, pitchFactor:CGFloat, rollFactor:CGFloat){
self.previousWidgetYawFactor = self.widgetYawFactor self.previousWidgetYawFactor = self.widgetYawFactor
self.previousWidgetPitchFactor = self.widgetPitchFactor self.previousWidgetPitchFactor = self.widgetPitchFactor
self.previousWidgetRollFactor = self.widgetRollFactor self.previousWidgetRollFactor = self.widgetRollFactor
@@ -149,31 +152,31 @@ import CoreMotion
self.widgetPitchFactor = pitchFactor self.widgetPitchFactor = pitchFactor
self.widgetRollFactor = rollFactor self.widgetRollFactor = rollFactor
print("self.widgetRollFactor \(self.widgetRollFactor)") print("self.widgetRollFactor \(self.widgetRollFactor)")
if self.gyroStarter == nil { if self.motionStarter == nil {
self.gyroStarter = sender self.motionStarter = sender
if sender.motionControlButtonString != "GYROPAUSE" {self.startGyroUpdate()} if sender.motionControlButtonString != "GYROPAUSE" {self.startMotionUpdate()}
} }
else if sender.motionControlButtonString == "GYROPAUSE" { else if sender.motionControlButtonString == "GYROPAUSE" {
self.startGyroUpdate() self.startMotionUpdate()
} }
} }
@objc public func startGyroByControllerButton(){ @objc public func startMotionControlByControllerButton(){
self.previousWidgetYawFactor = self.widgetYawFactor self.previousWidgetYawFactor = self.widgetYawFactor
self.previousWidgetPitchFactor = self.widgetPitchFactor self.previousWidgetPitchFactor = self.widgetPitchFactor
self.previousWidgetRollFactor = self.widgetRollFactor self.previousWidgetRollFactor = self.widgetRollFactor
self.widgetYawFactor = 1 self.widgetYawFactor = 1
self.widgetPitchFactor = 1 self.widgetPitchFactor = 1
self.widgetRollFactor = 1 self.widgetRollFactor = 1
self.startGyroUpdate() self.startMotionUpdate()
} }
@objc public func startGyroUpdate() { @objc public func startMotionUpdate() {
if !gyroControlStarted { if !motionControlStarted {
gyroControlStarted = true motionControlStarted = true
resetGravityYOffsetTracking()
print("startGyroUpdate useBuiltinGyro \(useBuiltinGyro) \(CACurrentMediaTime())")
// print("startGyroUpdate useBuiltinGyro \(useBuiltinGyro) \(CACurrentMediaTime())")
if useBuiltinGyro { if useBuiltinGyro {
if motionManager.isGyroAvailable { if motionManager.isGyroAvailable {
@@ -227,8 +230,9 @@ import CoreMotion
private var interruptNoneGyroInput:Bool = false private var interruptNoneGyroInput:Bool = false
@objc public func stopMotionUpdate(interruptNoneGyroInput:Bool=false) { @objc public func stopMotionUpdate(interruptNoneGyroInput:Bool=false) {
gyroControlStarted = false motionControlStarted = false
gyroIsWorking = false motionIsWorking = false
resetGravityYOffsetTracking()
if motionManager.isDeviceMotionActive{ if motionManager.isDeviceMotionActive{
motionManager.stopDeviceMotionUpdates() motionManager.stopDeviceMotionUpdates()
} }
@@ -256,20 +260,25 @@ import CoreMotion
var x:Double = 0 var x:Double = 0
var y:Double = 0 var y:Double = 0
var z:Double = 0 var z:Double = 0
var attitudeRoll:Double = 0 // var attitudeRoll:Double = 0
var gravityYOffset:Double = 0
if let deviceMotion = deviceMotion { if let deviceMotion = deviceMotion {
x = deviceMotion.rotationRate.x x = deviceMotion.rotationRate.x
y = deviceMotion.rotationRate.y y = deviceMotion.rotationRate.y
z = deviceMotion.rotationRate.z z = deviceMotion.rotationRate.z
attitudeRoll = deviceMotion.attitude.yaw // attitudeRoll = deviceMotion.attitude.yaw
gravityYOffset = updateGravityYOffset(
gravityX: deviceMotion.gravity.x,
gravityY: deviceMotion.gravity.y,
)
} }
if let gcMotion = gcMotion { if let gcMotion = gcMotion {
x = gcMotion.rotationRate.x x = gcMotion.rotationRate.x
y = gcMotion.rotationRate.y y = gcMotion.rotationRate.y
z = gcMotion.rotationRate.z z = gcMotion.rotationRate.z
attitudeRoll = gcMotion.attitude.z // attitudeRoll = gcMotion.attitude.z
} }
@@ -350,13 +359,13 @@ import CoreMotion
rollSource = (swapYawAndRoll ? -z : y) - rollBias rollSource = (swapYawAndRoll ? -z : y) - rollBias
} }
if !gyroControlStarted { if !motionControlStarted {
self.clearGyroInput(interruptNonGyroInput: interruptNoneGyroInput) self.clearGyroInput(interruptNonGyroInput: interruptNoneGyroInput)
// print("Gyro: stopped") // print("Gyro: stopped")
return return
} }
gyroIsWorking = true motionIsWorking = true
if mapGyroTo == MapGyroTo.mapGyroToMouse { if mapGyroTo == MapGyroTo.mapGyroToMouse {
yaw = yawSource*sensitvityYaw*widgetYawFactor*30 yaw = yawSource*sensitvityYaw*widgetYawFactor*30
@@ -383,9 +392,9 @@ import CoreMotion
if rollToLeftStick { if rollToLeftStick {
roll = gyroInputToStickInput(input:rollSource*sensitvityRoll*widgetRollFactor*0.2) roll = gyroInputToStickInput(input:rollSource*sensitvityRoll*widgetRollFactor*0.2)
rollIntegral = useBuiltinGyro ? -stickMaxOffset*(attitudeRoll/Double.pi)*3*sensitvityRoll*widgetRollFactor : rollIntegral + roll leftStickMotion = useBuiltinGyro ? -stickMaxOffset*(gravityYOffset/Double.pi)*3*sensitvityRoll*widgetRollFactor : leftStickMotion + roll
let mixedLeftStickOffsetX = self.clampStickInput(input: rollIntegral+leftStickTouchInputX+leftStickPhysicalInputX) let mixedLeftStickOffsetX = self.clampStickInput(input: leftStickMotion+leftStickTouchInputX+leftStickPhysicalInputX)
let mixedLeftStickOffsetY = self.clampStickInput(input: leftStickTouchInputY+leftStickPhysicalInputY) let mixedLeftStickOffsetY = self.clampStickInput(input: leftStickTouchInputY+leftStickPhysicalInputY)
let offsetVector = ControllerUtil.compensated(offsetVector: CGVector(dx: mixedLeftStickOffsetX, dy: mixedLeftStickOffsetY), minOffset: gyroToStickMinOffset) let offsetVector = ControllerUtil.compensated(offsetVector: CGVector(dx: mixedLeftStickOffsetX, dy: mixedLeftStickOffsetY), minOffset: gyroToStickMinOffset)
@@ -402,7 +411,7 @@ import CoreMotion
onScreenControls?.sendRightStickTouchPadEvent(rightStickPhysicalInputX+rightStickTouchInputX-yawBias, rightStickPhysicalInputY+rightStickTouchInputY-pitchBias) onScreenControls?.sendRightStickTouchPadEvent(rightStickPhysicalInputX+rightStickTouchInputX-yawBias, rightStickPhysicalInputY+rightStickTouchInputY-pitchBias)
} }
if rollToLeftStick{ if rollToLeftStick{
rollIntegral = 0 leftStickMotion = 0
onScreenControls?.sendLeftStickTouchPadEvent(leftStickPhysicalInputX+leftStickTouchInputX-rollBias,leftStickPhysicalInputY+leftStickTouchInputY) onScreenControls?.sendLeftStickTouchPadEvent(leftStickPhysicalInputX+leftStickTouchInputX-rollBias,leftStickPhysicalInputY+leftStickTouchInputY)
} }
if(interruptNonGyroInput){ if(interruptNonGyroInput){
@@ -411,6 +420,34 @@ import CoreMotion
} }
} }
private func resetGravityYOffsetTracking() {
gravityYAngleRef = nil
previousGravityYAngle = nil
gravityYUnwrappedAngle = 0
}
private func updateGravityYOffset(gravityX: Double, gravityY: Double) -> Double {
let gravityYAngle = atan2(gravityX, -gravityY)
guard let previousGravityYAngle = previousGravityYAngle else {
gravityYAngleRef = gravityYAngle
previousGravityYAngle = gravityYAngle
gravityYUnwrappedAngle = gravityYAngle
return 0
}
var delta = gravityYAngle - previousGravityYAngle
if delta > Double.pi {
delta -= 2 * Double.pi
} else if delta < -Double.pi {
delta += 2 * Double.pi
}
gravityYUnwrappedAngle += delta
self.previousGravityYAngle = gravityYAngle
return -(gravityYUnwrappedAngle - (gravityYAngleRef ?? gravityYUnwrappedAngle))
}
private func clampStickInput(input: CGFloat) -> CGFloat{ private func clampStickInput(input: CGFloat) -> CGFloat{
return fmax(fmin(input, stickMaxOffset),-stickMaxOffset) return fmax(fmin(input, stickMaxOffset),-stickMaxOffset)
} }
+9 -9
View File
@@ -2807,7 +2807,7 @@ import ObjectiveC.runtime
GenericUtils.handleGyroButtonTip(in: self.parentViewController) GenericUtils.handleGyroButtonTip(in: self.parentViewController)
switch self.motionControlButtonString { switch self.motionControlButtonString {
case "GYRO": case "GYRO":
self.motionHandler?.startGyroByOnScreenButton(self, yawFactor: yawFactor, pitchFactor: pitchFactor, rollFactor: rollFactor) self.motionHandler?.startMotionControlByOnScreenButton(self, yawFactor: yawFactor, pitchFactor: pitchFactor, rollFactor: rollFactor)
if !OnScreenWidgetView.gamepadArrivalReported {OnScreenWidgetView.gamepadArrivalReported = oscProfile.mapGyroTo == .mapGyroToControllerStick} if !OnScreenWidgetView.gamepadArrivalReported {OnScreenWidgetView.gamepadArrivalReported = oscProfile.mapGyroTo == .mapGyroToControllerStick}
case "GYROPAUSE": case "GYROPAUSE":
self.motionHandler?.stopMotionUpdate(interruptNoneGyroInput:false) self.motionHandler?.stopMotionUpdate(interruptNoneGyroInput:false)
@@ -2825,7 +2825,7 @@ import ObjectiveC.runtime
private func handleMotionControlButtonUp(){ private func handleMotionControlButtonUp(){
switch self.motionControlButtonString { switch self.motionControlButtonString {
case "GYRO": case "GYRO":
if let gyroStarter = motionHandler?.gyroStarter as? OnScreenWidgetView, self === gyroStarter { if let gyroStarter = motionHandler?.motionStarter as? OnScreenWidgetView, self === gyroStarter {
self.forEachWidget{ widget in self.forEachWidget{ widget in
if widget.motionControlButtonString != "GYRO" || widget === self {return} if widget.motionControlButtonString != "GYRO" || widget === self {return}
if(widget.buttonMode == .tapToToggle && widget.logicallyDown) { if(widget.buttonMode == .tapToToggle && widget.logicallyDown) {
@@ -2834,18 +2834,18 @@ import ObjectiveC.runtime
} }
} }
self.motionHandler?.stopMotionUpdate(interruptNoneGyroInput: false) self.motionHandler?.stopMotionUpdate(interruptNoneGyroInput: false)
self.motionHandler?.gyroStarter = nil self.motionHandler?.motionStarter = nil
} }
else { else {
if self.motionHandler?.gyroStarter != nil { if self.motionHandler?.motionStarter != nil {
if let gyroStarter = motionHandler?.gyroStarter as? OnScreenWidgetView { if let gyroStarter = motionHandler?.motionStarter as? OnScreenWidgetView {
self.motionHandler?.startGyroByOnScreenButton(self, yawFactor: gyroStarter.yawFactor, pitchFactor: gyroStarter.pitchFactor, rollFactor: gyroStarter.rollFactor) self.motionHandler?.startMotionControlByOnScreenButton(self, yawFactor: gyroStarter.yawFactor, pitchFactor: gyroStarter.pitchFactor, rollFactor: gyroStarter.rollFactor)
} }
} }
} }
case "GYROPAUSE": case "GYROPAUSE":
if self.motionHandler?.gyroStarter != nil { if self.motionHandler?.motionStarter != nil {
self.motionHandler?.startGyroByOnScreenButton(self, yawFactor: motionHandler?.widgetYawFactor ?? 0, pitchFactor: motionHandler?.widgetPitchFactor ?? 0, rollFactor: motionHandler?.widgetRollFactor ?? 0) self.motionHandler?.startMotionControlByOnScreenButton(self, yawFactor: motionHandler?.widgetYawFactor ?? 0, pitchFactor: motionHandler?.widgetPitchFactor ?? 0, rollFactor: motionHandler?.widgetRollFactor ?? 0)
} }
case "ACCEL": case "ACCEL":
break break
@@ -4119,7 +4119,7 @@ import ObjectiveC.runtime
autoDockRestoreOriginalAlpha() autoDockRestoreOriginalAlpha()
if self.motionControlButtonString == "GYRO" { if self.motionControlButtonString == "GYRO" {
if OnScreenWidgetView.gamepadArrivalReported {self.motionHandler?.stopMotionUpdate(interruptNoneGyroInput: true)} if OnScreenWidgetView.gamepadArrivalReported {self.motionHandler?.stopMotionUpdate(interruptNoneGyroInput: true)}
self.motionHandler?.gyroStarter = nil self.motionHandler?.motionStarter = nil
} }
if self.motionControlButtonString == "ACCEL" {} if self.motionControlButtonString == "ACCEL" {}
if self.motionControlButtonString == "MOTION" {} if self.motionControlButtonString == "MOTION" {}
@@ -2015,17 +2015,18 @@ static NSString* VLTerminationHintForErrorCode(int errorCode) {
[self reConfigStreamViewRealtime]; [self reConfigStreamViewRealtime];
} }
/*
- (NSMutableDictionary *)startGyroUpdate:(OnScreenWidgetView *)sender yawFactor:(CGFloat)yawFactor pitchFactor:(CGFloat)pitchFactor rollFactor:(CGFloat)rollFactor{ - (NSMutableDictionary *)startGyroUpdate:(OnScreenWidgetView *)sender yawFactor:(CGFloat)yawFactor pitchFactor:(CGFloat)pitchFactor rollFactor:(CGFloat)rollFactor{
NSMutableDictionary* gyroControlPreviousStatus = [NSMutableDictionary dictionary]; NSMutableDictionary* gyroControlPreviousStatus = [NSMutableDictionary dictionary];
if(!_motionHandler.gyroControlStarted) [gyroControlPreviousStatus setObject:sender forKey:@"gyroControlStarter"]; if(!_motionHandler.motionControlStarted) [gyroControlPreviousStatus setObject:sender forKey:@"gyroControlStarter"];
[gyroControlPreviousStatus setObject:@(_motionHandler.widgetYawFactor) forKey:@"previousYawFactor"]; [gyroControlPreviousStatus setObject:@(_motionHandler.widgetYawFactor) forKey:@"previousYawFactor"];
[gyroControlPreviousStatus setObject:@(_motionHandler.widgetPitchFactor) forKey:@"previousPitchFactor"]; [gyroControlPreviousStatus setObject:@(_motionHandler.widgetPitchFactor) forKey:@"previousPitchFactor"];
[gyroControlPreviousStatus setObject:@(_motionHandler.widgetRollFactor) forKey:@"previousRollFactor"]; [gyroControlPreviousStatus setObject:@(_motionHandler.widgetRollFactor) forKey:@"previousRollFactor"];
_motionHandler.widgetYawFactor = yawFactor; _motionHandler.widgetYawFactor = yawFactor;
_motionHandler.widgetPitchFactor = pitchFactor; _motionHandler.widgetPitchFactor = pitchFactor;
_motionHandler.widgetRollFactor = rollFactor; _motionHandler.widgetRollFactor = rollFactor;
[_motionHandler startGyroUpdate]; [_motionHandler startMotionUpdate];
return gyroControlPreviousStatus; return gyroControlPreviousStatus;
} }
@@ -2033,8 +2034,8 @@ static NSString* VLTerminationHintForErrorCode(int errorCode) {
- (NSMutableDictionary*)start:(CGFloat)yawFactor pitchFactor:(CGFloat)pitchFactor rollFactor:(CGFloat)rollFactor{ - (NSMutableDictionary*)start:(CGFloat)yawFactor pitchFactor:(CGFloat)pitchFactor rollFactor:(CGFloat)rollFactor{
NSMutableDictionary* gyroControlPreviousStatus = [NSMutableDictionary dictionary]; NSMutableDictionary* gyroControlPreviousStatus = [NSMutableDictionary dictionary];
if(!_motionHandler.gyroControlStarted){ if(!_motionHandler.motionControlStarted){
[gyroControlPreviousStatus setObject:@(_motionHandler.gyroControlStarted) forKey:@"gyroStarted"]; [gyroControlPreviousStatus setObject:@(_motionHandler.motionControlStarted) forKey:@"gyroStarted"];
} }
[gyroControlPreviousStatus setObject:@(_motionHandler.widgetYawFactor) forKey:@"previousYawFactor"]; [gyroControlPreviousStatus setObject:@(_motionHandler.widgetYawFactor) forKey:@"previousYawFactor"];
[gyroControlPreviousStatus setObject:@(_motionHandler.widgetPitchFactor) forKey:@"previousPitchFactor"]; [gyroControlPreviousStatus setObject:@(_motionHandler.widgetPitchFactor) forKey:@"previousPitchFactor"];
@@ -2043,10 +2044,11 @@ static NSString* VLTerminationHintForErrorCode(int errorCode) {
_motionHandler.widgetYawFactor = yawFactor; _motionHandler.widgetYawFactor = yawFactor;
_motionHandler.widgetPitchFactor = pitchFactor; _motionHandler.widgetPitchFactor = pitchFactor;
_motionHandler.widgetRollFactor = rollFactor; _motionHandler.widgetRollFactor = rollFactor;
[_motionHandler startGyroUpdate]; [_motionHandler startMotionUpdate];
return gyroControlPreviousStatus; return gyroControlPreviousStatus;
} }
*/
- (void)startAccelUpdate{ - (void)startAccelUpdate{
[_motionHandler startAccelUpdate]; [_motionHandler startAccelUpdate];