implementation of auto gyro mode
This commit is contained in:
1 parent
578ad81b8a
commit
0f6f105ec1
3 files changed
+60
-42
No files matched your search
@@ -53,6 +53,6 @@
|
|||||||
|
|
||||||
-(NSUInteger) getConnectedGamepadCount;
|
-(NSUInteger) getConnectedGamepadCount;
|
||||||
|
|
||||||
-(void)updateConfig:(StreamConfiguration*)streamConfig delegate:(id<ControllerSupportDelegate>)delegate;
|
-(void)updateControllerSupport:(StreamConfiguration*)streamConfig delegate:(id<ControllerSupportDelegate>)delegate;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
@@ -67,17 +67,17 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
|
|
||||||
-(void) rumble:(unsigned short)controllerNumber lowFreqMotor:(unsigned short)lowFreqMotor highFreqMotor:(unsigned short)highFreqMotor
|
-(void) rumble:(unsigned short)controllerNumber lowFreqMotor:(unsigned short)lowFreqMotor highFreqMotor:(unsigned short)highFreqMotor
|
||||||
{
|
{
|
||||||
VoidController* controller = [_voidControllers objectForKey:[NSNumber numberWithInteger:controllerNumber]];
|
VoidController* voidController = [_voidControllers objectForKey:[NSNumber numberWithInteger:controllerNumber]];
|
||||||
if (controller == nil && controllerNumber == 0 && _oscEnabled) {
|
if (voidController == nil && controllerNumber == 0 && _oscEnabled) {
|
||||||
// TODO: Rumble emulation for OSC
|
// TODO: Rumble emulation for OSC
|
||||||
}
|
}
|
||||||
if (controller == nil) {
|
if (voidController == nil) {
|
||||||
// No connected controller for this player
|
// No connected controller for this player
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
[controller.lowFreqMotor setMotorAmplitude:lowFreqMotor];
|
[voidController.lowFreqMotor setMotorAmplitude:lowFreqMotor];
|
||||||
[controller.highFreqMotor setMotorAmplitude:highFreqMotor];
|
[voidController.highFreqMotor setMotorAmplitude:highFreqMotor];
|
||||||
}
|
}
|
||||||
|
|
||||||
-(void) rumbleTriggers:(uint16_t)controllerNumber leftTrigger:(uint16_t)leftTrigger rightTrigger:(uint16_t)rightTrigger
|
-(void) rumbleTriggers:(uint16_t)controllerNumber leftTrigger:(uint16_t)leftTrigger rightTrigger:(uint16_t)rightTrigger
|
||||||
@@ -110,8 +110,6 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
uint8_t motionType = motionTypeObj.intValue;
|
uint8_t motionType = motionTypeObj.intValue;
|
||||||
NSLog(@"controller obj controllerNumber %d", voidController.controllerNumber);
|
NSLog(@"controller obj controllerNumber %d", voidController.controllerNumber);
|
||||||
|
|
||||||
if(_gyroMode != AlwaysController || voidController == _oscController){
|
|
||||||
NSLog(@"device gyro mode, motionType: %d", motionType);
|
|
||||||
#if !TARGET_OS_TV //tvOS has no device motion
|
#if !TARGET_OS_TV //tvOS has no device motion
|
||||||
if(voidController == _oscController){
|
if(voidController == _oscController){
|
||||||
//Player has no controller *or* no motion for controller 1 *or* wants to override controller 1 motion with device motion
|
//Player has no controller *or* no motion for controller 1 *or* wants to override controller 1 motion with device motion
|
||||||
@@ -205,7 +203,7 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
else{
|
else{
|
||||||
NSLog(@"controller obj timer update: controller timer ");
|
NSLog(@"controller obj timer update: controller timer ");
|
||||||
@@ -879,18 +877,18 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
|
|
||||||
if (useLegacyPausedHandler) {
|
if (useLegacyPausedHandler) {
|
||||||
controller.controllerPausedHandler = ^(GCController *controller) {
|
controller.controllerPausedHandler = ^(GCController *controller) {
|
||||||
VoidController* limeController = [self->_voidControllers objectForKey:[NSNumber numberWithInteger:controller.playerIndex]];
|
VoidController* voidController = [self->_voidControllers objectForKey:[NSNumber numberWithInteger:controller.playerIndex]];
|
||||||
|
|
||||||
// Get off the main thread
|
// Get off the main thread
|
||||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
|
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
|
||||||
[self setButtonFlag:limeController flags:PLAY_FLAG];
|
[self setButtonFlag:voidController flags:PLAY_FLAG];
|
||||||
[self updateFinished:limeController];
|
[self updateFinished:voidController];
|
||||||
|
|
||||||
// Pause for 100 ms
|
// Pause for 100 ms
|
||||||
usleep(100 * 1000);
|
usleep(100 * 1000);
|
||||||
|
|
||||||
[self clearButtonFlag:limeController flags:PLAY_FLAG];
|
[self clearButtonFlag:voidController flags:PLAY_FLAG];
|
||||||
[self updateFinished:limeController];
|
[self updateFinished:voidController];
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -1348,7 +1346,12 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
_gyroSensitivity = currentSettings.gyroSensitivity.floatValue;
|
_gyroSensitivity = currentSettings.gyroSensitivity.floatValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)updateConfig:(StreamConfiguration*)streamConfig delegate:(id<ControllerSupportDelegate>)delegate {
|
- (void)stopTimerForAllControllers{
|
||||||
|
[self stopTimerForController:_oscController];
|
||||||
|
for(VoidController* controller in _voidControllers.allValues) [self stopTimerForController:controller];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)updateControllerSupport:(StreamConfiguration*)streamConfig delegate:(id<ControllerSupportDelegate>)delegate {
|
||||||
NSLog(@"update config call");
|
NSLog(@"update config call");
|
||||||
|
|
||||||
_gyroMode = streamConfig.gyroMode;
|
_gyroMode = streamConfig.gyroMode;
|
||||||
@@ -1362,12 +1365,13 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
if (@available(iOS 14.0, tvOS 14.0, *)) {
|
if (@available(iOS 14.0, tvOS 14.0, *)) {
|
||||||
switch(_gyroMode){
|
switch(_gyroMode){
|
||||||
case GyroModeOff:
|
case GyroModeOff:
|
||||||
[self updateTimerStateForController:_oscController];
|
[self stopTimerForAllControllers];
|
||||||
for(VoidController* controller in _voidControllers.allValues) [self updateTimerStateForController:controller];
|
|
||||||
break;
|
break;
|
||||||
case GyroModeAuto:
|
case GyroModeAuto:
|
||||||
[self stopTimerForController:_oscController];
|
[self stopTimerForAllControllers];
|
||||||
for(VoidController* controller in _voidControllers.allValues) [self stopTimerForController:controller];
|
[_voidControllers removeAllObjects];
|
||||||
|
[self assignControllers];
|
||||||
|
//if(_voidControllers.count == 0) [self assignControllers];
|
||||||
if(_voidControllers.count == 0) [self updateTimerStateForController:_oscController];
|
if(_voidControllers.count == 0) [self updateTimerStateForController:_oscController];
|
||||||
else for(VoidController* controller in _voidControllers.allValues) [self updateTimerStateForController:controller];
|
else for(VoidController* controller in _voidControllers.allValues) [self updateTimerStateForController:controller];
|
||||||
// to be filled
|
// to be filled
|
||||||
@@ -1375,14 +1379,12 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
case AlwaysDevice:
|
case AlwaysDevice:
|
||||||
//[self stopTimerForController:_oscController];
|
//[self stopTimerForController:_oscController];
|
||||||
for(VoidController* controller in _voidControllers.allValues){
|
for(VoidController* controller in _voidControllers.allValues){
|
||||||
NSLog(@"stop external controller timer %@", controller);
|
|
||||||
[self stopTimerForController:controller];
|
[self stopTimerForController:controller];
|
||||||
}
|
}
|
||||||
[self updateTimerStateForController:_oscController];
|
[self updateTimerStateForController:_oscController];
|
||||||
break;
|
break;
|
||||||
case AlwaysController:
|
case AlwaysController:
|
||||||
[self stopTimerForController:_oscController];
|
[self stopTimerForAllControllers];
|
||||||
for(VoidController* controller in _voidControllers.allValues) [self stopTimerForController:controller];
|
|
||||||
for(VoidController* controller in _voidControllers.allValues) [self updateTimerStateForController:controller];
|
for(VoidController* controller in _voidControllers.allValues) [self updateTimerStateForController:controller];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1439,16 +1441,20 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
}
|
}
|
||||||
|
|
||||||
//[self->_activeGCControllers addObject:controller];
|
//[self->_activeGCControllers addObject:controller];
|
||||||
VoidController* limeController = [self assignController:controller];
|
VoidController* voidController = [self assignController:controller];
|
||||||
if (limeController) {
|
if (voidController) {
|
||||||
// Register callbacks on the new controller
|
// Register callbacks on the new controller
|
||||||
[self registerControllerCallbacks:controller];
|
[self registerControllerCallbacks:controller];
|
||||||
|
|
||||||
// Report the controller arrival to the host if we're connected
|
// Report the controller arrival to the host if we're connected
|
||||||
[self reportControllerArrival:limeController];
|
[self reportControllerArrival:voidController];
|
||||||
|
|
||||||
// Re-evaluate the on-screen control mode
|
// Re-evaluate the on-screen control mode
|
||||||
//[self updateAutoOnScreenControlMode];
|
//[self updateAutoOnScreenControlMode];
|
||||||
|
if(self->_gyroMode == GyroModeAuto || self->_gyroMode == AlwaysController){
|
||||||
|
[self stopTimerForController:self->_oscController];
|
||||||
|
[self updateTimerStateForController:voidController];
|
||||||
|
}
|
||||||
|
|
||||||
// Notify the delegate
|
// Notify the delegate
|
||||||
[self->_delegate gamepadPresenceChanged];
|
[self->_delegate gamepadPresenceChanged];
|
||||||
@@ -1475,6 +1481,8 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
|
|
||||||
VoidController* voidController = [self->_voidControllers objectForKey:[NSNumber numberWithInteger:controller.playerIndex]];
|
VoidController* voidController = [self->_voidControllers objectForKey:[NSNumber numberWithInteger:controller.playerIndex]];
|
||||||
if (voidController) {
|
if (voidController) {
|
||||||
|
[self stopTimerForController:voidController];
|
||||||
|
|
||||||
// Stop haptics on this controller
|
// Stop haptics on this controller
|
||||||
[self cleanupControllerHaptics:voidController];
|
[self cleanupControllerHaptics:voidController];
|
||||||
|
|
||||||
@@ -1493,7 +1501,11 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
[self updateFinished:voidController];
|
[self updateFinished:voidController];
|
||||||
|
|
||||||
// Re-evaluate the on-screen control mode
|
// Re-evaluate the on-screen control mode
|
||||||
[self updateAutoOnScreenControlMode];
|
//[self updateAutoOnScreenControlMode];
|
||||||
|
|
||||||
|
[self->_voidControllers removeObjectForKey:@(controller.playerIndex)];
|
||||||
|
|
||||||
|
if(self->_voidControllers.allValues.count == 0 && self->_gyroMode == GyroModeAuto) [self updateTimerStateForController:self->_oscController];
|
||||||
|
|
||||||
// Notify the delegate
|
// Notify the delegate
|
||||||
[self->_delegate gamepadPresenceChanged];
|
[self->_delegate gamepadPresenceChanged];
|
||||||
@@ -1552,9 +1564,9 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
|
|
||||||
[self updateCommonConfig:streamConfig];
|
[self updateCommonConfig:streamConfig];
|
||||||
|
|
||||||
for(VoidController* controller in _voidControllers.allValues){
|
for(VoidController* voidController in _voidControllers.allValues){
|
||||||
NSLog(@"stop external controller timer %@", controller);
|
NSLog(@"stop external controller timer %@", voidController);
|
||||||
[self stopTimerForController:controller];
|
[self stopTimerForController:voidController];
|
||||||
}
|
}
|
||||||
[self updateTimerStateForController:_oscController];
|
[self updateTimerStateForController:_oscController];
|
||||||
|
|
||||||
@@ -1581,26 +1593,32 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
dispatch_get_main_queue(), ^{
|
dispatch_get_main_queue(), ^{
|
||||||
self->_gyroMode = self->_streamConfig.gyroMode;
|
self->_gyroMode = self->_streamConfig.gyroMode;
|
||||||
if(self->_gyroMode == AlwaysController){
|
if(self->_gyroMode == AlwaysController){
|
||||||
[self stopTimerForController:self->_oscController];
|
[self stopTimerForAllControllers];
|
||||||
for(VoidController* voidController in self->_voidControllers.allValues) [self stopTimerForController:voidController];
|
|
||||||
for(VoidController* voidController in self->_voidControllers.allValues) [self updateTimerStateForController:voidController];
|
for(VoidController* voidController in self->_voidControllers.allValues) [self updateTimerStateForController:voidController];
|
||||||
//for(VoidController* controller in _voidControllers.allValues) [self updateTimerStateForController:controller];
|
}
|
||||||
|
if(self->_gyroMode == GyroModeAuto){
|
||||||
|
if(self->_voidControllers.count == 0) [self assignControllers];
|
||||||
|
if(self->_voidControllers.count == 0) nil;
|
||||||
|
else{
|
||||||
|
[self stopTimerForAllControllers];
|
||||||
|
for(VoidController* voidController in self->_voidControllers.allValues) [self updateTimerStateForController:voidController];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
-(void)stopTimerForController:(VoidController* )controller{
|
-(void)stopTimerForController:(VoidController* )voidController{
|
||||||
if (@available(iOS 14.0, *)) {
|
if (@available(iOS 14.0, *)) {
|
||||||
NSLog(@"stop controller obj: %@, hasAcc %d, hasGyro %d", controller, controller.hasAccelerometer, controller.hasGyroscope);
|
NSLog(@"stop controller obj: %@, hasAcc %d, hasGyro %d", voidController, voidController.hasAccelerometer, voidController.hasGyroscope);
|
||||||
// return;
|
// return;
|
||||||
if(controller.hasAccelerometer){
|
if(voidController.hasAccelerometer){
|
||||||
[controller.accelTimer invalidate];
|
[voidController.accelTimer invalidate];
|
||||||
controller.accelTimer = nil;
|
voidController.accelTimer = nil;
|
||||||
}
|
}
|
||||||
if(controller.hasGyroscope){
|
if(voidController.hasGyroscope){
|
||||||
[controller.gyroTimer invalidate];
|
[voidController.gyroTimer invalidate];
|
||||||
controller.gyroTimer = nil;
|
voidController.gyroTimer = nil;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -197,7 +197,7 @@
|
|||||||
[self.mainFrameViewcontroller reloadStreamConfig]; // reload streamconfig
|
[self.mainFrameViewcontroller reloadStreamConfig]; // reload streamconfig
|
||||||
|
|
||||||
NSLog(@"viewJustloaded: %d", viewJustLoaded);
|
NSLog(@"viewJustloaded: %d", viewJustLoaded);
|
||||||
if(!viewJustLoaded) [_controllerSupport updateConfig:self.streamConfig delegate:self];
|
if(!viewJustLoaded) [_controllerSupport updateControllerSupport:self.streamConfig delegate:self];
|
||||||
else viewJustLoaded = false;
|
else viewJustLoaded = false;
|
||||||
// reload controllerSupport obj, this is mandatory for OSC reload,especially when the stream view is launched without OSC
|
// reload controllerSupport obj, this is mandatory for OSC reload,especially when the stream view is launched without OSC
|
||||||
[_streamView setupStreamView:_controllerSupport interactionDelegate:self config:self.streamConfig streamFrameTopLayerView:self.view]; //reinitiate setupStreamView process.
|
[_streamView setupStreamView:_controllerSupport interactionDelegate:self config:self.streamConfig streamFrameTopLayerView:self.view]; //reinitiate setupStreamView process.
|
||||||
@@ -220,7 +220,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
-(void)automaticallyStartSendingGyroEvents{
|
-(void)automaticallyStartSendingGyroEvents{
|
||||||
[_controllerSupport updateConfig:self.streamConfig delegate:self];// reload controllerSupport obj, this is mandatory for OSC reload,especially when the stream view is launched without OSC
|
[_controllerSupport updateControllerSupport:self.streamConfig delegate:self];// reload controllerSupport obj, this is mandatory for OSC reload,especially when the stream view is launched without OSC
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user