diff --git a/PanoPainter/AppDelegate.h b/PanoPainter/AppDelegate.h index c7f3efe..3db453b 100644 --- a/PanoPainter/AppDelegate.h +++ b/PanoPainter/AppDelegate.h @@ -15,6 +15,7 @@ - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options; +- (float)sonarpen_pressure; @end diff --git a/PanoPainter/AppDelegate.m b/PanoPainter/AppDelegate.m index fd29181..49503d8 100644 --- a/PanoPainter/AppDelegate.m +++ b/PanoPainter/AppDelegate.m @@ -9,6 +9,7 @@ #import "AppDelegate.h" #import "GameViewController.h" #include "app.h" +#include void global_exception_handler(NSException* e) { @@ -28,6 +29,7 @@ void global_signal_handler(int e) @interface AppDelegate () { GameViewController* view; + WTSonarPenDriver* sonarpen_driver; } @end @@ -40,9 +42,38 @@ void global_signal_handler(int e) return true; } +- (float)sonarpen_pressure +{ + return [sonarpen_driver isPenAttached] ? [sonarpen_driver pressure] : 1.f; +} + +- (void)penStatusChanged +{ + switch (sonarpen_driver.state) { + case WTSonarPenDriverStateInit: + NSLog(@"Status: Initializing"); break; + case WTSonarPenDriverStateRunning: + NSLog(@"Status: Running"); break; + case WTSonarPenDriverStateCalibrating: + NSLog(@"Status: Calibrating"); break; + case WTSonarPenDriverStateNotSonarPen: + NSLog(@"Status: Not a Sonar Pen"); break; + case WTSonarPenDriverStateCalibratingMax: + NSLog(@"Status: Calibrating Max Value"); break; + case WTSonarPenDriverStateWaitingForPermission: + NSLog(@"Status: Wait for Permission"); break; + case WTSonarPenDriverStateNoMicrophonePermission: + NSLog(@"Status: No Microphone Permission"); break; + } +} + - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. NSSetUncaughtExceptionHandler(&global_exception_handler); + sonarpen_driver = [[WTSonarPenDriver alloc] initWithApplication:application]; + [sonarpen_driver start]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(penStatusChanged) name:WTSonarPenDriverStateChangedNotification object:nil]; + view = (GameViewController*)self.window.rootViewController; return YES; } diff --git a/PanoPainter/GameViewController.h b/PanoPainter/GameViewController.h index 824fc1c..149f20d 100644 --- a/PanoPainter/GameViewController.h +++ b/PanoPainter/GameViewController.h @@ -8,6 +8,7 @@ #import #import +#import "AppDelegate.h" @interface GameViewController : GLKViewController { diff --git a/PanoPainter/GameViewController.m b/PanoPainter/GameViewController.m index 346d8c4..482700e 100644 --- a/PanoPainter/GameViewController.m +++ b/PanoPainter/GameViewController.m @@ -276,6 +276,8 @@ std::set ignored_touch; UITouch *touch = valid_touches[0]; CGPoint touchLocation = [touch locationInView:self.view]; float force = touch.type == UITouchType::UITouchTypeStylus ? touch.force : 1.0f; + AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate]; + force = [app sonarpen_pressure]; if (t_count == 2) { //App::I.gesture_end(); diff --git a/PanoPainter/Info.plist b/PanoPainter/Info.plist index d842bd6..89623d7 100644 --- a/PanoPainter/Info.plist +++ b/PanoPainter/Info.plist @@ -41,6 +41,8 @@ NSPhotoLibraryUsageDescription Export the panoramic to the gallery + NSMicrophoneUsageDescription + Use the audio jack for the SonarPen UIFileSharingEnabled UILaunchStoryboardName diff --git a/engine.xcodeproj/project.pbxproj b/engine.xcodeproj/project.pbxproj index 993b3cd..14c57f6 100644 --- a/engine.xcodeproj/project.pbxproj +++ b/engine.xcodeproj/project.pbxproj @@ -234,6 +234,10 @@ ADD7D2AF1EBFA35F00D5A897 /* libcurl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADD7D2AE1EBFA35F00D5A897 /* libcurl.a */; }; ADD7D2B11EBFA42600D5A897 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = ADD7D2B01EBFA42600D5A897 /* libz.tbd */; }; ADD7D2B31EBFA42C00D5A897 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADD7D2B21EBFA42C00D5A897 /* Security.framework */; }; + ADE0862D212395B600945972 /* libSonarPenUniversal.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADE0862C212395B500945972 /* libSonarPenUniversal.a */; }; + ADE0862F21239C9200945972 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADE0862E21239C9100945972 /* AudioToolbox.framework */; }; + ADE0863121239CDA00945972 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADE0863021239CD900945972 /* MediaPlayer.framework */; }; + ADE0863321239D0700945972 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADE0863221239D0700945972 /* Accelerate.framework */; }; ADE22BE5211904AB00D5F44B /* node_panel_grid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ADE22BE3211904AA00D5F44B /* node_panel_grid.cpp */; }; ADE22BE6211904AB00D5F44B /* node_panel_grid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ADE22BE3211904AA00D5F44B /* node_panel_grid.cpp */; }; ADE22BE7211904AB00D5F44B /* node_panel_grid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ADE22BE3211904AA00D5F44B /* node_panel_grid.cpp */; }; @@ -477,6 +481,10 @@ ADD7D2AE1EBFA35F00D5A897 /* libcurl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcurl.a; path = "../../Downloads/curl-android-ios-master/prebuilt-with-ssl/iOS/arm64/libcurl.a"; sourceTree = ""; }; ADD7D2B01EBFA42600D5A897 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.2.sdk/usr/lib/libz.tbd; sourceTree = DEVELOPER_DIR; }; ADD7D2B21EBFA42C00D5A897 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.2.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + ADE0862C212395B500945972 /* libSonarPenUniversal.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libSonarPenUniversal.a; path = libs/libSonarPen/libSonarPenUniversal.a; sourceTree = ""; }; + ADE0862E21239C9100945972 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = DEVELOPER_DIR; }; + ADE0863021239CD900945972 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/Frameworks/MediaPlayer.framework; sourceTree = DEVELOPER_DIR; }; + ADE0863221239D0700945972 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; ADE22BE3211904AA00D5F44B /* node_panel_grid.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = node_panel_grid.cpp; sourceTree = ""; }; ADE22BE4211904AA00D5F44B /* node_panel_grid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = node_panel_grid.h; sourceTree = ""; }; ADE491111F86D09100FB8E92 /* shapes.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = shapes.cc; path = libs/poly2tri/poly2tri/common/shapes.cc; sourceTree = ""; }; @@ -537,6 +545,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + ADE0863321239D0700945972 /* Accelerate.framework in Frameworks */, + ADE0863121239CDA00945972 /* MediaPlayer.framework in Frameworks */, + ADE0862F21239C9200945972 /* AudioToolbox.framework in Frameworks */, AD3087C82061D1CD009F9260 /* CoreGraphics.framework in Frameworks */, AD3087C62061D1B4009F9260 /* CoreVideo.framework in Frameworks */, AD3087C2205F016F009F9260 /* AVFoundation.framework in Frameworks */, @@ -544,6 +555,7 @@ AD30D8331F8049BD00B6A112 /* Photos.framework in Frameworks */, AD759B691F279B3900211963 /* GLKit.framework in Frameworks */, ADD7D2B31EBFA42C00D5A897 /* Security.framework in Frameworks */, + ADE0862D212395B600945972 /* libSonarPenUniversal.a in Frameworks */, ADD7D2B11EBFA42600D5A897 /* libz.tbd in Frameworks */, AD759B681F2796EA00211963 /* OpenGLES.framework in Frameworks */, ADD7D28D1EBF9D6F00D5A897 /* CoreFoundation.framework in Frameworks */, @@ -559,6 +571,9 @@ AD06989520CC6C210010825F /* iOS */ = { isa = PBXGroup; children = ( + ADE0863221239D0700945972 /* Accelerate.framework */, + ADE0863021239CD900945972 /* MediaPlayer.framework */, + ADE0862E21239C9100945972 /* AudioToolbox.framework */, AD06989620CC6C350010825F /* ZipArchive.framework */, ); name = iOS; @@ -749,6 +764,7 @@ AD58E0731E3421CB006ACC15 /* libs */ = { isa = PBXGroup; children = ( + ADE0862C212395B500945972 /* libSonarPenUniversal.a */, ADD7D2AE1EBFA35F00D5A897 /* libcurl.a */, ADE491101F86D07900FB8E92 /* p2t */, AD0E11A21ECA61B500CDA6BB /* jpge.cpp */, @@ -1696,11 +1712,15 @@ libs/jpeg, libs/poly2tri/poly2tri, libs/base64, + libs/libSonarPen/include, ); INFOPLIST_FILE = PanoPainter/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "/Users/omimac/Downloads/curl-android-ios-master/prebuilt-with-ssl/iOS"; + LIBRARY_SEARCH_PATHS = ( + "/Users/omimac/Downloads/curl-android-ios-master/prebuilt-with-ssl/iOS", + "$(PROJECT_DIR)/libs/libSonarPen", + ); PRODUCT_BUNDLE_IDENTIFIER = com.omixlab.panopainter.ios; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -1730,11 +1750,15 @@ libs/jpeg, libs/poly2tri/poly2tri, libs/base64, + libs/libSonarPen/include, ); INFOPLIST_FILE = PanoPainter/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "/Users/omimac/Downloads/curl-android-ios-master/prebuilt-with-ssl/iOS"; + LIBRARY_SEARCH_PATHS = ( + "/Users/omimac/Downloads/curl-android-ios-master/prebuilt-with-ssl/iOS", + "$(PROJECT_DIR)/libs/libSonarPen", + ); PRODUCT_BUNDLE_IDENTIFIER = com.omixlab.panopainter.ios; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; diff --git a/libs/libSonarPen/include/WTSonarPenDriver.h b/libs/libSonarPen/include/WTSonarPenDriver.h new file mode 100755 index 0000000..b0604ea --- /dev/null +++ b/libs/libSonarPen/include/WTSonarPenDriver.h @@ -0,0 +1,60 @@ +// +// WTSonarPenDriver.h +// +// Created by Water Lou on 8/7/14. +// Copyright (c) 2014 First Water Tech Ltd. All rights reserved. +// + +#import +#import + +extern NSString *const _Nonnull WTSonarPenDriverStateChangedNotification; + +typedef NS_ENUM(NSInteger, WTAudioPenDriverState) { + WTSonarPenDriverStateInit = 0, // wait for pen attach + WTSonarPenDriverStateCalibrating = 1, // calc min value (when audio source just switched + WTSonarPenDriverStateRunning = 2, // running + WTSonarPenDriverStateCalibratingMax = 3, // calibrating max value + WTSonarPenDriverStateNotSonarPen = 4, // headphone plugged but no a sonarpen, audio sound disabled + WTSonarPenDriverStateWaitingForPermission = 5, // starting, wait for user permission for microphone + WTSonarPenDriverStateNoMicrophonePermission = 6, // no started, no microphone permission +}; + +@class WTSonarPenDriver; + +@protocol WTSonarPenDriverDelegate +@optional +- (void)sonarPenButtonPressed:(WTSonarPenDriver* _Nonnull)driver; +@end + + + +@interface WTSonarPenDriver : NSObject + +- (instancetype _Nonnull)init NS_UNAVAILABLE; // please call initWithApplication instead +- (instancetype _Nonnull) initWithApplication: (UIApplication * _Nullable)application NS_DESIGNATED_INITIALIZER; + +- (void) start; +- (void) stop; + +- (BOOL) isPenDown; // is pen touched +- (CGFloat) pressure; // current pressure +- (BOOL) isPenAttached; +- (WTAudioPenDriverState) state; // pen drive state + +/// If button on the pen is pressed +- (BOOL) isButtonDown; + +// set to YES, the driver will use current pressure as idle state value +// developer can set this to YES will no touch is detected, and NO with touch +@property (nonatomic) BOOL calibratingIdleValue; +@property (nonatomic) BOOL shouldCheckPenOnStart; // detect pen when plug + +@property (nonatomic, weak, nullable) id delegate; + +//- (void)startFullCalibration; + +@end + +BOOL isHeadphoneplugged(AVAudioSessionRouteDescription * _Nonnull route); + diff --git a/libs/libSonarPen/include/WTSonarPenTouchesHandler.h b/libs/libSonarPen/include/WTSonarPenTouchesHandler.h new file mode 100755 index 0000000..6b15f1c --- /dev/null +++ b/libs/libSonarPen/include/WTSonarPenTouchesHandler.h @@ -0,0 +1,28 @@ +// +// WTSonarPenTouchesHandler.h +// +// Created by Water Lou on 3/7/15. +// Copyright (c) 2015 First Water Tech Ltd. All rights reserved. +// + +#import + +@interface WTSonarPenTouchesHandler : NSObject + +- (void)handleTouches:(UIEvent * _Nullable)event + view:(UIView * _Nonnull)view + penDown:(BOOL)penDownStatus; + +// check if pen is down +- (BOOL)isPenDown; +// check if touch with large size touch +- (BOOL)isPalmTouchedBySize; + +// get pen location if pen is down +- (CGPoint)penLocation; +// touch object that detect as pen +@property(readonly, nullable) UITouch *penTouch; + +- (NSInteger)numberOfTouches; + +@end diff --git a/libs/libSonarPen/libSonarPenUniversal.a b/libs/libSonarPen/libSonarPenUniversal.a new file mode 100755 index 0000000..5a9698c Binary files /dev/null and b/libs/libSonarPen/libSonarPenUniversal.a differ