├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md └── phyphox-iOS ├── Gemfile ├── fastlane ├── Appfile ├── Fastfile ├── Snapfile └── SnapshotHelper.swift ├── phyphox screenshots ├── Info.plist └── phyphox_screenshots.swift ├── phyphox.xcodeproj ├── project.pbxproj └── xcshareddata │ └── xcschemes │ └── phyphox screenshots.xcscheme ├── phyphox ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── icon_ios-1024.png │ │ ├── icon_ios-20.png │ │ ├── icon_ios-20@2x.png │ │ ├── icon_ios-20@3x.png │ │ ├── icon_ios-29.png │ │ ├── icon_ios-29@2x.png │ │ ├── icon_ios-29@3x.png │ │ ├── icon_ios-40.png │ │ ├── icon_ios-40@2x.png │ │ ├── icon_ios-40@3x.png │ │ ├── icon_ios-60@2x.png │ │ ├── icon_ios-60@3x.png │ │ ├── icon_ios-76.png │ │ ├── icon_ios-76@2x.png │ │ └── icon_ios-83.5@2x.png │ ├── Contents.json │ ├── Image.imageset │ │ └── Contents.json │ ├── bluetooth_signal_0.imageset │ │ ├── Contents.json │ │ └── bluetooth_signal_0.pdf │ ├── bluetooth_signal_1.imageset │ │ ├── Contents.json │ │ └── bluetooth_signal_1.pdf │ ├── bluetooth_signal_2.imageset │ │ ├── Contents.json │ │ └── bluetooth_signal_2.pdf │ ├── bluetooth_signal_3.imageset │ │ ├── Contents.json │ │ └── bluetooth_signal_3.pdf │ ├── bluetooth_signal_4.imageset │ │ ├── Contents.json │ │ └── bluetooth_signal_4.pdf │ ├── cellular_level_0.imageset │ │ ├── Contents.json │ │ └── cellularbars.level.0.svg │ ├── cellular_level_1.imageset │ │ ├── Contents.json │ │ └── cellularbars.level.1.svg │ ├── cellular_level_2.imageset │ │ ├── Contents.json │ │ └── cellularbars.level.2.svg │ ├── cellular_level_3.imageset │ │ ├── Contents.json │ │ └── cellularbars.level.3.svg │ ├── cellular_level_4.imageset │ │ ├── Contents.json │ │ └── cellularbars.svg │ ├── egm84_30.pgm │ ├── logo_stack.imageset │ │ ├── Contents.json │ │ └── logo_stack.png │ ├── more.imageset │ │ ├── Contents.json │ │ └── more.pdf │ ├── new_experiment_bluetooth.imageset │ │ ├── Contents.json │ │ └── new_experiment_bluetooth.pdf │ ├── new_experiment_qr.imageset │ │ ├── Contents.json │ │ └── new_experiment_qr.pdf │ ├── new_experiment_simple.imageset │ │ ├── Contents.json │ │ └── new_experiment_simple.pdf │ ├── pan_zoom.imageset │ │ ├── Contents.json │ │ └── panzoom-2.pdf │ ├── phyphox_dark.imageset │ │ ├── Contents.json │ │ └── phyphox_dark.png │ ├── pick.imageset │ │ ├── Contents.json │ │ └── pick-3.pdf │ ├── rwth.imageset │ │ ├── Contents.json │ │ └── rwth_rgb.png │ ├── unfold_less.imageset │ │ ├── Contents.json │ │ ├── arrow.down.right.and.arrow.up.left 1.svg │ │ ├── arrow.down.right.and.arrow.up.left.svg │ │ └── unfold_less.pdf │ └── unfold_more.imageset │ │ ├── Contents.json │ │ ├── arrow.up.left.and.arrow.down.right 1.svg │ │ ├── arrow.up.left.and.arrow.down.right.svg │ │ └── unfold_more.pdf ├── Base.lproj │ └── LaunchScreen.storyboard ├── CRC32InputStream.swift ├── Constants.swift ├── Experiments │ ├── Analysis │ │ ├── ExperimentAnalysis.swift │ │ ├── ExperimentAnalysisDataIO.swift │ │ ├── ExperimentAnalysisModule.swift │ │ ├── FormulaParser.swift │ │ └── Modules │ │ │ ├── Abstract │ │ │ ├── ExperimentComplexUpdateValueAnalysis.swift │ │ │ └── UpdateValueAnalysis.swift │ │ │ ├── AppendAnalysis.swift │ │ │ ├── AutocorrelationAnalysis.swift │ │ │ ├── AverageAnalysis.swift │ │ │ ├── BinningAnalysis.swift │ │ │ ├── Complex-Update-Value │ │ │ ├── AdditionAnalysis.swift │ │ │ ├── Atan2Analysis.swift │ │ │ ├── DivisionAnalysis.swift │ │ │ ├── GCDAnalysis.swift │ │ │ ├── LCMAnalysis.swift │ │ │ ├── MultiplicationAnalysis.swift │ │ │ ├── PowerAnalysis.swift │ │ │ └── SubtractionAnalysis.swift │ │ │ ├── ConstGeneratorAnalysis.swift │ │ │ ├── CountAnalysis.swift │ │ │ ├── CrosscorrelationAnalysis.swift │ │ │ ├── DifferentiationAnalysis.swift │ │ │ ├── FFTAnalysis.swift │ │ │ ├── FirstAnalysis.swift │ │ │ ├── FormulaAnalysis.swift │ │ │ ├── GaussSmoothAnalysis.swift │ │ │ ├── IfAnalysis.swift │ │ │ ├── IntegrationAnalysis.swift │ │ │ ├── InterpolateAnalysis.swift │ │ │ ├── LoessAnalysis.swift │ │ │ ├── MapAnalysis.swift │ │ │ ├── MatchAnalysis.swift │ │ │ ├── MaxAnalysis.swift │ │ │ ├── MinAnalysis.swift │ │ │ ├── PeriodicityAnalysis.swift │ │ │ ├── RampGeneratorAnalysis.swift │ │ │ ├── RangefilterAnalysis.swift │ │ │ ├── ReduceAnalysis.swift │ │ │ ├── Simple-Update-Value │ │ │ ├── ABSAnalysis.swift │ │ │ ├── AcosAnalysis.swift │ │ │ ├── AsinAnalysis.swift │ │ │ ├── AtanAnalysis.swift │ │ │ ├── CosAnalysis.swift │ │ │ ├── CoshAnalysis.swift │ │ │ ├── LogAnalysis.swift │ │ │ ├── RoundAnalysis.swift │ │ │ ├── SinAnalysis.swift │ │ │ ├── SinhAnalysis.swift │ │ │ ├── TanAnalysis.swift │ │ │ └── TanhAnalysis.swift │ │ │ ├── SortAnalysis.swift │ │ │ ├── SubrangeAnalysis.swift │ │ │ ├── ThresholdAnalysis.swift │ │ │ └── TimerAnalysis.swift │ ├── AudioEngine.swift │ ├── BluetoothDevice.swift │ ├── BluetoothScan.swift │ ├── Data-Input │ │ ├── ConfigConversion.swift │ │ ├── ExperimentAudioInput.swift │ │ ├── ExperimentBluetoothInput.swift │ │ ├── ExperimentDepthInput.swift │ │ ├── ExperimentDepthInputSession.swift │ │ ├── ExperimentGPSInput.swift │ │ ├── ExperimentSensorInput.swift │ │ ├── GpsGeoid.swift │ │ ├── InputConversion.swift │ │ ├── MotionSession.swift │ │ ├── OutputConversion.swift │ │ └── SerialProtocol.swift │ ├── DataContainers │ │ └── DataBuffer.swift │ ├── Experiment.swift │ ├── ExperimentCollection.swift │ ├── ExperimentIcon.swift │ ├── ExperimentManager.swift │ ├── ExperimentTimeReference.swift │ ├── ExperimentTranslation.swift │ ├── ExperimentTranslationCollection.swift │ ├── Export │ │ ├── ExperimentExport.swift │ │ └── ExperimentExportSet.swift │ ├── Metadata.swift │ ├── NetworkConnection │ │ ├── NetworkConnection.swift │ │ ├── NetworkConversion.swift │ │ ├── NetworkDiscovery.swift │ │ └── NetworkService.swift │ ├── Output │ │ ├── ExperimentAudioOutput.swift │ │ └── ExperimentBluetoothOutput.swift │ ├── SemanticVersion.swift │ ├── Serialization │ │ ├── DocumentParser │ │ │ ├── DocumentParser+Extensions.swift │ │ │ └── DocumentParser.swift │ │ ├── ExperimentSerialization.swift │ │ ├── Handlers │ │ │ ├── AnalysisElementHandler.swift │ │ │ ├── ColorElementHandler.swift │ │ │ ├── DataContainersElementHandler.swift │ │ │ ├── EventsElementHandler.swift │ │ │ ├── ExperimentAnalysisFactory.swift │ │ │ ├── ExportElementHandler.swift │ │ │ ├── IconElementHandler.swift │ │ │ ├── InputElementHandler.swift │ │ │ ├── LinkElementHandler.swift │ │ │ ├── MultilineTextElementHandler.swift │ │ │ ├── NetworkElementHandler.swift │ │ │ ├── OutputElementHandler.swift │ │ │ ├── PhyphoxDocumentHandler.swift │ │ │ ├── PhyphoxElementHandler.swift │ │ │ ├── TextElementHandler.swift │ │ │ ├── TranslationsElementHandler.swift │ │ │ ├── ViewHandlers │ │ │ │ ├── ButtonViewElementHandler.swift │ │ │ │ ├── DepthGUIViewElementHandler.swift │ │ │ │ ├── EditViewElementHandler.swift │ │ │ │ ├── GraphViewElementHandler.swift │ │ │ │ ├── InfoViewElementHandler.swift │ │ │ │ ├── SeparatorViewElementHandler.swift │ │ │ │ └── ValueViewElementHandler.swift │ │ │ └── ViewsElementHandler.swift │ │ ├── LegacyStateSerializer.swift │ │ └── SimpleExperimentSerializer.swift │ └── ViewDescriptors │ │ ├── ButtonViewDescriptor.swift │ │ ├── DepthGUIDescriptor.swift │ │ ├── EditViewDescriptor.swift │ │ ├── ExperimentViewCollectionDescriptor.swift │ │ ├── GraphViewDescriptor.swift │ │ ├── InfoViewDescriptor.swift │ │ ├── SeparatorViewDescriptor.swift │ │ ├── ValueViewDescriptor.swift │ │ └── ViewDescriptor.swift ├── Helper │ ├── ColorConverterHelper.swift │ ├── SettingsBundleHelper.swift │ └── Utility.swift ├── Info.plist ├── Licenses │ ├── Licenses.ptf │ └── PTFile.swift ├── Settings.bundle │ ├── Root.plist │ ├── ar.lproj │ │ └── Root.strings │ ├── az.lproj │ │ └── Root.strings │ ├── bn.lproj │ │ └── Root.strings │ ├── ca.lproj │ │ └── Root.strings │ ├── cs.lproj │ │ └── Root.strings │ ├── da.lproj │ │ └── Root.strings │ ├── de.lproj │ │ └── Root.strings │ ├── el.lproj │ │ └── Root.strings │ ├── en.lproj │ │ └── Root.strings │ ├── es.lproj │ │ └── Root.strings │ ├── fa.lproj │ │ └── Root.strings │ ├── fr.lproj │ │ └── Root.strings │ ├── hi.lproj │ │ └── Root.strings │ ├── hu.lproj │ │ └── Root.strings │ ├── id.lproj │ │ └── Root.strings │ ├── it.lproj │ │ └── Root.strings │ ├── ja.lproj │ │ └── Root.strings │ ├── ka.lproj │ │ └── Root.strings │ ├── nl.lproj │ │ └── Root.strings │ ├── pl.lproj │ │ └── Root.strings │ ├── pt.lproj │ │ └── Root.strings │ ├── ru.lproj │ │ └── Root.strings │ ├── sl.lproj │ │ └── Root.strings │ ├── sr-Latn.lproj │ │ └── Root.strings │ ├── sr.lproj │ │ └── Root.strings │ ├── sv.lproj │ │ └── Root.strings │ ├── ta.lproj │ │ └── Root.strings │ ├── tr.lproj │ │ └── Root.strings │ ├── uk.lproj │ │ └── Root.strings │ ├── vi.lproj │ │ └── Root.strings │ ├── zh-Hans.lproj │ │ └── Root.strings │ └── zh-Hant.lproj │ │ └── Root.strings ├── UI │ ├── CollectionView │ │ ├── CollectionView.swift │ │ └── CollectionViewController.swift │ ├── Extensions │ │ ├── UIAlertController+PTExtensions.h │ │ ├── UIAlertController+PTExtensions.m │ │ ├── UIColor+Expanded.h │ │ ├── UIColor+Expanded.m │ │ ├── UIColorExtensions.swift │ │ └── UIImageExt.swift │ ├── KeyboardTracker.swift │ ├── MainView │ │ ├── BluetoothScanResultsTableViewController.swift │ │ ├── CreateExperiment │ │ │ ├── CreateExperimentViewController.swift │ │ │ ├── PresentationController │ │ │ │ ├── CreatePresentationController.swift │ │ │ │ ├── CreateViewControllerTransition.swift │ │ │ │ └── CreateViewControllerTransitioningDelegate.swift │ │ │ └── TextFieldTableViewCell.swift │ │ ├── CreditsView.swift │ │ ├── ExperimentCell.swift │ │ ├── ExperimentHeaderView.swift │ │ ├── ExperimentPickerView.swift │ │ ├── ExperimentPickerViewController.swift │ │ ├── ExperimentView │ │ │ ├── ConnectedBluetoothDeviceViewController.swift │ │ │ ├── ExperimentExportSetSelectionView.swift │ │ │ ├── ExperimentPageViewController.swift │ │ │ ├── ExperimentTimedRunDialogView.swift │ │ │ ├── ExperimentViewController.swift │ │ │ ├── ExperimentViewModuleTableViewCell.swift │ │ │ ├── HintBubbleViewController.swift │ │ │ ├── UIExperimentTabControl.swift │ │ │ ├── ViewModules │ │ │ │ ├── Dynamic │ │ │ │ │ ├── ApplyZoomDialog.swift │ │ │ │ │ ├── ExperimentEditView.swift │ │ │ │ │ ├── ExperimentGraphView.swift │ │ │ │ │ ├── ExperimentValueView.swift │ │ │ │ │ └── Graph │ │ │ │ │ │ ├── ExperimentGraphUtilities.swift │ │ │ │ │ │ ├── FragmentShader.glsl │ │ │ │ │ │ ├── GLGraphShaderProgram.swift │ │ │ │ │ │ ├── GLGraphView.swift │ │ │ │ │ │ ├── GLMapShaderProgram.swift │ │ │ │ │ │ ├── GLRangedPointGraphView.swift │ │ │ │ │ │ ├── Grid │ │ │ │ │ │ ├── GraphGridLineView.swift │ │ │ │ │ │ ├── GraphGridView.swift │ │ │ │ │ │ └── GraphPauseMarkerView.swift │ │ │ │ │ │ ├── MapFragmentShader.glsl │ │ │ │ │ │ ├── MapVertexShader.glsl │ │ │ │ │ │ ├── MarkerOverlayView.swift │ │ │ │ │ │ ├── PointCollection.swift │ │ │ │ │ │ └── VertexShader.glsl │ │ │ │ ├── ExperimentViewModule.swift │ │ │ │ ├── ExperimentViewModuleFactory.swift │ │ │ │ └── Static │ │ │ │ │ ├── DepthGUI │ │ │ │ │ ├── ExperimentDepthGUIRenderer.swift │ │ │ │ │ ├── ShaderTypes.h │ │ │ │ │ └── Shaders.metal │ │ │ │ │ ├── ExperimentButtonView.swift │ │ │ │ │ ├── ExperimentDepthGUIView.swift │ │ │ │ │ ├── ExperimentInfoView.swift │ │ │ │ │ └── ExperimentSeparatorView.swift │ │ │ └── WebServer │ │ │ │ ├── ExperimentWebServer.swift │ │ │ │ └── WebServerUtilities.swift │ │ ├── ExperimentsCollectionViewController.swift │ │ ├── FixedTableView.swift │ │ ├── MainView.swift │ │ ├── MenuTableViewController.swift │ │ ├── NavigationController │ │ │ ├── MainNavigationBar.swift │ │ │ └── MainNavigationViewController.swift │ │ ├── PTButton.h │ │ ├── PTButton.m │ │ ├── PhyphoxUIAlertBuilder.swift │ │ └── ScannerViewController.swift │ └── ShrinkingAnimaitonViewController.swift ├── ar.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── bn.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── ca.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── color.xcassets │ ├── Contents.json │ ├── Image.imageset │ │ └── Contents.json │ ├── RWTHBackgroundColor.colorset │ │ └── Contents.json │ ├── RWTHBlue.colorset │ │ └── Contents.json │ ├── RWTHTextColor.colorset │ │ └── Contents.json │ ├── backgroundDark.colorset │ │ └── Contents.json │ ├── bluetoothColor.colorset │ │ └── Contents.json │ ├── darkenedColor.colorset │ │ └── Contents.json │ ├── dialogBackground.colorset │ │ └── Contents.json │ ├── dialogTextColor.colorset │ │ └── Contents.json │ ├── graphLines.colorset │ │ └── Contents.json │ ├── graphLinesWithAlpha.colorset │ │ └── Contents.json │ ├── highlightColor.colorset │ │ └── Contents.json │ ├── lightBackgroundColor.colorset │ │ └── Contents.json │ ├── lightBackgroundHoverColor.colorset │ │ └── Contents.json │ ├── mainBackground.colorset │ │ └── Contents.json │ ├── markerLabel.colorset │ │ └── Contents.json │ ├── secondaryBackground.colorset │ │ └── Contents.json │ ├── textColor.colorset │ │ └── Contents.json │ ├── textColorDeactivated.colorset │ │ └── Contents.json │ ├── textSecondaryColor.colorset │ │ └── Contents.json │ └── textUnavailableColor.colorset │ │ └── Contents.json ├── cs.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── da.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── de.lproj │ ├── InfoPlist.strings │ ├── LaunchScreen.strings │ └── Localizable.strings ├── el.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── en.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── es.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── fa.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── fr.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── hi.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── hu.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── id.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── it.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── ja.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── ka.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── ko.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── localizationHelper.swift ├── nl.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── phyphox-Bridging-Header.h ├── pl.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── pt.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── ru.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── sl.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── sr.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── sr_Latn.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── sv.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── ta.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── tr.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── uk.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── vi.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── zh_Hans.lproj │ ├── InfoPlist.strings │ └── Localizable.strings └── zh_Hant.lproj │ ├── InfoPlist.strings │ └── Localizable.strings └── phyphoxTests ├── BufferTests.swift ├── DeserializerTests.swift ├── Info.plist ├── full-skeleton.phyphox ├── incorrect-files ├── experiment1.phyphox ├── experiment10.phyphox ├── experiment11.phyphox ├── experiment2.phyphox ├── experiment3.phyphox ├── experiment4.phyphox ├── experiment5.phyphox ├── experiment6.phyphox ├── experiment7.phyphox ├── experiment8.phyphox └── experiment9.phyphox └── phyphoxTests.swift /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | *.xcworkspace 13 | !default.xcworkspace 14 | xcuserdata 15 | profile 16 | *.moved-aside 17 | DerivedData 18 | .idea/ 19 | .nogit 20 | *.xcappdata 21 | Android 22 | External/* 23 | !External/checkout* 24 | !External/XMLDictionary 25 | External/XMLDictionary/* 26 | !External/XMLDictionary/XMLDictionary 27 | phyphox-iOS/fastlane/screenshots/* 28 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "phyphox-experiments"] 2 | path = phyphox-experiments 3 | url = https://github.com/kuhlen/phyphox-experiments 4 | [submodule "phyphox-webinterface"] 5 | path = phyphox-webinterface 6 | url = https://github.com/Kuhlen/phyphox-webinterface 7 | [submodule "phyphox-iOS/CocoaMQTT"] 8 | path = phyphox-iOS/CocoaMQTT 9 | url = https://github.com/phyphox/CocoaMQTT.git 10 | [submodule "phyphox-iOS/ZipZap"] 11 | path = phyphox-iOS/ZipZap 12 | url = https://github.com/pixelglow/ZipZap.git 13 | [submodule "phyphox-iOS/JXLS"] 14 | path = phyphox-iOS/JXLS 15 | url = https://github.com/JanX2/JXLS.git 16 | -------------------------------------------------------------------------------- /phyphox-iOS/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | -------------------------------------------------------------------------------- /phyphox-iOS/fastlane/Appfile: -------------------------------------------------------------------------------- 1 | app_identifier("de.rwth-aachen.physics.phyphox") # The bundle identifier of your app 2 | # apple_id("[[APPLE_ID]]") # Your Apple email address 3 | 4 | 5 | # For more information about the Appfile, see: 6 | # https://docs.fastlane.tools/advanced/#appfile 7 | -------------------------------------------------------------------------------- /phyphox-iOS/fastlane/Fastfile: -------------------------------------------------------------------------------- 1 | # This file contains the fastlane.tools configuration 2 | # You can find the documentation at https://docs.fastlane.tools 3 | # 4 | # For a list of all available actions, check out 5 | # 6 | # https://docs.fastlane.tools/actions 7 | # 8 | # For a list of all available plugins, check out 9 | # 10 | # https://docs.fastlane.tools/plugins/available-plugins 11 | # 12 | 13 | # Uncomment the line if you want fastlane to automatically update itself 14 | # update_fastlane 15 | 16 | default_platform(:ios) 17 | 18 | platform :ios do 19 | desc "Generate new localized screenshots" 20 | lane :screenshots do 21 | capture_screenshots(scheme: "phyphox") 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /phyphox-iOS/fastlane/Snapfile: -------------------------------------------------------------------------------- 1 | # Uncomment the lines below you want to change by removing the # in the beginning 2 | 3 | # A list of devices you want to take the screenshots from 4 | devices([ 5 | "iPhone 8", 6 | "iPhone 8 Plus", 7 | "iPhone 11 Pro Max", 8 | "iPad Pro (12.9-inch) (4th generation)", 9 | "iPhone 14 Plus" 10 | ]) 11 | 12 | languages([ 13 | "cs", 14 | "de-DE", 15 | "el", 16 | "en-US", 17 | "es-ES", 18 | "fr-FR", 19 | "hi", 20 | "it", 21 | "ja", 22 | "ka", 23 | "nl-NL", 24 | "pl", 25 | "pt-BR", 26 | "ru", 27 | "sr", 28 | "tr-TR", 29 | "vi", 30 | "zh-Hant", 31 | "zh-Hans" 32 | ]) 33 | 34 | # The name of the scheme which contains the UI Tests 35 | # scheme("SchemeName") 36 | 37 | # Where should the resulting screenshots be stored? 38 | # output_directory("./screenshots") 39 | 40 | # remove the '#' to clear all previously generated screenshots before creating new ones 41 | clear_previous_screenshots(true) 42 | 43 | # Arguments to pass to the app on launch. See https://docs.fastlane.tools/actions/snapshot/#launch-arguments 44 | # launch_arguments(["-favColor red"]) 45 | 46 | # For more information about all available options run 47 | # fastlane action snapshot 48 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox screenshots/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox screenshots/phyphox_screenshots.swift: -------------------------------------------------------------------------------- 1 | // 2 | // phyphox_screenshots.swift 3 | // phyphox screenshots 4 | // 5 | // Created by Sebastian Staacks on 10.06.19. 6 | // Copyright © 2019 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | 11 | class phyphox_screenshots: XCTestCase { 12 | 13 | override func setUp() { 14 | 15 | continueAfterFailure = false 16 | 17 | let app = XCUIApplication() 18 | 19 | setupSnapshot(app) 20 | 21 | app.launchArguments.append("screenshot") 22 | app.launch() 23 | 24 | } 25 | 26 | override func tearDown() { 27 | // Put teardown code here. This method is called after the invocation of each test method in the class. 28 | } 29 | 30 | func testExample() { 31 | 32 | let app = XCUIApplication() 33 | 34 | let label = app.alerts.element(boundBy: 0).buttons.element(boundBy: 0).label 35 | let index = (label == "取消" ? 0 : 1) //Detect Chinese cancel button in different order, ugly workaround... 36 | app.alerts.element(boundBy: 0).buttons.element(boundBy: index).tap() 37 | 38 | snapshot("screen1") 39 | 40 | let segmentedControlsQuery = app/*@START_MENU_TOKEN@*/.segmentedControls/*[[".scrollViews.segmentedControls",".segmentedControls"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/ 41 | segmentedControlsQuery.buttons.element(boundBy: 2).tap() 42 | 43 | snapshot("screen2") 44 | 45 | segmentedControlsQuery.buttons.element(boundBy: 0).tap() 46 | 47 | 48 | let tablesQuery = XCUIApplication().tables 49 | tablesQuery.cells.element(boundBy: 0).staticTexts.element(boundBy: 8).tap() 50 | 51 | snapshot("screen3") 52 | 53 | app.navigationBars.element(boundBy: 0).buttons["‹"].tap() 54 | 55 | snapshot("main") 56 | 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-1024.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-20.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-20@2x.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-20@3x.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-29.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-29@2x.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-29@3x.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-40.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-40@2x.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-40@3x.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-60@2x.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-60@3x.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-76.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-76@2x.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/AppIcon.appiconset/icon_ios-83.5@2x.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "scale" : "3x" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | }, 20 | "properties" : { 21 | "template-rendering-intent" : "template" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_0.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "bluetooth_signal_0.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_0.imageset/bluetooth_signal_0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_0.imageset/bluetooth_signal_0.pdf -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "bluetooth_signal_1.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_1.imageset/bluetooth_signal_1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_1.imageset/bluetooth_signal_1.pdf -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "bluetooth_signal_2.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_2.imageset/bluetooth_signal_2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_2.imageset/bluetooth_signal_2.pdf -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "bluetooth_signal_3.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_3.imageset/bluetooth_signal_3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_3.imageset/bluetooth_signal_3.pdf -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "bluetooth_signal_4.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_4.imageset/bluetooth_signal_4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/bluetooth_signal_4.imageset/bluetooth_signal_4.pdf -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/cellular_level_0.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cellularbars.level.0.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/cellular_level_0.imageset/cellularbars.level.0.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/cellular_level_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cellularbars.level.1.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/cellular_level_1.imageset/cellularbars.level.1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/cellular_level_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cellularbars.level.2.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/cellular_level_2.imageset/cellularbars.level.2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/cellular_level_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cellularbars.level.3.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/cellular_level_3.imageset/cellularbars.level.3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/cellular_level_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cellularbars.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/cellular_level_4.imageset/cellularbars.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/egm84_30.pgm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/egm84_30.pgm -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/logo_stack.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "logo_stack.png" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/logo_stack.imageset/logo_stack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/logo_stack.imageset/logo_stack.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/more.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "more.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/more.imageset/more.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/more.imageset/more.pdf -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/new_experiment_bluetooth.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "new_experiment_bluetooth.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/new_experiment_bluetooth.imageset/new_experiment_bluetooth.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/new_experiment_bluetooth.imageset/new_experiment_bluetooth.pdf -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/new_experiment_qr.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "new_experiment_qr.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/new_experiment_qr.imageset/new_experiment_qr.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/new_experiment_qr.imageset/new_experiment_qr.pdf -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/new_experiment_simple.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "new_experiment_simple.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/new_experiment_simple.imageset/new_experiment_simple.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/new_experiment_simple.imageset/new_experiment_simple.pdf -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/pan_zoom.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "panzoom-2.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/pan_zoom.imageset/panzoom-2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/pan_zoom.imageset/panzoom-2.pdf -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/phyphox_dark.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "phyphox_dark.png" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/phyphox_dark.imageset/phyphox_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/phyphox_dark.imageset/phyphox_dark.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/pick.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "pick-3.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/pick.imageset/pick-3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/pick.imageset/pick-3.pdf -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/rwth.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "rwth_rgb.png" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/rwth.imageset/rwth_rgb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/rwth.imageset/rwth_rgb.png -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/unfold_less.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "unfold_less.pdf", 5 | "idiom" : "universal" 6 | }, 7 | { 8 | "appearances" : [ 9 | { 10 | "appearance" : "luminosity", 11 | "value" : "light" 12 | } 13 | ], 14 | "filename" : "arrow.down.right.and.arrow.up.left.svg", 15 | "idiom" : "universal" 16 | }, 17 | { 18 | "appearances" : [ 19 | { 20 | "appearance" : "luminosity", 21 | "value" : "dark" 22 | } 23 | ], 24 | "filename" : "arrow.down.right.and.arrow.up.left 1.svg", 25 | "idiom" : "universal" 26 | } 27 | ], 28 | "info" : { 29 | "author" : "xcode", 30 | "version" : 1 31 | }, 32 | "properties" : { 33 | "template-rendering-intent" : "template" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/unfold_less.imageset/arrow.down.right.and.arrow.up.left 1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/unfold_less.imageset/arrow.down.right.and.arrow.up.left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/unfold_less.imageset/unfold_less.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/unfold_less.imageset/unfold_less.pdf -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/unfold_more.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "unfold_more.pdf", 5 | "idiom" : "universal" 6 | }, 7 | { 8 | "appearances" : [ 9 | { 10 | "appearance" : "luminosity", 11 | "value" : "light" 12 | } 13 | ], 14 | "filename" : "arrow.up.left.and.arrow.down.right 1.svg", 15 | "idiom" : "universal" 16 | }, 17 | { 18 | "appearances" : [ 19 | { 20 | "appearance" : "luminosity", 21 | "value" : "dark" 22 | } 23 | ], 24 | "filename" : "arrow.up.left.and.arrow.down.right.svg", 25 | "idiom" : "universal" 26 | } 27 | ], 28 | "info" : { 29 | "author" : "xcode", 30 | "version" : 1 31 | }, 32 | "properties" : { 33 | "localizable" : true 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/unfold_more.imageset/arrow.up.left.and.arrow.down.right 1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/unfold_more.imageset/arrow.up.left.and.arrow.down.right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Assets.xcassets/unfold_more.imageset/unfold_more.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Assets.xcassets/unfold_more.imageset/unfold_more.pdf -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/CRC32InputStream.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CRC32InputStream.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Staacks on 17.05.20. 6 | // Copyright © 2020 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import zlib 11 | 12 | final class CRC32InputStream: InputStream { 13 | public var crcValue: UInt = 0 14 | let inputStream: InputStream 15 | 16 | init(_ inputStream: InputStream) { 17 | self.inputStream = inputStream 18 | super.init(data: Data()) 19 | } 20 | 21 | override func open() { 22 | inputStream.open() 23 | } 24 | 25 | override func close() { 26 | inputStream.close() 27 | } 28 | 29 | override func getBuffer(_ buffer: UnsafeMutablePointer?>, length len: UnsafeMutablePointer) -> Bool { 30 | return inputStream.getBuffer(buffer, length: len) 31 | } 32 | 33 | override var hasBytesAvailable: Bool { 34 | get { 35 | return inputStream.hasBytesAvailable 36 | } 37 | } 38 | 39 | override func read(_ buffer: UnsafeMutablePointer, maxLength len: Int) -> Int { 40 | let count = inputStream.read(buffer, maxLength: len) 41 | crcValue = crc32(crcValue, buffer, uInt(count)) 42 | return count 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Abstract/UpdateValueAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UpdateValueAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 21.01.16. 6 | // Copyright © 2016 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /** 12 | An abstract analysis module that takes one input and one output, writing each value of the input into the output (and clearing the output beforehand), after allowing a closure to update the value. 13 | */ 14 | class UpdateValueAnalysis: AutoClearingExperimentAnalysisModule { 15 | func updateAllWithMethod(_ method: ([Double]) -> [Double]) { 16 | guard let input = inputs.first else { return } 17 | 18 | let process: [Double] 19 | 20 | switch input { 21 | case .buffer(buffer: _, data: let data, usedAs: _, keep: _): 22 | process = data.data 23 | case .value(value: let value, usedAs: _): 24 | process = [value] 25 | } 26 | 27 | #if DEBUG_ANALYSIS 28 | debug_noteInputs(process.description) 29 | #endif 30 | 31 | let result = method(process) 32 | 33 | #if DEBUG_ANALYSIS 34 | // debug_noteOutputs(append) 35 | #endif 36 | 37 | for output in outputs { 38 | switch output { 39 | case .buffer(buffer: let buffer, data: _, usedAs: _, append: _): 40 | buffer.appendFromArray(result) 41 | } 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/AppendAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppendAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 06.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | final class AppendAnalysis: AutoClearingExperimentAnalysisModule { 12 | private let inputElements: [ExperimentAnalysisDataInput] 13 | 14 | required init(inputs: [ExperimentAnalysisDataInput], outputs: [ExperimentAnalysisDataOutput], additionalAttributes: AttributeContainer) throws { 15 | 16 | var inputElements = [ExperimentAnalysisDataInput]() 17 | 18 | for input in inputs { 19 | inputElements.append(input) 20 | } 21 | 22 | self.inputElements = inputElements 23 | 24 | try super.init(inputs: inputs, outputs: outputs, additionalAttributes: additionalAttributes) 25 | } 26 | 27 | override func update() { 28 | var result: [Double] = [] 29 | 30 | #if DEBUG_ANALYSIS 31 | debug_noteInputs(inputs) 32 | #endif 33 | for input in inputElements { 34 | switch input { 35 | case .buffer(buffer: _, data: let data, usedAs: _, keep: _): 36 | result.append(contentsOf: data.data) 37 | case .value(value: let value, usedAs: _): 38 | result.append(value) 39 | } 40 | } 41 | 42 | #if DEBUG_ANALYSIS 43 | debug_noteOutputs(result) 44 | #endif 45 | 46 | for output in outputs { 47 | switch output { 48 | case .buffer(buffer: let buffer, data: _, usedAs: _, append: _): 49 | buffer.appendFromArray(result) 50 | } 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Complex-Update-Value/AdditionAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AdditionAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 05.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class AdditionAnalysis: ExperimentComplexUpdateValueAnalysis { 13 | 14 | override func update() { 15 | updateAllWithMethod({ (inputs) -> ValueSource in 16 | var main = inputs.first! 17 | 18 | for (i, input) in inputs.enumerated() { 19 | if i > 0 { 20 | main = self.addValueSources(main, b: input) 21 | } 22 | } 23 | 24 | return main 25 | }, priorityInputKey: nil) 26 | } 27 | 28 | func addValueSources(_ a: ValueSource, b: ValueSource) -> ValueSource { 29 | if let scalarA = a.scalar, let scalarB = b.scalar { // scalar+scalar 30 | let result = scalarA+scalarB 31 | 32 | return ValueSource(scalar: result) 33 | } 34 | else if var scalar = a.scalar, let vector = b.vector { // scalar+vector 35 | var out = vector 36 | 37 | vDSP_vsaddD(vector, 1, &scalar, &out, 1, vDSP_Length(out.count)) 38 | 39 | return ValueSource(vector: out) 40 | } 41 | else if let vector = a.vector, var scalar = b.scalar { // vector+scalar 42 | var out = vector 43 | 44 | vDSP_vsaddD(vector, 1, &scalar, &out, 1, vDSP_Length(out.count)) 45 | 46 | return ValueSource(vector: out) 47 | } 48 | else if let vectorA = a.vector, let vectorB = b.vector { // vector+vector 49 | var out = vectorA 50 | 51 | vDSP_vaddD(vectorA, 1, vectorB, 1, &out, 1, vDSP_Length(out.count)) 52 | 53 | return ValueSource(vector: out) 54 | } 55 | 56 | fatalError("Invalid value sources") 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Complex-Update-Value/DivisionAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DivisionAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 05.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class DivisionAnalysis: ExperimentComplexUpdateValueAnalysis { 13 | 14 | override func update() { 15 | updateAllWithMethod({ (inputs) -> ValueSource in 16 | var main = inputs.first! 17 | 18 | for (i, input) in inputs.enumerated() { 19 | if i > 0 { 20 | main = self.divideValueSources(main, b: input) 21 | } 22 | } 23 | 24 | return main 25 | }, priorityInputKey: "dividend") 26 | } 27 | 28 | func divideValueSources(_ a: ValueSource, b: ValueSource) -> ValueSource { 29 | if let scalarA = a.scalar, let scalarB = b.scalar { // scalar/scalar 30 | let result = scalarA/scalarB 31 | 32 | return ValueSource(scalar: result) 33 | } 34 | else if var scalar = a.scalar, let vector = b.vector { // scalar/vector 35 | var out = vector 36 | 37 | vDSP_svdivD(&scalar, vector, 1, &out, 1, vDSP_Length(out.count)) 38 | 39 | return ValueSource(vector: out) 40 | } 41 | else if let vector = a.vector, var scalar = b.scalar { // vector/scalar 42 | var out = vector 43 | 44 | vDSP_vsdivD(vector, 1, &scalar, &out, 1, vDSP_Length(out.count)) 45 | 46 | return ValueSource(vector: out) 47 | } 48 | else if let vectorA = a.vector, let vectorB = b.vector { // vector/vector 49 | var out = vectorA 50 | 51 | vDSP_vdivD(vectorB, 1, vectorA, 1, &out, 1, vDSP_Length(out.count)) 52 | 53 | return ValueSource(vector: out) 54 | } 55 | 56 | fatalError("Invalid value sources") 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Complex-Update-Value/MultiplicationAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MultiplicationAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 05.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class MultiplicationAnalysis: ExperimentComplexUpdateValueAnalysis { 13 | 14 | override func update() { 15 | updateAllWithMethod({ (inputs) -> ValueSource in 16 | var main = inputs.first! 17 | 18 | for (i, input) in inputs.enumerated() { 19 | if i > 0 { 20 | main = self.multiplyValueSources(main, b: input) 21 | } 22 | } 23 | 24 | return main 25 | }, priorityInputKey: nil) 26 | } 27 | 28 | func multiplyValueSources(_ a: ValueSource, b: ValueSource) -> ValueSource { 29 | if let scalarA = a.scalar, let scalarB = b.scalar { // scalar*scalar 30 | let result = scalarA*scalarB 31 | 32 | return ValueSource(scalar: result) 33 | } 34 | else if var scalar = a.scalar, let vector = b.vector { // scalar*vector 35 | var out = vector 36 | 37 | vDSP_vsmulD(vector, 1, &scalar, &out, 1, vDSP_Length(out.count)) 38 | 39 | return ValueSource(vector: out) 40 | } 41 | else if let vector = a.vector, var scalar = b.scalar { // vector*scalar 42 | var out = vector 43 | 44 | vDSP_vsmulD(vector, 1, &scalar, &out, 1, vDSP_Length(out.count)) 45 | 46 | return ValueSource(vector: out) 47 | } 48 | else if let vectorA = a.vector, let vectorB = b.vector { // vector*vector 49 | var out = vectorA 50 | 51 | vDSP_vmulD(vectorA, 1, vectorB, 1, &out, 1, vDSP_Length(out.count)) 52 | 53 | return ValueSource(vector: out) 54 | } 55 | 56 | fatalError("Invalid value sources") 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/CountAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CountAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Kuhlen on 06.10.16. 6 | // Copyright © 2016 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | final class CountAnalysis: AutoClearingExperimentAnalysisModule { 12 | override func update() { 13 | var result: [Double] = [] 14 | 15 | for input in inputs { 16 | switch input { 17 | case .buffer(buffer: _, data: let data, usedAs: _, keep: _): 18 | let val = data.data.count 19 | result.append(Double(val)) 20 | case .value(value: _, usedAs: _): 21 | result.append(1.0) 22 | } 23 | } 24 | 25 | for output in outputs { 26 | switch output { 27 | case .buffer(buffer: let buffer, data: _, usedAs: _, append: _): 28 | buffer.appendFromArray(result) 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/DifferentiationAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DifferentiationAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 06.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class DifferentiationAnalysis: AutoClearingExperimentAnalysisModule { 13 | 14 | override func update() { 15 | guard let firstInput = inputs.first else { return } 16 | 17 | let inputValues: [Double] 18 | 19 | switch firstInput { 20 | case .buffer(buffer: _, data: let data, usedAs: _, keep: _): 21 | inputValues = data.data 22 | case .value(value: _, usedAs: _): 23 | return 24 | } 25 | 26 | var result: [Double] 27 | 28 | //Only use accelerate for long arrays 29 | if inputValues.count > 260 { 30 | var subtract = inputValues 31 | subtract.insert(0.0, at: 0) 32 | 33 | result = inputValues 34 | 35 | vDSP_vsubD(subtract, 1, inputValues, 1, &result, 1, vDSP_Length(inputValues.count)) 36 | 37 | result.removeFirst() 38 | } 39 | else { 40 | result = [] 41 | var first = true 42 | var last: Double! 43 | 44 | for value in inputValues { 45 | if first { 46 | last = value 47 | first = false 48 | continue 49 | } 50 | 51 | let val = value-last 52 | 53 | result.append(val) 54 | 55 | last = value 56 | } 57 | } 58 | 59 | for output in outputs { 60 | switch output { 61 | case .buffer(buffer: let buffer, data: _, usedAs: _, append: _): 62 | buffer.appendFromArray(result) 63 | } 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/FirstAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FirstAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 13.01.16. 6 | // Copyright © 2016 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | final class FirstAnalysis: AutoClearingExperimentAnalysisModule { 12 | override func update() { 13 | var result: [Double] = [] 14 | 15 | for input in inputs { 16 | switch input { 17 | case .buffer(buffer: _, data: let data, usedAs: _, keep: _): 18 | if data.data.count > 0 { 19 | result.append(data.data[0]) 20 | } 21 | case .value(value: _, usedAs: _): 22 | break 23 | } 24 | } 25 | 26 | for output in outputs { 27 | switch output { 28 | case .buffer(buffer: let buffer, data: _, usedAs: _, append: _): 29 | buffer.appendFromArray(result) 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/FormulaAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FormulaAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Staacks on 19.04.19. 6 | // Copyright © 2019 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | final class FormulaAnalysis: AutoClearingExperimentAnalysisModule { 12 | let parser: FormulaParser 13 | 14 | required init(inputs: [ExperimentAnalysisDataInput], outputs: [ExperimentAnalysisDataOutput], additionalAttributes: AttributeContainer) throws { 15 | let attributes = additionalAttributes.attributes(keyedBy: String.self) 16 | 17 | let formula = try attributes.optionalValue(for: "formula") ?? "" 18 | do { 19 | parser = try FormulaParser(formula: formula) 20 | } catch FormulaParser.FormulaError.parseError(let message) { 21 | throw SerializationError.genericError(message: message) 22 | } 23 | try super.init(inputs: inputs, outputs: outputs, additionalAttributes: additionalAttributes) 24 | } 25 | 26 | override func update() { 27 | var inArrays: [[Double]] = [] 28 | for input in inputs { 29 | switch input { 30 | case .buffer(buffer: _, data: let data, usedAs: _, keep: _): 31 | inArrays.append(data.data) 32 | case .value(value: let value, usedAs: _): 33 | inArrays.append([value]) 34 | } 35 | } 36 | 37 | let result = parser.execute(buffers: inArrays) 38 | 39 | if let output = outputs.first { 40 | switch output { 41 | case .buffer(buffer: let buffer, data: _, usedAs: _, append: _): 42 | buffer.appendFromArray(result) 43 | } 44 | } 45 | 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/IntegrationAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IntegrationAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 13.01.16. 6 | // Copyright © 2016 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class IntegrationAnalysis: AutoClearingExperimentAnalysisModule { 13 | 14 | override func update() { 15 | guard let firstInput = inputs.first else { return } 16 | 17 | let inArray: [Double] 18 | 19 | switch firstInput { 20 | case .buffer(buffer: _, data: let data, usedAs: _, keep: _): 21 | inArray = data.data 22 | case .value(value: _, usedAs: _): 23 | return 24 | } 25 | 26 | let count = inArray.count 27 | 28 | var result: [Double] 29 | 30 | if count == 0 { 31 | result = [] 32 | } 33 | else { 34 | result = [Double](repeating: 0.0, count: count) 35 | 36 | var factor = 1.0 37 | vDSP_vrsumD(inArray, 1, &factor, &result, 1, vDSP_Length(count)) 38 | 39 | var repeatedVal = inArray[0] 40 | 41 | if repeatedVal != 0.0 { 42 | vDSP_vsaddD(result, 1, &repeatedVal, &result, 1, vDSP_Length(count)) 43 | } 44 | } 45 | 46 | for output in outputs { 47 | switch output { 48 | case .buffer(buffer: let buffer, data: _, usedAs: _, append: _): 49 | buffer.appendFromArray(result) 50 | } 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/MatchAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MatchAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Kuhlen on 26.05.16. 6 | // Copyright © 2016 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | final class MatchAnalysis: AutoClearingExperimentAnalysisModule { 12 | 13 | override func update() { 14 | var out = [[Double]](repeating: [], count: inputs.count) 15 | 16 | var allInputs = true 17 | var i = 0 18 | while allInputs { 19 | var allOK = true 20 | var values = [Double]() 21 | for input in inputs { 22 | switch input { 23 | case .buffer(buffer: _, data: let data, usedAs: _, keep: _): 24 | if i < data.data.count { 25 | let value = data.data[i] 26 | if !value.isFinite { 27 | allOK = false 28 | break 29 | } else { 30 | values.append(value) 31 | } 32 | } else { 33 | allInputs = false 34 | break 35 | } 36 | case .value(value: _, usedAs: _): 37 | break 38 | } 39 | } 40 | i += 1 41 | if allOK && allInputs { 42 | for (index, value) in values.enumerated() { 43 | out[index].append(value) 44 | } 45 | } 46 | } 47 | 48 | for (i, output) in outputs.enumerated() { 49 | switch output { 50 | case .buffer(buffer: let buffer, data: _, usedAs: _, append: _): 51 | buffer.appendFromArray(out[i]) 52 | } 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Simple-Update-Value/ABSAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ABSAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 06.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class ABSAnalysis: UpdateValueAnalysis { 13 | 14 | override func update() { 15 | updateAllWithMethod { array -> [Double] in 16 | var results = array 17 | vvfabs(&results, array, [Int32(array.count)]) 18 | 19 | return results 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Simple-Update-Value/AcosAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AcosAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Kuhlen on 06.10.16. 6 | // Copyright © 2016 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class AcosAnalysis: UpdateValueAnalysis { 13 | private let deg: Bool 14 | 15 | required init(inputs: [ExperimentAnalysisDataInput], outputs: [ExperimentAnalysisDataOutput], additionalAttributes: AttributeContainer) throws { 16 | let attributes = additionalAttributes.attributes(keyedBy: String.self) 17 | 18 | deg = try attributes.optionalValue(for: "deg") ?? false 19 | try super.init(inputs: inputs, outputs: outputs, additionalAttributes: additionalAttributes) 20 | } 21 | 22 | override func update() { 23 | updateAllWithMethod { array -> [Double] in 24 | var results = array 25 | 26 | vvacos(&results, array, [Int32(array.count)]) 27 | 28 | if self.deg { 29 | var f = 180.0/Double.pi 30 | vDSP_vsmulD(results, 1, &f, &results, 1, vDSP_Length(results.count)) 31 | } 32 | 33 | return results 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Simple-Update-Value/AsinAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AsinAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Kuhlen on 06.10.16. 6 | // Copyright © 2016 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class AsinAnalysis: UpdateValueAnalysis { 13 | private let deg: Bool 14 | 15 | required init(inputs: [ExperimentAnalysisDataInput], outputs: [ExperimentAnalysisDataOutput], additionalAttributes: AttributeContainer) throws { 16 | let attributes = additionalAttributes.attributes(keyedBy: String.self) 17 | 18 | deg = try attributes.optionalValue(for: "deg") ?? false 19 | try super.init(inputs: inputs, outputs: outputs, additionalAttributes: additionalAttributes) 20 | } 21 | 22 | override func update() { 23 | updateAllWithMethod { array -> [Double] in 24 | var results = array 25 | 26 | vvasin(&results, array, [Int32(array.count)]) 27 | 28 | if self.deg { 29 | var f = 180.0/Double.pi 30 | vDSP_vsmulD(results, 1, &f, &results, 1, vDSP_Length(results.count)) 31 | } 32 | 33 | return results 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Simple-Update-Value/AtanAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AtanAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Kuhlen on 06.10.16. 6 | // Copyright © 2016 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class AtanAnalysis: UpdateValueAnalysis { 13 | private let deg: Bool 14 | 15 | required init(inputs: [ExperimentAnalysisDataInput], outputs: [ExperimentAnalysisDataOutput], additionalAttributes: AttributeContainer) throws { 16 | let attributes = additionalAttributes.attributes(keyedBy: String.self) 17 | 18 | deg = try attributes.optionalValue(for: "deg") ?? false 19 | try super.init(inputs: inputs, outputs: outputs, additionalAttributes: additionalAttributes) 20 | } 21 | 22 | override func update() { 23 | updateAllWithMethod { array -> [Double] in 24 | var results = array 25 | 26 | vvatan(&results, array, [Int32(array.count)]) 27 | 28 | if self.deg { 29 | var f = 180.0/Double.pi 30 | vDSP_vsmulD(results, 1, &f, &results, 1, vDSP_Length(results.count)) 31 | } 32 | 33 | return results 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Simple-Update-Value/CosAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CosAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 06.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class CosAnalysis: UpdateValueAnalysis { 13 | private let deg: Bool 14 | 15 | required init(inputs: [ExperimentAnalysisDataInput], outputs: [ExperimentAnalysisDataOutput], additionalAttributes: AttributeContainer) throws { 16 | let attributes = additionalAttributes.attributes(keyedBy: String.self) 17 | 18 | deg = try attributes.optionalValue(for: "deg") ?? false 19 | try super.init(inputs: inputs, outputs: outputs, additionalAttributes: additionalAttributes) 20 | } 21 | 22 | override func update() { 23 | updateAllWithMethod { array -> [Double] in 24 | var results = array 25 | if self.deg { 26 | var f = Double.pi/180.0 27 | vDSP_vsmulD(array, 1, &f, &results, 1, vDSP_Length(array.count)) 28 | } 29 | vvcos(&results, results, [Int32(results.count)]) 30 | 31 | return results 32 | } 33 | } 34 | } 35 | 36 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Simple-Update-Value/CoshAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CoshAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Kuhlen on 06.10.16. 6 | // Copyright © 2016 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class CoshAnalysis: UpdateValueAnalysis { 13 | 14 | override func update() { 15 | updateAllWithMethod { array -> [Double] in 16 | var results = array 17 | 18 | vvcosh(&results, array, [Int32(array.count)]) 19 | 20 | return results 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Simple-Update-Value/LogAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Kuhlen on 28.05.17. 6 | // Copyright © 2017 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class LogAnalysis: UpdateValueAnalysis { 13 | 14 | override func update() { 15 | updateAllWithMethod { array -> [Double] in 16 | var results = array 17 | 18 | vvlog(&results, array, [Int32(array.count)]) 19 | 20 | return results 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Simple-Update-Value/RoundAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RoundAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Kuhlen on 28.05.17. 6 | // Copyright © 2017 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | import Foundation 13 | import Accelerate 14 | 15 | final class RoundAnalysis: UpdateValueAnalysis { 16 | private let floor: Bool 17 | private let ceil: Bool 18 | 19 | required init(inputs: [ExperimentAnalysisDataInput], outputs: [ExperimentAnalysisDataOutput], additionalAttributes: AttributeContainer) throws { 20 | let attributes = additionalAttributes.attributes(keyedBy: String.self) 21 | 22 | floor = try attributes.optionalValue(for: "floor") ?? false 23 | ceil = try attributes.optionalValue(for: "ceil") ?? false 24 | try super.init(inputs: inputs, outputs: outputs, additionalAttributes: additionalAttributes) 25 | } 26 | 27 | override func update() { 28 | updateAllWithMethod { array -> [Double] in 29 | var results = array 30 | 31 | if floor { 32 | vvfloor(&results, results, [Int32(results.count)]) 33 | } 34 | else if ceil { 35 | vvceil(&results, results, [Int32(results.count)]) 36 | } 37 | else { 38 | vvnint(&results, results, [Int32(results.count)]) 39 | } 40 | 41 | return results 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Simple-Update-Value/SinAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SinAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 06.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class SinAnalysis: UpdateValueAnalysis { 13 | private let deg: Bool 14 | 15 | required init(inputs: [ExperimentAnalysisDataInput], outputs: [ExperimentAnalysisDataOutput], additionalAttributes: AttributeContainer) throws { 16 | let attributes = additionalAttributes.attributes(keyedBy: String.self) 17 | 18 | deg = try attributes.optionalValue(for: "deg") ?? false 19 | try super.init(inputs: inputs, outputs: outputs, additionalAttributes: additionalAttributes) 20 | } 21 | 22 | override func update() { 23 | updateAllWithMethod { array -> [Double] in 24 | var results = array 25 | if self.deg { 26 | var f = Double.pi/180.0 27 | vDSP_vsmulD(array, 1, &f, &results, 1, vDSP_Length(array.count)) 28 | } 29 | vvsin(&results, results, [Int32(results.count)]) 30 | 31 | return results 32 | } 33 | } 34 | } 35 | 36 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Simple-Update-Value/SinhAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SinhAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Kuhlen on 06.10.16. 6 | // Copyright © 2016 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class SinhAnalysis: UpdateValueAnalysis { 13 | 14 | override func update() { 15 | updateAllWithMethod { array -> [Double] in 16 | var results = array 17 | 18 | vvsinh(&results, array, [Int32(array.count)]) 19 | 20 | return results 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Simple-Update-Value/TanAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TanAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 06.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class TanAnalysis: UpdateValueAnalysis { 13 | private let deg: Bool 14 | 15 | required init(inputs: [ExperimentAnalysisDataInput], outputs: [ExperimentAnalysisDataOutput], additionalAttributes: AttributeContainer) throws { 16 | let attributes = additionalAttributes.attributes(keyedBy: String.self) 17 | 18 | deg = try attributes.optionalValue(for: "deg") ?? false 19 | try super.init(inputs: inputs, outputs: outputs, additionalAttributes: additionalAttributes) 20 | } 21 | 22 | override func update() { 23 | updateAllWithMethod { array -> [Double] in 24 | var results = array 25 | if self.deg { 26 | var f = Double.pi/180.0 27 | vDSP_vsmulD(array, 1, &f, &results, 1, vDSP_Length(array.count)) 28 | } 29 | vvtan(&results, results, [Int32(results.count)]) 30 | 31 | return results 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/Simple-Update-Value/TanhAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TanhAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Kuhlen on 06.10.16. 6 | // Copyright © 2016 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Accelerate 11 | 12 | final class TanhAnalysis: UpdateValueAnalysis { 13 | 14 | override func update() { 15 | updateAllWithMethod { array -> [Double] in 16 | var results = array 17 | 18 | vvtanh(&results, array, [Int32(array.count)]) 19 | 20 | return results 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Analysis/Modules/TimerAnalysis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TimerAnalysis.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 02.04.16. 6 | // Copyright © 2016 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | final class TimerAnalysis: AutoClearingExperimentAnalysisModule { 12 | let linearTime: Bool; 13 | 14 | private var outOutput: ExperimentAnalysisDataOutput? 15 | private var offset1970Output: ExperimentAnalysisDataOutput? 16 | 17 | required init(inputs: [ExperimentAnalysisDataInput], outputs: [ExperimentAnalysisDataOutput], additionalAttributes: AttributeContainer) throws { 18 | 19 | let attributes = additionalAttributes.attributes(keyedBy: String.self) 20 | 21 | linearTime = try attributes.optionalValue(for: "linearTime") ?? false 22 | 23 | var out: ExperimentAnalysisDataOutput? = nil 24 | var offset1970: ExperimentAnalysisDataOutput? = nil 25 | for output in outputs { 26 | if output.asString == "offset1970" || out != nil { 27 | offset1970 = output 28 | } 29 | else { 30 | out = output 31 | } 32 | } 33 | outOutput = out 34 | offset1970Output = offset1970 35 | 36 | try super.init(inputs: inputs, outputs: outputs, additionalAttributes: additionalAttributes) 37 | } 38 | 39 | override func update() { 40 | if let output = outOutput { 41 | switch output { 42 | case .buffer(buffer: let buffer, data: _, usedAs: _, append: _): 43 | buffer.append(linearTime ? analysisLinearTime : analysisTime) 44 | } 45 | } 46 | if let output = offset1970Output { 47 | switch output { 48 | case .buffer(buffer: let buffer, data: _, usedAs: _, append: _): 49 | buffer.append(linearTime ? analysisLinearTimeOffset1970 : analysisTimeOffset1970) 50 | } 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Data-Input/ExperimentAudioInput.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExperimentAudioInput.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 13.01.16. 6 | // Copyright © 2016 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import AVFoundation 11 | 12 | struct ExperimentAudioInput: Equatable { 13 | let sampleRate: UInt 14 | let outBuffer: DataBuffer 15 | let backBuffer: DataBuffer 16 | let appendData: Bool 17 | let sampleRateInfoBuffer: DataBuffer? 18 | 19 | init(sampleRate: UInt, outBuffer: DataBuffer, sampleRateInfoBuffer: DataBuffer?, appendData: Bool) { 20 | self.sampleRate = sampleRate 21 | self.outBuffer = outBuffer 22 | self.backBuffer = try! DataBuffer(name: "", size: outBuffer.size, baseContents: [], static: false) 23 | self.sampleRateInfoBuffer = sampleRateInfoBuffer 24 | self.appendData = appendData 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/ExperimentCollection.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExperimentCollection.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 04.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | final class ExperimentCollection { 12 | private(set) var title: String 13 | 14 | enum ContentType: Int { 15 | case rawSensors, savedStates, other, phyphoxOrg 16 | init (title: String) { 17 | switch title { 18 | case localize("categoryRawSensor"): 19 | self = .rawSensors 20 | case localize("save_state_category"): 21 | self = .savedStates 22 | case "phyphox.org": 23 | self = .phyphoxOrg 24 | default: 25 | self = .other 26 | } 27 | } 28 | } 29 | 30 | private(set) var type: ContentType 31 | 32 | var experiments: [(experiment: Experiment, custom: Bool)] 33 | 34 | init(title: String, experiments: [(Experiment, Bool)]) { 35 | self.title = title 36 | self.type = ContentType.init(title: title) 37 | self.experiments = experiments 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/ExperimentIcon.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExperimentIcon.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 15.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | enum ExperimentIcon: Equatable { 12 | case string(String) 13 | case image(UIImage) 14 | 15 | func generateResizableRepresentativeView(color: UIColor, fontColor: UIColor) -> UIView { 16 | switch self { 17 | case .image(let image): 18 | let imageView = UIImageView(image: image) 19 | // It is fix for the icon background for contribution section header. When not used "if else case", then the icon is rendered as black 20 | // It renders black because when opening the app in light mode, it converts and adjust all the "white" color into black, as expected. 21 | if(color == UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0)){ 22 | imageView.backgroundColor = .white 23 | } else { 24 | imageView.backgroundColor = color 25 | } 26 | return imageView 27 | case .string(let string): 28 | let label = UILabel() 29 | 30 | label.text = string 31 | label.textAlignment = .center 32 | label.adjustsFontSizeToFitWidth = true 33 | label.font = UIFont.preferredFont(forTextStyle: .headline) 34 | 35 | label.textColor = fontColor 36 | label.backgroundColor = color 37 | 38 | return label 39 | } 40 | } 41 | 42 | static func == (lhs: ExperimentIcon, rhs: ExperimentIcon) -> Bool { 43 | switch lhs { 44 | case .image(let imageL): 45 | switch rhs { 46 | case .image(let imageR): 47 | return imageL.pngData() == imageR.pngData() 48 | default: 49 | return false 50 | } 51 | case .string(let stringL): 52 | switch rhs { 53 | case .string(let stringR): 54 | return stringL == stringR 55 | default: 56 | return false 57 | } 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/ExperimentTranslation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExperimentTranslation.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 11.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct ExperimentTranslation: Equatable { 12 | let locale: String 13 | 14 | let titleString: String? 15 | let descriptionString: String? 16 | let categoryString: String? 17 | 18 | let translatedStrings: [String: String] 19 | let translatedLinks: [String: URL] 20 | 21 | init(withLocale locale: String, strings: [String: String], titleString: String?, descriptionString: String?, categoryString: String?, links: [String: URL]) { 22 | self.locale = locale 23 | self.descriptionString = descriptionString 24 | self.categoryString = categoryString 25 | self.titleString = titleString 26 | translatedStrings = strings 27 | translatedLinks = links 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/NetworkConnection/NetworkDiscovery.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NetworkDiscovery.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Staacks on 27.11.19. 6 | // Copyright © 2019 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | protocol NetworkDiscovery { 12 | func startDiscovery(onNewResult: NetworkDiscoveryCallback) 13 | func stopDiscovery() 14 | } 15 | 16 | protocol NetworkDiscoveryCallback { 17 | func newItem(name: String?, address: String) 18 | } 19 | 20 | class HttpNetworkDiscovery : NetworkDiscovery { 21 | var task: URLSessionTask? = nil 22 | let address: String 23 | 24 | init(address: String) { 25 | self.address = address 26 | } 27 | 28 | func startDiscovery(onNewResult: NetworkDiscoveryCallback) { 29 | guard let url = URL(string: address) else { 30 | return 31 | } 32 | 33 | task = URLSession.shared.dataTask(with: url) { (data, response, error) in 34 | guard let data = data, error == nil else { 35 | return 36 | } 37 | 38 | guard let response = response as? HTTPURLResponse else { 39 | return 40 | } 41 | 42 | guard 200 <= response.statusCode && 300 > response.statusCode else { 43 | return 44 | } 45 | 46 | onNewResult.newItem(name: String(data: data.prefix(50), encoding: .utf8), address: self.address) 47 | self.stopDiscovery() 48 | } 49 | task?.resume() 50 | } 51 | 52 | func stopDiscovery() { 53 | task?.cancel() 54 | task = nil 55 | } 56 | } 57 | 58 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Output/ExperimentAudioOutput.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExperimentAudioOutput.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 22.03.16. 6 | // Copyright © 2016 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import AVFoundation 11 | 12 | enum AudioParameter: Equatable { 13 | case buffer(buffer: DataBuffer) 14 | case value(value: Double?) 15 | 16 | func getValue() -> Double? { 17 | switch self { 18 | case .buffer(buffer: let buffer): 19 | return buffer.last 20 | case .value(value: let value): 21 | return value 22 | } 23 | } 24 | 25 | var isBuffer: Bool { 26 | switch self { 27 | case .buffer(buffer: _): 28 | return true 29 | case .value(value: _): 30 | return false 31 | } 32 | } 33 | } 34 | 35 | struct ExperimentAudioOutputTone: Equatable { 36 | let frequency: AudioParameter 37 | let amplitude: AudioParameter 38 | let duration: AudioParameter 39 | } 40 | 41 | struct ExperimentAudioOutputNoise: Equatable { 42 | let amplitude: AudioParameter 43 | let duration: AudioParameter 44 | } 45 | 46 | struct ExperimentAudioOutput: Equatable { 47 | let loop: Bool 48 | let normalize: Bool 49 | let sampleRate: UInt 50 | 51 | let directSource: DataBuffer? 52 | let tones: [ExperimentAudioOutputTone] 53 | let noise: ExperimentAudioOutputNoise? 54 | 55 | init(sampleRate: UInt, loop: Bool, normalize: Bool, directSource: DataBuffer?, tones: [ExperimentAudioOutputTone], noise: ExperimentAudioOutputNoise?) { 56 | self.sampleRate = sampleRate 57 | self.loop = loop 58 | self.normalize = normalize 59 | 60 | self.directSource = directSource 61 | self.tones = tones 62 | self.noise = noise 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/SemanticVersion.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SemanticVersion.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 11.09.18. 6 | // Copyright © 2018 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public struct SemanticVersion: Comparable { 12 | let major: UInt 13 | let minor: UInt 14 | let patch: UInt 15 | 16 | init(major: UInt, minor: UInt, patch: UInt) { 17 | self.major = major 18 | self.minor = minor 19 | self.patch = patch 20 | } 21 | 22 | init?(string: String) { 23 | let components = string.components(separatedBy: ".") 24 | 25 | guard components.count >= 2 else { return nil } 26 | 27 | guard let major = UInt(components[0]) else { return nil } 28 | guard let minor = UInt(components[1]) else { return nil } 29 | 30 | self.major = major 31 | self.minor = minor 32 | 33 | if components.count >= 3 { 34 | guard let patch = UInt(components[2]) else { return nil } 35 | 36 | self.patch = patch 37 | } 38 | else { 39 | self.patch = 0 40 | } 41 | } 42 | 43 | public static func <(lhs: SemanticVersion, rhs: SemanticVersion) -> Bool { 44 | guard lhs.major <= rhs.major else { return false } 45 | guard lhs.major == rhs.major else { return true } 46 | 47 | guard lhs.minor <= rhs.minor else { return false } 48 | guard lhs.minor == rhs.minor else { return true } 49 | 50 | guard lhs.patch <= rhs.patch else { return false } 51 | guard lhs.patch == rhs.patch else { return true } 52 | 53 | return false 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Serialization/Handlers/ColorElementHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ColorElementHandler.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Staacks on 19.03.19. 6 | // Copyright © 2019 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | 10 | import Foundation 11 | 12 | /// Element handler extracting the text content from an element and interpreting it as a color. This can be either a hex value or one of the named colors. 13 | final class ColorElementHandler: ResultElementHandler, AttributelessElementHandler, ChildlessElementHandler { 14 | 15 | var results = [UIColor]() 16 | 17 | func endElement(text: String, attributes: AttributeContainer) throws { 18 | guard !text.isEmpty else { throw ElementHandlerError.missingText } 19 | 20 | if let color = mapColorString(text) { 21 | results.append(color) 22 | } else { 23 | throw ElementHandlerError.unexpectedAttributeValue("color") 24 | } 25 | 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Serialization/Handlers/DataContainersElementHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DataContainersElementHandler.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 11.04.18. 6 | // Copyright © 2018 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // This file contains element handlers for the `data-container` child element (and its child elements) of the `phyphox` root element. 12 | 13 | typealias BufferDescriptor = (name: String, size: Int, baseContents: [Double], staticBuffer: Bool) 14 | 15 | private final class DataContainerElementHandler: ResultElementHandler, ChildlessElementHandler { 16 | var results = [BufferDescriptor]() 17 | 18 | func startElement(attributes: AttributeContainer) throws {} 19 | 20 | private enum Attribute: String, AttributeKey { 21 | case size 22 | case staticKey = "static" 23 | case initKey = "init" 24 | } 25 | 26 | func endElement(text: String, attributes: AttributeContainer) throws { 27 | guard !text.isEmpty else { throw ElementHandlerError.missingText } 28 | 29 | let attributes = attributes.attributes(keyedBy: Attribute.self) 30 | 31 | let size = try attributes.optionalValue(for: .size) ?? 1 32 | 33 | let baseContents = (attributes.optionalString(for: .initKey) as String?).map { $0.components(separatedBy: ",").compactMap { Double($0.trimmingCharacters(in: .whitespaces)) } } ?? [] 34 | let staticBuffer = try attributes.optionalValue(for: .staticKey) ?? false 35 | 36 | results.append((text, size, baseContents, staticBuffer)) 37 | } 38 | } 39 | 40 | final class DataContainersElementHandler: ResultElementHandler, LookupElementHandler, AttributelessElementHandler { 41 | var results = [[BufferDescriptor]]() 42 | 43 | var childHandlers: [String: ElementHandler] 44 | 45 | private let containerHandler = DataContainerElementHandler() 46 | 47 | init() { 48 | childHandlers = ["container": containerHandler] 49 | } 50 | 51 | func endElement(text: String, attributes: AttributeContainer) throws { 52 | results.append(containerHandler.results) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Serialization/Handlers/IconElementHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IconElementHandler.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 11.04.18. 6 | // Copyright © 2018 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Element handler for the `icon` child element of the `phyphox` root element. 12 | final class IconElementHandler: ResultElementHandler, ChildlessElementHandler { 13 | var results = [ExperimentIcon]() 14 | 15 | func startElement(attributes: AttributeContainer) throws {} 16 | 17 | private enum Attribute: String, AttributeKey { 18 | case format 19 | } 20 | 21 | private enum Format: String, LosslessStringConvertible { 22 | case base64 23 | case string 24 | } 25 | 26 | func endElement(text: String, attributes: AttributeContainer) throws { 27 | guard !text.isEmpty else { throw ElementHandlerError.missingText } 28 | 29 | let attributes = attributes.attributes(keyedBy: Attribute.self) 30 | 31 | let format: Format = try attributes.optionalValue(for: .format) ?? .string 32 | 33 | switch format { 34 | case .base64: 35 | guard let data = Data(base64Encoded: text, options: []) else { throw ElementHandlerError.unreadableData } 36 | 37 | if let image = UIImage(data: data) { 38 | results.append(.image(image)) 39 | } 40 | case .string: 41 | results.append(.string(text)) 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Serialization/Handlers/LinkElementHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LinkElementHandler.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 11.04.18. 6 | // Copyright © 2018 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Element handler for the `link` child elements of the `phyphox` root element. 12 | final class LinkElementHandler: ResultElementHandler, ChildlessElementHandler { 13 | var results = [ExperimentLink]() 14 | 15 | func startElement(attributes: AttributeContainer) throws {} 16 | 17 | private enum Attribute: String, AttributeKey { 18 | case label 19 | case highlight 20 | } 21 | 22 | func endElement(text: String, attributes: AttributeContainer) throws { 23 | guard !text.isEmpty else { throw ElementHandlerError.missingText } 24 | 25 | let attributes = attributes.attributes(keyedBy: Attribute.self) 26 | 27 | let label = attributes.optionalString(for: .label) ?? "default" 28 | 29 | guard let url = URL(string: text) else { throw ElementHandlerError.unexpectedAttributeValue("url") } 30 | 31 | let highlighted = try attributes.optionalValue(for: .highlight) ?? false 32 | 33 | results.append(ExperimentLink(label: label, url: url, highlighted: highlighted)) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Serialization/Handlers/MultilineTextElementHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MultilineTextElementHandler.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 13.04.18. 6 | // Copyright © 2018 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Element handler extracting multiline text content from an element. Text needs to be non-empty. 12 | final class MultilineTextElementHandler: ResultElementHandler, AttributelessElementHandler, ChildlessElementHandler { 13 | var results = [String]() 14 | 15 | func endElement(text: String, attributes: AttributeContainer) throws { 16 | let cleanText = text.replacingOccurrences(of: "(?m)((?:^\\s+)|(?:\\s+$))", with: "\n", options: .regularExpression, range: nil) 17 | 18 | //guard !cleanText.isEmpty else { throw ElementHandlerError.missingText } 19 | 20 | results.append(cleanText) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Serialization/Handlers/PhyphoxDocumentHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhyphoxDocumentHandler.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 11.04.18. 6 | // Copyright © 2018 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Document handler for experiment files. Root node of the handler tree for experiment files. Produces deserialized `Experiment` instances. 12 | final class PhyphoxDocumentHandler: ResultElementHandler, LookupElementHandler, AttributelessElementHandler { 13 | var results: [Experiment] = [] 14 | 15 | private let phyphoxHandler = PhyphoxElementHandler() 16 | var childHandlers: [String: ElementHandler] 17 | 18 | init() { 19 | childHandlers = ["phyphox": phyphoxHandler] 20 | } 21 | 22 | func endElement(text: String, attributes: AttributeContainer) throws { 23 | results.append(try phyphoxHandler.expectSingleResult()) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Serialization/Handlers/TextElementHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TextElementHandler.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 11.04.18. 6 | // Copyright © 2018 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Element handler extracting the text content from an element. Text needs to be non-empty. 12 | final class TextElementHandler: ResultElementHandler, AttributelessElementHandler, ChildlessElementHandler { 13 | var results = [String]() 14 | 15 | func endElement(text: String, attributes: AttributeContainer) throws { 16 | guard !text.isEmpty else { throw ElementHandlerError.missingText } 17 | 18 | results.append(text) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Serialization/Handlers/ViewHandlers/DepthGUIViewElementHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DepthGUIViewElementHandler.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Staacks on 13.10.21. 6 | // Copyright © 2021 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct DepthGUIViewElementDescriptor { 12 | let label: String 13 | let aspectRatio: CGFloat 14 | } 15 | 16 | final class DepthGUIViewElementHandler: ResultElementHandler, ChildlessElementHandler, ViewComponentElementHandler { 17 | var results = [ViewElementDescriptor]() 18 | 19 | func startElement(attributes: AttributeContainer) throws {} 20 | 21 | private enum Attribute: String, AttributeKey { 22 | case label 23 | case aspectRatio 24 | } 25 | 26 | func endElement(text: String, attributes: AttributeContainer) throws { 27 | let attributes = attributes.attributes(keyedBy: Attribute.self) 28 | 29 | let label = attributes.optionalString(for: .label) ?? "" 30 | 31 | let aspectRatio: CGFloat = try attributes.optionalValue(for: .aspectRatio) ?? 2.5 32 | 33 | results.append(.depthGUI(DepthGUIViewElementDescriptor(label: label, aspectRatio: aspectRatio))) 34 | } 35 | 36 | func nextResult() throws -> ViewElementDescriptor { 37 | guard !results.isEmpty else { throw ElementHandlerError.missingElement("") } 38 | return results.removeFirst() 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Serialization/Handlers/ViewHandlers/InfoViewElementHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InfoViewElementHandler.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 12.04.18. 6 | // Copyright © 2018 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // This file contains element handlers for the `info` view element. 12 | 13 | struct InfoViewElementDescriptor { 14 | let label: String 15 | let color: UIColor 16 | let fontSize: CGFloat 17 | let align: TextAlignment 18 | let bold: Bool 19 | let italic: Bool 20 | 21 | enum TextAlignment: String, LosslessStringConvertible { 22 | case left, right, center 23 | } 24 | } 25 | 26 | final class InfoViewElementHandler: ResultElementHandler, ChildlessElementHandler, ViewComponentElementHandler { 27 | var results = [ViewElementDescriptor]() 28 | 29 | func startElement(attributes: AttributeContainer) throws {} 30 | 31 | private enum Attribute: String, AttributeKey { 32 | case label 33 | case color 34 | case size 35 | case align 36 | case bold 37 | case italic 38 | } 39 | 40 | func endElement(text: String, attributes: AttributeContainer) throws { 41 | let attributes = attributes.attributes(keyedBy: Attribute.self) 42 | 43 | let label = attributes.optionalString(for: .label) ?? "" 44 | let color = mapColorString(attributes.optionalString(for: .color)) ?? kFullWhiteColor 45 | let fontSize = CGFloat(try attributes.optionalValue(for: .size) ?? 1.0) 46 | let align: InfoViewElementDescriptor.TextAlignment = try attributes.optionalValue(for: .align) ?? .left 47 | let bold = try attributes.optionalValue(for: .bold) ?? false 48 | let italic = try attributes.optionalValue(for: .italic) ?? false 49 | 50 | results.append(.info(InfoViewElementDescriptor(label: label, color: color, fontSize: fontSize, align: align, bold: bold, italic: italic))) 51 | } 52 | 53 | func nextResult() throws -> ViewElementDescriptor { 54 | guard !results.isEmpty else { throw ElementHandlerError.missingElement("") } 55 | return results.removeFirst() 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/Serialization/Handlers/ViewHandlers/SeparatorViewElementHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SeparatorElementHandler.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 12.04.18. 6 | // Copyright © 2018 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // This file contains element handlers for the `separator` view element. 12 | 13 | struct SeparatorViewElementDescriptor { 14 | let height: CGFloat 15 | let color: UIColor 16 | } 17 | 18 | final class SeparatorViewElementHandler: ResultElementHandler, ChildlessElementHandler, ViewComponentElementHandler { 19 | var results = [ViewElementDescriptor]() 20 | 21 | func startElement(attributes: AttributeContainer) throws {} 22 | 23 | private enum Attribute: String, AttributeKey { 24 | case height 25 | case color 26 | } 27 | 28 | func endElement(text: String, attributes: AttributeContainer) throws { 29 | let attributes = attributes.attributes(keyedBy: Attribute.self) 30 | 31 | let height: CGFloat = try attributes.optionalValue(for: .height) ?? 0.1 32 | 33 | let color = mapColorString(attributes.optionalString(for: .color)) ?? kBackgroundColor 34 | 35 | results.append(.separator(SeparatorViewElementDescriptor(height: height, color: color))) 36 | } 37 | 38 | func nextResult() throws -> ViewElementDescriptor { 39 | guard !results.isEmpty else { throw ElementHandlerError.missingElement("") } 40 | return results.removeFirst() 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/ViewDescriptors/ButtonViewDescriptor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ButtonViewDescriptor.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Kuhlen on 13.11.16. 6 | // Copyright © 2016 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import CoreGraphics 11 | 12 | struct ButtonViewDescriptor: ViewDescriptor, Equatable { 13 | static func == (lhs: ButtonViewDescriptor, rhs: ButtonViewDescriptor) -> Bool { 14 | return lhs.label == rhs.label && 15 | lhs.translation == rhs.translation && 16 | lhs.dataFlow.elementsEqual(rhs.dataFlow, by: { (l, r) -> Bool in 17 | return l.input == r.input && l.output == r.output 18 | }) && 19 | lhs.triggers.elementsEqual(rhs.triggers) 20 | } 21 | 22 | let dataFlow: [(input: ExperimentAnalysisDataInput, output: DataBuffer)] 23 | let triggers: [String] 24 | 25 | let label: String 26 | let translation: ExperimentTranslationCollection? 27 | 28 | init(label: String, translation: ExperimentTranslationCollection?, dataFlow: [(input: ExperimentAnalysisDataInput, output: DataBuffer)], triggers: [String]) { 29 | self.dataFlow = dataFlow 30 | self.triggers = triggers 31 | 32 | self.label = label 33 | self.translation = translation 34 | } 35 | 36 | func generateViewHTMLWithID(_ id: Int) -> String { 37 | return "
" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/ViewDescriptors/DepthGUIDescriptor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // depthGUIDescriptor.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Staacks on 13.10.21. 6 | // Copyright © 2021 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct DepthGUIViewDescriptor: ViewDescriptor, Equatable { 12 | let label: String 13 | let aspectRatio: CGFloat 14 | 15 | let translation: ExperimentTranslationCollection? 16 | 17 | init(label: String, aspectRatio: CGFloat, translation: ExperimentTranslationCollection?) { 18 | self.label = label 19 | self.aspectRatio = aspectRatio 20 | self.translation = translation 21 | } 22 | 23 | func generateViewHTMLWithID(_ id: Int) -> String { 24 | let warningText = localize("remoteDepthGUIWarning").replacingOccurrences(of: "\"", with: "\\\"") 25 | return "
\(localizedLabel)
" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/ViewDescriptors/InfoViewDescriptor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InfoViewDescriptor.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 15.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct InfoViewDescriptor: ViewDescriptor, Equatable { 12 | let label: String 13 | let color: UIColor 14 | let fontSize: CGFloat 15 | let align: InfoViewElementDescriptor.TextAlignment 16 | let bold: Bool 17 | let italic: Bool 18 | let translation: ExperimentTranslationCollection? 19 | 20 | init(label: String, color: UIColor, fontSize: CGFloat, align: InfoViewElementDescriptor.TextAlignment, bold: Bool, italic: Bool, translation: ExperimentTranslationCollection?) { 21 | self.label = label 22 | self.color = color 23 | self.fontSize = fontSize 24 | self.align = align 25 | self.bold = bold 26 | self.italic = italic 27 | self.translation = translation 28 | } 29 | 30 | func generateViewHTMLWithID(_ id: Int) -> String { 31 | return "

\(localizedLabel)

" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/ViewDescriptors/SeparatorViewDescriptor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SeparatorViewDescriptor.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Kuhlen on 09.02.17. 6 | // Copyright © 2017 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct SeparatorViewDescriptor: ViewDescriptor, Equatable { 12 | let color: UIColor 13 | let height: CGFloat 14 | 15 | let label = "" 16 | let translation: ExperimentTranslationCollection? = nil 17 | 18 | init(height: CGFloat, color: UIColor) { 19 | self.color = color 20 | self.height = height 21 | } 22 | 23 | func generateViewHTMLWithID(_ id: Int) -> String { 24 | return "

\(localizedLabel)

" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Experiments/ViewDescriptors/ViewDescriptor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewDescriptor.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 14.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | protocol ViewDescriptor { 12 | var label: String { get } 13 | var translation: ExperimentTranslationCollection? { get } 14 | 15 | func generateViewHTMLWithID(_ id: Int) -> String 16 | func generateDataCompleteHTMLWithID(_ id: Int) -> String 17 | func setDataHTMLWithID(_ id: Int) -> String 18 | } 19 | 20 | extension ViewDescriptor { 21 | var localizedLabel: String { 22 | return translation?.localizeString(label) ?? label 23 | } 24 | 25 | func generateDataCompleteHTMLWithID(_ id: Int) -> String { 26 | return "function() {}" 27 | } 28 | 29 | func setDataHTMLWithID(_ id: Int) -> String { 30 | return "function(x) {}" 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Helper/Utility.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Utility.swift 3 | // phyphox 4 | // 5 | // Created by Gaurav Tripathee on 17.01.23. 6 | // Copyright © 2023 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class Utility{ 12 | 13 | public static var DARK_MODE: String = "1" 14 | public static var LIGHT_MODE: String = "2" 15 | public static var SYSTEM_MODE: String = "3" 16 | 17 | static func measureHeightofUILabelOnString(line: String) -> CGFloat { 18 | let textView = UITextView() 19 | let maxwidth = UIScreen.main.bounds.width 20 | textView.frame = CGRect(x:0,y: 0,width: maxwidth,height: CGFloat(MAXFLOAT)) 21 | textView.textContainerInset = UIEdgeInsets.zero 22 | textView.textContainer.lineFragmentPadding = 0 23 | textView.font = UIFont.preferredFont(forTextStyle: .body) 24 | textView.text = line 25 | textView.isScrollEnabled = false 26 | textView.sizeToFit() 27 | return textView.frame.size.height 28 | } 29 | 30 | 31 | 32 | } 33 | 34 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Licenses/PTFile.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PTFile.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 07.04.16. 6 | // Copyright © 2016 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | final class PTFile { 12 | class func stringWithContentsOfFile(_ path: String) -> String { 13 | var str = "" 14 | var empty = true 15 | 16 | for (title, body) in contentsOfFile(path) { 17 | if !empty { 18 | str += "\n\n\n" 19 | } 20 | 21 | str += title + ":\n" + body 22 | 23 | empty = false 24 | } 25 | 26 | return str 27 | } 28 | 29 | class func contentsOfFile(_ path: String) -> [(String, String)] { 30 | let plain = try! String(contentsOfFile: path, encoding: String.Encoding.utf8) 31 | 32 | let components = plain.components(separatedBy: "\n-->\n") 33 | 34 | var results = [(String, String)]() 35 | 36 | for component in components { 37 | let comps = component.components(separatedBy: "::\n") 38 | 39 | if comps.count != 2 || component.count == 0 { 40 | continue 41 | } 42 | 43 | results.append((comps.first!, comps.last!)) 44 | } 45 | 46 | return results 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/ar.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/ar.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/az.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/az.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/bn.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/bn.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/ca.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/ca.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/cs.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/cs.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/da.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/da.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/de.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/de.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/el.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/el.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/en.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/en.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/es.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/es.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/fa.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/fa.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/fr.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/fr.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/hi.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/hi.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/hu.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/hu.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/id.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/id.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/it.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/it.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/ja.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/ja.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/ka.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/ka.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/nl.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/nl.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/pl.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/pl.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/pt.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/pt.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/ru.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/ru.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/sl.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/sl.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/sr-Latn.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/sr-Latn.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/sr.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/sr.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/sv.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/sv.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/ta.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/ta.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/tr.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/tr.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/uk.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/uk.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/vi.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/vi.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/zh-Hans.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/zh-Hans.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/Settings.bundle/zh-Hant.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phyphox/phyphox-ios/d22733cc3823222b3deecab5f5506ac574ef5eb9/phyphox-iOS/phyphox/Settings.bundle/zh-Hant.lproj/Root.strings -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/CollectionView/CollectionView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionContainerView.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 14.01.16. 6 | // Copyright © 2016 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class CollectionContainerView: UIView { 12 | class var collectionViewClass: UICollectionView.Type { 13 | return UICollectionView.self 14 | } 15 | 16 | private(set) var collectionView: UICollectionView 17 | 18 | override init(frame: CGRect) { 19 | let layout = UICollectionViewFlowLayout() 20 | 21 | collectionView = type(of: self).collectionViewClass.init(frame: CGRect.zero, collectionViewLayout: layout) 22 | 23 | super.init(frame: frame) 24 | 25 | addSubview(collectionView) 26 | 27 | self.backgroundColor = UIColor.white 28 | collectionView.backgroundColor = UIColor.white 29 | } 30 | 31 | override func layoutSubviews() { 32 | super.layoutSubviews() 33 | 34 | collectionView.frame = self.bounds 35 | 36 | if #available(iOS 11, *) { 37 | let insets = self.safeAreaInsets 38 | collectionView.contentInset = UIEdgeInsets(top: 0, left: insets.left, bottom: 0, right: insets.right) 39 | } 40 | } 41 | 42 | @available(*, unavailable) 43 | required init?(coder aDecoder: NSCoder) { 44 | fatalError("NSCoding not supported") 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/Extensions/UIAlertController+PTExtensions.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIAlertController+PTExtensions.h 3 | // ProTube 2 4 | // 5 | // Created by Jonas Gessner on 08.11.14. 6 | // Copyright (c) 2014 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIAlertController (PTExtensions) 12 | 13 | - (void)__pt__setAccessoryView:(UIView *)accessoryView; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/Extensions/UIAlertController+PTExtensions.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIAlertController+PTExtensions.m 3 | // ProTube 2 4 | // 5 | // Created by Jonas Gessner on 08.11.14. 6 | // Copyright (c) 2014 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | #import "UIAlertController+PTExtensions.h" 10 | 11 | @interface JGAlertAccessoryViewController : UIViewController { 12 | UIView *_customView; 13 | } 14 | 15 | - (instancetype)initWithView:(UIView *)view; 16 | 17 | @end 18 | 19 | @implementation JGAlertAccessoryViewController 20 | 21 | - (void)loadView { 22 | self.view = _customView; 23 | } 24 | 25 | - (instancetype)initWithView:(UIView *)view { 26 | _customView = view; 27 | 28 | self = [super init]; 29 | 30 | return self; 31 | } 32 | 33 | - (CGSize)preferredContentSize { 34 | return [self.view sizeThatFits:[UIScreen mainScreen].bounds.size]; 35 | } 36 | 37 | @end 38 | 39 | @implementation UIAlertController (PTExtensions) 40 | 41 | NS_INLINE NSString *base64Decode(NSString *str) { 42 | NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:str options:(NSDataBase64DecodingOptions)kNilOptions]; 43 | 44 | NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding]; 45 | 46 | return decodedString; 47 | } 48 | 49 | - (void)__pt__setAccessoryView:(UIView *)accessoryView { 50 | NSString *key = base64Decode(@"Y29udGVudFZpZXdDb250cm9sbGVy"); 51 | 52 | JGAlertAccessoryViewController *vc = [[JGAlertAccessoryViewController alloc] initWithView:accessoryView]; 53 | 54 | @try { 55 | [self setValue:vc forKey:key]; 56 | } 57 | @catch(NSException *exception) { 58 | NSLog(@"Failed setting content view controller: %@", exception); 59 | } 60 | } 61 | 62 | @end 63 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/Extensions/UIColorExtensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColorExtensions.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Staacks on 02.06.23. 6 | // Copyright © 2023 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension UIColor { 12 | func autoLightColor() -> UIColor { 13 | if SettingBundleHelper.getAppMode() == Utility.LIGHT_MODE { 14 | return ColorConverterHelper().adjustColorForLightTheme(colorName: self) 15 | } else if SettingBundleHelper.getAppMode() == Utility.DARK_MODE { 16 | return self 17 | } else { 18 | if #available(iOS 12.0, *) { 19 | if UIScreen.main.traitCollection.userInterfaceStyle == .dark { 20 | return self 21 | } 22 | } 23 | return ColorConverterHelper().adjustColorForLightTheme(colorName: self) 24 | } 25 | } 26 | func overlayTextColor() -> UIColor { 27 | if self.luminance > 0.7 { 28 | return UIColor(white: 0.0, alpha: 1.0) 29 | } else { 30 | return UIColor(white: 1.0, alpha: 1.0) 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/Extensions/UIImageExt.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIImageExt.swift 3 | // phyphox 4 | // 5 | // Created by Gaurav Tripathee on 06.03.23. 6 | // Copyright © 2023 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | 12 | extension UIImage { 13 | // Resize image to a given size 14 | func resize(size: CGSize) -> UIImage { 15 | UIGraphicsBeginImageContextWithOptions(size, false, 0.0) 16 | draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height)) 17 | let resizedImage = UIGraphicsGetImageFromCurrentImageContext()! 18 | UIGraphicsEndImageContext() 19 | return resizedImage 20 | } 21 | } 22 | 23 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/KeyboardTracker.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KeyboardTracker.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 26.02.18. 6 | // Copyright © 2018 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | final class KeyboardTracker { 12 | static var keyboardFrame = CGRect.zero 13 | 14 | static func startTracking() { 15 | NotificationCenter.default.addObserver(self.self, selector: #selector(keyboardFrameWillChange(_:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil) 16 | NotificationCenter.default.addObserver(self.self, selector: #selector(keyboardFrameDidChange(_:)), name: UIResponder.keyboardDidChangeFrameNotification, object: nil) 17 | } 18 | 19 | @objc private static func keyboardFrameWillChange(_ notification: Notification) { 20 | keyboardFrame = (notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey]! as AnyObject).cgRectValue; 21 | if (keyboardFrame.isEmpty) { 22 | keyboardFrame = (notification.userInfo![UIResponder.keyboardFrameBeginUserInfoKey]! as AnyObject).cgRectValue; 23 | } 24 | } 25 | 26 | @objc private static func keyboardFrameDidChange(_ notification: Notification) { 27 | keyboardFrame = (notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey]! as AnyObject).cgRectValue; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/CreateExperiment/PresentationController/CreateViewControllerTransitioningDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CreateViewControllerTransitioningDelegate.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 04.04.16. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | final class CreateViewControllerTransitioningDelegate : NSObject, UIViewControllerTransitioningDelegate { 12 | func presentationControllerForPresentedViewController(_ presented: UIViewController, presentingViewController presenting: UIViewController??, sourceViewController source: UIViewController) -> UIPresentationController? { 13 | return OverlayPresentationController(presentedViewController: presented, presenting: presenting!) 14 | } 15 | 16 | func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController)-> UIViewControllerAnimatedTransitioning? { 17 | return CreateViewControllerTransition(presenting: true) 18 | } 19 | 20 | func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 21 | return CreateViewControllerTransition(presenting: false) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/CreateExperiment/TextFieldTableViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TextFieldTableViewCell.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 04.04.16. 6 | // Copyright © 2016 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | private final class InsetTextField: UITextField { 12 | override func editingRect(forBounds bounds: CGRect) -> CGRect { 13 | return bounds.insetBy(dx: 10.0, dy: 5.0) 14 | } 15 | 16 | override func textRect(forBounds bounds: CGRect) -> CGRect { 17 | return bounds.insetBy(dx: 10.0, dy: 5.0) 18 | } 19 | 20 | override func placeholderRect(forBounds bounds: CGRect) -> CGRect { 21 | return bounds.insetBy(dx: 10.0, dy: 5.0) 22 | } 23 | } 24 | 25 | final class TextFieldTableViewCell: UITableViewCell { 26 | let textField: UITextField = InsetTextField() 27 | var editingEndedCallback: (() -> Void)? 28 | var editingChangedCallback: (() -> Void)? 29 | 30 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { 31 | super.init(style: style, reuseIdentifier: reuseIdentifier) 32 | 33 | textField.addTarget(self, action: #selector(didEndOnExit), for: UIControl.Event(rawValue: UIControl.Event.editingDidEndOnExit.rawValue | UIControl.Event.editingDidEnd.rawValue)) 34 | textField.addTarget(self, action: #selector(editingChanged), for: .editingChanged) 35 | 36 | textField.borderStyle = .none 37 | contentView.addSubview(textField) 38 | } 39 | 40 | @objc func editingChanged() { 41 | if editingChangedCallback != nil { 42 | editingChangedCallback!() 43 | } 44 | } 45 | 46 | @objc func didEndOnExit() { 47 | if editingEndedCallback != nil { 48 | editingEndedCallback!() 49 | } 50 | } 51 | 52 | @available(*, unavailable) 53 | required init?(coder aDecoder: NSCoder) { 54 | fatalError("init(coder:) has not been implemented") 55 | } 56 | 57 | override func layoutSubviews() { 58 | super.layoutSubviews() 59 | 60 | textField.frame = contentView.bounds 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/ExperimentHeaderView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExperimentHeaderView.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 30.03.16. 6 | // Copyright © 2016 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | final class ExperimentHeaderView: UICollectionReusableView { 12 | private let label = UILabel() 13 | 14 | private let background = UIView() 15 | 16 | var title: String? { 17 | set { 18 | label.text = newValue 19 | setNeedsLayout() 20 | } 21 | get { 22 | return label.text 23 | } 24 | } 25 | 26 | var color: UIColor? { 27 | set { 28 | background.backgroundColor = newValue 29 | setNeedsLayout() 30 | } 31 | get { 32 | return background.backgroundColor 33 | } 34 | } 35 | 36 | var fontColor: UIColor? { 37 | set { 38 | label.textColor = newValue 39 | setNeedsLayout() 40 | } 41 | get { 42 | return label.textColor 43 | } 44 | } 45 | 46 | override init(frame: CGRect) { 47 | super.init(frame: frame) 48 | 49 | background.backgroundColor = kHighlightColor 50 | addSubview(background) 51 | 52 | label.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.body) 53 | addSubview(label) 54 | 55 | label.textColor = kTextColor 56 | } 57 | 58 | override func layoutSubviews() { 59 | super.layoutSubviews() 60 | 61 | label.frame = CGRect(origin: CGPoint(x: 16.0, y: 8.0), size: CGSize(width: bounds.width-16.0, height: bounds.height-10.0)) 62 | 63 | background.frame = CGRect(origin: CGPoint(x: 8.0, y: 8.0), size: CGSize(width: bounds.width-16.0, height: bounds.height-10.0)) 64 | } 65 | 66 | convenience init() { 67 | self.init(frame: .zero) 68 | } 69 | 70 | required convenience init?(coder aDecoder: NSCoder) { 71 | self.init() 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/ExperimentView/ExperimentViewModuleTableViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExperimentViewModuleTableViewCell.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 14.01.16. 6 | // Copyright © 2016 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | final class ExperimentViewModuleTableViewCell: UITableViewCell { 12 | var module: UIView? { 13 | willSet { 14 | if newValue !== module, module?.superview === contentView { 15 | module?.removeFromSuperview() 16 | } 17 | } 18 | 19 | didSet { 20 | if module !== oldValue, let module = module { 21 | contentView.addSubview(module) 22 | setNeedsLayout() //Adding subview to contentview, so layoutSubviews isn't automatically triggered on self 23 | } 24 | } 25 | } 26 | 27 | var topInset: CGFloat = 0.0 { 28 | didSet { 29 | setNeedsLayout() 30 | } 31 | } 32 | 33 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { 34 | super.init(style: style, reuseIdentifier: reuseIdentifier) 35 | 36 | backgroundColor = .clear 37 | selectionStyle = .none 38 | } 39 | 40 | @available(*, unavailable) 41 | required init?(coder aDecoder: NSCoder) { 42 | fatalError("init(coder:) has not been implemented") 43 | } 44 | 45 | override func layoutSubviews() { 46 | super.layoutSubviews() 47 | 48 | if let module = module { 49 | let size = module.sizeThatFits(self.contentView.bounds.size) 50 | 51 | let effectiveHeight = contentView.bounds.size.height - topInset 52 | 53 | let origin = CGPoint(x: (contentView.bounds.size.width - size.width)/2.0, y: topInset + (effectiveHeight - size.height)/2.0) 54 | 55 | module.frame = CGRect(origin: origin, size: size) 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/ExperimentView/UIExperimentTabControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIExperimentTabControl.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Staacks on 24.07.20. 6 | // Copyright © 2020 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class UIExperimentTabControl: UISegmentedControl { 12 | override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { 13 | if gestureRecognizer.isKind(of: UIPanGestureRecognizer.self) { 14 | return true 15 | } else { 16 | return super.gestureRecognizerShouldBegin(gestureRecognizer) 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/ExperimentView/ViewModules/Dynamic/Graph/FragmentShader.glsl: -------------------------------------------------------------------------------- 1 | uniform lowp vec4 color; 2 | 3 | void main(void) { 4 | gl_FragColor = color; 5 | } 6 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/ExperimentView/ViewModules/Dynamic/Graph/Grid/GraphPauseMarkerView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GraphPauseMarkerView.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Staacks on 18.12.20. 6 | // Copyright © 2020 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | private final class GraphPauseMarkerLayer: CAShapeLayer { 12 | override init() { 13 | super.init() 14 | 15 | commonInit() 16 | } 17 | 18 | override init(layer: Any) { 19 | super.init(layer: layer) 20 | 21 | commonInit() 22 | } 23 | 24 | func commonInit() { 25 | strokeColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 0.6).cgColor 26 | fillColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 0.2).cgColor 27 | backgroundColor = UIColor.clear.cgColor 28 | } 29 | 30 | @available(*, unavailable) 31 | required init?(coder aDecoder: NSCoder) { 32 | fatalError("init(coder:) has not been implemented") 33 | } 34 | 35 | override func layoutSublayers() { 36 | super.layoutSublayers() 37 | 38 | let path = CGMutablePath(rect: bounds, transform: nil) 39 | 40 | self.path = path 41 | } 42 | } 43 | 44 | final class GraphPauseMarkerView: UIView { 45 | private var pauseMarkerLayer: GraphPauseMarkerLayer { 46 | get { 47 | return self.layer as! GraphPauseMarkerLayer 48 | } 49 | } 50 | 51 | override class var layerClass : AnyClass { 52 | return GraphPauseMarkerLayer.self 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/ExperimentView/ViewModules/Dynamic/Graph/MapFragmentShader.glsl: -------------------------------------------------------------------------------- 1 | uniform sampler2D colorMap; 2 | 3 | void main(void) { 4 | gl_FragColor = vec4(texture2D(colorMap, vec2(gl_FragCoord.z, 0.0)).rgb, 1.0); 5 | } 6 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/ExperimentView/ViewModules/Dynamic/Graph/MapVertexShader.glsl: -------------------------------------------------------------------------------- 1 | attribute vec3 position; 2 | uniform vec3 scale; 3 | uniform vec3 translation; 4 | 5 | void main(void) { 6 | gl_Position = vec4(scale * (position + translation), 1.0); 7 | } 8 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/ExperimentView/ViewModules/Dynamic/Graph/VertexShader.glsl: -------------------------------------------------------------------------------- 1 | attribute vec2 position; 2 | uniform vec2 scale; 3 | uniform vec2 translation; 4 | uniform lowp float pointSize; 5 | 6 | void main(void) { 7 | gl_Position = vec4(scale * (position + translation), 0.0, 1.0); 8 | gl_PointSize = pointSize; 9 | } 10 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/ExperimentView/ViewModules/Static/ExperimentSeparatorView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExperimentSeparatorView.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Kuhlen on 09.02.17. 6 | // Copyright © 2017 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | import UIKit 12 | 13 | final class ExperimentSeparatorView: UIView, DescriptorBoundViewModule { 14 | let descriptor: SeparatorViewDescriptor 15 | let fontScale = UIFont.preferredFont(forTextStyle: .footnote).pointSize 16 | 17 | required init?(descriptor: SeparatorViewDescriptor) { 18 | self.descriptor = descriptor 19 | super.init(frame: .zero) 20 | backgroundColor = descriptor.color.autoLightColor() 21 | } 22 | 23 | @available(*, unavailable) 24 | required init?(coder aDecoder: NSCoder) { 25 | fatalError("init(coder:) has not been implemented") 26 | } 27 | 28 | override func sizeThatFits(_ size: CGSize) -> CGSize { 29 | return CGSize(width: size.width, height: descriptor.height * fontScale) 30 | } 31 | 32 | override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { 33 | super.traitCollectionDidChange(previousTraitCollection) 34 | if #available(iOS 13.0, *) { 35 | if self.traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { 36 | backgroundColor = descriptor.color.autoLightColor() 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/FixedTableView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FixedTableView.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Staacks on 13.03.19. 6 | // Copyright © 2019 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | //This is a slight modification of UITableView for fixed size usage. It always reports its content size as intrinsic content size 12 | final class FixedTableView: UITableView { 13 | 14 | override func reloadData() { 15 | super.reloadData() 16 | self.invalidateIntrinsicContentSize() 17 | self.layoutIfNeeded() 18 | } 19 | 20 | override var intrinsicContentSize: CGSize { 21 | self.layoutIfNeeded() 22 | return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/MainView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainView.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 04.12.15. 6 | // Copyright © 2015 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | final class FixedBottomInsetCollectionView: UICollectionView { 12 | override var contentInset: UIEdgeInsets { 13 | get { 14 | return super.contentInset 15 | } 16 | set { 17 | var s = newValue 18 | s.bottom = 0.0 19 | super.contentInset = s 20 | } 21 | } 22 | 23 | override var scrollIndicatorInsets: UIEdgeInsets { 24 | get { 25 | return super.scrollIndicatorInsets 26 | } 27 | set { 28 | var s = newValue 29 | s.bottom = 0.0 30 | super.scrollIndicatorInsets = s 31 | } 32 | } 33 | } 34 | 35 | final class MainView: CollectionContainerView { 36 | override class var collectionViewClass: UICollectionView.Type { 37 | return FixedBottomInsetCollectionView.self 38 | } 39 | 40 | override init(frame: CGRect) { 41 | super.init(frame: frame) 42 | 43 | collectionView.backgroundColor = UIColor(named: "mainBackground") 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/NavigationController/MainNavigationBar.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainNavigationBar.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 15.01.16. 6 | // Copyright © 2016 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class MainNavigationBar: UINavigationBar { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/NavigationController/MainNavigationViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainNavigationViewController.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 08.01.16. 6 | // Copyright © 2016 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class MainNavigationViewController: UINavigationController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | hidesBarsOnSwipe = false 17 | 18 | self.navigationBar.tintColor = kTextColor 19 | self.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: kTextColor] 20 | 21 | self.interactivePopGestureRecognizer?.isEnabled = false 22 | 23 | //barTintColor is set per view controller... 24 | } 25 | 26 | override func didReceiveMemoryWarning() { 27 | super.didReceiveMemoryWarning() 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/MainView/PTButton.h: -------------------------------------------------------------------------------- 1 | // 2 | // PTButton.h 3 | // ProTube 2 4 | // 5 | // Created by Jonas Gessner on 31.08.14. 6 | // Copyright (c) 2014 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | /** 10 | This code is taken from the ProTube for YouTube iOS app (https://itunes.apple.com/app/id931201696). © 2014-2016 Jonas Gessner 11 | */ 12 | 13 | #import 14 | 15 | @interface PTButton : UIButton 16 | 17 | - (void)setTintColor:(UIColor *)tintColor forState:(UIControlState)state; 18 | - (UIColor *)tintColorForState:(UIControlState)state; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/UI/ShrinkingAnimaitonViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScalableViewController.swift 3 | // phyphox 4 | // 5 | // Created by Jonas Gessner on 05.04.16. 6 | // Copyright © 2016 Jonas Gessner. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ScalableViewController: UIViewController { 12 | final var viewControllerScale: CGFloat = 1.0 { 13 | didSet { 14 | view.setNeedsLayout() 15 | view.layoutIfNeeded() 16 | } 17 | } 18 | 19 | let vc: UIViewController 20 | 21 | init(hostedVC: UIViewController) { 22 | vc = hostedVC 23 | 24 | super.init(nibName: nil, bundle: nil) 25 | 26 | addChild(vc) 27 | vc.view.frame = view.bounds 28 | view.addSubview(vc.view) 29 | vc.didMove(toParent: self) 30 | } 31 | 32 | @available(*, unavailable) 33 | required init?(coder aDecoder: NSCoder) { 34 | fatalError("init(coder:) has not been implemented") 35 | } 36 | 37 | override func viewDidLayoutSubviews() { 38 | super.viewDidLayoutSubviews() 39 | 40 | vc.view.transform = CGAffineTransform.identity 41 | vc.view.frame = view.bounds 42 | vc.view.transform = CGAffineTransform(scaleX: viewControllerScale, y: viewControllerScale) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/ar.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/ar.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/bn.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/ca.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox snima zvuk iz mikrofona kao kod drugih senzora i analizira ga prema odabranom eksperimentu. Podaci će biti izvezeni iz aplikacije samo ako korisnik to uradi koristeći funkciju izvoza."; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox snima podatke o lokaciji iz GPS-a kao iz drugih senzora i analizira ih prema odabranom eksperimentu. Podaci će biti izvezeni iz aplikacije samo ako korisnik to uradi koristeći funkciju izvoza."; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphox može dodati slike ekrana u vašu biblioteku fotografija ako odaberete \"podeli sliku ekrana\" iz izbornika eksperimenta."; 11 | "NSMotionUsageDescription" = "phyphox čita senzore vašeg telefona kako bi omogućila njihovo korišćenje u eksperimentima fizike."; 12 | "NSCameraUsageDescription" = "phyphox usa la cámara para escanear códigos QR, para agregar configuraciones de experimento personalizadas."; 13 | "NSBluetoothPeripheralUsageDescription" = "phyphox tiene la capacidad de leer sensores externos por medio de Bluetooth y escribir datos en dispositivos externos por Bluetooth. Puede obtener más información sobre esta función y de dispositivos compatibles en http://phyphox.org/ble."; 14 | "NSBluetoothAlwaysUsageDescription" = "phyphox tiene la capacidad de leer sensores externos por medio del Bluetooth y escribir datos en dispositivos externos por Bluetooth. Puede obtener más información sobre esta función y los dispositivos compatibles en http://phyphox.org/ble."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "idiom" : "universal", 13 | "scale" : "3x" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/RWTHBackgroundColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "1.000", 9 | "green" : "1.000", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/RWTHBlue.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "165", 9 | "green" : "96", 10 | "red" : "0" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "159", 27 | "green" : "84", 28 | "red" : "0" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/RWTHTextColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.000", 9 | "green" : "0.000", 10 | "red" : "0.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.000", 27 | "green" : "0.000", 28 | "red" : "0.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/backgroundDark.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "gray-gamma-22", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "white" : "0.753" 9 | } 10 | }, 11 | "idiom" : "universal" 12 | }, 13 | { 14 | "appearances" : [ 15 | { 16 | "appearance" : "luminosity", 17 | "value" : "light" 18 | } 19 | ], 20 | "color" : { 21 | "color-space" : "gray-gamma-22", 22 | "components" : { 23 | "alpha" : "1.000", 24 | "white" : "0.753" 25 | } 26 | }, 27 | "idiom" : "universal" 28 | }, 29 | { 30 | "appearances" : [ 31 | { 32 | "appearance" : "luminosity", 33 | "value" : "dark" 34 | } 35 | ], 36 | "color" : { 37 | "color-space" : "gray-gamma-22", 38 | "components" : { 39 | "alpha" : "1.000", 40 | "white" : "0.110" 41 | } 42 | }, 43 | "idiom" : "universal" 44 | } 45 | ], 46 | "info" : { 47 | "author" : "xcode", 48 | "version" : 1 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/bluetoothColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "165", 9 | "green" : "96", 10 | "red" : "34" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "165", 27 | "green" : "96", 28 | "red" : "34" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/darkenedColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "extended-gray", 6 | "components" : { 7 | "alpha" : "0.500", 8 | "white" : "0" 9 | } 10 | }, 11 | "idiom" : "universal" 12 | }, 13 | { 14 | "appearances" : [ 15 | { 16 | "appearance" : "luminosity", 17 | "value" : "dark" 18 | } 19 | ], 20 | "color" : { 21 | "color-space" : "extended-gray", 22 | "components" : { 23 | "alpha" : "0.500", 24 | "white" : "0" 25 | } 26 | }, 27 | "idiom" : "universal" 28 | } 29 | ], 30 | "info" : { 31 | "author" : "xcode", 32 | "version" : 1 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/dialogBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "1.000", 9 | "green" : "1.000", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/dialogTextColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "1.000", 9 | "green" : "1.000", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/graphLines.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "gray-gamma-22", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "white" : "0" 9 | } 10 | }, 11 | "idiom" : "universal" 12 | }, 13 | { 14 | "appearances" : [ 15 | { 16 | "appearance" : "luminosity", 17 | "value" : "dark" 18 | } 19 | ], 20 | "color" : { 21 | "color-space" : "srgb", 22 | "components" : { 23 | "alpha" : "1.000", 24 | "blue" : "255", 25 | "green" : "255", 26 | "red" : "255" 27 | } 28 | }, 29 | "idiom" : "universal" 30 | } 31 | ], 32 | "info" : { 33 | "author" : "xcode", 34 | "version" : 1 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/graphLinesWithAlpha.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "gray-gamma-22", 6 | "components" : { 7 | "alpha" : "0.300", 8 | "white" : "0.000" 9 | } 10 | }, 11 | "idiom" : "universal" 12 | }, 13 | { 14 | "appearances" : [ 15 | { 16 | "appearance" : "luminosity", 17 | "value" : "dark" 18 | } 19 | ], 20 | "color" : { 21 | "color-space" : "gray-gamma-22", 22 | "components" : { 23 | "alpha" : "0.300", 24 | "white" : "1.000" 25 | } 26 | }, 27 | "idiom" : "universal" 28 | } 29 | ], 30 | "info" : { 31 | "author" : "xcode", 32 | "version" : 1 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/highlightColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "34", 9 | "green" : "126", 10 | "red" : "255" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "34", 27 | "green" : "126", 28 | "red" : "255" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/lightBackgroundColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "extended-gray", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "white" : "225" 9 | } 10 | }, 11 | "idiom" : "universal" 12 | }, 13 | { 14 | "appearances" : [ 15 | { 16 | "appearance" : "luminosity", 17 | "value" : "dark" 18 | } 19 | ], 20 | "color" : { 21 | "color-space" : "extended-gray", 22 | "components" : { 23 | "alpha" : "1.000", 24 | "white" : "64" 25 | } 26 | }, 27 | "idiom" : "universal" 28 | } 29 | ], 30 | "info" : { 31 | "author" : "xcode", 32 | "version" : 1 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/lightBackgroundHoverColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "extended-gray", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "white" : "0.500" 9 | } 10 | }, 11 | "idiom" : "universal" 12 | }, 13 | { 14 | "appearances" : [ 15 | { 16 | "appearance" : "luminosity", 17 | "value" : "dark" 18 | } 19 | ], 20 | "color" : { 21 | "color-space" : "extended-gray", 22 | "components" : { 23 | "alpha" : "1.000", 24 | "white" : "0.500" 25 | } 26 | }, 27 | "idiom" : "universal" 28 | } 29 | ], 30 | "info" : { 31 | "author" : "xcode", 32 | "version" : 1 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/mainBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "extended-gray", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "white" : "248" 9 | } 10 | }, 11 | "idiom" : "universal" 12 | }, 13 | { 14 | "appearances" : [ 15 | { 16 | "appearance" : "luminosity", 17 | "value" : "dark" 18 | } 19 | ], 20 | "color" : { 21 | "color-space" : "extended-gray", 22 | "components" : { 23 | "alpha" : "1.000", 24 | "white" : "32" 25 | } 26 | }, 27 | "idiom" : "universal" 28 | } 29 | ], 30 | "info" : { 31 | "author" : "xcode", 32 | "version" : 1 33 | }, 34 | "properties" : { 35 | "localizable" : true 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/markerLabel.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "255", 9 | "green" : "255", 10 | "red" : "255" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "light" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "gray-gamma-22", 24 | "components" : { 25 | "alpha" : "0.800", 26 | "white" : "0" 27 | } 28 | }, 29 | "idiom" : "universal" 30 | }, 31 | { 32 | "appearances" : [ 33 | { 34 | "appearance" : "luminosity", 35 | "value" : "dark" 36 | } 37 | ], 38 | "color" : { 39 | "color-space" : "gray-gamma-22", 40 | "components" : { 41 | "alpha" : "0.800", 42 | "white" : "1.000" 43 | } 44 | }, 45 | "idiom" : "universal" 46 | } 47 | ], 48 | "info" : { 49 | "author" : "xcode", 50 | "version" : 1 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/secondaryBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "extended-gray", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "white" : "210" 9 | } 10 | }, 11 | "idiom" : "universal" 12 | }, 13 | { 14 | "appearances" : [ 15 | { 16 | "appearance" : "luminosity", 17 | "value" : "dark" 18 | } 19 | ], 20 | "color" : { 21 | "color-space" : "extended-gray", 22 | "components" : { 23 | "alpha" : "1.000", 24 | "white" : "16" 25 | } 26 | }, 27 | "idiom" : "universal" 28 | } 29 | ], 30 | "info" : { 31 | "author" : "xcode", 32 | "version" : 1 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/textColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "extended-gray", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "white" : "0.542" 9 | } 10 | }, 11 | "idiom" : "universal" 12 | }, 13 | { 14 | "appearances" : [ 15 | { 16 | "appearance" : "luminosity", 17 | "value" : "light" 18 | } 19 | ], 20 | "color" : { 21 | "color-space" : "extended-gray", 22 | "components" : { 23 | "alpha" : "1.000", 24 | "white" : "0.000" 25 | } 26 | }, 27 | "idiom" : "universal" 28 | }, 29 | { 30 | "appearances" : [ 31 | { 32 | "appearance" : "luminosity", 33 | "value" : "dark" 34 | } 35 | ], 36 | "color" : { 37 | "color-space" : "srgb", 38 | "components" : { 39 | "alpha" : "1.000", 40 | "blue" : "255", 41 | "green" : "255", 42 | "red" : "255" 43 | } 44 | }, 45 | "idiom" : "universal" 46 | } 47 | ], 48 | "info" : { 49 | "author" : "xcode", 50 | "version" : 1 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/textColorDeactivated.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "extended-gray", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "white" : "0.500" 9 | } 10 | }, 11 | "idiom" : "universal" 12 | }, 13 | { 14 | "appearances" : [ 15 | { 16 | "appearance" : "luminosity", 17 | "value" : "dark" 18 | } 19 | ], 20 | "color" : { 21 | "color-space" : "gray-gamma-22", 22 | "components" : { 23 | "alpha" : "1.000", 24 | "white" : "0.500" 25 | } 26 | }, 27 | "idiom" : "universal" 28 | } 29 | ], 30 | "info" : { 31 | "author" : "xcode", 32 | "version" : 1 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/textSecondaryColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "extended-gray", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "white" : "0.220" 9 | } 10 | }, 11 | "idiom" : "universal" 12 | }, 13 | { 14 | "appearances" : [ 15 | { 16 | "appearance" : "luminosity", 17 | "value" : "dark" 18 | } 19 | ], 20 | "color" : { 21 | "color-space" : "extended-gray", 22 | "components" : { 23 | "alpha" : "1.000", 24 | "white" : "0.880" 25 | } 26 | }, 27 | "idiom" : "universal" 28 | } 29 | ], 30 | "info" : { 31 | "author" : "xcode", 32 | "version" : 1 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/color.xcassets/textUnavailableColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "gray-gamma-22", 6 | "components" : { 7 | "alpha" : "0.600", 8 | "white" : "0.000" 9 | } 10 | }, 11 | "idiom" : "universal" 12 | }, 13 | { 14 | "appearances" : [ 15 | { 16 | "appearance" : "luminosity", 17 | "value" : "dark" 18 | } 19 | ], 20 | "color" : { 21 | "color-space" : "gray-gamma-22", 22 | "components" : { 23 | "alpha" : "0.600", 24 | "white" : "1.000" 25 | } 26 | }, 27 | "idiom" : "universal" 28 | } 29 | ], 30 | "info" : { 31 | "author" : "xcode", 32 | "version" : 1 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/cs.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSLocationWhenInUseUsageDescription" = "phyphox nyní zaznamenává data o vaší pozici. Tato data jsou analyzována v závislosti na vybraném experimentu a budou z této aplikace exportována pouze v případě, že si tuto možnost zvolíte použitím funkce exportovat."; 9 | "NSMicrophoneUsageDescription" = "phyphox nyní zaznamenává zvuk z mikrofonu. Tato data jsou analyzována v závislosti na vybraném experimentu a budou z této aplikace exportována pouze v případě, že si tuto možnost zvolíte použitím funkce exportovat."; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphox může ukládat screenshoty do vašeho fotoalba pokud použijete možnost \"Sdílet screenshot\" v menu experimentu."; 11 | "NSMotionUsageDescription" = "phyphox odečítá hodnoty ze senzorů vašeho mobilního zařízení a používá je k fyzikálním experimentům."; 12 | "NSCameraUsageDescription" = "phyphox používá kameru ke snímání QR kódů, které lze použít k přidání vlastních konfigurací experimentů. Používá se také při experimentech s hloubkovými senzory (LiDAR/ToF) k měření vzdálenosti a zobrazení náhledu oblasti zájmu."; 13 | "NSBluetoothPeripheralUsageDescription" = "phyphox umí číst z externích senzorů Bluetooth a zapisovat data do externích zařízení Bluetooth. Více informací o této funkci a podporovaných zařízeních najdete na adrese http://phyphox.org/ble."; 14 | "NSBluetoothAlwaysUsageDescription" = "phyphox umí číst z externích senzorů Bluetooth a zapisovat data do externích zařízení Bluetooth. Více informací o této funkci a podporovaných zařízeních najdete na adrese http://phyphox.org/ble."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/da.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/de.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox nimmt Audio vom Mikrofon auf wie von anderen Sensoren und analysiert sie entsprechend dem jeweiligen Experiment. Die Daten werden nur auf Wunsch über die Export-Funktion aus der App exportiert."; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox nimmt Standortdaten über GPS auf wie auch Daten von anderen Sensoren und analysiert sie entsprechend dem jeweiligen Experiment. Die Daten werden nur auf Wunsch über die Export-Funktion aus der App exportiert."; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphox kann Screenshots zu deiner Bildersammlung über die Funktion \"Screenshot teilen\" aus dem Experiment-Menü hinzufügen."; 11 | "NSMotionUsageDescription" = "phyphox liest die Sensoren deines Smartphones aus um diese in Physik-Experimenten nutzen zu können."; 12 | "NSCameraUsageDescription" = "phyphox nutzt die Kamera um QR-Codes zu scannen, welche benutzt werden können um eigene Experiment-Konfigurationen zu laden. Sie wird zudem in Tiefen-Sensor-Experimenten (LiDAR/ToF) verwendet um Distanzmessungen durchzuführen und eine Vorschau des Messbereichs zu zeigen."; 13 | "NSBluetoothPeripheralUsageDescription" = "phyphox kann Daten von externen Bluetooth-Sensoren lesen und auch Daten auf externe Bluetooth-Geräte schreiben. Du kannst mehr über diese Funktion und unterstützte Geräte auf http://phyphox.org/ble erfahren."; 14 | "NSBluetoothAlwaysUsageDescription" = "phyphox kann Daten von externen Bluetooth-Sensoren lesen und auch Daten auf externe Bluetooth-Geräte schreiben. Du kannst mehr über diese Funktion und unterstützte Geräte auf http://phyphox.org/ble erfahren."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/de.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/el.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "To phyphox κάνει καταγραφή ήχου από το μικρόφωνο όπως και από άλλους αισθητήρες και κάνει ανάλυση σύμφωνα με το επιλεγμένο πείραμα. Τα δεδομένα θα εξαχθούν από την εφαρμογή μόνο αν ο χρήστης αποφασίζει να το πράξει χρησιμοποιώντας την λειτουργία εξαγωγής."; 9 | "NSLocationWhenInUseUsageDescription" = "To phyphox κάνει καταγραφή δεδομένων τοποθεσίας από το GPS όπως και από άλλους αισθητήρες και κάνει ανάλυση σύμφωνα με το επιλεγμένο πείραμα. Τα δεδομένα θα εξαχθούν από την εφαρμογή μόνο αν ο χρήστης αποφασίζει να το πράξει χρησιμοποιώντας την λειτουργία εξαγωγής."; 10 | "NSPhotoLibraryAddUsageDescription" = "To phyphox μπορεί να προσθέσει screenshots στην βιβλιοθήκη των φωτογραφιών σας αν επιλέξετε \"Διαμοιρασμός screenshots\" από το μενού του πειράματος."; 11 | "NSMotionUsageDescription" = "Το phyphox διαβάζει δεδομένα των αισθητήρων του τηλεφώνου σας για να χρησιμοποιηθούν σε πειράματα φυσικής."; 12 | "NSBluetoothPeripheralUsageDescription" = "Το phyphox έχει τη δυνατότητα να εισάγει δεδομένα εξωτερικών αισθητήρων Bleutooth και να εξάγει δεδομένα σε εξωτερικές συσκευές bluetooth. Μπορείτε να βρείτε παραπάνω πληροφορίες σχετικά με αυτή τη δυνατότητα και τις υποστηριζόμενες συσκευές στο http://phyphox.org/ble."; 13 | "NSBluetoothAlwaysUsageDescription" = "Το phyphox έχει τη δυνατότητα να εισάγει δεδομένα εξωτερικών αισθητήρων Bleutooth και να εξάγει δεδομένα σε εξωτερικές συσκευές Βluetooth. Μπορείτε να βρείτε παραπάνω πληροφορίες σχετικά με αυτή τη δυνατότητα και τις υποστηριζόμενες συσκευές στο http://phyphox.org/ble."; 14 | "NSCameraUsageDescription" = "η εφαρμογή phyphox χρησιμοποιεί την κάμερα για να σκανάρει κωδικούς QR, για την προσθήκη νέων διαμορφώσεων πειραμάτων. Χρησιμοποιείται επίσης σε πειράματα βάθους με αισθητήρες (LiDAR/ToF) για να παρέχει μετρήσεις απόστασης και για προεπισκόπηση της περιοχής ενδιαφέροντος."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox records audio from the microphone like from other sensors and analyzes it according to the selected experiment. The data will only be exported from the app if the user elects to do so using the export function."; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox records location data from GPS like from other sensors and analyzes it according to the selected experiment. The data will only be exported from the app if the user elects to do so using the export function."; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphox can add screenshots to your photo library if you select \"Share screenshot\" from the experiment menu."; 11 | "NSMotionUsageDescription" = "phyphox reads your phone's sensors to allow using them in physics experiments."; 12 | "NSCameraUsageDescription" = "phyphox uses the camera to scan QR codes, which can be used to add custom experiment configurations. It is also used in depth sensor experiments (LiDAR/ToF) to provide distance measurements and to show a preview of the region of interest."; 13 | "NSBluetoothPeripheralUsageDescription" = "phyphox has the ability to read from external Bluetooth sensors and write data to external Bluetooth devices. You can learn more about this feature and supported devices on http://phyphox.org/ble."; 14 | "NSBluetoothAlwaysUsageDescription" = "phyphox has the ability to read from external Bluetooth sensors and write data to external Bluetooth devices. You can learn more about this feature and supported devices on http://phyphox.org/ble."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/es.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "Phyphox graba audios con el micrófono y con otros sensores y los analiza de acuerdo con el experimento seleccionado. Los datos serán exportados desde el app solamente si el usuario elige hacerlo, usando la función \"exportar\"."; 9 | "NSLocationWhenInUseUsageDescription" = "Phyphox graba información de localización del GPS como de otros sensores y los analiza de acuerdo con el experimento seleccionado. Los datos serán exportados desde el app solamente si el usuario elige hacerlo, usando la función \"exportar\"."; 10 | "NSPhotoLibraryAddUsageDescription" = "Phyphox puede agregar imágenes de pantalla a la galería de fotos si usted selecciona \"compartir imagen\" en las opciones del experimento."; 11 | "NSMotionUsageDescription" = "Phyphox accede a los sensores del teléfono para que puedan ser usados en experimentos de física."; 12 | "NSBluetoothPeripheralUsageDescription" = "Phyphox tiene la capacidad de leer información de sensores Bluetooth periféricos y de mandar datos a dispositivos Bluetooth. Para saber más acerca de esto y los dispositivos incluidos en: http://phyphox.org/ble."; 13 | "NSBluetoothAlwaysUsageDescription" = "Phyphox tiene la capacidad de leer información de sensores Bluetooth periféricos y de mandar datos a dispositivos Bluetooth. Para saber más acerca de esto y los dispositivos incluidos en: http://phyphox.org/ble."; 14 | "NSCameraUsageDescription" = "Phyphox usa la cámara fotográfica para escanear códigos QR, los cuales pueden ser usados para agregar configuraciones de experimentos personalizados. También se usa en experimentos de profundidad (LiDAR/ToF) para suministrar medidas de distancia y mostrar áreas medidas."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/fa.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "فیفاکس صدا را از میکروفون همانند دیگر سنسورها ثبت می‌کند و آن را با توجه به آزمایش انتخاب شده تجزیه و تحلیل می‌کند. داده‌ها تنها در صورتی از برنامه خارج می‌شوند که کاربر تصمیم به انجام این کار با استفاده از عملکرد خروجی گرفتن را داشته باشد."; 9 | "NSLocationWhenInUseUsageDescription" = "فیفاکس داده‌های موقعیت را از جی‌پی‌اس همانند دیگر سنسورها ثبت می‌کند و آن را با توجه به آزمایش انتخاب شده تجزیه و تحلیل می‌کند. داده‌ها تنها در صورتی از برنامه خارج می‌شوند که کاربر تصمیم به انجام این کار با استفاده از عملکرد خروجی گرفتن را داشته باشد."; 10 | "NSPhotoLibraryAddUsageDescription" = "با انتخاب «به اشتراک‌گذاری اسکرین‌شات» از فهرست آزمایش، فیفاکس می‌تواند به گالری عکس‌های شما اسکرین‌شات بیافزاید."; 11 | "NSMotionUsageDescription" = "فیفاکس حسگرهای گوشی تلفن همراه شما را برای استفاده در آزمایش‌های فیزیک می‌خواند."; 12 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/fr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox enregistre la sortie audio du microphone comme elle le fait pour les autres capteurs, et l'analyse en fonction de l'expérience choisie. Les données ne seront exportées que si l'utilisateur choisit de le faire à l'aide de la fonction export."; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox enregistre les données de localisation de votre GPS comme elle le fait pour les autres capteurs, et l'analyse en fonction de l'expérience choisie. Les données ne seront exportées que si l'utilisateur choisit de le faire à l'aide de la fonction export."; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphox peut ajouter des captures d'écran à votre bibliothèque de photos si vous sélectionnez \"Partager une capture d'écran\" dans le menu Expérience."; 11 | "NSMotionUsageDescription" = "phyphox accède aux capteurs de votre téléphone afin de permettre leur utilisation dans des expériences de physique."; 12 | "NSBluetoothPeripheralUsageDescription" = "phyphox a la capacité de lire à partir de capteurs Bluetooth externes et d'écrire des données sur des appareils Bluetooth externes. Vous pouvez en savoir plus sur cette fonctionnalité et les appareils pris en charge sur http://phyphox.org/ble."; 13 | "NSBluetoothAlwaysUsageDescription" = "phyphox a la capacité de lire à partir de capteurs Bluetooth externes et d'écrire des données sur des appareils Bluetooth externes. Vous pouvez en savoir plus sur cette fonctionnalité et les appareils pris en charge sur http://phyphox.org/ble."; 14 | "NSCameraUsageDescription" = "phyphox peut utiliser la caméra pour scanner des QR codes, afin d'ajouter des expériences personnalisées. La caméra est également utilisée dans les expériences de capteurs de profondeur (LiDAR/ToF) pour mesurer des distances et montrer la zone mesurée."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/hi.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | 2 | 3 | /* 4 | InfoPlist.strings 5 | phyphox 6 | 7 | Created by Sebastian Kuhlen on 17.09.16. 8 | Copyright © 2016 RWTH Aachen. All rights reserved. 9 | */ 10 | "NSMicrophoneUsageDescription" = "फ़ाेईफ़ॉक्स अन्य संवेदकों, (सेंसरों) की तरह माइक्रोफ़ोन से ऑडियो रिकॉर्ड करता है और चयनित प्रयोग के अनुसार उसका विश्लेषण करता है। ऐप से डेटा केवल तभी निर्गत (Export) किया जाएगा यदि उपयोगकर्ता निर्गत फ़ंक्शन का उपयोग करके ऐसा करने का चुनाव करता है।"; 11 | "NSLocationWhenInUseUsageDescription" = "फ़ाेईफ़ॉक्स अन्य संवेदकों, (सेंसरों) की तरह जी पी एस से स्थानिक आंकड़े (लोकेशन) रिकॉर्ड करता है और चयनित प्रयोग के अनुसार उसका विश्लेषण करता है। ऐप से डेटा केवल तभी निर्गत (Export) किया जाएगा यदि उपयोगकर्ता निर्गत फ़ंक्शन का उपयोग करके ऐसा करने का चुनाव करता है।"; 12 | "NSPhotoLibraryAddUsageDescription" = "फ़ोईफॉक्स आपके ' स्क्रीन शॉट्स ' को आपकी फोटो लाइब्रेरी में जमा कर सकता है यदि आप ' स्क्रीन शॉट शेयर करें ' का चयन करते हैं।"; 13 | "NSMotionUsageDescription" = "फोईफ़ॉक्स आपके फ़ोन के सेंसरों को पढ़ लेता है ताकि आपके भौतिकी प्रयोगों में उनका उपयोग कर सके।"; 14 | "NSCameraUsageDescription" = "फ़ाइफ़ॉक्स क्यूआर कोड को स्कैन करने के लिए कैमरे का उपयोग करता है, जिसका उपयोग कस्टम प्रयोग कॉन्फ़िगरेशन जोड़ने के लिए किया जा सकता है। इसका उपयोग दूरी माप प्रदान करने और रुचि के क्षेत्र का पूर्वावलोकन दिखाने के लिए गहराई सेंसर प्रयोगों (LiDAR/ToF) में भी किया जाता है।"; 15 | "NSBluetoothPeripheralUsageDescription" = "फ़ाइफ़ॉक्स में बाहरी ब्लूटूथ सेंसर से पढ़ने और बाहरी ब्लूटूथ डिवाइस पर डेटा लिखने की क्षमता है। आप इस सुविधा और समर्थित डिवाइस के बारे में http://phyphox.org/ble पर अधिक जान सकते हैं।"; 16 | "NSBluetoothAlwaysUsageDescription" = "फ़ाइफ़ॉक्स में बाहरी ब्लूटूथ सेंसर से पढ़ने और बाहरी ब्लूटूथ डिवाइस पर डेटा लिखने की क्षमता है। आप इस सुविधा और समर्थित डिवाइस के बारे में http://phyphox.org/ble पर अधिक जान सकते हैं।"; 17 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/hu.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/id.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/it.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSMicrophoneUsageDescription" = "phyphox registra l’audio dal microfono come se fosse un sensore e lo analizza secondo l’esperimento selezionato. I dati vengono esportati solo se l’utente seleziona la funzione \"Esporta\"."; 2 | "NSLocationWhenInUseUsageDescription" = "phyphox registra i dati relativi alla posizione dal GPS e li analizza secondo l'esperimento selezionato. I dati verranno esportati dalla app solo se l'utente seleziona la funzione \"Esporta\"."; 3 | "NSPhotoLibraryAddUsageDescription" = "phyphox può aggiungere screenshots alla tua galleria fotografica selezionando \"Condividi screenshot\" nel menu dell'esperimento."; 4 | "NSMotionUsageDescription" = "phyphox legge i sensori del tuo telefono per utilizzarli in esperimenti di fisica."; 5 | "NSCameraUsageDescription" = "Phyphox usa la fotocamera per leggere codici QR, che possono essere usati per aggiungere all'esperimento configurazioni personalizzate, e negli esperimenti con i sensori di profondità (LiDAR/ToF) per fornire misurazioni di distanza e visualizzare l'area misurata."; 6 | "NSBluetoothPeripheralUsageDescription" = "Phyphox può leggere da sensori Bluetooth esterni e scrivere dati su periferiche Bluetooth esterne. Puoi sapere di più riguardo questa funzione e le periferiche supportate in http://phyphox.org/ble."; 7 | "NSBluetoothAlwaysUsageDescription" = "Phyphox può leggere da sensori Bluetooth esterni e scrivere dati su periferiche Bluetooth esterne. Puoi sapere di più riguardo questa funzione e le periferiche supportate in http://phyphox.org/ble."; 8 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/ja.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphoxは他のセンサーのようなものやマイクロフォンから音声を記録し,選択された実験に応じて解析を行います.使用者がエクスポート機能を用いてデータをエクスポートする場合はアプリからデータがエクスポートされます。"; 9 | "NSLocationWhenInUseUsageDescription" = "phyphoxはその他のセンサーやGPSからの位置データを記録し,選択された実験によって解析します.エクスポート機能を用いて使用者はアプリからデータをエクスポートすることができます。"; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphoxでは実験から \"スクリーンショットを共有する\" を選択するとあなたのフォトライブラリーにスクリーンショットを追加することができます。"; 11 | "NSMotionUsageDescription" = "phyphoxは物理実験でスマートフォンのセンサー使用することを許可し,読み取ります。"; 12 | "NSCameraUsageDescription" = "phyphoxは、カメラを使ってQRコードを読み取り、カスタム実験の設定を追加することができます。また、深度センサー実験(LiDAR/ToF)において、距離測定や関心領域のプレビュー表示にも使用されます。"; 13 | "NSBluetoothPeripheralUsageDescription" = "phyphoxは、外部Bluetoothセンサーからの読み込みと、外部Bluetoothデバイスへのデータ書き込み機能を備えています。この機能と対応デバイスの詳細は、http://phyphox.org/ble。"; 14 | "NSBluetoothAlwaysUsageDescription" = "phyphoxは、外部Bluetoothセンサーからの読み込みと、外部Bluetoothデバイスへのデータ書き込み機能を備えています。この機能と対応デバイスの詳細は、http://phyphox.org/ble。"; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/ka.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | 2 | 3 | /* 4 | InfoPlist.strings 5 | phyphox 6 | 7 | Created by Sebastian Kuhlen on 17.09.16. 8 | Copyright © 2016 RWTH Aachen. All rights reserved. 9 | */ 10 | "NSMicrophoneUsageDescription" = "ფაიფოქსი იწერს აუდიოს მიკროფონით როგორც სხვა სენსორებიდან და აანალიზებს მას არჩეული ექსპერიმენტების მიხედვით. მონაცემები მხოლოდ მაშინ იქნება გაცემული აპლიკაციიდან თუ მომხმარებელი აირჩევს ფუნქციის ექსპორტს."; 11 | "NSLocationWhenInUseUsageDescription" = "ფაიფოქსი იწერს ლოკაციას GPS-ის გამოყენებით, როგორც სხვა სენსორებიდან და აანალიზებს მათ ექსპერიმენტის მიხედვით. მონაცემები მხოლოდ მაშინ იქნება გადაცემული აპლიკაციიდან თუ მომხმარებელი არიჩევს ფუნქციის ექსპორტს."; 12 | "NSPhotoLibraryAddUsageDescription" = "ფაიფოქს შეუძლია დაა მატოს სქრინშოთი თქვენ ბიბლიოთეკაში თუ თქვენ აირჩევთ \"გააზიარე სქრინშოთი\" ექსპერიმენტის მენიუდან."; 13 | "NSMotionUsageDescription" = "ფაიფოქსი კითხულობს თქვენი ტელეფონის სენსორებს რათა შეძლოს მათი გამოყენება ფიზიკურ ექსპერიმენტებში."; 14 | "NSCameraUsageDescription" = "ფაიფოქსი იქნებას კამერას QR კოდის დასასკანირებლად, რომელიც შეიძლება გამოყენებული ქინას ექსპერიმენტების კონფიგურაციისთვის. ის ასევე გამოყებეულია სიღრმის სენსორის ექსპერიმენტებში (LiDAR/ToF) იმისათვის, რომ შეასრულოს მანძილის გაზომვები და გვანახოს გაზომვებისთვის საინტერესო არეა."; 15 | "NSBluetoothPeripheralUsageDescription" = "ფაიფოქს შეუძლია წაიკითხოს გარე ბულუზ სენსორები და მიწეროს მონაცემები გარე ბლუთუზ მოწყობილობებს. თქვენ შეგიძლიათ უფრო დეტაურად გაეცნოთ ამ ინფორმაციას აქ http://phyphox.org/ble."; 16 | "NSBluetoothAlwaysUsageDescription" = "ფაიფოქს შეუძლია წაიკითხოს გარე ბულუზ სენსორები და მიწეროს მონაცემები გარე ბლუთუზ მოწყობილობებს. თქვენ შეგიძლიათ უფრო დეტაურად გაეცნოთ ამ ინფორმაციას აქ http://phyphox.org/ble."; 17 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/ko.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | 2 | 3 | /* 4 | InfoPlist.strings 5 | phyphox 6 | 7 | Created by Sebastian Kuhlen on 17.09.16. 8 | Copyright © 2016 RWTH Aachen. All rights reserved. 9 | */ 10 | "NSMicrophoneUsageDescription" = "phyphox는 다른 센서와 마찬가지로 마이크의 오디오를 녹음하고 선택한 실험에 따라 분석합니다. 데이터는 사용자가 '내보내기' 기능을 사용하여 데이터를 내보내도록 선택한 경우에만 앱에서 데이터를 내보냅니다."; 11 | "NSLocationWhenInUseUsageDescription" = "phyphox는 다른 센서와 마찬가지로 GPS에서 위치 데이터를 기록하고 선택한 실험에 따라 분석합니다. 데이터는 사용자가 '내보내기' 기능을 사용하여 데이터를 내보내도록 선택한 경우에만 앱에서 데이터를 내보냅니다."; 12 | "NSPhotoLibraryAddUsageDescription" = "실험 메뉴에서 \"스크린샷 공유\"를 선택하면 사진 보관함에 스크린샷을 추가할 수 있습니다."; 13 | "NSMotionUsageDescription" = "phyphox는 스마트 폰의 센서들을 사용함으로써 물리 실험에서 데이터를 읽습니다."; 14 | "NSCameraUsageDescription" = "phyphox는 사용자 맞춤형 실험 구성을 추가하는 데 사용할 수 있는 QR 코드를 스캔하기 위해 카메라를 사용합니다. 또한 거리 측정 실험이나 측정 영역을 표시하기 위해 심도 센서(LiDAR/ToF)가 사용됩니다."; 15 | "NSBluetoothPeripheralUsageDescription" = "phyphox는 외부의 블루투스 센서를 이용하여 데이터를 읽거나 쓸 수 있는 기능이 있습니다. http://phyphox.org/ble에서 해당 기능과 이를 지원되는 장치에 대해 자세히 알아볼 수 있습니다."; 16 | "NSBluetoothAlwaysUsageDescription" = "phyphox는 외부의 블루투스 센서를 이용하여 데이터를 읽거나 쓸 수 있는 기능이 있습니다. http://phyphox.org/ble에서 해당 기능과 이를 지원되는 장치에 대해 자세히 알아볼 수 있습니다."; 17 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/ko.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | 2 | 3 | "ok" = "확인"; 4 | "stop" = "중지"; 5 | "start" = "시작"; 6 | "settings" = "설정"; 7 | "unknown" = "알려지지 않음"; 8 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/localizationHelper.swift: -------------------------------------------------------------------------------- 1 | // 2 | // helper.swift 3 | // phyphox 4 | // 5 | // Created by Sebastian Staacks on 12.04.19. 6 | // Copyright © 2019 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public func localize(_ key: String) -> String { 12 | let fallback = "en" 13 | 14 | let fallbackBundle = Bundle.main.path(forResource: fallback, ofType: "lproj") 15 | let fallbackString = fallbackBundle != nil ? Bundle(path: fallbackBundle!)?.localizedString(forKey: key, value: key, table: nil) : nil 16 | 17 | return Bundle.main.localizedString(forKey: key, value: fallbackString, table: nil) 18 | 19 | } 20 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/nl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox registreert audiofragmenten via de microfoon, op gelijkaardige wijze als de andere sensoren, en analyseert het volgens het geselecteerde experiment. De data zal enkel van de app geëxporteerd worden als de gebruiker ervoor kiest om de export functie te gebruiken."; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox registreert de locatiegegevens van de GPS, op gelijkaardige wijze als de andere sensoren, en analyseert het volgens het geselecteerde experiment. De data zal enkel van de app geëxporteerd worden als de gebruiker ervoor kiest om de export functie te gebruiken."; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphox kan screenshots toevoegen aan je fotoalbum als je \"Schermafbeelding delen\" selecteert in het experimentenmenu."; 11 | "NSMotionUsageDescription" = "phyphox leest je smartphones sensoren zodat ze gebruikt kunnen worden bij fysica-experimenten."; 12 | "NSCameraUsageDescription" = "phyphox gebruikt de camera om QR-codes te scannen, die kunnen worden gebruikt om aangepaste experimentconfiguraties toe te voegen. De camera wordt ook gebruikt in dieptesensor-experimenten (LiDAR/ToF) om afstandsmetingen te verrichten en een voorbeeld van het betrokken gebied te tonen."; 13 | "NSBluetoothPeripheralUsageDescription" = "phyphox heeft de mogelijkheid om van externe Bluetooth sensoren te lezen en gegevens naar externe Bluetooth apparaten te schrijven. U kunt meer te weten komen over deze functie en ondersteunde apparaten op http://phyphox.org/ble."; 14 | "NSBluetoothAlwaysUsageDescription" = "phyphox heeft de mogelijkheid om van externe Bluetooth sensoren te lezen en gegevens naar externe Bluetooth apparaten te schrijven. U kunt meer te weten komen over deze functie en ondersteunde apparaten op http://phyphox.org/ble."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/phyphox-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import "PTButton.h" 6 | #import 7 | #import "UIColor+Expanded.h" 8 | #import 9 | #import "ShaderTypes.h" 10 | 11 | @import JGProgressHUD; 12 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/pl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox rejestruje dźwięk za pomocą mikrofonu urządzenia i analizuje dane zgodnie z charakterem eksperymentu. Dane zostaną wyeksportowane z aplikacji wyłącznie po wybraniu stosownej komendy."; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox rejestruje dane GPS dotyczące położenia i analizuje je zgodnie z charakterem eksperymentu. Dane zostanę wyeksportowane z aplikacji wyłącznie po wybraniu stosownej komendy."; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphox dodaje pliki zrzutów ekranu jeśli wybrana jest opcja \"Współdziel zrzuty ekranu\" znajdująca się w menu eksperymentu."; 11 | "NSMotionUsageDescription" = "phyphox odczytuje wartości rejestrowane przez czujniki urządzenia i wykorzystuje je w eksperymentach fizycznych."; 12 | "NSCameraUsageDescription" = "phyphox używa kamery do skanowania kodów QR, które mogą być wykorzystane do dodania niestandardowych konfiguracji eksperymentu. Jest on również używany w eksperymentach z czujnikami głębokości (LiDAR/ToF), aby zapewnić pomiary odległości i pokazać podgląd regionu zainteresowania."; 13 | "NSBluetoothPeripheralUsageDescription" = "phyphox posiada możliwość odczytu z zewnętrznych czujników Bluetooth oraz zapisu danych do zewnętrznych urządzeń Bluetooth. Więcej o tej funkcji i obsługiwanych urządzeniach można dowiedzieć się na stronie http://phyphox.org/ble."; 14 | "NSBluetoothAlwaysUsageDescription" = "phyphox posiada możliwość odczytu z zewnętrznych czujników Bluetooth oraz zapisu danych do zewnętrznych urządzeń Bluetooth. Więcej o tej funkcji i obsługiwanych urządzeniach można dowiedzieć się na stronie http://phyphox.org/ble."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/pt.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox grava o audio do microfone assim como dados de outros sensores e faz uma análise de acordo com o experimento selecionado. Os dados serão exportados do aplicativo somente se o usuário escolher isso usando a função exportar."; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox grava a sua localização usando o GPS tal qual os dados de outros sensores e faz uma análise de acordo com o experimento selecionado. Os dados serão exportados do aplicativo somente se o usuário escolher isso usando a função exportar."; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphox pode adicionar imagens de tela a sua galeria de fotos se você selecionar \"compartilhar captura de tela\" nas opções do experimento."; 11 | "NSMotionUsageDescription" = "phyphox lê os sensores do seu aparelho para poder utilizar os dados nos experimentos."; 12 | "NSCameraUsageDescription" = "phyphox utiliza a câmara para digitalizar códigos QR, que podem ser utilizados para adicionar configurações de experiências personalizadas. É também utilizada em experiências com sensores de profundidade (LiDAR/ToF) para fornecer medições de distância e para mostrar uma pré-visualização da região de interesse."; 13 | "NSBluetoothPeripheralUsageDescription" = "O phyphox tem a capacidade de ler a partir de sensores Bluetooth externos e escrever dados para dispositivos Bluetooth externos. Pode saber mais sobre esta funcionalidade e os dispositivos suportados em http://phyphox.org/ble."; 14 | "NSBluetoothAlwaysUsageDescription" = "O phyphox tem a capacidade de ler a partir de sensores Bluetooth externos e escrever dados para dispositivos Bluetooth externos. Pode saber mais sobre esta funcionalidade e os dispositivos suportados em http://phyphox.org/ble."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/ru.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox записывает звук с микрофона, как и с других датчиков, и анализирует его в соответствии с выбранным экспериментом. Данные будут экспортироваться из приложения только в том случае, если пользователь решит это сделать, используя функцию экспорта."; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox записывает данные о местоположении из GPS, как и с других датчиков, и анализирует его в соответствии с выбранным экспериментом. Данные будут экспортироваться из приложения только в том случае, если пользователь решит это сделать, используя функцию экспорта."; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphox может добавить скриншоты в вашу библиотеку фотографий, если вы выберите «Поделиться скриншотом» в меню эксперимента."; 11 | "NSMotionUsageDescription" = "phyphox считывает датчики вашего телефона, чтобы использовать их в физических экспериментах."; 12 | "NSBluetoothPeripheralUsageDescription" = "phyphox имеет возможность считывать данные с внешних датчиков Bluetooth и записывать их на внешние устройства Bluetooth. Подробнее об этой функции и поддерживаемых устройствах можно узнать на сайте http://phyphox.org/ble."; 13 | "NSBluetoothAlwaysUsageDescription" = "phyphox имеет возможность считывать данные с внешних датчиков Bluetooth и записывать их на внешние устройства Bluetooth. Подробнее об этой функции и поддерживаемых устройствах можно узнать на сайте http://phyphox.org/ble."; 14 | "NSCameraUsageDescription" = "phyphox использует камеру для сканирования QR-кодов, которые можно использовать для добавления пользовательских конфигураций эксперимента. Она также используется в экспериментах с датчиками глубины (LiDAR/ToF) для измерения расстояния и предварительного просмотра интересующей области."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/sl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/sr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox snima zvuk iz mikrofona kao kod drugih senzora i analizira ga prema odabranom eksperimentu. Podaci će biti izvezeni iz aplikacije samo ako korisnik to uradi koristeći funkciju izvoza."; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox snima podatke o lokaciji iz GPS-a kao iz drugih senzora i analizira ih prema odabranom eksperimentu. Podaci će biti izvezeni iz aplikacije samo ako korisnik to uradi koristeći funkciju izvoza."; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphox može dodati slike ekrana u vašu biblioteku fotografija ako odaberete \"podeli sliku ekrana\" iz izbornika eksperimenta."; 11 | "NSMotionUsageDescription" = "phyphox čita senzore vašeg telefona kako bi omogućila njihovo korišćenje u eksperimentima fizike."; 12 | "NSBluetoothPeripheralUsageDescription" = "phyphox ima mogućnost čitanja sa spoljnih Bluetooth senzora i pisanje podataka na spoljne Bluetooth uređaje. Možete saznati više o ovoj funkciji i podržanim uređajima na http://phiphok.org/ble."; 13 | "NSBluetoothAlwaysUsageDescription" = "phyphox ima mogućnost čitanja sa spoljnih Bluetooth senzora i pisanje podataka na spoljne Bluetooth uređaje. Možete saznati više o ovoj funkciji i podržanim uređajima na http://phiphok.org/ble."; 14 | "NSCameraUsageDescription" = "phyphox koristi kameru za skeniranje KR kodova, koji se mogu koristiti za dodavanje prilagođenih konfiguracija eksperimenta. Takođe se koristi u eksperimentima sa senzorom dubine (LiDAR/ToF) da obezbedi merenje udaljenosti i da prikaže pregled regiona od interesa."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/sr_Latn.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox snima zvuk iz mikrofona kao kod drugih senzora i analizira ga prema odabranom eksperimentu. Podaci će biti izvezeni iz aplikacije samo ako korisnik to uradi koristeći funkciju izvoza."; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox snima podatke o lokaciji iz GPS-a kao iz drugih senzora i analizira ih prema odabranom eksperimentu. Podaci će biti izvezeni iz aplikacije samo ako korisnik to uradi koristeći funkciju izvoza."; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphox može dodati slike ekrana u vašu biblioteku fotografija ako odaberete \"podeli sliku ekrana\" iz izbornika eksperimenta."; 11 | "NSMotionUsageDescription" = "phyphox čita senzore vašeg telefona kako bi omogućila njihovo korišćenje u eksperimentima fizike."; 12 | "NSBluetoothPeripheralUsageDescription" = "phyphox ima mogućnost čitanja sa spoljnih Bluetooth senzora i pisanje podataka na spoljne Bluetooth uređaje. Možete saznati više o ovoj funkciji i podržanim uređajima na http://phiphok.org/ble."; 13 | "NSCameraUsageDescription" = "phyphox koristi kameru za skeniranje KR kodova, koji se mogu koristiti za dodavanje prilagođenih konfiguracija eksperimenta. Takođe se koristi u eksperimentima sa senzorom dubine (LiDAR/ToF) da obezbedi merenje udaljenosti i da prikaže pregled regiona od interesa."; 14 | "NSBluetoothAlwaysUsageDescription" = "phyphox ima mogućnost čitanja sa spoljnih Bluetooth senzora i pisanje podataka na spoljne Bluetooth uređaje. Možete saznati više o ovoj funkciji i podržanim uređajima na http://phiphok.org/ble."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/sv.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox tar ljudet från mikrofonen, och även data från andra sensorer, som analyseras utgående från det valda experimentet. Data kan exporteras från appen genom Export-funktionen."; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox hämtar platsdata från GPS, och även data från andra sensorer, och analyserar dem utgående från det valda experimentet. Data kan exporteras från appen genom Export-funktionen."; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphox kan lägga till skärmbilder till ditt fotobibliotek om du väljer \"Dela skärmbild\" från experiment-menyn."; 11 | "NSMotionUsageDescription" = "phyphox läser telefonens sensorer för att tillåta användning av dem i fysikexperiment."; 12 | "NSCameraUsageDescription" = "phyphox använder kameran för att scanna QR-koder, som kan användas för att lägga till egna experimentkonfigurationer."; 13 | "NSBluetoothPeripheralUsageDescription" = "phyphox kan läsa från externa Bluetooth-sensorer och skriva data till externa Bluetooth-enheter. Läs mer om denna möjlighet och om enheter som stöds på http://phyphox.org/ble."; 14 | "NSBluetoothAlwaysUsageDescription" = "phyphox kan läsa från externa Bluetooth-sensorer och skriva data till externa Bluetooth-enheter. Läs mer om denna möjlighet och om enheter som stöds på http://phyphox.org/ble."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/ta.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/ta.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/tr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox, diğer sensörlerden olduğu gibi mikrofona ait sesi de kaydeder ve seçilen deneye göre analiz eder. Veriler yalnızca veri dışa aktarma işlevi seçilirse uygulamadan dışa aktarılacaktır."; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox, GPS'den diğer sensörlerden alınan konum verilerini kaydeder ve seçilen deneye göre analiz eder. Veriler yalnızca veri dışa aktarma işlevi seçilirse uygulamadan dışa aktarılacaktır."; 10 | "NSPhotoLibraryAddUsageDescription" = "Deneme menüsünden \"Ekran görüntüsü al\"ı seçerseniz, phyphox fotoğraf kitaplığınıza ekran görüntüleri ekleyebilir."; 11 | "NSMotionUsageDescription" = "phyphox, telefonunuzun sensörlerini fizik deneylerinde kullanmaya izin verecek şekilde okur."; 12 | "NSBluetoothPeripheralUsageDescription" = "Phyphox harici Bluetooth sensörlerinden veri okuma ve harici Bluetooth cihazlarına veri yazma özelliğine sahiptir. Bu özellik ve desteklenen cihazlar hakkında daha fazla bilgiyi http://phyphox.org/ble adresinde bulabilirsiniz."; 13 | "NSBluetoothAlwaysUsageDescription" = "Phyphox harici Bluetooth sensörlerinden veri okuma ve harici Bluetooth cihazlarına veri yazma özelliğine sahiptir. Bu özellik ve desteklenen cihazlar hakkında daha fazla bilgiyi http://phyphox.org/ble adresinde bulabilirsiniz."; 14 | "NSCameraUsageDescription" = "phyphox, özel deney konfigürasyonları eklemek için kullanılabilen QR kodlarını taramak için kamerayı kullanır. Ayrıca derinlik sensörü deneylerinde (LiDAR/ToF) mesafe ölçümleri sağlamak ve ilgilenilen bölgenin önizlemesini göstermek için kullanılır."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/uk.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox записує аудіо з мікрофону так як і з інших сенсорів і аналізує їх відповідно до вибраного експерименту. Дані будуть експортовані з додатку тільки якщо користувач свідомо вибере функцію експорту."; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox записує дані розташування з GPS так як і з інших сенсорів і аналізує їх відповідно до вибраного експерименту. Дані будуть експортовані з додатку тільки якщо користувач свідомо вибере функцію експорту."; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphox може додати знімки екрану до Вашої фототеки, якщо Ви виберете \"Поділитися знімком екрану\" з меню експерименту."; 11 | "NSMotionUsageDescription" = "phyphox зчитує дані сенсорів телефону для їх використання у фізичних експериментах."; 12 | "NSCameraUsageDescription" = "phyphox використовує камеру для сканування QR-кодів, які можуть бути використані для додавання користувацьких конфігурацій експерименту. Він також використовується в експериментах з датчиками глибини (LiDAR/ToF) для вимірювання відстані і показу попереднього перегляду області, що цікавить."; 13 | "NSBluetoothPeripheralUsageDescription" = "phyphox може зчитувати дані з зовнішніх Bluetooth сенсорів і записувати дані на зовнішні пристрої Bluetooth. Додаткову інформацію про цю можливість і пристрої, що підтримуються, Ви можете знайти за адресою http://phyphox.org/ble."; 14 | "NSBluetoothAlwaysUsageDescription" = "phyphox має можливість зчитувати дані з зовнішніх Bluetooth-датчиків та записувати дані на зовнішні Bluetooth-пристрої. Детальніше про цю функцію та підтримувані пристрої можна дізнатися на сайті http://phyphox.org/ble."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/vi.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox ghi âm từ micro giống như các cảm biến khác và phân tích dữ liệu cho thí nghiệm được chọn. Dữ liệu này sẽ chỉ được xuất ra từ phần mềm nếu người dùng chọn làm như vậy bằng cách dùng chức năng xuất dữ liệu."; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox ghi lại dữ liệu vị trí giống như các cảm biến khác và phân tích nó cho thí nghiệm được chọn. Dữ liệu này sẽ chỉ được xuất ra từ phần mềm nếu người dùng chọn làm như vậy bằng cách dùng chức năng xuất dữ liệu."; 10 | "NSPhotoLibraryAddUsageDescription" = "phyphox có thể lưu ảnh chụp màn hình vào thư viện ảnh nếu bạn chọn \"Chia sẻ ảnh chụp màn hình\" từ bảng chọn trong thí nghiệm."; 11 | "NSMotionUsageDescription" = "phyphox đọc các cảm biến của điện thoại để sử dụng chúng cho thí nghiệm vật lý."; 12 | "NSCameraUsageDescription" = "phyphox sử dụng máy ảnh để quét mã QR, mã này có thể được sử dụng để thêm cấu hình thử nghiệm tùy chỉnh. Nó cũng được sử dụng trong các thí nghiệm cảm biến độ sâu (LiDAR / ToF) để cung cấp các phép đo khoảng cách và hiển thị bản xem trước của vùng quan tâm."; 13 | "NSBluetoothPeripheralUsageDescription" = "phyphox có khả năng đọc từ các cảm biến Bluetooth bên ngoài và ghi dữ liệu vào các thiết bị Bluetooth bên ngoài. Bạn có thể tìm hiểu thêm về tính năng này và các thiết bị được hỗ trợ trên http://phyphox.org/ble."; 14 | "NSBluetoothAlwaysUsageDescription" = "phyphox có khả năng đọc từ các cảm biến Bluetooth bên ngoài và ghi dữ liệu vào các thiết bị Bluetooth bên ngoài. Bạn có thể tìm hiểu thêm về tính năng này và các thiết bị được hỗ trợ trên http://phyphox.org/ble."; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/zh_Hans.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSMotionUsageDescription" = "Phyphox会读取你手机的传感器,以便用于物理实验中。"; 2 | /* 3 | InfoPlist.strings 4 | phyphox 5 | 6 | Created by Sebastian Kuhlen on 17.09.16. 7 | Copyright © 2016 RWTH Aachen. All rights reserved. 8 | */ 9 | "NSMicrophoneUsageDescription" = "phyphox像其他传感器一样,从麦克风记录声音,并根据所选的实验进行分析。只有当用户选择使用导出功能时,数据才会从应用程序中导出。"; 10 | "NSLocationWhenInUseUsageDescription" = "phyphox像其他传感器一样,记录GPS的位置数据,并根据所选的实验进行分析。只有当用户选择使用导出功能时,数据才会从应用程序中导出。"; 11 | "NSPhotoLibraryAddUsageDescription" = "如果您在实验菜单中选择“分享截图”,phyphox可以将截图添加到您的照片库中。"; 12 | "NSCameraUsageDescription" = "phyphox使用相机扫描二维码,可用于添加自定义实验配置。它也被用于深度传感器实验(LiDAR/ToF),以提供距离测量并显示感兴趣区域的预览。"; 13 | "NSBluetoothPeripheralUsageDescription" = "phyphox具有从外部蓝牙传感器读取数据和向外部蓝牙设备写入数据的能力。你可以在http://phyphox.org/ble,了解更多关于这个功能和支持的设备。"; 14 | "NSBluetoothAlwaysUsageDescription" = "phyphox具有从外部蓝牙传感器读取数据和向外部蓝牙设备写入数据的能力。你可以在http://phyphox.org/ble,了解更多关于这个功能和支持的设备。"; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphox/zh_Hant.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | phyphox 4 | 5 | Created by Sebastian Kuhlen on 17.09.16. 6 | Copyright © 2016 RWTH Aachen. All rights reserved. 7 | */ 8 | "NSMicrophoneUsageDescription" = "phyphox如同其它感應器一樣,會從麥克風記錄聲音,並根據所選的實驗進行分析。若使用者選擇使用匯出功能,數據將會從app被匯出。"; 9 | "NSLocationWhenInUseUsageDescription" = "phyphox如同其它感應器一樣,會從GPS記錄位置資訊,並根據所選的實驗進行分析。若使用者選擇使用匯出功能,數據將會從app被匯出。"; 10 | "NSPhotoLibraryAddUsageDescription" = "若你從選單挑選\"分享螢幕截圖\",phyphox會將圖片加到你的圖庫。"; 11 | "NSMotionUsageDescription" = "phyphox會讀取你手機裡的感應器,以便用在物理實驗中。"; 12 | "NSCameraUsageDescription" = "phyphox 使用攝像頭掃描二維碼,可用於添加自定義實驗配置。 它還用於深度傳感器實驗 (LiDAR/ToF),以提供距離測量並顯示感興趣區域的預覽。"; 13 | "NSBluetoothPeripheralUsageDescription" = "phyphox 能夠從外部藍牙傳感器讀取數據並將數據寫入外部藍牙設備。 您可以在 http://phyphox.org/ble 上了解有關此功能和支持的設備的更多信息。"; 14 | "NSBluetoothAlwaysUsageDescription" = "phyphox 能夠從外部藍牙傳感器讀取數據並將數據寫入外部藍牙設備。 您可以在 http://phyphox.org/ble 上了解有關此功能和支持的設備的更多信息。"; 15 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphoxTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /phyphox-iOS/phyphoxTests/phyphoxTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // phyphoxTests.swift 3 | // phyphoxTests 4 | // 5 | // Created by Gaurav Tripathee on 27.02.23. 6 | // Copyright © 2023 RWTH Aachen. All rights reserved. 7 | // 8 | 9 | @testable import phyphox 10 | import XCTest 11 | 12 | final class phyphoxTests: XCTestCase { 13 | 14 | var colorHelper: ColorConverterHelper! 15 | 16 | override class func setUp() { 17 | colorHelper = ColorConverterHelper() 18 | } 19 | 20 | override class func tearDown() { 21 | colorHelper = nil 22 | } 23 | 24 | func testAjustColor(){ 25 | 26 | // Given - Arrange 27 | var expected: UIColor 28 | var input: UIColor = UIColor(red: (57.0/255.0), green: (162.0/255.0), blue: (255.0/255.0), alpha: 1.0) // For blue 29 | 30 | 31 | // When - Act 32 | expected = colorHelper.adjustColorForLightTheme(colorName: input) 33 | 34 | // Then - Assert 35 | XCTAssert(expected == UIColor(red: 0.705882, green: 0.776471, blue: 0.0, alpha: 1.0)) // adjust for blue 36 | 37 | 38 | } 39 | 40 | } 41 | --------------------------------------------------------------------------------