summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKujtim Shala <kshala@ford.com>2018-07-27 16:13:53 +0200
committerKujtim Shala <kshala@ford.com>2018-07-27 16:13:53 +0200
commit7ac5f8c3760f0f7a38afcd2171c29e67cb8749cf (patch)
tree848cce70286caea3e42b7dde5aeecb8bac357423
parent1600eb65724155013ecb098c84d8d6aac1f13817 (diff)
parent3e9449bb8bb928f77f20257db55a4c02bac168a1 (diff)
downloadsdl_ios-7ac5f8c3760f0f7a38afcd2171c29e67cb8749cf.tar.gz
Merge commit '3e9449bb8bb928f77f20257db55a4c02bac168a1' into feature/issue_892_audio_streaming_indicator
# Conflicts: # SmartDeviceLink-iOS.xcodeproj/project.pbxproj
-rw-r--r--.github/PULL_REQUEST_TEMPLATE.md2
-rw-r--r--CHANGELOG.md6
-rw-r--r--SmartDeviceLink-iOS.podspec18
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/project.pbxproj242
-rw-r--r--SmartDeviceLink.podspec18
-rw-r--r--SmartDeviceLink/SDLAddSubMenu.h15
-rw-r--r--SmartDeviceLink/SDLAddSubMenu.m21
-rwxr-xr-xSmartDeviceLink/SDLCarWindow.h4
-rwxr-xr-xSmartDeviceLink/SDLCarWindow.m6
-rw-r--r--SmartDeviceLink/SDLElectronicParkBrakeStatus.h35
-rw-r--r--SmartDeviceLink/SDLElectronicParkBrakeStatus.m18
-rw-r--r--SmartDeviceLink/SDLFunctionID.m1
-rw-r--r--SmartDeviceLink/SDLGetVehicleData.h16
-rw-r--r--SmartDeviceLink/SDLGetVehicleData.m22
-rw-r--r--SmartDeviceLink/SDLGetVehicleDataResponse.h13
-rw-r--r--SmartDeviceLink/SDLGetVehicleDataResponse.m16
-rw-r--r--SmartDeviceLink/SDLImage.h9
-rw-r--r--SmartDeviceLink/SDLImage.m4
-rw-r--r--SmartDeviceLink/SDLLifecycleManager.m13
-rw-r--r--SmartDeviceLink/SDLLogFileModuleMap.m2
-rw-r--r--SmartDeviceLink/SDLMassageCushion.h35
-rw-r--r--SmartDeviceLink/SDLMassageCushion.m10
-rw-r--r--SmartDeviceLink/SDLMassageCushionFirmness.h40
-rw-r--r--SmartDeviceLink/SDLMassageCushionFirmness.m42
-rw-r--r--SmartDeviceLink/SDLMassageMode.h25
-rw-r--r--SmartDeviceLink/SDLMassageMode.m9
-rw-r--r--SmartDeviceLink/SDLMassageModeData.h39
-rw-r--r--SmartDeviceLink/SDLMassageModeData.m41
-rw-r--r--SmartDeviceLink/SDLMassageZone.h20
-rw-r--r--SmartDeviceLink/SDLMassageZone.m7
-rw-r--r--SmartDeviceLink/SDLMenuCell.h29
-rw-r--r--SmartDeviceLink/SDLMenuCell.m5
-rw-r--r--SmartDeviceLink/SDLMenuManager.m12
-rw-r--r--SmartDeviceLink/SDLModuleData.h29
-rw-r--r--SmartDeviceLink/SDLModuleData.m22
-rw-r--r--SmartDeviceLink/SDLModuleType.h5
-rw-r--r--SmartDeviceLink/SDLModuleType.m1
-rw-r--r--SmartDeviceLink/SDLNames.h47
-rw-r--r--SmartDeviceLink/SDLNames.m47
-rw-r--r--SmartDeviceLink/SDLNotificationConstants.h1
-rw-r--r--SmartDeviceLink/SDLNotificationConstants.m1
-rw-r--r--SmartDeviceLink/SDLNotificationDispatcher.m4
-rw-r--r--SmartDeviceLink/SDLOnHMIStatus.h6
-rw-r--r--SmartDeviceLink/SDLOnHMIStatus.m8
-rw-r--r--SmartDeviceLink/SDLOnRCStatus.h49
-rw-r--r--SmartDeviceLink/SDLOnRCStatus.m46
-rw-r--r--SmartDeviceLink/SDLOnVehicleData.h11
-rw-r--r--SmartDeviceLink/SDLOnVehicleData.m16
-rw-r--r--SmartDeviceLink/SDLProxy.m2
-rw-r--r--SmartDeviceLink/SDLProxyListener.h8
-rw-r--r--SmartDeviceLink/SDLRadioControlCapabilities.h54
-rw-r--r--SmartDeviceLink/SDLRadioControlCapabilities.m25
-rw-r--r--SmartDeviceLink/SDLRadioControlData.h11
-rw-r--r--SmartDeviceLink/SDLRadioControlData.m8
-rw-r--r--SmartDeviceLink/SDLRemoteControlCapabilities.h21
-rw-r--r--SmartDeviceLink/SDLRemoteControlCapabilities.m20
-rw-r--r--SmartDeviceLink/SDLSeatControlCapabilities.h134
-rw-r--r--SmartDeviceLink/SDLSeatControlCapabilities.m203
-rw-r--r--SmartDeviceLink/SDLSeatControlData.h166
-rw-r--r--SmartDeviceLink/SDLSeatControlData.m187
-rw-r--r--SmartDeviceLink/SDLSeatMemoryAction.h61
-rw-r--r--SmartDeviceLink/SDLSeatMemoryAction.m60
-rw-r--r--SmartDeviceLink/SDLSeatMemoryActionType.h27
-rw-r--r--SmartDeviceLink/SDLSeatMemoryActionType.m8
-rw-r--r--SmartDeviceLink/SDLSingleTireStatus.h15
-rw-r--r--SmartDeviceLink/SDLSingleTireStatus.m21
-rw-r--r--SmartDeviceLink/SDLSoftButtonManager.m162
-rw-r--r--SmartDeviceLink/SDLSoftButtonObject.m8
-rw-r--r--SmartDeviceLink/SDLSpeechCapabilities.h5
-rw-r--r--SmartDeviceLink/SDLSpeechCapabilities.m1
-rw-r--r--SmartDeviceLink/SDLStaticIconName.h900
-rw-r--r--SmartDeviceLink/SDLStaticIconName.m188
-rw-r--r--SmartDeviceLink/SDLStreamingAudioLifecycleManager.h94
-rw-r--r--SmartDeviceLink/SDLStreamingAudioLifecycleManager.m348
-rw-r--r--SmartDeviceLink/SDLStreamingMediaManager.m56
-rw-r--r--SmartDeviceLink/SDLStreamingMediaManagerConstants.h17
-rw-r--r--SmartDeviceLink/SDLStreamingMediaManagerConstants.m14
-rw-r--r--SmartDeviceLink/SDLStreamingVideoLifecycleManager.h (renamed from SmartDeviceLink/SDLStreamingMediaLifecycleManager.h)71
-rw-r--r--SmartDeviceLink/SDLStreamingVideoLifecycleManager.m (renamed from SmartDeviceLink/SDLStreamingMediaLifecycleManager.m)304
-rw-r--r--SmartDeviceLink/SDLSubscribeVehicleData.h17
-rw-r--r--SmartDeviceLink/SDLSubscribeVehicleData.m21
-rw-r--r--SmartDeviceLink/SDLSubscribeVehicleDataResponse.h14
-rw-r--r--SmartDeviceLink/SDLSubscribeVehicleDataResponse.m16
-rw-r--r--SmartDeviceLink/SDLSupportedSeat.h20
-rw-r--r--SmartDeviceLink/SDLSupportedSeat.m7
-rw-r--r--SmartDeviceLink/SDLTPMS.h50
-rw-r--r--SmartDeviceLink/SDLTPMS.m18
-rw-r--r--SmartDeviceLink/SDLTTSChunk.h9
-rw-r--r--SmartDeviceLink/SDLTTSChunk.m10
-rw-r--r--SmartDeviceLink/SDLTextAndGraphicManager.m96
-rw-r--r--SmartDeviceLink/SDLTurnSignal.h34
-rw-r--r--SmartDeviceLink/SDLTurnSignal.m14
-rw-r--r--SmartDeviceLink/SDLUnsubscribeVehicleData.h16
-rw-r--r--SmartDeviceLink/SDLUnsubscribeVehicleData.m22
-rw-r--r--SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h66
-rw-r--r--SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.m15
-rw-r--r--SmartDeviceLink/SDLVehicleDataType.h10
-rw-r--r--SmartDeviceLink/SDLVehicleDataType.m3
-rw-r--r--SmartDeviceLink/SDLVideoStreamingState.h24
-rw-r--r--SmartDeviceLink/SDLVideoStreamingState.m12
-rw-r--r--SmartDeviceLink/SmartDeviceLink.h16
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m9
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m34
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLNotificationDispatcherSpec.m1
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m34
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m401
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLStreamingVideoLifecycleManagerSpec.m (renamed from SmartDeviceLinkTests/SDLStreamingMediaLifecycleManagerSpec.m)371
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m4
-rw-r--r--SmartDeviceLinkTests/ProtocolSpecs/SDLFunctionIDSpec.m5
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLElectronicParkBrakeStatusSpec.m18
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLMassageCushionSpec.m25
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLMassageModeSpec.m23
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLMassageZoneSpec.m22
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLModuleTypeSpec.m23
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSpeechCapabilitiesSpec.m1
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLStaticIconNameSpec.m200
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSupportedSeatSpec.m22
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLTurnSignalSpec.m27
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m2
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVideoStreamingStateSpec.m15
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnHMIStatusSpec.m11
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnRCStatusSpec.m54
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m68
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m59
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m16
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m72
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m74
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m10
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m10
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m13
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageSpec.m10
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageCushionFirmnessSpec.m52
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageModeDataSpec.m53
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLModuleDataSpec.m24
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlCapabilitiesSpec.m34
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlDataSpec.m8
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRemoteControlCapabilitiesSpec.m29
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlCapabilitiesSpec.m162
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlDataSpec.m171
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatMemoryActionSpec.m60
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSingleTireStatusSpec.m14
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTTSChunkSpec.m114
-rw-r--r--SmartDeviceLink_Example/AppConstants.h2
-rw-r--r--SmartDeviceLink_Example/AppConstants.m2
-rw-r--r--SmartDeviceLink_Example/ConnectionIAPTableViewController.storyboard4
-rw-r--r--SmartDeviceLink_Example/ConnectionTCPTableViewController.storyboard4
-rw-r--r--SmartDeviceLink_Example/Main.storyboard4
-rw-r--r--SmartDeviceLink_Example/MenuManager.m6
-rw-r--r--SmartDeviceLink_Example/MenuManager.swift15
-rw-r--r--SmartDeviceLink_Example/TextValidator.h19
-rw-r--r--SmartDeviceLink_Example/TextValidator.m43
-rw-r--r--SmartDeviceLink_Example/TextValidator.swift36
-rw-r--r--SmartDeviceLink_Example/VehicleDataManager.m53
-rw-r--r--SmartDeviceLink_Example/VehicleDataManager.swift104
154 files changed, 6448 insertions, 996 deletions
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index dcf9581e4..995262c63 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,5 +1,7 @@
[Things to note: Pull Requests **must** fix an issue. Discussion about the feature / bug takes place in the issue, discussion of the implementation takes place in the PR. Please also see the [Contributing Guide](https://github.com/smartdevicelink/sdl_ios/blob/master/.github/CONTRIBUTING.md) for information on branch naming and the CLA.
+Also, remember that all new public file headers should be added as public in the `File Inspector / Target Membership` pane, added to `SmartDeviceLink.h` and to *both* `.podspec` files.
+
Delete the above section when you've read it.]
Fixes #[issue number]
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0160c9cba..f4d0bc5fa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+# 6.0.1
+
+### Bug Fixes
+* Fixed a crash that could occur in development circumstances if the head unit returns "-1" for an enum
+* Fixed manually sent Show RPCs causing issues when changing layouts.
+
# 6.0.0 (Changes since RC1)
* None
diff --git a/SmartDeviceLink-iOS.podspec b/SmartDeviceLink-iOS.podspec
index df135850b..fb0ee2943 100644
--- a/SmartDeviceLink-iOS.podspec
+++ b/SmartDeviceLink-iOS.podspec
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|
s.name = "SmartDeviceLink-iOS"
-s.version = "6.0.0"
+s.version = "6.0.1"
s.summary = "Connect your app with cars!"
s.homepage = "https://github.com/smartdevicelink/SmartDeviceLink-iOS"
s.license = { :type => "New BSD", :file => "LICENSE" }
@@ -91,6 +91,7 @@ ss.public_header_files = [
'SmartDeviceLink/SDLDriverDistractionState.h',
'SmartDeviceLink/SDLECallConfirmationStatus.h',
'SmartDeviceLink/SDLECallInfo.h',
+'SmartDeviceLink/SDLElectronicParkBrakeStatus.h',
'SmartDeviceLink/SDLEmergencyEvent.h',
'SmartDeviceLink/SDLEmergencyEventType.h',
'SmartDeviceLink/SDLEncodedSyncPData.h',
@@ -159,6 +160,11 @@ ss.public_header_files = [
'SmartDeviceLink/SDLLogTargetAppleSystemLog.h',
'SmartDeviceLink/SDLLogTargetFile.h',
'SmartDeviceLink/SDLLogTargetOSLog.h',
+'SmartDeviceLink/SDLMassageCushionFirmness.h',
+'SmartDeviceLink/SDLMassageModeData.h',
+'SmartDeviceLink/SDLMassageCushion.h',
+'SmartDeviceLink/SDLMassageMode.h',
+'SmartDeviceLink/SDLMassageZone.h',
'SmartDeviceLink/SDLMacros.h',
'SmartDeviceLink/SDLMaintenanceModeStatus.h',
'SmartDeviceLink/SDLManager.h',
@@ -188,6 +194,7 @@ ss.public_header_files = [
'SmartDeviceLink/SDLOnLanguageChange.h',
'SmartDeviceLink/SDLOnLockScreenStatus.h',
'SmartDeviceLink/SDLOnPermissionsChange.h',
+'SmartDeviceLink/SDLOnRCStatus.h',
'SmartDeviceLink/SDLOnSyncPData.h',
'SmartDeviceLink/SDLOnSystemRequest.h',
'SmartDeviceLink/SDLOnTBTClientState.h',
@@ -244,6 +251,11 @@ ss.public_header_files = [
'SmartDeviceLink/SDLScreenManager.h',
'SmartDeviceLink/SDLScrollableMessage.h',
'SmartDeviceLink/SDLScrollableMessageResponse.h',
+'SmartDeviceLink/SDLSeatControlCapabilities.h',
+'SmartDeviceLink/SDLSeatControlData.h',
+'SmartDeviceLink/SDLSeatMemoryAction.h',
+'SmartDeviceLink/SDLSeatMemoryActionType.h',
+'SmartDeviceLink/SDLSupportedSeat.h',
'SmartDeviceLink/SDLSecurityType.h',
'SmartDeviceLink/SDLSendHapticData.h',
'SmartDeviceLink/SDLSendHapticDataResponse.h',
@@ -275,6 +287,7 @@ ss.public_header_files = [
'SmartDeviceLink/SDLSpeakResponse.h',
'SmartDeviceLink/SDLSpeechCapabilities.h',
'SmartDeviceLink/SDLStartTime.h',
+'SmartDeviceLink/SDLStaticIconName.h',
'SmartDeviceLink/SDLStreamingMediaConfiguration.h',
'SmartDeviceLink/SDLStreamingMediaManager.h',
'SmartDeviceLink/SDLStreamingMediaManagerConstants.h',
@@ -309,9 +322,11 @@ ss.public_header_files = [
'SmartDeviceLink/SDLTouchManager.h',
'SmartDeviceLink/SDLTouchManagerDelegate.h',
'SmartDeviceLink/SDLTouchType.h',
+'SmartDeviceLink/SDLTPMS.h',
'SmartDeviceLink/SDLTriggerSource.h',
'SmartDeviceLink/SDLTTSChunk.h',
'SmartDeviceLink/SDLTurn.h',
+'SmartDeviceLink/SDLTurnSignal.h',
'SmartDeviceLink/SDLUnregisterAppInterface.h',
'SmartDeviceLink/SDLUnregisterAppInterfaceResponse.h',
'SmartDeviceLink/SDLUnsubscribeButton.h',
@@ -336,6 +351,7 @@ ss.public_header_files = [
'SmartDeviceLink/SDLVideoStreamingCodec.h',
'SmartDeviceLink/SDLVideoStreamingFormat.h',
'SmartDeviceLink/SDLVideoStreamingProtocol.h',
+'SmartDeviceLink/SDLVideoStreamingState.h',
'SmartDeviceLink/SDLVoiceCommand.h',
'SmartDeviceLink/SDLVrCapabilities.h',
'SmartDeviceLink/SDLVrHelpItem.h',
diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
index f97123616..a61b71d9b 100644
--- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
+++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
@@ -270,6 +270,39 @@
1E5AD0941F20BEAD0029B8AF /* SDLSetInteriorVehicleDataResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5AD0921F20BEAD0029B8AF /* SDLSetInteriorVehicleDataResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
1E5AD0951F20BEAD0029B8AF /* SDLSetInteriorVehicleDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E5AD0931F20BEAD0029B8AF /* SDLSetInteriorVehicleDataResponse.m */; };
1E5AD0981F20C0FB0029B8AF /* SDLOnInteriorVehicleData.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5AD0961F20C0FB0029B8AF /* SDLOnInteriorVehicleData.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1E89B0DE2031636000A47992 /* SDLSeatControlDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E89B0DD2031636000A47992 /* SDLSeatControlDataSpec.m */; };
+ 1E89B0E2203196B800A47992 /* SDLSeatControlCapabilitiesSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E89B0E1203196B800A47992 /* SDLSeatControlCapabilitiesSpec.m */; };
+ 1EB59C9F202D925500343A61 /* SDLMassageZone.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB59C9D202D925500343A61 /* SDLMassageZone.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1EB59CA0202D925500343A61 /* SDLMassageZone.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59C9E202D925500343A61 /* SDLMassageZone.m */; };
+ 1EB59CA3202D92F600343A61 /* SDLMassageMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB59CA1202D92F600343A61 /* SDLMassageMode.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1EB59CA4202D92F600343A61 /* SDLMassageMode.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CA2202D92F600343A61 /* SDLMassageMode.m */; };
+ 1EB59CA7202D946500343A61 /* SDLMassageModeData.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB59CA5202D946500343A61 /* SDLMassageModeData.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1EB59CA8202D946500343A61 /* SDLMassageModeData.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CA6202D946500343A61 /* SDLMassageModeData.m */; };
+ 1EB59CAB202D96A200343A61 /* SDLMassageCushion.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB59CA9202D96A200343A61 /* SDLMassageCushion.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1EB59CAC202D96A200343A61 /* SDLMassageCushion.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CAA202D96A200343A61 /* SDLMassageCushion.m */; };
+ 1EB59CAF202D97AC00343A61 /* SDLMassageCushionFirmness.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB59CAD202D97AC00343A61 /* SDLMassageCushionFirmness.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1EB59CB0202D97AC00343A61 /* SDLMassageCushionFirmness.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CAE202D97AC00343A61 /* SDLMassageCushionFirmness.m */; };
+ 1EB59CB3202D9B5F00343A61 /* SDLSeatMemoryActionType.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB59CB1202D9B5F00343A61 /* SDLSeatMemoryActionType.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1EB59CB4202D9B5F00343A61 /* SDLSeatMemoryActionType.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CB2202D9B5F00343A61 /* SDLSeatMemoryActionType.m */; };
+ 1EB59CB7202D9C8100343A61 /* SDLSeatMemoryAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB59CB5202D9C8100343A61 /* SDLSeatMemoryAction.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1EB59CB8202D9C8100343A61 /* SDLSeatMemoryAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CB6202D9C8100343A61 /* SDLSeatMemoryAction.m */; };
+ 1EB59CBB202DA1B400343A61 /* SDLSupportedSeat.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB59CB9202DA1B400343A61 /* SDLSupportedSeat.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1EB59CBC202DA1B400343A61 /* SDLSupportedSeat.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CBA202DA1B400343A61 /* SDLSupportedSeat.m */; };
+ 1EB59CBF202DA26000343A61 /* SDLSeatControlData.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB59CBD202DA26000343A61 /* SDLSeatControlData.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1EB59CC0202DA26000343A61 /* SDLSeatControlData.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CBE202DA26000343A61 /* SDLSeatControlData.m */; };
+ 1EB59CC3202DB40400343A61 /* SDLSeatControlCapabilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB59CC1202DB40400343A61 /* SDLSeatControlCapabilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1EB59CC4202DB40400343A61 /* SDLSeatControlCapabilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CC2202DB40400343A61 /* SDLSeatControlCapabilities.m */; };
+ 1EB59CC8202DC86A00343A61 /* SDLModuleTypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CC7202DC86A00343A61 /* SDLModuleTypeSpec.m */; };
+ 1EB59CCA202DC8E300343A61 /* SDLMassageZoneSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CC9202DC8E300343A61 /* SDLMassageZoneSpec.m */; };
+ 1EB59CCE202DC97900343A61 /* SDLMassageCushionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CCD202DC97900343A61 /* SDLMassageCushionSpec.m */; };
+ 1EB59CD0202DC9F200343A61 /* SDLSupportedSeatSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CCF202DC9F200343A61 /* SDLSupportedSeatSpec.m */; };
+ 1EB59CD2202DCA9B00343A61 /* SDLMassageModeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CD1202DCA9B00343A61 /* SDLMassageModeSpec.m */; };
+ 1EB59CD4202DCAE900343A61 /* SDLMassageModeDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CD3202DCAE900343A61 /* SDLMassageModeDataSpec.m */; };
+ 1EB59CD8202DCCD500343A61 /* SDLMassageCushionFirmnessSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CD7202DCCD500343A61 /* SDLMassageCushionFirmnessSpec.m */; };
+ 1EB59CDA202DCEEC00343A61 /* SDLSeatMemoryActionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB59CD9202DCEEC00343A61 /* SDLSeatMemoryActionSpec.m */; };
+ 1EAA470B2032BAE5000FE74B /* SDLOnRCStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EAA47092032BAE5000FE74B /* SDLOnRCStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1EAA470C2032BAE5000FE74B /* SDLOnRCStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EAA470A2032BAE5000FE74B /* SDLOnRCStatus.m */; };
+ 1EAA470E2032BF1D000FE74B /* SDLOnRCStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EAA470D2032BF1D000FE74B /* SDLOnRCStatusSpec.m */; };
1EE48E901F2F0EE700B98D08 /* SDLTemperatureUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EE48E8E1F2F0EE700B98D08 /* SDLTemperatureUnit.h */; settings = {ATTRIBUTES = (Public, ); }; };
1EE48E911F2F0EE700B98D08 /* SDLTemperatureUnit.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EE48E8F1F2F0EE700B98D08 /* SDLTemperatureUnit.m */; };
1EE8C4381F347C7300FDC2CF /* SDLRadioBandSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EE8C4371F347C7300FDC2CF /* SDLRadioBandSpec.m */; };
@@ -336,6 +369,12 @@
5D0A9F971F1559EC00CC80DD /* SDLSystemCapabilitySpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0A9F961F1559EC00CC80DD /* SDLSystemCapabilitySpec.m */; };
5D0A9F9A1F15636800CC80DD /* SDLGetSystemCapabilitiesSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0A9F991F15636800CC80DD /* SDLGetSystemCapabilitiesSpec.m */; };
5D0A9F9C1F1565EB00CC80DD /* SDLGetSystemCapabilityResponseSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0A9F9B1F1565EB00CC80DD /* SDLGetSystemCapabilityResponseSpec.m */; };
+ 5D0C29FC20D93D8C008B56CD /* SDLVideoStreamingState.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D0C29FA20D93D8C008B56CD /* SDLVideoStreamingState.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D0C29FD20D93D8C008B56CD /* SDLVideoStreamingState.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0C29FB20D93D8C008B56CD /* SDLVideoStreamingState.m */; };
+ 5D0C2A0020D9479B008B56CD /* SDLStreamingVideoLifecycleManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D0C29FE20D9479B008B56CD /* SDLStreamingVideoLifecycleManager.h */; };
+ 5D0C2A0120D9479B008B56CD /* SDLStreamingVideoLifecycleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0C29FF20D9479B008B56CD /* SDLStreamingVideoLifecycleManager.m */; };
+ 5D0C2A0420D947AB008B56CD /* SDLStreamingAudioLifecycleManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D0C2A0220D947AB008B56CD /* SDLStreamingAudioLifecycleManager.h */; };
+ 5D0C2A0520D947AB008B56CD /* SDLStreamingAudioLifecycleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0C2A0320D947AB008B56CD /* SDLStreamingAudioLifecycleManager.m */; };
5D1654561D3E754F00554D93 /* SDLLifecycleManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1654551D3E754F00554D93 /* SDLLifecycleManagerSpec.m */; };
5D16545A1D3E7A1600554D93 /* SDLLifecycleManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D1654581D3E7A1600554D93 /* SDLLifecycleManager.h */; };
5D16545B1D3E7A1600554D93 /* SDLLifecycleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1654591D3E7A1600554D93 /* SDLLifecycleManager.m */; };
@@ -356,6 +395,8 @@
5D339CF0207C08BA000CC364 /* SDLVoiceCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D339CEE207C08BA000CC364 /* SDLVoiceCommand.m */; };
5D339CF3207C0ACE000CC364 /* SDLMenuManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D339CF1207C0ACE000CC364 /* SDLMenuManager.h */; };
5D339CF4207C0ACE000CC364 /* SDLMenuManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D339CF2207C0ACE000CC364 /* SDLMenuManager.m */; };
+ 5D3E420A20EAAD6500D8C622 /* SDLTPMS.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D3E420820EAAD6500D8C622 /* SDLTPMS.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D3E420B20EAAD6500D8C622 /* SDLTPMS.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D3E420920EAAD6500D8C622 /* SDLTPMS.m */; };
5D3E48751D6F3B330000BFEF /* SDLAsynchronousOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D3E48731D6F3B330000BFEF /* SDLAsynchronousOperation.h */; };
5D3E48761D6F3B330000BFEF /* SDLAsynchronousOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D3E48741D6F3B330000BFEF /* SDLAsynchronousOperation.m */; };
5D3E487B1D6F888E0000BFEF /* SDLRPCResponseNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D3E48791D6F888E0000BFEF /* SDLRPCResponseNotification.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -876,6 +917,9 @@
5D61FE121A84238C00846EE7 /* SDLWarningLightStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FC251A84238C00846EE7 /* SDLWarningLightStatus.m */; };
5D61FE131A84238C00846EE7 /* SDLWiperStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FC261A84238C00846EE7 /* SDLWiperStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D61FE141A84238C00846EE7 /* SDLWiperStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FC271A84238C00846EE7 /* SDLWiperStatus.m */; };
+ 5D64FE6D20DA9CE600792F9F /* SDLVideoStreamingStateSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D64FE6C20DA9CE600792F9F /* SDLVideoStreamingStateSpec.m */; };
+ 5D64FE6F20DA9E4300792F9F /* SDLStreamingVideoLifecycleManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D64FE6E20DA9E4300792F9F /* SDLStreamingVideoLifecycleManagerSpec.m */; };
+ 5D64FE7120DA9E6700792F9F /* SDLStreamingAudioLifecycleManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D64FE7020DA9E6700792F9F /* SDLStreamingAudioLifecycleManagerSpec.m */; };
5D6CC8EF1C610E660027F60A /* SDLSecurityType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D6CC8EE1C610E660027F60A /* SDLSecurityType.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D6EB4CC1BF28DC600693731 /* NSMapTable+SubscriptingSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D6EB4CB1BF28DC600693731 /* NSMapTable+SubscriptingSpec.m */; };
5D6F7A2E1BC5650B0070BF37 /* SDLLifecycleConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D6F7A2C1BC5650B0070BF37 /* SDLLifecycleConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -1071,6 +1115,9 @@
5DD67CC31E68AE82009CD394 /* SDLLogFileModuleMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DD67CC11E68AE82009CD394 /* SDLLogFileModuleMap.h */; };
5DD67CC41E68AE82009CD394 /* SDLLogFileModuleMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DD67CC21E68AE82009CD394 /* SDLLogFileModuleMap.m */; };
5DD67CC71E68B568009CD394 /* SDLLogMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DD67CC51E68B568009CD394 /* SDLLogMacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5DD8406220FCD6C10082CE04 /* SDLElectronicParkBrakeStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DD8406020FCD6C10082CE04 /* SDLElectronicParkBrakeStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5DD8406320FCD6C10082CE04 /* SDLElectronicParkBrakeStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DD8406120FCD6C10082CE04 /* SDLElectronicParkBrakeStatus.m */; };
+ 5DD8406520FCE21A0082CE04 /* SDLElectronicParkBrakeStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DD8406420FCE21A0082CE04 /* SDLElectronicParkBrakeStatusSpec.m */; };
5DE35E4520CAFC5D0034BE5A /* SDLChoiceCellSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DE35E4420CAFC5D0034BE5A /* SDLChoiceCellSpec.m */; };
5DE35E4720CB0AB90034BE5A /* SDLChoiceSetSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DE35E4620CB0AB90034BE5A /* SDLChoiceSetSpec.m */; };
5DE35E4A20CB1BF70034BE5A /* SDLChoiceSetManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DE35E4920CB1BF70034BE5A /* SDLChoiceSetManagerSpec.m */; };
@@ -1103,6 +1150,9 @@
8814AEAA20AB663800466E0F /* PerformInteractionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8814AEA920AB663800466E0F /* PerformInteractionManager.m */; };
8814AEAC20AB667B00466E0F /* PerformInteractionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8814AEAB20AB667B00466E0F /* PerformInteractionManager.swift */; };
88166B00207E41E900076236 /* MenuManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88166AFF207E41E900076236 /* MenuManager.swift */; };
+ 8818ADD82100FC18007D6F19 /* SDLTurnSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = 8818ADD62100FC18007D6F19 /* SDLTurnSignal.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 8818ADD92100FC18007D6F19 /* SDLTurnSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = 8818ADD72100FC18007D6F19 /* SDLTurnSignal.m */; };
+ 8818ADDD2100FE0C007D6F19 /* SDLTurnSignalSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8818ADDC2100FE0C007D6F19 /* SDLTurnSignalSpec.m */; };
8829568B207CF68800EF056C /* SmartDeviceLink.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D61FA1C1A84237100846EE7 /* SmartDeviceLink.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
88295690207CF68800EF056C /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5D4029D31A76F0340006B0C2 /* Images.xcassets */; };
88295693207CF68800EF056C /* SmartDeviceLink.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5D61FA1C1A84237100846EE7 /* SmartDeviceLink.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
@@ -1121,6 +1171,8 @@
88802FF420853BED00E9EBC6 /* SmartDeviceLinkSwift.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D4346631E6F38E600B639C6 /* SmartDeviceLinkSwift.h */; settings = {ATTRIBUTES = (Public, ); }; };
88802FF520853CD500E9EBC6 /* SmartDeviceLinkSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88802FEF20853AE600E9EBC6 /* SmartDeviceLinkSwift.framework */; };
88802FF620853CD500E9EBC6 /* SmartDeviceLinkSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 88802FEF20853AE600E9EBC6 /* SmartDeviceLinkSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8880B2EF21021E37004721DB /* TextValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8880B2ED21021964004721DB /* TextValidator.swift */; };
+ 8880B2F421022896004721DB /* TextValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 8880B2F121022887004721DB /* TextValidator.m */; };
888D178F207E7F42008E9F8F /* ButtonManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 888D178D207E7F0E008E9F8F /* ButtonManager.swift */; };
888D1790207E815C008E9F8F /* AppConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 8863B597207D2388002D6459 /* AppConstants.m */; };
88A0AA56207CFE5D0075132C /* AppUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88A0AA55207CFE5C0075132C /* AppUserDefaults.swift */; };
@@ -1132,6 +1184,9 @@
88A0AA66207CFF980075132C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 88A0AA62207CFF970075132C /* Main.storyboard */; };
88A0AA67207CFF980075132C /* ConnectionIAPTableViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 88A0AA63207CFF970075132C /* ConnectionIAPTableViewController.storyboard */; };
88A0AA68207CFF980075132C /* ConnectionTCPTableViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 88A0AA64207CFF980075132C /* ConnectionTCPTableViewController.storyboard */; };
+ 88A795D22106787400056542 /* SDLStaticIconName.h in Headers */ = {isa = PBXBuildFile; fileRef = 88A795D02106787400056542 /* SDLStaticIconName.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 88A795D32106787400056542 /* SDLStaticIconName.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A795D12106787400056542 /* SDLStaticIconName.m */; };
+ 88A795D5210678E000056542 /* SDLStaticIconNameSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A795D4210678E000056542 /* SDLStaticIconNameSpec.m */; };
88B3BF9820DA859800943565 /* SDLFuelType.h in Headers */ = {isa = PBXBuildFile; fileRef = 88B3BF9620DA859800943565 /* SDLFuelType.h */; settings = {ATTRIBUTES = (Public, ); }; };
88B3BF9920DA859800943565 /* SDLFuelType.m in Sources */ = {isa = PBXBuildFile; fileRef = 88B3BF9720DA859800943565 /* SDLFuelType.m */; };
88B3BF9C20DA8BBC00943565 /* SDLFuelRange.h in Headers */ = {isa = PBXBuildFile; fileRef = 88B3BF9A20DA8BBC00943565 /* SDLFuelRange.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -1184,9 +1239,6 @@
DA4F47961E771AA100FC809E /* SDLEnum.m in Sources */ = {isa = PBXBuildFile; fileRef = DA4F47951E771AA100FC809E /* SDLEnum.m */; };
DA6223BD1E7B088200878689 /* CVPixelBufferRef+SDLUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = DA6223BB1E7B088200878689 /* CVPixelBufferRef+SDLUtil.h */; };
DA6223BE1E7B088200878689 /* CVPixelBufferRef+SDLUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = DA6223BC1E7B088200878689 /* CVPixelBufferRef+SDLUtil.m */; };
- DA8966EB1E56939F00413EAB /* SDLStreamingMediaLifecycleManager.h in Headers */ = {isa = PBXBuildFile; fileRef = DA8966E91E56939F00413EAB /* SDLStreamingMediaLifecycleManager.h */; };
- DA8966EC1E56939F00413EAB /* SDLStreamingMediaLifecycleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8966EA1E56939F00413EAB /* SDLStreamingMediaLifecycleManager.m */; };
- DA8966EF1E5693E300413EAB /* SDLStreamingMediaLifecycleManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8966EE1E5693E300413EAB /* SDLStreamingMediaLifecycleManagerSpec.m */; };
DA8966F21E56973700413EAB /* SDLStreamingMediaManagerConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = DA8966F11E56973700413EAB /* SDLStreamingMediaManagerConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
DA96C0661D4D4F730022F520 /* SDLAppInfoSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DA96C0651D4D4F730022F520 /* SDLAppInfoSpec.m */; };
DA9F7E631DCBFAC800ACAE48 /* SDLDateTime.h in Headers */ = {isa = PBXBuildFile; fileRef = DA9F7E611DCBFAC800ACAE48 /* SDLDateTime.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -1612,6 +1664,39 @@
1E5AD0931F20BEAD0029B8AF /* SDLSetInteriorVehicleDataResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLSetInteriorVehicleDataResponse.m; sourceTree = "<group>"; };
1E5AD0961F20C0FB0029B8AF /* SDLOnInteriorVehicleData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLOnInteriorVehicleData.h; sourceTree = "<group>"; };
1E5AD0971F20C0FB0029B8AF /* SDLOnInteriorVehicleData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLOnInteriorVehicleData.m; sourceTree = "<group>"; };
+ 1E89B0DD2031636000A47992 /* SDLSeatControlDataSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSeatControlDataSpec.m; sourceTree = "<group>"; };
+ 1E89B0E1203196B800A47992 /* SDLSeatControlCapabilitiesSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSeatControlCapabilitiesSpec.m; sourceTree = "<group>"; };
+ 1EB59C9D202D925500343A61 /* SDLMassageZone.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLMassageZone.h; sourceTree = "<group>"; };
+ 1EB59C9E202D925500343A61 /* SDLMassageZone.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMassageZone.m; sourceTree = "<group>"; };
+ 1EB59CA1202D92F600343A61 /* SDLMassageMode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLMassageMode.h; sourceTree = "<group>"; };
+ 1EB59CA2202D92F600343A61 /* SDLMassageMode.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMassageMode.m; sourceTree = "<group>"; };
+ 1EB59CA5202D946500343A61 /* SDLMassageModeData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLMassageModeData.h; sourceTree = "<group>"; };
+ 1EB59CA6202D946500343A61 /* SDLMassageModeData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMassageModeData.m; sourceTree = "<group>"; };
+ 1EB59CA9202D96A200343A61 /* SDLMassageCushion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLMassageCushion.h; sourceTree = "<group>"; };
+ 1EB59CAA202D96A200343A61 /* SDLMassageCushion.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMassageCushion.m; sourceTree = "<group>"; };
+ 1EB59CAD202D97AC00343A61 /* SDLMassageCushionFirmness.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLMassageCushionFirmness.h; sourceTree = "<group>"; };
+ 1EB59CAE202D97AC00343A61 /* SDLMassageCushionFirmness.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMassageCushionFirmness.m; sourceTree = "<group>"; };
+ 1EB59CB1202D9B5F00343A61 /* SDLSeatMemoryActionType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLSeatMemoryActionType.h; sourceTree = "<group>"; };
+ 1EB59CB2202D9B5F00343A61 /* SDLSeatMemoryActionType.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSeatMemoryActionType.m; sourceTree = "<group>"; };
+ 1EB59CB5202D9C8100343A61 /* SDLSeatMemoryAction.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLSeatMemoryAction.h; sourceTree = "<group>"; };
+ 1EB59CB6202D9C8100343A61 /* SDLSeatMemoryAction.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSeatMemoryAction.m; sourceTree = "<group>"; };
+ 1EB59CB9202DA1B400343A61 /* SDLSupportedSeat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLSupportedSeat.h; sourceTree = "<group>"; };
+ 1EB59CBA202DA1B400343A61 /* SDLSupportedSeat.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSupportedSeat.m; sourceTree = "<group>"; };
+ 1EB59CBD202DA26000343A61 /* SDLSeatControlData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLSeatControlData.h; sourceTree = "<group>"; };
+ 1EB59CBE202DA26000343A61 /* SDLSeatControlData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSeatControlData.m; sourceTree = "<group>"; };
+ 1EB59CC1202DB40400343A61 /* SDLSeatControlCapabilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLSeatControlCapabilities.h; sourceTree = "<group>"; };
+ 1EB59CC2202DB40400343A61 /* SDLSeatControlCapabilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSeatControlCapabilities.m; sourceTree = "<group>"; };
+ 1EB59CC7202DC86A00343A61 /* SDLModuleTypeSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLModuleTypeSpec.m; sourceTree = "<group>"; };
+ 1EB59CC9202DC8E300343A61 /* SDLMassageZoneSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMassageZoneSpec.m; sourceTree = "<group>"; };
+ 1EB59CCD202DC97900343A61 /* SDLMassageCushionSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMassageCushionSpec.m; sourceTree = "<group>"; };
+ 1EB59CCF202DC9F200343A61 /* SDLSupportedSeatSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSupportedSeatSpec.m; sourceTree = "<group>"; };
+ 1EB59CD1202DCA9B00343A61 /* SDLMassageModeSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMassageModeSpec.m; sourceTree = "<group>"; };
+ 1EB59CD3202DCAE900343A61 /* SDLMassageModeDataSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMassageModeDataSpec.m; sourceTree = "<group>"; };
+ 1EB59CD7202DCCD500343A61 /* SDLMassageCushionFirmnessSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMassageCushionFirmnessSpec.m; sourceTree = "<group>"; };
+ 1EB59CD9202DCEEC00343A61 /* SDLSeatMemoryActionSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSeatMemoryActionSpec.m; sourceTree = "<group>"; };
+ 1EAA47092032BAE5000FE74B /* SDLOnRCStatus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLOnRCStatus.h; sourceTree = "<group>"; };
+ 1EAA470A2032BAE5000FE74B /* SDLOnRCStatus.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLOnRCStatus.m; sourceTree = "<group>"; };
+ 1EAA470D2032BF1D000FE74B /* SDLOnRCStatusSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLOnRCStatusSpec.m; sourceTree = "<group>"; };
1EE48E8E1F2F0EE700B98D08 /* SDLTemperatureUnit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLTemperatureUnit.h; sourceTree = "<group>"; };
1EE48E8F1F2F0EE700B98D08 /* SDLTemperatureUnit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLTemperatureUnit.m; sourceTree = "<group>"; };
1EE8C4371F347C7300FDC2CF /* SDLRadioBandSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLRadioBandSpec.m; sourceTree = "<group>"; };
@@ -1681,6 +1766,12 @@
5D0A9F961F1559EC00CC80DD /* SDLSystemCapabilitySpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLSystemCapabilitySpec.m; sourceTree = "<group>"; };
5D0A9F991F15636800CC80DD /* SDLGetSystemCapabilitiesSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLGetSystemCapabilitiesSpec.m; sourceTree = "<group>"; };
5D0A9F9B1F1565EB00CC80DD /* SDLGetSystemCapabilityResponseSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLGetSystemCapabilityResponseSpec.m; sourceTree = "<group>"; };
+ 5D0C29FA20D93D8C008B56CD /* SDLVideoStreamingState.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLVideoStreamingState.h; sourceTree = "<group>"; };
+ 5D0C29FB20D93D8C008B56CD /* SDLVideoStreamingState.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLVideoStreamingState.m; sourceTree = "<group>"; };
+ 5D0C29FE20D9479B008B56CD /* SDLStreamingVideoLifecycleManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLStreamingVideoLifecycleManager.h; sourceTree = "<group>"; };
+ 5D0C29FF20D9479B008B56CD /* SDLStreamingVideoLifecycleManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLStreamingVideoLifecycleManager.m; sourceTree = "<group>"; };
+ 5D0C2A0220D947AB008B56CD /* SDLStreamingAudioLifecycleManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLStreamingAudioLifecycleManager.h; sourceTree = "<group>"; };
+ 5D0C2A0320D947AB008B56CD /* SDLStreamingAudioLifecycleManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLStreamingAudioLifecycleManager.m; sourceTree = "<group>"; };
5D1654551D3E754F00554D93 /* SDLLifecycleManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLLifecycleManagerSpec.m; path = DevAPISpecs/SDLLifecycleManagerSpec.m; sourceTree = "<group>"; };
5D1654581D3E7A1600554D93 /* SDLLifecycleManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLifecycleManager.h; sourceTree = "<group>"; };
5D1654591D3E7A1600554D93 /* SDLLifecycleManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLifecycleManager.m; sourceTree = "<group>"; };
@@ -1709,6 +1800,8 @@
5D339CEE207C08BA000CC364 /* SDLVoiceCommand.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLVoiceCommand.m; sourceTree = "<group>"; };
5D339CF1207C0ACE000CC364 /* SDLMenuManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLMenuManager.h; sourceTree = "<group>"; };
5D339CF2207C0ACE000CC364 /* SDLMenuManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMenuManager.m; sourceTree = "<group>"; };
+ 5D3E420820EAAD6500D8C622 /* SDLTPMS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLTPMS.h; sourceTree = "<group>"; };
+ 5D3E420920EAAD6500D8C622 /* SDLTPMS.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLTPMS.m; sourceTree = "<group>"; };
5D3E48731D6F3B330000BFEF /* SDLAsynchronousOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLAsynchronousOperation.h; sourceTree = "<group>"; };
5D3E48741D6F3B330000BFEF /* SDLAsynchronousOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLAsynchronousOperation.m; sourceTree = "<group>"; };
5D3E48791D6F888E0000BFEF /* SDLRPCResponseNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLRPCResponseNotification.h; sourceTree = "<group>"; };
@@ -2251,6 +2344,9 @@
5D61FC251A84238C00846EE7 /* SDLWarningLightStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLWarningLightStatus.m; sourceTree = "<group>"; };
5D61FC261A84238C00846EE7 /* SDLWiperStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLWiperStatus.h; sourceTree = "<group>"; };
5D61FC271A84238C00846EE7 /* SDLWiperStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLWiperStatus.m; sourceTree = "<group>"; };
+ 5D64FE6C20DA9CE600792F9F /* SDLVideoStreamingStateSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLVideoStreamingStateSpec.m; sourceTree = "<group>"; };
+ 5D64FE6E20DA9E4300792F9F /* SDLStreamingVideoLifecycleManagerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLStreamingVideoLifecycleManagerSpec.m; path = DevAPISpecs/SDLStreamingVideoLifecycleManagerSpec.m; sourceTree = "<group>"; };
+ 5D64FE7020DA9E6700792F9F /* SDLStreamingAudioLifecycleManagerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLStreamingAudioLifecycleManagerSpec.m; path = DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m; sourceTree = "<group>"; };
5D6CC8EE1C610E660027F60A /* SDLSecurityType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLSecurityType.h; sourceTree = "<group>"; };
5D6EB4CB1BF28DC600693731 /* NSMapTable+SubscriptingSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSMapTable+SubscriptingSpec.m"; path = "DevAPISpecs/NSMapTable+SubscriptingSpec.m"; sourceTree = "<group>"; };
5D6F7A2C1BC5650B0070BF37 /* SDLLifecycleConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLifecycleConfiguration.h; sourceTree = "<group>"; };
@@ -2450,6 +2546,9 @@
5DD67CC11E68AE82009CD394 /* SDLLogFileModuleMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLogFileModuleMap.h; sourceTree = "<group>"; };
5DD67CC21E68AE82009CD394 /* SDLLogFileModuleMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLogFileModuleMap.m; sourceTree = "<group>"; };
5DD67CC51E68B568009CD394 /* SDLLogMacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLogMacros.h; sourceTree = "<group>"; };
+ 5DD8406020FCD6C10082CE04 /* SDLElectronicParkBrakeStatus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLElectronicParkBrakeStatus.h; sourceTree = "<group>"; };
+ 5DD8406120FCD6C10082CE04 /* SDLElectronicParkBrakeStatus.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLElectronicParkBrakeStatus.m; sourceTree = "<group>"; };
+ 5DD8406420FCE21A0082CE04 /* SDLElectronicParkBrakeStatusSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLElectronicParkBrakeStatusSpec.m; sourceTree = "<group>"; };
5DE35E4420CAFC5D0034BE5A /* SDLChoiceCellSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLChoiceCellSpec.m; path = DevAPISpecs/SDLChoiceCellSpec.m; sourceTree = "<group>"; };
5DE35E4620CB0AB90034BE5A /* SDLChoiceSetSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLChoiceSetSpec.m; path = DevAPISpecs/SDLChoiceSetSpec.m; sourceTree = "<group>"; };
5DE35E4920CB1BF70034BE5A /* SDLChoiceSetManagerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLChoiceSetManagerSpec.m; path = DevAPISpecs/SDLChoiceSetManagerSpec.m; sourceTree = "<group>"; };
@@ -2488,7 +2587,10 @@
8814AEA920AB663800466E0F /* PerformInteractionManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PerformInteractionManager.m; sourceTree = "<group>"; };
8814AEAB20AB667B00466E0F /* PerformInteractionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PerformInteractionManager.swift; sourceTree = "<group>"; };
88166AFF207E41E900076236 /* MenuManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuManager.swift; sourceTree = "<group>"; };
- 88295697207CF68800EF056C /* SDL Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SDL Example.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8818ADD62100FC18007D6F19 /* SDLTurnSignal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLTurnSignal.h; sourceTree = "<group>"; };
+ 8818ADD72100FC18007D6F19 /* SDLTurnSignal.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLTurnSignal.m; sourceTree = "<group>"; };
+ 8818ADDC2100FE0C007D6F19 /* SDLTurnSignalSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLTurnSignalSpec.m; sourceTree = "<group>"; };
+ 88295697207CF68800EF056C /* SDL Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = "SDL Example.app"; path = "SDL Example Swift.app"; sourceTree = BUILT_PRODUCTS_DIR; };
88295698207CF68800EF056C /* SmartDeviceLink-Example-Swift-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "SmartDeviceLink-Example-Swift-Info.plist"; path = "/Users/nicolelivioradio.com/sdl_ios/SmartDeviceLink-Example-Swift-Info.plist"; sourceTree = "<absolute>"; };
8829569C207CFD0D00EF056C /* SmartDeviceLink-Example-Swift-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SmartDeviceLink-Example-Swift-Bridging-Header.h"; sourceTree = "<group>"; };
8829569D207CFD0E00EF056C /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
@@ -2502,6 +2604,9 @@
8877F5ED1F34A72200DC128A /* SDLSendHapticDataResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLSendHapticDataResponse.m; sourceTree = "<group>"; };
8877F5F01F34AA2D00DC128A /* SDLSendHapticDataResponseSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLSendHapticDataResponseSpec.m; sourceTree = "<group>"; };
88802FEF20853AE600E9EBC6 /* SmartDeviceLinkSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SmartDeviceLinkSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8880B2ED21021964004721DB /* TextValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextValidator.swift; sourceTree = "<group>"; };
+ 8880B2F021022887004721DB /* TextValidator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TextValidator.h; sourceTree = "<group>"; };
+ 8880B2F121022887004721DB /* TextValidator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TextValidator.m; sourceTree = "<group>"; };
888D178D207E7F0E008E9F8F /* ButtonManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonManager.swift; sourceTree = "<group>"; };
88A0AA55207CFE5C0075132C /* AppUserDefaults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppUserDefaults.swift; sourceTree = "<group>"; };
88A0AA57207CFE650075132C /* ProxyManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProxyManager.swift; sourceTree = "<group>"; };
@@ -2512,6 +2617,9 @@
88A0AA62207CFF970075132C /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
88A0AA63207CFF970075132C /* ConnectionIAPTableViewController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = ConnectionIAPTableViewController.storyboard; sourceTree = "<group>"; };
88A0AA64207CFF980075132C /* ConnectionTCPTableViewController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = ConnectionTCPTableViewController.storyboard; sourceTree = "<group>"; };
+ 88A795D02106787400056542 /* SDLStaticIconName.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLStaticIconName.h; sourceTree = "<group>"; };
+ 88A795D12106787400056542 /* SDLStaticIconName.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLStaticIconName.m; sourceTree = "<group>"; };
+ 88A795D4210678E000056542 /* SDLStaticIconNameSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLStaticIconNameSpec.m; sourceTree = "<group>"; };
88B3BF9620DA859800943565 /* SDLFuelType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLFuelType.h; sourceTree = "<group>"; };
88B3BF9720DA859800943565 /* SDLFuelType.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLFuelType.m; sourceTree = "<group>"; };
88B3BF9A20DA8BBC00943565 /* SDLFuelRange.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLFuelRange.h; sourceTree = "<group>"; };
@@ -2569,9 +2677,6 @@
DA6223BB1E7B088200878689 /* CVPixelBufferRef+SDLUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CVPixelBufferRef+SDLUtil.h"; sourceTree = "<group>"; };
DA6223BC1E7B088200878689 /* CVPixelBufferRef+SDLUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CVPixelBufferRef+SDLUtil.m"; sourceTree = "<group>"; };
DA661E2B1E553E7E001C1345 /* SDLStreamingMediaManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLStreamingMediaManagerSpec.m; sourceTree = "<group>"; };
- DA8966E91E56939F00413EAB /* SDLStreamingMediaLifecycleManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLStreamingMediaLifecycleManager.h; sourceTree = "<group>"; };
- DA8966EA1E56939F00413EAB /* SDLStreamingMediaLifecycleManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLStreamingMediaLifecycleManager.m; sourceTree = "<group>"; };
- DA8966EE1E5693E300413EAB /* SDLStreamingMediaLifecycleManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLStreamingMediaLifecycleManagerSpec.m; sourceTree = "<group>"; };
DA8966F11E56973700413EAB /* SDLStreamingMediaManagerConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLStreamingMediaManagerConstants.h; sourceTree = "<group>"; };
DA8966F31E56977C00413EAB /* SDLStreamingMediaManagerConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLStreamingMediaManagerConstants.m; sourceTree = "<group>"; };
DA96C0651D4D4F730022F520 /* SDLAppInfoSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLAppInfoSpec.m; sourceTree = "<group>"; };
@@ -2734,6 +2839,7 @@
162E81F11A9BDE8A00906325 /* SDLDisplayTypeSpec.m */,
162E81F21A9BDE8A00906325 /* SDLDriverDistractionStateSpec.m */,
162E81F31A9BDE8A00906325 /* SDLECallConfirmationStatusSpec.m */,
+ 5DD8406420FCE21A0082CE04 /* SDLElectronicParkBrakeStatusSpec.m */,
162E81F41A9BDE8A00906325 /* SDLEmergencyEventTypeSpec.m */,
162E81F51A9BDE8A00906325 /* SDLFileTypeSpec.m */,
162E81F61A9BDE8A00906325 /* SDLFuelCutoffStatusSpec.m */,
@@ -2753,8 +2859,11 @@
162E82031A9BDE8A00906325 /* SDLLayoutModeSpec.m */,
162E82041A9BDE8A00906325 /* SDLLockScreenStatusSpec.m */,
162E82051A9BDE8A00906325 /* SDLMaintenanceModeStatusSpec.m */,
+ 1EB59CCD202DC97900343A61 /* SDLMassageCushionSpec.m */,
+ 1EB59CC9202DC8E300343A61 /* SDLMassageZoneSpec.m */,
162E82061A9BDE8A00906325 /* SDLMediaClockFormatSpec.m */,
8BBEA6081F324832003EEA26 /* SDLMetadataTypeSpec.m */,
+ 1EB59CC7202DC86A00343A61 /* SDLModuleTypeSpec.m */,
162E82071A9BDE8A00906325 /* SDLPermissionStatusSpec.m */,
162E82081A9BDE8A00906325 /* SDLPowerModeQualificationStatusSpec.m */,
162E82091A9BDE8A00906325 /* SDLPowerModeStatusSpec.m */,
@@ -2768,6 +2877,8 @@
162E82111A9BDE8A00906325 /* SDLSamplingRateSpec.m */,
162E82121A9BDE8A00906325 /* SDLSoftButtonTypeSpec.m */,
162E82131A9BDE8A00906325 /* SDLSpeechCapabilitiesSpec.m */,
+ 1EB59CCF202DC9F200343A61 /* SDLSupportedSeatSpec.m */,
+ 88A795D4210678E000056542 /* SDLStaticIconNameSpec.m */,
162E82141A9BDE8A00906325 /* SDLSystemAction.m */,
5D0A9F901F15550400CC80DD /* SDLSystemCapabilityTypeSpec.m */,
162E82151A9BDE8A00906325 /* SDLSystemContextSpec.m */,
@@ -2777,6 +2888,7 @@
162E82191A9BDE8A00906325 /* SDLTimerModeSpec.m */,
162E821A1A9BDE8A00906325 /* SDLTouchTypeSpec.m */,
162E821B1A9BDE8A00906325 /* SDLTriggerSource.m */,
+ 8818ADDC2100FE0C007D6F19 /* SDLTurnSignalSpec.m */,
162E821C1A9BDE8A00906325 /* SDLUpdateModeSpec.m */,
162E821D1A9BDE8A00906325 /* SDLVehicleDataActiveStatusSpec.m */,
162E821E1A9BDE8A00906325 /* SDLVehicleDataEventStatusSpec.m */,
@@ -2793,6 +2905,8 @@
1EE8C4391F347D4D00FDC2CF /* SDLRadioStateSpec.m */,
1EE8C43B1F347EAE00FDC2CF /* SDLTemperatureUnitSpec.m */,
1EE8C43D1F347F0500FDC2CF /* SDLVentilationModeSpec.m */,
+ 5D64FE6C20DA9CE600792F9F /* SDLVideoStreamingStateSpec.m */,
+ 1EB59CD1202DCA9B00343A61 /* SDLMassageModeSpec.m */,
);
path = EnumSpecs;
sourceTree = "<group>";
@@ -2814,6 +2928,7 @@
162E82331A9BDE8A00906325 /* SDLOnLanguageChangeSpec.m */,
162E82341A9BDE8A00906325 /* SDLOnLockScreenStatusSpec.m */,
162E82351A9BDE8A00906325 /* SDLOnPermissionsChangeSpec.m */,
+ 1EAA470D2032BF1D000FE74B /* SDLOnRCStatusSpec.m */,
162E82361A9BDE8A00906325 /* SDLOnSyncPDataSpec.m */,
162E82371A9BDE8A00906325 /* SDLOnSystemRequestSpec.m */,
162E82381A9BDE8A00906325 /* SDLOnTBTClientStateSpec.m */,
@@ -2977,6 +3092,8 @@
162E82A11A9BDE8A00906325 /* SDLKeyboardPropertiesSpec.m */,
DA9F7EAD1DCC063400ACAE48 /* SDLLocationCoordinateSpec.m */,
DA9F7EAE1DCC063400ACAE48 /* SDLLocationDetailsSpec.m */,
+ 1EB59CD7202DCCD500343A61 /* SDLMassageCushionFirmnessSpec.m */,
+ 1EB59CD3202DCAE900343A61 /* SDLMassageModeDataSpec.m */,
162E82A21A9BDE8A00906325 /* SDLMenuParamsSpec.m */,
1EE8C4451F3837D200FDC2CF /* SDLModuleDataSpec.m */,
8B9376DA1F33656C009605C4 /* SDLMetadataTagsSpec.m */,
@@ -2994,6 +3111,9 @@
5DADA7771F4E059E0084D17D /* SDLRectangleSpec.m */,
5D92934F20AF526200FCC775 /* SDLRGBColorSpec.m */,
162E82A71A9BDE8A00906325 /* SDLScreenParamsSpec.m */,
+ 1E89B0E1203196B800A47992 /* SDLSeatControlCapabilitiesSpec.m */,
+ 1E89B0DD2031636000A47992 /* SDLSeatControlDataSpec.m */,
+ 1EB59CD9202DCEEC00343A61 /* SDLSeatMemoryActionSpec.m */,
162E82A81A9BDE8A00906325 /* SDLSingleTireStatusSpec.m */,
162E82A91A9BDE8A00906325 /* SDLSoftButtonCapabilitiesSpec.m */,
162E82AA1A9BDE8A00906325 /* SDLSoftButtonSpec.m */,
@@ -3418,6 +3538,8 @@
children = (
5D48329B1A8EA33D00252386 /* Preferences.h */,
5D48329C1A8EA33D00252386 /* Preferences.m */,
+ 8880B2F021022887004721DB /* TextValidator.h */,
+ 8880B2F121022887004721DB /* TextValidator.m */,
);
name = Utilities;
sourceTree = "<group>";
@@ -3791,6 +3913,10 @@
DA9F7E961DCC052C00ACAE48 /* SDLLocationCoordinate.m */,
DA9F7E971DCC052C00ACAE48 /* SDLLocationDetails.h */,
DA9F7E981DCC052C00ACAE48 /* SDLLocationDetails.m */,
+ 1EB59CAD202D97AC00343A61 /* SDLMassageCushionFirmness.h */,
+ 1EB59CAE202D97AC00343A61 /* SDLMassageCushionFirmness.m */,
+ 1EB59CA5202D946500343A61 /* SDLMassageModeData.h */,
+ 1EB59CA6202D946500343A61 /* SDLMassageModeData.m */,
5D61FB0B1A84238A00846EE7 /* SDLMenuParams.h */,
5D61FB0C1A84238A00846EE7 /* SDLMenuParams.m */,
1E5AD06E1F209C880029B8AF /* SDLModuleData.h */,
@@ -3827,6 +3953,12 @@
5D61FB8D1A84238B00846EE7 /* SDLScreenParams.m */,
5D61FBAA1A84238B00846EE7 /* SDLSingleTireStatus.h */,
5D61FBAB1A84238B00846EE7 /* SDLSingleTireStatus.m */,
+ 1EB59CBD202DA26000343A61 /* SDLSeatControlData.h */,
+ 1EB59CBE202DA26000343A61 /* SDLSeatControlData.m */,
+ 1EB59CC1202DB40400343A61 /* SDLSeatControlCapabilities.h */,
+ 1EB59CC2202DB40400343A61 /* SDLSeatControlCapabilities.m */,
+ 1EB59CB5202D9C8100343A61 /* SDLSeatMemoryAction.h */,
+ 1EB59CB6202D9C8100343A61 /* SDLSeatMemoryAction.m */,
5D61FBB21A84238B00846EE7 /* SDLSoftButton.h */,
5D61FBB31A84238B00846EE7 /* SDLSoftButton.m */,
5D61FBB41A84238B00846EE7 /* SDLSoftButtonCapabilities.h */,
@@ -3914,6 +4046,8 @@
5D61FAA81A84238A00846EE7 /* SDLDriverDistractionState.m */,
5D61FAA91A84238A00846EE7 /* SDLECallConfirmationStatus.h */,
5D61FAAA1A84238A00846EE7 /* SDLECallConfirmationStatus.m */,
+ 5DD8406020FCD6C10082CE04 /* SDLElectronicParkBrakeStatus.h */,
+ 5DD8406120FCD6C10082CE04 /* SDLElectronicParkBrakeStatus.m */,
5D61FAAF1A84238A00846EE7 /* SDLEmergencyEventType.h */,
5D61FAB01A84238A00846EE7 /* SDLEmergencyEventType.m */,
5D61FABC1A84238A00846EE7 /* SDLFileType.h */,
@@ -3952,6 +4086,12 @@
5D61FB061A84238A00846EE7 /* SDLLockScreenStatus.m */,
5D61FB071A84238A00846EE7 /* SDLMaintenanceModeStatus.h */,
5D61FB081A84238A00846EE7 /* SDLMaintenanceModeStatus.m */,
+ 1EB59CA9202D96A200343A61 /* SDLMassageCushion.h */,
+ 1EB59CAA202D96A200343A61 /* SDLMassageCushion.m */,
+ 1EB59CA1202D92F600343A61 /* SDLMassageMode.h */,
+ 1EB59CA2202D92F600343A61 /* SDLMassageMode.m */,
+ 1EB59C9D202D925500343A61 /* SDLMassageZone.h */,
+ 1EB59C9E202D925500343A61 /* SDLMassageZone.m */,
5D61FB091A84238A00846EE7 /* SDLMediaClockFormat.h */,
5D61FB0A1A84238A00846EE7 /* SDLMediaClockFormat.m */,
1E5AD0461F1F773E0029B8AF /* SDLModuleType.h */,
@@ -3983,10 +4123,16 @@
5D61FB7E1A84238B00846EE7 /* SDLRPCMessageType.h */,
5D61FB8A1A84238B00846EE7 /* SDLSamplingRate.h */,
5D61FB8B1A84238B00846EE7 /* SDLSamplingRate.m */,
+ 1EB59CB1202D9B5F00343A61 /* SDLSeatMemoryActionType.h */,
+ 1EB59CB2202D9B5F00343A61 /* SDLSeatMemoryActionType.m */,
5D61FBB61A84238B00846EE7 /* SDLSoftButtonType.h */,
5D61FBB71A84238B00846EE7 /* SDLSoftButtonType.m */,
5D61FBBC1A84238B00846EE7 /* SDLSpeechCapabilities.h */,
5D61FBBD1A84238B00846EE7 /* SDLSpeechCapabilities.m */,
+ 1EB59CB9202DA1B400343A61 /* SDLSupportedSeat.h */,
+ 1EB59CBA202DA1B400343A61 /* SDLSupportedSeat.m */,
+ 88A795D02106787400056542 /* SDLStaticIconName.h */,
+ 88A795D12106787400056542 /* SDLStaticIconName.m */,
5D61FBCE1A84238B00846EE7 /* SDLSystemAction.h */,
5D61FBCF1A84238B00846EE7 /* SDLSystemAction.m */,
5D00AC651F140F0A004000D9 /* SDLSystemCapabilityType.h */,
@@ -4005,8 +4151,12 @@
5D61FBE11A84238C00846EE7 /* SDLTimerMode.m */,
5D61FBEA1A84238C00846EE7 /* SDLTouchType.h */,
5D61FBEB1A84238C00846EE7 /* SDLTouchType.m */,
+ 5D3E420820EAAD6500D8C622 /* SDLTPMS.h */,
+ 5D3E420920EAAD6500D8C622 /* SDLTPMS.m */,
5D61FBEE1A84238C00846EE7 /* SDLTriggerSource.h */,
5D61FBEF1A84238C00846EE7 /* SDLTriggerSource.m */,
+ 8818ADD62100FC18007D6F19 /* SDLTurnSignal.h */,
+ 8818ADD72100FC18007D6F19 /* SDLTurnSignal.m */,
5D61FC021A84238C00846EE7 /* SDLUpdateMode.h */,
5D61FC031A84238C00846EE7 /* SDLUpdateMode.m */,
5D61FC101A84238C00846EE7 /* SDLVehicleDataActiveStatus.h */,
@@ -4035,6 +4185,8 @@
8B7B31991F2F7B5700BDC38D /* SDLVideoStreamingCodec.m */,
8B7B319C1F2F7CF700BDC38D /* SDLVideoStreamingProtocol.h */,
8B7B319D1F2F7CF700BDC38D /* SDLVideoStreamingProtocol.m */,
+ 5D0C29FA20D93D8C008B56CD /* SDLVideoStreamingState.h */,
+ 5D0C29FB20D93D8C008B56CD /* SDLVideoStreamingState.m */,
);
name = Enums;
sourceTree = "<group>";
@@ -4109,6 +4261,8 @@
5D61FB291A84238B00846EE7 /* SDLOnLockScreenStatus.m */,
5D61FB2A1A84238B00846EE7 /* SDLOnPermissionsChange.h */,
5D61FB2B1A84238B00846EE7 /* SDLOnPermissionsChange.m */,
+ 1EAA47092032BAE5000FE74B /* SDLOnRCStatus.h */,
+ 1EAA470A2032BAE5000FE74B /* SDLOnRCStatus.m */,
5D61FB2C1A84238B00846EE7 /* SDLOnSyncPData.h */,
5D61FB2D1A84238B00846EE7 /* SDLOnSyncPData.m */,
5D61FB2E1A84238B00846EE7 /* SDLOnSystemRequest.h */,
@@ -4985,6 +5139,7 @@
children = (
5DEF69631FD6FEC2004B8C2F /* Mocks */,
5DEF69601FD6FB75004B8C2F /* SDLAudioStreamManagerSpec.m */,
+ 5D64FE7020DA9E6700792F9F /* SDLStreamingAudioLifecycleManagerSpec.m */,
);
name = "Audio Manager";
sourceTree = "<group>";
@@ -4992,7 +5147,7 @@
5DEF69621FD6FEB6004B8C2F /* Video */ = {
isa = PBXGroup;
children = (
- DA8966EE1E5693E300413EAB /* SDLStreamingMediaLifecycleManagerSpec.m */,
+ 5D64FE6E20DA9E4300792F9F /* SDLStreamingVideoLifecycleManagerSpec.m */,
DABB62161E4A900C0034C567 /* SDLH264VideoEncoderSpec.m */,
EED5CA031F4D1D5E00F04000 /* SDLRAWH264PacketizerSpec.m */,
EED5CA091F4D206800F04000 /* SDLRTPH264PacketizerSpec.m */,
@@ -5101,6 +5256,7 @@
children = (
88A0AA55207CFE5C0075132C /* AppUserDefaults.swift */,
88DFB051207F8DF50079D19D /* Protocol+ProxyManagerDelegate.swift */,
+ 8880B2ED21021964004721DB /* TextValidator.swift */,
);
name = Utilities;
sourceTree = "<group>";
@@ -5180,8 +5336,10 @@
DA8966E81E56938C00413EAB /* Lifecycle */ = {
isa = PBXGroup;
children = (
- DA8966E91E56939F00413EAB /* SDLStreamingMediaLifecycleManager.h */,
- DA8966EA1E56939F00413EAB /* SDLStreamingMediaLifecycleManager.m */,
+ 5D0C2A0220D947AB008B56CD /* SDLStreamingAudioLifecycleManager.h */,
+ 5D0C2A0320D947AB008B56CD /* SDLStreamingAudioLifecycleManager.m */,
+ 5D0C29FE20D9479B008B56CD /* SDLStreamingVideoLifecycleManager.h */,
+ 5D0C29FF20D9479B008B56CD /* SDLStreamingVideoLifecycleManager.m */,
);
name = Lifecycle;
sourceTree = "<group>";
@@ -5260,6 +5418,17 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
+ 1EB59CBF202DA26000343A61 /* SDLSeatControlData.h in Headers */,
+ 1EB59CB3202D9B5F00343A61 /* SDLSeatMemoryActionType.h in Headers */,
+ 1EB59CC3202DB40400343A61 /* SDLSeatControlCapabilities.h in Headers */,
+ 1EB59CB7202D9C8100343A61 /* SDLSeatMemoryAction.h in Headers */,
+ 1EB59CBB202DA1B400343A61 /* SDLSupportedSeat.h in Headers */,
+ 1EB59CA7202D946500343A61 /* SDLMassageModeData.h in Headers */,
+ 1EB59CAB202D96A200343A61 /* SDLMassageCushion.h in Headers */,
+ 1EB59C9F202D925500343A61 /* SDLMassageZone.h in Headers */,
+ 1EB59CA3202D92F600343A61 /* SDLMassageMode.h in Headers */,
+ 1EB59CAF202D97AC00343A61 /* SDLMassageCushionFirmness.h in Headers */,
+ 1EAA470B2032BAE5000FE74B /* SDLOnRCStatus.h in Headers */,
2BF2F84F20ED004000A26EF2 /* SDLAudioStreamingIndicator.h in Headers */,
5D9FC2A61FD8815800ACA5C2 /* SDLPCMAudioConverter.h in Headers */,
8BBEA6061F324165003EEA26 /* SDLMetadataType.h in Headers */,
@@ -5276,6 +5445,7 @@
5D61FD751A84238C00846EE7 /* SDLRPCResponse.h in Headers */,
8B7B31A21F2F7FEA00BDC38D /* SDLVideoStreamingFormat.h in Headers */,
5D61FC901A84238C00846EE7 /* SDLDisplayCapabilities.h in Headers */,
+ 5D3E420A20EAAD6500D8C622 /* SDLTPMS.h in Headers */,
5D61FCE81A84238C00846EE7 /* SDLLanguage.h in Headers */,
5D61FC841A84238C00846EE7 /* SDLDeviceLevelStatus.h in Headers */,
5DB92D321AC9C8BA00C15BB0 /* SDLRPCStruct.h in Headers */,
@@ -5306,6 +5476,7 @@
5D61FC9C1A84238C00846EE7 /* SDLEmergencyEventType.h in Headers */,
5D61FD131A84238C00846EE7 /* SDLOnLanguageChange.h in Headers */,
5D61FDE71A84238C00846EE7 /* SDLUnsubscribeButton.h in Headers */,
+ 5DD8406220FCD6C10082CE04 /* SDLElectronicParkBrakeStatus.h in Headers */,
5D61FCAB1A84238C00846EE7 /* SDLFuelCutoffStatus.h in Headers */,
5D9FC2A31FD8814A00ACA5C2 /* SDLAudioFile.h in Headers */,
5DB9965C1F268F97002D8795 /* SDLControlFramePayloadVideoStartService.h in Headers */,
@@ -5446,6 +5617,7 @@
5D61FDE91A84238C00846EE7 /* SDLUnsubscribeButtonResponse.h in Headers */,
5D61FCD51A84238C00846EE7 /* SDLImageType.h in Headers */,
5D61FC2F1A84238C00846EE7 /* SDLAddCommandResponse.h in Headers */,
+ 5D0C2A0020D9479B008B56CD /* SDLStreamingVideoLifecycleManager.h in Headers */,
5D61FD631A84238C00846EE7 /* SDLResetGlobalProperties.h in Headers */,
5D61FDD71A84238C00846EE7 /* SDLTouchType.h in Headers */,
5D92935E20B33FF700FCC775 /* SDLChoiceSet.h in Headers */,
@@ -5540,6 +5712,7 @@
5D61FDB91A84238C00846EE7 /* SDLSyncPDataResponse.h in Headers */,
DAC572631D10C5020004288B /* SDLPinchGesture.h in Headers */,
5D61FC311A84238C00846EE7 /* SDLAddSubMenu.h in Headers */,
+ 5D0C2A0420D947AB008B56CD /* SDLStreamingAudioLifecycleManager.h in Headers */,
5D61FD171A84238C00846EE7 /* SDLOnPermissionsChange.h in Headers */,
5D4631081F21261A0092EFDC /* SDLControlFramePayloadRPCStartServiceAck.h in Headers */,
5D61FDD51A84238C00846EE7 /* SDLTouchEventCapabilities.h in Headers */,
@@ -5578,6 +5751,7 @@
1E5AD0481F1F773E0029B8AF /* SDLModuleType.h in Headers */,
1E5AD06C1F208BAB0029B8AF /* SDLClimateControlData.h in Headers */,
1E5AD0381F1F4E390029B8AF /* SDLClimateControlCapabilities.h in Headers */,
+ 5D0C29FC20D93D8C008B56CD /* SDLVideoStreamingState.h in Headers */,
1E5AD0501F1F7BF10029B8AF /* SDLRadioBand.h in Headers */,
1E5AD0401F1F58480029B8AF /* SDLVentilationMode.h in Headers */,
1E5AD0941F20BEAD0029B8AF /* SDLSetInteriorVehicleDataResponse.h in Headers */,
@@ -5613,14 +5787,15 @@
5D61FDC31A84238C00846EE7 /* SDLTBTState.h in Headers */,
5D61FD951A84238C00846EE7 /* SDLShowResponse.h in Headers */,
5D61FCA31A84238C00846EE7 /* SDLEndAudioPassThru.h in Headers */,
+ 88A795D22106787400056542 /* SDLStaticIconName.h in Headers */,
5D61FCB11A84238C00846EE7 /* SDLGetDTCs.h in Headers */,
5D61FDFF1A84238C00846EE7 /* SDLVehicleDataEventStatus.h in Headers */,
5D61FC5B1A84238C00846EE7 /* SDLChangeRegistration.h in Headers */,
5D61FD5B1A84238C00846EE7 /* SDLReadDIDResponse.h in Headers */,
5D61FDEF1A84238C00846EE7 /* SDLUpdateMode.h in Headers */,
EED5CA001F4D18DC00F04000 /* SDLRAWH264Packetizer.h in Headers */,
- DA8966EB1E56939F00413EAB /* SDLStreamingMediaLifecycleManager.h in Headers */,
5D293AFE1FE078A9000CBD7E /* SDLCarWindowViewController.h in Headers */,
+ 8818ADD82100FC18007D6F19 /* SDLTurnSignal.h in Headers */,
5D61FDDB1A84238C00846EE7 /* SDLTriggerSource.h in Headers */,
5D61FD8F1A84238C00846EE7 /* SDLShow.h in Headers */,
5D61FDDD1A84238C00846EE7 /* SDLTTSChunk.h in Headers */,
@@ -5818,7 +5993,7 @@
};
5D61FA1B1A84237100846EE7 = {
CreatedOnToolsVersion = 6.1.1;
- LastSwiftMigration = 0930;
+ LastSwiftMigration = 0940;
};
5D61FA251A84237100846EE7 = {
CreatedOnToolsVersion = 6.1.1;
@@ -5921,6 +6096,7 @@
buildActionMask = 2147483647;
files = (
5D4832A51A94F90D00252386 /* ConnectionTransitionContext.m in Sources */,
+ 8880B2F421022896004721DB /* TextValidator.m in Sources */,
8800871E20A6356D008E1EA0 /* ButtonManager.m in Sources */,
5D0218FC1A8E7E1700D1BF62 /* ConnectionContainerViewController.m in Sources */,
88DA6D10209794A400AD8297 /* AlertManager.m in Sources */,
@@ -5946,7 +6122,9 @@
files = (
1E4920B31F6A6463008F2CC3 /* SDLOnInteriorVehicleData.m in Sources */,
1E4920B21F6A6455008F2CC3 /* SDLGetInteriorVehicleDataResponse.m in Sources */,
+ 1EB59CB8202D9C8100343A61 /* SDLSeatMemoryAction.m in Sources */,
1E4920B11F6A6443008F2CC3 /* SDLRadioState.m in Sources */,
+ 5D0C2A0120D9479B008B56CD /* SDLStreamingVideoLifecycleManager.m in Sources */,
5DA8A0EA1E955FE00039C50D /* SDLLogModel.m in Sources */,
5DA8A0E91E955F710039C50D /* SDLStreamingMediaManagerConstants.m in Sources */,
332A914F1CED9CC60043824C /* SDLAppInfo.m in Sources */,
@@ -5974,6 +6152,7 @@
5D61FD1A1A84238C00846EE7 /* SDLOnSyncPData.m in Sources */,
8B7B319F1F2F7CF700BDC38D /* SDLVideoStreamingProtocol.m in Sources */,
5D61FC461A84238C00846EE7 /* SDLAudioPassThruCapabilities.m in Sources */,
+ 5D0C2A0520D947AB008B56CD /* SDLStreamingAudioLifecycleManager.m in Sources */,
5D61FD301A84238C00846EE7 /* SDLPermissionStatus.m in Sources */,
5D61FDEE1A84238C00846EE7 /* SDLUnsubscribeVehicleDataResponse.m in Sources */,
8B7B319B1F2F7B5700BDC38D /* SDLVideoStreamingCodec.m in Sources */,
@@ -5996,12 +6175,15 @@
5D61FCCE1A84238C00846EE7 /* SDLImage.m in Sources */,
5D61FD241A84238C00846EE7 /* SDLParameterPermissions.m in Sources */,
1E5AD0711F209C880029B8AF /* SDLModuleData.m in Sources */,
+ 1EAA470C2032BAE5000FE74B /* SDLOnRCStatus.m in Sources */,
5D61FDD21A84238C00846EE7 /* SDLTouchCoord.m in Sources */,
5D61FCEF1A84238C00846EE7 /* SDLListFilesResponse.m in Sources */,
+ 5D3E420B20EAAD6500D8C622 /* SDLTPMS.m in Sources */,
5DD67CB11E65DDB7009CD394 /* SDLLogTargetAppleSystemLog.m in Sources */,
5D92935420B2F76500FCC775 /* SDLTemplateColorScheme.m in Sources */,
5D61FD1C1A84238C00846EE7 /* SDLOnSystemRequest.m in Sources */,
5D61FC911A84238C00846EE7 /* SDLDisplayCapabilities.m in Sources */,
+ 1EB59CC4202DB40400343A61 /* SDLSeatControlCapabilities.m in Sources */,
5D61FD261A84238C00846EE7 /* SDLPerformAudioPassThru.m in Sources */,
5D61FC971A84238C00846EE7 /* SDLECallConfirmationStatus.m in Sources */,
1E5AD04D1F1F79640029B8AF /* SDLDefrostZone.m in Sources */,
@@ -6110,6 +6292,7 @@
1E5AD05D1F2064A80029B8AF /* SDLRDSData.m in Sources */,
5D61FCA61A84238C00846EE7 /* SDLEndAudioPassThruResponse.m in Sources */,
5D61FD281A84238C00846EE7 /* SDLPerformAudioPassThruResponse.m in Sources */,
+ 1EB59CB0202D97AC00343A61 /* SDLMassageCushionFirmness.m in Sources */,
5D61FDCE1A84238C00846EE7 /* SDLTimerMode.m in Sources */,
5D61FD701A84238C00846EE7 /* SDLRPCPayload.m in Sources */,
5D61FD9C1A84238C00846EE7 /* SDLSlider.m in Sources */,
@@ -6125,9 +6308,11 @@
5DB996611F28C6ED002D8795 /* SDLControlFramePayloadVideoStartServiceAck.m in Sources */,
5D61FD961A84238C00846EE7 /* SDLShowResponse.m in Sources */,
5D61FD981A84238C00846EE7 /* SDLSingleTireStatus.m in Sources */,
+ 1EB59CA8202D946500343A61 /* SDLMassageModeData.m in Sources */,
5D9FDA931F2A7D3400A495C8 /* bson_util.c in Sources */,
5D61FD511A84238C00846EE7 /* SDLProxy.m in Sources */,
5D61FD461A84238C00846EE7 /* SDLProtocolHeader.m in Sources */,
+ 5DD8406320FCD6C10082CE04 /* SDLElectronicParkBrakeStatus.m in Sources */,
8BBEA6071F324165003EEA26 /* SDLMetadataType.m in Sources */,
5D61FDBC1A84238C00846EE7 /* SDLSystemAction.m in Sources */,
5D61FC381A84238C00846EE7 /* SDLAlert.m in Sources */,
@@ -6140,6 +6325,7 @@
5D61FC3A1A84238C00846EE7 /* SDLAlertManeuver.m in Sources */,
5D61FC5E1A84238C00846EE7 /* SDLChangeRegistrationResponse.m in Sources */,
5D8204231BCEA89A00D0A41B /* SDLFileManager.m in Sources */,
+ 1EB59CC0202DA26000343A61 /* SDLSeatControlData.m in Sources */,
5D61FC7D1A84238C00846EE7 /* SDLDeleteInteractionChoiceSetResponse.m in Sources */,
DAC572661D10C5640004288B /* CGPoint_Util.m in Sources */,
5D00AC681F140F0A004000D9 /* SDLSystemCapabilityType.m in Sources */,
@@ -6173,6 +6359,7 @@
5D61FD121A84238C00846EE7 /* SDLOnKeyboardInput.m in Sources */,
DA9F7E9A1DCC052C00ACAE48 /* SDLLocationCoordinate.m in Sources */,
5D61FCCA1A84238C00846EE7 /* SDLIgnitionStableStatus.m in Sources */,
+ 88A795D32106787400056542 /* SDLStaticIconName.m in Sources */,
5D61FCFB1A84238C00846EE7 /* SDLMyKey.m in Sources */,
5D61FCAA1A84238C00846EE7 /* SDLFileType.m in Sources */,
1E5AD0651F207DD50029B8AF /* SDLTemperature.m in Sources */,
@@ -6215,6 +6402,7 @@
2BF2F85020ED004000A26EF2 /* SDLAudioStreamingIndicator.m in Sources */,
5D61FCA41A84238C00846EE7 /* SDLEndAudioPassThru.m in Sources */,
5D339CEB207C066E000CC364 /* SDLMenuCell.m in Sources */,
+ 8818ADD92100FC18007D6F19 /* SDLTurnSignal.m in Sources */,
5D8B17541AC9E11B006A6E1C /* SDLDialNumberResponse.m in Sources */,
DA6223BE1E7B088200878689 /* CVPixelBufferRef+SDLUtil.m in Sources */,
1FF7DABC1F75B2BF00B46C30 /* SDLFocusableItemLocator.m in Sources */,
@@ -6222,6 +6410,7 @@
5D61FC851A84238C00846EE7 /* SDLDeviceLevelStatus.m in Sources */,
5D9FDA981F2A7D3F00A495C8 /* emhashmap.c in Sources */,
5D61FD1E1A84238C00846EE7 /* SDLOnTBTClientState.m in Sources */,
+ 5D0C29FD20D93D8C008B56CD /* SDLVideoStreamingState.m in Sources */,
5DD67CBD1E661C84009CD394 /* SDLLogTargetOSLog.m in Sources */,
DA9F7E641DCBFAC800ACAE48 /* SDLDateTime.m in Sources */,
5D61FD581A84238C00846EE7 /* SDLPutFileResponse.m in Sources */,
@@ -6236,6 +6425,7 @@
5D61FE041A84238C00846EE7 /* SDLVehicleDataResult.m in Sources */,
5D61FD5C1A84238C00846EE7 /* SDLReadDIDResponse.m in Sources */,
5D1BF6B0204742FB00D36881 /* SDLDisplayCapabilities+ShowManagerExtensions.m in Sources */,
+ 1EB59CB4202D9B5F00343A61 /* SDLSeatMemoryActionType.m in Sources */,
5D61FD321A84238C00846EE7 /* SDLPolicyDataParser.m in Sources */,
5D61FC621A84238C00846EE7 /* SDLChoice.m in Sources */,
1E5AD0811F20B73E0029B8AF /* SDLButtonPress.m in Sources */,
@@ -6276,6 +6466,7 @@
5D61FC831A84238C00846EE7 /* SDLDeviceInfo.m in Sources */,
DA318C201DD0F06C00C035AC /* NSMutableDictionary+Store.m in Sources */,
5D7F87EC1CE3C1A1002DD7C4 /* SDLDeleteFileOperation.m in Sources */,
+ 1EB59CBC202DA1B400343A61 /* SDLSupportedSeat.m in Sources */,
97E26DED1E807AD70074A3C7 /* SDLMutableDataQueue.m in Sources */,
5D61FD641A84238C00846EE7 /* SDLResetGlobalProperties.m in Sources */,
5DCD7AE11FCCA8D200A0FC7F /* SDLCarWindow.m in Sources */,
@@ -6283,6 +6474,7 @@
5D60088B1BE3ED540094A505 /* SDLStateMachine.m in Sources */,
8877F5EF1F34A72200DC128A /* SDLSendHapticDataResponse.m in Sources */,
5D61FD181A84238C00846EE7 /* SDLOnPermissionsChange.m in Sources */,
+ 1EB59CAC202D96A200343A61 /* SDLMassageCushion.m in Sources */,
5D61FD3E1A84238C00846EE7 /* SDLPrimaryAudioSource.m in Sources */,
1E5AD0851F20B9290029B8AF /* SDLButtonPressResponse.m in Sources */,
5D82041F1BCD8E6100D0A41B /* SDLConfiguration.m in Sources */,
@@ -6304,13 +6496,14 @@
5D61FDC21A84238C00846EE7 /* SDLSystemRequestResponse.m in Sources */,
5D9FDA911F2A7D3400A495C8 /* bson_object.c in Sources */,
5D61FD001A84238C00846EE7 /* SDLOnAppInterfaceUnregistered.m in Sources */,
- DA8966EC1E56939F00413EAB /* SDLStreamingMediaLifecycleManager.m in Sources */,
DAC5726A1D10D5FC0004288B /* dispatch_timer.m in Sources */,
5D61FC6C1A84238C00846EE7 /* SDLCreateInteractionChoiceSet.m in Sources */,
5DCD7AF71FCCA8E400A0FC7F /* SDLScreenshotViewController.m in Sources */,
+ 1EB59CA4202D92F600343A61 /* SDLMassageMode.m in Sources */,
5D61FD081A84238C00846EE7 /* SDLOnCommand.m in Sources */,
5D53C46E1B7A99B9003526EA /* SDLStreamingMediaManager.m in Sources */,
5D339CF4207C0ACE000CC364 /* SDLMenuManager.m in Sources */,
+ 1EB59CA0202D925500343A61 /* SDLMassageZone.m in Sources */,
5D61FD6A1A84238C00846EE7 /* SDLRPCMessage.m in Sources */,
1E5AD0391F1F4E390029B8AF /* SDLClimateControlCapabilities.m in Sources */,
5D92936920B3601700FCC775 /* SDLChoiceSetManager.m in Sources */,
@@ -6355,6 +6548,7 @@
162E83901A9BDE8B00906325 /* SDLTireStatusSpec.m in Sources */,
162E82E01A9BDE8B00906325 /* SDLHMILevelSpec.m in Sources */,
5DC09EDA1F2F7FEC00F4AB1D /* SDLControlFramePayloadNakSpec.m in Sources */,
+ 1EB59CCE202DC97900343A61 /* SDLMassageCushionSpec.m in Sources */,
162E83041A9BDE8B00906325 /* SDLUpdateModeSpec.m in Sources */,
162E83801A9BDE8B00906325 /* SDLHMIPermissionsSpec.m in Sources */,
5D1654561D3E754F00554D93 /* SDLLifecycleManagerSpec.m in Sources */,
@@ -6409,6 +6603,7 @@
162E82E11A9BDE8B00906325 /* SDLHMIZoneCapabilitiesSpec.m in Sources */,
162E83721A9BDE8B00906325 /* SDLAudioPassThruCapabilitiesSpec.m in Sources */,
162E83681A9BDE8B00906325 /* SDLSpeakResponseSpec.m in Sources */,
+ 1EB59CD8202DCCD500343A61 /* SDLMassageCushionFirmnessSpec.m in Sources */,
162E83661A9BDE8B00906325 /* SDLShowResponseSpec.m in Sources */,
5D9F50831BEA5C6100FEF399 /* SDLFileManagerSpec.m in Sources */,
5DAB5F512098994C00A020C8 /* SDLMenuCellSpec.m in Sources */,
@@ -6449,6 +6644,7 @@
1EE8C4521F38657D00FDC2CF /* SDLTemperatureSpec.m in Sources */,
5DB1BCDF1D243DD3002FFC37 /* SDLLockScreenConfigurationSpec.m in Sources */,
162E82E51A9BDE8B00906325 /* SDLImageTypeSpec.m in Sources */,
+ 1EB59CD4202DCAE900343A61 /* SDLMassageModeDataSpec.m in Sources */,
162E83421A9BDE8B00906325 /* SDLSubscribeVehicleDataSpec.m in Sources */,
162E83811A9BDE8B00906325 /* SDLImageFieldSpec.m in Sources */,
5D60DF24202B7A80001EDA01 /* SDLAsynchronousRPCRequestOperationSpec.m in Sources */,
@@ -6457,7 +6653,6 @@
162E83231A9BDE8B00906325 /* SDLAddSubMenuSpec.m in Sources */,
DA4353E91D2721680099B8C4 /* DispatchTimerSpec.m in Sources */,
1EE8C45D1F387D1C00FDC2CF /* SDLGetInteriorVehicleDataResponseSpec.m in Sources */,
- DA8966EF1E5693E300413EAB /* SDLStreamingMediaLifecycleManagerSpec.m in Sources */,
162E82F21A9BDE8B00906325 /* SDLPredefinedLayoutSpec.m in Sources */,
162E83521A9BDE8B00906325 /* SDLDeleteSubMenuResponseSpec.m in Sources */,
162E82E91A9BDE8B00906325 /* SDLKeypressModeSpec.m in Sources */,
@@ -6528,6 +6723,7 @@
162E83141A9BDE8B00906325 /* SDLOnDriverDistractionSpec.m in Sources */,
162E83371A9BDE8B00906325 /* SDLResetGlobalPropertiesSpec.m in Sources */,
162E82DF1A9BDE8B00906325 /* SDLGlobalProperySpec.m in Sources */,
+ 5DD8406520FCE21A0082CE04 /* SDLElectronicParkBrakeStatusSpec.m in Sources */,
162E82F61A9BDE8B00906325 /* SDLRequestTypeSpec.m in Sources */,
5DE35E4520CAFC5D0034BE5A /* SDLChoiceCellSpec.m in Sources */,
162E82FB1A9BDE8B00906325 /* SDLSpeechCapabilitiesSpec.m in Sources */,
@@ -6537,6 +6733,7 @@
162E832C1A9BDE8B00906325 /* SDLDiagnosticMessageSpec.m in Sources */,
162E83381A9BDE8B00906325 /* SDLScrollableMessageSpec.m in Sources */,
162E82E81A9BDE8B00906325 /* SDLKeyboardLayoutSpec.m in Sources */,
+ 5D64FE6F20DA9E4300792F9F /* SDLStreamingVideoLifecycleManagerSpec.m in Sources */,
DA9F7EA41DCC05EE00ACAE48 /* SDLSubscribeWaypointsSpec.m in Sources */,
DA4353EB1D2721680099B8C4 /* SDLTouchSpec.m in Sources */,
5DB1BCE71D245647002FFC37 /* TestStateMachineTarget.m in Sources */,
@@ -6553,9 +6750,11 @@
162E83451A9BDE8B00906325 /* SDLUnregisterAppInterfaceSpec.m in Sources */,
162E82EF1A9BDE8B00906325 /* SDLPermissionStatusSpec.m in Sources */,
DA9F7EA61DCC05F500ACAE48 /* SDLUnsubscribeWaypointsSpec.m in Sources */,
+ 1E89B0E2203196B800A47992 /* SDLSeatControlCapabilitiesSpec.m in Sources */,
162E82F01A9BDE8B00906325 /* SDLPowerModeQualificationStatusSpec.m in Sources */,
162E82CD1A9BDE8A00906325 /* SDLAudioStreamingStateSpec.m in Sources */,
1EE8C4461F3837D200FDC2CF /* SDLModuleDataSpec.m in Sources */,
+ 1E89B0DE2031636000A47992 /* SDLSeatControlDataSpec.m in Sources */,
162E831A1A9BDE8B00906325 /* SDLOnLockScreenStatusSpec.m in Sources */,
162E83431A9BDE8B00906325 /* SDLSyncPDataSpec.m in Sources */,
167ED9461A9BCE5D00797BE5 /* SwiftSpec.swift in Sources */,
@@ -6570,10 +6769,12 @@
1EE8C4401F348D3200FDC2CF /* SDLClimateControlCapabilitiesSpec.m in Sources */,
5DE35E5420CB1C590034BE5A /* SDLPresentChoiceSetOperationSpec.m in Sources */,
162E838F1A9BDE8B00906325 /* SDLTextFieldSpec.m in Sources */,
+ 8818ADDD2100FE0C007D6F19 /* SDLTurnSignalSpec.m in Sources */,
162E82CA1A9BDE8A00906325 /* SDLAmbientLightStatusSpec.m in Sources */,
162E83091A9BDE8B00906325 /* SDLVehicleDataStatusSpec.m in Sources */,
5DAD5F8D20508F220025624C /* SDLSoftButtonManagerSpec.m in Sources */,
162E83741A9BDE8B00906325 /* SDLBodyInformationSpec.m in Sources */,
+ 5D64FE6D20DA9CE600792F9F /* SDLVideoStreamingStateSpec.m in Sources */,
162E83641A9BDE8B00906325 /* SDLSetMediaClockTimerResponseSpec.m in Sources */,
162E839C1A9BDE8B00906325 /* SDLRPCRequestSpec.m in Sources */,
DA4353E31D2720A30099B8C4 /* SDLPinchGestureSpec.m in Sources */,
@@ -6582,6 +6783,7 @@
162E83651A9BDE8B00906325 /* SDLShowConstantTBTResponseSpec.m in Sources */,
162E82F91A9BDE8B00906325 /* SDLSamplingRateSpec.m in Sources */,
5DBEFA541F434B9E009EE295 /* SDLStreamingMediaConfigurationSpec.m in Sources */,
+ 1EB59CD2202DCA9B00343A61 /* SDLMassageModeSpec.m in Sources */,
162E82CB1A9BDE8A00906325 /* SDLAppHMITypeSpec.m in Sources */,
162E83031A9BDE8B00906325 /* SDLTriggerSource.m in Sources */,
162E82D61A9BDE8A00906325 /* SDLComponentVolumeStatusSpec.m in Sources */,
@@ -6614,6 +6816,7 @@
5DADA7781F4E059E0084D17D /* SDLRectangleSpec.m in Sources */,
5DB1BCDD1D243DC3002FFC37 /* SDLLifecycleConfigurationSpec.m in Sources */,
EED5CA0A1F4D206800F04000 /* SDLRTPH264PacketizerSpec.m in Sources */,
+ 1EB59CC8202DC86A00343A61 /* SDLModuleTypeSpec.m in Sources */,
162E83611A9BDE8B00906325 /* SDLSetAppIconResponseSpec.m in Sources */,
162E83471A9BDE8B00906325 /* SDLUnsubscribeVehicleDataSpec.m in Sources */,
162E839A1A9BDE8B00906325 /* SDLRPCMessageSpec.m in Sources */,
@@ -6628,12 +6831,15 @@
162E837F1A9BDE8B00906325 /* SDLHeadLampStatusSpec.m in Sources */,
162E834D1A9BDE8B00906325 /* SDLChangeRegistrationResponseSpec.m in Sources */,
DA9F7EAC1DCC062400ACAE48 /* SDLUnsubscribeWaypointsResponseSpec.m in Sources */,
+ 1EB59CDA202DCEEC00343A61 /* SDLSeatMemoryActionSpec.m in Sources */,
+ 1EAA470E2032BF1D000FE74B /* SDLOnRCStatusSpec.m in Sources */,
5D43466B1E6F3B4C00B639C6 /* SDLLogFilterSpec.m in Sources */,
88D2AAE41F682BB20078D5B2 /* SDLLogConstantsSpec.m in Sources */,
162E836B1A9BDE8B00906325 /* SDLSyncPDataResponseSpec.m in Sources */,
8B7B31AF1F2FBA0200BDC38D /* SDLVideoStreamingCapabilitySpec.m in Sources */,
162E839B1A9BDE8B00906325 /* SDLRPCNotificationSpec.m in Sources */,
162E83581A9BDE8B00906325 /* SDLGetVehicleDataResponseSpec.m in Sources */,
+ 1EB59CCA202DC8E300343A61 /* SDLMassageZoneSpec.m in Sources */,
8B7B31B11F2FBD9500BDC38D /* SDLVideoStreamingFormatSpec.m in Sources */,
162E831D1A9BDE8B00906325 /* SDLOnSystemRequestSpec.m in Sources */,
162E835D1A9BDE8B00906325 /* SDLReadDIDResponseSpec.m in Sources */,
@@ -6641,6 +6847,7 @@
162E82D41A9BDE8A00906325 /* SDLCharacterSetSpec.m in Sources */,
162E830F1A9BDE8B00906325 /* SDLOnAppInterfaceUnregisteredSpec.m in Sources */,
162E83971A9BDE8B00906325 /* SDLVehicleTypeSpec.m in Sources */,
+ 88A795D5210678E000056542 /* SDLStaticIconNameSpec.m in Sources */,
1680B1131A9CD7AD00DBD79E /* SDLProtocolHeaderSpec.m in Sources */,
162E82D01A9BDE8A00906325 /* SDLButtonEventModeSpec.m in Sources */,
5DF40B26208FA7DE00DD6FDA /* SDLMenuManagerSpec.m in Sources */,
@@ -6649,6 +6856,7 @@
162E83391A9BDE8B00906325 /* SDLSetAppIconSpec.m in Sources */,
162E83011A9BDE8B00906325 /* SDLTimerModeSpec.m in Sources */,
5D0A9F931F15560B00CC80DD /* SDLNavigationCapabilitySpec.m in Sources */,
+ 5D64FE7120DA9E6700792F9F /* SDLStreamingAudioLifecycleManagerSpec.m in Sources */,
162E83891A9BDE8B00906325 /* SDLScreenParamsSpec.m in Sources */,
162E83441A9BDE8B00906325 /* SDLSystemRequestSpec.m in Sources */,
162E83001A9BDE8B00906325 /* SDLTextFieldNameSpec.m in Sources */,
@@ -6702,6 +6910,7 @@
EED5CA041F4D1D5E00F04000 /* SDLRAWH264PacketizerSpec.m in Sources */,
5DBAE0AB1D3588AC00CE00BF /* SDLNotificationDispatcherSpec.m in Sources */,
162E83461A9BDE8B00906325 /* SDLUnsubscribeButtonSpec.m in Sources */,
+ 1EB59CD0202DC9F200343A61 /* SDLSupportedSeatSpec.m in Sources */,
162E82EB1A9BDE8B00906325 /* SDLLayoutModeSpec.m in Sources */,
1680B1181A9CD7AD00DBD79E /* SDLV1ProtocolMessageSpec.m in Sources */,
162E82EC1A9BDE8B00906325 /* SDLLockScreenStatusSpec.m in Sources */,
@@ -6723,6 +6932,7 @@
88DFB053207F8E100079D19D /* Protocol+ProxyManagerDelegate.swift in Sources */,
88B849C820812442002A034D /* VehicleDataManager.swift in Sources */,
8829569E207CFD0E00EF056C /* AppDelegate.swift in Sources */,
+ 8880B2EF21021E37004721DB /* TextValidator.swift in Sources */,
88A0AA58207CFE650075132C /* ProxyManager.swift in Sources */,
88166B00207E41E900076236 /* MenuManager.swift in Sources */,
8814AEAC20AB667B00466E0F /* PerformInteractionManager.swift in Sources */,
@@ -7129,7 +7339,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SDLTestApp;
- PRODUCT_NAME = "SDL Example";
+ PRODUCT_NAME = "SDL Example Swift";
SWIFT_OBJC_BRIDGING_HEADER = "SmartDeviceLink_Example/SmartDeviceLink-Example-Swift-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0;
@@ -7148,7 +7358,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SDLTestApp;
- PRODUCT_NAME = "SDL Example";
+ PRODUCT_NAME = "SDL Example Swift";
SWIFT_OBJC_BRIDGING_HEADER = "SmartDeviceLink_Example/SmartDeviceLink-Example-Swift-Bridging-Header.h";
SWIFT_VERSION = 3.0;
};
diff --git a/SmartDeviceLink.podspec b/SmartDeviceLink.podspec
index d9e0e3a5e..75df37cae 100644
--- a/SmartDeviceLink.podspec
+++ b/SmartDeviceLink.podspec
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|
s.name = "SmartDeviceLink"
-s.version = "6.0.0"
+s.version = "6.0.1"
s.summary = "Connect your app with cars!"
s.homepage = "https://github.com/smartdevicelink/SmartDeviceLink-iOS"
s.license = { :type => "New BSD", :file => "LICENSE" }
@@ -91,6 +91,7 @@ ss.public_header_files = [
'SmartDeviceLink/SDLDriverDistractionState.h',
'SmartDeviceLink/SDLECallConfirmationStatus.h',
'SmartDeviceLink/SDLECallInfo.h',
+'SmartDeviceLink/SDLElectronicParkBrakeStatus.h',
'SmartDeviceLink/SDLEmergencyEvent.h',
'SmartDeviceLink/SDLEmergencyEventType.h',
'SmartDeviceLink/SDLEncodedSyncPData.h',
@@ -163,6 +164,11 @@ ss.public_header_files = [
'SmartDeviceLink/SDLMaintenanceModeStatus.h',
'SmartDeviceLink/SDLManager.h',
'SmartDeviceLink/SDLManagerDelegate.h',
+'SmartDeviceLink/SDLMassageCushionFirmness.h',
+'SmartDeviceLink/SDLMassageModeData.h',
+'SmartDeviceLink/SDLMassageCushion.h',
+'SmartDeviceLink/SDLMassageMode.h',
+'SmartDeviceLink/SDLMassageZone.h',
'SmartDeviceLink/SDLMediaClockFormat.h',
'SmartDeviceLink/SDLMenuCell.h',
'SmartDeviceLink/SDLMenuParams.h',
@@ -188,6 +194,7 @@ ss.public_header_files = [
'SmartDeviceLink/SDLOnLanguageChange.h',
'SmartDeviceLink/SDLOnLockScreenStatus.h',
'SmartDeviceLink/SDLOnPermissionsChange.h',
+'SmartDeviceLink/SDLOnRCStatus.h',
'SmartDeviceLink/SDLOnSyncPData.h',
'SmartDeviceLink/SDLOnSystemRequest.h',
'SmartDeviceLink/SDLOnTBTClientState.h',
@@ -244,6 +251,11 @@ ss.public_header_files = [
'SmartDeviceLink/SDLScreenManager.h',
'SmartDeviceLink/SDLScrollableMessage.h',
'SmartDeviceLink/SDLScrollableMessageResponse.h',
+'SmartDeviceLink/SDLSeatControlCapabilities.h',
+'SmartDeviceLink/SDLSeatControlData.h',
+'SmartDeviceLink/SDLSeatMemoryAction.h',
+'SmartDeviceLink/SDLSeatMemoryActionType.h',
+'SmartDeviceLink/SDLSupportedSeat.h',
'SmartDeviceLink/SDLSecurityType.h',
'SmartDeviceLink/SDLSendHapticData.h',
'SmartDeviceLink/SDLSendHapticDataResponse.h',
@@ -275,6 +287,7 @@ ss.public_header_files = [
'SmartDeviceLink/SDLSpeakResponse.h',
'SmartDeviceLink/SDLSpeechCapabilities.h',
'SmartDeviceLink/SDLStartTime.h',
+'SmartDeviceLink/SDLStaticIconName.h',
'SmartDeviceLink/SDLStreamingMediaConfiguration.h',
'SmartDeviceLink/SDLStreamingMediaManager.h',
'SmartDeviceLink/SDLStreamingMediaManagerConstants.h',
@@ -309,9 +322,11 @@ ss.public_header_files = [
'SmartDeviceLink/SDLTouchManager.h',
'SmartDeviceLink/SDLTouchManagerDelegate.h',
'SmartDeviceLink/SDLTouchType.h',
+'SmartDeviceLink/SDLTPMS.h',
'SmartDeviceLink/SDLTriggerSource.h',
'SmartDeviceLink/SDLTTSChunk.h',
'SmartDeviceLink/SDLTurn.h',
+'SmartDeviceLink/SDLTurnSignal.h',
'SmartDeviceLink/SDLUnregisterAppInterface.h',
'SmartDeviceLink/SDLUnregisterAppInterfaceResponse.h',
'SmartDeviceLink/SDLUnsubscribeButton.h',
@@ -336,6 +351,7 @@ ss.public_header_files = [
'SmartDeviceLink/SDLVideoStreamingCodec.h',
'SmartDeviceLink/SDLVideoStreamingFormat.h',
'SmartDeviceLink/SDLVideoStreamingProtocol.h',
+'SmartDeviceLink/SDLVideoStreamingState.h',
'SmartDeviceLink/SDLVoiceCommand.h',
'SmartDeviceLink/SDLVrCapabilities.h',
'SmartDeviceLink/SDLVrHelpItem.h',
diff --git a/SmartDeviceLink/SDLAddSubMenu.h b/SmartDeviceLink/SDLAddSubMenu.h
index 7a4471f60..bd5537c2d 100644
--- a/SmartDeviceLink/SDLAddSubMenu.h
+++ b/SmartDeviceLink/SDLAddSubMenu.h
@@ -3,6 +3,8 @@
#import "SDLRPCRequest.h"
+@class SDLImage;
+
/**
* Add a SDLSubMenu to the Command Menu
* <p>
@@ -23,7 +25,9 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName;
-- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName position:(UInt8)position;
+- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName position:(UInt8)position __deprecated_msg(("Use initWithId:menuName:menuIcon:position: instead"));
+
+- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName menuIcon:(nullable SDLImage *)icon position:(UInt8)position;
/**
* a Menu ID that identifies a sub menu
@@ -32,6 +36,7 @@ NS_ASSUME_NONNULL_BEGIN
* <p>
*/
@property (strong, nonatomic) NSNumber<SDLInt> *menuID;
+
/**
* a position of menu
* @discussion An NSNumber pointer representing the position within the items
@@ -50,13 +55,19 @@ NS_ASSUME_NONNULL_BEGIN
* the end of the list</li>
* </ul>
*/
-@property (nullable, strong, nonatomic) NSNumber<SDLInt> *position;
+@property (strong, nonatomic, nullable) NSNumber<SDLInt> *position;
+
/**
* a menuName which is displayed representing this submenu item
* @discussion NSString which will be displayed representing this submenu item
*/
@property (strong, nonatomic) NSString *menuName;
+/**
+ An image that is displayed alongside this submenu item
+ */
+@property (strong, nonatomic, nullable) SDLImage *menuIcon;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLAddSubMenu.m b/SmartDeviceLink/SDLAddSubMenu.m
index 4f8ef5109..2792b657d 100644
--- a/SmartDeviceLink/SDLAddSubMenu.m
+++ b/SmartDeviceLink/SDLAddSubMenu.m
@@ -3,6 +3,7 @@
#import "SDLAddSubMenu.h"
#import "NSMutableDictionary+Store.h"
+#import "SDLImage.h"
#import "SDLNames.h"
NS_ASSUME_NONNULL_BEGIN
@@ -15,18 +16,20 @@ NS_ASSUME_NONNULL_BEGIN
return self;
}
-
-- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName position:(UInt8)position {
+- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName menuIcon:(nullable SDLImage *)icon position:(UInt8)position {
self = [self initWithId:menuId menuName:menuName];
- if (!self) {
- return nil;
- }
+ if (!self) { return nil; }
self.position = @(position);
+ self.menuIcon = icon;
return self;
}
+- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName position:(UInt8)position {
+ return [self initWithId:menuId menuName:menuName menuIcon:nil position:position];
+}
+
- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName {
self = [self init];
if (!self) {
@@ -63,6 +66,14 @@ NS_ASSUME_NONNULL_BEGIN
return [parameters sdl_objectForName:SDLNameMenuName];
}
+- (void)setMenuIcon:(nullable SDLImage *)menuIcon {
+ [parameters sdl_setObject:menuIcon forName:SDLNameMenuIcon];
+}
+
+- (nullable SDLImage *)menuIcon {
+ return [parameters sdl_objectForName:SDLNameMenuIcon ofClass:[SDLImage class]];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLCarWindow.h b/SmartDeviceLink/SDLCarWindow.h
index 076f24b23..aaed77b35 100755
--- a/SmartDeviceLink/SDLCarWindow.h
+++ b/SmartDeviceLink/SDLCarWindow.h
@@ -8,7 +8,7 @@
#import <UIKit/UIKit.h>
@class SDLStreamingMediaConfiguration;
-@class SDLStreamingMediaLifecycleManager;
+@class SDLStreamingVideoLifecycleManager;
NS_ASSUME_NONNULL_BEGIN
@@ -24,7 +24,7 @@ NS_ASSUME_NONNULL_BEGIN
@param configuration The streaming media configuration
@return An instance of this class
*/
-- (instancetype)initWithStreamManager:(SDLStreamingMediaLifecycleManager *)streamManager configuration:(SDLStreamingMediaConfiguration *)configuration;
+- (instancetype)initWithStreamManager:(SDLStreamingVideoLifecycleManager *)streamManager configuration:(SDLStreamingMediaConfiguration *)configuration;
/**
* View Controller that will be streamed.
diff --git a/SmartDeviceLink/SDLCarWindow.m b/SmartDeviceLink/SDLCarWindow.m
index 448478fce..2d6c6f4b2 100755
--- a/SmartDeviceLink/SDLCarWindow.m
+++ b/SmartDeviceLink/SDLCarWindow.m
@@ -19,14 +19,14 @@
#import "SDLError.h"
#import "SDLStateMachine.h"
#import "SDLStreamingMediaConfiguration.h"
-#import "SDLStreamingMediaLifecycleManager.h"
+#import "SDLStreamingVideoLifecycleManager.h"
#import "SDLStreamingMediaManagerConstants.h"
NS_ASSUME_NONNULL_BEGIN
@interface SDLCarWindow ()
-@property (weak, nonatomic, nullable) SDLStreamingMediaLifecycleManager *streamManager;
+@property (weak, nonatomic, nullable) SDLStreamingVideoLifecycleManager *streamManager;
@property (assign, nonatomic) SDLCarWindowRenderingType renderingType;
@property (assign, nonatomic) BOOL drawsAfterScreenUpdates;
@@ -41,7 +41,7 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLCarWindow
-- (instancetype)initWithStreamManager:(SDLStreamingMediaLifecycleManager *)streamManager configuration:(nonnull SDLStreamingMediaConfiguration *)configuration {
+- (instancetype)initWithStreamManager:(SDLStreamingVideoLifecycleManager *)streamManager configuration:(nonnull SDLStreamingMediaConfiguration *)configuration {
self = [super init];
if (!self) { return nil; }
diff --git a/SmartDeviceLink/SDLElectronicParkBrakeStatus.h b/SmartDeviceLink/SDLElectronicParkBrakeStatus.h
new file mode 100644
index 000000000..c0faaad55
--- /dev/null
+++ b/SmartDeviceLink/SDLElectronicParkBrakeStatus.h
@@ -0,0 +1,35 @@
+// SDLElectronicParkBrakeStatus.h
+//
+
+
+#import "SDLEnum.h"
+
+/**
+ Reflects the status of the Electronic Parking Brake. A Vehicle Data Type.
+ */
+typedef SDLEnum SDLElectronicParkBrakeStatus SDL_SWIFT_ENUM;
+
+/**
+ Parking brake actuators have been fully applied.
+ */
+extern SDLElectronicParkBrakeStatus const SDLElectronicParkBrakeStatusClosed;
+
+/**
+ Parking brake actuators are transitioning to either Apply/Closed or Release/Open state.
+ */
+extern SDLElectronicParkBrakeStatus const SDLElectronicParkBrakeStatusTransition;
+
+/**
+ Parking brake actuators are released.
+ */
+extern SDLElectronicParkBrakeStatus const SDLElectronicParkBrakeStatusOpen;
+
+/**
+ When driver pulls the Electronic Parking Brake switch while driving "at speed".
+ */
+extern SDLElectronicParkBrakeStatus const SDLElectronicParkBrakeStatusDriveActive;
+
+/**
+ When system has a fault or is under maintenance.
+ */
+extern SDLElectronicParkBrakeStatus const SDLElectronicParkBrakeStatusFault;
diff --git a/SmartDeviceLink/SDLElectronicParkBrakeStatus.m b/SmartDeviceLink/SDLElectronicParkBrakeStatus.m
new file mode 100644
index 000000000..23b55caa3
--- /dev/null
+++ b/SmartDeviceLink/SDLElectronicParkBrakeStatus.m
@@ -0,0 +1,18 @@
+//
+// SDLElectronicParkBrakeStatus.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 7/16/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+#import "SDLElectronicParkBrakeStatus.h"
+
+typedef SDLEnum SDLElectronicParkBrakeStatus SDL_SWIFT_ENUM;
+
+
+SDLElectronicParkBrakeStatus const SDLElectronicParkBrakeStatusClosed = @"CLOSED";
+SDLElectronicParkBrakeStatus const SDLElectronicParkBrakeStatusTransition = @"TRANSITION";
+SDLElectronicParkBrakeStatus const SDLElectronicParkBrakeStatusOpen = @"OPEN";
+SDLElectronicParkBrakeStatus const SDLElectronicParkBrakeStatusDriveActive = @"DRIVE_ACTIVE";
+SDLElectronicParkBrakeStatus const SDLElectronicParkBrakeStatusFault = @"FAULT";
diff --git a/SmartDeviceLink/SDLFunctionID.m b/SmartDeviceLink/SDLFunctionID.m
index 7d50014e5..f96bc83c6 100644
--- a/SmartDeviceLink/SDLFunctionID.m
+++ b/SmartDeviceLink/SDLFunctionID.m
@@ -96,6 +96,7 @@ NS_ASSUME_NONNULL_BEGIN
@32782: SDLNameOnHashChange,
@32783: SDLNameOnInteriorVehicleData,
@32784: SDLNameOnWayPointChange,
+ @32785: SDLNameOnRCStatus,
@65536: SDLNameEncodedSyncPData,
@65537: SDLNameSyncPData,
@98304: SDLNameOnEncodedSyncPData,
diff --git a/SmartDeviceLink/SDLGetVehicleData.h b/SmartDeviceLink/SDLGetVehicleData.h
index 56e4d70ba..82b3f7ce4 100644
--- a/SmartDeviceLink/SDLGetVehicleData.h
+++ b/SmartDeviceLink/SDLGetVehicleData.h
@@ -47,7 +47,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param wiperStatus Get wiperStatus data
* @return A SDLGetVehicleData object
*/
-- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus: instead");
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus: instead");
/**
* Convenience init for getting data for all possible vehicle data items.
@@ -60,6 +60,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param deviceStatus Get deviceStatus data
* @param driverBraking Get driverBraking data
* @param eCallInfo Get eCallInfo data
+ * @param electronicParkBrakeStatus Get electronicParkBrakeStatus data
* @param emergencyEvent Get emergencyEvent data
* @param engineOilLife Get engineOilLife data
* @param engineTorque Get engineTorque data
@@ -77,11 +78,12 @@ NS_ASSUME_NONNULL_BEGIN
* @param speed Get speed data
* @param steeringWheelAngle Get steeringWheelAngle data
* @param tirePressure Get tirePressure data
+ * @param turnSignal Get turnSignal data
* @param vin Get vin data
* @param wiperStatus Get wiperStatus data
* @return A SDLGetVehicleData object
*/
-- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus;
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus;
/**
* A boolean value. If true, requests GPS data.
@@ -218,6 +220,16 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) NSNumber<SDLBool> *myKey;
+/**
+ A boolean value. If true, requests Electronic Parking Brake status data.
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *electronicParkBrakeStatus;
+
+/**
+ A boolean value. If true, requests Turn Signal data.
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *turnSignal;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLGetVehicleData.m b/SmartDeviceLink/SDLGetVehicleData.m
index 4be6846ad..6b795b057 100644
--- a/SmartDeviceLink/SDLGetVehicleData.m
+++ b/SmartDeviceLink/SDLGetVehicleData.m
@@ -18,10 +18,10 @@ NS_ASSUME_NONNULL_BEGIN
}
- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus {
- return [self initWithAccelerationPedalPosition:accelerationPedalPosition airbagStatus:airbagStatus beltStatus:beltStatus bodyInformation:bodyInformation clusterModeStatus:clusterModeStatus deviceStatus:deviceStatus driverBraking:driverBraking eCallInfo:eCallInfo emergencyEvent:emergencyEvent engineOilLife:NO engineTorque:engineTorque externalTemperature:externalTemperature fuelLevel:fuelLevel fuelLevelState:fuelLevelState fuelRange:NO gps:gps headLampStatus:headLampStatus instantFuelConsumption:instantFuelConsumption myKey:myKey odometer:odometer prndl:prndl rpm:rpm speed:speed steeringWheelAngle:steeringWheelAngle tirePressure:tirePressure vin:vin wiperStatus:wiperStatus];
+ return [self initWithAccelerationPedalPosition:accelerationPedalPosition airbagStatus:airbagStatus beltStatus:beltStatus bodyInformation:bodyInformation clusterModeStatus:clusterModeStatus deviceStatus:deviceStatus driverBraking:driverBraking eCallInfo:eCallInfo electronicParkBrakeStatus:NO emergencyEvent:emergencyEvent engineOilLife:NO engineTorque:engineTorque externalTemperature:externalTemperature fuelLevel:fuelLevel fuelLevelState:fuelLevelState fuelRange:NO gps:gps headLampStatus:headLampStatus instantFuelConsumption:instantFuelConsumption myKey:myKey odometer:odometer prndl:prndl rpm:rpm speed:speed steeringWheelAngle:steeringWheelAngle tirePressure:tirePressure turnSignal:NO vin:vin wiperStatus:wiperStatus];
}
-- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus {
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus {
self = [self init];
if (!self) {
return nil;
@@ -35,6 +35,7 @@ NS_ASSUME_NONNULL_BEGIN
self.deviceStatus = @(deviceStatus);
self.driverBraking = @(driverBraking);
self.eCallInfo = @(eCallInfo);
+ self.electronicParkBrakeStatus = @(electronicParkBrakeStatus);
self.emergencyEvent = @(emergencyEvent);
self.engineOilLife = @(engineOilLife);
self.engineTorque = @(engineTorque);
@@ -52,6 +53,7 @@ NS_ASSUME_NONNULL_BEGIN
self.speed = @(speed);
self.steeringWheelAngle = @(steeringWheelAngle);
self.tirePressure = @(tirePressure);
+ self.turnSignal = @(turnSignal);
self.vin = @(vin);
self.wiperStatus = @(wiperStatus);
@@ -274,6 +276,22 @@ NS_ASSUME_NONNULL_BEGIN
return [parameters sdl_objectForName:SDLNameMyKey];
}
+- (void)setElectronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus {
+ [parameters sdl_setObject:electronicParkBrakeStatus forName:SDLNameElectronicParkBrakeStatus];
+}
+
+- (nullable NSNumber<SDLBool> *)electronicParkBrakeStatus {
+ return [parameters sdl_objectForName:SDLNameElectronicParkBrakeStatus];
+}
+
+- (void)setTurnSignal:(nullable NSNumber<SDLBool> *)turnSignal {
+ [parameters sdl_setObject:turnSignal forName:SDLNameTurnSignal];
+}
+
+- (nullable NSNumber<SDLBool> *)turnSignal {
+ return [parameters sdl_objectForName:SDLNameTurnSignal];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLGetVehicleDataResponse.h b/SmartDeviceLink/SDLGetVehicleDataResponse.h
index 1c864a1b6..689a750f2 100644
--- a/SmartDeviceLink/SDLGetVehicleDataResponse.h
+++ b/SmartDeviceLink/SDLGetVehicleDataResponse.h
@@ -4,7 +4,9 @@
#import "SDLRPCResponse.h"
#import "SDLComponentVolumeStatus.h"
+#import "SDLElectronicParkBrakeStatus.h"
#import "SDLPRNDL.h"
+#import "SDLTurnSignal.h"
#import "SDLVehicleDataEventStatus.h"
#import "SDLWiperStatus.h"
@@ -169,6 +171,17 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) SDLMyKey *myKey;
+/**
+ The status of the electronic parking brake
+ */
+@property (nullable, strong, nonatomic) SDLElectronicParkBrakeStatus electronicParkBrakeStatus;
+
+/**
+ The status of the turn signal
+ */
+@property (nullable, strong, nonatomic) SDLTurnSignal turnSignal;
+
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLGetVehicleDataResponse.m b/SmartDeviceLink/SDLGetVehicleDataResponse.m
index 049dcb79c..9e8aeff6c 100644
--- a/SmartDeviceLink/SDLGetVehicleDataResponse.m
+++ b/SmartDeviceLink/SDLGetVehicleDataResponse.m
@@ -245,6 +245,22 @@ NS_ASSUME_NONNULL_BEGIN
return [parameters sdl_objectForName:SDLNameMyKey ofClass:SDLMyKey.class];
}
+- (void)setElectronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus {
+ [parameters sdl_setObject:electronicParkBrakeStatus forName:SDLNameElectronicParkBrakeStatus];
+}
+
+- (nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus {
+ return [parameters sdl_objectForName:SDLNameElectronicParkBrakeStatus];
+}
+
+- (void)setTurnSignal:(nullable SDLTurnSignal)turnSignal {
+ [parameters sdl_setObject:turnSignal forName:SDLNameTurnSignal];
+}
+
+- (nullable SDLTurnSignal)turnSignal {
+ return [parameters sdl_objectForName:SDLNameTurnSignal];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLImage.h b/SmartDeviceLink/SDLImage.h
index 3f404f76d..83a05b664 100644
--- a/SmartDeviceLink/SDLImage.h
+++ b/SmartDeviceLink/SDLImage.h
@@ -4,6 +4,7 @@
#import "SDLRPCMessage.h"
#import "SDLImageType.h"
+#import "SDLStaticIconName.h"
/**
* Specifies which image shall be used e.g. in SDLAlerts or on SDLSoftbuttons provided the display supports it.
@@ -60,6 +61,14 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithStaticImageValue:(UInt16)staticImageValue;
/**
+ * Convenience init for displaying a static image. Static images are already on-board SDL Core and can be used by providing the image's value.
+ *
+ * @param staticIconName A SDLStaticIconName value
+ * @return A SDLImage object
+ */
+- (instancetype)initWithStaticIconName:(SDLStaticIconName)staticIconName;
+
+/**
* The static hex icon value or the binary image file name identifier (sent by SDLPutFile)
*
* Required, max length = 65535
diff --git a/SmartDeviceLink/SDLImage.m b/SmartDeviceLink/SDLImage.m
index e04de1563..fcf05819a 100644
--- a/SmartDeviceLink/SDLImage.m
+++ b/SmartDeviceLink/SDLImage.m
@@ -50,6 +50,10 @@ NS_ASSUME_NONNULL_BEGIN
return [self initWithName:value ofType:SDLImageTypeStatic isTemplate:YES];
}
+- (instancetype)initWithStaticIconName:(SDLStaticIconName)staticIconName {
+ return [self initWithName:staticIconName ofType:SDLImageTypeStatic isTemplate:YES];
+}
+
#pragma mark - Getters / Setters
- (void)setValue:(NSString *)value {
diff --git a/SmartDeviceLink/SDLLifecycleManager.m b/SmartDeviceLink/SDLLifecycleManager.m
index c786007eb..dc85e918e 100644
--- a/SmartDeviceLink/SDLLifecycleManager.m
+++ b/SmartDeviceLink/SDLLifecycleManager.m
@@ -210,10 +210,6 @@ SDLLifecycleState *const SDLLifecycleStateReady = @"Ready";
self.proxy = [SDLProxy iapProxyWithListener:self.notificationDispatcher];
}
#pragma clang diagnostic pop
-
- if (self.streamManager != nil) {
- [self.streamManager startWithProtocol:self.proxy.protocol];
- }
}
- (void)didEnterStateStopped {
@@ -362,7 +358,11 @@ SDLLifecycleState *const SDLLifecycleStateReady = @"Ready";
dispatch_group_leave(managerGroup);
}];
- dispatch_group_enter(managerGroup);
+ if (self.streamManager != nil) {
+ [self.streamManager startWithProtocol:self.proxy.protocol];
+ }
+
+ dispatch_group_enter(managerGroup);
[self.screenManager startWithCompletionHandler:^(NSError * _Nullable error) {
if (error != nil) {
SDLLogW(@"Screen Manager was unable to start; error: %@", error);
@@ -679,7 +679,8 @@ SDLLifecycleState *const SDLLifecycleStateReady = @"Ready";
[self.lifecycleStateMachine transitionToState:SDLLifecycleStateStopped];
} else if ([self.lifecycleStateMachine isCurrentState:SDLLifecycleStateStopped]) {
return;
- } else if ([appUnregisteredNotification.reason isEqualToEnum:SDLAppInterfaceUnregisteredReasonAppUnauthorized]) {
+ } else if ([appUnregisteredNotification.reason isKindOfClass:[NSString class]] && [appUnregisteredNotification.reason isEqualToEnum:SDLAppInterfaceUnregisteredReasonAppUnauthorized]) {
+ // HAX: The string check is due to a core "feature" that could cause -1 to be sent as the enum value, which will crash here.
[self.lifecycleStateMachine transitionToState:SDLLifecycleStateStopped];
} else {
[self.lifecycleStateMachine transitionToState:SDLLifecycleStateReconnecting];
diff --git a/SmartDeviceLink/SDLLogFileModuleMap.m b/SmartDeviceLink/SDLLogFileModuleMap.m
index f2137cef9..218ffa42c 100644
--- a/SmartDeviceLink/SDLLogFileModuleMap.m
+++ b/SmartDeviceLink/SDLLogFileModuleMap.m
@@ -65,7 +65,7 @@
}
+ (SDLLogFileModule *)sdl_streamingMediaManagerModule {
- return [SDLLogFileModule moduleWithName:@"Streaming" files:[NSSet setWithArray:@[@"SDLH264VideoEncoder", @"SDLRAWH264Packetizer", @"SDLRTPH264Packetizer", @"SDLStreamingMediaManager", @"SDLStreamingMediaLifecycleManager", @"SDLTouchManager", @"SDLCarWindow"]]];
+ return [SDLLogFileModule moduleWithName:@"Streaming" files:[NSSet setWithArray:@[@"SDLH264VideoEncoder", @"SDLRAWH264Packetizer", @"SDLRTPH264Packetizer", @"SDLStreamingMediaManager", @"SDLStreamingAudioLifecycleManager", @"SDLStreamingVideoLifecycleManager", @"SDLTouchManager", @"SDLCarWindow"]]];
}
+ (SDLLogFileModule *)sdl_screenManagerModule {
diff --git a/SmartDeviceLink/SDLMassageCushion.h b/SmartDeviceLink/SDLMassageCushion.h
new file mode 100644
index 000000000..f4886d312
--- /dev/null
+++ b/SmartDeviceLink/SDLMassageCushion.h
@@ -0,0 +1,35 @@
+// SDLMassageCushion.h
+//
+
+#import "SDLEnum.h"
+
+/**
+ * The List possible cushions of a multi-contour massage seat.
+ */
+typedef SDLEnum SDLMassageCushion SDL_SWIFT_ENUM;
+
+/**
+ * @abstract TOP LUMBAR cushions of a multi-contour massage seat
+ */
+extern SDLMassageCushion const SDLMassageCushionTopLumbar;
+
+/**
+ * @abstract MIDDLE LUMBAR cushion of a multi-contour massage seat
+ */
+extern SDLMassageCushion const SDLMassageCushionMiddleLumbar;
+
+/**
+ * @abstract BOTTOM LUMBAR cushion of a multi-contour massage seat
+ */
+extern SDLMassageCushion const SDLMassageCushionBottomLumbar;
+
+/**
+ * @abstract BACK BOLSTERS cushion of a multi-contour massage seat
+ */
+extern SDLMassageCushion const SDLMassageCushionBackBolsters;
+
+/**
+ * @abstract SEAT BOLSTERS cushion of a multi-contour massage seat
+ */
+extern SDLMassageCushion const SDLMassageCushionSeatBolsters;
+
diff --git a/SmartDeviceLink/SDLMassageCushion.m b/SmartDeviceLink/SDLMassageCushion.m
new file mode 100644
index 000000000..0b8162619
--- /dev/null
+++ b/SmartDeviceLink/SDLMassageCushion.m
@@ -0,0 +1,10 @@
+// SDLMassageCushion.m
+//
+
+#import "SDLMassageCushion.h"
+
+SDLMassageCushion const SDLMassageCushionTopLumbar = @"TOP_LUMBAR";
+SDLMassageCushion const SDLMassageCushionMiddleLumbar = @"MIDDLE_LUMBAR";
+SDLMassageCushion const SDLMassageCushionBottomLumbar = @"BOTTOM_LUMBAR";
+SDLMassageCushion const SDLMassageCushionBackBolsters = @"BACK_BOLSTERS";
+SDLMassageCushion const SDLMassageCushionSeatBolsters = @"SEAT_BOLSTERS";
diff --git a/SmartDeviceLink/SDLMassageCushionFirmness.h b/SmartDeviceLink/SDLMassageCushionFirmness.h
new file mode 100644
index 000000000..d8bb5d48c
--- /dev/null
+++ b/SmartDeviceLink/SDLMassageCushionFirmness.h
@@ -0,0 +1,40 @@
+// SDLMassageCushionFirmness.h
+//
+
+#import "SDLRPCStruct.h"
+#import "SDLMassageCushion.h"
+/**
+ * The intensity or firmness of a cushion.
+ */
+
+NS_ASSUME_NONNULL_BEGIN
+@interface SDLMassageCushionFirmness : SDLRPCStruct
+
+
+/**
+ Constructs a newly allocated SDLMassageCushionFirmness object with cushion and firmness
+
+ @param cushion The cushion type for a multi-contour massage seat
+ @param firmness The firmness value for the multi-contour massage seat, MinValue: 0 MaxValue: 100
+ @return An instance of the SDLMassageCushionFirmness class
+ */
+- (instancetype)initWithMassageCushion:(SDLMassageCushion)cushion firmness:(UInt8)firmness;
+
+/**
+ * @abstract cushion of a multi-contour massage seat.
+ *
+ * @see SDLMassageCushion
+ */
+@property (strong, nonatomic) SDLMassageCushion cushion;
+
+/**
+ * @abstract zone of a multi-contour massage seat.
+ *
+ * Required, MinValue: 0 MaxValue: 100
+ *
+ */
+@property (strong, nonatomic) NSNumber<SDLInt> *firmness;
+@end
+
+NS_ASSUME_NONNULL_END
+
diff --git a/SmartDeviceLink/SDLMassageCushionFirmness.m b/SmartDeviceLink/SDLMassageCushionFirmness.m
new file mode 100644
index 000000000..480f13184
--- /dev/null
+++ b/SmartDeviceLink/SDLMassageCushionFirmness.m
@@ -0,0 +1,42 @@
+// SDLMassageCushionFirmness.m
+//
+
+#import "SDLNames.h"
+#import "SDLMassageCushionFirmness.h"
+#import "NSMutableDictionary+Store.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLMassageCushionFirmness
+
+- (instancetype)initWithMassageCushion:(SDLMassageCushion)cushion firmness:(UInt8)firmness {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ self.cushion = cushion;
+ self.firmness = @(firmness);
+
+ return self;
+}
+
+- (void)setCushion:(SDLMassageCushion)cushion {
+ [store sdl_setObject:cushion forName:SDLNameCushion];
+}
+
+- (SDLMassageCushion)cushion {
+ return [store sdl_objectForName:SDLNameCushion];
+}
+
+- (void)setFirmness:(NSNumber<SDLInt> *)firmness {
+ [store sdl_setObject:firmness forName:SDLNameFirmness];
+}
+
+- (NSNumber<SDLInt> *)firmness {
+ return [store sdl_objectForName:SDLNameFirmness];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLMassageMode.h b/SmartDeviceLink/SDLMassageMode.h
new file mode 100644
index 000000000..bcd0055ee
--- /dev/null
+++ b/SmartDeviceLink/SDLMassageMode.h
@@ -0,0 +1,25 @@
+// SDLMassageMode.h
+//
+
+#import "SDLEnum.h"
+
+/**
+ * The List possible modes of a massage zone.
+ */
+typedef SDLEnum SDLMassageMode SDL_SWIFT_ENUM;
+
+/**
+ * @abstract Massage Mode Status : OFF
+ */
+extern SDLMassageMode const SDLMassageModeOff;
+
+/**
+ * @abstract Massage Mode Status : LOW
+ */
+extern SDLMassageMode const SDLMassageModeLow;
+
+/**
+ * @abstract Massage Mode Status : HIGH
+ */
+extern SDLMassageMode const SDLMassageModeHigh;
+
diff --git a/SmartDeviceLink/SDLMassageMode.m b/SmartDeviceLink/SDLMassageMode.m
new file mode 100644
index 000000000..782aa6681
--- /dev/null
+++ b/SmartDeviceLink/SDLMassageMode.m
@@ -0,0 +1,9 @@
+// SDLMassageMode.m
+//
+
+#import "SDLMassageMode.h"
+
+SDLMassageMode const SDLMassageModeOff = @"OFF";
+SDLMassageMode const SDLMassageModeLow = @"LOW";
+SDLMassageMode const SDLMassageModeHigh = @"HIGH";
+
diff --git a/SmartDeviceLink/SDLMassageModeData.h b/SmartDeviceLink/SDLMassageModeData.h
new file mode 100644
index 000000000..25d3d0dfa
--- /dev/null
+++ b/SmartDeviceLink/SDLMassageModeData.h
@@ -0,0 +1,39 @@
+// SDLMassageModeData.h
+//
+
+#import "SDLRPCStruct.h"
+#import "SDLMassageZone.h"
+#import "SDLMassageMode.h"
+
+/**
+ * Specify the mode of a massage zone.
+ */
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLMassageModeData : SDLRPCStruct
+
+/**
+ * @abstract Constructs a newly allocated SDLMassageModeData object with massageMode and massageZone
+ */
+- (instancetype)initWithMassageMode:(SDLMassageMode)massageMode massageZone:(SDLMassageZone)massageZone;
+
+/**
+* @abstract mode of a massage zone
+*
+* @see SDLMassageMode
+*
+*/
+@property (strong, nonatomic) SDLMassageMode massageMode;
+
+/**
+ * @abstract zone of a multi-contour massage seat.
+ *
+ * @see SDLMassageZone
+ *
+ */
+@property (strong, nonatomic) SDLMassageZone massageZone;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLMassageModeData.m b/SmartDeviceLink/SDLMassageModeData.m
new file mode 100644
index 000000000..83046f3f2
--- /dev/null
+++ b/SmartDeviceLink/SDLMassageModeData.m
@@ -0,0 +1,41 @@
+// SDLMassageModeData.m
+//
+
+#import "SDLNames.h"
+#import "SDLMassageModeData.h"
+#import "NSMutableDictionary+Store.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLMassageModeData
+
+- (instancetype)initWithMassageMode:(SDLMassageMode)massageMode massageZone:(SDLMassageZone)massageZone {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ self.massageMode = massageMode;
+ self.massageZone = massageZone;
+
+ return self;
+}
+
+- (void)setMassageMode:(SDLMassageMode)massageMode {
+ [store sdl_setObject:massageMode forName:SDLNameMassageMode];
+}
+
+- (SDLMassageMode)massageMode {
+ return [store sdl_objectForName:SDLNameMassageMode];
+}
+
+- (void)setMassageZone:(SDLMassageZone)massageZone {
+ [store sdl_setObject:massageZone forName:SDLNameMassageZone];
+}
+
+- (SDLMassageZone)massageZone {
+ return [store sdl_objectForName:SDLNameMassageZone];
+}
+
+@end
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLMassageZone.h b/SmartDeviceLink/SDLMassageZone.h
new file mode 100644
index 000000000..06b7aa438
--- /dev/null
+++ b/SmartDeviceLink/SDLMassageZone.h
@@ -0,0 +1,20 @@
+// SDLMassageZone.h
+//
+
+#import "SDLEnum.h"
+
+/**
+ * List possible zones of a multi-contour massage seat.
+ */
+typedef SDLEnum SDLMassageZone SDL_SWIFT_ENUM;
+
+/**
+ * @abstract The back of a multi-contour massage seat. or SEAT_BACK
+ */
+extern SDLMassageZone const SDLMassageZoneLumbar;
+
+/**
+ * @abstract The bottom a multi-contour massage seat. or SEAT_BOTTOM
+ */
+extern SDLMassageZone const SDLMassageZoneSeatCushion;
+
diff --git a/SmartDeviceLink/SDLMassageZone.m b/SmartDeviceLink/SDLMassageZone.m
new file mode 100644
index 000000000..26f9e0a85
--- /dev/null
+++ b/SmartDeviceLink/SDLMassageZone.m
@@ -0,0 +1,7 @@
+// SDLMassageZone.m
+//
+
+#import "SDLMassageZone.h"
+
+SDLMassageZone const SDLMassageZoneLumbar = @"LUMBAR";
+SDLMassageZone const SDLMassageZoneSeatCushion = @"SEAT_CUSHION";
diff --git a/SmartDeviceLink/SDLMenuCell.h b/SmartDeviceLink/SDLMenuCell.h
index 80edc70b1..1c9c8dcbc 100644
--- a/SmartDeviceLink/SDLMenuCell.h
+++ b/SmartDeviceLink/SDLMenuCell.h
@@ -43,8 +43,35 @@ typedef void(^SDLMenuCellSelectionHandler)(SDLTriggerSource triggerSource);
*/
@property (copy, nonatomic, readonly, nullable) NSArray<SDLMenuCell *> *subCells;
+/**
+ Create a menu cell that has no subcells.
+
+ @param title The cell's primary text
+ @param icon The cell's image
+ @param voiceCommands Voice commands that will activate the menu cell
+ @param handler The code that will be run when the menu cell is selected
+ @return The menu cell
+ */
- (instancetype)initWithTitle:(NSString *)title icon:(nullable SDLArtwork *)icon voiceCommands:(nullable NSArray<NSString *> *)voiceCommands handler:(SDLMenuCellSelectionHandler)handler;
-- (instancetype)initWithTitle:(NSString *)title subCells:(NSArray<SDLMenuCell *> *)subCells;
+
+/**
+ Create a menu cell that has subcells and when selected will go into a deeper part of the menu
+
+ @param title The cell's primary text
+ @param subCells The subcells that will appear when the cell is selected
+ @return The menu cell
+ */
+- (instancetype)initWithTitle:(NSString *)title subCells:(NSArray<SDLMenuCell *> *)subCells __deprecated_msg(("Use initWithTitle:icon:subcells: instead"));
+
+/**
+ Create a menu cell that has subcells and when selected will go into a deeper part of the menu
+
+ @param title The cell's primary text
+ @param icon The cell's image
+ @param subCells The subcells that will appear when the cell is selected
+ @return The menu cell
+ */
+- (instancetype)initWithTitle:(NSString *)title icon:(nullable SDLArtwork *)icon subCells:(NSArray<SDLMenuCell *> *)subCells;
@end
diff --git a/SmartDeviceLink/SDLMenuCell.m b/SmartDeviceLink/SDLMenuCell.m
index 0d2d9f03e..cc7bfd53c 100644
--- a/SmartDeviceLink/SDLMenuCell.m
+++ b/SmartDeviceLink/SDLMenuCell.m
@@ -37,10 +37,15 @@ NS_ASSUME_NONNULL_BEGIN
}
- (instancetype)initWithTitle:(NSString *)title subCells:(NSArray<SDLMenuCell *> *)subCells {
+ return [self initWithTitle:title icon:nil subCells:subCells];
+}
+
+- (instancetype)initWithTitle:(NSString *)title icon:(nullable SDLArtwork *)icon subCells:(NSArray<SDLMenuCell *> *)subCells {
self = [super init];
if (!self) { return nil; }
_title = title;
+ _icon = icon;
_subCells = subCells;
_cellId = UINT32_MAX;
diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m
index cc4debb0b..82a6ea2b3 100644
--- a/SmartDeviceLink/SDLMenuManager.m
+++ b/SmartDeviceLink/SDLMenuManager.m
@@ -318,7 +318,7 @@ UInt32 const MenuCellIdMin = 1;
NSMutableArray<SDLRPCRequest *> *mutableCommands = [NSMutableArray array];
[cells enumerateObjectsUsingBlock:^(SDLMenuCell * _Nonnull cell, NSUInteger index, BOOL * _Nonnull stop) {
if (cell.subCells.count > 0) {
- [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cell position:(UInt16)index]];
+ [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cell withArtwork:shouldHaveArtwork position:(UInt16)index]];
} else {
[mutableCommands addObject:[self sdl_commandForMenuCell:cell withArtwork:shouldHaveArtwork position:(UInt16)index]];
}
@@ -342,7 +342,7 @@ UInt32 const MenuCellIdMin = 1;
NSMutableArray<SDLRPCRequest *> *mutableCommands = [NSMutableArray array];
[cells enumerateObjectsUsingBlock:^(SDLMenuCell * _Nonnull cell, NSUInteger index, BOOL * _Nonnull stop) {
if (cell.subCells.count > 0) {
- [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cell position:(UInt16)index]];
+ [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cell withArtwork:shouldHaveArtwork position:(UInt16)index]];
[mutableCommands addObjectsFromArray:[self sdl_allCommandsForCells:cell.subCells withArtwork:shouldHaveArtwork]];
} else {
[mutableCommands addObject:[self sdl_commandForMenuCell:cell withArtwork:shouldHaveArtwork position:(UInt16)index]];
@@ -368,11 +368,9 @@ UInt32 const MenuCellIdMin = 1;
return command;
}
-- (SDLAddSubMenu *)sdl_subMenuCommandForMenuCell:(SDLMenuCell *)cell position:(UInt16)position {
- SDLAddSubMenu *submenu = [[SDLAddSubMenu alloc] initWithId:cell.cellId menuName:cell.title];
- submenu.position = @(position);
-
- return submenu;
+- (SDLAddSubMenu *)sdl_subMenuCommandForMenuCell:(SDLMenuCell *)cell withArtwork:(BOOL)shouldHaveArtwork position:(UInt16)position {
+ SDLImage *icon = (shouldHaveArtwork && (cell.icon.name != nil)) ? [[SDLImage alloc] initWithName:cell.icon.name isTemplate:cell.icon.isTemplate] : nil;
+ return [[SDLAddSubMenu alloc] initWithId:cell.cellId menuName:cell.title menuIcon:icon position:(UInt8)position];
}
#pragma mark - Calling handlers
diff --git a/SmartDeviceLink/SDLModuleData.h b/SmartDeviceLink/SDLModuleData.h
index fb4a9ecf4..846d9852a 100644
--- a/SmartDeviceLink/SDLModuleData.h
+++ b/SmartDeviceLink/SDLModuleData.h
@@ -7,6 +7,7 @@
@class SDLRadioControlData;
@class SDLClimateControlData;
+@class SDLSeatControlData;
NS_ASSUME_NONNULL_BEGIN
@@ -15,10 +16,31 @@ NS_ASSUME_NONNULL_BEGIN
*/
@interface SDLModuleData : SDLRPCStruct
+/**
+ Constructs a newly allocated SDLModuleData object with radio control data
+
+ @param radioControlData The radio control data
+ @return An instance of the SDLModuleData class
+ */
- (instancetype)initWithRadioControlData:(SDLRadioControlData *)radioControlData;
+
+/**
+ Constructs a newly allocated SDLModuleData object with climate control data
+
+ @param climateControlData The climate control data
+ @return An instance of the SDLModuleData class
+ */
- (instancetype)initWithClimateControlData:(SDLClimateControlData *)climateControlData;
/**
+ Constructs a newly allocated SDLModuleData object with seat control data
+
+ @param seatControlData The seat control data
+ @return An instance of the SDLModuleData class
+ */
+- (instancetype)initWithSeatControlData:(SDLSeatControlData *)seatControlData;
+
+/**
The moduleType indicates which type of data should be changed and identifies which data object exists in this struct.
For example, if the moduleType is CLIMATE then a "climateControlData" should exist
@@ -41,6 +63,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) SDLClimateControlData *climateControlData;
+/**
+ The seat control data
+
+ Optional
+ */
+@property (nullable, strong, nonatomic) SDLSeatControlData *seatControlData;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLModuleData.m b/SmartDeviceLink/SDLModuleData.m
index 3d3789639..fd45e9538 100644
--- a/SmartDeviceLink/SDLModuleData.m
+++ b/SmartDeviceLink/SDLModuleData.m
@@ -6,6 +6,7 @@
#import "SDLNames.h"
#import "SDLClimateControlData.h"
#import "SDLRadioControlData.h"
+#import "SDLSeatControlData.h"
#import "NSMutableDictionary+Store.h"
NS_ASSUME_NONNULL_BEGIN
@@ -36,6 +37,18 @@ NS_ASSUME_NONNULL_BEGIN
return self;
}
+- (instancetype)initWithSeatControlData:(SDLSeatControlData *)seatControlData {
+ self = [self init];
+ if(!self){
+ return nil;
+ }
+
+ self.moduleType = SDLModuleTypeSeat;
+ self.seatControlData = seatControlData;
+
+ return self;
+}
+
- (void)setModuleType:(SDLModuleType)moduleType {
[store sdl_setObject:moduleType forName:SDLNameModuleType];
}
@@ -60,6 +73,15 @@ NS_ASSUME_NONNULL_BEGIN
return [store sdl_objectForName:SDLNameClimateControlData ofClass:SDLClimateControlData.class];
}
+- (void)setSeatControlData:(nullable SDLSeatControlData *)seatControlData {
+ [store sdl_setObject:seatControlData forName:SDLNameSeatControlData];
+}
+
+- (nullable SDLSeatControlData *)seatControlData {
+ return [store sdl_objectForName:SDLNameSeatControlData ofClass:SDLSeatControlData.class];
+}
+
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLModuleType.h b/SmartDeviceLink/SDLModuleType.h
index 508c2fbaa..412fb6099 100644
--- a/SmartDeviceLink/SDLModuleType.h
+++ b/SmartDeviceLink/SDLModuleType.h
@@ -18,3 +18,8 @@ extern SDLModuleType const SDLModuleTypeClimate;
* A SDLModuleType with the value of *RADIO*
*/
extern SDLModuleType const SDLModuleTypeRadio;
+
+/**
+ * @abstract A SDLModuleType with the value of *SEAT*
+ */
+extern SDLModuleType const SDLModuleTypeSeat;
diff --git a/SmartDeviceLink/SDLModuleType.m b/SmartDeviceLink/SDLModuleType.m
index 30744e0c2..f659a2f4f 100644
--- a/SmartDeviceLink/SDLModuleType.m
+++ b/SmartDeviceLink/SDLModuleType.m
@@ -6,3 +6,4 @@
SDLModuleType const SDLModuleTypeClimate = @"CLIMATE";
SDLModuleType const SDLModuleTypeRadio = @"RADIO";
+SDLModuleType const SDLModuleTypeSeat = @"SEAT";
diff --git a/SmartDeviceLink/SDLNames.h b/SmartDeviceLink/SDLNames.h
index 3e116560e..c2522d2f8 100644
--- a/SmartDeviceLink/SDLNames.h
+++ b/SmartDeviceLink/SDLNames.h
@@ -13,6 +13,7 @@ extern SDLName const SDLNameACEnableAvailable;
extern SDLName const SDLNameACMaxEnable;
extern SDLName const SDLNameACMaxEnableAvailable;
extern SDLName const SDLNameAccelerationPedalPosition;
+extern SDLName const SDLNameAction;
extern SDLName const SDLNameActual;
extern SDLName const SDLNameAddCommand;
extern SDLName const SDLNameAddress;
@@ -26,6 +27,7 @@ extern SDLName const SDLNameAlertText1;
extern SDLName const SDLNameAlertText2;
extern SDLName const SDLNameAlertText3;
extern SDLName const SDLNameAlignment;
+extern SDLName const SDLNameAllocatedModules;
extern SDLName const SDLNameAllowed;
extern SDLName const SDLNameAltitude;
extern SDLName const SDLNameAmbientLightSensorStatus;
@@ -50,6 +52,10 @@ extern SDLName const SDLNameAuxECallNotificationStatus;
extern SDLName const SDLNameAvailableHDs;
extern SDLName const SDLNameAvailableHDsAvailable;
extern SDLName const SDLNameBackgroundColor;
+extern SDLName const SDLNameBackTiltAngle;
+extern SDLName const SDLNameBackTiltAngleAvailable;
+extern SDLName const SDLNameBackVerticalPosition;
+extern SDLName const SDLNameBackVerticalPositionAvailable;
extern SDLName const SDLNameBand;
extern SDLName const SDLNameBatteryLevelStatus;
extern SDLName const SDLNameBeltStatus;
@@ -63,6 +69,10 @@ extern SDLName const SDLNameButtonEventMode;
extern SDLName const SDLNameButtonName;
extern SDLName const SDLNameButtonPress;
extern SDLName const SDLNameButtonPressMode;
+extern SDLName const SDLNameCoolingEnabled;
+extern SDLName const SDLNameCoolingEnabledAvailable;
+extern SDLName const SDLNameCoolingLevel;
+extern SDLName const SDLNameCoolingLevelAvailable;
extern SDLName const SDLNameCoordinate;
extern SDLName const SDLNameCallActive;
extern SDLName const SDLNameCarModeStatus;
@@ -86,6 +96,7 @@ extern SDLName const SDLNameCountryName;
extern SDLName const SDLNameCreateInteractionChoiceSet;
extern SDLName const SDLNameClockText;
extern SDLName const SDLNameCurrentTemperature;
+extern SDLName const SDLNameCushion;
extern SDLName const SDLNameCustomButtonId;
extern SDLName const SDLNameCustomPresets;
extern SDLName const SDLNameData;
@@ -139,6 +150,7 @@ extern SDLName const SDLNameECallInfo;
extern SDLName const SDLNameECallNotificationStatus;
extern SDLName const SDLNameECUHeader;
extern SDLName const SDLNameECUName;
+extern SDLName const SDLNameElectronicParkBrakeStatus;
extern SDLName const SDLNameEmergencyEvent;
extern SDLName const SDLNameEmergencyEventType;
extern SDLName const SDLNameEncodedSyncPData;
@@ -154,9 +166,13 @@ extern SDLName const SDLNameFanSpeedAvailable;
extern SDLName const SDLNameFilename;
extern SDLName const SDLNameFilenames;
extern SDLName const SDLNameFileType;
+extern SDLName const SDLNameFirmness;
extern SDLName const SDLNameFirmwareRevision;
+extern SDLName const SDLNameFreeModules;
extern SDLName const SDLNameFrequencyInteger;
extern SDLName const SDLNameFrequencyFraction;
+extern SDLName const SDLNameFrontVerticalPosition;
+extern SDLName const SDLNameFrontVerticalPositionAvailable;
extern SDLName const SDLNameFuelCutoffStatus;
extern SDLName const SDLNameFuelLevel;
extern SDLName const SDLNameFuelLevelState;
@@ -180,8 +196,18 @@ extern SDLName const SDLNameHashId;
extern SDLName const SDLNameHDOP;
extern SDLName const SDLNameHDChannel;
extern SDLName const SDLNameHDChannelAvailable;
+extern SDLName const SDLNameHDRadioEnable;
+extern SDLName const SDLNameHDRadioEnableAvailable;
extern SDLName const SDLNameHeading;
extern SDLName const SDLNameHeadLampStatus;
+extern SDLName const SDLNameHeadSupportHorizontalPosition;
+extern SDLName const SDLNameHeadSupportHorizontalPositionAvailable;
+extern SDLName const SDLNameHeadSupportVerticalPosition;
+extern SDLName const SDLNameHeadSupportVerticalPositionAvailable;
+extern SDLName const SDLNameHeatingLevel;
+extern SDLName const SDLNameHeatingLevelAvailable;
+extern SDLName const SDLNameHeatingEnabled;
+extern SDLName const SDLNameHeatingEnabledAvailable;
extern SDLName const SDLNameHeight;
extern SDLName const SDLNameHelpPrompt;
extern SDLName const SDLNameHighBeamsOn;
@@ -191,6 +217,8 @@ extern SDLName const SDLNameHMILevel;
extern SDLName const SDLNameHMIPermissions;
extern SDLName const SDLNameHMICapabilities;
extern SDLName const SDLNameHMIZoneCapabilities;
+extern SDLName const SDLNameHorizontalPosition;
+extern SDLName const SDLNameHorizontalPositionAvailable;
extern SDLName const SDLNameHour;
extern SDLName const SDLNameHours;
extern SDLName const SDLNameId;
@@ -219,6 +247,7 @@ extern SDLName const SDLNameIsSubscribed;
extern SDLName const SDLNameKeyboardLayout;
extern SDLName const SDLNameKeyboardProperties;
extern SDLName const SDLNameKeypressMode;
+extern SDLName const SDLNameLabel;
extern SDLName const SDLNameLanguage;
extern SDLName const SDLNameLanguageDesired;
extern SDLName const SDLNameLatitudeDegrees;
@@ -252,6 +281,14 @@ extern SDLName const SDLNameMajorVersion;
extern SDLName const SDLNameMake;
extern SDLName const SDLNameManeuverComplete;
extern SDLName const SDLNameManualTextEntry;
+extern SDLName const SDLNameMassageCushionFirmness;
+extern SDLName const SDLNameMassageCushionFirmnessAvailable;
+extern SDLName const SDLNameMassageEnabled;
+extern SDLName const SDLNameMassageEnabledAvailable;
+extern SDLName const SDLNameMassageMode;
+extern SDLName const SDLNameMassageModeAvailable;
+extern SDLName const SDLNameMemoryAvailable;
+extern SDLName const SDLNameMassageZone;
extern SDLName const SDLNameMaxBitrate;
extern SDLName const SDLNameMaxDuration;
extern SDLName const SDLNameMaximumChangeVelocity;
@@ -259,6 +296,7 @@ extern SDLName const SDLNameMaxNumberRFCOMMPorts;
extern SDLName const SDLNameMediaClock;
extern SDLName const SDLNameMediaClockFormats;
extern SDLName const SDLNameMediaTrack;
+extern SDLName const SDLNameMemory;
extern SDLName const SDLNameMenuIcon;
extern SDLName const SDLNameMenuId;
extern SDLName const SDLNameMenuName;
@@ -316,6 +354,7 @@ extern SDLName const SDLNameOnKeyboardInput;
extern SDLName const SDLNameOnLanguageChange;
extern SDLName const SDLNameOnLockScreenStatus;
extern SDLName const SDLNameOnPermissionsChange;
+extern SDLName const SDLNameOnRCStatus;
extern SDLName const SDLNameOnScreenPresetsAvailable;
extern SDLName const SDLNameOnSyncPData;
extern SDLName const SDLNameOnSystemRequest;
@@ -416,6 +455,8 @@ extern SDLName const SDLNameScrollableMessage;
extern SDLName const SDLNameScrollableMessageBody;
extern SDLName const SDLNameSDLVersion;
extern SDLName const SDLNameSearchAddress;
+extern SDLName const SDLNameSeatControlData;
+extern SDLName const SDLNameSeatControlCapabilities;
extern SDLName const SDLNameSecondaryColor;
extern SDLName const SDLNameSecondaryGraphic;
extern SDLName const SDLNameSecondaryImage;
@@ -440,6 +481,7 @@ extern SDLName const SDLNameSignalChangeThreshold;
extern SDLName const SDLNameSignalChangeThresholdAvailable;
extern SDLName const SDLNameSignalStrength;
extern SDLName const SDLNameSignalStrengthAvailable;
+extern SDLName const SDLNameSiriusXMRadioAvailable;
extern SDLName const SDLNameSlider;
extern SDLName const SDLNameSliderFooter;
extern SDLName const SDLNameSliderHeader;
@@ -496,6 +538,7 @@ extern SDLName const SDLNameTimezoneMinuteOffset;
extern SDLName const SDLNameTirePressure;
extern SDLName const SDLNameTotalDistance;
extern SDLName const SDLNameTouchEventAvailable;
+extern SDLName const SDLNameTPMS;
extern SDLName const SDLNameTrafficProgramIdentification;
extern SDLName const SDLNameTriggerSource;
extern SDLName const SDLNameTrim;
@@ -505,6 +548,7 @@ extern SDLName const SDLNameTTSChunks;
extern SDLName const SDLNameTTSName;
extern SDLName const SDLNameTurnIcon;
extern SDLName const SDLNameTurnList;
+extern SDLName const SDLNameTurnSignal;
extern SDLName const SDLNameType;
extern SDLName const SDLNameUnit;
extern SDLName const SDLNameUnregisterAppInterface;
@@ -528,10 +572,13 @@ extern SDLName const SDLNameUTCYear;
extern SDLName const SDLNameValue;
extern SDLName const SDLNameVDOP;
extern SDLName const SDLNameVehicleType;
+extern SDLName const SDLNameVerticalPosition;
+extern SDLName const SDLNameVerticalPositionAvailable;
extern SDLName const SDLNameVideoCodec;
extern SDLName const SDLNameVideoProtocol;
extern SDLName const SDLNameVideoStreaming;
extern SDLName const SDLNameVideoStreamingCapability;
+extern SDLName const SDLNameVideoStreamingState;
extern SDLName const SDLNameVentilationMode;
extern SDLName const SDLNameVentilationModeAvailable;
extern SDLName const SDLNameVIN;
diff --git a/SmartDeviceLink/SDLNames.m b/SmartDeviceLink/SDLNames.m
index 9059ee1e4..12a175c84 100644
--- a/SmartDeviceLink/SDLNames.m
+++ b/SmartDeviceLink/SDLNames.m
@@ -11,6 +11,7 @@ SDLName const SDLNameACEnableAvailable = @"acEnableAvailable";
SDLName const SDLNameACMaxEnable = @"acMaxEnable";
SDLName const SDLNameACMaxEnableAvailable = @"acMaxEnableAvailable";
SDLName const SDLNameAccelerationPedalPosition = @"accPedalPosition";
+SDLName const SDLNameAction = @"action";
SDLName const SDLNameActual = @"actual";
SDLName const SDLNameAddCommand = @"AddCommand";
SDLName const SDLNameAddress = @"address";
@@ -25,6 +26,7 @@ SDLName const SDLNameAlertText2 = @"alertText2";
SDLName const SDLNameAlertText3 = @"alertText3";
SDLName const SDLNameAlignment = @"alignment";
SDLName const SDLNameAllowed = @"allowed";
+SDLName const SDLNameAllocatedModules = @"allocatedModules";
SDLName const SDLNameAltitude = @"altitude";
SDLName const SDLNameAmbientLightSensorStatus = @"ambientLightSensorStatus";
SDLName const SDLNameAmbientLightStatus = @"ambientLightStatus";
@@ -48,6 +50,10 @@ SDLName const SDLNameAuxECallNotificationStatus = @"auxECallNotificationStatus";
SDLName const SDLNameAvailableHDs = @"availableHDs";
SDLName const SDLNameAvailableHDsAvailable = @"availableHDsAvailable";
SDLName const SDLNameBackgroundColor = @"backgroundColor";
+SDLName const SDLNameBackTiltAngle = @"backTiltAngle";
+SDLName const SDLNameBackTiltAngleAvailable = @"backTiltAngleAvailable";
+SDLName const SDLNameBackVerticalPosition = @"backVerticalPosition";
+SDLName const SDLNameBackVerticalPositionAvailable = @"backVerticalPositionAvailable";
SDLName const SDLNameBand = @"band";
SDLName const SDLNameBatteryLevelStatus = @"battLevelStatus";
SDLName const SDLNameBeltStatus = @"beltStatus";
@@ -61,6 +67,10 @@ SDLName const SDLNameButtonEventMode = @"buttonEventMode";
SDLName const SDLNameButtonName = @"buttonName";
SDLName const SDLNameButtonPress = @"ButtonPress";
SDLName const SDLNameButtonPressMode = @"buttonPressMode";
+SDLName const SDLNameCoolingEnabled = @"coolingEnabled";
+SDLName const SDLNameCoolingEnabledAvailable = @"coolingEnabledAvailable";
+SDLName const SDLNameCoolingLevel = @"coolingLevel";
+SDLName const SDLNameCoolingLevelAvailable = @"coolingLevelAvailable";
SDLName const SDLNameCoordinate = @"c";
SDLName const SDLNameCallActive = @"callActive";
SDLName const SDLNameCarModeStatus = @"carModeStatus";
@@ -84,6 +94,7 @@ SDLName const SDLNameCountryName = @"countryName";
SDLName const SDLNameCreateInteractionChoiceSet = @"CreateInteractionChoiceSet";
SDLName const SDLNameClockText = @"CT";
SDLName const SDLNameCurrentTemperature = @"currentTemperature";
+SDLName const SDLNameCushion = @"cushion";
SDLName const SDLNameCustomButtonId = @"customButtonID";
SDLName const SDLNameCustomPresets = @"customPresets";
SDLName const SDLNameData = @"data";
@@ -135,6 +146,7 @@ SDLName const SDLNameECallInfo = @"eCallInfo";
SDLName const SDLNameECallNotificationStatus = @"eCallNotificationStatus";
SDLName const SDLNameECUHeader = @"ecuHeader";
SDLName const SDLNameECUName = @"ecuName";
+SDLName const SDLNameElectronicParkBrakeStatus = @"electronicParkBrakeStatus";
SDLName const SDLNameEmergencyEvent = @"emergencyEvent";
SDLName const SDLNameEmergencyEventType = @"emergencyEventType";
SDLName const SDLNameEncodedSyncPData = @"EncodedSyncPData";
@@ -150,9 +162,13 @@ SDLName const SDLNameFanSpeedAvailable = @"fanSpeedAvailable";
SDLName const SDLNameFilename = @"fileName";
SDLName const SDLNameFilenames = @"filenames";
SDLName const SDLNameFileType = @"fileType";
+SDLName const SDLNameFirmness = @"firmness";
SDLName const SDLNameFirmwareRevision = @"firmwareRev";
+SDLName const SDLNameFreeModules = @"freeModules";
SDLName const SDLNameFrequencyInteger = @"frequencyInteger";
SDLName const SDLNameFrequencyFraction = @"frequencyFraction";
+SDLName const SDLNameFrontVerticalPosition = @"frontVerticalPosition";
+SDLName const SDLNameFrontVerticalPositionAvailable = @"frontVerticalPositionAvailable";
SDLName const SDLNameFuelCutoffStatus = @"fuelCutoffStatus";
SDLName const SDLNameFuelLevel = @"fuelLevel";
SDLName const SDLNameFuelLevelState = @"fuelLevel_State";
@@ -176,8 +192,18 @@ SDLName const SDLNameHashId = @"hashID";
SDLName const SDLNameHDChannel = @"hdChannel";
SDLName const SDLNameHDChannelAvailable = @"hdChannelAvailable";
SDLName const SDLNameHDOP = @"hdop";
+SDLName const SDLNameHDRadioEnable = @"hdRadioEnable";
+SDLName const SDLNameHDRadioEnableAvailable = @"hdRadioEnableAvailable";
SDLName const SDLNameHeading = @"heading";
SDLName const SDLNameHeadLampStatus = @"headLampStatus";
+SDLName const SDLNameHeadSupportHorizontalPosition = @"headSupportHorizontalPosition";
+SDLName const SDLNameHeadSupportHorizontalPositionAvailable = @"headSupportHorizontalPositionAvailable";
+SDLName const SDLNameHeadSupportVerticalPosition = @"headSupportVerticalPosition";
+SDLName const SDLNameHeadSupportVerticalPositionAvailable = @"headSupportVerticalPositionAvailable";
+SDLName const SDLNameHeatingLevel = @"heatingLevel";
+SDLName const SDLNameHeatingLevelAvailable = @"heatingLevelAvailable";
+SDLName const SDLNameHeatingEnabled = @"heatingEnabled";
+SDLName const SDLNameHeatingEnabledAvailable = @"heatingEnabledAvailable";
SDLName const SDLNameHeight = @"height";
SDLName const SDLNameHelpPrompt = @"helpPrompt";
SDLName const SDLNameHighBeamsOn = @"highBeamsOn";
@@ -188,6 +214,8 @@ SDLName const SDLNameHMILevelLowercase = @"hmilevel";
SDLName const SDLNameHMIPermissions = @"hmiPermissions";
SDLName const SDLNameHMICapabilities = @"hmiCapabilities";
SDLName const SDLNameHMIZoneCapabilities = @"hmiZoneCapabilities";
+SDLName const SDLNameHorizontalPosition = @"horizontalPosition";
+SDLName const SDLNameHorizontalPositionAvailable = @"horizontalPositionAvailable";
SDLName const SDLNameHour = @"hour";
SDLName const SDLNameHours = @"hours";
SDLName const SDLNameId = @"id";
@@ -216,6 +244,7 @@ SDLName const SDLNameIsSubscribed = @"isSubscribed";
SDLName const SDLNameKeyboardLayout = @"keyboardLayout";
SDLName const SDLNameKeyboardProperties = @"keyboardProperties";
SDLName const SDLNameKeypressMode = @"keypressMode";
+SDLName const SDLNameLabel = @"label";
SDLName const SDLNameLanguage = @"language";
SDLName const SDLNameLanguageDesired = @"languageDesired";
SDLName const SDLNameLatitudeDegrees = @"latitudeDegrees";
@@ -245,6 +274,13 @@ SDLName const SDLNameMajorVersion = @"majorVersion";
SDLName const SDLNameMake = @"make";
SDLName const SDLNameManeuverComplete = @"maneuverComplete";
SDLName const SDLNameManualTextEntry = @"manualTextEntry";
+SDLName const SDLNameMassageCushionFirmness = @"massageCushionFirmness";
+SDLName const SDLNameMassageCushionFirmnessAvailable = @"massageCushionFirmnessAvailable";
+SDLName const SDLNameMassageEnabled = @"massageEnabled";
+SDLName const SDLNameMassageEnabledAvailable = @"massageEnabledAvailable";
+SDLName const SDLNameMassageMode = @"massageMode";
+SDLName const SDLNameMassageModeAvailable = @"massageModeAvailable";
+SDLName const SDLNameMassageZone = @"massageZone";
SDLName const SDLNameMaxBitrate = @"maxBitrate";
SDLName const SDLNameMaxDuration = @"maxDuration";
SDLName const SDLNameMaximumChangeVelocity = @"maximumChangeVelocity";
@@ -252,6 +288,8 @@ SDLName const SDLNameMaxNumberRFCOMMPorts = @"maxNumberRFCOMMPorts";
SDLName const SDLNameMediaClock = @"mediaClock";
SDLName const SDLNameMediaClockFormats = @"mediaClockFormats";
SDLName const SDLNameMediaTrack = @"mediaTrack";
+SDLName const SDLNameMemory = @"memory";
+SDLName const SDLNameMemoryAvailable = @"memoryAvailable";
SDLName const SDLNameMenuIcon = @"menuIcon";
SDLName const SDLNameMenuId = @"menuID";
SDLName const SDLNameMenuName = @"menuName";
@@ -309,6 +347,7 @@ SDLName const SDLNameOnKeyboardInput = @"OnKeyboardInput";
SDLName const SDLNameOnLanguageChange = @"OnLanguageChange";
SDLName const SDLNameOnLockScreenStatus = @"OnLockScreenStatus";
SDLName const SDLNameOnPermissionsChange = @"OnPermissionsChange";
+SDLName const SDLNameOnRCStatus = @"OnRCStatus";
SDLName const SDLNameOnScreenPresetsAvailable = @"onScreenPresetsAvailable";
SDLName const SDLNameOnSyncPData = @"OnSyncPData";
SDLName const SDLNameOnSystemRequest = @"OnSystemRequest";
@@ -411,6 +450,8 @@ SDLName const SDLNameScrollableMessage = @"ScrollableMessage";
SDLName const SDLNameScrollableMessageBody = @"scrollableMessageBody";
SDLName const SDLNameSDLVersion = @"sdlVersion";
SDLName const SDLNameSearchAddress = @"searchAddress";
+SDLName const SDLNameSeatControlData = @"seatControlData";
+SDLName const SDLNameSeatControlCapabilities = @"seatControlCapabilities";
SDLName const SDLNameSecondaryGraphic = @"secondaryGraphic";
SDLName const SDLNameSecondaryImage = @"secondaryImage";
SDLName const SDLNameSecondaryText = @"secondaryText";
@@ -434,6 +475,7 @@ SDLName const SDLNameSignalChangeThreshold = @"signalChangeThreshold";
SDLName const SDLNameSignalChangeThresholdAvailable = @"signalChangeThresholdAvailable";
SDLName const SDLNameSignalStrength = @"signalStrength";
SDLName const SDLNameSignalStrengthAvailable = @"signalStrengthAvailable";
+SDLName const SDLNameSiriusXMRadioAvailable = @"siriusxmRadioAvailable";
SDLName const SDLNameSlider = @"Slider";
SDLName const SDLNameSliderFooter = @"sliderFooter";
SDLName const SDLNameSliderHeader = @"sliderHeader";
@@ -491,6 +533,7 @@ SDLName const SDLNameTimezoneMinuteOffset = @"tz_minute";
SDLName const SDLNameTirePressure = @"tirePressure";
SDLName const SDLNameTotalDistance = @"totalDistance";
SDLName const SDLNameTouchEventAvailable = @"touchEventAvailable";
+SDLName const SDLNameTPMS = @"tpms";
SDLName const SDLNameTrafficProgramIdentification = @"TP";
SDLName const SDLNameTriggerSource = @"triggerSource";
SDLName const SDLNameTrim = @"trim";
@@ -500,6 +543,7 @@ SDLName const SDLNameTTSChunks = @"ttsChunks";
SDLName const SDLNameTTSName = @"ttsName";
SDLName const SDLNameTurnIcon = @"turnIcon";
SDLName const SDLNameTurnList = @"turnList";
+SDLName const SDLNameTurnSignal = @"turnSignal";
SDLName const SDLNameType = @"type";
SDLName const SDLNameUnit = @"unit";
SDLName const SDLNameUnregisterAppInterface = @"UnregisterAppInterface";
@@ -523,10 +567,13 @@ SDLName const SDLNameUTCYear = @"utcYear";
SDLName const SDLNameValue = @"value";
SDLName const SDLNameVDOP = @"vdop";
SDLName const SDLNameVehicleType = @"vehicleType";
+SDLName const SDLNameVerticalPosition = @"verticalPosition";
+SDLName const SDLNameVerticalPositionAvailable = @"verticalPositionAvailable";
SDLName const SDLNameVideoCodec = @"codec";
SDLName const SDLNameVideoProtocol = @"protocol";
SDLName const SDLNameVideoStreaming = @"videoStreaming";
SDLName const SDLNameVideoStreamingCapability = @"videoStreamingCapability";
+SDLName const SDLNameVideoStreamingState = @"videoStreamingState";
SDLName const SDLNameVentilationMode = @"ventilationMode";
SDLName const SDLNameVentilationModeAvailable = @"ventilationModeAvailable";
SDLName const SDLNameVIN = @"vin";
diff --git a/SmartDeviceLink/SDLNotificationConstants.h b/SmartDeviceLink/SDLNotificationConstants.h
index 41b220134..1a0133118 100644
--- a/SmartDeviceLink/SDLNotificationConstants.h
+++ b/SmartDeviceLink/SDLNotificationConstants.h
@@ -184,6 +184,7 @@ extern SDLNotificationName const SDLDidChangeLockScreenStatusNotification;
extern SDLNotificationName const SDLDidReceiveNewHashNotification;
extern SDLNotificationName const SDLDidReceiveVehicleIconNotification;
extern SDLNotificationName const SDLDidChangePermissionsNotification;
+extern SDLNotificationName const SDLDidReceiveRemoteControlStatusNotification;
extern SDLNotificationName const SDLDidReceiveSystemRequestNotification;
extern SDLNotificationName const SDLDidChangeTurnByTurnStateNotification;
extern SDLNotificationName const SDLDidReceiveTouchEventNotification;
diff --git a/SmartDeviceLink/SDLNotificationConstants.m b/SmartDeviceLink/SDLNotificationConstants.m
index 864524205..7bda755a1 100644
--- a/SmartDeviceLink/SDLNotificationConstants.m
+++ b/SmartDeviceLink/SDLNotificationConstants.m
@@ -89,6 +89,7 @@ SDLNotificationName const SDLDidChangeLockScreenStatusNotification = @"com.sdl.n
SDLNotificationName const SDLDidReceiveNewHashNotification = @"com.sdl.notification.newHash";
SDLNotificationName const SDLDidChangePermissionsNotification = @"com.sdl.notification.changePermission";
SDLNotificationName const SDLDidReceiveSystemRequestNotification = @"com.sdl.notification.receiveSystemRequest";
+SDLNotificationName const SDLDidReceiveRemoteControlStatusNotification = @"com.sdl.notification.rcStatus";
SDLNotificationName const SDLDidChangeTurnByTurnStateNotification = @"com.sdl.notification.changeTurnByTurnState";
SDLNotificationName const SDLDidReceiveTouchEventNotification = @"com.sdl.notification.touchEvent";
SDLNotificationName const SDLDidReceiveVehicleDataNotification = @"com.sdl.notification.vehicleData";
diff --git a/SmartDeviceLink/SDLNotificationDispatcher.m b/SmartDeviceLink/SDLNotificationDispatcher.m
index a28befb68..d28842852 100644
--- a/SmartDeviceLink/SDLNotificationDispatcher.m
+++ b/SmartDeviceLink/SDLNotificationDispatcher.m
@@ -325,6 +325,10 @@ NS_ASSUME_NONNULL_BEGIN
[self postRPCNotificationNotification:SDLDidChangePermissionsNotification notification:notification];
}
+- (void)onOnRCStatus:(SDLOnRCStatus *)notification {
+ [self postRPCNotificationNotification:SDLDidReceiveRemoteControlStatusNotification notification:notification];
+}
+
- (void)onOnSyncPData:(SDLOnSyncPData *)notification {
[self postRPCNotificationNotification:SDLDidReceiveSystemRequestNotification notification:notification];
}
diff --git a/SmartDeviceLink/SDLOnHMIStatus.h b/SmartDeviceLink/SDLOnHMIStatus.h
index f91667959..069f7789d 100644
--- a/SmartDeviceLink/SDLOnHMIStatus.h
+++ b/SmartDeviceLink/SDLOnHMIStatus.h
@@ -6,6 +6,7 @@
#import "SDLAudioStreamingState.h"
#import "SDLHMILevel.h"
#import "SDLSystemContext.h"
+#import "SDLVideoStreamingState.h"
/**
* Notifies an application that HMI conditions have changed for the application. This indicates whether the application can speak phrases, display text, perform interactions, receive button presses and events, stream audio, etc. This notification will be sent to the application when there has been a change in any one or several of the indicated states (<i>SDLHMILevel</i>, <i>SDLAudioStreamingState</i> or <i>SDLSystemContext</i>) for the application.
@@ -34,6 +35,11 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic) SDLAudioStreamingState audioStreamingState;
/**
+ Current availablility of video streaming for the application. When this parameter is NOT_STREAMABLE, the application must stop video streaming to SDL.
+ */
+@property (strong, nonatomic, nullable) SDLVideoStreamingState videoStreamingState;
+
+/**
Whether a user-initiated interaction is in-progress (VRSESSION or MENU), or not (MAIN)
*/
@property (strong, nonatomic) SDLSystemContext systemContext;
diff --git a/SmartDeviceLink/SDLOnHMIStatus.m b/SmartDeviceLink/SDLOnHMIStatus.m
index 6240ec9c2..b345856f4 100644
--- a/SmartDeviceLink/SDLOnHMIStatus.m
+++ b/SmartDeviceLink/SDLOnHMIStatus.m
@@ -37,6 +37,14 @@ NS_ASSUME_NONNULL_BEGIN
return (SDLAudioStreamingState)obj;
}
+- (void)setVideoStreamingState:(nullable SDLVideoStreamingState)videoStreamingState {
+ [parameters sdl_setObject:videoStreamingState forName:SDLNameVideoStreamingState];
+}
+
+- (nullable SDLVideoStreamingState)videoStreamingState {
+ return [parameters sdl_objectForName:SDLNameVideoStreamingState];
+}
+
- (void)setSystemContext:(SDLSystemContext)systemContext {
[parameters sdl_setObject:systemContext forName:SDLNameSystemContext];
}
diff --git a/SmartDeviceLink/SDLOnRCStatus.h b/SmartDeviceLink/SDLOnRCStatus.h
new file mode 100644
index 000000000..abdb027c8
--- /dev/null
+++ b/SmartDeviceLink/SDLOnRCStatus.h
@@ -0,0 +1,49 @@
+// SDLOnRCStatus.h
+//
+
+#import <SmartDeviceLink/SmartDeviceLink.h>
+
+@class SDLModuleData;
+
+/**
+ * OnRCStatus notifications to all registered mobile applications and the HMI whenever
+ * (1) SDL allocates a module to an application or
+ * (2) it de-allocates a module from an application, or
+ * (3) an application registers with SDL
+ *
+ */
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLOnRCStatus : SDLRPCNotification
+
+/**
+ * @abstract Contains a list (zero or more) of module types that
+ * are allocated to the application.
+ *
+ * Required, Array of SDLModuleData, Array size 0 - 100
+ *
+ * @see SDLPermissionItem
+ */
+@property (strong, nonatomic) NSArray<SDLModuleData *> *allocatedModules;
+
+/**
+ * @abstract Contains a list (zero or more) of module types that are free to access for the application.
+ *
+ * Required, Array of SDLModuleData, Array size 0 - 100
+ *
+ * @see SDLPermissionItem
+ */
+@property (strong, nonatomic) NSArray<SDLModuleData *> *freeModules;
+
+/**
+ * Issued by SDL to notify the application about remote control status change on SDL
+ * If "true" - RC is allowed; if "false" - RC is disallowed.
+ *
+ * optional, Boolean, default Value = false
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *allowed;
+
+NS_ASSUME_NONNULL_END
+
+@end
diff --git a/SmartDeviceLink/SDLOnRCStatus.m b/SmartDeviceLink/SDLOnRCStatus.m
new file mode 100644
index 000000000..a9a0e9560
--- /dev/null
+++ b/SmartDeviceLink/SDLOnRCStatus.m
@@ -0,0 +1,46 @@
+// SDLOnRCStatus.m
+//
+
+#import "SDLOnRCStatus.h"
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLNames.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLOnRCStatus
+
+- (instancetype)init {
+ if (self = [super initWithName:SDLNameOnRCStatus]) {
+ }
+ return self;
+}
+
+- (nullable NSNumber<SDLBool> *)allowed {
+ return [parameters sdl_objectForName:SDLNameAllowed];
+}
+
+- (void)setAllowed:(nullable NSNumber<SDLBool> *)allowed {
+ [parameters sdl_setObject:allowed forName:SDLNameAllowed];
+}
+
+- (void)setAllocatedModules:(NSArray<SDLModuleData *> *)allocatedModules {
+ [parameters sdl_setObject:allocatedModules forName:SDLNameAllocatedModules];
+
+}
+
+- (NSArray<SDLModuleData *> *)allocatedModules {
+ return [parameters sdl_objectsForName:SDLNameAllocatedModules ofClass:SDLModuleData.class];
+}
+
+- (void)setFreeModules:(NSArray<SDLModuleData *> *)freeModules {
+ [parameters sdl_setObject:freeModules forName:SDLNameFreeModules];
+}
+
+- (NSArray<SDLModuleData *> *)freeModules {
+ return [parameters sdl_objectsForName:SDLNameFreeModules ofClass:SDLModuleData.class];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLOnVehicleData.h b/SmartDeviceLink/SDLOnVehicleData.h
index 309e231aa..f4449c070 100644
--- a/SmartDeviceLink/SDLOnVehicleData.h
+++ b/SmartDeviceLink/SDLOnVehicleData.h
@@ -4,7 +4,9 @@
#import "SDLRPCNotification.h"
#import "SDLComponentVolumeStatus.h"
+#import "SDLElectronicParkBrakeStatus.h"
#import "SDLPRNDL.h"
+#import "SDLTurnSignal.h"
#import "SDLVehicleDataEventStatus.h"
#import "SDLWiperStatus.h"
@@ -169,6 +171,15 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) SDLMyKey *myKey;
+/**
+ The status of the electronic parking brake
+ */
+@property (nullable, strong, nonatomic) SDLElectronicParkBrakeStatus electronicParkBrakeStatus;
+
+/**
+ The status of the turn signal
+ */
+@property (nullable, strong, nonatomic) SDLTurnSignal turnSignal;
@end
diff --git a/SmartDeviceLink/SDLOnVehicleData.m b/SmartDeviceLink/SDLOnVehicleData.m
index d7e95863a..8c77db316 100644
--- a/SmartDeviceLink/SDLOnVehicleData.m
+++ b/SmartDeviceLink/SDLOnVehicleData.m
@@ -245,6 +245,22 @@ NS_ASSUME_NONNULL_BEGIN
return [parameters sdl_objectForName:SDLNameMyKey ofClass:SDLMyKey.class];
}
+- (void)setElectronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus {
+ [parameters sdl_setObject:electronicParkBrakeStatus forName:SDLNameElectronicParkBrakeStatus];
+}
+
+- (nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus {
+ return [parameters sdl_objectForName:SDLNameElectronicParkBrakeStatus];
+}
+
+- (void)setTurnSignal:(nullable SDLTurnSignal)turnSignal {
+ [parameters sdl_setObject:turnSignal forName:SDLNameTurnSignal];
+}
+
+- (nullable SDLTurnSignal)turnSignal {
+ return [parameters sdl_objectForName:SDLNameTurnSignal];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLProxy.m b/SmartDeviceLink/SDLProxy.m
index e5629b461..69ee0618f 100644
--- a/SmartDeviceLink/SDLProxy.m
+++ b/SmartDeviceLink/SDLProxy.m
@@ -42,7 +42,7 @@ typedef NSString SDLVehicleMake;
typedef void (^URLSessionTaskCompletionHandler)(NSData *data, NSURLResponse *response, NSError *error);
typedef void (^URLSessionDownloadTaskCompletionHandler)(NSURL *location, NSURLResponse *response, NSError *error);
-NSString *const SDLProxyVersion = @"6.0.0";
+NSString *const SDLProxyVersion = @"6.0.1";
const float StartSessionTime = 10.0;
const float NotifyProxyClosedDelay = (float)0.1;
const int PoliciesCorrelationId = 65535;
diff --git a/SmartDeviceLink/SDLProxyListener.h b/SmartDeviceLink/SDLProxyListener.h
index 8c4a47f19..d9f0c25ed 100644
--- a/SmartDeviceLink/SDLProxyListener.h
+++ b/SmartDeviceLink/SDLProxyListener.h
@@ -39,6 +39,7 @@
@class SDLOnLanguageChange;
@class SDLOnLockScreenStatus;
@class SDLOnPermissionsChange;
+@class SDLOnRCStatus;
@class SDLOnSyncPData;
@class SDLOnSystemRequest;
@class SDLOnVehicleData;
@@ -357,6 +358,13 @@ NS_ASSUME_NONNULL_BEGIN
- (void)onOnPermissionsChange:(SDLOnPermissionsChange *)notification;
/**
+ * Called when an On RC Change notification is received from Core
+ *
+ * @param notification A SDLOnRCStatus object
+ */
+- (void)onOnRCStatus:(SDLOnRCStatus *)notification;
+
+/**
* Called when an On Sync P notification is received from Core
*
* @param notification A SDLOnSyncPData object
diff --git a/SmartDeviceLink/SDLRadioControlCapabilities.h b/SmartDeviceLink/SDLRadioControlCapabilities.h
index 9e7bce545..43fee2c3a 100644
--- a/SmartDeviceLink/SDLRadioControlCapabilities.h
+++ b/SmartDeviceLink/SDLRadioControlCapabilities.h
@@ -11,10 +11,44 @@ NS_ASSUME_NONNULL_BEGIN
*/
@interface SDLRadioControlCapabilities : SDLRPCStruct
-- (instancetype)initWithModuleName:(NSString *)moduleName radioEnableAvailable:(BOOL)radioEnableAvailable radioBandAvailable:(BOOL)radioBandAvailable radioFrequencyAvailable:(BOOL)radioFrequencyAvailable hdChannelAvailable:(BOOL)hdChannelAvailable rdsDataAvailable:(BOOL)rdsDataAvailable availableHDsAvailable:(BOOL)availableHDsAvailable stateAvailable:(BOOL)stateAvailable signalStrengthAvailable:(BOOL)signalStrengthAvailable signalChangeThresholdAvailable:(BOOL)signalChangeThresholdAvailable;
+/**
+ Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.
+
+ @param moduleName The short friendly name of the radio control module.
+ @param radioEnableAvailable Availability of the control of enable/disable radio.
+ @param radioBandAvailable Availability of the control of radio band.
+ @param radioFrequencyAvailable Availability of the control of radio frequency.
+ @param hdChannelAvailable Availability of the control of HD radio channel.
+ @param rdsDataAvailable Availability of the getting Radio Data System (RDS) data.
+ @param availableHDsAvailable Availability of the getting the number of available HD channels.
+ @param stateAvailable Availability of the getting the Radio state.
+ @param signalStrengthAvailable Availability of the getting the signal strength.
+ @param signalChangeThresholdAvailable Availability of the getting the signal Change Threshold.
+ @return An instance of the SDLRadioControlCapabilities class.
+ */
+- (instancetype)initWithModuleName:(NSString *)moduleName radioEnableAvailable:(BOOL)radioEnableAvailable radioBandAvailable:(BOOL)radioBandAvailable radioFrequencyAvailable:(BOOL)radioFrequencyAvailable hdChannelAvailable:(BOOL)hdChannelAvailable rdsDataAvailable:(BOOL)rdsDataAvailable availableHDsAvailable:(BOOL)availableHDsAvailable stateAvailable:(BOOL)stateAvailable signalStrengthAvailable:(BOOL)signalStrengthAvailable signalChangeThresholdAvailable:(BOOL)signalChangeThresholdAvailable __deprecated_msg(("Use initWithModuleName:moduleName:radioEnableAvailable radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable: instead"));
+
+/**
+ Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.
+
+ @param moduleName The short friendly name of the radio control module.
+ @param radioEnableAvailable Availability of the control of enable/disable radio.
+ @param radioBandAvailable Availability of the control of radio band.
+ @param radioFrequencyAvailable Availability of the control of radio frequency.
+ @param hdChannelAvailable Availability of the control of HD radio channel.
+ @param rdsDataAvailable Availability of the getting Radio Data System (RDS) data.
+ @param availableHDsAvailable Availability of the getting the number of available HD channels.
+ @param stateAvailable Availability of the getting the Radio state.
+ @param signalStrengthAvailable Availability of the getting the signal strength.
+ @param signalChangeThresholdAvailable Availability of the getting the signal Change Threshold.
+ @param hdRadioEnableAvailable Availability of the control of enable/disable HD radio.
+ @param siriusXMRadioAvailable Availability of sirius XM radio.
+ @return An instance of the SDLRadioControlCapabilities class
+ */
+- (instancetype)initWithModuleName:(NSString *)moduleName radioEnableAvailable:(BOOL)radioEnableAvailable radioBandAvailable:(BOOL)radioBandAvailable radioFrequencyAvailable:(BOOL)radioFrequencyAvailable hdChannelAvailable:(BOOL)hdChannelAvailable rdsDataAvailable:(BOOL)rdsDataAvailable availableHDsAvailable:(BOOL)availableHDsAvailable stateAvailable:(BOOL)stateAvailable signalStrengthAvailable:(BOOL)signalStrengthAvailable signalChangeThresholdAvailable:(BOOL)signalChangeThresholdAvailable hdRadioEnableAvailable:(BOOL)hdRadioEnableAvailable siriusXMRadioAvailable:(BOOL)siriusXMRadioAvailable;
/**
- * The short friendly name of the climate control module.
+ * The short friendly name of the radio control module.
* It should not be used to identify a module by mobile application.
*
@@ -103,6 +137,22 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) NSNumber<SDLBool> *signalChangeThresholdAvailable;
+/**
+ * @abstract Availability of the control of enable/disable HD radio.
+ * True: Available, False: Not Available, Not present: Not Available.
+ *
+ * Optional, Boolean
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *hdRadioEnableAvailable;
+
+/**
+ * @abstract Availability of sirius XM radio.
+ * True: Available, False: Not Available, Not present: Not Available.
+ *
+ * Optional, Boolean
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *siriusXMRadioAvailable;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLRadioControlCapabilities.m b/SmartDeviceLink/SDLRadioControlCapabilities.m
index 775178a9b..f23b42cb5 100644
--- a/SmartDeviceLink/SDLRadioControlCapabilities.m
+++ b/SmartDeviceLink/SDLRadioControlCapabilities.m
@@ -11,6 +11,12 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLRadioControlCapabilities
- (instancetype)initWithModuleName:(NSString *)moduleName radioEnableAvailable:(BOOL)radioEnableAvailable radioBandAvailable:(BOOL)radioBandAvailable radioFrequencyAvailable:(BOOL)radioFrequencyAvailable hdChannelAvailable:(BOOL)hdChannelAvailable rdsDataAvailable:(BOOL)rdsDataAvailable availableHDsAvailable:(BOOL)availableHDsAvailable stateAvailable:(BOOL)stateAvailable signalStrengthAvailable:(BOOL)signalStrengthAvailable signalChangeThresholdAvailable:(BOOL)signalChangeThresholdAvailable {
+
+ return [self initWithModuleName:moduleName radioEnableAvailable:radioEnableAvailable radioBandAvailable:radioBandAvailable radioFrequencyAvailable:radioFrequencyAvailable hdChannelAvailable:hdChannelAvailable rdsDataAvailable:rdsDataAvailable availableHDsAvailable:availableHDsAvailable stateAvailable:stateAvailable signalStrengthAvailable:signalStrengthAvailable signalChangeThresholdAvailable:signalChangeThresholdAvailable hdRadioEnableAvailable:NO siriusXMRadioAvailable:NO];
+
+}
+
+- (instancetype)initWithModuleName:(NSString *)moduleName radioEnableAvailable:(BOOL)radioEnableAvailable radioBandAvailable:(BOOL)radioBandAvailable radioFrequencyAvailable:(BOOL)radioFrequencyAvailable hdChannelAvailable:(BOOL)hdChannelAvailable rdsDataAvailable:(BOOL)rdsDataAvailable availableHDsAvailable:(BOOL)availableHDsAvailable stateAvailable:(BOOL)stateAvailable signalStrengthAvailable:(BOOL)signalStrengthAvailable signalChangeThresholdAvailable:(BOOL)signalChangeThresholdAvailable hdRadioEnableAvailable:(BOOL)hdRadioEnableAvailable siriusXMRadioAvailable:(BOOL)siriusXMRadioAvailable {
self = [self init];
if(!self){
return nil;
@@ -26,6 +32,8 @@ NS_ASSUME_NONNULL_BEGIN
self.stateAvailable = @(stateAvailable);
self.signalStrengthAvailable = @(signalStrengthAvailable);
self.signalChangeThresholdAvailable = @(signalChangeThresholdAvailable);
+ self.hdRadioEnableAvailable = @(hdRadioEnableAvailable);
+ self.siriusXMRadioAvailable = @(siriusXMRadioAvailable);
return self;
}
@@ -72,7 +80,6 @@ NS_ASSUME_NONNULL_BEGIN
- (void)setRdsDataAvailable:(nullable NSNumber<SDLBool> *)rdsDataAvailable {
[store sdl_setObject:rdsDataAvailable forName:SDLNameRDSDataAvailable];
-
}
- (nullable NSNumber<SDLBool> *)rdsDataAvailable {
@@ -111,6 +118,22 @@ NS_ASSUME_NONNULL_BEGIN
return [store sdl_objectForName:SDLNameSignalChangeThresholdAvailable];
}
+- (void)setHdRadioEnableAvailable:(nullable NSNumber<SDLBool> *)hdRadioEnableAvailable {
+ [store sdl_setObject:hdRadioEnableAvailable forName:SDLNameHDRadioEnableAvailable];
+}
+
+- (nullable NSNumber<SDLBool> *)hdRadioEnableAvailable {
+ return [store sdl_objectForName:SDLNameHDRadioEnableAvailable];
+}
+
+- (void)setSiriusXMRadioAvailable:(nullable NSNumber<SDLBool> *)siriusXMRadioAvailable {
+ [store sdl_setObject:siriusXMRadioAvailable forName:SDLNameSiriusXMRadioAvailable];
+}
+
+- (nullable NSNumber<SDLBool> *)siriusXMRadioAvailable {
+ return [store sdl_objectForName:SDLNameSiriusXMRadioAvailable];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLRadioControlData.h b/SmartDeviceLink/SDLRadioControlData.h
index 13f4bb64f..5aa502cbe 100644
--- a/SmartDeviceLink/SDLRadioControlData.h
+++ b/SmartDeviceLink/SDLRadioControlData.h
@@ -52,14 +52,14 @@ NS_ASSUME_NONNULL_BEGIN
*
* @warning This property is readonly and cannot be set on the module.
*
- * Integer value Min Value - 1 Max Value -3
+ * Integer value Min Value - 1 Max Value -7
*/
@property (nullable, strong, nonatomic) NSNumber<SDLInt> *availableHDs;
/**
* Current HD sub-channel if available
*
- * Integer value Min Value - 1 Max Value -3
+ * Integer value Min Value - 1 Max Value -7
*/
@property (nullable, strong, nonatomic) NSNumber<SDLInt> *hdChannel;
@@ -97,6 +97,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) SDLRadioState state;
+/**
+ * True if the hd radio is on, false is the radio is off
+ *
+ * Boolean value
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *hdRadioEnable;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLRadioControlData.m b/SmartDeviceLink/SDLRadioControlData.m
index d996a8c87..347d25aa6 100644
--- a/SmartDeviceLink/SDLRadioControlData.m
+++ b/SmartDeviceLink/SDLRadioControlData.m
@@ -106,6 +106,14 @@ NS_ASSUME_NONNULL_BEGIN
return [store sdl_objectForName:SDLNameState];
}
+- (void)setHdRadioEnable:(nullable NSNumber<SDLBool> *)hdRadioEnable {
+ [store sdl_setObject:hdRadioEnable forName:SDLNameHDRadioEnable];
+}
+
+- (nullable NSNumber<SDLBool> *)hdRadioEnable {
+ return [store sdl_objectForName:SDLNameHDRadioEnable];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLRemoteControlCapabilities.h b/SmartDeviceLink/SDLRemoteControlCapabilities.h
index d3ad1936f..89fbeb61a 100644
--- a/SmartDeviceLink/SDLRemoteControlCapabilities.h
+++ b/SmartDeviceLink/SDLRemoteControlCapabilities.h
@@ -6,6 +6,7 @@
@class SDLClimateControlCapabilities;
@class SDLRadioControlCapabilities;
+@class SDLSeatControlCapabilities;
@class SDLButtonCapabilities;
NS_ASSUME_NONNULL_BEGIN
@@ -15,7 +16,18 @@ NS_ASSUME_NONNULL_BEGIN
*/
@interface SDLRemoteControlCapabilities : SDLRPCStruct
-- (instancetype)initWithClimateControlCapabilities:(nullable NSArray<SDLClimateControlCapabilities *> *)climateControlCapabilities radioControlCapabilities:(nullable NSArray<SDLRadioControlCapabilities *> *)radioControlCapabilities buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities;
+- (instancetype)initWithClimateControlCapabilities:(nullable NSArray<SDLClimateControlCapabilities *> *)climateControlCapabilities radioControlCapabilities:(nullable NSArray<SDLRadioControlCapabilities *> *)radioControlCapabilities buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities __deprecated_msg(("Use initWithClimateControlCapabilities:climateControlCapabilities:radioControlCapabilities:buttonCapabilities:seatControlCapabilities: instead"));
+
+/**
+ Constructs a newly allocated SDLRemoteControlCapabilities object with cushion and firmness
+
+ @param climateControlCapabilities Array of SDLClimateControlCapabilities
+ @param radioControlCapabilities Array of SDLRadioControlCapabilities
+ @param buttonCapabilities Array of SDLButtonCapabilities
+ @param seatControlCapabilities Array of SDLSeatControlCapabilities
+ @return An instance of the SDLRemoteControlCapabilities class
+ */
+- (instancetype)initWithClimateControlCapabilities:(nullable NSArray<SDLClimateControlCapabilities *> *)climateControlCapabilities radioControlCapabilities:(nullable NSArray<SDLRadioControlCapabilities *> *)radioControlCapabilities buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities seatControlCapabilities:(nullable NSArray<SDLSeatControlCapabilities *> *)seatControlCapabilities;
/**
* If included, the platform supports RC climate controls.
@@ -40,6 +52,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) NSArray<SDLButtonCapabilities *> *buttonCapabilities;
+/**
+ * @abstract If included, the platform supports seat controls.
+ *
+ * Optional, Array of SDLSeatControlCapabilities, Array length 1 - 100
+ */
+@property (nullable, strong, nonatomic) NSArray<SDLSeatControlCapabilities *> *seatControlCapabilities;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLRemoteControlCapabilities.m b/SmartDeviceLink/SDLRemoteControlCapabilities.m
index 1a12d7c5c..cdb52deb1 100644
--- a/SmartDeviceLink/SDLRemoteControlCapabilities.m
+++ b/SmartDeviceLink/SDLRemoteControlCapabilities.m
@@ -3,8 +3,9 @@
//
#import "SDLRemoteControlCapabilities.h"
-#import "SDLClimateControlCapabilities.h"
#import "SDLRadioControlCapabilities.h"
+#import "SDLClimateControlCapabilities.h"
+#import "SDLSeatControlCapabilities.h"
#import "SDLButtonCapabilities.h"
#import "NSMutableDictionary+Store.h"
#import "SDLNames.h"
@@ -14,14 +15,21 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLRemoteControlCapabilities
- (instancetype)initWithClimateControlCapabilities:(nullable NSArray<SDLClimateControlCapabilities *> *)climateControlCapabilities radioControlCapabilities:(nullable NSArray<SDLRadioControlCapabilities *> *)radioControlCapabilities buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities {
+
+ return [self initWithClimateControlCapabilities:climateControlCapabilities radioControlCapabilities:radioControlCapabilities buttonCapabilities:buttonCapabilities seatControlCapabilities:nil];
+
+}
+
+- (instancetype)initWithClimateControlCapabilities:(nullable NSArray<SDLClimateControlCapabilities *> *)climateControlCapabilities radioControlCapabilities:(nullable NSArray<SDLRadioControlCapabilities *> *)radioControlCapabilities buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities seatControlCapabilities:(nullable NSArray<SDLSeatControlCapabilities *> *)seatControlCapabilities {
self = [super init];
if (!self) {
return nil;
}
-
+
self.climateControlCapabilities = climateControlCapabilities;
self.radioControlCapabilities = radioControlCapabilities;
self.buttonCapabilities = buttonCapabilities;
+ self.seatControlCapabilities = seatControlCapabilities;
return self;
}
@@ -49,6 +57,14 @@ NS_ASSUME_NONNULL_BEGIN
return [store sdl_objectsForName:SDLNameButtonCapabilities ofClass:SDLButtonCapabilities.class];
}
+- (void)setSeatControlCapabilities:(nullable NSArray<SDLSeatControlCapabilities *> *)seatControlCapabilities {
+ [store sdl_setObject:seatControlCapabilities forName:SDLNameSeatControlCapabilities];
+}
+
+- (nullable NSArray<SDLSeatControlCapabilities *> *)seatControlCapabilities {
+ return [store sdl_objectsForName:SDLNameSeatControlCapabilities ofClass:SDLSeatControlCapabilities.class];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSeatControlCapabilities.h b/SmartDeviceLink/SDLSeatControlCapabilities.h
new file mode 100644
index 000000000..de166d34d
--- /dev/null
+++ b/SmartDeviceLink/SDLSeatControlCapabilities.h
@@ -0,0 +1,134 @@
+// SDLSeatControlCapabilities.h
+//
+
+
+#import "SDLRPCStruct.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * Include information about a seat control capabilities.
+ */
+@interface SDLSeatControlCapabilities : SDLRPCStruct
+
+- (instancetype)initWithName:(NSString *)moduleName;
+
+- (instancetype)initWithName:(NSString *)moduleName heatingEnabledAvailable:(BOOL)heatingEnabledAvail
+ coolingEnabledAvailable:(BOOL)coolingEnabledAvail heatingLevelAvailable:(BOOL)heatingLevelAvail coolingLevelAvailable:(BOOL)coolingLevelAvail horizontalPositionAvailable:(BOOL)horizontalPositionAvail verticalPositionAvailable:(BOOL)verticalPositionAvail frontVerticalPositionAvailable:(BOOL)frontVerticalPositionAvail backVerticalPositionAvailable:(BOOL)backVerticalPositionAvail backTiltAngleAvailable:(BOOL)backTitlAngleAvail headSupportHorizontalPositionAvailable:(BOOL)headSupportHorizontalPositionAvail headSupportVerticalPositionAvailable:(BOOL)headSupportVerticalPositionAvail massageEnabledAvailable:(BOOL)massageEnabledAvail massageModeAvailable:(BOOL)massageModeAvail massageCushionFirmnessAvailable:(BOOL)massageCushionFirmnessAvail memoryAvailable:(BOOL)memoryAvail;
+/**
+ * @abstract The short friendly name of the light control module.
+ * It should not be used to identify a module by mobile application.
+ *
+ * Required, Max length 100 chars
+ */
+@property (strong, nonatomic) NSString *moduleName;
+
+/**
+ * @abstract Whether or not heating is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *heatingEnabledAvailable;
+
+/**
+ * @abstract Whether or not cooling is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *coolingEnabledAvailable;
+
+/**
+ * @abstract Whether or not heating level is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *heatingLevelAvailable;
+
+/**
+ * @abstract Whether or not cooling level is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *coolingLevelAvailable;
+
+/**
+ * @abstract Whether or not horizontal Position is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *horizontalPositionAvailable;
+
+/**
+ * @abstract Whether or not vertical Position is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *verticalPositionAvailable;
+
+/**
+ * @abstract Whether or not front Vertical Position is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *frontVerticalPositionAvailable;
+
+/**
+ * @abstract Whether or not back Vertical Position is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *backVerticalPositionAvailable;
+
+/**
+ * @abstract Whether or not backTilt Angle Available is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *backTiltAngleAvailable;
+
+/**
+ * @abstract Whether or not head Supports for Horizontal Position is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *headSupportHorizontalPositionAvailable;
+
+/**
+ * @abstract Whether or not head Supports for Vertical Position is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *headSupportVerticalPositionAvailable;
+
+/**
+ * @abstract Whether or not massage Enabled is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *massageEnabledAvailable;
+
+/**
+ * @abstract Whether or not massage Mode is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *massageModeAvailable;
+
+/**
+ * @abstract Whether or not massage Cushion Firmness is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *massageCushionFirmnessAvailable;
+
+/**
+ * @abstract Whether or not memory is Available.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *memoryAvailable;
+
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSeatControlCapabilities.m b/SmartDeviceLink/SDLSeatControlCapabilities.m
new file mode 100644
index 000000000..5f7fd93b0
--- /dev/null
+++ b/SmartDeviceLink/SDLSeatControlCapabilities.m
@@ -0,0 +1,203 @@
+// SDLSeatControlCapabilities.m
+//
+
+#import "SDLSeatControlCapabilities.h"
+#import "SDLNames.h"
+#import "NSMutableDictionary+Store.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLSeatControlCapabilities
+
+- (instancetype)initWithName:(NSString *)moduleName {
+ if (self = [super init]) {
+ self.moduleName = moduleName;
+ }
+ return self;
+}
+
+- (instancetype)initWithName:(NSString *)moduleName heatingEnabledAvailable:(BOOL)heatingEnabledAvail coolingEnabledAvailable:(BOOL)coolingEnabledAvail heatingLevelAvailable:(BOOL)heatingLevelAvail coolingLevelAvailable:(BOOL)coolingLevelAvail horizontalPositionAvailable:(BOOL)horizontalPositionAvail verticalPositionAvailable:(BOOL)verticalPositionAvail frontVerticalPositionAvailable:(BOOL)frontVerticalPositionAvail backVerticalPositionAvailable:(BOOL)backVerticalPositionAvail backTiltAngleAvailable:(BOOL)backTitlAngleAvail headSupportHorizontalPositionAvailable:(BOOL)headSupportHorizontalPositionAvail headSupportVerticalPositionAvailable:(BOOL)headSupportVerticalPositionAvail massageEnabledAvailable:(BOOL)massageEnabledAvail massageModeAvailable:(BOOL)massageModeAvail massageCushionFirmnessAvailable:(BOOL)massageCushionFirmnessAvail memoryAvailable:(BOOL)memoryAvail {
+
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ self.moduleName = moduleName;
+ self.heatingEnabledAvailable = @(heatingEnabledAvail);
+ self.coolingEnabledAvailable = @(coolingEnabledAvail);
+ self.heatingLevelAvailable = @(heatingLevelAvail);
+ self.coolingLevelAvailable = @(coolingLevelAvail);
+ self.horizontalPositionAvailable = @(horizontalPositionAvail);
+ self.verticalPositionAvailable = @(verticalPositionAvail);
+ self.frontVerticalPositionAvailable = @(frontVerticalPositionAvail);
+ self.backVerticalPositionAvailable = @(backVerticalPositionAvail);
+ self.backTiltAngleAvailable = @(backTitlAngleAvail);
+ self.headSupportVerticalPositionAvailable = @(headSupportVerticalPositionAvail);
+ self.headSupportHorizontalPositionAvailable = @(headSupportHorizontalPositionAvail);
+ self.massageEnabledAvailable = @(massageEnabledAvail);
+ self.massageModeAvailable = @(massageModeAvail);
+ self.massageCushionFirmnessAvailable = @(massageCushionFirmnessAvail);
+ self.memoryAvailable = @(memoryAvail);
+
+ return self;
+}
+
+- (void)setModuleName:(NSString *)moduleName {
+ [store sdl_setObject:moduleName forName:SDLNameModuleName];
+}
+
+- (NSString *)moduleName {
+ return [store sdl_objectForName:SDLNameModuleName];
+}
+
+- (void)setHeatingEnabledAvailable:(nullable NSNumber<SDLBool> *)heatingEnabledAvailable {
+ [store sdl_setObject:heatingEnabledAvailable forName:SDLNameHeatingEnabledAvailable];
+}
+
+- (nullable NSNumber<SDLBool> *)heatingEnabledAvailable {
+ return [store sdl_objectForName:SDLNameHeatingEnabledAvailable];
+}
+
+- (void)setCoolingEnabledAvailable:(nullable NSNumber<SDLBool> *)coolingEnabledAvailable {
+ [store sdl_setObject:coolingEnabledAvailable forName:SDLNameCoolingEnabledAvailable];
+
+}
+
+- (nullable NSNumber<SDLBool> *)coolingEnabledAvailable {
+ return [store sdl_objectForName:SDLNameCoolingEnabledAvailable];
+
+}
+
+- (void)setHeatingLevelAvailable:(nullable NSNumber<SDLBool> *)heatingLevelAvailable {
+ [store sdl_setObject:heatingLevelAvailable forName:SDLNameHeatingLevelAvailable];
+
+}
+
+- (nullable NSNumber<SDLBool> *)heatingLevelAvailable {
+ return [store sdl_objectForName:SDLNameHeatingLevelAvailable];
+
+}
+
+- (void)setCoolingLevelAvailable:(nullable NSNumber<SDLBool> *)coolingLevelAvailable {
+ [store sdl_setObject:coolingLevelAvailable forName:SDLNameCoolingLevelAvailable];
+
+}
+
+- (nullable NSNumber<SDLBool> *)coolingLevelAvailable {
+ return [store sdl_objectForName:SDLNameCoolingLevelAvailable];
+
+}
+
+- (void)setHorizontalPositionAvailable:(nullable NSNumber<SDLBool> *)horizontalPositionAvailable {
+ [store sdl_setObject:horizontalPositionAvailable forName:SDLNameHorizontalPositionAvailable];
+
+}
+
+- (nullable NSNumber<SDLBool> *)horizontalPositionAvailable {
+ return [store sdl_objectForName:SDLNameHorizontalPositionAvailable];
+
+}
+
+- (void)setVerticalPositionAvailable:(nullable NSNumber<SDLBool> *)verticalPositionAvailable {
+ [store sdl_setObject:verticalPositionAvailable forName:SDLNameVerticalPositionAvailable];
+
+}
+
+- (nullable NSNumber<SDLBool> *)verticalPositionAvailable {
+ return [store sdl_objectForName:SDLNameVerticalPositionAvailable];
+
+}
+
+- (void)setFrontVerticalPositionAvailable:(nullable NSNumber<SDLBool> *)frontVerticalPositionAvailable {
+ [store sdl_setObject:frontVerticalPositionAvailable forName:SDLNameFrontVerticalPositionAvailable];
+
+}
+
+- (nullable NSNumber<SDLBool> *)frontVerticalPositionAvailable {
+ return [store sdl_objectForName:SDLNameFrontVerticalPositionAvailable];
+
+}
+
+- (void)setBackVerticalPositionAvailable:(nullable NSNumber<SDLBool> *)backVerticalPositionAvailable {
+ [store sdl_setObject:backVerticalPositionAvailable forName:SDLNameBackVerticalPositionAvailable];
+
+}
+
+- (nullable NSNumber<SDLBool> *)backVerticalPositionAvailable {
+ return [store sdl_objectForName:SDLNameBackVerticalPositionAvailable];
+
+}
+
+- (void)setBackTiltAngleAvailable:(nullable NSNumber<SDLBool> *)backTiltAngleAvailable {
+ [store sdl_setObject:backTiltAngleAvailable forName:SDLNameBackTiltAngleAvailable];
+
+}
+
+- (nullable NSNumber<SDLBool> *)backTiltAngleAvailable {
+ return [store sdl_objectForName:SDLNameBackTiltAngleAvailable];
+
+}
+
+- (void)setHeadSupportHorizontalPositionAvailable:(nullable NSNumber<SDLBool> *)headSupportHorizontalPositionAvailable {
+ [store sdl_setObject:headSupportHorizontalPositionAvailable forName:SDLNameHeadSupportHorizontalPositionAvailable];
+
+}
+
+- (nullable NSNumber<SDLBool> *)headSupportHorizontalPositionAvailable {
+ return [store sdl_objectForName:SDLNameHeadSupportHorizontalPositionAvailable];
+
+}
+
+- (void)setHeadSupportVerticalPositionAvailable:(nullable NSNumber<SDLBool> *)headSupportVerticalPositionAvailable {
+ [store sdl_setObject:headSupportVerticalPositionAvailable forName:SDLNameHeadSupportVerticalPositionAvailable];
+
+}
+
+- (nullable NSNumber<SDLBool> *)headSupportVerticalPositionAvailable {
+ return [store sdl_objectForName:SDLNameHeadSupportVerticalPositionAvailable];
+
+}
+
+- (void)setMassageEnabledAvailable:(nullable NSNumber<SDLBool> *)massageEnabledAvailable {
+ [store sdl_setObject:massageEnabledAvailable forName:SDLNameMassageEnabledAvailable];
+
+}
+
+- (nullable NSNumber<SDLBool> *)massageEnabledAvailable {
+ return [store sdl_objectForName:SDLNameMassageEnabledAvailable];
+
+}
+
+- (void)setMassageModeAvailable:(nullable NSNumber<SDLBool> *)massageModeAvailable {
+ [store sdl_setObject:massageModeAvailable forName:SDLNameMassageModeAvailable];
+
+}
+
+- (nullable NSNumber<SDLBool> *)massageModeAvailable {
+ return [store sdl_objectForName:SDLNameMassageModeAvailable];
+
+}
+
+- (void)setMassageCushionFirmnessAvailable:(nullable NSNumber<SDLBool> *)massageCushionFirmnessAvailable {
+ [store sdl_setObject:massageCushionFirmnessAvailable forName:SDLNameMassageCushionFirmnessAvailable];
+
+}
+
+- (nullable NSNumber<SDLBool> *)massageCushionFirmnessAvailable {
+ return [store sdl_objectForName:SDLNameMassageCushionFirmnessAvailable];
+
+}
+
+- (void)setMemoryAvailable:(nullable NSNumber<SDLBool> *)memoryAvailable {
+ [store sdl_setObject:memoryAvailable forName:SDLNameMemoryAvailable];
+
+}
+
+- (nullable NSNumber<SDLBool> *)memoryAvailable {
+ return [store sdl_objectForName:SDLNameMemoryAvailable];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSeatControlData.h b/SmartDeviceLink/SDLSeatControlData.h
new file mode 100644
index 000000000..e08492d28
--- /dev/null
+++ b/SmartDeviceLink/SDLSeatControlData.h
@@ -0,0 +1,166 @@
+// SDLSeatControlData.h
+//
+
+#import "SDLRPCStruct.h"
+#import "SDLSeatMemoryActionType.h"
+#import "SDLSupportedSeat.h"
+
+@class SDLMassageModeData;
+@class SDLMassageCushionFirmness;
+@class SDLSeatMemoryAction;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * Seat control data corresponds to "SEAT" ModuleType.
+ */
+
+@interface SDLSeatControlData : SDLRPCStruct
+
+/**
+ Constructs a newly allocated SDLSeatControlData object with cushion and firmness
+
+ @param supportedSeat id of remote controllable seat.
+ @return An instance of the SDLSeatControlData class
+ */
+- (instancetype)initWithId:(SDLSupportedSeat)supportedSeat;
+
+/**
+ Constructs a newly allocated SDLSeatControlData object with cushion and firmness
+
+ @param supportedSeat id of remote controllable seat.
+ @param heatingEnable Whether or not heating is enabled.
+ @param coolingEnable Whether or not cooling is enabled.
+ @param heatingLevel heating level
+ @param coolingLevel cooling Level
+ @param horizontal horizontal Position
+ @param vertical vertical Position
+ @param frontVertical frontVertical Position
+ @param backVertical backVertical Position
+ @param backAngle backAngle Position
+ @param headSupportedHorizontal headSupportedHorizontal Position
+ @param headSupportedVertical headSupportedVertical Position
+ @param massageEnable Whether or not massage is enabled.
+ @param massageMode Array of massage mode data.
+ @param firmness Array of firmness data.
+ @param memoryAction type of action to be performed.
+ @return An instance of the SDLSeatControlData class
+ */
+- (instancetype)initWithId:(SDLSupportedSeat)supportedSeat heatingEnabled:(BOOL)heatingEnable coolingEnable:(BOOL)coolingEnable heatingLevel:(UInt8)heatingLevel coolingLevel:(UInt8)coolingLevel horizontalPostion:(UInt8)horizontal verticalPostion:(UInt8)vertical frontVerticalPostion:(UInt8)frontVertical backVerticalPostion:(UInt8)backVertical backTiltAngle:(UInt8)backAngle headSupportedHorizontalPostion:(UInt8)headSupportedHorizontal headSupportedVerticalPostion:(UInt8)headSupportedVertical massageEnabled:(BOOL)massageEnable massageMode:(NSArray<SDLMassageModeData *> *)massageMode massageCussionFirmness:(NSArray<SDLMassageCushionFirmness *> *)firmness memory:(SDLSeatMemoryAction *)memoryAction;
+
+/**
+ * @abstract id of seat that is a remote controllable seat.
+ *
+ * Required
+ */
+@property (strong, nonatomic) SDLSupportedSeat id;
+
+/**
+ * @abstract Whether or not heating is enabled.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *heatingEnabled;
+
+/**
+ * @abstract Whether or not cooling is enabled.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *coolingEnabled;
+
+/**
+ * @abstract heating level in integer
+ *
+ * Optional, MinValue- 0 MaxValue= 100
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLInt> *heatingLevel;
+
+/**
+ * @abstract cooling level in integer
+ *
+ * Optional, MinValue- 0 MaxValue= 100
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLInt> *coolingLevel;
+
+/**
+ * @abstract horizontal Position in integer
+ *
+ * Optional, MinValue- 0 MaxValue= 100
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLInt> *horizontalPosition;
+
+/**
+ * @abstract heating level in integer
+ *
+ * Optional, MinValue- 0 MaxValue= 100
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLInt> *verticalPosition;
+
+/**
+ * @abstract heating level in integer
+ *
+ * Optional, MinValue- 0 MaxValue= 100
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLInt> *frontVerticalPosition;
+
+/**
+ * @abstract heating level in integer
+ *
+ * Optional, MinValue- 0 MaxValue= 100
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLInt> *backVerticalPosition;
+
+/**
+ * @abstract heating level in integer
+ *
+ * Optional, MinValue- 0 MaxValue= 100
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLInt> *backTiltAngle;
+
+/**
+ * @abstract head Support Horizontal Position in integer
+ *
+ * Optional, MinValue- 0 MaxValue= 100
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLInt> *headSupportHorizontalPosition;
+
+/**
+ * @abstract head Support Vertical Position in integer
+ *
+ * Optional, MinValue- 0 MaxValue= 100
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLInt> *headSupportVerticalPosition;
+
+/**
+ * @abstract Whether or not massage is enabled.
+
+ * Optional
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *massageEnabled;
+
+/**
+ * @abstract Array of massage mode data.
+
+ * Optional, Array of SDLMassageModeData objects, MinArray size-1 MaxArray size-2
+ */
+@property (nullable, strong, nonatomic) NSArray<SDLMassageModeData *> *massageMode;
+
+
+/**
+ * @abstract Array of firmness of a cushion.
+
+ * Optional, Array of SDLMassageCushionFirmness objects, MinArray size-1 MaxArray size-5
+ */
+@property (nullable, strong, nonatomic) NSArray<SDLMassageCushionFirmness *> *massageCushionFirmness;
+
+/**
+ * @abstract type of action to be performed
+ *
+ * Required, @see SDLSeatMemoryAction
+ */
+@property (nullable, strong, nonatomic) SDLSeatMemoryAction *memory;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSeatControlData.m b/SmartDeviceLink/SDLSeatControlData.m
new file mode 100644
index 000000000..df2b43585
--- /dev/null
+++ b/SmartDeviceLink/SDLSeatControlData.m
@@ -0,0 +1,187 @@
+// SDLSeatControlData.m
+//
+
+#import "SDLSeatControlData.h"
+#import "SDLNames.h"
+#import "NSMutableDictionary+Store.h"
+
+#import "SDLMassageModeData.h"
+#import "SDLMassageCushionFirmness.h"
+#import "SDLSeatMemoryAction.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLSeatControlData
+
+- (instancetype)initWithId:(SDLSupportedSeat)supportedSeat {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.id = supportedSeat;
+
+ return self;
+}
+
+- (instancetype)initWithId:(SDLSupportedSeat)supportedSeat heatingEnabled:(BOOL)heatingEnable coolingEnable:(BOOL)coolingEnabled heatingLevel:(UInt8)heatingLevel coolingLevel:(UInt8)coolingLevel horizontalPostion:(UInt8)horizontal verticalPostion:(UInt8)vertical frontVerticalPostion:(UInt8)frontVertical backVerticalPostion:(UInt8)backVertical backTiltAngle:(UInt8)backAngle headSupportedHorizontalPostion:(UInt8)headSupportedHorizontal headSupportedVerticalPostion:(UInt8)headSupportedVertical massageEnabled:(BOOL)massageEnable massageMode:(NSArray<SDLMassageModeData *> *)massageMode massageCussionFirmness:(NSArray<SDLMassageCushionFirmness *> *)firmness memory:(SDLSeatMemoryAction *)memoryAction {
+
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ self.id = supportedSeat;
+ self.heatingEnabled = @(heatingEnable);
+ self.coolingEnabled = @(coolingEnabled);
+ self.heatingLevel = @(heatingLevel);
+ self.coolingLevel = @(coolingLevel);
+
+ self.horizontalPosition = @(horizontal);
+ self.verticalPosition = @(vertical);
+ self.frontVerticalPosition = @(frontVertical);
+ self.backVerticalPosition = @(backVertical);
+ self.backTiltAngle = @(backAngle);
+
+ self.headSupportHorizontalPosition = @(headSupportedHorizontal);
+ self.headSupportVerticalPosition = @(headSupportedVertical);
+
+ self.massageEnabled = @(massageEnable);
+ self.massageMode = massageMode;
+ self.massageCushionFirmness = firmness;
+ self.memory = memoryAction;
+
+ return self;
+}
+
+- (void)setId:(SDLSupportedSeat)id {
+ [store sdl_setObject:id forName:SDLNameId];
+}
+
+- (SDLSupportedSeat)id {
+ return [store sdl_objectForName:SDLNameId];
+}
+
+- (void)setHeatingEnabled:(nullable NSNumber<SDLBool> *)heatingEnabled {
+ [store sdl_setObject:heatingEnabled forName:SDLNameHeatingEnabled];
+}
+
+- (nullable NSNumber<SDLBool> *)heatingEnabled {
+ return [store sdl_objectForName:SDLNameHeatingEnabled];
+}
+
+- (void)setCoolingEnabled:(nullable NSNumber<SDLBool> *)coolingEnabled {
+ [store sdl_setObject:coolingEnabled forName:SDLNameCoolingEnabled];
+}
+
+- (nullable NSNumber<SDLBool> *)coolingEnabled {
+ return [store sdl_objectForName:SDLNameCoolingEnabled];
+}
+
+- (void)setHeatingLevel:(nullable NSNumber<SDLInt> *)heatingLevel {
+ [store sdl_setObject:heatingLevel forName:SDLNameHeatingLevel];
+}
+
+- (nullable NSNumber<SDLInt> *)heatingLevel {
+ return [store sdl_objectForName:SDLNameHeatingLevel];
+}
+
+- (void)setCoolingLevel:(nullable NSNumber<SDLInt> *)coolingLevel {
+ [store sdl_setObject:coolingLevel forName:SDLNameCoolingLevel];
+}
+
+- (nullable NSNumber<SDLInt> *)coolingLevel {
+ return [store sdl_objectForName:SDLNameCoolingLevel];
+}
+
+- (void)setHorizontalPosition:(nullable NSNumber<SDLInt> *)horizontalPosition {
+ [store sdl_setObject:horizontalPosition forName:SDLNameHorizontalPosition];
+}
+
+- (nullable NSNumber<SDLInt> *)horizontalPosition {
+ return [store sdl_objectForName:SDLNameHorizontalPosition];
+}
+
+- (void)setVerticalPosition:(nullable NSNumber<SDLInt> *)verticalPosition {
+ [store sdl_setObject:verticalPosition forName:SDLNameVerticalPosition];
+}
+
+- (nullable NSNumber<SDLInt> *)verticalPosition {
+ return [store sdl_objectForName:SDLNameVerticalPosition];
+}
+
+- (void)setFrontVerticalPosition:(nullable NSNumber<SDLInt> *)frontVerticalPosition {
+ [store sdl_setObject:frontVerticalPosition forName:SDLNameFrontVerticalPosition];
+}
+
+- (nullable NSNumber<SDLInt> *)frontVerticalPosition {
+ return [store sdl_objectForName:SDLNameFrontVerticalPosition];
+}
+
+- (void)setBackVerticalPosition:(nullable NSNumber<SDLInt> *)backVerticalPosition {
+ [store sdl_setObject:backVerticalPosition forName:SDLNameBackVerticalPosition];
+}
+
+- (nullable NSNumber<SDLInt> *)backVerticalPosition {
+ return [store sdl_objectForName:SDLNameBackVerticalPosition];
+}
+
+- (void)setBackTiltAngle:(nullable NSNumber<SDLInt> *)backTiltAngle {
+ [store sdl_setObject:backTiltAngle forName:SDLNameBackTiltAngle];
+}
+
+- (nullable NSNumber<SDLInt> *)backTiltAngle {
+ return [store sdl_objectForName:SDLNameBackTiltAngle];
+}
+
+- (void)setHeadSupportHorizontalPosition:(nullable NSNumber<SDLInt> *)headSupportHorizontalPosition {
+ [store sdl_setObject:headSupportHorizontalPosition forName:SDLNameHeadSupportHorizontalPosition];
+}
+
+- (nullable NSNumber<SDLInt> *)headSupportHorizontalPosition {
+ return [store sdl_objectForName:SDLNameHeadSupportHorizontalPosition];
+}
+
+-(void)setHeadSupportVerticalPosition:(nullable NSNumber<SDLInt> *)headSupportVerticalPosition {
+ [store sdl_setObject:headSupportVerticalPosition forName:SDLNameHeadSupportVerticalPosition];
+}
+
+- (nullable NSNumber<SDLInt> *)headSupportVerticalPosition {
+ return [store sdl_objectForName:SDLNameHeadSupportVerticalPosition];
+}
+
+- (void)setMassageEnabled:(nullable NSNumber<SDLBool> *)massageEnabled {
+ [store sdl_setObject:massageEnabled forName:SDLNameMassageEnabled];
+}
+
+- (nullable NSNumber<SDLBool> *)massageEnabled {
+ return [store sdl_objectForName:SDLNameMassageEnabled];
+
+}
+
+- (void)setMassageMode:(nullable NSArray<SDLMassageModeData *> *)massageMode {
+ [store sdl_setObject:massageMode forName:SDLNameMassageMode];
+}
+
+- (nullable NSArray<SDLMassageModeData *> *)massageMode {
+ return [store sdl_objectForName:SDLNameMassageMode ];
+}
+
+- (void)setMassageCushionFirmness:(nullable NSArray<SDLMassageCushionFirmness *> *)massageCushionFirmness {
+ [store sdl_setObject:massageCushionFirmness forName:SDLNameMassageCushionFirmness];
+}
+
+- (nullable NSArray<SDLMassageCushionFirmness *> *)massageCushionFirmness {
+ return [store sdl_objectForName:SDLNameMassageCushionFirmness];
+}
+
+- (void)setMemory:(nullable SDLSeatMemoryAction *)memory {
+ [store sdl_setObject:memory forName:SDLNameMemory];
+}
+
+- (nullable SDLSeatMemoryAction *)memory {
+ return [store sdl_objectForName:SDLNameMemory ofClass:SDLSeatMemoryAction.class];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSeatMemoryAction.h b/SmartDeviceLink/SDLSeatMemoryAction.h
new file mode 100644
index 000000000..7dbcf64f8
--- /dev/null
+++ b/SmartDeviceLink/SDLSeatMemoryAction.h
@@ -0,0 +1,61 @@
+// SDLSeatMemoryAction.h
+//
+
+#import "SDLRPCStruct.h"
+#import "SDLSeatMemoryActionType.h"
+
+/**
+ * Specify the action to be performed.
+ */
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLSeatMemoryAction : SDLRPCStruct
+
+
+/**
+ @abstract Constructs a newly allocated SDLSeatMemoryAction object with id, label (max length 100 chars) and action type
+
+ @param id of the action to be performed
+ @param action type of action to be performed
+ @return A SDLSeatMemoryAction object
+ */
+- (instancetype)initWithId:(UInt8)id action:(SDLSeatMemoryActionType)action;
+
+/**
+ @abstract Constructs a newly allocated SDLSeatMemoryAction object with id, label (max length 100 chars) and action type
+
+ @param id of the action to be performed
+ @param label of the action to be performed.
+ @param action type of action to be performed
+ @return A SDLSeatMemoryAction object
+ */
+- (instancetype)initWithId:(UInt8)id label:(nullable NSString*) label action:(SDLSeatMemoryActionType)action;
+
+/**
+ * @abstract id of the action to be performed.
+ *
+ * Required, MinValue- 0 MaxValue= 10
+ *
+ */
+@property (strong, nonatomic) NSNumber<SDLInt> *id;
+
+/**
+ * @abstract label of the action to be performed.
+ *
+ * Optional, Max length 100 chars
+ */
+@property (nullable, strong, nonatomic) NSString *label;
+
+/**
+ * @abstract type of action to be performed
+ *
+ * Required, @see SDLSeatMemoryActionType
+ *
+ */
+@property (strong, nonatomic) SDLSeatMemoryActionType action;
+
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSeatMemoryAction.m b/SmartDeviceLink/SDLSeatMemoryAction.m
new file mode 100644
index 000000000..76f519238
--- /dev/null
+++ b/SmartDeviceLink/SDLSeatMemoryAction.m
@@ -0,0 +1,60 @@
+// SDLSeatMemoryAction.m
+//
+
+#import "SDLSeatMemoryAction.h"
+#import "SDLNames.h"
+#import "NSMutableDictionary+Store.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLSeatMemoryAction
+
+- (instancetype)initWithId:(UInt8)id action:(SDLSeatMemoryActionType)action {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ self.id = @(id);
+ self.action = action;
+
+ return self;
+}
+
+- (instancetype)initWithId:(UInt8)id label:(nullable NSString*)label action:(SDLSeatMemoryActionType)action {
+ self = [self initWithId:id action:action];
+ if (!self) {
+ return nil;
+ }
+
+ self.label = label;
+ return self;
+}
+
+- (void)setId:(NSNumber<SDLInt> *)id {
+ [store sdl_setObject:id forName:SDLNameId];
+}
+
+- (NSNumber<SDLInt> *)id {
+ return [store sdl_objectForName:SDLNameId];
+}
+
+- (void)setLabel:(nullable NSString *)label {
+ [store sdl_setObject:label forName:SDLNameLabel];
+}
+
+- (nullable NSString *)label {
+ return [store sdl_objectForName:SDLNameLabel];
+}
+
+- (void)setAction:(SDLSeatMemoryActionType)action {
+ [store sdl_setObject:action forName:SDLNameAction];
+}
+
+- (SDLSeatMemoryActionType)action {
+ return [store sdl_objectForName:SDLNameAction];
+}
+@end
+
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSeatMemoryActionType.h b/SmartDeviceLink/SDLSeatMemoryActionType.h
new file mode 100644
index 000000000..9ac8eafae
--- /dev/null
+++ b/SmartDeviceLink/SDLSeatMemoryActionType.h
@@ -0,0 +1,27 @@
+// SDLSeatMemoryActionType.h
+//
+
+#import "SDLEnum.h"
+
+/**
+ * List of possible actions on Seat Meomry
+ *
+ * @since SDL 2.0
+ */
+typedef SDLEnum SDLSeatMemoryActionType SDL_SWIFT_ENUM;
+
+/**
+ * @abstract Save current seat postions and settings to seat memory.
+ */
+extern SDLSeatMemoryActionType const SDLSeatMemoryActionTypeSave;
+
+/**
+ * @abstract Restore / apply the seat memory settings to the current seat.
+ */
+extern SDLSeatMemoryActionType const SDLSeatMemoryActionTypeRestore;
+
+/**
+ * @abstract No action to be performed.
+ */
+extern SDLSeatMemoryActionType const SDLSeatMemoryActionTypeNone;
+
diff --git a/SmartDeviceLink/SDLSeatMemoryActionType.m b/SmartDeviceLink/SDLSeatMemoryActionType.m
new file mode 100644
index 000000000..6e27c1cc2
--- /dev/null
+++ b/SmartDeviceLink/SDLSeatMemoryActionType.m
@@ -0,0 +1,8 @@
+// SDLSeatMemoryActionType.m
+//
+
+#import "SDLSeatMemoryActionType.h"
+
+SDLSeatMemoryActionType const SDLSeatMemoryActionTypeSave = @"SAVE";
+SDLSeatMemoryActionType const SDLSeatMemoryActionTypeRestore = @"RESTORE";
+SDLSeatMemoryActionType const SDLSeatMemoryActionTypeNone = @"NONE";
diff --git a/SmartDeviceLink/SDLSingleTireStatus.h b/SmartDeviceLink/SDLSingleTireStatus.h
index 107123e90..9ebe1b32e 100644
--- a/SmartDeviceLink/SDLSingleTireStatus.h
+++ b/SmartDeviceLink/SDLSingleTireStatus.h
@@ -4,6 +4,7 @@
#import "SDLRPCMessage.h"
#import "SDLComponentVolumeStatus.h"
+#import "SDLTPMS.h"
NS_ASSUME_NONNULL_BEGIN
@@ -21,6 +22,20 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (strong, nonatomic) SDLComponentVolumeStatus status;
+/**
+ The status of TPMS for this particular tire
+
+ Optional
+ */
+@property (strong, nonatomic, nullable) SDLTPMS monitoringSystemStatus;
+
+/**
+ The pressure value of this particular tire in kPa (kilopascals)
+
+ Optional, Float, 0-2000
+ */
+@property (copy, nonatomic, nullable) NSNumber<SDLFloat> *pressure;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSingleTireStatus.m b/SmartDeviceLink/SDLSingleTireStatus.m
index a43be45b9..6f88953af 100644
--- a/SmartDeviceLink/SDLSingleTireStatus.m
+++ b/SmartDeviceLink/SDLSingleTireStatus.m
@@ -4,8 +4,11 @@
#import "SDLSingleTireStatus.h"
#import "NSMutableDictionary+Store.h"
+#import "NSNumber+NumberType.h"
#import "SDLNames.h"
+NS_ASSUME_NONNULL_BEGIN
+
@implementation SDLSingleTireStatus
- (void)setStatus:(SDLComponentVolumeStatus)status {
@@ -16,4 +19,22 @@
return [store sdl_objectForName:SDLNameStatus];
}
+- (void)setMonitoringSystemStatus:(nullable SDLTPMS)monitoringSystemStatus {
+ [store sdl_setObject:monitoringSystemStatus forName:SDLNameTPMS];
+}
+
+- (nullable SDLTPMS)monitoringSystemStatus {
+ return [store sdl_objectForName:SDLNameTPMS];
+}
+
+- (void)setPressure:(nullable NSNumber<SDLFloat> *)pressure {
+ [store sdl_setObject:pressure forName:SDLNamePressure];
+}
+
+- (nullable NSNumber<SDLFloat> *)pressure {
+ return [store sdl_objectForName:SDLNamePressure];
+}
+
@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSoftButtonManager.m b/SmartDeviceLink/SDLSoftButtonManager.m
index f65acb444..e3e9278b2 100644
--- a/SmartDeviceLink/SDLSoftButtonManager.m
+++ b/SmartDeviceLink/SDLSoftButtonManager.m
@@ -50,7 +50,8 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, nullable) SDLDisplayCapabilities *displayCapabilities;
@property (strong, nonatomic, nullable) SDLSoftButtonCapabilities *softButtonCapabilities;
-@property (assign, nonatomic) BOOL waitingOnHMILevelUpdateToSetButtons;
+@property (assign, nonatomic) BOOL waitingOnHMILevelUpdateToUpdate;
+@property (assign, nonatomic) BOOL isDirty;
@end
@@ -65,7 +66,8 @@ NS_ASSUME_NONNULL_BEGIN
_softButtonObjects = @[];
_currentLevel = nil;
- _waitingOnHMILevelUpdateToSetButtons = NO;
+ _waitingOnHMILevelUpdateToUpdate = NO;
+ _isDirty = NO;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_registerResponse:) name:SDLDidReceiveRegisterAppInterfaceResponse object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_displayLayoutResponse:) name:SDLDidReceiveSetDisplayLayoutResponse object:nil];
@@ -85,14 +87,16 @@ NS_ASSUME_NONNULL_BEGIN
_currentLevel = nil;
_displayCapabilities = nil;
_softButtonCapabilities = nil;
- _waitingOnHMILevelUpdateToSetButtons = NO;
+ _waitingOnHMILevelUpdateToUpdate = NO;
+ _isDirty = NO;
}
- (void)setSoftButtonObjects:(NSArray<SDLSoftButtonObject *> *)softButtonObjects {
- if (self.currentLevel == nil || [self.currentLevel isEqualToString:SDLHMILevelNone]) {
- _waitingOnHMILevelUpdateToSetButtons = YES;
- _softButtonObjects = softButtonObjects;
+ // Only update if something changed. This prevents, for example, an empty array being reset
+ if (_softButtonObjects == softButtonObjects) {
return;
+ } else {
+ self.isDirty = YES;
}
self.inProgressUpdate = nil;
@@ -119,57 +123,13 @@ NS_ASSUME_NONNULL_BEGIN
}
}
- _softButtonObjects = softButtonObjects;
-
- for (SDLSoftButtonObject *button in _softButtonObjects) {
+ for (SDLSoftButtonObject *button in softButtonObjects) {
button.manager = self;
}
- NSMutableArray<SDLArtwork *> *initialStatesToBeUploaded = [NSMutableArray array];
- NSMutableArray<SDLArtwork *> *otherStatesToBeUploaded = [NSMutableArray array];
- if (self.displayCapabilities ? self.displayCapabilities.graphicSupported.boolValue : YES) {
- // Upload all soft button images, the initial state images first, then the other states. We need to send updates when the initial state is ready.
- for (SDLSoftButtonObject *object in self.softButtonObjects) {
- if (object.currentState.artwork != nil && ![self.fileManager hasUploadedFile:object.currentState.artwork]) {
- [initialStatesToBeUploaded addObject:object.currentState.artwork];
- }
- }
- for (SDLSoftButtonObject *object in self.softButtonObjects) {
- for (SDLSoftButtonState *state in object.states) {
- if ([state.name isEqualToString:object.currentState.name]) { continue; }
- if (state.artwork != nil && ![self.fileManager hasUploadedFile:state.artwork]) {
- [otherStatesToBeUploaded addObject:state.artwork];
- }
- }
- }
- }
-
- // Upload initial images, then other state images
- if (initialStatesToBeUploaded.count > 0) {
- SDLLogD(@"Uploading soft button initial artworks");
- [self.fileManager uploadArtworks:[initialStatesToBeUploaded copy] completionHandler:^(NSArray<NSString *> * _Nonnull artworkNames, NSError * _Nullable error) {
- if (error != nil) {
- SDLLogE(@"Error uploading soft button artworks: %@", error);
- }
-
- SDLLogD(@"Soft button initial artworks uploaded");
- [self sdl_updateWithCompletionHandler:nil];
- }];
- }
- if (otherStatesToBeUploaded.count > 0) {
- SDLLogD(@"Uploading soft button other state artworks");
- [self.fileManager uploadArtworks:[otherStatesToBeUploaded copy] completionHandler:^(NSArray<NSString *> * _Nonnull artworkNames, NSError * _Nullable error) {
- if (error != nil) {
- SDLLogE(@"Error uploading soft button artworks: %@", error);
- }
-
- SDLLogD(@"Soft button other state artworks uploaded");
- // In case our soft button states have changed in the meantime
- [self sdl_updateWithCompletionHandler:nil];
- }];
- }
+ _softButtonObjects = softButtonObjects;
- [self sdl_updateWithCompletionHandler:nil];
+ [self updateWithCompletionHandler:nil];
}
- (nullable SDLSoftButtonObject *)softButtonObjectNamed:(NSString *)name {
@@ -182,19 +142,30 @@ NS_ASSUME_NONNULL_BEGIN
return nil;
}
-- (void)updateWithCompletionHandler:(nullable SDLSoftButtonUpdateCompletionHandler)handler {
- if (self.isBatchingUpdates) { return; }
-
- [self sdl_updateWithCompletionHandler:handler];
+- (void)sdl_transitionSoftButton:(SDLSoftButtonObject *)softButton {
+ self.isDirty = YES;
+ [self updateWithCompletionHandler:nil];
}
-- (void)sdl_updateWithCompletionHandler:(nullable SDLSoftButtonUpdateCompletionHandler)handler {
+- (void)updateWithCompletionHandler:(nullable SDLSoftButtonUpdateCompletionHandler)handler {
+ // Don't send if we're batching
+ if (self.isBatchingUpdates || !self.isDirty) { return; }
+
// Don't send if we're in HMI NONE
if (self.currentLevel == nil || [self.currentLevel isEqualToString:SDLHMILevelNone]) {
+ self.waitingOnHMILevelUpdateToUpdate = YES;
return;
+ } else {
+ self.waitingOnHMILevelUpdateToUpdate = NO;
}
+ [self sdl_updateWithCompletionHandler:handler];
+}
+
+- (void)sdl_updateWithCompletionHandler:(nullable SDLSoftButtonUpdateCompletionHandler)handler {
SDLLogD(@"Updating soft buttons");
+ self.isDirty = NO;
+
if (self.inProgressUpdate != nil) {
SDLLogV(@"In progress update exists, queueing update");
// If we already have a pending update, we're going to tell the old handler that it was superseded by a new update and then return
@@ -217,13 +188,16 @@ NS_ASSUME_NONNULL_BEGIN
self.inProgressUpdate = [[SDLShow alloc] init];
self.inProgressUpdate.mainField1 = self.currentMainField1 ?: @"";
- BOOL headUnitSupportsImages = self.softButtonCapabilities ? self.softButtonCapabilities.imageSupported.boolValue : NO;
+ if ([self sdl_supportsSoftButtonImages]) {
+ [self sdl_uploadInitialStateImages];
+ [self sdl_uploadOtherStateImages];
+ }
if (self.softButtonObjects == nil) {
SDLLogV(@"Soft button objects are nil, sending an empty array");
self.inProgressUpdate.softButtons = @[];
} else if (([self sdl_currentStateHasImages] && ![self sdl_allCurrentStateImagesAreUploaded])
- || !headUnitSupportsImages) {
+ || ![self sdl_supportsSoftButtonImages]) {
// The images don't yet exist on the head unit, or we cannot use images, send a text update, if possible. Otherwise, don't send anything yet.
NSArray<SDLSoftButton *> *textOnlyButtons = [self sdl_textButtonsForCurrentState];
if (textOnlyButtons != nil) {
@@ -283,6 +257,62 @@ NS_ASSUME_NONNULL_BEGIN
return YES;
}
+- (BOOL)sdl_supportsSoftButtonImages {
+ BOOL supportsGraphics = self.displayCapabilities ? self.displayCapabilities.graphicSupported.boolValue : YES;
+ BOOL supportsSoftButtonImages = self.softButtonCapabilities ? self.softButtonCapabilities.imageSupported.boolValue : NO;
+
+ return (supportsGraphics && supportsSoftButtonImages);
+}
+
+- (void)sdl_uploadInitialStateImages {
+ NSMutableArray<SDLArtwork *> *initialStatesToBeUploaded = [NSMutableArray array];
+ // Upload all soft button images, the initial state images first, then the other states. We need to send updates when the initial state is ready.
+ for (SDLSoftButtonObject *object in self.softButtonObjects) {
+ if (object.currentState.artwork != nil && ![self.fileManager hasUploadedFile:object.currentState.artwork]) {
+ [initialStatesToBeUploaded addObject:object.currentState.artwork];
+ }
+ }
+
+ // Upload initial images, then other state images
+ if (initialStatesToBeUploaded.count > 0) {
+ SDLLogD(@"Uploading soft button initial artworks");
+ [self.fileManager uploadArtworks:[initialStatesToBeUploaded copy] completionHandler:^(NSArray<NSString *> * _Nonnull artworkNames, NSError * _Nullable error) {
+ if (error != nil) {
+ SDLLogE(@"Error uploading soft button artworks: %@", error);
+ }
+
+ SDLLogD(@"Soft button initial artworks uploaded");
+ [self sdl_updateWithCompletionHandler:nil];
+ }];
+ }
+}
+
+- (void)sdl_uploadOtherStateImages {
+ NSMutableArray<SDLArtwork *> *otherStatesToBeUploaded = [NSMutableArray array];
+ // Upload all soft button images, the initial state images first, then the other states. We need to send updates when the initial state is ready.
+ for (SDLSoftButtonObject *object in self.softButtonObjects) {
+ for (SDLSoftButtonState *state in object.states) {
+ if ([state.name isEqualToString:object.currentState.name]) { continue; }
+ if (state.artwork != nil && ![self.fileManager hasUploadedFile:state.artwork]) {
+ [otherStatesToBeUploaded addObject:state.artwork];
+ }
+ }
+ }
+
+ if (otherStatesToBeUploaded.count > 0) {
+ SDLLogD(@"Uploading soft button other state artworks");
+ [self.fileManager uploadArtworks:[otherStatesToBeUploaded copy] completionHandler:^(NSArray<NSString *> * _Nonnull artworkNames, NSError * _Nullable error) {
+ if (error != nil) {
+ SDLLogE(@"Error uploading soft button artworks: %@", error);
+ }
+
+ SDLLogD(@"Soft button other state artworks uploaded");
+ // In case our soft button states have changed in the meantime
+ [self sdl_updateWithCompletionHandler:nil];
+ }];
+ }
+}
+
#pragma mark - Creating Soft Buttons
/**
@@ -336,7 +366,9 @@ NS_ASSUME_NONNULL_BEGIN
self.displayCapabilities = response.displayCapabilities;
// Auto-send an updated Show
- [self updateWithCompletionHandler:nil];
+ if (self.softButtonObjects.count > 0) {
+ [self updateWithCompletionHandler:nil];
+ }
}
- (void)sdl_hmiStatusNotification:(SDLRPCNotificationNotification *)notification {
@@ -346,12 +378,8 @@ NS_ASSUME_NONNULL_BEGIN
self.currentLevel = hmiStatus.hmiLevel;
// Auto-send an updated show if we were in NONE and now we are not
- if ([oldHMILevel isEqualToString:SDLHMILevelNone] && ![self.currentLevel isEqualToString:SDLHMILevelNone]) {
- if (self.waitingOnHMILevelUpdateToSetButtons) {
- [self setSoftButtonObjects:_softButtonObjects];
- } else {
- [self sdl_updateWithCompletionHandler:nil];
- }
+ if ([oldHMILevel isEqualToString:SDLHMILevelNone] && ![self.currentLevel isEqualToString:SDLHMILevelNone] && self.waitingOnHMILevelUpdateToUpdate) {
+ [self updateWithCompletionHandler:nil];
}
}
diff --git a/SmartDeviceLink/SDLSoftButtonObject.m b/SmartDeviceLink/SDLSoftButtonObject.m
index be7915a55..427421590 100644
--- a/SmartDeviceLink/SDLSoftButtonObject.m
+++ b/SmartDeviceLink/SDLSoftButtonObject.m
@@ -16,6 +16,12 @@
NS_ASSUME_NONNULL_BEGIN
+@interface SDLSoftButtonManager()
+
+- (void)sdl_transitionSoftButton:(SDLSoftButtonObject *)softButton;
+
+@end
+
@interface SDLSoftButtonObject()
@property (assign, nonatomic) NSUInteger buttonId;
@@ -55,7 +61,7 @@ NS_ASSUME_NONNULL_BEGIN
SDLLogD(@"Transitioning button %@ to state %@", self.name, stateName);
self.currentStateName = stateName;
- [self.manager updateWithCompletionHandler:nil];
+ [self.manager sdl_transitionSoftButton:self];
return YES;
}
diff --git a/SmartDeviceLink/SDLSpeechCapabilities.h b/SmartDeviceLink/SDLSpeechCapabilities.h
index c6ebca70b..6f25deebc 100644
--- a/SmartDeviceLink/SDLSpeechCapabilities.h
+++ b/SmartDeviceLink/SDLSpeechCapabilities.h
@@ -35,3 +35,8 @@ extern SDLSpeechCapabilities const SDLSpeechCapabilitiesPrerecorded;
The SDL platform can speak Silence.
*/
extern SDLSpeechCapabilities const SDLSpeechCapabilitiesSilence;
+
+/**
+ The SDL platform can play a file
+ */
+extern SDLSpeechCapabilities const SDLSpeechCapabilitiesFile;
diff --git a/SmartDeviceLink/SDLSpeechCapabilities.m b/SmartDeviceLink/SDLSpeechCapabilities.m
index 22dceb60a..33a349974 100644
--- a/SmartDeviceLink/SDLSpeechCapabilities.m
+++ b/SmartDeviceLink/SDLSpeechCapabilities.m
@@ -9,3 +9,4 @@ SDLSpeechCapabilities const SDLSpeechCapabilitiesSAPIPhonemes = @"SAPI_PHONEMES"
SDLSpeechCapabilities const SDLSpeechCapabilitiesLHPlusPhonemes = @"LHPLUS_PHONEMES";
SDLSpeechCapabilities const SDLSpeechCapabilitiesPrerecorded = @"PRE_RECORDED";
SDLSpeechCapabilities const SDLSpeechCapabilitiesSilence = @"SILENCE";
+SDLSpeechCapabilities const SDLSpeechCapabilitiesFile = @"FILE";
diff --git a/SmartDeviceLink/SDLStaticIconName.h b/SmartDeviceLink/SDLStaticIconName.h
new file mode 100644
index 000000000..fcda703f1
--- /dev/null
+++ b/SmartDeviceLink/SDLStaticIconName.h
@@ -0,0 +1,900 @@
+//
+// SDLStaticIconName.h
+// SmartDeviceLink
+//
+// Created by Nicole on 7/23/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+#import "SDLEnum.h"
+
+/*
+ * Static icon names
+ */
+typedef SDLEnum SDLStaticIconName SDL_SWIFT_ENUM;
+
+/*
+ * Static icon accept call / active phone call in progress / initiate a phone call
+ */
+extern SDLStaticIconName const SDLStaticIconNameAcceptCall;
+
+/*
+ * Static icon add waypoint
+ */
+extern SDLStaticIconName const SDLStaticIconNameAddWaypoint;
+
+/*
+ * Static icon album
+ */
+extern SDLStaticIconName const SDLStaticIconNameAlbum;
+
+/*
+ * Static icon ambient lighting
+ */
+extern SDLStaticIconName const SDLStaticIconNameAmbientLighting;
+
+/*
+ * Static icon arrow - north
+ */
+extern SDLStaticIconName const SDLStaticIconNameArrowNorth;
+
+/*
+ * Static icon audio mute
+ */
+extern SDLStaticIconName const SDLStaticIconNameAudioMute;
+
+/*
+ * Static icon audiobook episode
+ */
+extern SDLStaticIconName const SDLStaticIconNameAudiobookEpisode;
+
+/*
+ * Static icon audiobook narrator
+ */
+extern SDLStaticIconName const SDLStaticIconNameAudiobookNarrator;
+
+/*
+ * Static icon auxillary audio
+ */
+extern SDLStaticIconName const SDLStaticIconNameAuxillaryAudio;
+
+/*
+ * Static icon back / return
+ */
+extern SDLStaticIconName const SDLStaticIconNameBack;
+
+/*
+ * Static icon battery capacity 0 of 5
+ */
+extern SDLStaticIconName const SDLStaticIconNameBatteryCapacity0Of5;
+
+/*
+ * Static icon battery capacity 1 of 5
+ */
+extern SDLStaticIconName const SDLStaticIconNameBatteryCapacity1Of5;
+
+/*
+ * Static icon battery capacity 2 of 5
+ */
+extern SDLStaticIconName const SDLStaticIconNameBatteryCapacity2Of5;
+
+/*
+ * Static icon battery capacity 3 of 5
+ */
+extern SDLStaticIconName const SDLStaticIconNameBatteryCapacity3Of5;
+
+/*
+ * Static icon battery capacity 4 of 5
+ */
+extern SDLStaticIconName const SDLStaticIconNameBatteryCapacity4Of5;
+
+/*
+ * Static icon battery capacity 5 of 5
+ */
+extern SDLStaticIconName const SDLStaticIconNameBatteryCapacity5Of5;
+
+/*
+ * Static icon bluetooth audio source
+ */
+extern SDLStaticIconName const SDLStaticIconNameBluetoothAudioSource;
+
+/*
+ * Static icon bluetooth1
+ */
+extern SDLStaticIconName const SDLStaticIconNameBluetooth1;
+
+/*
+ * Static icon bluetooth2
+ */
+extern SDLStaticIconName const SDLStaticIconNameBluetooth2;
+
+/*
+ * Static icon browse
+ */
+extern SDLStaticIconName const SDLStaticIconNameBrowse;
+
+/*
+ * Static icon cell phone in roaming mode
+ */
+extern SDLStaticIconName const SDLStaticIconNameCellPhoneInRoamingMode;
+
+/*
+ * Static icon cell service signal strength 0 of 5 bars
+ */
+extern SDLStaticIconName const SDLStaticIconNameCellServiceSignalStrength0Of5Bars;
+
+/*
+ * Static icon cell service signal strength 1 of 5 bars
+ */
+extern SDLStaticIconName const SDLStaticIconNameCellServiceSignalStrength1Of5Bars;
+
+/*
+ * Static icon cell service signal strength 2 of 5 bars
+ */
+extern SDLStaticIconName const SDLStaticIconNameCellServiceSignalStrength2Of5Bars;
+
+/*
+ * Static icon cell service signal strength 3 of 5 bars
+ */
+extern SDLStaticIconName const SDLStaticIconNameCellServiceSignalStrength3Of5Bars;
+
+/*
+ * Static icon cell service signal strength 4 of 5 bars
+ */
+extern SDLStaticIconName const SDLStaticIconNameCellServiceSignalStrength4Of5Bars;
+
+/*
+ * Static icon cell service signal strength 5 of 5 bars
+ */
+extern SDLStaticIconName const SDLStaticIconNameCellServiceSignalStrength5Of5Bars;
+
+/*
+ * Static icon change lane left
+ */
+extern SDLStaticIconName const SDLStaticIconNameChangeLaneLeft;
+
+/*
+ * Static icon change lane right
+ */
+extern SDLStaticIconName const SDLStaticIconNameChangeLaneRight;
+
+/*
+ * Static icon check box checked
+ */
+extern SDLStaticIconName const SDLStaticIconNameCheckBoxChecked;
+
+/*
+ * Static icon check box unchecked
+ */
+extern SDLStaticIconName const SDLStaticIconNameCheckBoxUnchecked;
+
+/*
+ * Static icon climate
+ */
+extern SDLStaticIconName const SDLStaticIconNameClimate;
+
+/*
+ * Static icon clock
+ */
+extern SDLStaticIconName const SDLStaticIconNameClock;
+
+/*
+ * Static icon compose (e.g. message)
+ */
+extern SDLStaticIconName const SDLStaticIconNameCompose;
+
+/*
+ * Static icon contact / person
+ */
+extern SDLStaticIconName const SDLStaticIconNameContact;
+
+/*
+ * Static icon continue
+ */
+extern SDLStaticIconName const SDLStaticIconNameContinue;
+
+/*
+ * Static icon dash / bullet point
+ */
+extern SDLStaticIconName const SDLStaticIconNameDash;
+
+/*
+ * Static icon date / calendar
+ */
+extern SDLStaticIconName const SDLStaticIconNameDate;
+
+/*
+ * Static icon delete/remove - trash
+ */
+extern SDLStaticIconName const SDLStaticIconNameDelete;
+
+/*
+ * Static icon destination
+ */
+extern SDLStaticIconName const SDLStaticIconNameDestination;
+
+/*
+ * Static icon destination ferry ahead
+ */
+extern SDLStaticIconName const SDLStaticIconNameDestinationFerryAhead;
+
+/*
+ * Static icon ebookmark (e.g. message, feed)
+ */
+extern SDLStaticIconName const SDLStaticIconNameEbookmark;
+
+/*
+ * Static icon empty (i.e. no image)
+ */
+extern SDLStaticIconName const SDLStaticIconNameEmpty;
+
+/*
+ * Static icon end call / reject call
+ */
+extern SDLStaticIconName const SDLStaticIconNameEndCall;
+
+/*
+ * Static icon fail / X
+ */
+extern SDLStaticIconName const SDLStaticIconNameFail;
+
+/*
+ * Static icon fast forward 30 secs
+ */
+extern SDLStaticIconName const SDLStaticIconNameFastForward30Secs;
+
+/*
+ * Static icon favorite / heart
+ */
+extern SDLStaticIconName const SDLStaticIconNameFavoriteHeart;
+
+/*
+ * Static icon favorite / star
+ */
+extern SDLStaticIconName const SDLStaticIconNameFavoriteStar;
+
+/*
+ * Static icon fax number
+ */
+extern SDLStaticIconName const SDLStaticIconNameFaxNumber;
+
+/*
+ * Static icon filename
+ */
+extern SDLStaticIconName const SDLStaticIconNameFilename;
+
+/*
+ * Static icon filter / search
+ */
+extern SDLStaticIconName const SDLStaticIconNameFilter;
+
+/*
+ * Static icon folder
+ */
+extern SDLStaticIconName const SDLStaticIconNameFolder;
+
+/*
+ * Static icon fuel prices
+ */
+extern SDLStaticIconName const SDLStaticIconNameFuelPrices;
+
+/*
+ * Static icon full map
+ */
+extern SDLStaticIconName const SDLStaticIconNameFullMap;
+
+/*
+ * Static icon generic phone number
+ */
+extern SDLStaticIconName const SDLStaticIconNameGenericPhoneNumber;
+
+/*
+ * Static icon genre
+ */
+extern SDLStaticIconName const SDLStaticIconNameGenre;
+
+/*
+ * Static icon global keyboard
+ */
+extern SDLStaticIconName const SDLStaticIconNameGlobalKeyboard;
+
+/*
+ * Static icon highway exit information
+ */
+extern SDLStaticIconName const SDLStaticIconNameHighwayExitInformation;
+
+/*
+ * Static icon home phone number
+ */
+extern SDLStaticIconName const SDLStaticIconNameHomePhoneNumber;
+
+/*
+ * Static icon hyperlink
+ */
+extern SDLStaticIconName const SDLStaticIconNameHyperlink;
+
+/*
+ * Static icon ID3 tag unknown
+ */
+extern SDLStaticIconName const SDLStaticIconNameID3TagUnknown;
+
+/*
+ * Static icon incoming calls (in list of phone calls)
+ */
+extern SDLStaticIconName const SDLStaticIconNameIncomingCalls;
+
+/*
+ * Static icon information
+ */
+extern SDLStaticIconName const SDLStaticIconNameInformation;
+
+/*
+ * Static icon IPOD media source
+ */
+extern SDLStaticIconName const SDLStaticIconNameIPodMediaSource;
+
+/*
+ * Static icon join calls
+ */
+extern SDLStaticIconName const SDLStaticIconNameJoinCalls;
+
+/*
+ * Static icon keep left
+ */
+extern SDLStaticIconName const SDLStaticIconNameKeepLeft;
+
+/*
+ * Static icon keep right
+ */
+extern SDLStaticIconName const SDLStaticIconNameKeepRight;
+
+/*
+ * Static icon key / keycode
+ */
+extern SDLStaticIconName const SDLStaticIconNameKey;
+
+/*
+ * Static icon left
+ */
+extern SDLStaticIconName const SDLStaticIconNameLeft;
+
+/*
+ * Static icon left arrow / back
+ */
+extern SDLStaticIconName const SDLStaticIconNameLeftArrow;
+
+/*
+ * Static icon left exit
+ */
+extern SDLStaticIconName const SDLStaticIconNameLeftExit;
+
+/*
+ * Static icon LINE IN audio source
+ */
+extern SDLStaticIconName const SDLStaticIconNameLineInAudioSource;
+
+/*
+ * Static icon locked
+ */
+extern SDLStaticIconName const SDLStaticIconNameLocked;
+
+/*
+ * Static icon media control - left arrow
+ */
+extern SDLStaticIconName const SDLStaticIconNameMediaControlLeftArrow;
+
+/*
+ * Static icon media control - recording
+ */
+extern SDLStaticIconName const SDLStaticIconNameMediaControlRecording;
+
+/*
+ * Static icon media control - right arrow
+ */
+extern SDLStaticIconName const SDLStaticIconNameMediaControlRightArrow;
+
+/*
+ * Static icon media control - stop (e.g. streaming)
+ */
+extern SDLStaticIconName const SDLStaticIconNameMediaControlStop;
+
+/*
+ * Static icon microphone
+ */
+extern SDLStaticIconName const SDLStaticIconNameMicrophone;
+
+/*
+ * Static icon missed calls (in list of phone calls)
+ */
+extern SDLStaticIconName const SDLStaticIconNameMissedCalls;
+
+/*
+ * Static icon mobile phone number
+ */
+extern SDLStaticIconName const SDLStaticIconNameMobilePhoneNumber;
+
+/*
+ * Static icon move down / download
+ */
+extern SDLStaticIconName const SDLStaticIconNameMoveDown;
+
+/*
+ * Static icon move up
+ */
+extern SDLStaticIconName const SDLStaticIconNameMoveUp;
+
+/*
+ * Static icon MP3 tag artist
+ */
+extern SDLStaticIconName const SDLStaticIconNameMP3TagArtist;
+
+/*
+ * Static icon navigation / navigation settings
+ */
+extern SDLStaticIconName const SDLStaticIconNameNavigation;
+
+/*
+ * Static icon navigation current direction
+ */
+extern SDLStaticIconName const SDLStaticIconNameNavigationCurrentDirection;
+
+/*
+ * Static icon negative rating - thumbs down
+ */
+extern SDLStaticIconName const SDLStaticIconNameNegativeRatingThumbsDown;
+
+/*
+ * Static icon new/unread text message/email
+ */
+extern SDLStaticIconName const SDLStaticIconNameNew;
+
+/*
+ * Static icon office phone number / work phone number
+ */
+extern SDLStaticIconName const SDLStaticIconNameOfficePhoneNumber;
+
+/*
+ * Static icon opened/read text message/email
+ */
+extern SDLStaticIconName const SDLStaticIconNameOpened;
+
+/*
+ * Static icon origin / nearby locale / current position
+ */
+extern SDLStaticIconName const SDLStaticIconNameOrigin;
+
+/*
+ * Static icon outgoing calls (in list of phone calls)
+ */
+extern SDLStaticIconName const SDLStaticIconNameOutgoingCalls;
+
+/*
+ * Static icon play / pause - pause active
+ */
+extern SDLStaticIconName const SDLStaticIconNamePause;
+
+/*
+ * Static icon phone call 1
+ */
+extern SDLStaticIconName const SDLStaticIconNamePhoneCall1;
+
+/*
+ * Static icon phone call 2
+ */
+extern SDLStaticIconName const SDLStaticIconNamePhoneCall2;
+
+/*
+ * Static icon phone device
+ */
+extern SDLStaticIconName const SDLStaticIconNamePhoneDevice;
+
+/*
+ * Static icon phonebook
+ */
+extern SDLStaticIconName const SDLStaticIconNamePhonebook;
+
+/*
+ * Static icon photo / picture
+ */
+extern SDLStaticIconName const SDLStaticIconNamePhoto;
+
+/*
+ * Static icon play / pause - play active
+ */
+extern SDLStaticIconName const SDLStaticIconNamePlay;
+
+/*
+ * Static icon playlist
+ */
+extern SDLStaticIconName const SDLStaticIconNamePlaylist;
+
+/*
+ * Static icon pop-up
+ */
+extern SDLStaticIconName const SDLStaticIconNamePopUp;
+
+/*
+ * Static icon positive rating - thumbs up
+ */
+extern SDLStaticIconName const SDLStaticIconNamePositiveRatingThumbsUp;
+
+/*
+ * Static icon power
+ */
+extern SDLStaticIconName const SDLStaticIconNamePower;
+
+/*
+ * Static icon primary phone (favorite)
+ */
+extern SDLStaticIconName const SDLStaticIconNamePrimaryPhone;
+
+/*
+ * Static icon radio button checked
+ */
+extern SDLStaticIconName const SDLStaticIconNameRadioButtonChecked;
+
+/*
+ * Static icon radio button unchecked
+ */
+extern SDLStaticIconName const SDLStaticIconNameRadioButtonUnchecked;
+
+/*
+ * Static icon recent calls / history
+ */
+extern SDLStaticIconName const SDLStaticIconNameRecentCalls;
+
+/*
+ * Static icon recent destinations
+ */
+extern SDLStaticIconName const SDLStaticIconNameRecentDestinations;
+
+/*
+ * Static icon redo
+ */
+extern SDLStaticIconName const SDLStaticIconNameRedo;
+
+/*
+ * Static icon refresh
+ */
+extern SDLStaticIconName const SDLStaticIconNameRefresh;
+
+/*
+ * Static icon remote diagnostics - check engine
+ */
+extern SDLStaticIconName const SDLStaticIconNameRemoteDiagnosticsCheckEngine;
+
+/*
+ * Static icon rendered 911 assist / emergency assistance
+ */
+extern SDLStaticIconName const SDLStaticIconNameRendered911Assist;
+
+/*
+ * Static icon repeat
+ */
+extern SDLStaticIconName const SDLStaticIconNameRepeat;
+
+/*
+ * Static icon repeat play
+ */
+extern SDLStaticIconName const SDLStaticIconNameRepeatPlay;
+
+/*
+ * Static icon reply
+ */
+extern SDLStaticIconName const SDLStaticIconNameReply;
+
+/*
+ * Static icon rewind 30 secs
+ */
+extern SDLStaticIconName const SDLStaticIconNameRewind30Secs;
+
+/*
+ * Static icon right
+ */
+extern SDLStaticIconName const SDLStaticIconNameRight;
+
+/*
+ * Static icon right exit
+ */
+extern SDLStaticIconName const SDLStaticIconNameRightExit;
+
+/*
+ * Static icon ringtones
+ */
+extern SDLStaticIconName const SDLStaticIconNameRingtones;
+
+/*
+ * Static icon roundabout left hand 1
+ */
+extern SDLStaticIconName const SDLStaticIconNameRoundaboutLeftHand1;
+
+/*
+ * Static icon roundabout left hand 2
+ */
+extern SDLStaticIconName const SDLStaticIconNameRoundaboutLeftHand2;
+
+/*
+ * Static icon roundabout left hand 3
+ */
+extern SDLStaticIconName const SDLStaticIconNameRoundaboutLeftHand3;
+
+/*
+ * Static icon roundabout left hand 4
+ */
+extern SDLStaticIconName const SDLStaticIconNameRoundaboutLeftHand4;
+
+/*
+ * Static icon roundabout left hand 5
+ */
+extern SDLStaticIconName const SDLStaticIconNameRoundaboutLeftHand5;
+
+/*
+ * Static icon roundabout left hand 6
+ */
+extern SDLStaticIconName const SDLStaticIconNameRoundaboutLeftHand6;
+
+/*
+ * Static icon roundabout left hand 7
+ */
+extern SDLStaticIconName const SDLStaticIconNameRoundaboutLeftHand7;
+
+/*
+ * Static icon roundabout right hand 1
+ */
+extern SDLStaticIconName const SDLStaticIconNameRoundaboutRightHand1;
+
+/*
+ * Static icon roundabout right hand 2
+ */
+extern SDLStaticIconName const SDLStaticIconNameRoundaboutRightHand2;
+
+/*
+ * Static icon roundabout right hand 3
+ */
+extern SDLStaticIconName const SDLStaticIconNameRoundaboutRightHand3;
+
+/*
+ * Static icon roundabout right hand 4
+ */
+extern SDLStaticIconName const SDLStaticIconNameRoundaboutRightHand4;
+
+/*
+ * Static icon roundabout right hand 5
+ */
+extern SDLStaticIconName const SDLStaticIconNameRoundaboutRightHand5;
+
+/*
+ * Static icon roundabout right hand 6
+ */
+extern SDLStaticIconName const SDLStaticIconNameRoundaboutRightHand6;
+
+/*
+ * Static icon roundabout right hand 7
+ */
+extern SDLStaticIconName const SDLStaticIconNameRoundaboutRightHand7;
+
+/*
+ * Static icon RSS
+ */
+extern SDLStaticIconName const SDLStaticIconNameRSS;
+
+/*
+ * Static icon settings / menu
+ */
+extern SDLStaticIconName const SDLStaticIconNameSettings;
+
+/*
+ * Static icon sharp left
+ */
+extern SDLStaticIconName const SDLStaticIconNameSharpLeft;
+
+/*
+ * Static icon sharp right
+ */
+extern SDLStaticIconName const SDLStaticIconNameSharpRight;
+
+/*
+ * Static icon show
+ */
+extern SDLStaticIconName const SDLStaticIconNameShow;
+
+/*
+ * Static icon shuffle play
+ */
+extern SDLStaticIconName const SDLStaticIconNameShufflePlay;
+
+/*
+ * Static icon ski places / elevation / altitude
+ */
+extern SDLStaticIconName const SDLStaticIconNameSkiPlaces;
+
+/*
+ * Static icon slight left
+ */
+extern SDLStaticIconName const SDLStaticIconNameSlightLeft;
+
+/*
+ * Static icon slight right
+ */
+extern SDLStaticIconName const SDLStaticIconNameSlightRight;
+
+/*
+ * Static icon smartphone
+ */
+extern SDLStaticIconName const SDLStaticIconNameSmartphone;
+
+/*
+ * Static icon sort list
+ */
+extern SDLStaticIconName const SDLStaticIconNameSortList;
+
+/*
+ * Static icon speed dial numbers - number 0
+ */
+extern SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber0;
+
+/*
+ * Static icon speed dial numbers - number 1
+ */
+extern SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber1;
+
+/*
+ * Static icon speed dial numbers - number 2
+ */
+extern SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber2;
+
+/*
+ * Static icon speed dial numbers - number 3
+ */
+extern SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber3;
+
+/*
+ * Static icon speed dial numbers - number 4
+ */
+extern SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber4;
+
+/*
+ * Static icon speed dial numbers - number 5
+ */
+extern SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber5;
+
+/*
+ * Static icon speed dial numbers - number 6
+ */
+extern SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber6;
+
+/*
+ * Static icon speed dial numbers - number 7
+ */
+extern SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber7;
+
+/*
+ * Static icon speed dial numbers - number 8
+ */
+extern SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber8;
+
+/*
+ * Static icon speed dial numbers - number 9
+ */
+extern SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber9;
+
+/*
+ * Static icon success / check
+ */
+extern SDLStaticIconName const SDLStaticIconNameSuccess;
+
+/*
+ * Static icon track title / song title
+ */
+extern SDLStaticIconName const SDLStaticIconNameTrackTitle;
+
+/*
+ * Static icon traffic report
+ */
+extern SDLStaticIconName const SDLStaticIconNameTrafficReport;
+
+/*
+ * Static icon turn list
+ */
+extern SDLStaticIconName const SDLStaticIconNameTurnList;
+
+/*
+ * Static icon u-turn left traffic
+ */
+extern SDLStaticIconName const SDLStaticIconNameUTurnLeftTraffic;
+
+/*
+ * Static icon u-turn right traffic
+ */
+extern SDLStaticIconName const SDLStaticIconNameUTurnRightTraffic;
+
+/*
+ * Static icon undo
+ */
+extern SDLStaticIconName const SDLStaticIconNameUndo;
+
+/*
+ * Static icon unlocked
+ */
+extern SDLStaticIconName const SDLStaticIconNameUnlocked;
+
+/*
+ * Static icon USB media audio source
+ */
+extern SDLStaticIconName const SDLStaticIconNameUSBMediaAudioSource;
+
+/*
+ * Static icon voice control scrollbar - list item no. 1
+ */
+extern SDLStaticIconName const SDLStaticIconNameVoiceControlScrollbarListItemNo1;
+
+/*
+ * Static icon voice control scrollbar - list item no. 2
+ */
+extern SDLStaticIconName const SDLStaticIconNameVoiceControlScrollbarListItemNo2;
+
+/*
+ * Static icon voice control scrollbar - list item no. 3
+ */
+extern SDLStaticIconName const SDLStaticIconNameVoiceControlScrollbarListItemNo3;
+
+/*
+ * Static icon voice control scrollbar - list item no. 4
+ */
+extern SDLStaticIconName const SDLStaticIconNameVoiceControlScrollbarListItemNo4;
+
+/*
+ * Static icon voice recognition - failed
+ */
+extern SDLStaticIconName const SDLStaticIconNameVoiceRecognitionFailed;
+
+/*
+ * Static icon voice recognition - pause
+ */
+extern SDLStaticIconName const SDLStaticIconNameVoiceRecognitionPause;
+
+/*
+ * Static icon voice recognition - successful
+ */
+extern SDLStaticIconName const SDLStaticIconNameVoiceRecognitionSuccessful;
+
+/*
+ * Static icon voice recognition - system active
+ */
+extern SDLStaticIconName const SDLStaticIconNameVoiceRecognitionSystemActive;
+
+/*
+ * Static icon voice recognition - system listening
+ */
+extern SDLStaticIconName const SDLStaticIconNameVoiceRecognitionSystemListening;
+
+/*
+ * Static icon voice recognition - try again
+ */
+extern SDLStaticIconName const SDLStaticIconNameVoiceRecognitionTryAgain;
+
+/*
+ * Static icon warning / safety alert
+ */
+extern SDLStaticIconName const SDLStaticIconNameWarning;
+
+/*
+ * Static icon weather
+ */
+extern SDLStaticIconName const SDLStaticIconNameWeather;
+
+/*
+ * Static icon wifi full
+ */
+extern SDLStaticIconName const SDLStaticIconNameWifiFull;
+
+/*
+ * Static icon zoom in
+ */
+extern SDLStaticIconName const SDLStaticIconNameZoomIn;
+
+/*
+ * Static icon zoom out
+ */
+extern SDLStaticIconName const SDLStaticIconNameZoomOut;
+
diff --git a/SmartDeviceLink/SDLStaticIconName.m b/SmartDeviceLink/SDLStaticIconName.m
new file mode 100644
index 000000000..c39ef14f2
--- /dev/null
+++ b/SmartDeviceLink/SDLStaticIconName.m
@@ -0,0 +1,188 @@
+//
+// SDLStaticIconName.m
+// SmartDeviceLink
+//
+// Created by Nicole on 7/23/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+#import "SDLStaticIconName.h"
+
+SDLStaticIconName const SDLStaticIconNameAcceptCall = @"0x29";
+SDLStaticIconName const SDLStaticIconNameAddWaypoint = @"0x1B";
+SDLStaticIconName const SDLStaticIconNameAlbum = @"0x21";
+SDLStaticIconName const SDLStaticIconNameAmbientLighting = @"0x3d";
+SDLStaticIconName const SDLStaticIconNameArrowNorth = @"0x40";
+SDLStaticIconName const SDLStaticIconNameAudioMute = @"0x12";
+SDLStaticIconName const SDLStaticIconNameAudiobookEpisode = @"0x83";
+SDLStaticIconName const SDLStaticIconNameAudiobookNarrator = @"0x82";
+SDLStaticIconName const SDLStaticIconNameAuxillaryAudio = @"0x45";
+SDLStaticIconName const SDLStaticIconNameBack = @"0x86";
+SDLStaticIconName const SDLStaticIconNameBatteryCapacity0Of5 = @"0xF7";
+SDLStaticIconName const SDLStaticIconNameBatteryCapacity1Of5 = @"0xF8";
+SDLStaticIconName const SDLStaticIconNameBatteryCapacity2Of5 = @"0xF9";
+SDLStaticIconName const SDLStaticIconNameBatteryCapacity3Of5 = @"0xFA";
+SDLStaticIconName const SDLStaticIconNameBatteryCapacity4Of5 = @"0xf6";
+SDLStaticIconName const SDLStaticIconNameBatteryCapacity5Of5 = @"0xFB";
+SDLStaticIconName const SDLStaticIconNameBluetoothAudioSource = @"0x09";
+SDLStaticIconName const SDLStaticIconNameBluetooth1 = @"0xcc";
+SDLStaticIconName const SDLStaticIconNameBluetooth2 = @"0xCD";
+SDLStaticIconName const SDLStaticIconNameBrowse = @"0x77";
+SDLStaticIconName const SDLStaticIconNameCellPhoneInRoamingMode = @"0x66";
+SDLStaticIconName const SDLStaticIconNameCellServiceSignalStrength0Of5Bars = @"0x67";
+SDLStaticIconName const SDLStaticIconNameCellServiceSignalStrength1Of5Bars = @"0x68";
+SDLStaticIconName const SDLStaticIconNameCellServiceSignalStrength2Of5Bars = @"0x69";
+SDLStaticIconName const SDLStaticIconNameCellServiceSignalStrength3Of5Bars = @"0x6A";
+SDLStaticIconName const SDLStaticIconNameCellServiceSignalStrength4Of5Bars = @"0x6B";
+SDLStaticIconName const SDLStaticIconNameCellServiceSignalStrength5Of5Bars = @"0xd3";
+SDLStaticIconName const SDLStaticIconNameChangeLaneLeft = @"0xc3";
+SDLStaticIconName const SDLStaticIconNameChangeLaneRight = @"0xc1";
+SDLStaticIconName const SDLStaticIconNameCheckBoxChecked = @"0x27";
+SDLStaticIconName const SDLStaticIconNameCheckBoxUnchecked = @"0x28";
+SDLStaticIconName const SDLStaticIconNameClimate = @"0xd1";
+SDLStaticIconName const SDLStaticIconNameClock = @"0xfc";
+SDLStaticIconName const SDLStaticIconNameCompose = @"0x1A";
+SDLStaticIconName const SDLStaticIconNameContact = @"0x5C";
+SDLStaticIconName const SDLStaticIconNameContinue = @"0x42";
+SDLStaticIconName const SDLStaticIconNameDash = @"0x7F";
+SDLStaticIconName const SDLStaticIconNameDate = @"0x87";
+SDLStaticIconName const SDLStaticIconNameDelete = @"0x0F";
+SDLStaticIconName const SDLStaticIconNameDestination = @"0x94";
+SDLStaticIconName const SDLStaticIconNameDestinationFerryAhead = @"0x4D";
+SDLStaticIconName const SDLStaticIconNameEbookmark = @"0x2B";
+SDLStaticIconName const SDLStaticIconNameEmpty = @"0x01";
+SDLStaticIconName const SDLStaticIconNameEndCall = @"0x2C";
+SDLStaticIconName const SDLStaticIconNameFail = @"0xD6";
+SDLStaticIconName const SDLStaticIconNameFastForward30Secs = @"0x08";
+SDLStaticIconName const SDLStaticIconNameFavoriteHeart = @"0x0E";
+SDLStaticIconName const SDLStaticIconNameFavoriteStar = @"0x95";
+SDLStaticIconName const SDLStaticIconNameFaxNumber = @"0x80";
+SDLStaticIconName const SDLStaticIconNameFilename = @"0x50";
+SDLStaticIconName const SDLStaticIconNameFilter = @"0x79";
+SDLStaticIconName const SDLStaticIconNameFolder = @"0x1C";
+SDLStaticIconName const SDLStaticIconNameFuelPrices = @"0xe9";
+SDLStaticIconName const SDLStaticIconNameFullMap = @"0x0c";
+SDLStaticIconName const SDLStaticIconNameGenericPhoneNumber = @"0x53";
+SDLStaticIconName const SDLStaticIconNameGenre = @"0x4E";
+SDLStaticIconName const SDLStaticIconNameGlobalKeyboard = @"0xea";
+SDLStaticIconName const SDLStaticIconNameHighwayExitInformation = @"0xf4";
+SDLStaticIconName const SDLStaticIconNameHomePhoneNumber = @"0x55";
+SDLStaticIconName const SDLStaticIconNameHyperlink = @"0x78";
+SDLStaticIconName const SDLStaticIconNameID3TagUnknown = @"0x51";
+SDLStaticIconName const SDLStaticIconNameIncomingCalls = @"0x57";
+SDLStaticIconName const SDLStaticIconNameInformation = @"0x5d";
+SDLStaticIconName const SDLStaticIconNameIPodMediaSource = @"0x0D";
+SDLStaticIconName const SDLStaticIconNameJoinCalls = @"0x02";
+SDLStaticIconName const SDLStaticIconNameKeepLeft = @"0x46";
+SDLStaticIconName const SDLStaticIconNameKeepRight = @"0x48";
+SDLStaticIconName const SDLStaticIconNameKey = @"0x7D";
+SDLStaticIconName const SDLStaticIconNameLeft = @"0x9f";
+SDLStaticIconName const SDLStaticIconNameLeftArrow = @"0x4B";
+SDLStaticIconName const SDLStaticIconNameLeftExit = @"0xaf";
+SDLStaticIconName const SDLStaticIconNameLineInAudioSource = @"0x06";
+SDLStaticIconName const SDLStaticIconNameLocked = @"0x22";
+SDLStaticIconName const SDLStaticIconNameMediaControlLeftArrow = @"0x17";
+SDLStaticIconName const SDLStaticIconNameMediaControlRecording = @"0x20";
+SDLStaticIconName const SDLStaticIconNameMediaControlRightArrow = @"0x15";
+SDLStaticIconName const SDLStaticIconNameMediaControlStop = @"0x16";
+SDLStaticIconName const SDLStaticIconNameMicrophone = @"0xe8";
+SDLStaticIconName const SDLStaticIconNameMissedCalls = @"0x58";
+SDLStaticIconName const SDLStaticIconNameMobilePhoneNumber = @"0x54";
+SDLStaticIconName const SDLStaticIconNameMoveDown = @"0xE5";
+SDLStaticIconName const SDLStaticIconNameMoveUp = @"0xe4";
+SDLStaticIconName const SDLStaticIconNameMP3TagArtist = @"0x24";
+SDLStaticIconName const SDLStaticIconNameNavigation = @"0x8e";
+SDLStaticIconName const SDLStaticIconNameNavigationCurrentDirection = @"0x0a";
+SDLStaticIconName const SDLStaticIconNameNegativeRatingThumbsDown = @"0x14";
+SDLStaticIconName const SDLStaticIconNameNew = @"0x5E";
+SDLStaticIconName const SDLStaticIconNameOfficePhoneNumber = @"0x56";
+SDLStaticIconName const SDLStaticIconNameOpened = @"0x5F";
+SDLStaticIconName const SDLStaticIconNameOrigin = @"0x96";
+SDLStaticIconName const SDLStaticIconNameOutgoingCalls = @"0x59";
+SDLStaticIconName const SDLStaticIconNamePause = @"0xCF";
+SDLStaticIconName const SDLStaticIconNamePhoneCall1 = @"0x1D";
+SDLStaticIconName const SDLStaticIconNamePhoneCall2 = @"0x1E";
+SDLStaticIconName const SDLStaticIconNamePhoneDevice = @"0x03";
+SDLStaticIconName const SDLStaticIconNamePhonebook = @"0x81";
+SDLStaticIconName const SDLStaticIconNamePhoto = @"0x88";
+SDLStaticIconName const SDLStaticIconNamePlay = @"0xD0";
+SDLStaticIconName const SDLStaticIconNamePlaylist = @"0x4F";
+SDLStaticIconName const SDLStaticIconNamePopUp = @"0x76";
+SDLStaticIconName const SDLStaticIconNamePositiveRatingThumbsUp = @"0x13";
+SDLStaticIconName const SDLStaticIconNamePower = @"0x5b";
+SDLStaticIconName const SDLStaticIconNamePrimaryPhone = @"0x1F";
+SDLStaticIconName const SDLStaticIconNameRadioButtonChecked = @"0x25";
+SDLStaticIconName const SDLStaticIconNameRadioButtonUnchecked = @"0x26";
+SDLStaticIconName const SDLStaticIconNameRecentCalls = @"0xe7";
+SDLStaticIconName const SDLStaticIconNameRecentDestinations = @"0xf2";
+SDLStaticIconName const SDLStaticIconNameRedo = @"0x19";
+SDLStaticIconName const SDLStaticIconNameRefresh = @"0x97";
+SDLStaticIconName const SDLStaticIconNameRemoteDiagnosticsCheckEngine = @"0x7E";
+SDLStaticIconName const SDLStaticIconNameRendered911Assist = @"0xac";
+SDLStaticIconName const SDLStaticIconNameRepeat = @"0xe6";
+SDLStaticIconName const SDLStaticIconNameRepeatPlay = @"0x73";
+SDLStaticIconName const SDLStaticIconNameReply = @"0x04";
+SDLStaticIconName const SDLStaticIconNameRewind30Secs = @"0x07";
+SDLStaticIconName const SDLStaticIconNameRight = @"0xa3";
+SDLStaticIconName const SDLStaticIconNameRightExit = @"0xb1";
+SDLStaticIconName const SDLStaticIconNameRingtones = @"0x5A";
+SDLStaticIconName const SDLStaticIconNameRoundaboutLeftHand1 = @"0xee";
+SDLStaticIconName const SDLStaticIconNameRoundaboutLeftHand2 = @"0x8c";
+SDLStaticIconName const SDLStaticIconNameRoundaboutLeftHand3 = @"0x84";
+SDLStaticIconName const SDLStaticIconNameRoundaboutLeftHand4 = @"0x72";
+SDLStaticIconName const SDLStaticIconNameRoundaboutLeftHand5 = @"0x6e";
+SDLStaticIconName const SDLStaticIconNameRoundaboutLeftHand6 = @"0x64";
+SDLStaticIconName const SDLStaticIconNameRoundaboutLeftHand7 = @"0x60";
+SDLStaticIconName const SDLStaticIconNameRoundaboutRightHand1 = @"0x62";
+SDLStaticIconName const SDLStaticIconNameRoundaboutRightHand2 = @"0x6c";
+SDLStaticIconName const SDLStaticIconNameRoundaboutRightHand3 = @"0x70";
+SDLStaticIconName const SDLStaticIconNameRoundaboutRightHand4 = @"0x7a";
+SDLStaticIconName const SDLStaticIconNameRoundaboutRightHand5 = @"0x8a";
+SDLStaticIconName const SDLStaticIconNameRoundaboutRightHand6 = @"0xec";
+SDLStaticIconName const SDLStaticIconNameRoundaboutRightHand7 = @"0xf0";
+SDLStaticIconName const SDLStaticIconNameRSS = @"0x89";
+SDLStaticIconName const SDLStaticIconNameSettings = @"0x49";
+SDLStaticIconName const SDLStaticIconNameSharpLeft = @"0xa5";
+SDLStaticIconName const SDLStaticIconNameSharpRight = @"0xa7";
+SDLStaticIconName const SDLStaticIconNameShow = @"0xe1";
+SDLStaticIconName const SDLStaticIconNameShufflePlay = @"0x74";
+SDLStaticIconName const SDLStaticIconNameSkiPlaces = @"0xab";
+SDLStaticIconName const SDLStaticIconNameSlightLeft = @"0x9d";
+SDLStaticIconName const SDLStaticIconNameSlightRight = @"0xa1";
+SDLStaticIconName const SDLStaticIconNameSmartphone = @"0x05";
+SDLStaticIconName const SDLStaticIconNameSortList = @"0x7B";
+SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber0 = @"0xE0";
+SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber1 = @"0xD7";
+SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber2 = @"0xD8";
+SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber3 = @"0xD9";
+SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber4 = @"0xDA";
+SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber5 = @"0xDB";
+SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber6 = @"0xDC";
+SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber7 = @"0xDD";
+SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber8 = @"0xDE";
+SDLStaticIconName const SDLStaticIconNameSpeedDialNumbersNumber9 = @"0xDF";
+SDLStaticIconName const SDLStaticIconNameSuccess = @"0xD5";
+SDLStaticIconName const SDLStaticIconNameTrackTitle = @"0x4C";
+SDLStaticIconName const SDLStaticIconNameTrafficReport = @"0x2A";
+SDLStaticIconName const SDLStaticIconNameTurnList = @"0x10";
+SDLStaticIconName const SDLStaticIconNameUTurnLeftTraffic = @"0xad";
+SDLStaticIconName const SDLStaticIconNameUTurnRightTraffic = @"0xa9";
+SDLStaticIconName const SDLStaticIconNameUndo = @"0x18";
+SDLStaticIconName const SDLStaticIconNameUnlocked = @"0x23";
+SDLStaticIconName const SDLStaticIconNameUSBMediaAudioSource = @"0x0B";
+SDLStaticIconName const SDLStaticIconNameVoiceControlScrollbarListItemNo1 = @"0xC7";
+SDLStaticIconName const SDLStaticIconNameVoiceControlScrollbarListItemNo2 = @"0xC8";
+SDLStaticIconName const SDLStaticIconNameVoiceControlScrollbarListItemNo3 = @"0xC9";
+SDLStaticIconName const SDLStaticIconNameVoiceControlScrollbarListItemNo4 = @"0xCA";
+SDLStaticIconName const SDLStaticIconNameVoiceRecognitionFailed = @"0x90";
+SDLStaticIconName const SDLStaticIconNameVoiceRecognitionPause = @"0x92";
+SDLStaticIconName const SDLStaticIconNameVoiceRecognitionSuccessful = @"0x8F";
+SDLStaticIconName const SDLStaticIconNameVoiceRecognitionSystemActive = @"0x11";
+SDLStaticIconName const SDLStaticIconNameVoiceRecognitionSystemListening = @"0x91";
+SDLStaticIconName const SDLStaticIconNameVoiceRecognitionTryAgain = @"0x93";
+SDLStaticIconName const SDLStaticIconNameWarning = @"0xfe";
+SDLStaticIconName const SDLStaticIconNameWeather = @"0xeb";
+SDLStaticIconName const SDLStaticIconNameWifiFull = @"0x43";
+SDLStaticIconName const SDLStaticIconNameZoomIn = @"0x98";
+SDLStaticIconName const SDLStaticIconNameZoomOut = @"0x9a";
+
diff --git a/SmartDeviceLink/SDLStreamingAudioLifecycleManager.h b/SmartDeviceLink/SDLStreamingAudioLifecycleManager.h
new file mode 100644
index 000000000..3b9fdfae3
--- /dev/null
+++ b/SmartDeviceLink/SDLStreamingAudioLifecycleManager.h
@@ -0,0 +1,94 @@
+//
+// SDLStreamingAudioLifecycleManager.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/19/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLHMILevel.h"
+#import "SDLProtocolListener.h"
+#import "SDLStreamingAudioManagerType.h"
+#import "SDLStreamingMediaManagerConstants.h"
+
+@class SDLAudioStreamManager;
+@class SDLProtocol;
+@class SDLStateMachine;
+@class SDLStreamingMediaConfiguration;
+
+@protocol SDLConnectionManagerType;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLStreamingAudioLifecycleManager : NSObject <SDLProtocolListener, SDLStreamingAudioManagerType>
+
+@property (nonatomic, strong, readonly) SDLAudioStreamManager *audioManager;
+
+@property (strong, nonatomic, readonly) SDLStateMachine *audioStreamStateMachine;
+@property (strong, nonatomic, readonly) SDLAudioStreamManagerState *currentAudioStreamState;
+
+@property (strong, nonatomic, readonly) SDLStateMachine *appStateMachine;
+@property (strong, nonatomic, readonly) SDLAppState *currentAppState;
+
+@property (copy, nonatomic, nullable) SDLHMILevel hmiLevel;
+
+/**
+ * Whether or not the audio session is connected.
+ */
+@property (assign, nonatomic, readonly, getter=isAudioConnected) BOOL audioConnected;
+
+/**
+ * Whether or not the audio session is encrypted. This may be different than the requestedEncryptionType.
+ */
+@property (assign, nonatomic, readonly, getter=isAudioEncrypted) BOOL audioEncrypted;
+
+/**
+ * Whether or not video streaming is supported
+ *
+ * @see SDLRegisterAppInterface SDLDisplayCapabilities
+ */
+@property (assign, nonatomic, readonly, getter=isStreamingSupported) BOOL streamingSupported;
+
+/**
+ * The requested encryption type when a session attempts to connect. This setting applies to both video and audio sessions.
+ *
+ * DEFAULT: SDLStreamingEncryptionFlagAuthenticateAndEncrypt
+ */
+@property (assign, nonatomic) SDLStreamingEncryptionFlag requestedEncryptionType;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+/**
+ Create a new streaming media manager for navigation and VPM apps with a specified configuration
+
+ @param connectionManager The pass-through for RPCs
+ @param configuration The configuration of this streaming media session
+ @return A new streaming manager
+ */
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager configuration:(SDLStreamingMediaConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
+
+/**
+ * Start the manager with a completion block that will be called when startup completes. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on `SDLManager`.
+ */
+- (void)startWithProtocol:(SDLProtocol *)protocol;
+
+/**
+ * Stop the manager. This method is used internally.
+ */
+- (void)stop;
+
+/**
+ * This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback
+ *
+ * @param audioData The data in PCM audio format, to be played
+ *
+ * @return Whether or not the data was successfully sent.
+ */
+- (BOOL)sendAudioData:(NSData *)audioData;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLStreamingAudioLifecycleManager.m b/SmartDeviceLink/SDLStreamingAudioLifecycleManager.m
new file mode 100644
index 000000000..a6bc98be7
--- /dev/null
+++ b/SmartDeviceLink/SDLStreamingAudioLifecycleManager.m
@@ -0,0 +1,348 @@
+//
+// SDLStreamingAudioLifecycleManager.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/19/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+#import "SDLStreamingAudioLifecycleManager.h"
+
+#import "SDLAudioStreamManager.h"
+#import "SDLConnectionManagerType.h"
+#import "SDLControlFramePayloadAudioStartServiceAck.h"
+#import "SDLControlFramePayloadConstants.h"
+#import "SDLControlFramePayloadNak.h"
+#import "SDLDisplayCapabilities.h"
+#import "SDLGlobals.h"
+#import "SDLHMICapabilities.h"
+#import "SDLLogMacros.h"
+#import "SDLOnHMIStatus.h"
+#import "SDLProtocol.h"
+#import "SDLProtocolMessage.h"
+#import "SDLRegisterAppInterfaceResponse.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLRPCResponseNotification.h"
+#import "SDLStateMachine.h"
+#import "SDLStreamingMediaConfiguration.h"
+#import "SDLVehicleType.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLStreamingAudioLifecycleManager()
+
+@property (strong, nonatomic, readwrite) SDLStateMachine *appStateMachine;
+@property (strong, nonatomic, readwrite) SDLStateMachine *audioStreamStateMachine;
+@property (assign, nonatomic, readonly, getter=isHmiStateAudioStreamCapable) BOOL hmiStateAudioStreamCapable;
+
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (weak, nonatomic) SDLProtocol *protocol;
+
+@property (copy, nonatomic) NSArray<NSString *> *secureMakes;
+@property (copy, nonatomic) NSString *connectedVehicleMake;
+
+@end
+
+@implementation SDLStreamingAudioLifecycleManager
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager configuration:(SDLStreamingMediaConfiguration *)configuration {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ SDLLogV(@"Creating AudioStreamingLifecycleManager");
+
+ _connectionManager = connectionManager;
+
+ _audioManager = [[SDLAudioStreamManager alloc] initWithManager:self];
+
+ _requestedEncryptionType = configuration.maximumDesiredEncryption;
+
+ NSMutableArray<NSString *> *tempMakeArray = [NSMutableArray array];
+ for (Class securityManagerClass in configuration.securityManagers) {
+ [tempMakeArray addObjectsFromArray:[securityManagerClass availableMakes].allObjects];
+ }
+ _secureMakes = [tempMakeArray copy];
+
+ SDLAppState *initialState = SDLAppStateInactive;
+ switch ([[UIApplication sharedApplication] applicationState]) {
+ case UIApplicationStateActive: {
+ initialState = SDLAppStateActive;
+ } break;
+ case UIApplicationStateInactive: // fallthrough
+ case UIApplicationStateBackground: {
+ initialState = SDLAppStateInactive;
+ } break;
+ default: break;
+ }
+
+ _appStateMachine = [[SDLStateMachine alloc] initWithTarget:self initialState:initialState states:[self.class sdl_appStateTransitionDictionary]];
+ _audioStreamStateMachine = [[SDLStateMachine alloc] initWithTarget:self initialState:SDLAudioStreamManagerStateStopped states:[self.class sdl_audioStreamingStateTransitionDictionary]];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_didReceiveRegisterAppInterfaceResponse:) name:SDLDidReceiveRegisterAppInterfaceResponse object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiLevelDidChange:) name:SDLDidChangeHMIStatusNotification object:nil];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_appStateDidUpdate:) name:UIApplicationDidBecomeActiveNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_appStateDidUpdate:) name:UIApplicationWillResignActiveNotification object:nil];
+
+ return self;
+}
+
+- (void)startWithProtocol:(SDLProtocol *)protocol {
+ _protocol = protocol;
+
+ if (![self.protocol.protocolDelegateTable containsObject:self]) {
+ [self.protocol.protocolDelegateTable addObject:self];
+ }
+}
+
+- (void)stop {
+ SDLLogD(@"Stopping manager");
+ [self sdl_stopAudioSession];
+
+ self.hmiLevel = SDLHMILevelNone;
+
+ [self.audioStreamStateMachine transitionToState:SDLAudioStreamManagerStateStopped];
+}
+
+- (BOOL)sendAudioData:(NSData*)audioData {
+ if (!self.isAudioConnected) {
+ return NO;
+ }
+
+ SDLLogV(@"Sending raw audio data");
+ if (self.isAudioEncrypted) {
+ [self.protocol sendEncryptedRawData:audioData onService:SDLServiceTypeAudio];
+ } else {
+ [self.protocol sendRawData:audioData withServiceType:SDLServiceTypeAudio];
+ }
+ return YES;
+}
+
+#pragma mark Getters
+
+- (BOOL)isAudioConnected {
+ return [self.audioStreamStateMachine isCurrentState:SDLAudioStreamManagerStateReady];
+}
+
+- (SDLAppState *)currentAppState {
+ return self.appStateMachine.currentState;
+}
+
+- (SDLAudioStreamManagerState *)currentAudioStreamState {
+ return self.audioStreamStateMachine.currentState;
+}
+
+#pragma mark - State Machines
+#pragma mark App State
++ (NSDictionary<SDLState *, SDLAllowableStateTransitions *> *)sdl_appStateTransitionDictionary {
+ return @{
+ // Will go from Inactive to Active if coming from a Phone Call.
+ // Will go from Inactive to IsRegainingActive if coming from Background.
+ SDLAppStateInactive : @[SDLAppStateActive],
+ SDLAppStateActive : @[SDLAppStateInactive]
+ };
+}
+
+- (void)sdl_appStateDidUpdate:(NSNotification*)notification {
+ if (notification.name == UIApplicationWillResignActiveNotification) {
+ [self.appStateMachine transitionToState:SDLAppStateInactive];
+ } else if (notification.name == UIApplicationDidBecomeActiveNotification) {
+ [self.appStateMachine transitionToState:SDLAppStateActive];
+ }
+}
+
+- (void)didEnterStateAppInactive {
+ SDLLogD(@"App became inactive");
+ [self sdl_stopAudioSession];
+}
+
+// Per Apple's guidelines: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StrategiesforHandlingAppStateTransitions/StrategiesforHandlingAppStateTransitions.html
+// We should be waiting to start any OpenGL drawing until UIApplicationDidBecomeActive is called.
+- (void)didEnterStateAppActive {
+ SDLLogD(@"App became active");
+ [self sdl_startAudioSession];
+}
+
+#pragma mark Audio
++ (NSDictionary<SDLState *, SDLAllowableStateTransitions *> *)sdl_audioStreamingStateTransitionDictionary {
+ return @{
+ SDLAudioStreamManagerStateStopped : @[SDLAudioStreamManagerStateStarting],
+ SDLAudioStreamManagerStateStarting : @[SDLAudioStreamManagerStateStopped, SDLAudioStreamManagerStateReady],
+ SDLAudioStreamManagerStateReady : @[SDLAudioStreamManagerStateShuttingDown, SDLAudioStreamManagerStateStopped],
+ SDLAudioStreamManagerStateShuttingDown : @[SDLAudioStreamManagerStateStopped]
+ };
+}
+
+- (void)didEnterStateAudioStreamStopped {
+ SDLLogD(@"Audio stream stopped");
+ _audioEncrypted = NO;
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLAudioStreamDidStopNotification object:nil];
+}
+
+- (void)didEnterStateAudioStreamStarting {
+ SDLLogD(@"Audio stream starting");
+ if ((self.requestedEncryptionType != SDLStreamingEncryptionFlagNone) && ([self.secureMakes containsObject:self.connectedVehicleMake])) {
+ [self.protocol startSecureServiceWithType:SDLServiceTypeAudio payload:nil completionHandler:^(BOOL success, NSError * _Nonnull error) {
+ if (error) {
+ SDLLogE(@"TLS setup error: %@", error);
+ [self.audioStreamStateMachine transitionToState:SDLAudioStreamManagerStateStopped];
+ }
+ }];
+ } else {
+ [self.protocol startServiceWithType:SDLServiceTypeAudio payload:nil];
+ }
+}
+
+- (void)didEnterStateAudioStreamReady {
+ SDLLogD(@"Audio stream ready");
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLAudioStreamDidStartNotification object:nil];
+}
+
+- (void)didEnterStateAudioStreamShuttingDown {
+ SDLLogD(@"Audio stream shutting down");
+ [self.protocol endServiceWithType:SDLServiceTypeAudio];
+}
+
+#pragma mark - SDLProtocolListener
+#pragma mark Video / Audio Start Service ACK
+
+- (void)handleProtocolStartServiceACKMessage:(SDLProtocolMessage *)startServiceACK {
+ switch (startServiceACK.header.serviceType) {
+ case SDLServiceTypeAudio: {
+ [self sdl_handleAudioStartServiceAck:startServiceACK];
+ } break;
+ default: break;
+ }
+}
+
+- (void)sdl_handleAudioStartServiceAck:(SDLProtocolMessage *)audioStartServiceAck {
+ SDLLogD(@"Audio service started");
+ _audioEncrypted = audioStartServiceAck.header.encrypted;
+
+ SDLControlFramePayloadAudioStartServiceAck *audioAckPayload = [[SDLControlFramePayloadAudioStartServiceAck alloc] initWithData:audioStartServiceAck.payload];
+ SDLLogV(@"ACK: %@", audioAckPayload);
+
+ if (audioAckPayload.mtu != SDLControlFrameInt64NotFound) {
+ [[SDLGlobals sharedGlobals] setDynamicMTUSize:(NSUInteger)audioAckPayload.mtu forServiceType:SDLServiceTypeAudio];
+ }
+
+ [self.audioStreamStateMachine transitionToState:SDLAudioStreamManagerStateReady];
+}
+
+#pragma mark Video / Audio Start Service NAK
+
+- (void)handleProtocolStartServiceNAKMessage:(SDLProtocolMessage *)startServiceNAK {
+ switch (startServiceNAK.header.serviceType) {
+ case SDLServiceTypeAudio: {
+ [self sdl_handleAudioStartServiceNak:startServiceNAK];
+ } break;
+ default: break;
+ }
+}
+
+- (void)sdl_handleAudioStartServiceNak:(SDLProtocolMessage *)audioStartServiceNak {
+ SDLLogW(@"Audio service failed to start due to NAK");
+ [self sdl_transitionToStoppedState:SDLServiceTypeAudio];
+}
+
+#pragma mark Video / Audio End Service
+
+- (void)handleProtocolEndServiceACKMessage:(SDLProtocolMessage *)endServiceACK {
+ SDLLogD(@"%@ service ended", (endServiceACK.header.serviceType == SDLServiceTypeVideo ? @"Video" : @"Audio"));
+ [self sdl_transitionToStoppedState:endServiceACK.header.serviceType];
+}
+
+- (void)handleProtocolEndServiceNAKMessage:(SDLProtocolMessage *)endServiceNAK {
+ SDLLogW(@"%@ service ended with end service NAK", (endServiceNAK.header.serviceType == SDLServiceTypeVideo ? @"Video" : @"Audio"));
+ [self sdl_transitionToStoppedState:endServiceNAK.header.serviceType];
+}
+
+#pragma mark - SDL RPC Notification callbacks
+
+- (void)sdl_didReceiveRegisterAppInterfaceResponse:(SDLRPCResponseNotification *)notification {
+ NSAssert([notification.response isKindOfClass:[SDLRegisterAppInterfaceResponse class]], @"A notification was sent with an unanticipated object");
+ if (![notification.response isKindOfClass:[SDLRegisterAppInterfaceResponse class]]) {
+ return;
+ }
+
+ SDLLogD(@"Received Register App Interface");
+ SDLRegisterAppInterfaceResponse* registerResponse = (SDLRegisterAppInterfaceResponse*)notification.response;
+
+ SDLLogV(@"Determining whether streaming is supported");
+ _streamingSupported = registerResponse.hmiCapabilities.videoStreaming ? registerResponse.hmiCapabilities.videoStreaming.boolValue : registerResponse.displayCapabilities.graphicSupported.boolValue;
+
+ if (!self.isStreamingSupported) {
+ SDLLogE(@"Graphics are not supported on this head unit. We are are assuming screen size is also unavailable and exiting.");
+ return;
+ }
+
+ self.connectedVehicleMake = registerResponse.vehicleType.make;
+}
+
+- (void)sdl_hmiLevelDidChange:(SDLRPCNotificationNotification *)notification {
+ NSAssert([notification.notification isKindOfClass:[SDLOnHMIStatus class]], @"A notification was sent with an unanticipated object");
+ if (![notification.notification isKindOfClass:[SDLOnHMIStatus class]]) {
+ return;
+ }
+
+ SDLOnHMIStatus *hmiStatus = (SDLOnHMIStatus*)notification.notification;
+ SDLLogD(@"HMI level changed from level %@ to level %@", self.hmiLevel, hmiStatus.hmiLevel);
+ self.hmiLevel = hmiStatus.hmiLevel;
+
+ if (self.isHmiStateAudioStreamCapable) {
+ [self sdl_startAudioSession];
+ } else {
+ [self sdl_stopAudioSession];
+ }
+}
+
+#pragma mark - Streaming session helpers
+
+- (void)sdl_startAudioSession {
+ SDLLogV(@"Attempting to start audio session");
+ if (!self.protocol) {
+ return;
+ }
+
+ if (!self.isStreamingSupported) {
+ return;
+ }
+
+ if ([self.audioStreamStateMachine isCurrentState:SDLAudioStreamManagerStateStopped] && self.isHmiStateAudioStreamCapable) {
+ [self.audioStreamStateMachine transitionToState:SDLAudioStreamManagerStateStarting];
+ }
+}
+
+- (void)sdl_stopAudioSession {
+ SDLLogV(@"Attempting to stop audio session");
+ if (!self.isStreamingSupported) {
+ return;
+ }
+
+ if (self.isAudioConnected) {
+ [self.audioStreamStateMachine transitionToState:SDLAudioStreamManagerStateShuttingDown];
+ }
+}
+
+- (void)sdl_transitionToStoppedState:(SDLServiceType)serviceType {
+ switch (serviceType) {
+ case SDLServiceTypeAudio:
+ [self.audioStreamStateMachine transitionToState:SDLAudioStreamManagerStateStopped];
+ break;
+ default: break;
+ }
+}
+
+#pragma mark Setters / Getters
+
+- (BOOL)isHmiStateAudioStreamCapable {
+ return [self.hmiLevel isEqualToEnum:SDLHMILevelLimited] || [self.hmiLevel isEqualToEnum:SDLHMILevelFull];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLStreamingMediaManager.m b/SmartDeviceLink/SDLStreamingMediaManager.m
index ade1165e7..0d57cd6bd 100644
--- a/SmartDeviceLink/SDLStreamingMediaManager.m
+++ b/SmartDeviceLink/SDLStreamingMediaManager.m
@@ -12,7 +12,8 @@
#import "SDLConnectionManagerType.h"
#import "SDLStreamingMediaConfiguration.h"
#import "SDLStreamingMediaManagerDataSource.h"
-#import "SDLStreamingMediaLifecycleManager.h"
+#import "SDLStreamingAudioLifecycleManager.h"
+#import "SDLStreamingVideoLifecycleManager.h"
#import "SDLTouchManager.h"
@@ -20,7 +21,8 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLStreamingMediaManager ()
-@property (strong, nonatomic) SDLStreamingMediaLifecycleManager *lifecycleManager;
+@property (strong, nonatomic) SDLStreamingAudioLifecycleManager *audioLifecycleManager;
+@property (strong, nonatomic) SDLStreamingVideoLifecycleManager *videoLifecycleManager;
@end
@@ -36,101 +38,105 @@ NS_ASSUME_NONNULL_BEGIN
return nil;
}
- _lifecycleManager = [[SDLStreamingMediaLifecycleManager alloc] initWithConnectionManager:connectionManager configuration:configuration];
+ _audioLifecycleManager = [[SDLStreamingAudioLifecycleManager alloc] initWithConnectionManager:connectionManager configuration:configuration];
+ _videoLifecycleManager = [[SDLStreamingVideoLifecycleManager alloc] initWithConnectionManager:connectionManager configuration:configuration];
return self;
}
- (void)startWithProtocol:(SDLProtocol *)protocol {
- [self.lifecycleManager startWithProtocol:protocol];
+ [self.audioLifecycleManager startWithProtocol:protocol];
+ [self.videoLifecycleManager startWithProtocol:protocol];
}
- (void)stop {
- [self.lifecycleManager stop];
+ [self.audioLifecycleManager stop];
+ [self.videoLifecycleManager stop];
}
- (BOOL)sendVideoData:(CVImageBufferRef)imageBuffer {
- return [self.lifecycleManager sendVideoData:imageBuffer];
+ return [self.videoLifecycleManager sendVideoData:imageBuffer];
}
- (BOOL)sendVideoData:(CVImageBufferRef)imageBuffer presentationTimestamp:(CMTime)presentationTimestamp {
- return [self.lifecycleManager sendVideoData:imageBuffer presentationTimestamp:presentationTimestamp];
+ return [self.videoLifecycleManager sendVideoData:imageBuffer presentationTimestamp:presentationTimestamp];
}
- (BOOL)sendAudioData:(NSData*)audioData {
- return [self.lifecycleManager sendAudioData:audioData];
+ return [self.audioLifecycleManager sendAudioData:audioData];
}
#pragma mark - Getters
- (SDLTouchManager *)touchManager {
- return self.lifecycleManager.touchManager;
+ return self.videoLifecycleManager.touchManager;
}
- (SDLAudioStreamManager *)audioManager {
- return self.lifecycleManager.audioManager;
+ return self.audioLifecycleManager.audioManager;
}
- (UIViewController *)rootViewController {
- return self.lifecycleManager.rootViewController;
+ return self.videoLifecycleManager.rootViewController;
}
- (nullable id<SDLFocusableItemLocatorType>)focusableItemManager {
- return self.lifecycleManager.focusableItemManager;
+ return self.videoLifecycleManager.focusableItemManager;
}
- (BOOL)isStreamingSupported {
- return self.lifecycleManager.isStreamingSupported;
+ return self.videoLifecycleManager.isStreamingSupported;
}
- (BOOL)isAudioConnected {
- return self.lifecycleManager.isAudioConnected;
+ return self.audioLifecycleManager.isAudioConnected;
}
- (BOOL)isVideoConnected {
- return self.lifecycleManager.isVideoConnected;
+ return self.videoLifecycleManager.isVideoConnected;
}
- (BOOL)isAudioEncrypted {
- return self.lifecycleManager.isAudioEncrypted;
+ return self.audioLifecycleManager.isAudioEncrypted;
}
- (BOOL)isVideoEncrypted {
- return self.lifecycleManager.isVideoEncrypted;
+ return self.videoLifecycleManager.isVideoEncrypted;
}
- (BOOL)isVideoStreamingPaused {
- return self.lifecycleManager.isVideoStreamingPaused;
+ return self.videoLifecycleManager.isVideoStreamingPaused;
}
- (CGSize)screenSize {
- return self.lifecycleManager.screenSize;
+ return self.videoLifecycleManager.screenSize;
}
- (nullable SDLVideoStreamingFormat *)videoFormat {
- return self.lifecycleManager.videoFormat;
+ return self.videoLifecycleManager.videoFormat;
}
- (NSArray<SDLVideoStreamingFormat *> *)supportedFormats {
- return self.lifecycleManager.supportedFormats;
+ return self.videoLifecycleManager.supportedFormats;
}
- (CVPixelBufferPoolRef __nullable)pixelBufferPool {
- return self.lifecycleManager.pixelBufferPool;
+ return self.videoLifecycleManager.pixelBufferPool;
}
- (SDLStreamingEncryptionFlag)requestedEncryptionType {
- return self.lifecycleManager.requestedEncryptionType;
+ return self.videoLifecycleManager.requestedEncryptionType;
}
#pragma mark - Setters
- (void)setRootViewController:(UIViewController *)rootViewController {
- self.lifecycleManager.rootViewController = rootViewController;
+ self.videoLifecycleManager.rootViewController = rootViewController;
}
- (void)setRequestedEncryptionType:(SDLStreamingEncryptionFlag)requestedEncryptionType {
- self.lifecycleManager.requestedEncryptionType = requestedEncryptionType;
+ self.videoLifecycleManager.requestedEncryptionType = requestedEncryptionType;
+ self.audioLifecycleManager.requestedEncryptionType = requestedEncryptionType;
}
@end
diff --git a/SmartDeviceLink/SDLStreamingMediaManagerConstants.h b/SmartDeviceLink/SDLStreamingMediaManagerConstants.h
index acb455ccd..8e0475811 100644
--- a/SmartDeviceLink/SDLStreamingMediaManagerConstants.h
+++ b/SmartDeviceLink/SDLStreamingMediaManagerConstants.h
@@ -37,4 +37,21 @@ extern NSString *const SDLLockScreenManagerDidPresentLockScreenViewController;
extern NSString *const SDLLockScreenManagerWillDismissLockScreenViewController;
extern NSString *const SDLLockScreenManagerDidDismissLockScreenViewController;
+typedef NSString SDLVideoStreamManagerState;
+extern SDLVideoStreamManagerState *const SDLVideoStreamManagerStateStopped;
+extern SDLVideoStreamManagerState *const SDLVideoStreamManagerStateStarting;
+extern SDLVideoStreamManagerState *const SDLVideoStreamManagerStateReady;
+extern SDLVideoStreamManagerState *const SDLVideoStreamManagerStateSuspended;
+extern SDLVideoStreamManagerState *const SDLVideoStreamManagerStateShuttingDown;
+
+typedef NSString SDLAudioStreamManagerState;
+extern SDLAudioStreamManagerState *const SDLAudioStreamManagerStateStopped;
+extern SDLAudioStreamManagerState *const SDLAudioStreamManagerStateStarting;
+extern SDLAudioStreamManagerState *const SDLAudioStreamManagerStateReady;
+extern SDLAudioStreamManagerState *const SDLAudioStreamManagerStateShuttingDown;
+
+typedef NSString SDLAppState;
+extern SDLAppState *const SDLAppStateInactive;
+extern SDLAppState *const SDLAppStateActive;
+
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLStreamingMediaManagerConstants.m b/SmartDeviceLink/SDLStreamingMediaManagerConstants.m
index f80107e25..02dfa6bfa 100644
--- a/SmartDeviceLink/SDLStreamingMediaManagerConstants.m
+++ b/SmartDeviceLink/SDLStreamingMediaManagerConstants.m
@@ -22,3 +22,17 @@ NSString *const SDLLockScreenManagerWillPresentLockScreenViewController = @"com.
NSString *const SDLLockScreenManagerDidPresentLockScreenViewController = @"com.sdl.lockscreen.didPresent";
NSString *const SDLLockScreenManagerWillDismissLockScreenViewController = @"com.sdl.lockscreen.willDismiss";
NSString *const SDLLockScreenManagerDidDismissLockScreenViewController = @"com.sdl.lockscreen.didDismiss";
+
+SDLVideoStreamManagerState *const SDLVideoStreamManagerStateStopped = @"VideoStreamStopped";
+SDLVideoStreamManagerState *const SDLVideoStreamManagerStateStarting = @"VideoStreamStarting";
+SDLVideoStreamManagerState *const SDLVideoStreamManagerStateReady = @"VideoStreamReady";
+SDLVideoStreamManagerState *const SDLVideoStreamManagerStateSuspended = @"VideoStreamSuspended";
+SDLVideoStreamManagerState *const SDLVideoStreamManagerStateShuttingDown = @"VideoStreamShuttingDown";
+
+SDLAudioStreamManagerState *const SDLAudioStreamManagerStateStopped = @"AudioStreamStopped";
+SDLAudioStreamManagerState *const SDLAudioStreamManagerStateStarting = @"AudioStreamStarting";
+SDLAudioStreamManagerState *const SDLAudioStreamManagerStateReady = @"AudioStreamReady";
+SDLAudioStreamManagerState *const SDLAudioStreamManagerStateShuttingDown = @"AudioStreamShuttingDown";
+
+SDLAppState *const SDLAppStateInactive = @"AppInactive";
+SDLAppState *const SDLAppStateActive = @"AppActive";
diff --git a/SmartDeviceLink/SDLStreamingMediaLifecycleManager.h b/SmartDeviceLink/SDLStreamingVideoLifecycleManager.h
index 3fc753585..b2c8df48f 100644
--- a/SmartDeviceLink/SDLStreamingMediaLifecycleManager.h
+++ b/SmartDeviceLink/SDLStreamingVideoLifecycleManager.h
@@ -1,74 +1,49 @@
//
-// SDLStreamingMediaLifecycleManager.h
-// SmartDeviceLink-iOS
+// SDLStreamingVideoLifecycleManager.h
+// SmartDeviceLink
//
-// Created by Muller, Alexander (A.) on 2/16/17.
-// Copyright © 2017 smartdevicelink. All rights reserved.
+// Created by Joel Fischer on 6/19/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
//
-#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
#import <VideoToolbox/VideoToolbox.h>
-#import "SDLConnectionManagerType.h"
#import "SDLHMILevel.h"
#import "SDLProtocolListener.h"
-#import "SDLStreamingAudioManagerType.h"
#import "SDLStreamingMediaManagerConstants.h"
+#import "SDLVideoStreamingFormat.h"
+#import "SDLVideoStreamingState.h"
-@class SDLAudioStreamManager;
@class SDLCarWindow;
@class SDLImageResolution;
@class SDLProtocol;
@class SDLStateMachine;
@class SDLStreamingMediaConfiguration;
@class SDLTouchManager;
-@class SDLVideoStreamingFormat;
+@protocol SDLConnectionManagerType;
@protocol SDLFocusableItemLocatorType;
@protocol SDLStreamingMediaManagerDataSource;
-NS_ASSUME_NONNULL_BEGIN
-
-typedef NSString SDLAppState;
-extern SDLAppState *const SDLAppStateInactive;
-extern SDLAppState *const SDLAppStateActive;
-
-typedef NSString SDLVideoStreamState;
-extern SDLVideoStreamState *const SDLVideoStreamStateStopped;
-extern SDLVideoStreamState *const SDLVideoStreamStateStarting;
-extern SDLVideoStreamState *const SDLVideoStreamStateReady;
-extern SDLVideoStreamState *const SDLVideoStreamStateSuspended;
-extern SDLVideoStreamState *const SDLVideoStreamStateShuttingDown;
-typedef NSString SDLAudioStreamState;
-extern SDLAudioStreamState *const SDLAudioStreamStateStopped;
-extern SDLAudioStreamState *const SDLAudioStreamStateStarting;
-extern SDLAudioStreamState *const SDLAudioStreamStateReady;
-extern SDLAudioStreamState *const SDLAudioStreamStateShuttingDown;
+NS_ASSUME_NONNULL_BEGIN
-#pragma mark - Interface
-
-@interface SDLStreamingMediaLifecycleManager : NSObject <SDLProtocolListener, SDLStreamingAudioManagerType>
+@interface SDLStreamingVideoLifecycleManager : NSObject <SDLProtocolListener>
-@property (strong, nonatomic, readonly) SDLStateMachine *appStateMachine;
@property (strong, nonatomic, readonly) SDLStateMachine *videoStreamStateMachine;
-@property (strong, nonatomic, readonly) SDLStateMachine *audioStreamStateMachine;
+@property (strong, nonatomic, readonly) SDLVideoStreamManagerState *currentVideoStreamState;
+@property (strong, nonatomic, readonly) SDLStateMachine *appStateMachine;
@property (strong, nonatomic, readonly) SDLAppState *currentAppState;
-@property (strong, nonatomic, readonly) SDLAudioStreamState *currentAudioStreamState;
-@property (strong, nonatomic, readonly) SDLVideoStreamState *currentVideoStreamState;
-
@property (copy, nonatomic, nullable) SDLHMILevel hmiLevel;
-
-@property (assign, nonatomic, readonly, getter=shouldRestartVideoStream) BOOL restartVideoStream __deprecated_msg("This is now unused as the stream doesn't restart anymore. The video stream suspends and resumes if the app changed the state during active video stream");
+@property (copy, nonatomic, nullable) SDLVideoStreamingState videoStreamingState;
/**
* Touch Manager responsible for providing touch event notifications.
*/
@property (nonatomic, strong, readonly) SDLTouchManager *touchManager;
-
-@property (nonatomic, strong, readonly) SDLAudioStreamManager *audioManager;
@property (nonatomic, strong) UIViewController *rootViewController;
@property (strong, nonatomic, readonly, nullable) SDLCarWindow *carWindow;
@@ -100,16 +75,6 @@ extern SDLAudioStreamState *const SDLAudioStreamStateShuttingDown;
@property (assign, nonatomic, readonly, getter=isVideoEncrypted) BOOL videoEncrypted;
/**
- * Whether or not the audio session is connected.
- */
-@property (assign, nonatomic, readonly, getter=isAudioConnected) BOOL audioConnected;
-
-/**
- * Whether or not the audio session is encrypted. This may be different than the requestedEncryptionType.
- */
-@property (assign, nonatomic, readonly, getter=isAudioEncrypted) BOOL audioEncrypted;
-
-/**
* Whether or not the video stream is paused due to either the application being backgrounded, the HMI state being either NONE or BACKGROUND, or the video stream not being ready.
*/
@property (assign, nonatomic, readonly, getter=isVideoStreamingPaused) BOOL videoStreamingPaused;
@@ -204,16 +169,6 @@ extern SDLAudioStreamState *const SDLAudioStreamStateShuttingDown;
*/
- (BOOL)sendVideoData:(CVImageBufferRef)imageBuffer presentationTimestamp:(CMTime)presentationTimestamp;
-/**
- * This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback
- *
- * @param audioData The data in PCM audio format, to be played
- *
- * @return Whether or not the data was successfully sent.
- */
-- (BOOL)sendAudioData:(NSData *)audioData;
-
-
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLStreamingMediaLifecycleManager.m b/SmartDeviceLink/SDLStreamingVideoLifecycleManager.m
index f8e4ebe4f..8c69b3c55 100644
--- a/SmartDeviceLink/SDLStreamingMediaLifecycleManager.m
+++ b/SmartDeviceLink/SDLStreamingVideoLifecycleManager.m
@@ -1,31 +1,31 @@
//
-// SDLStreamingMediaLifecycleManager.m
-// SmartDeviceLink-iOS
+// SDLStreamingVideoLifecycleManager.m
+// SmartDeviceLink
//
-// Created by Muller, Alexander (A.) on 2/16/17.
-// Copyright © 2017 smartdevicelink. All rights reserved.
+// Created by Joel Fischer on 6/19/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
//
-#import "SDLStreamingMediaLifecycleManager.h"
+#import "SDLStreamingVideoLifecycleManager.h"
-#import "SDLAudioStreamManager.h"
+#import "CVPixelBufferRef+SDLUtil.h"
#import "SDLCarWindow.h"
-#import "SDLControlFramePayloadAudioStartServiceAck.h"
+#import "SDLConnectionManagerType.h"
#import "SDLControlFramePayloadConstants.h"
#import "SDLControlFramePayloadNak.h"
#import "SDLControlFramePayloadVideoStartService.h"
#import "SDLControlFramePayloadVideoStartServiceAck.h"
#import "SDLDisplayCapabilities.h"
+#import "SDLFocusableItemLocator.h"
#import "SDLGenericResponse.h"
#import "SDLGetSystemCapability.h"
#import "SDLGetSystemCapabilityResponse.h"
#import "SDLGlobals.h"
-#import "SDLFocusableItemLocator.h"
#import "SDLH264VideoEncoder.h"
#import "SDLHMICapabilities.h"
+#import "SDLHMILevel.h"
#import "SDLImageResolution.h"
#import "SDLLogMacros.h"
-#import "SDLNotificationConstants.h"
#import "SDLOnHMIStatus.h"
#import "SDLProtocol.h"
#import "SDLProtocolMessage.h"
@@ -39,44 +39,26 @@
#import "SDLSystemCapability.h"
#import "SDLTouchManager.h"
#import "SDLVehicleType.h"
+#import "SDLVideoEncoderDelegate.h"
#import "SDLVideoStreamingCapability.h"
-#import "SDLVideoStreamingCodec.h"
-#import "SDLVideoStreamingFormat.h"
-#import "SDLVideoStreamingProtocol.h"
-
-#import "CVPixelBufferRef+SDLUtil.h"
+static NSUInteger const FramesToSendOnBackground = 30;
NS_ASSUME_NONNULL_BEGIN
-SDLAppState *const SDLAppStateInactive = @"AppInactive";
-SDLAppState *const SDLAppStateActive = @"AppActive";
-
-SDLVideoStreamState *const SDLVideoStreamStateStopped = @"VideoStreamStopped";
-SDLVideoStreamState *const SDLVideoStreamStateStarting = @"VideoStreamStarting";
-SDLVideoStreamState *const SDLVideoStreamStateReady = @"VideoStreamReady";
-SDLVideoStreamState *const SDLVideoStreamStateSuspended = @"VideoStreamSuspended";
-SDLVideoStreamState *const SDLVideoStreamStateShuttingDown = @"VideoStreamShuttingDown";
-
-SDLAudioStreamState *const SDLAudioStreamStateStopped = @"AudioStreamStopped";
-SDLAudioStreamState *const SDLAudioStreamStateStarting = @"AudioStreamStarting";
-SDLAudioStreamState *const SDLAudioStreamStateReady = @"AudioStreamReady";
-SDLAudioStreamState *const SDLAudioStreamStateShuttingDown = @"AudioStreamShuttingDown";
-
-static NSUInteger const FramesToSendOnBackground = 30;
-
typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_Nullable capability);
-
-@interface SDLStreamingMediaLifecycleManager () <SDLVideoEncoderDelegate>
+@interface SDLStreamingVideoLifecycleManager() <SDLVideoEncoderDelegate>
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@property (weak, nonatomic) SDLProtocol *protocol;
@property (assign, nonatomic, readonly, getter=isAppStateVideoStreamCapable) BOOL appStateVideoStreamCapable;
-@property (assign, nonatomic, readonly, getter=isHmiStateAudioStreamCapable) BOOL hmiStateAudioStreamCapable;
@property (assign, nonatomic, readonly, getter=isHmiStateVideoStreamCapable) BOOL hmiStateVideoStreamCapable;
+@property (strong, nonatomic, readwrite) SDLStateMachine *videoStreamStateMachine;
+@property (strong, nonatomic, readwrite) SDLStateMachine *appStateMachine;
+
@property (strong, nonatomic, readwrite, nullable) SDLVideoStreamingFormat *videoFormat;
@property (strong, nonatomic, nullable) SDLH264VideoEncoder *videoEncoder;
@@ -84,10 +66,6 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
@property (copy, nonatomic) NSArray<NSString *> *secureMakes;
@property (copy, nonatomic) NSString *connectedVehicleMake;
-@property (strong, nonatomic, readwrite) SDLStateMachine *appStateMachine;
-@property (strong, nonatomic, readwrite) SDLStateMachine *videoStreamStateMachine;
-@property (strong, nonatomic, readwrite) SDLStateMachine *audioStreamStateMachine;
-
@property (assign, nonatomic) CV_NULLABLE CVPixelBufferRef backgroundingPixelBuffer;
@property (strong, nonatomic, nullable) CADisplayLink *displayLink;
@@ -97,11 +75,7 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
@end
-
-@implementation SDLStreamingMediaLifecycleManager
-
-#pragma mark - Public
-#pragma mark Lifecycle
+@implementation SDLStreamingVideoLifecycleManager
- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager configuration:(SDLStreamingMediaConfiguration *)configuration {
self = [super init];
@@ -127,7 +101,6 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
}
_touchManager = [[SDLTouchManager alloc] initWithHitTester:(id)_focusableItemManager];
- _audioManager = [[SDLAudioStreamManager alloc] initWithManager:self];
_requestedEncryptionType = configuration.maximumDesiredEncryption;
_dataSource = configuration.dataSource;
@@ -137,6 +110,9 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
_preferredFormatIndex = 0;
_preferredResolutionIndex = 0;
+ _hmiLevel = SDLHMILevelNone;
+ _videoStreamingState = SDLVideoStreamingStateNotStreamable;
+
NSMutableArray<NSString *> *tempMakeArray = [NSMutableArray array];
for (Class securityManagerClass in configuration.securityManagers) {
[tempMakeArray addObjectsFromArray:[securityManagerClass availableMakes].allObjects];
@@ -156,11 +132,10 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
}
_appStateMachine = [[SDLStateMachine alloc] initWithTarget:self initialState:initialState states:[self.class sdl_appStateTransitionDictionary]];
- _videoStreamStateMachine = [[SDLStateMachine alloc] initWithTarget:self initialState:SDLVideoStreamStateStopped states:[self.class sdl_videoStreamStateTransitionDictionary]];
- _audioStreamStateMachine = [[SDLStateMachine alloc] initWithTarget:self initialState:SDLAudioStreamStateStopped states:[self.class sdl_audioStreamingStateTransitionDictionary]];
+ _videoStreamStateMachine = [[SDLStateMachine alloc] initWithTarget:self initialState:SDLVideoStreamManagerStateStopped states:[self.class sdl_videoStreamStateTransitionDictionary]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_didReceiveRegisterAppInterfaceResponse:) name:SDLDidReceiveRegisterAppInterfaceResponse object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiLevelDidChange:) name:SDLDidChangeHMIStatusNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiStatusDidChange:) name:SDLDidChangeHMIStatusNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_appStateDidUpdate:) name:UIApplicationDidBecomeActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_appStateDidUpdate:) name:UIApplicationWillResignActiveNotification object:nil];
@@ -180,13 +155,19 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
- (void)stop {
SDLLogD(@"Stopping manager");
- [self sdl_stopAudioSession];
[self sdl_stopVideoSession];
- self.hmiLevel = SDLHMILevelNone;
+ _protocol = nil;
+ _screenSize = SDLDefaultScreenSize;
+ _backgroundingPixelBuffer = NULL;
+ _preferredFormatIndex = 0;
+ _preferredResolutionIndex = 0;
+
+ _hmiLevel = SDLHMILevelNone;
+ _videoStreamingState = SDLVideoStreamingStateNotStreamable;
+ _lastPresentationTimestamp = kCMTimeInvalid;
- [self.audioStreamStateMachine transitionToState:SDLAudioStreamStateStopped];
- [self.videoStreamStateMachine transitionToState:SDLVideoStreamStateStopped];
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStopped];
}
- (BOOL)sendVideoData:(CVImageBufferRef)imageBuffer {
@@ -221,27 +202,10 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
return [self.videoEncoder encodeFrame:imageBuffer presentationTimestamp:presentationTimestamp];
}
-- (BOOL)sendAudioData:(NSData*)audioData {
- if (!self.isAudioConnected) {
- return NO;
- }
-
- SDLLogV(@"Sending raw audio data");
- if (self.isAudioEncrypted) {
- [self.protocol sendEncryptedRawData:audioData onService:SDLServiceTypeAudio];
- } else {
- [self.protocol sendRawData:audioData withServiceType:SDLServiceTypeAudio];
- }
- return YES;
-}
-
#pragma mark Getters
-- (BOOL)isAudioConnected {
- return [self.audioStreamStateMachine isCurrentState:SDLAudioStreamStateReady];
-}
- (BOOL)isVideoConnected {
- return [self.videoStreamStateMachine isCurrentState:SDLVideoStreamStateReady];
+ return [self.videoStreamStateMachine isCurrentState:SDLVideoStreamManagerStateReady];
}
- (BOOL)isVideoStreamingPaused {
@@ -256,11 +220,7 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
return self.appStateMachine.currentState;
}
-- (SDLAudioStreamState *)currentAudioStreamState {
- return self.audioStreamStateMachine.currentState;
-}
-
-- (SDLVideoStreamState *)currentVideoStreamState {
+- (SDLVideoStreamManagerState *)currentVideoStreamState {
return self.videoStreamStateMachine.currentState;
}
@@ -290,13 +250,11 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
[self sdl_sendBackgroundFrames];
[self.touchManager cancelPendingTouches];
- if ([self.videoStreamStateMachine.currentState isEqualToString:SDLVideoStreamStateReady]) {
- [self.videoStreamStateMachine transitionToState:SDLVideoStreamStateSuspended];
+ if ([self.videoStreamStateMachine.currentState isEqualToString:SDLVideoStreamManagerStateReady]) {
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateSuspended];
} else {
[self sdl_stopVideoSession];
}
-
- [self sdl_stopAudioSession];
}
// Per Apple's guidelines: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StrategiesforHandlingAppStateTransitions/StrategiesforHandlingAppStateTransitions.html
@@ -305,23 +263,21 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
SDLLogD(@"App became active");
if (!self.protocol) { return; }
- if ([self.videoStreamStateMachine.currentState isEqualToString:SDLVideoStreamStateSuspended]) {
- [self.videoStreamStateMachine transitionToState:SDLVideoStreamStateReady];
+ if ([self.videoStreamStateMachine.currentState isEqualToString:SDLVideoStreamManagerStateSuspended]) {
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateReady];
} else {
[self sdl_startVideoSession];
}
-
- [self sdl_startAudioSession];
}
#pragma mark Video Streaming
+ (NSDictionary<SDLState *, SDLAllowableStateTransitions *> *)sdl_videoStreamStateTransitionDictionary {
return @{
- SDLVideoStreamStateStopped : @[SDLVideoStreamStateStarting],
- SDLVideoStreamStateStarting : @[SDLVideoStreamStateStopped, SDLVideoStreamStateReady],
- SDLVideoStreamStateReady : @[SDLVideoStreamStateSuspended, SDLVideoStreamStateShuttingDown, SDLVideoStreamStateStopped],
- SDLVideoStreamStateSuspended : @[SDLVideoStreamStateReady, SDLVideoStreamStateShuttingDown, SDLVideoStreamStateStopped],
- SDLVideoStreamStateShuttingDown : @[SDLVideoStreamStateStopped]
+ SDLVideoStreamManagerStateStopped : @[SDLVideoStreamManagerStateStarting],
+ SDLVideoStreamManagerStateStarting : @[SDLVideoStreamManagerStateStopped, SDLVideoStreamManagerStateReady],
+ SDLVideoStreamManagerStateReady : @[SDLVideoStreamManagerStateSuspended, SDLVideoStreamManagerStateShuttingDown, SDLVideoStreamManagerStateStopped],
+ SDLVideoStreamManagerStateSuspended : @[SDLVideoStreamManagerStateReady, SDLVideoStreamManagerStateShuttingDown, SDLVideoStreamManagerStateStopped],
+ SDLVideoStreamManagerStateShuttingDown : @[SDLVideoStreamManagerStateStopped]
};
}
@@ -395,7 +351,7 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
[self.videoEncoder stop];
self.videoEncoder = nil;
}
-
+
if (self.videoEncoder == nil) {
NSError* error = nil;
NSAssert(self.videoFormat != nil, @"No video format is known, but it must be if we got a protocol start service response");
@@ -405,7 +361,7 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
if (error || self.videoEncoder == nil) {
SDLLogE(@"Could not create a video encoder: %@", error);
- [self.videoStreamStateMachine transitionToState:SDLVideoStreamStateStopped];
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStopped];
return;
}
@@ -413,7 +369,7 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
CVPixelBufferRef backgroundingPixelBuffer = [self.videoEncoder newPixelBuffer];
if (CVPixelBufferAddText(backgroundingPixelBuffer, @"") == NO) {
SDLLogE(@"Could not create a backgrounding frame");
- [self.videoStreamStateMachine transitionToState:SDLVideoStreamStateStopped];
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStopped];
return;
}
@@ -444,7 +400,7 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
- (void)didEnterStateVideoStreamSuspended {
SDLLogD(@"Video stream suspended");
-
+
[[NSNotificationCenter defaultCenter] postNotificationName:SDLVideoStreamSuspendedNotification object:nil];
}
@@ -453,55 +409,11 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
[self.protocol endServiceWithType:SDLServiceTypeVideo];
}
-#pragma mark Audio
-+ (NSDictionary<SDLState *, SDLAllowableStateTransitions *> *)sdl_audioStreamingStateTransitionDictionary {
- return @{
- SDLAudioStreamStateStopped : @[SDLAudioStreamStateStarting],
- SDLAudioStreamStateStarting : @[SDLAudioStreamStateStopped, SDLAudioStreamStateReady],
- SDLAudioStreamStateReady : @[SDLAudioStreamStateShuttingDown, SDLAudioStreamStateStopped],
- SDLAudioStreamStateShuttingDown : @[SDLAudioStreamStateStopped]
- };
-}
-
-- (void)didEnterStateAudioStreamStopped {
- SDLLogD(@"Audio stream stopped");
- _audioEncrypted = NO;
-
- [[NSNotificationCenter defaultCenter] postNotificationName:SDLAudioStreamDidStopNotification object:nil];
-}
-
-- (void)didEnterStateAudioStreamStarting {
- SDLLogD(@"Audio stream starting");
- if ((self.requestedEncryptionType != SDLStreamingEncryptionFlagNone) && ([self.secureMakes containsObject:self.connectedVehicleMake])) {
- [self.protocol startSecureServiceWithType:SDLServiceTypeAudio payload:nil completionHandler:^(BOOL success, NSError * _Nonnull error) {
- if (error) {
- SDLLogE(@"TLS setup error: %@", error);
- [self.audioStreamStateMachine transitionToState:SDLAudioStreamStateStopped];
- }
- }];
- } else {
- [self.protocol startServiceWithType:SDLServiceTypeAudio payload:nil];
- }
-}
-
-- (void)didEnterStateAudioStreamReady {
- SDLLogD(@"Audio stream ready");
- [[NSNotificationCenter defaultCenter] postNotificationName:SDLAudioStreamDidStartNotification object:nil];
-}
-
-- (void)didEnterStateAudioStreamShuttingDown {
- SDLLogD(@"Audio stream shutting down");
- [self.protocol endServiceWithType:SDLServiceTypeAudio];
-}
-
#pragma mark - SDLProtocolListener
#pragma mark Video / Audio Start Service ACK
- (void)handleProtocolStartServiceACKMessage:(SDLProtocolMessage *)startServiceACK {
switch (startServiceACK.header.serviceType) {
- case SDLServiceTypeAudio: {
- [self sdl_handleAudioStartServiceAck:startServiceACK];
- } break;
case SDLServiceTypeVideo: {
[self sdl_handleVideoStartServiceAck:startServiceACK];
} break;
@@ -509,20 +421,6 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
}
}
-- (void)sdl_handleAudioStartServiceAck:(SDLProtocolMessage *)audioStartServiceAck {
- SDLLogD(@"Audio service started");
- _audioEncrypted = audioStartServiceAck.header.encrypted;
-
- SDLControlFramePayloadAudioStartServiceAck *audioAckPayload = [[SDLControlFramePayloadAudioStartServiceAck alloc] initWithData:audioStartServiceAck.payload];
- SDLLogV(@"ACK: %@", audioAckPayload);
-
- if (audioAckPayload.mtu != SDLControlFrameInt64NotFound) {
- [[SDLGlobals sharedGlobals] setDynamicMTUSize:(NSUInteger)audioAckPayload.mtu forServiceType:SDLServiceTypeAudio];
- }
-
- [self.audioStreamStateMachine transitionToState:SDLAudioStreamStateReady];
-}
-
- (void)sdl_handleVideoStartServiceAck:(SDLProtocolMessage *)videoStartServiceAck {
SDLLogD(@"Video service started");
_videoEncrypted = videoStartServiceAck.header.encrypted;
@@ -552,16 +450,13 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
self.videoFormat.codec = videoAckPayload.videoCodec ?: SDLVideoStreamingCodecH264;
self.videoFormat.protocol = videoAckPayload.videoProtocol ?: SDLVideoStreamingProtocolRAW;
- [self.videoStreamStateMachine transitionToState:SDLVideoStreamStateReady];
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateReady];
}
#pragma mark Video / Audio Start Service NAK
- (void)handleProtocolStartServiceNAKMessage:(SDLProtocolMessage *)startServiceNAK {
switch (startServiceNAK.header.serviceType) {
- case SDLServiceTypeAudio: {
- [self sdl_handleAudioStartServiceNak:startServiceNAK];
- } break;
case SDLServiceTypeVideo: {
[self sdl_handleVideoStartServiceNak:startServiceNAK];
}
@@ -594,11 +489,6 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
[self sdl_sendVideoStartService];
}
-- (void)sdl_handleAudioStartServiceNak:(SDLProtocolMessage *)audioStartServiceNak {
- SDLLogW(@"Audio service failed to start due to NAK");
- [self sdl_transitionToStoppedState:SDLServiceTypeAudio];
-}
-
#pragma mark Video / Audio End Service
- (void)handleProtocolEndServiceACKMessage:(SDLProtocolMessage *)endServiceACK {
@@ -611,22 +501,6 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
[self sdl_transitionToStoppedState:endServiceNAK.header.serviceType];
}
-#pragma mark - SDLVideoEncoderDelegate
-
-- (void)videoEncoder:(SDLH264VideoEncoder *)encoder hasEncodedFrame:(NSData *)encodedVideo {
- SDLLogV(@"Video encoder encoded frame, sending data");
- // Do we care about app state here? I don't think so…
- BOOL capableVideoStreamState = [self.videoStreamStateMachine isCurrentState:SDLVideoStreamStateReady];
-
- if (self.isHmiStateVideoStreamCapable && capableVideoStreamState) {
- if (self.isVideoEncrypted) {
- [self.protocol sendEncryptedRawData:encodedVideo onService:SDLServiceTypeVideo];
- } else {
- [self.protocol sendRawData:encodedVideo withServiceType:SDLServiceTypeVideo];
- }
- }
-}
-
#pragma mark - SDL RPC Notification callbacks
- (void)sdl_didReceiveRegisterAppInterfaceResponse:(SDLRPCResponseNotification *)notification {
@@ -659,34 +533,56 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
SDLLogD(@"Determined base screen size on display capabilities: %@", NSStringFromCGSize(_screenSize));
}
-- (void)sdl_hmiLevelDidChange:(SDLRPCNotificationNotification *)notification {
+- (void)sdl_hmiStatusDidChange:(SDLRPCNotificationNotification *)notification {
NSAssert([notification.notification isKindOfClass:[SDLOnHMIStatus class]], @"A notification was sent with an unanticipated object");
if (![notification.notification isKindOfClass:[SDLOnHMIStatus class]]) {
return;
}
SDLOnHMIStatus *hmiStatus = (SDLOnHMIStatus*)notification.notification;
- SDLLogD(@"HMI level changed from level %@ to level %@", self.hmiLevel, hmiStatus.hmiLevel);
- self.hmiLevel = hmiStatus.hmiLevel;
+
+ if (![self.hmiLevel isEqualToEnum:hmiStatus.hmiLevel]) {
+ SDLLogD(@"HMI level changed from level %@ to level %@", self.hmiLevel, hmiStatus.hmiLevel);
+ self.hmiLevel = hmiStatus.hmiLevel;
+ }
+
+ SDLVideoStreamingState newState = hmiStatus.videoStreamingState ?: SDLVideoStreamingStateStreamable;
+ if (![self.videoStreamingState isEqualToEnum:newState]) {
+ SDLLogD(@"Video streaming state changed from %@ to %@", self.videoStreamingState, hmiStatus.videoStreamingState);
+ self.videoStreamingState = newState;
+ }
if (self.isHmiStateVideoStreamCapable) {
[self sdl_startVideoSession];
} else {
[self sdl_stopVideoSession];
}
+}
- if (self.isHmiStateAudioStreamCapable) {
- [self sdl_startAudioSession];
- } else {
- [self sdl_stopAudioSession];
+#pragma mark - SDLVideoEncoderDelegate
+
+- (void)videoEncoder:(SDLH264VideoEncoder *)encoder hasEncodedFrame:(NSData *)encodedVideo {
+ SDLLogV(@"Video encoder encoded frame, sending data");
+ // Do we care about app state here? I don't think so…
+ BOOL capableVideoStreamState = [self.videoStreamStateMachine isCurrentState:SDLVideoStreamManagerStateReady];
+
+ if (self.isHmiStateVideoStreamCapable && capableVideoStreamState) {
+ if (self.isVideoEncrypted) {
+ [self.protocol sendEncryptedRawData:encodedVideo onService:SDLServiceTypeVideo];
+ } else {
+ [self.protocol sendRawData:encodedVideo withServiceType:SDLServiceTypeVideo];
+ }
}
}
-
#pragma mark - Streaming session helpers
- (void)sdl_startVideoSession {
SDLLogV(@"Attempting to start video session");
+ if (!self.protocol) {
+ SDLLogV(@"Video manager is not yet started");
+ return;
+ }
if (!self.isHmiStateVideoStreamCapable) {
SDLLogV(@"SDL Core is not ready to stream video. Video start service request will not be sent.");
@@ -698,8 +594,8 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
return;
}
- if ([self.videoStreamStateMachine isCurrentState:SDLVideoStreamStateStopped] && self.isHmiStateVideoStreamCapable) {
- [self.videoStreamStateMachine transitionToState:SDLVideoStreamStateStarting];
+ if ([self.videoStreamStateMachine isCurrentState:SDLVideoStreamManagerStateStopped] && self.isHmiStateVideoStreamCapable) {
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStarting];
} else {
SDLLogE(@"Unable to send video start service request\n"
"Video State must be in state STOPPED: %@\n"
@@ -708,18 +604,6 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
}
}
-- (void)sdl_startAudioSession {
- SDLLogV(@"Attempting to start audio session");
- if (!self.isStreamingSupported) {
- return;
- }
-
- if ([self.audioStreamStateMachine isCurrentState:SDLAudioStreamStateStopped]
- && self.isHmiStateAudioStreamCapable) {
- [self.audioStreamStateMachine transitionToState:SDLAudioStreamStateStarting];
- }
-}
-
- (void)sdl_stopVideoSession {
SDLLogV(@"Attempting to stop video session");
if (!self.isStreamingSupported) {
@@ -727,28 +611,14 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
}
if (self.isVideoConnected) {
- [self.videoStreamStateMachine transitionToState:SDLVideoStreamStateShuttingDown];
- }
-}
-
-- (void)sdl_stopAudioSession {
- SDLLogV(@"Attempting to stop audio session");
- if (!self.isStreamingSupported) {
- return;
- }
-
- if (self.isAudioConnected) {
- [self.audioStreamStateMachine transitionToState:SDLAudioStreamStateShuttingDown];
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateShuttingDown];
}
}
- (void)sdl_transitionToStoppedState:(SDLServiceType)serviceType {
switch (serviceType) {
- case SDLServiceTypeAudio:
- [self.audioStreamStateMachine transitionToState:SDLAudioStreamStateStopped];
- break;
case SDLServiceTypeVideo:
- [self.videoStreamStateMachine transitionToState:SDLVideoStreamStateStopped];
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStopped];
break;
default:
break;
@@ -840,7 +710,7 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
[self.protocol startSecureServiceWithType:SDLServiceTypeVideo payload:startVideoPayload.data completionHandler:^(BOOL success, NSError *error) {
if (error) {
SDLLogE(@"TLS setup error: %@", error);
- [self.videoStreamStateMachine transitionToState:SDLVideoStreamStateStopped];
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStopped];
}
}];
} else {
@@ -849,7 +719,6 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
}
}
-
#pragma mark Setters / Getters
- (void)setRootViewController:(UIViewController *)rootViewController {
@@ -866,18 +735,15 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
return [self.appStateMachine isCurrentState:SDLAppStateActive];
}
-- (BOOL)isHmiStateAudioStreamCapable {
- return [self.hmiLevel isEqualToEnum:SDLHMILevelLimited] || [self.hmiLevel isEqualToEnum:SDLHMILevelFull];
-}
-
- (BOOL)isHmiStateVideoStreamCapable {
- return [self.hmiLevel isEqualToEnum:SDLHMILevelLimited] || [self.hmiLevel isEqualToEnum:SDLHMILevelFull];
+ return (![self.videoStreamingState isEqualToEnum:SDLVideoStreamingStateNotStreamable]
+ && ([self.hmiLevel isEqualToEnum:SDLHMILevelLimited] || [self.hmiLevel isEqualToEnum:SDLHMILevelFull]));
}
- (NSArray<SDLVideoStreamingFormat *> *)supportedFormats {
SDLVideoStreamingFormat *h264raw = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRAW];
SDLVideoStreamingFormat *h264rtp = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRTP];
-
+
return @[h264raw, h264rtp];
}
diff --git a/SmartDeviceLink/SDLSubscribeVehicleData.h b/SmartDeviceLink/SDLSubscribeVehicleData.h
index 618644d14..8549e58e3 100644
--- a/SmartDeviceLink/SDLSubscribeVehicleData.h
+++ b/SmartDeviceLink/SDLSubscribeVehicleData.h
@@ -48,7 +48,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param wiperStatus Subscribe to wiperStatus
* @return A SDLSubscribeVehicleData object
*/
-- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus: instead");
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus: instead");
/**
* Convenience init for subscribing to all possible vehicle data items.
@@ -61,6 +61,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param deviceStatus Subscribe to deviceStatus
* @param driverBraking Subscribe to driverBraking
* @param eCallInfo Subscribe to eCallInfo
+ * @param electronicParkBrakeStatus Subscribe to electronicParkBrakeStatus
* @param emergencyEvent Subscribe to emergencyEvent
* @param engineOilLife Subscribe to engineOilLife
* @param engineTorque Subscribe to engineTorque
@@ -78,10 +79,11 @@ NS_ASSUME_NONNULL_BEGIN
* @param speed Subscribe to speed
* @param steeringWheelAngle Subscribe to steeringWheelAngle
* @param tirePressure Subscribe to tirePressure
+ * @param turnSignal Subscribe to turnSignal
* @param wiperStatus Subscribe to wiperStatus
* @return A SDLSubscribeVehicleData object
*/
-- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus;
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal wiperStatus:(BOOL)wiperStatus;
/**
* A boolean value. If true, subscribes GPS data.
@@ -213,6 +215,17 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (strong, nonatomic, nullable) NSNumber<SDLBool> *myKey;
+/**
+ * A boolean value. If true, subscribes to the electronic parking brake status.
+ */
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *electronicParkBrakeStatus;
+
+/**
+ * A boolean value. If true, subscribes to the turn signal status.
+ */
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *turnSignal;
+
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSubscribeVehicleData.m b/SmartDeviceLink/SDLSubscribeVehicleData.m
index 1bbeaa1de..013496525 100644
--- a/SmartDeviceLink/SDLSubscribeVehicleData.m
+++ b/SmartDeviceLink/SDLSubscribeVehicleData.m
@@ -18,10 +18,10 @@ NS_ASSUME_NONNULL_BEGIN
}
- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus {
- return [self initWithAccelerationPedalPosition:accelerationPedalPosition airbagStatus:airbagStatus beltStatus:beltStatus bodyInformation:bodyInformation clusterModeStatus:clusterModeStatus deviceStatus:deviceStatus driverBraking:driverBraking eCallInfo:eCallInfo emergencyEvent:emergencyEvent engineOilLife:NO engineTorque:engineTorque externalTemperature:externalTemperature fuelLevel:fuelLevel fuelLevelState:fuelLevelState fuelRange:NO gps:gps headLampStatus:headLampStatus instantFuelConsumption:instantFuelConsumption myKey:myKey odometer:odometer prndl:prndl rpm:rpm speed:speed steeringWheelAngle:steeringWheelAngle tirePressure:tirePressure wiperStatus:wiperStatus];
+ return [self initWithAccelerationPedalPosition:accelerationPedalPosition airbagStatus:airbagStatus beltStatus:beltStatus bodyInformation:bodyInformation clusterModeStatus:clusterModeStatus deviceStatus:deviceStatus driverBraking:driverBraking eCallInfo:eCallInfo electronicParkBrakeStatus:NO emergencyEvent:emergencyEvent engineOilLife:NO engineTorque:engineTorque externalTemperature:externalTemperature fuelLevel:fuelLevel fuelLevelState:fuelLevelState fuelRange:NO gps:gps headLampStatus:headLampStatus instantFuelConsumption:instantFuelConsumption myKey:myKey odometer:odometer prndl:prndl rpm:rpm speed:speed steeringWheelAngle:steeringWheelAngle tirePressure:tirePressure turnSignal:NO wiperStatus:wiperStatus];
}
-- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus {
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal wiperStatus:(BOOL)wiperStatus {
self = [self init];
if (!self) {
return nil;
@@ -35,6 +35,7 @@ NS_ASSUME_NONNULL_BEGIN
self.deviceStatus = @(deviceStatus);
self.driverBraking = @(driverBraking);
self.eCallInfo = @(eCallInfo);
+ self.electronicParkBrakeStatus = @(electronicParkBrakeStatus);
self.emergencyEvent = @(emergencyEvent);
self.engineOilLife = @(engineOilLife);
self.engineTorque = @(engineTorque);
@@ -52,6 +53,7 @@ NS_ASSUME_NONNULL_BEGIN
self.speed = @(speed);
self.steeringWheelAngle = @(steeringWheelAngle);
self.tirePressure = @(tirePressure);
+ self.turnSignal = @(turnSignal);
self.wiperStatus = @(wiperStatus);
return self;
@@ -265,6 +267,21 @@ NS_ASSUME_NONNULL_BEGIN
return [parameters sdl_objectForName:SDLNameMyKey];
}
+- (void)setElectronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus {
+ [parameters sdl_setObject:electronicParkBrakeStatus forName:SDLNameElectronicParkBrakeStatus];
+}
+
+- (nullable NSNumber<SDLBool> *)electronicParkBrakeStatus {
+ return [parameters sdl_objectForName:SDLNameElectronicParkBrakeStatus];
+}
+
+- (void)setTurnSignal:(nullable NSNumber<SDLBool> *)turnSignal {
+ [parameters sdl_setObject:turnSignal forName:SDLNameTurnSignal];
+}
+
+- (nullable NSNumber<SDLBool> *)turnSignal {
+ return [parameters sdl_objectForName:SDLNameTurnSignal];
+}
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h b/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h
index 7fcffebef..1cc10c6b3 100644
--- a/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h
+++ b/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h
@@ -198,6 +198,20 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *myKey;
+/**
+ The result of requesting to subscribe to the electronic parking brake status
+
+ Optional
+ */
+@property (strong, nonatomic, nullable) SDLVehicleDataResult *electronicParkBrakeStatus;
+
+/**
+ The result of requesting to subscribe to the turn signal
+
+ Optional
+ */
+@property (strong, nonatomic, nullable) SDLVehicleDataResult *turnSignal;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSubscribeVehicleDataResponse.m b/SmartDeviceLink/SDLSubscribeVehicleDataResponse.m
index c9c1bb7fd..b39328d7e 100644
--- a/SmartDeviceLink/SDLSubscribeVehicleDataResponse.m
+++ b/SmartDeviceLink/SDLSubscribeVehicleDataResponse.m
@@ -226,6 +226,22 @@ NS_ASSUME_NONNULL_BEGIN
return [parameters sdl_objectForName:SDLNameMyKey ofClass:SDLVehicleDataResult.class];
}
+- (void)setElectronicParkBrakeStatus:(nullable SDLVehicleDataResult *)electronicParkBrakeStatus {
+ [parameters sdl_setObject:electronicParkBrakeStatus forName:SDLNameElectronicParkBrakeStatus];
+}
+
+- (nullable SDLVehicleDataResult *)electronicParkBrakeStatus {
+ return [parameters sdl_objectForName:SDLNameElectronicParkBrakeStatus ofClass:[SDLVehicleDataResult class]];
+}
+
+- (void)setTurnSignal:(nullable SDLVehicleDataResult *)turnSignal {
+ [parameters sdl_setObject:turnSignal forName:SDLNameTurnSignal];
+}
+
+- (nullable SDLVehicleDataResult *)turnSignal {
+ return [parameters sdl_objectForName:SDLNameTurnSignal ofClass:[SDLVehicleDataResult class]];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSupportedSeat.h b/SmartDeviceLink/SDLSupportedSeat.h
new file mode 100644
index 000000000..7c7df2f9d
--- /dev/null
+++ b/SmartDeviceLink/SDLSupportedSeat.h
@@ -0,0 +1,20 @@
+// SDLSupportedSeat.h
+//
+
+#import "SDLEnum.h"
+
+/**
+ * List possible seats that is a remote controllable seat.
+ *
+ */
+typedef SDLEnum SDLSupportedSeat SDL_SWIFT_ENUM;
+
+/**
+ * @abstract Save current seat postions and settings to seat memory.
+ */
+extern SDLSupportedSeat const SDLSupportedSeatDriver;
+
+/**
+ * @abstract Restore / apply the seat memory settings to the current seat.
+ */
+extern SDLSupportedSeat const SDLSupportedSeatFrontPassenger;
diff --git a/SmartDeviceLink/SDLSupportedSeat.m b/SmartDeviceLink/SDLSupportedSeat.m
new file mode 100644
index 000000000..f97678bb1
--- /dev/null
+++ b/SmartDeviceLink/SDLSupportedSeat.m
@@ -0,0 +1,7 @@
+// SDLSupportedSeat.m
+//
+
+#import "SDLSupportedSeat.h"
+
+SDLSupportedSeat const SDLSupportedSeatDriver = @"DRIVER";
+SDLSupportedSeat const SDLSupportedSeatFrontPassenger = @"FRONT_PASSENGER";
diff --git a/SmartDeviceLink/SDLTPMS.h b/SmartDeviceLink/SDLTPMS.h
new file mode 100644
index 000000000..4831af523
--- /dev/null
+++ b/SmartDeviceLink/SDLTPMS.h
@@ -0,0 +1,50 @@
+// SDLTPMS.h
+//
+
+
+#import "SDLEnum.h"
+
+/**
+ An enum representing values of the tire pressure monitoring system
+ */
+typedef SDLEnum SDLTPMS SDL_SWIFT_ENUM;
+
+/**
+ If set the status of the tire is not known.
+ */
+extern SDLTPMS const SDLTPMSUnknown;
+
+/**
+ TPMS does not function.
+ */
+extern SDLTPMS const SDLTPMSSystemFault;
+
+/**
+ The sensor of the tire does not function.
+ */
+extern SDLTPMS const SDLTPMSSensorFault;
+
+/**
+ TPMS is reporting a low tire pressure for the tire.
+ */
+extern SDLTPMS const SDLTPMSLow;
+
+/**
+ TPMS is active and the tire pressure is monitored.
+ */
+extern SDLTPMS const SDLTPMSSystemActive;
+
+/**
+ TPMS is reporting that the tire must be trained.
+ */
+extern SDLTPMS const SDLTPMSTrain;
+
+/**
+ TPMS reports the training for the tire is completed.
+ */
+extern SDLTPMS const SDLTPMSTrainingComplete;
+
+/**
+ TPMS reports the tire is not trained.
+ */
+extern SDLTPMS const SDLTPMSNotTrained;
diff --git a/SmartDeviceLink/SDLTPMS.m b/SmartDeviceLink/SDLTPMS.m
new file mode 100644
index 000000000..54a66d10b
--- /dev/null
+++ b/SmartDeviceLink/SDLTPMS.m
@@ -0,0 +1,18 @@
+//
+// SDLTPMS.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 7/2/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+#import "SDLTPMS.h"
+
+SDLTPMS const SDLTPMSUnknown = @"UNKNOWN";
+SDLTPMS const SDLTPMSSystemFault = @"SYSTEM_FAULT";
+SDLTPMS const SDLTPMSSensorFault = @"SENSOR_FAULT";
+SDLTPMS const SDLTPMSLow = @"LOW";
+SDLTPMS const SDLTPMSSystemActive = @"SYSTEM_ACTIVE";
+SDLTPMS const SDLTPMSTrain = @"TRAIN";
+SDLTPMS const SDLTPMSTrainingComplete = @"TRAINING_COMPLETE";
+SDLTPMS const SDLTPMSNotTrained = @"NOT_TRAINED";
diff --git a/SmartDeviceLink/SDLTTSChunk.h b/SmartDeviceLink/SDLTTSChunk.h
index 4c27ead53..d0d04a0fd 100644
--- a/SmartDeviceLink/SDLTTSChunk.h
+++ b/SmartDeviceLink/SDLTTSChunk.h
@@ -66,9 +66,16 @@ NS_ASSUME_NONNULL_BEGIN
*/
+ (NSArray<SDLTTSChunk *> *)silenceChunks;
+/**
+ Create "TTS" to play an audio file previously uploaded to the system.
+
+ @param fileName The name of the file used in the SDLFile or PutFile that was uploaded
+ @return The RPC
+ */
++ (NSArray<SDLTTSChunk *> *)fileChunksWithName:(NSString *)fileName;
/**
- * Text to be spoken, or a phoneme specification, or the name of a pre-recorded sound. The contents of this field are indicated by the "type" field.
+ * Text to be spoken, a phoneme specification, or the name of a pre-recorded / pre-uploaded sound. The contents of this field are indicated by the "type" field.
*
* Required, Max length 500
*/
diff --git a/SmartDeviceLink/SDLTTSChunk.m b/SmartDeviceLink/SDLTTSChunk.m
index e553d6342..a8874129b 100644
--- a/SmartDeviceLink/SDLTTSChunk.m
+++ b/SmartDeviceLink/SDLTTSChunk.m
@@ -39,15 +39,19 @@ NS_ASSUME_NONNULL_BEGIN
}
+ (NSArray<SDLTTSChunk *> *)silenceChunks {
- return [self sdl_chunksFromString:nil type:SDLSpeechCapabilitiesSilence];
+ return [self sdl_chunksFromString:@"" type:SDLSpeechCapabilitiesSilence];
+}
+
++ (NSArray<SDLTTSChunk *> *)fileChunksWithName:(NSString *)fileName {
+ return [self sdl_chunksFromString:fileName type:SDLSpeechCapabilitiesFile];
}
+ (nullable NSArray<SDLTTSChunk *> *)sdl_chunksFromString:(nullable NSString *)string type:(SDLSpeechCapabilities)type {
- if (string.length == 0) {
+ if (string == nil) {
return nil;
}
- return [NSArray arrayWithObject:[[[self class] alloc] initWithText:string type:type]];
+ return @[[[SDLTTSChunk alloc] initWithText:string type:type]];
}
- (void)setText:(NSString *)text {
diff --git a/SmartDeviceLink/SDLTextAndGraphicManager.m b/SmartDeviceLink/SDLTextAndGraphicManager.m
index 413aada4d..34bc8d97d 100644
--- a/SmartDeviceLink/SDLTextAndGraphicManager.m
+++ b/SmartDeviceLink/SDLTextAndGraphicManager.m
@@ -54,6 +54,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, nullable) SDLArtwork *blankArtwork;
+@property (assign, nonatomic) BOOL waitingOnHMILevelUpdateToUpdate;
@property (assign, nonatomic) BOOL isDirty;
@end
@@ -72,6 +73,9 @@ NS_ASSUME_NONNULL_BEGIN
_currentScreenData = [[SDLShow alloc] init];
_currentLevel = SDLHMILevelNone;
+ _waitingOnHMILevelUpdateToUpdate = NO;
+ _isDirty = NO;
+
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_registerResponse:) name:SDLDidReceiveRegisterAppInterfaceResponse object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_displayLayoutResponse:) name:SDLDidReceiveSetDisplayLayoutResponse object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiStatusNotification:) name:SDLDidChangeHMIStatusNotification object:nil];
@@ -102,6 +106,7 @@ NS_ASSUME_NONNULL_BEGIN
_displayCapabilities = nil;
_currentLevel = SDLHMILevelNone;
_blankArtwork = nil;
+ _waitingOnHMILevelUpdateToUpdate = NO;
_isDirty = NO;
}
@@ -110,6 +115,14 @@ NS_ASSUME_NONNULL_BEGIN
- (void)updateWithCompletionHandler:(nullable SDLTextAndGraphicUpdateCompletionHandler)handler {
if (self.isBatchingUpdates) { return; }
+ // Don't send if we're in HMI NONE
+ if (self.currentLevel == nil || [self.currentLevel isEqualToString:SDLHMILevelNone]) {
+ self.waitingOnHMILevelUpdateToUpdate = YES;
+ return;
+ } else {
+ self.waitingOnHMILevelUpdateToUpdate = NO;
+ }
+
if (self.isDirty) {
self.isDirty = NO;
[self sdl_updateWithCompletionHandler:handler];
@@ -117,11 +130,6 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)sdl_updateWithCompletionHandler:(nullable SDLTextAndGraphicUpdateCompletionHandler)handler {
- // Don't send if we're in HMI NONE
- if (self.currentLevel == nil || [self.currentLevel isEqualToString:SDLHMILevelNone]) {
- return;
- }
-
SDLLogD(@"Updating text and graphics");
if (self.inProgressUpdate != nil) {
SDLLogV(@"In progress update exists, queueing update");
@@ -487,6 +495,13 @@ NS_ASSUME_NONNULL_BEGIN
return [array copy];
}
+- (BOOL)sdl_hasData {
+ BOOL hasTextFields = ([self sdl_findNonNilTextFields].count > 0);
+ BOOL hasImageFields = (self.primaryGraphic != nil) || (self.secondaryGraphic != nil);
+
+ return hasTextFields || hasImageFields;
+}
+
#pragma mark - Equality
- (BOOL)sdl_showImages:(SDLShow *)show isEqualToShowImages:(SDLShow *)show2 {
@@ -507,110 +522,98 @@ NS_ASSUME_NONNULL_BEGIN
- (void)setTextField1:(nullable NSString *)textField1 {
_textField1 = textField1;
+ _isDirty = YES;
if (!self.isBatchingUpdates) {
// If we aren't batching, send the update immediately, if we are, set ourselves as dirty (so we know we should send an update after the batch ends)
- [self sdl_updateWithCompletionHandler:nil];
- } else {
- _isDirty = YES;
+ [self updateWithCompletionHandler:nil];
}
}
- (void)setTextField2:(nullable NSString *)textField2 {
_textField2 = textField2;
+ _isDirty = YES;
if (!self.isBatchingUpdates) {
- [self sdl_updateWithCompletionHandler:nil];
- } else {
- _isDirty = YES;
+ [self updateWithCompletionHandler:nil];
}
}
- (void)setTextField3:(nullable NSString *)textField3 {
_textField3 = textField3;
+ _isDirty = YES;
if (!self.isBatchingUpdates) {
- [self sdl_updateWithCompletionHandler:nil];
- } else {
- _isDirty = YES;
+ [self updateWithCompletionHandler:nil];
}
}
- (void)setTextField4:(nullable NSString *)textField4 {
_textField4 = textField4;
+ _isDirty = YES;
if (!self.isBatchingUpdates) {
- [self sdl_updateWithCompletionHandler:nil];
- } else {
- _isDirty = YES;
+ [self updateWithCompletionHandler:nil];
}
}
- (void)setMediaTrackTextField:(nullable NSString *)mediaTrackTextField {
_mediaTrackTextField = mediaTrackTextField;
+ _isDirty = YES;
if (!self.isBatchingUpdates) {
- [self sdl_updateWithCompletionHandler:nil];
- } else {
- _isDirty = YES;
+ [self updateWithCompletionHandler:nil];
}
}
- (void)setPrimaryGraphic:(nullable SDLArtwork *)primaryGraphic {
_primaryGraphic = primaryGraphic;
+ _isDirty = YES;
if (!self.isBatchingUpdates) {
- [self sdl_updateWithCompletionHandler:nil];
- } else {
- _isDirty = YES;
+ [self updateWithCompletionHandler:nil];
}
}
- (void)setSecondaryGraphic:(nullable SDLArtwork *)secondaryGraphic {
_secondaryGraphic = secondaryGraphic;
+ _isDirty = YES;
if (!self.isBatchingUpdates) {
- [self sdl_updateWithCompletionHandler:nil];
- } else {
- _isDirty = YES;
+ [self updateWithCompletionHandler:nil];
}
}
- (void)setAlignment:(nullable SDLTextAlignment)alignment {
_alignment = alignment ? alignment : SDLTextAlignmentCenter;
+ _isDirty = YES;
if (!self.isBatchingUpdates) {
- [self sdl_updateWithCompletionHandler:nil];
- } else {
- _isDirty = YES;
+ [self updateWithCompletionHandler:nil];
}
}
- (void)setTextField1Type:(nullable SDLMetadataType)textField1Type {
_textField1Type = textField1Type;
+ _isDirty = YES;
if (!self.isBatchingUpdates) {
- [self sdl_updateWithCompletionHandler:nil];
- } else {
- _isDirty = YES;
+ [self updateWithCompletionHandler:nil];
}
}
- (void)setTextField2Type:(nullable SDLMetadataType)textField2Type {
_textField2Type = textField2Type;
+ _isDirty = YES;
if (!self.isBatchingUpdates) {
- [self sdl_updateWithCompletionHandler:nil];
- } else {
- _isDirty = YES;
+ [self updateWithCompletionHandler:nil];
}
}
- (void)setTextField3Type:(nullable SDLMetadataType)textField3Type {
_textField3Type = textField3Type;
+ _isDirty = YES;
if (!self.isBatchingUpdates) {
- [self sdl_updateWithCompletionHandler:nil];
- } else {
- _isDirty = YES;
+ [self updateWithCompletionHandler:nil];
}
}
- (void)setTextField4Type:(nullable SDLMetadataType)textField4Type {
_textField4Type = textField4Type;
+ _isDirty = YES;
if (!self.isBatchingUpdates) {
- [self sdl_updateWithCompletionHandler:nil];
- } else {
- _isDirty = YES;
+ [self updateWithCompletionHandler:nil];
}
}
@@ -644,18 +647,21 @@ NS_ASSUME_NONNULL_BEGIN
self.displayCapabilities = response.displayCapabilities;
// Auto-send an updated show
- [self sdl_updateWithCompletionHandler:nil];
+ if ([self sdl_hasData]) {
+ [self sdl_updateWithCompletionHandler:nil];
+ }
}
- (void)sdl_hmiStatusNotification:(SDLRPCNotificationNotification *)notification {
SDLOnHMIStatus *hmiStatus = (SDLOnHMIStatus *)notification.notification;
+ SDLHMILevel oldLevel = self.currentLevel;
+ self.currentLevel = hmiStatus.hmiLevel;
+
// Auto-send an updated show if we were in NONE and now we are not
- if ([self.currentLevel isEqualToString:SDLHMILevelNone] && ![hmiStatus.hmiLevel isEqualToString:SDLHMILevelNone]) {
+ if ([oldLevel isEqualToString:SDLHMILevelNone] && ![self.currentLevel isEqualToString:SDLHMILevelNone] && self.waitingOnHMILevelUpdateToUpdate) {
[self sdl_updateWithCompletionHandler:nil];
}
-
- self.currentLevel = hmiStatus.hmiLevel;
}
@end
diff --git a/SmartDeviceLink/SDLTurnSignal.h b/SmartDeviceLink/SDLTurnSignal.h
new file mode 100644
index 000000000..b8d50c610
--- /dev/null
+++ b/SmartDeviceLink/SDLTurnSignal.h
@@ -0,0 +1,34 @@
+//
+// SDLTurnSignal.h
+// SmartDeviceLink
+//
+// Created by Nicole on 7/19/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+#import "SDLEnum.h"
+
+/*
+ * Enumeration that describes the status of the turn light indicator.
+ */
+typedef SDLEnum SDLTurnSignal SDL_SWIFT_ENUM;
+
+/*
+ * Turn signal is OFF
+ */
+extern SDLTurnSignal const SDLTurnSignalOff;
+
+/*
+ * Left turn signal is on
+ */
+extern SDLTurnSignal const SDLTurnSignalLeft;
+
+/*
+ * Right turn signal is on
+ */
+extern SDLTurnSignal const SDLTurnSignalRight;
+
+/*
+ * Both signals (left and right) are on
+ */
+extern SDLTurnSignal const SDLTurnSignalBoth;
diff --git a/SmartDeviceLink/SDLTurnSignal.m b/SmartDeviceLink/SDLTurnSignal.m
new file mode 100644
index 000000000..dedd49e72
--- /dev/null
+++ b/SmartDeviceLink/SDLTurnSignal.m
@@ -0,0 +1,14 @@
+//
+// SDLTurnSignal.m
+// SmartDeviceLink
+//
+// Created by Nicole on 7/19/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+#import "SDLTurnSignal.h"
+
+SDLTurnSignal const SDLTurnSignalOff = @"OFF";
+SDLTurnSignal const SDLTurnSignalLeft = @"LEFT";
+SDLTurnSignal const SDLTurnSignalRight = @"RIGHT";
+SDLTurnSignal const SDLTurnSignalBoth = @"BOTH";
diff --git a/SmartDeviceLink/SDLUnsubscribeVehicleData.h b/SmartDeviceLink/SDLUnsubscribeVehicleData.h
index 3e2d8d81b..ace3cf584 100644
--- a/SmartDeviceLink/SDLUnsubscribeVehicleData.h
+++ b/SmartDeviceLink/SDLUnsubscribeVehicleData.h
@@ -50,7 +50,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param wiperStatus Unsubscribe to wiperStatus
* @return A SDLUnsubscribeVehicleData object
*/
-- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus: instead");
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus: instead");
/**
* Convenience init for unsubscribing to all possible vehicle data items.
@@ -63,6 +63,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param deviceStatus Unsubscribe to deviceStatus
* @param driverBraking Unsubscribe to driverBraking
* @param eCallInfo Unsubscribe to eCallInfo
+ * @param electronicParkBrakeStatus Unsubscribe to electronicParkBrakeStatus
* @param emergencyEvent Unsubscribe to emergencyEvent
* @param engineOilLife Unsubscribe to engineOilLife
* @param engineTorque Unsubscribe to engineTorque
@@ -80,10 +81,11 @@ NS_ASSUME_NONNULL_BEGIN
* @param speed Unsubscribe to speed
* @param steeringWheelAngle Unsubscribe to steeringWheelAngle
* @param tirePressure Unsubscribe to tirePressure
+ * @param turnSignal Unsubscribe to turnSignal
* @param wiperStatus Unsubscribe to wiperStatus
* @return A SDLUnsubscribeVehicleData object
*/
-- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus;
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal wiperStatus:(BOOL)wiperStatus;
/**
* If true, unsubscribes from GPS
@@ -215,6 +217,16 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (strong, nonatomic, nullable) NSNumber<SDLBool> *myKey;
+/**
+ A boolean value. If true, unsubscribes to the Electronic Parking Brake Status
+ */
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *electronicParkBrakeStatus;
+
+/**
+ A boolean value. If true, unsubscribes to the Turn Signal
+ */
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *turnSignal;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLUnsubscribeVehicleData.m b/SmartDeviceLink/SDLUnsubscribeVehicleData.m
index 6ad89d5a5..3ecf16bfc 100644
--- a/SmartDeviceLink/SDLUnsubscribeVehicleData.m
+++ b/SmartDeviceLink/SDLUnsubscribeVehicleData.m
@@ -18,10 +18,10 @@ NS_ASSUME_NONNULL_BEGIN
}
- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus {
- return [self initWithAccelerationPedalPosition:accelerationPedalPosition airbagStatus:airbagStatus beltStatus:beltStatus bodyInformation:bodyInformation clusterModeStatus:clusterModeStatus deviceStatus:deviceStatus driverBraking:driverBraking eCallInfo:eCallInfo emergencyEvent:emergencyEvent engineOilLife:NO engineTorque:engineTorque externalTemperature:externalTemperature fuelLevel:fuelLevel fuelLevelState:fuelLevelState fuelRange:NO gps:gps headLampStatus:headLampStatus instantFuelConsumption:instantFuelConsumption myKey:myKey odometer:odometer prndl:prndl rpm:rpm speed:speed steeringWheelAngle:steeringWheelAngle tirePressure:tirePressure wiperStatus:wiperStatus];
+ return [self initWithAccelerationPedalPosition:accelerationPedalPosition airbagStatus:airbagStatus beltStatus:beltStatus bodyInformation:bodyInformation clusterModeStatus:clusterModeStatus deviceStatus:deviceStatus driverBraking:driverBraking eCallInfo:eCallInfo electronicParkBrakeStatus:NO emergencyEvent:emergencyEvent engineOilLife:NO engineTorque:engineTorque externalTemperature:externalTemperature fuelLevel:fuelLevel fuelLevelState:fuelLevelState fuelRange:NO gps:gps headLampStatus:headLampStatus instantFuelConsumption:instantFuelConsumption myKey:myKey odometer:odometer prndl:prndl rpm:rpm speed:speed steeringWheelAngle:steeringWheelAngle tirePressure:tirePressure turnSignal:NO wiperStatus:wiperStatus];
}
-- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus {
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal wiperStatus:(BOOL)wiperStatus {
self = [self init];
if (!self) {
return nil;
@@ -35,6 +35,7 @@ NS_ASSUME_NONNULL_BEGIN
self.deviceStatus = @(deviceStatus);
self.driverBraking = @(driverBraking);
self.eCallInfo = @(eCallInfo);
+ self.electronicParkBrakeStatus = @(electronicParkBrakeStatus);
self.emergencyEvent = @(emergencyEvent);
self.engineOilLife = @(engineOilLife);
self.engineTorque = @(engineTorque);
@@ -52,6 +53,7 @@ NS_ASSUME_NONNULL_BEGIN
self.speed = @(speed);
self.steeringWheelAngle = @(steeringWheelAngle);
self.tirePressure = @(tirePressure);
+ self.turnSignal = @(turnSignal);
self.wiperStatus = @(wiperStatus);
return self;
@@ -265,6 +267,22 @@ NS_ASSUME_NONNULL_BEGIN
return [parameters sdl_objectForName:SDLNameMyKey];
}
+- (void)setElectronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus {
+ [parameters sdl_setObject:electronicParkBrakeStatus forName:SDLNameElectronicParkBrakeStatus];
+}
+
+- (nullable NSNumber<SDLBool> *)electronicParkBrakeStatus {
+ return [parameters sdl_objectForName:SDLNameElectronicParkBrakeStatus];
+}
+
+- (void)setTurnSignal:(nullable NSNumber<SDLBool> *)turnSignal {
+ [parameters sdl_setObject:turnSignal forName:SDLNameTurnSignal];
+}
+
+- (nullable NSNumber<SDLBool> *)turnSignal {
+ return [parameters sdl_objectForName:SDLNameTurnSignal];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h b/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h
index f0eb57497..0500a1921 100644
--- a/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h
+++ b/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h
@@ -16,187 +16,201 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLUnsubscribeVehicleDataResponse : SDLRPCResponse
/**
- The result of requesting to subscribe to the GPSData.
+ The result of requesting to unsubscribe to the GPSData.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *gps;
/**
- The result of requesting to subscribe to the vehicle speed in kilometers per hour.
+ The result of requesting to unsubscribe to the vehicle speed in kilometers per hour.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *speed;
/**
- The result of requesting to subscribe to the number of revolutions per minute of the engine.
+ The result of requesting to unsubscribe to the number of revolutions per minute of the engine.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *rpm;
/**
- The result of requesting to subscribe to the fuel level in the tank (percentage)
+ The result of requesting to unsubscribe to the fuel level in the tank (percentage)
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *fuelLevel;
/**
- The result of requesting to subscribe to the fuel level state.
+ The result of requesting to unsubscribe to the fuel level state.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *fuelLevel_State;
/**
- The result of requesting to subscribe to the fuel range.
+ The result of requesting to unsubscribe to the fuel range.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *fuelRange;
/**
- The result of requesting to subscribe to the instantaneous fuel consumption in microlitres.
+ The result of requesting to unsubscribe to the instantaneous fuel consumption in microlitres.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *instantFuelConsumption;
/**
- The result of requesting to subscribe to the external temperature in degrees celsius.
+ The result of requesting to unsubscribe to the external temperature in degrees celsius.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *externalTemperature;
/**
- The result of requesting to subscribe to the PRNDL status.
+ The result of requesting to unsubscribe to the PRNDL status.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *prndl;
/**
- The result of requesting to subscribe to the tireStatus.
+ The result of requesting to unsubscribe to the tireStatus.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *tirePressure;
/**
- The result of requesting to subscribe to the odometer in km.
+ The result of requesting to unsubscribe to the odometer in km.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *odometer;
/**
- The result of requesting to subscribe to the status of the seat belts.
+ The result of requesting to unsubscribe to the status of the seat belts.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *beltStatus;
/**
- The result of requesting to subscribe to the body information including power modes.
+ The result of requesting to unsubscribe to the body information including power modes.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *bodyInformation;
/**
- The result of requesting to subscribe to the device status including signal and battery strength.
+ The result of requesting to unsubscribe to the device status including signal and battery strength.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *deviceStatus;
/**
- The result of requesting to subscribe to the status of the brake pedal.
+ The result of requesting to unsubscribe to the status of the brake pedal.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *driverBraking;
/**
- The result of requesting to subscribe to the status of the wipers.
+ The result of requesting to unsubscribe to the status of the wipers.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *wiperStatus;
/**
- The result of requesting to subscribe to the status of the head lamps.
+ The result of requesting to unsubscribe to the status of the head lamps.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *headLampStatus;
/**
- The result of requesting to subscribe to the estimated percentage of remaining oil life of the engine.
+ The result of requesting to unsubscribe to the estimated percentage of remaining oil life of the engine.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *engineOilLife;
/**
- The result of requesting to subscribe to the torque value for engine (in Nm) on non-diesel variants.
+ The result of requesting to unsubscribe to the torque value for engine (in Nm) on non-diesel variants.
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *engineTorque;
/**
- The result of requesting to subscribe to the accelerator pedal position (percentage depressed)
+ The result of requesting to unsubscribe to the accelerator pedal position (percentage depressed)
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *accPedalPosition;
/**
- The result of requesting to subscribe to the current angle of the steering wheel (in deg)
+ The result of requesting to unsubscribe to the current angle of the steering wheel (in deg)
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *steeringWheelAngle;
/**
- The result of requesting to subscribe to the emergency call info
+ The result of requesting to unsubscribe to the emergency call info
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *eCallInfo;
/**
- The result of requesting to subscribe to the airbag status
+ The result of requesting to unsubscribe to the airbag status
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *airbagStatus;
/**
- The result of requesting to subscribe to the emergency event
+ The result of requesting to unsubscribe to the emergency event
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *emergencyEvent;
/**
- The result of requesting to subscribe to the cluster modes
+ The result of requesting to unsubscribe to the cluster modes
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *clusterModes;
/**
- The result of requesting to subscribe to the myKey status
+ The result of requesting to unsubscribe to the myKey status
Optional
*/
@property (strong, nonatomic, nullable) SDLVehicleDataResult *myKey;
+/**
+ The result of requesting to unsubscribe to the electronic parking brake status
+
+ Optional
+ */
+@property (strong, nonatomic, nullable) SDLVehicleDataResult *electronicParkBrakeStatus;
+
+/**
+ The result of requesting to unsubscribe to the turn signal
+
+ Optional
+ */
+@property (strong, nonatomic, nullable) SDLVehicleDataResult *turnSignal;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.m b/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.m
index 945511f8d..6ad213dee 100644
--- a/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.m
+++ b/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.m
@@ -226,6 +226,21 @@ NS_ASSUME_NONNULL_BEGIN
return [parameters sdl_objectForName:SDLNameMyKey ofClass:SDLVehicleDataResult.class];
}
+- (void)setElectronicParkBrakeStatus:(nullable SDLVehicleDataResult *)electronicParkBrakeStatus {
+ [parameters sdl_setObject:electronicParkBrakeStatus forName:SDLNameElectronicParkBrakeStatus];
+}
+
+- (nullable SDLVehicleDataResult *)electronicParkBrakeStatus {
+ return [parameters sdl_objectForName:SDLNameElectronicParkBrakeStatus ofClass:[SDLVehicleDataResult class]];
+}
+
+- (void)setTurnSignal:(nullable SDLVehicleDataResult *)turnSignal {
+ [parameters sdl_setObject:turnSignal forName:SDLNameTurnSignal];
+}
+
+- (nullable SDLVehicleDataResult *)turnSignal {
+ return [parameters sdl_objectForName:SDLNameTurnSignal ofClass:SDLVehicleDataResult.class];
+}
@end
diff --git a/SmartDeviceLink/SDLVehicleDataType.h b/SmartDeviceLink/SDLVehicleDataType.h
index 323fcfe3a..4afe818f8 100644
--- a/SmartDeviceLink/SDLVehicleDataType.h
+++ b/SmartDeviceLink/SDLVehicleDataType.h
@@ -148,3 +148,13 @@ extern SDLVehicleDataType const SDLVehicleDataTypeAccelerationPedal;
Vehicle steering wheel data
*/
extern SDLVehicleDataType const SDLVehicleDataTypeSteeringWheel;
+
+/**
+ Vehicle electronic parking brake status data
+ */
+extern SDLVehicleDataType const SDLVehicleDataTypeElectronicParkBrakeStatus;
+
+/**
+ Vehicle turn signal data
+ */
+extern SDLVehicleDataType const SDLVehicleDataTypeTurnSignal;
diff --git a/SmartDeviceLink/SDLVehicleDataType.m b/SmartDeviceLink/SDLVehicleDataType.m
index c02de4acb..4b37a2456 100644
--- a/SmartDeviceLink/SDLVehicleDataType.m
+++ b/SmartDeviceLink/SDLVehicleDataType.m
@@ -32,3 +32,6 @@ SDLVehicleDataType const SDLVehicleDataTypeEngineOilLife = @"VEHICLEDATA_ENGINEO
SDLVehicleDataType const SDLVehicleDataTypeEngineTorque = @"VEHICLEDATA_ENGINETORQUE";
SDLVehicleDataType const SDLVehicleDataTypeAccelerationPedal = @"VEHICLEDATA_ACCPEDAL";
SDLVehicleDataType const SDLVehicleDataTypeSteeringWheel = @"VEHICLEDATA_STEERINGWHEEL";
+SDLVehicleDataType const SDLVehicleDataTypeElectronicParkBrakeStatus = @"VEHICLEDATA_ELECTRONICPARKBRAKESTATUS";
+SDLVehicleDataType const SDLVehicleDataTypeTurnSignal = @"VEHICLEDATA_TURNSIGNAL";
+
diff --git a/SmartDeviceLink/SDLVideoStreamingState.h b/SmartDeviceLink/SDLVideoStreamingState.h
new file mode 100644
index 000000000..6ebe98b72
--- /dev/null
+++ b/SmartDeviceLink/SDLVideoStreamingState.h
@@ -0,0 +1,24 @@
+//
+// SDLVideoStreamingState.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/19/18.
+// Copyright © 2018 Livio. All rights reserved.
+//
+
+#import "SDLEnum.h"
+
+/**
+ * Enum for each type of video streaming protocol, used in VideoStreamingFormat
+ */
+typedef SDLEnum SDLVideoStreamingState SDL_SWIFT_ENUM;
+
+/**
+ * STREAMABLE, the current app is allowed to stream video
+ */
+extern SDLVideoStreamingState const SDLVideoStreamingStateStreamable;
+
+/**
+ * NOT_STREAMABLE, the current app is not allowed to stream video
+ */
+extern SDLVideoStreamingState const SDLVideoStreamingStateNotStreamable;
diff --git a/SmartDeviceLink/SDLVideoStreamingState.m b/SmartDeviceLink/SDLVideoStreamingState.m
new file mode 100644
index 000000000..5d4d8c8f5
--- /dev/null
+++ b/SmartDeviceLink/SDLVideoStreamingState.m
@@ -0,0 +1,12 @@
+//
+// SDLVideoStreamingState.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/19/18.
+// Copyright © 2018 Livio. All rights reserved.
+//
+
+#import "SDLVideoStreamingState.h"
+
+SDLVideoStreamingState const SDLVideoStreamingStateStreamable = @"STREAMABLE";
+SDLVideoStreamingState const SDLVideoStreamingStateNotStreamable = @"NOT_STREAMABLE";
diff --git a/SmartDeviceLink/SmartDeviceLink.h b/SmartDeviceLink/SmartDeviceLink.h
index 04030f4a1..eaf5cc9af 100644
--- a/SmartDeviceLink/SmartDeviceLink.h
+++ b/SmartDeviceLink/SmartDeviceLink.h
@@ -134,6 +134,7 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLOnLanguageChange.h"
#import "SDLOnLockScreenStatus.h"
#import "SDLOnPermissionsChange.h"
+#import "SDLOnRCStatus.h"
#import "SDLOnSyncPData.h"
#import "SDLOnSystemRequest.h"
#import "SDLOnTBTClientState.h"
@@ -171,6 +172,8 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLKeyboardProperties.h"
#import "SDLLocationCoordinate.h"
#import "SDLLocationDetails.h"
+#import "SDLMassageCushionFirmness.h"
+#import "SDLMassageModeData.h"
#import "SDLMenuParams.h"
#import "SDLMetadataTags.h"
#import "SDLModuleData.h"
@@ -188,6 +191,9 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLRemoteControlCapabilities.h"
#import "SDLRGBColor.h"
#import "SDLScreenParams.h"
+#import "SDLSeatControlCapabilities.h"
+#import "SDLSeatControlData.h"
+#import "SDLSeatMemoryAction.h"
#import "SDLSingleTireStatus.h"
#import "SDLSoftButton.h"
#import "SDLSoftButtonCapabilities.h"
@@ -231,6 +237,7 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLDisplayType.h"
#import "SDLDriverDistractionState.h"
#import "SDLECallConfirmationStatus.h"
+#import "SDLElectronicParkBrakeStatus.h"
#import "SDLEmergencyEventType.h"
#import "SDLFileType.h"
#import "SDLFuelCutoffStatus.h"
@@ -250,6 +257,9 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLLayoutMode.h"
#import "SDLLockScreenStatus.h"
#import "SDLMaintenanceModeStatus.h"
+#import "SDLMassageCushion.h"
+#import "SDLMassageMode.h"
+#import "SDLMassageZone.h"
#import "SDLMediaClockFormat.h"
#import "SDLMetadataType.h"
#import "SDLModuleType.h"
@@ -266,8 +276,11 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLRequestType.h"
#import "SDLResult.h"
#import "SDLSamplingRate.h"
+#import "SDLSeatMemoryActionType.h"
+#import "SDLSupportedSeat.h"
#import "SDLSoftButtonType.h"
#import "SDLSpeechCapabilities.h"
+#import "SDLStaticIconName.h"
#import "SDLSystemAction.h"
#import "SDLSystemCapabilityType.h"
#import "SDLSystemContext.h"
@@ -277,7 +290,9 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLTextFieldName.h"
#import "SDLTimerMode.h"
#import "SDLTouchType.h"
+#import "SDLTPMS.h"
#import "SDLTriggerSource.h"
+#import "SDLTurnSignal.h"
#import "SDLUpdateMode.h"
#import "SDLVehicleDataActiveStatus.h"
#import "SDLVehicleDataEventStatus.h"
@@ -288,6 +303,7 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLVentilationMode.h"
#import "SDLVideoStreamingCodec.h"
#import "SDLVideoStreamingProtocol.h"
+#import "SDLVideoStreamingState.h"
#import "SDLVrCapabilities.h"
#import "SDLWarningLightStatus.h"
#import "SDLWayPointType.h"
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m
index b6b52f0a0..ff2ae7931 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m
@@ -41,6 +41,15 @@ describe(@"a menu cell", ^{
expect(testCell.voiceCommands).to(beNil());
expect(testCell.subCells).to(equal(someSubcells));
});
+
+ it(@"should initialize properly as a submenu item with icon", ^{
+ testCell = [[SDLMenuCell alloc] initWithTitle:someTitle icon:someArtwork subCells:someSubcells];
+
+ expect(testCell.title).to(equal(someTitle));
+ expect(testCell.icon).to(equal(someArtwork));
+ expect(testCell.voiceCommands).to(beNil());
+ expect(testCell.subCells).to(equal(someSubcells));
+ });
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m
index cc6443407..f960f05ba 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m
@@ -52,13 +52,23 @@ describe(@"menu manager", ^{
__block TestConnectionManager *mockConnectionManager = nil;
__block SDLFileManager *mockFileManager = nil;
- __block SDLArtwork *testArtwork = [[SDLArtwork alloc] initWithData:[@"Test data" dataUsingEncoding:NSUTF8StringEncoding] name:@"some artwork name" fileExtension:@"png" persistent:NO];
+ __block SDLArtwork *testArtwork = nil;
+ __block SDLArtwork *testArtwork2 = nil;
- __block SDLMenuCell *textOnlyCell = [[SDLMenuCell alloc] initWithTitle:@"Test 1" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- __block SDLMenuCell *textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" icon:testArtwork voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- __block SDLMenuCell *submenuCell = [[SDLMenuCell alloc] initWithTitle:@"Test 3" subCells:@[textOnlyCell, textAndImageCell]];
+ __block SDLMenuCell *textOnlyCell = nil;
+ __block SDLMenuCell *textAndImageCell = nil;
+ __block SDLMenuCell *submenuCell = nil;
+ __block SDLMenuCell *submenuImageCell = nil;
beforeEach(^{
+ testArtwork = [[SDLArtwork alloc] initWithData:[@"Test data" dataUsingEncoding:NSUTF8StringEncoding] name:@"some artwork name" fileExtension:@"png" persistent:NO];
+ testArtwork2 = [[SDLArtwork alloc] initWithData:[@"Test data 2" dataUsingEncoding:NSUTF8StringEncoding] name:@"some artwork name 2" fileExtension:@"png" persistent:NO];
+
+ textOnlyCell = [[SDLMenuCell alloc] initWithTitle:@"Test 1" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" icon:testArtwork voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ submenuCell = [[SDLMenuCell alloc] initWithTitle:@"Test 3" subCells:@[textOnlyCell, textAndImageCell]];
+ submenuImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 4" icon:testArtwork2 subCells:@[textOnlyCell]];
+
mockConnectionManager = [[TestConnectionManager alloc] init];
mockFileManager = OCMClassMock([SDLFileManager class]);
testManager = [[SDLMenuManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager];
@@ -195,14 +205,20 @@ describe(@"menu manager", ^{
});
it(@"should properly update an image cell", ^{
- testManager.menuCells = @[textAndImageCell];
+ testManager.menuCells = @[textAndImageCell, submenuImageCell];
NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddCommand class]];
NSArray *add = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
SDLAddCommand *sentCommand = add.firstObject;
+ NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]];
+ NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
+ SDLAddSubMenu *sentSubmenu = submenu.firstObject;
+
expect(add).to(haveCount(1));
+ expect(submenu).to(haveCount(1));
expect(sentCommand.cmdIcon.value).to(equal(testArtwork.name));
+ expect(sentSubmenu.menuIcon.value).to(equal(testArtwork2.name));
});
});
@@ -212,14 +228,20 @@ describe(@"menu manager", ^{
});
it(@"should immediately attempt to update without the image", ^{
- testManager.menuCells = @[textAndImageCell];
+ testManager.menuCells = @[textAndImageCell, submenuImageCell];
NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddCommand class]];
NSArray *add = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
SDLAddCommand *sentCommand = add.firstObject;
+ NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]];
+ NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
+ SDLAddSubMenu *sentSubmenu = submenu.firstObject;
+
expect(add).to(haveCount(1));
+ expect(submenu).to(haveCount(1));
expect(sentCommand.cmdIcon.value).to(beNil());
+ expect(sentSubmenu.menuIcon.value).to(beNil());
});
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLNotificationDispatcherSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLNotificationDispatcherSpec.m
index fa53d0de8..47fc3ec74 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLNotificationDispatcherSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLNotificationDispatcherSpec.m
@@ -53,6 +53,7 @@ describe(@"a notification dispatcher", ^{
expect(@([testDispatcher respondsToSelector:@selector(onOnLanguageChange:)])).to(beTruthy());
expect(@([testDispatcher respondsToSelector:@selector(onOnLockScreenNotification:)])).to(beTruthy());
expect(@([testDispatcher respondsToSelector:@selector(onOnSyncPData:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnRCStatus:)])).to(beTruthy());
expect(@([testDispatcher respondsToSelector:@selector(onOnSystemRequest:)])).to(beTruthy());
expect(@([testDispatcher respondsToSelector:@selector(onOnTBTClientState:)])).to(beTruthy());
expect(@([testDispatcher respondsToSelector:@selector(onOnTouchEvent:)])).to(beTruthy());
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m
index 7eaad7142..17be53b19 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m
@@ -24,23 +24,23 @@
@interface SDLSoftButtonManager()
+@property (strong, nonatomic) NSArray<SDLSoftButton *> *currentSoftButtons;
+
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@property (weak, nonatomic) SDLFileManager *fileManager;
-@property (strong, nonatomic) NSArray<SDLSoftButton *> *currentSoftButtons;
-
@property (strong, nonatomic, nullable) SDLShow *inProgressUpdate;
@property (copy, nonatomic, nullable) SDLSoftButtonUpdateCompletionHandler inProgressHandler;
-@property (strong, nonatomic, nullable) SDLShow *queuedImageUpdate;
@property (assign, nonatomic) BOOL hasQueuedUpdate;
@property (copy, nonatomic, nullable) SDLSoftButtonUpdateCompletionHandler queuedUpdateHandler;
-@property (strong, nonatomic, nullable) SDLHMILevel currentLevel;
-@property (assign, nonatomic) BOOL waitingOnHMILevelUpdateToSetButtons;
+@property (copy, nonatomic, nullable) SDLHMILevel currentLevel;
@property (strong, nonatomic, nullable) SDLDisplayCapabilities *displayCapabilities;
@property (strong, nonatomic, nullable) SDLSoftButtonCapabilities *softButtonCapabilities;
+@property (assign, nonatomic) BOOL waitingOnHMILevelUpdateToUpdate;
+
@end
QuickSpecBegin(SDLSoftButtonManagerSpec)
@@ -91,22 +91,22 @@ describe(@"a soft button manager", ^{
expect(testManager.hasQueuedUpdate).to(beFalse());
expect(testManager.displayCapabilities).to(beNil());
expect(testManager.softButtonCapabilities).to(beNil());
- expect(testManager.waitingOnHMILevelUpdateToSetButtons).to(beFalse());
+ expect(testManager.waitingOnHMILevelUpdateToUpdate).to(beFalse());
});
context(@"when in HMI NONE", ^{
beforeEach(^{
testManager.currentLevel = SDLHMILevelNone;
- NSString *sameName = @"Same name";
- testObject1 = [[SDLSoftButtonObject alloc] initWithName:sameName states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil];
- testObject2 = [[SDLSoftButtonObject alloc] initWithName:sameName state:object2State1 handler:nil];
+ testObject1 = [[SDLSoftButtonObject alloc] initWithName:@"name1" states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil];
+ testObject2 = [[SDLSoftButtonObject alloc] initWithName:@"name2" state:object2State1 handler:nil];
testManager.softButtonObjects = @[testObject1, testObject2];
});
- it(@"should not set the soft buttons", ^{
- expect(testManager.waitingOnHMILevelUpdateToSetButtons).to(beTrue());
+ it(@"should set the soft buttons, but not update", ^{
+ expect(testManager.softButtonObjects).toNot(beEmpty());
+ expect(testManager.waitingOnHMILevelUpdateToUpdate).to(beTrue());
expect(testManager.inProgressUpdate).to(beNil());
});
});
@@ -115,15 +115,15 @@ describe(@"a soft button manager", ^{
beforeEach(^{
testManager.currentLevel = nil;
- NSString *sameName = @"Same name";
- testObject1 = [[SDLSoftButtonObject alloc] initWithName:sameName states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil];
- testObject2 = [[SDLSoftButtonObject alloc] initWithName:sameName state:object2State1 handler:nil];
+ testObject1 = [[SDLSoftButtonObject alloc] initWithName:@"name1" states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil];
+ testObject2 = [[SDLSoftButtonObject alloc] initWithName:@"name2" state:object2State1 handler:nil];
testManager.softButtonObjects = @[testObject1, testObject2];
});
- it(@"should not set the soft buttons", ^{
- expect(testManager.waitingOnHMILevelUpdateToSetButtons).to(beTrue());
+ it(@"should set the soft buttons, but not update", ^{
+ expect(testManager.softButtonObjects).toNot(beEmpty());
+ expect(testManager.waitingOnHMILevelUpdateToUpdate).to(beTrue());
expect(testManager.inProgressUpdate).to(beNil());
});
});
@@ -359,7 +359,7 @@ describe(@"a soft button manager", ^{
expect(testManager.currentLevel).to(beNil());
expect(testManager.displayCapabilities).to(beNil());
expect(testManager.softButtonCapabilities).to(beNil());
- expect(testManager.waitingOnHMILevelUpdateToSetButtons).to(beFalse());
+ expect(testManager.waitingOnHMILevelUpdateToUpdate).to(beFalse());
});
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m
new file mode 100644
index 000000000..af2317ca9
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m
@@ -0,0 +1,401 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+
+#import "SDLControlFramePayloadAudioStartServiceAck.h"
+#import "SDLDisplayCapabilities.h"
+#import "SDLGlobals.h"
+#import "SDLImageResolution.h"
+#import "SDLOnHMIStatus.h"
+#import "SDLProtocol.h"
+#import "SDLRegisterAppInterfaceResponse.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLRPCResponseNotification.h"
+#import "SDLScreenParams.h"
+#import "SDLStateMachine.h"
+#import "SDLStreamingAudioLifecycleManager.h"
+#import "SDLStreamingMediaConfiguration.h"
+#import "SDLV2ProtocolHeader.h"
+#import "SDLV2ProtocolMessage.h"
+#import "TestConnectionManager.h"
+
+QuickSpecBegin(SDLStreamingAudioLifecycleManagerSpec)
+
+describe(@"the streaming audio manager", ^{
+ __block SDLStreamingAudioLifecycleManager *streamingLifecycleManager = nil;
+ __block SDLStreamingMediaConfiguration *testConfiguration = [SDLStreamingMediaConfiguration insecureConfiguration];
+ __block TestConnectionManager *testConnectionManager = nil;
+
+ __block void (^sendNotificationForHMILevel)(SDLHMILevel hmiLevel) = ^(SDLHMILevel hmiLevel) {
+ SDLOnHMIStatus *hmiStatus = [[SDLOnHMIStatus alloc] init];
+ hmiStatus.hmiLevel = hmiLevel;
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:self rpcNotification:hmiStatus];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+
+ [NSThread sleepForTimeInterval:0.3];
+ };
+
+ beforeEach(^{
+ testConnectionManager = [[TestConnectionManager alloc] init];
+ streamingLifecycleManager = [[SDLStreamingAudioLifecycleManager alloc] initWithConnectionManager:testConnectionManager configuration:testConfiguration];
+ });
+
+ it(@"should initialize properties", ^{
+ expect(streamingLifecycleManager.audioManager).toNot(beNil());
+ expect(@(streamingLifecycleManager.isStreamingSupported)).to(equal(@NO));
+ expect(@(streamingLifecycleManager.isAudioConnected)).to(equal(@NO));
+ expect(@(streamingLifecycleManager.isAudioEncrypted)).to(equal(@NO));
+ expect(@(streamingLifecycleManager.requestedEncryptionType)).to(equal(@(SDLStreamingEncryptionFlagNone)));
+ expect(streamingLifecycleManager.currentAppState).to(equal(SDLAppStateActive));
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateStopped));
+ });
+
+ describe(@"when started", ^{
+ __block BOOL readyHandlerSuccess = NO;
+ __block NSError *readyHandlerError = nil;
+
+ __block SDLProtocol *protocolMock = OCMClassMock([SDLProtocol class]);
+
+ beforeEach(^{
+ readyHandlerSuccess = NO;
+ readyHandlerError = nil;
+
+ [streamingLifecycleManager startWithProtocol:protocolMock];
+ });
+
+ it(@"should be ready to stream", ^{
+ expect(@(streamingLifecycleManager.isStreamingSupported)).to(equal(@NO));
+ expect(@(streamingLifecycleManager.isAudioConnected)).to(equal(@NO));
+ expect(@(streamingLifecycleManager.isAudioEncrypted)).to(equal(@NO));
+ expect(streamingLifecycleManager.currentAppState).to(equal(SDLAppStateActive));
+ expect(streamingLifecycleManager.currentAudioStreamState).to(match(SDLAudioStreamManagerStateStopped));
+ });
+
+ describe(@"after receiving a register app interface notification", ^{
+ __block SDLRegisterAppInterfaceResponse *someRegisterAppInterfaceResponse = nil;
+ __block SDLDisplayCapabilities *someDisplayCapabilities = nil;
+ __block SDLScreenParams *someScreenParams = nil;
+ __block SDLImageResolution *someImageResolution = nil;
+
+ beforeEach(^{
+ someImageResolution = [[SDLImageResolution alloc] init];
+ someImageResolution.resolutionWidth = @(600);
+ someImageResolution.resolutionHeight = @(100);
+
+ someScreenParams = [[SDLScreenParams alloc] init];
+ someScreenParams.resolution = someImageResolution;
+ });
+
+ context(@"that does not support graphics", ^{
+ beforeEach(^{
+ someDisplayCapabilities = [[SDLDisplayCapabilities alloc] init];
+ someDisplayCapabilities.graphicSupported = @NO;
+
+ someDisplayCapabilities.screenParams = someScreenParams;
+
+ someRegisterAppInterfaceResponse = [[SDLRegisterAppInterfaceResponse alloc] init];
+ someRegisterAppInterfaceResponse.displayCapabilities = someDisplayCapabilities;
+ SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveRegisterAppInterfaceResponse object:self rpcResponse:someRegisterAppInterfaceResponse];
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ [NSThread sleepForTimeInterval:0.1];
+ });
+
+ it(@"should not support streaming", ^{
+ expect(@(streamingLifecycleManager.isStreamingSupported)).to(equal(@NO));
+ });
+ });
+
+ context(@"that supports graphics", ^{
+ beforeEach(^{
+ someDisplayCapabilities = [[SDLDisplayCapabilities alloc] init];
+ someDisplayCapabilities.graphicSupported = @YES;
+
+ someDisplayCapabilities.screenParams = someScreenParams;
+
+ someRegisterAppInterfaceResponse = [[SDLRegisterAppInterfaceResponse alloc] init];
+ someRegisterAppInterfaceResponse.displayCapabilities = someDisplayCapabilities;
+ SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveRegisterAppInterfaceResponse object:self rpcResponse:someRegisterAppInterfaceResponse];
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ [NSThread sleepForTimeInterval:0.1];
+ });
+
+ it(@"should support streaming", ^{
+ expect(@(streamingLifecycleManager.isStreamingSupported)).to(equal(@YES));
+ });
+ });
+ });
+
+ describe(@"if the app state is active", ^{
+ __block id streamStub = nil;
+
+ beforeEach(^{
+ streamStub = OCMPartialMock(streamingLifecycleManager);
+
+ OCMStub([streamStub isStreamingSupported]).andReturn(YES);
+
+ [streamingLifecycleManager.appStateMachine setToState:SDLAppStateActive fromOldState:nil callEnterTransition:NO];
+ });
+
+ describe(@"and the streams are open", ^{
+ beforeEach(^{
+ [streamingLifecycleManager.audioStreamStateMachine setToState:SDLAudioStreamManagerStateReady fromOldState:nil callEnterTransition:NO];
+ });
+
+ describe(@"and the hmi state is limited", ^{
+ beforeEach(^{
+ streamingLifecycleManager.hmiLevel = SDLHMILevelLimited;
+ });
+
+ describe(@"and the hmi state changes to", ^{
+ context(@"none", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelNone);
+ });
+
+ it(@"should close the streams", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateShuttingDown));
+ });
+ });
+
+ context(@"background", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelBackground);
+ });
+
+ it(@"should close the stream", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateShuttingDown));
+ });
+ });
+
+ context(@"limited", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelLimited);
+ });
+
+ it(@"should not close the stream", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateReady));
+ });
+ });
+
+ context(@"full", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelFull);
+ });
+
+ it(@"should not close the stream", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateReady));
+ });
+ });
+ });
+
+ describe(@"and the app state changes to", ^{
+ context(@"inactive", ^{
+ beforeEach(^{
+ [streamingLifecycleManager.appStateMachine setToState:SDLAppStateInactive fromOldState:nil callEnterTransition:YES];
+ });
+
+ it(@"should suspend the video stream", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateShuttingDown));
+ });
+ });
+ });
+ });
+
+ describe(@"and the hmi state is full", ^{
+ beforeEach(^{
+ streamingLifecycleManager.hmiLevel = SDLHMILevelFull;
+ });
+
+ context(@"and hmi state changes to none", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelNone);
+ });
+
+ it(@"should close the streams", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateShuttingDown));
+ });
+ });
+
+ context(@"and hmi state changes to background", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelBackground);
+ });
+
+ it(@"should close the stream", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateShuttingDown));
+ });
+ });
+
+ context(@"and hmi state changes to limited", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelLimited);
+ });
+
+ it(@"should not close the stream", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateReady));
+ });
+ });
+
+ context(@"and hmi state changes to full", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelFull);
+ });
+
+ it(@"should not close the stream", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateReady));
+ });
+ });
+ });
+ });
+
+ describe(@"and the streams are closed", ^{
+ beforeEach(^{
+ [streamingLifecycleManager.audioStreamStateMachine setToState:SDLAudioStreamManagerStateStopped fromOldState:nil callEnterTransition:NO];
+ });
+
+ describe(@"and the hmi state is none", ^{
+ beforeEach(^{
+ streamingLifecycleManager.hmiLevel = SDLHMILevelNone;
+ });
+
+ context(@"and hmi state changes to none", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelNone);
+ });
+
+ it(@"should not start the stream", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateStopped));
+ });
+ });
+
+ context(@"and hmi state changes to background", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelBackground);
+ });
+
+ it(@"should not start the stream", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateStopped));
+ });
+ });
+
+ context(@"and hmi state changes to limited", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelLimited);
+ });
+
+ it(@"should start the streams", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateStarting));
+ });
+ });
+
+ context(@"and hmi state changes to full", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelFull);
+ });
+
+ it(@"should start the streams", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateStarting));
+ });
+ });
+ });
+ });
+ });
+
+ describe(@"after receiving an Audio Start ACK", ^{
+ __block SDLProtocolHeader *testAudioHeader = nil;
+ __block SDLProtocolMessage *testAudioMessage = nil;
+ __block SDLControlFramePayloadAudioStartServiceAck *testAudioStartServicePayload = nil;
+ __block int64_t testMTU = 786579;
+
+ beforeEach(^{
+ [streamingLifecycleManager.audioStreamStateMachine setToState:SDLAudioStreamManagerStateStarting fromOldState:nil callEnterTransition:NO];
+
+ testAudioHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
+ testAudioHeader.frameType = SDLFrameTypeSingle;
+ testAudioHeader.frameData = SDLFrameInfoStartServiceACK;
+ testAudioHeader.encrypted = YES;
+ testAudioHeader.serviceType = SDLServiceTypeAudio;
+
+ testAudioStartServicePayload = [[SDLControlFramePayloadAudioStartServiceAck alloc] initWithMTU:testMTU];
+ testAudioMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testAudioHeader andPayload:testAudioStartServicePayload.data];
+ [streamingLifecycleManager handleProtocolStartServiceACKMessage:testAudioMessage];
+ });
+
+ it(@"should have set all the right properties", ^{
+ expect([[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeAudio]).to(equal(testMTU));
+ expect(streamingLifecycleManager.audioEncrypted).to(equal(YES));
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateReady));
+ });
+ });
+
+ describe(@"after receiving an Audio Start NAK", ^{
+ __block SDLProtocolHeader *testAudioHeader = nil;
+ __block SDLProtocolMessage *testAudioMessage = nil;
+
+ beforeEach(^{
+ [streamingLifecycleManager.audioStreamStateMachine setToState:SDLAudioStreamManagerStateStarting fromOldState:nil callEnterTransition:NO];
+
+ testAudioHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
+ testAudioHeader.frameType = SDLFrameTypeSingle;
+ testAudioHeader.frameData = SDLFrameInfoStartServiceNACK;
+ testAudioHeader.encrypted = NO;
+ testAudioHeader.serviceType = SDLServiceTypeAudio;
+
+ testAudioMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testAudioHeader andPayload:nil];
+ [streamingLifecycleManager handleProtocolEndServiceACKMessage:testAudioMessage];
+ });
+
+ it(@"should have set all the right properties", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateStopped));
+ });
+ });
+
+ describe(@"after receiving a audio end ACK", ^{
+ __block SDLProtocolHeader *testAudioHeader = nil;
+ __block SDLProtocolMessage *testAudioMessage = nil;
+
+ beforeEach(^{
+ [streamingLifecycleManager.audioStreamStateMachine setToState:SDLAudioStreamManagerStateStarting fromOldState:nil callEnterTransition:NO];
+
+ testAudioHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
+ testAudioHeader.frameType = SDLFrameTypeSingle;
+ testAudioHeader.frameData = SDLFrameInfoEndServiceACK;
+ testAudioHeader.encrypted = NO;
+ testAudioHeader.serviceType = SDLServiceTypeAudio;
+
+ testAudioMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testAudioHeader andPayload:nil];
+ [streamingLifecycleManager handleProtocolEndServiceACKMessage:testAudioMessage];
+ });
+
+ it(@"should have set all the right properties", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateStopped));
+ });
+ });
+
+ describe(@"after receiving a audio end NAK", ^{
+ __block SDLProtocolHeader *testAudioHeader = nil;
+ __block SDLProtocolMessage *testAudioMessage = nil;
+
+ beforeEach(^{
+ [streamingLifecycleManager.audioStreamStateMachine setToState:SDLAudioStreamManagerStateStarting fromOldState:nil callEnterTransition:NO];
+
+ testAudioHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
+ testAudioHeader.frameType = SDLFrameTypeSingle;
+ testAudioHeader.frameData = SDLFrameInfoEndServiceNACK;
+ testAudioHeader.encrypted = NO;
+ testAudioHeader.serviceType = SDLServiceTypeAudio;
+
+ testAudioMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testAudioHeader andPayload:nil];
+ [streamingLifecycleManager handleProtocolEndServiceNAKMessage:testAudioMessage];
+ });
+
+ it(@"should have set all the right properties", ^{
+ expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateStopped));
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/SDLStreamingMediaLifecycleManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingVideoLifecycleManagerSpec.m
index 44768e794..33062b9db 100644
--- a/SmartDeviceLinkTests/SDLStreamingMediaLifecycleManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingVideoLifecycleManagerSpec.m
@@ -1,60 +1,51 @@
-//
-// SDLStreamingMediaLifecycleManagerSpec.m
-// SmartDeviceLink-iOS
-//
-
#import <Quick/Quick.h>
#import <Nimble/Nimble.h>
#import <OCMock/OCMock.h>
#import "SDLCarWindowViewController.h"
-#import "SDLConnectionManagerType.h"
-#import "SDLControlFramePayloadAudioStartServiceAck.h"
#import "SDLControlFramePayloadConstants.h"
#import "SDLControlFramePayloadNak.h"
+#import "SDLControlFramePayloadVideoStartService.h"
#import "SDLControlFramePayloadVideoStartServiceAck.h"
#import "SDLDisplayCapabilities.h"
-#import "SDLGenericResponse.h"
+#import "SDLFakeStreamingManagerDataSource.h"
+#import "SDLFocusableItemLocator.h"
#import "SDLGetSystemCapability.h"
#import "SDLGetSystemCapabilityResponse.h"
+#import "SDLGenericResponse.h"
#import "SDLGlobals.h"
-#import "SDLFocusableItemLocatorType.h"
-#import "SDLFocusableItemLocator.h"
#import "SDLHMILevel.h"
#import "SDLImageResolution.h"
-#import "SDLNotificationConstants.h"
#import "SDLOnHMIStatus.h"
#import "SDLProtocol.h"
-#import "SDLRPCNotificationNotification.h"
#import "SDLRegisterAppInterfaceResponse.h"
+#import "SDLRPCNotificationNotification.h"
#import "SDLRPCResponseNotification.h"
#import "SDLScreenParams.h"
#import "SDLStateMachine.h"
#import "SDLStreamingMediaConfiguration.h"
-#import "SDLStreamingMediaLifecycleManager.h"
-#import "SDLFakeStreamingManagerDataSource.h"
+#import "SDLStreamingVideoLifecycleManager.h"
#import "SDLSystemCapability.h"
#import "SDLV2ProtocolHeader.h"
#import "SDLV2ProtocolMessage.h"
#import "SDLVideoStreamingCapability.h"
-#import "SDLVideoStreamingCodec.h"
-#import "SDLVideoStreamingFormat.h"
-#import "SDLVideoStreamingProtocol.h"
+#import "SDLVideoStreamingState.h"
#import "TestConnectionManager.h"
-QuickSpecBegin(SDLStreamingMediaLifecycleManagerSpec)
+QuickSpecBegin(SDLStreamingVideoLifecycleManagerSpec)
-describe(@"the streaming media manager", ^{
- __block SDLStreamingMediaLifecycleManager *streamingLifecycleManager = nil;
+describe(@"the streaming video manager", ^{
+ __block SDLStreamingVideoLifecycleManager *streamingLifecycleManager = nil;
__block SDLStreamingMediaConfiguration *testConfiguration = [SDLStreamingMediaConfiguration insecureConfiguration];
__block SDLCarWindowViewController *testViewController = [[SDLCarWindowViewController alloc] init];
__block SDLFakeStreamingManagerDataSource *testDataSource = [[SDLFakeStreamingManagerDataSource alloc] init];
__block NSString *someBackgroundTitleString = nil;
__block TestConnectionManager *testConnectionManager = nil;
- __block void (^sendNotificationForHMILevel)(SDLHMILevel hmiLevel) = ^(SDLHMILevel hmiLevel) {
+ __block void (^sendNotificationForHMILevel)(SDLHMILevel hmiLevel, SDLVideoStreamingState streamState) = ^(SDLHMILevel hmiLevel, SDLVideoStreamingState streamState) {
SDLOnHMIStatus *hmiStatus = [[SDLOnHMIStatus alloc] init];
hmiStatus.hmiLevel = hmiLevel;
+ hmiStatus.videoStreamingState = streamState;
SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:self rpcNotification:hmiStatus];
[[NSNotificationCenter defaultCenter] postNotification:notification];
@@ -69,25 +60,21 @@ describe(@"the streaming media manager", ^{
testConfiguration.rootViewController = testViewController;
someBackgroundTitleString = @"Open Test App";
testConnectionManager = [[TestConnectionManager alloc] init];
- streamingLifecycleManager = [[SDLStreamingMediaLifecycleManager alloc] initWithConnectionManager:testConnectionManager configuration:testConfiguration];
+ streamingLifecycleManager = [[SDLStreamingVideoLifecycleManager alloc] initWithConnectionManager:testConnectionManager configuration:testConfiguration];
});
it(@"should initialize properties", ^{
expect(streamingLifecycleManager.touchManager).toNot(beNil());
expect(streamingLifecycleManager.focusableItemManager).toNot(beNil());
- expect(streamingLifecycleManager.audioManager).toNot(beNil());
expect(@(streamingLifecycleManager.isStreamingSupported)).to(equal(@NO));
expect(@(streamingLifecycleManager.isVideoConnected)).to(equal(@NO));
- expect(@(streamingLifecycleManager.isAudioConnected)).to(equal(@NO));
expect(@(streamingLifecycleManager.isVideoEncrypted)).to(equal(@NO));
- expect(@(streamingLifecycleManager.isAudioEncrypted)).to(equal(@NO));
expect(@(streamingLifecycleManager.isVideoStreamingPaused)).to(equal(@YES));
expect(@(CGSizeEqualToSize(streamingLifecycleManager.screenSize, CGSizeZero))).to(equal(@YES));
expect(@(streamingLifecycleManager.pixelBufferPool == NULL)).to(equal(@YES));
expect(@(streamingLifecycleManager.requestedEncryptionType)).to(equal(@(SDLStreamingEncryptionFlagNone)));
expect(streamingLifecycleManager.currentAppState).to(equal(SDLAppStateActive));
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateStopped));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateStopped));
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
expect(streamingLifecycleManager.videoFormat).to(beNil());
expect(streamingLifecycleManager.dataSource).to(equal(testDataSource));
expect(streamingLifecycleManager.supportedFormats).to(haveCount(2));
@@ -101,7 +88,7 @@ describe(@"the streaming media manager", ^{
__block BOOL readyHandlerSuccess = NO;
__block NSError *readyHandlerError = nil;
- __block id protocolMock = OCMClassMock([SDLProtocol class]);
+ __block SDLProtocol *protocolMock = OCMClassMock([SDLProtocol class]);
beforeEach(^{
readyHandlerSuccess = NO;
@@ -113,15 +100,12 @@ describe(@"the streaming media manager", ^{
it(@"should be ready to stream", ^{
expect(@(streamingLifecycleManager.isStreamingSupported)).to(equal(@NO));
expect(@(streamingLifecycleManager.isVideoConnected)).to(equal(@NO));
- expect(@(streamingLifecycleManager.isAudioConnected)).to(equal(@NO));
expect(@(streamingLifecycleManager.isVideoEncrypted)).to(equal(@NO));
- expect(@(streamingLifecycleManager.isAudioEncrypted)).to(equal(@NO));
expect(@(streamingLifecycleManager.isVideoStreamingPaused)).to(equal(@YES));
expect(@(CGSizeEqualToSize(streamingLifecycleManager.screenSize, CGSizeZero))).to(equal(@YES));
expect(@(streamingLifecycleManager.pixelBufferPool == NULL)).to(equal(@YES));
expect(streamingLifecycleManager.currentAppState).to(equal(SDLAppStateActive));
- expect(streamingLifecycleManager.currentAudioStreamState).to(match(SDLAudioStreamStateStopped));
- expect(streamingLifecycleManager.currentVideoStreamState).to(match(SDLVideoStreamStateStopped));
+ expect(streamingLifecycleManager.currentVideoStreamState).to(match(SDLVideoStreamManagerStateStopped));
});
describe(@"after receiving a register app interface notification", ^{
@@ -182,23 +166,21 @@ describe(@"the streaming media manager", ^{
});
describe(@"if the app state is active", ^{
- __block id streamStub = nil;
+ __block SDLStreamingVideoLifecycleManager *streamStub = nil;
beforeEach(^{
streamStub = OCMPartialMock(streamingLifecycleManager);
-
OCMStub([streamStub isStreamingSupported]).andReturn(YES);
[streamingLifecycleManager.appStateMachine setToState:SDLAppStateActive fromOldState:nil callEnterTransition:NO];
});
- describe(@"and both streams are open", ^{
+ context(@"and the stream is open", ^{
beforeEach(^{
- [streamingLifecycleManager.audioStreamStateMachine setToState:SDLAudioStreamStateReady fromOldState:nil callEnterTransition:NO];
- [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamStateReady fromOldState:nil callEnterTransition:NO];
+ [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamManagerStateReady fromOldState:nil callEnterTransition:NO];
});
- describe(@"and the hmi state is limited", ^{
+ context(@"and the hmi state is limited", ^{
beforeEach(^{
streamingLifecycleManager.hmiLevel = SDLHMILevelLimited;
});
@@ -206,45 +188,51 @@ describe(@"the streaming media manager", ^{
describe(@"and the hmi state changes to", ^{
context(@"none", ^{
beforeEach(^{
- sendNotificationForHMILevel(SDLHMILevelNone);
+ sendNotificationForHMILevel(SDLHMILevelNone, SDLVideoStreamingStateStreamable);
});
- it(@"should close both streams", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateShuttingDown));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateShuttingDown));
+ it(@"should close the stream", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateShuttingDown));
});
});
context(@"background", ^{
beforeEach(^{
- sendNotificationForHMILevel(SDLHMILevelBackground);
+ sendNotificationForHMILevel(SDLHMILevelBackground, SDLVideoStreamingStateStreamable);
});
- it(@"should close both stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateShuttingDown));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateShuttingDown));
+ it(@"should close the stream", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateShuttingDown));
});
});
context(@"limited", ^{
beforeEach(^{
- sendNotificationForHMILevel(SDLHMILevelLimited);
+ sendNotificationForHMILevel(SDLHMILevelLimited, SDLVideoStreamingStateStreamable);
});
- it(@"should not close either stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateReady));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateReady));
+ it(@"should not close the stream", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateReady));
});
});
context(@"full", ^{
beforeEach(^{
- sendNotificationForHMILevel(SDLHMILevelFull);
+ sendNotificationForHMILevel(SDLHMILevelFull, SDLVideoStreamingStateStreamable);
});
- it(@"should not close either stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateReady));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateReady));
+ it(@"should not close the stream", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateReady));
+ });
+ });
+
+ context(@"full but not streamable", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelFull, SDLVideoStreamingStateNotStreamable);
+ });
+
+ it(@"should close the stream", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateShuttingDown));
});
});
});
@@ -256,116 +244,126 @@ describe(@"the streaming media manager", ^{
});
it(@"should suspend the video stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateShuttingDown));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateSuspended));
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateSuspended));
});
});
});
});
- describe(@"and the hmi state is full", ^{
+ context(@"and the hmi state is full", ^{
beforeEach(^{
streamingLifecycleManager.hmiLevel = SDLHMILevelFull;
});
context(@"and hmi state changes to none", ^{
beforeEach(^{
- sendNotificationForHMILevel(SDLHMILevelNone);
+ sendNotificationForHMILevel(SDLHMILevelNone, SDLVideoStreamingStateStreamable);
});
- it(@"should close both streams", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateShuttingDown));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateShuttingDown));
+ it(@"should close the streams", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateShuttingDown));
});
});
context(@"and hmi state changes to background", ^{
beforeEach(^{
- sendNotificationForHMILevel(SDLHMILevelBackground);
+ sendNotificationForHMILevel(SDLHMILevelBackground, SDLVideoStreamingStateStreamable);
});
- it(@"should close both stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateShuttingDown));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateShuttingDown));
+ it(@"should close the stream", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateShuttingDown));
});
});
context(@"and hmi state changes to limited", ^{
beforeEach(^{
- sendNotificationForHMILevel(SDLHMILevelLimited);
+ sendNotificationForHMILevel(SDLHMILevelLimited, SDLVideoStreamingStateStreamable);
});
- it(@"should not close either stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateReady));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateReady));
+ it(@"should not close the stream", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateReady));
});
});
context(@"and hmi state changes to full", ^{
beforeEach(^{
- sendNotificationForHMILevel(SDLHMILevelFull);
+ sendNotificationForHMILevel(SDLHMILevelFull, SDLVideoStreamingStateStreamable);
});
- it(@"should not close either stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateReady));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateReady));
+ it(@"should not close the stream", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateReady));
+ });
+ });
+
+ context(@"full but not streamable", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelFull, SDLVideoStreamingStateNotStreamable);
+ });
+
+ it(@"should close the stream", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateShuttingDown));
});
});
});
});
- describe(@"and both streams are closed", ^{
+ context(@"and both streams are closed", ^{
beforeEach(^{
- [streamingLifecycleManager.audioStreamStateMachine setToState:SDLAudioStreamStateStopped fromOldState:nil callEnterTransition:NO];
- [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamStateStopped fromOldState:nil callEnterTransition:NO];
+ [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamManagerStateStopped fromOldState:nil callEnterTransition:NO];
});
- describe(@"and the hmi state is none", ^{
+ context(@"and the hmi state is none", ^{
beforeEach(^{
streamingLifecycleManager.hmiLevel = SDLHMILevelNone;
});
context(@"and hmi state changes to none", ^{
beforeEach(^{
- sendNotificationForHMILevel(SDLHMILevelNone);
+ sendNotificationForHMILevel(SDLHMILevelNone, SDLVideoStreamingStateStreamable);
});
- it(@"should not start either stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateStopped));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateStopped));
+ it(@"should not start the stream", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
});
});
context(@"and hmi state changes to background", ^{
beforeEach(^{
- sendNotificationForHMILevel(SDLHMILevelBackground);
+ sendNotificationForHMILevel(SDLHMILevelBackground, SDLVideoStreamingStateStreamable);
});
- it(@"should not start either stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateStopped));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateStopped));
+ it(@"should not start the stream", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
});
});
context(@"and hmi state changes to limited", ^{
beforeEach(^{
- sendNotificationForHMILevel(SDLHMILevelLimited);
+ sendNotificationForHMILevel(SDLHMILevelLimited, SDLVideoStreamingStateStreamable);
});
- it(@"should start both streams", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateStarting));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateStarting));
+ it(@"should start the streams", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStarting));
});
});
context(@"and hmi state changes to full", ^{
beforeEach(^{
- sendNotificationForHMILevel(SDLHMILevelFull);
+ sendNotificationForHMILevel(SDLHMILevelFull, SDLVideoStreamingStateStreamable);
+ });
+
+ it(@"should start the streams", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStarting));
+ });
+ });
+
+ context(@"full but not streamable", ^{
+ beforeEach(^{
+ sendNotificationForHMILevel(SDLHMILevelFull, SDLVideoStreamingStateNotStreamable);
});
- it(@"should start both streams", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateStarting));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateStarting));
+ it(@"should not start the stream", ^{
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
});
});
});
@@ -374,7 +372,7 @@ describe(@"the streaming media manager", ^{
describe(@"sending a video capabilities request", ^{
beforeEach(^{
- [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamStateStarting fromOldState:nil callEnterTransition:YES];
+ [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamManagerStateStarting fromOldState:nil callEnterTransition:YES];
});
it(@"should send out a video capabilities request", ^{
@@ -403,50 +401,50 @@ describe(@"the streaming media manager", ^{
expect(streamingLifecycleManager.preferredResolutions.firstObject.resolutionWidth).to(equal(0));
expect(streamingLifecycleManager.preferredResolutions.firstObject.resolutionHeight).to(equal(0));
});
- });
- context(@"and receiving a response", ^{
- __block SDLImageResolution *resolution = nil;
- __block int32_t maxBitrate = 0;
- __block NSArray<SDLVideoStreamingFormat *> *testFormats = nil;
- __block BOOL testHapticsSupported = NO;
+ context(@"and receiving a response", ^{
+ __block SDLImageResolution *resolution = nil;
+ __block int32_t maxBitrate = 0;
+ __block NSArray<SDLVideoStreamingFormat *> *testFormats = nil;
+ __block BOOL testHapticsSupported = NO;
- beforeEach(^{
- SDLGetSystemCapabilityResponse *response = [[SDLGetSystemCapabilityResponse alloc] init];
- response.success = @YES;
- response.systemCapability = [[SDLSystemCapability alloc] init];
- response.systemCapability.systemCapabilityType = SDLSystemCapabilityTypeVideoStreaming;
-
- resolution = [[SDLImageResolution alloc] initWithWidth:42 height:69];
- maxBitrate = 12345;
- testFormats = @[[[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH265 protocol:SDLVideoStreamingProtocolRTMP], [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRTP]];
- testHapticsSupported = YES;
- response.systemCapability.videoStreamingCapability = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:resolution maxBitrate:maxBitrate supportedFormats:testFormats hapticDataSupported:testHapticsSupported];
- [testConnectionManager respondToLastRequestWithResponse:response];
- });
+ beforeEach(^{
+ SDLGetSystemCapabilityResponse *response = [[SDLGetSystemCapabilityResponse alloc] init];
+ response.success = @YES;
+ response.systemCapability = [[SDLSystemCapability alloc] init];
+ response.systemCapability.systemCapabilityType = SDLSystemCapabilityTypeVideoStreaming;
+
+ resolution = [[SDLImageResolution alloc] initWithWidth:42 height:69];
+ maxBitrate = 12345;
+ testFormats = @[[[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH265 protocol:SDLVideoStreamingProtocolRTMP], [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRTP]];
+ testHapticsSupported = YES;
+ response.systemCapability.videoStreamingCapability = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:resolution maxBitrate:maxBitrate supportedFormats:testFormats hapticDataSupported:testHapticsSupported];
+ [testConnectionManager respondToLastRequestWithResponse:response];
+ });
- it(@"should have correct data from the data source", ^{
- // Correct formats should be retrieved from the data source
- expect(streamingLifecycleManager.preferredResolutions).to(haveCount(1));
- expect(streamingLifecycleManager.preferredResolutions.firstObject.resolutionWidth).to(equal(resolution.resolutionWidth));
- expect(streamingLifecycleManager.preferredResolutions.firstObject.resolutionHeight).to(equal(resolution.resolutionHeight));
+ it(@"should have correct data from the data source", ^{
+ // Correct formats should be retrieved from the data source
+ expect(streamingLifecycleManager.preferredResolutions).to(haveCount(1));
+ expect(streamingLifecycleManager.preferredResolutions.firstObject.resolutionWidth).to(equal(resolution.resolutionWidth));
+ expect(streamingLifecycleManager.preferredResolutions.firstObject.resolutionHeight).to(equal(resolution.resolutionHeight));
- expect(streamingLifecycleManager.preferredFormats).to(haveCount(streamingLifecycleManager.supportedFormats.count + 1));
- expect(streamingLifecycleManager.preferredFormats.firstObject.codec).to(equal(testDataSource.extraFormat.codec));
- expect(streamingLifecycleManager.preferredFormats.firstObject.protocol).to(equal(testDataSource.extraFormat.protocol));
+ expect(streamingLifecycleManager.preferredFormats).to(haveCount(streamingLifecycleManager.supportedFormats.count + 1));
+ expect(streamingLifecycleManager.preferredFormats.firstObject.codec).to(equal(testDataSource.extraFormat.codec));
+ expect(streamingLifecycleManager.preferredFormats.firstObject.protocol).to(equal(testDataSource.extraFormat.protocol));
- // The haptic manager should be enabled
- expect(streamingLifecycleManager.focusableItemManager.enableHapticDataRequests).to(equal(YES));
- });
+ // The haptic manager should be enabled
+ expect(streamingLifecycleManager.focusableItemManager.enableHapticDataRequests).to(equal(YES));
+ });
- it(@"should have decided upon the correct preferred format and resolution", ^{
- SDLVideoStreamingFormat *preferredFormat = streamingLifecycleManager.preferredFormats[streamingLifecycleManager.preferredFormatIndex];
- expect(preferredFormat.codec).to(equal(SDLVideoStreamingCodecH264));
- expect(preferredFormat.protocol).to(equal(SDLVideoStreamingProtocolRTP));
+ it(@"should have decided upon the correct preferred format and resolution", ^{
+ SDLVideoStreamingFormat *preferredFormat = streamingLifecycleManager.preferredFormats[streamingLifecycleManager.preferredFormatIndex];
+ expect(preferredFormat.codec).to(equal(SDLVideoStreamingCodecH264));
+ expect(preferredFormat.protocol).to(equal(SDLVideoStreamingProtocolRTP));
- SDLImageResolution *preferredResolution = streamingLifecycleManager.preferredResolutions[streamingLifecycleManager.preferredResolutionIndex];
- expect(preferredResolution.resolutionHeight).to(equal(@69));
- expect(preferredResolution.resolutionWidth).to(equal(@42));
+ SDLImageResolution *preferredResolution = streamingLifecycleManager.preferredResolutions[streamingLifecycleManager.preferredResolutionIndex];
+ expect(preferredResolution.resolutionHeight).to(equal(@69));
+ expect(preferredResolution.resolutionWidth).to(equal(@42));
+ });
});
});
});
@@ -462,7 +460,7 @@ describe(@"the streaming media manager", ^{
__block SDLVideoStreamingProtocol testVideoProtocol = SDLVideoStreamingProtocolRTP;
beforeEach(^{
- [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamStateStarting fromOldState:nil callEnterTransition:NO];
+ [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamManagerStateStarting fromOldState:nil callEnterTransition:NO];
testVideoHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
testVideoHeader.frameType = SDLFrameTypeSingle;
@@ -483,7 +481,7 @@ describe(@"the streaming media manager", ^{
expect(CGSizeEqualToSize(streamingLifecycleManager.screenSize, CGSizeMake(testVideoWidth, testVideoHeight))).to(equal(YES));
expect(streamingLifecycleManager.videoEncrypted).to(equal(YES));
expect(streamingLifecycleManager.videoFormat).to(equal([[SDLVideoStreamingFormat alloc] initWithCodec:testVideoCodec protocol:testVideoProtocol]));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateReady));
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateReady));
});
});
@@ -497,7 +495,7 @@ describe(@"the streaming media manager", ^{
it(@"should fall back correctly", ^{
expect(CGSizeEqualToSize(streamingLifecycleManager.screenSize, CGSizeMake(testVideoWidth, testVideoHeight))).to(equal(YES));
expect(streamingLifecycleManager.videoFormat).to(equal([[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRAW]));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateReady));
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateReady));
});
});
@@ -550,7 +548,7 @@ describe(@"the streaming media manager", ^{
__block SDLControlFramePayloadNak *testVideoStartNakPayload = nil;
beforeEach(^{
- [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamStateStarting fromOldState:nil callEnterTransition:NO];
+ [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamManagerStateStarting fromOldState:nil callEnterTransition:NO];
testVideoHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
testVideoHeader.frameType = SDLFrameTypeSingle;
@@ -580,7 +578,7 @@ describe(@"the streaming media manager", ^{
});
it(@"should end the service", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateStopped));
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
});
});
});
@@ -590,7 +588,7 @@ describe(@"the streaming media manager", ^{
__block SDLProtocolMessage *testVideoMessage = nil;
beforeEach(^{
- [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamStateStarting fromOldState:nil callEnterTransition:NO];
+ [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamManagerStateStarting fromOldState:nil callEnterTransition:NO];
testVideoHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
testVideoHeader.frameType = SDLFrameTypeSingle;
@@ -603,7 +601,7 @@ describe(@"the streaming media manager", ^{
});
it(@"should have set all the right properties", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateStopped));
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
});
});
@@ -612,7 +610,7 @@ describe(@"the streaming media manager", ^{
__block SDLProtocolMessage *testVideoMessage = nil;
beforeEach(^{
- [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamStateStarting fromOldState:nil callEnterTransition:NO];
+ [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamManagerStateStarting fromOldState:nil callEnterTransition:NO];
testVideoHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
testVideoHeader.frameType = SDLFrameTypeSingle;
@@ -625,100 +623,7 @@ describe(@"the streaming media manager", ^{
});
it(@"should have set all the right properties", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamStateStopped));
- });
- });
-
- describe(@"after receiving an Audio Start ACK", ^{
- __block SDLProtocolHeader *testAudioHeader = nil;
- __block SDLProtocolMessage *testAudioMessage = nil;
- __block SDLControlFramePayloadAudioStartServiceAck *testAudioStartServicePayload = nil;
- __block int64_t testMTU = 786579;
-
- beforeEach(^{
- [streamingLifecycleManager.audioStreamStateMachine setToState:SDLAudioStreamStateStarting fromOldState:nil callEnterTransition:NO];
-
- testAudioHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
- testAudioHeader.frameType = SDLFrameTypeSingle;
- testAudioHeader.frameData = SDLFrameInfoStartServiceACK;
- testAudioHeader.encrypted = YES;
- testAudioHeader.serviceType = SDLServiceTypeAudio;
-
- testAudioStartServicePayload = [[SDLControlFramePayloadAudioStartServiceAck alloc] initWithMTU:testMTU];
- testAudioMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testAudioHeader andPayload:testAudioStartServicePayload.data];
- [streamingLifecycleManager handleProtocolStartServiceACKMessage:testAudioMessage];
- });
-
- it(@"should have set all the right properties", ^{
- expect([[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeAudio]).to(equal(testMTU));
- expect(streamingLifecycleManager.audioEncrypted).to(equal(YES));
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateReady));
- });
- });
-
- describe(@"after receiving an Audio Start NAK", ^{
- __block SDLProtocolHeader *testAudioHeader = nil;
- __block SDLProtocolMessage *testAudioMessage = nil;
-
- beforeEach(^{
- [streamingLifecycleManager.videoStreamStateMachine setToState:SDLAudioStreamStateStarting fromOldState:nil callEnterTransition:NO];
-
- testAudioHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
- testAudioHeader.frameType = SDLFrameTypeSingle;
- testAudioHeader.frameData = SDLFrameInfoStartServiceNACK;
- testAudioHeader.encrypted = NO;
- testAudioHeader.serviceType = SDLServiceTypeAudio;
-
- testAudioMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testAudioHeader andPayload:nil];
- [streamingLifecycleManager handleProtocolEndServiceACKMessage:testAudioMessage];
- });
-
- it(@"should have set all the right properties", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateStopped));
- });
- });
-
- describe(@"after receiving a audio end ACK", ^{
- __block SDLProtocolHeader *testAudioHeader = nil;
- __block SDLProtocolMessage *testAudioMessage = nil;
-
- beforeEach(^{
- [streamingLifecycleManager.videoStreamStateMachine setToState:SDLAudioStreamStateStarting fromOldState:nil callEnterTransition:NO];
-
- testAudioHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
- testAudioHeader.frameType = SDLFrameTypeSingle;
- testAudioHeader.frameData = SDLFrameInfoEndServiceACK;
- testAudioHeader.encrypted = NO;
- testAudioHeader.serviceType = SDLServiceTypeAudio;
-
- testAudioMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testAudioHeader andPayload:nil];
- [streamingLifecycleManager handleProtocolEndServiceACKMessage:testAudioMessage];
- });
-
- it(@"should have set all the right properties", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateStopped));
- });
- });
-
- describe(@"after receiving a audio end NAK", ^{
- __block SDLProtocolHeader *testAudioHeader = nil;
- __block SDLProtocolMessage *testAudioMessage = nil;
-
- beforeEach(^{
- [streamingLifecycleManager.videoStreamStateMachine setToState:SDLAudioStreamStateStarting fromOldState:nil callEnterTransition:NO];
-
- testAudioHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
- testAudioHeader.frameType = SDLFrameTypeSingle;
- testAudioHeader.frameData = SDLFrameInfoEndServiceNACK;
- testAudioHeader.encrypted = NO;
- testAudioHeader.serviceType = SDLServiceTypeAudio;
-
- testAudioMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testAudioHeader andPayload:nil];
- [streamingLifecycleManager handleProtocolEndServiceNAKMessage:testAudioMessage];
- });
-
- it(@"should have set all the right properties", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamStateStopped));
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
});
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m
index 5005483d0..ef5b18623 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m
@@ -94,7 +94,7 @@ describe(@"text and graphic manager", ^{
expect(testManager.textField1).to(equal(testString));
expect(testManager.inProgressUpdate).to(beNil());
- expect(testManager.isDirty).to(beFalse());
+ expect(testManager.isDirty).to(beTrue());
});
});
@@ -108,7 +108,7 @@ describe(@"text and graphic manager", ^{
expect(testManager.textField1).to(equal(testString));
expect(testManager.inProgressUpdate).to(beNil());
- expect(testManager.isDirty).to(beFalse());
+ expect(testManager.isDirty).to(beTrue());
});
});
diff --git a/SmartDeviceLinkTests/ProtocolSpecs/SDLFunctionIDSpec.m b/SmartDeviceLinkTests/ProtocolSpecs/SDLFunctionIDSpec.m
index 51145a6f6..8c87737e0 100644
--- a/SmartDeviceLinkTests/ProtocolSpecs/SDLFunctionIDSpec.m
+++ b/SmartDeviceLinkTests/ProtocolSpecs/SDLFunctionIDSpec.m
@@ -78,7 +78,8 @@ describe(@"GetFunctionName Tests", ^ {
expect([functionID functionNameForId:32781]).to(equal(SDLNameOnSystemRequest));
expect([functionID functionNameForId:32782]).to(equal(SDLNameOnHashChange));
expect([functionID functionNameForId:32784]).to(equal(SDLNameOnWayPointChange));
-
+ expect([functionID functionNameForId:32785]).to(equal(SDLNameOnRCStatus));
+
//Not listed in Spec
expect([functionID functionNameForId:65536]).to(equal(SDLNameEncodedSyncPData));
expect([functionID functionNameForId:65537]).to(equal(SDLNameSyncPData));
@@ -151,6 +152,7 @@ describe(@"GetFunctionID Tests", ^ {
expect([functionID functionIdForName:SDLNameOnSystemRequest]).to(equal(@32781));
expect([functionID functionIdForName:SDLNameOnHashChange]).to(equal(@32782));
expect([functionID functionIdForName:SDLNameOnWayPointChange]).to(equal(@32784));
+ expect([functionID functionIdForName:SDLNameOnRCStatus]).to(equal(@32785));
//Not listed in Spec
expect([functionID functionIdForName:SDLNameEncodedSyncPData]).to(equal(@65536));
@@ -158,6 +160,7 @@ describe(@"GetFunctionID Tests", ^ {
expect([functionID functionIdForName:SDLNameOnEncodedSyncPData]).to(equal(@98304));
expect([functionID functionIdForName:SDLNameOnSyncPData]).to(equal(@98305));
+
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLElectronicParkBrakeStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLElectronicParkBrakeStatusSpec.m
new file mode 100644
index 000000000..4dde85088
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLElectronicParkBrakeStatusSpec.m
@@ -0,0 +1,18 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLElectronicParkBrakeStatus.h"
+
+QuickSpecBegin(SDLElectronicParkBrakeStatusSpec)
+
+describe(@"Individual Enum Value Tests", ^ {
+ it(@"Should match internal values", ^ {
+ expect(SDLElectronicParkBrakeStatusClosed).to(equal(@"CLOSED"));
+ expect(SDLElectronicParkBrakeStatusTransition).to(equal(@"TRANSITION"));
+ expect(SDLElectronicParkBrakeStatusOpen).to(equal(@"OPEN"));
+ expect(SDLElectronicParkBrakeStatusDriveActive).to(equal(@"DRIVE_ACTIVE"));
+ expect(SDLElectronicParkBrakeStatusFault).to(equal(@"FAULT"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLMassageCushionSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLMassageCushionSpec.m
new file mode 100644
index 000000000..da8d21526
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLMassageCushionSpec.m
@@ -0,0 +1,25 @@
+//
+// SDLMassageCushionSpec.m
+// SmartDeviceLinkTests
+//
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLMassageCushion.h"
+
+QuickSpecBegin(SDLMassageCushionSpec)
+
+describe(@"Individual Enum Value Tests", ^ {
+ it(@"Should match internal values", ^ {
+ expect(SDLMassageCushionTopLumbar).to(equal(@"TOP_LUMBAR"));
+ expect(SDLMassageCushionMiddleLumbar).to(equal(@"MIDDLE_LUMBAR"));
+ expect(SDLMassageCushionBottomLumbar).to(equal(@"BOTTOM_LUMBAR"));
+ expect(SDLMassageCushionBackBolsters).to(equal(@"BACK_BOLSTERS"));
+ expect(SDLMassageCushionSeatBolsters).to(equal(@"SEAT_BOLSTERS"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLMassageModeSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLMassageModeSpec.m
new file mode 100644
index 000000000..b4cc8dcc8
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLMassageModeSpec.m
@@ -0,0 +1,23 @@
+//
+// SDLMassageModeSpec.m
+// SmartDeviceLinkTests
+//
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLMassageMode.h"
+
+QuickSpecBegin(SDLMassageModeSpec)
+
+describe(@"Individual Enum Value Tests", ^ {
+ it(@"Should match internal values", ^ {
+ expect(SDLMassageModeOff).to(equal(@"OFF"));
+ expect(SDLMassageModeLow).to(equal(@"LOW"));
+ expect(SDLMassageModeHigh).to(equal(@"HIGH"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLMassageZoneSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLMassageZoneSpec.m
new file mode 100644
index 000000000..71c05424b
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLMassageZoneSpec.m
@@ -0,0 +1,22 @@
+//
+// SDLMassageZoneSpec.m
+// SmartDeviceLinkTests
+//
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLMassageZone.h"
+
+QuickSpecBegin(SDLMassageZoneSpec)
+
+describe(@"Individual Enum Value Tests", ^ {
+ it(@"Should match internal values", ^ {
+ expect(SDLMassageZoneLumbar).to(equal(@"LUMBAR"));
+ expect(SDLMassageZoneSeatCushion).to(equal(@"SEAT_CUSHION"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLModuleTypeSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLModuleTypeSpec.m
new file mode 100644
index 000000000..09fdd5006
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLModuleTypeSpec.m
@@ -0,0 +1,23 @@
+//
+// SDLModuleTypeSpec.m
+// SmartDeviceLinkTests
+//
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLModuleType.h"
+
+QuickSpecBegin(SDLModuleTypeSpec)
+
+describe(@"Individual Enum Value Tests", ^ {
+ it(@"Should match internal values", ^ {
+ expect(SDLModuleTypeRadio).to(equal(@"RADIO"));
+ expect(SDLModuleTypeClimate).to(equal(@"CLIMATE"));
+ expect(SDLModuleTypeSeat).to(equal(@"SEAT"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSpeechCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSpeechCapabilitiesSpec.m
index b21c5b578..19c0f1182 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSpeechCapabilitiesSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSpeechCapabilitiesSpec.m
@@ -19,6 +19,7 @@ describe(@"Individual Enum Value Tests", ^ {
expect(SDLSpeechCapabilitiesLHPlusPhonemes).to(equal(@"LHPLUS_PHONEMES"));
expect(SDLSpeechCapabilitiesPrerecorded).to(equal(@"PRE_RECORDED"));
expect(SDLSpeechCapabilitiesSilence).to(equal(@"SILENCE"));
+ expect(SDLSpeechCapabilitiesFile).to(equal(@"FILE"));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLStaticIconNameSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLStaticIconNameSpec.m
new file mode 100644
index 000000000..786ecc7c6
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLStaticIconNameSpec.m
@@ -0,0 +1,200 @@
+//
+// SDLStaticIconNameSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Nicole on 7/23/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLStaticIconName.h"
+
+QuickSpecBegin(SDLStaticIconNameSpec)
+
+describe(@"Individual Enum Value Tests", ^{
+ it(@"Should match internal values", ^{
+ expect(SDLStaticIconNameAcceptCall).to(equal(@"0x29"));
+ expect(SDLStaticIconNameAddWaypoint).to(equal(@"0x1B"));
+ expect(SDLStaticIconNameAlbum).to(equal(@"0x21"));
+ expect(SDLStaticIconNameAmbientLighting).to(equal(@"0x3d"));
+ expect(SDLStaticIconNameArrowNorth).to(equal(@"0x40"));
+ expect(SDLStaticIconNameAudioMute).to(equal(@"0x12"));
+ expect(SDLStaticIconNameAudiobookEpisode).to(equal(@"0x83"));
+ expect(SDLStaticIconNameAudiobookNarrator).to(equal(@"0x82"));
+ expect(SDLStaticIconNameAuxillaryAudio).to(equal(@"0x45"));
+ expect(SDLStaticIconNameBack).to(equal(@"0x86"));
+ expect(SDLStaticIconNameBatteryCapacity0Of5).to(equal(@"0xF7"));
+ expect(SDLStaticIconNameBatteryCapacity1Of5).to(equal(@"0xF8"));
+ expect(SDLStaticIconNameBatteryCapacity2Of5).to(equal(@"0xF9"));
+ expect(SDLStaticIconNameBatteryCapacity3Of5).to(equal(@"0xFA"));
+ expect(SDLStaticIconNameBatteryCapacity4Of5).to(equal(@"0xf6"));
+ expect(SDLStaticIconNameBatteryCapacity5Of5).to(equal(@"0xFB"));
+ expect(SDLStaticIconNameBluetoothAudioSource).to(equal(@"0x09"));
+ expect(SDLStaticIconNameBluetooth1).to(equal(@"0xcc"));
+ expect(SDLStaticIconNameBluetooth2).to(equal(@"0xCD"));
+ expect(SDLStaticIconNameBrowse).to(equal(@"0x77"));
+ expect(SDLStaticIconNameCellPhoneInRoamingMode).to(equal(@"0x66"));
+ expect(SDLStaticIconNameCellServiceSignalStrength0Of5Bars).to(equal(@"0x67"));
+ expect(SDLStaticIconNameCellServiceSignalStrength1Of5Bars).to(equal(@"0x68"));
+ expect(SDLStaticIconNameCellServiceSignalStrength2Of5Bars).to(equal(@"0x69"));
+ expect(SDLStaticIconNameCellServiceSignalStrength3Of5Bars).to(equal(@"0x6A"));
+ expect(SDLStaticIconNameCellServiceSignalStrength4Of5Bars).to(equal(@"0x6B"));
+ expect(SDLStaticIconNameCellServiceSignalStrength5Of5Bars).to(equal(@"0xd3"));
+ expect(SDLStaticIconNameChangeLaneLeft).to(equal(@"0xc3"));
+ expect(SDLStaticIconNameChangeLaneRight).to(equal(@"0xc1"));
+ expect(SDLStaticIconNameCheckBoxChecked).to(equal(@"0x27"));
+ expect(SDLStaticIconNameCheckBoxUnchecked).to(equal(@"0x28"));
+ expect(SDLStaticIconNameClimate).to(equal(@"0xd1"));
+ expect(SDLStaticIconNameClock).to(equal(@"0xfc"));
+ expect(SDLStaticIconNameCompose).to(equal(@"0x1A"));
+ expect(SDLStaticIconNameContact).to(equal(@"0x5C"));
+ expect(SDLStaticIconNameContinue).to(equal(@"0x42"));
+ expect(SDLStaticIconNameDash).to(equal(@"0x7F"));
+ expect(SDLStaticIconNameDate).to(equal(@"0x87"));
+ expect(SDLStaticIconNameDelete).to(equal(@"0x0F"));
+ expect(SDLStaticIconNameDestination).to(equal(@"0x94"));
+ expect(SDLStaticIconNameDestinationFerryAhead).to(equal(@"0x4D"));
+ expect(SDLStaticIconNameEbookmark).to(equal(@"0x2B"));
+ expect(SDLStaticIconNameEmpty).to(equal(@"0x01"));
+ expect(SDLStaticIconNameEndCall).to(equal(@"0x2C"));
+ expect(SDLStaticIconNameFail).to(equal(@"0xD6"));
+ expect(SDLStaticIconNameFastForward30Secs).to(equal(@"0x08"));
+ expect(SDLStaticIconNameFavoriteHeart).to(equal(@"0x0E"));
+ expect(SDLStaticIconNameFavoriteStar).to(equal(@"0x95"));
+ expect(SDLStaticIconNameFaxNumber).to(equal(@"0x80"));
+ expect(SDLStaticIconNameFilename).to(equal(@"0x50"));
+ expect(SDLStaticIconNameFilter).to(equal(@"0x79"));
+ expect(SDLStaticIconNameFolder).to(equal(@"0x1C"));
+ expect(SDLStaticIconNameFuelPrices).to(equal(@"0xe9"));
+ expect(SDLStaticIconNameFullMap).to(equal(@"0x0c"));
+ expect(SDLStaticIconNameGenericPhoneNumber).to(equal(@"0x53"));
+ expect(SDLStaticIconNameGenre).to(equal(@"0x4E"));
+ expect(SDLStaticIconNameGlobalKeyboard).to(equal(@"0xea"));
+ expect(SDLStaticIconNameHighwayExitInformation).to(equal(@"0xf4"));
+ expect(SDLStaticIconNameHomePhoneNumber).to(equal(@"0x55"));
+ expect(SDLStaticIconNameHyperlink).to(equal(@"0x78"));
+ expect(SDLStaticIconNameID3TagUnknown).to(equal(@"0x51"));
+ expect(SDLStaticIconNameIncomingCalls).to(equal(@"0x57"));
+ expect(SDLStaticIconNameInformation).to(equal(@"0x5d"));
+ expect(SDLStaticIconNameIPodMediaSource).to(equal(@"0x0D"));
+ expect(SDLStaticIconNameJoinCalls).to(equal(@"0x02"));
+ expect(SDLStaticIconNameKeepLeft).to(equal(@"0x46"));
+ expect(SDLStaticIconNameKeepRight).to(equal(@"0x48"));
+ expect(SDLStaticIconNameKey).to(equal(@"0x7D"));
+ expect(SDLStaticIconNameLeft).to(equal(@"0x9f"));
+ expect(SDLStaticIconNameLeftArrow).to(equal(@"0x4B"));
+ expect(SDLStaticIconNameLeftExit).to(equal(@"0xaf"));
+ expect(SDLStaticIconNameLineInAudioSource).to(equal(@"0x06"));
+ expect(SDLStaticIconNameLocked).to(equal(@"0x22"));
+ expect(SDLStaticIconNameMediaControlLeftArrow).to(equal(@"0x17"));
+ expect(SDLStaticIconNameMediaControlRecording).to(equal(@"0x20"));
+ expect(SDLStaticIconNameMediaControlRightArrow).to(equal(@"0x15"));
+ expect(SDLStaticIconNameMediaControlStop).to(equal(@"0x16"));
+ expect(SDLStaticIconNameMicrophone).to(equal(@"0xe8"));
+ expect(SDLStaticIconNameMissedCalls).to(equal(@"0x58"));
+ expect(SDLStaticIconNameMobilePhoneNumber).to(equal(@"0x54"));
+ expect(SDLStaticIconNameMoveDown).to(equal(@"0xE5"));
+ expect(SDLStaticIconNameMoveUp).to(equal(@"0xe4"));
+ expect(SDLStaticIconNameMP3TagArtist).to(equal(@"0x24"));
+ expect(SDLStaticIconNameNavigation).to(equal(@"0x8e"));
+ expect(SDLStaticIconNameNavigationCurrentDirection).to(equal(@"0x0a"));
+ expect(SDLStaticIconNameNegativeRatingThumbsDown).to(equal(@"0x14"));
+ expect(SDLStaticIconNameNew).to(equal(@"0x5E"));
+ expect(SDLStaticIconNameOfficePhoneNumber).to(equal(@"0x56"));
+ expect(SDLStaticIconNameOpened).to(equal(@"0x5F"));
+ expect(SDLStaticIconNameOrigin).to(equal(@"0x96"));
+ expect(SDLStaticIconNameOutgoingCalls).to(equal(@"0x59"));
+ expect(SDLStaticIconNamePause).to(equal(@"0xCF"));
+ expect(SDLStaticIconNamePhoneCall1).to(equal(@"0x1D"));
+ expect(SDLStaticIconNamePhoneCall2).to(equal(@"0x1E"));
+ expect(SDLStaticIconNamePhoneDevice).to(equal(@"0x03"));
+ expect(SDLStaticIconNamePhonebook).to(equal(@"0x81"));
+ expect(SDLStaticIconNamePhoto).to(equal(@"0x88"));
+ expect(SDLStaticIconNamePlay).to(equal(@"0xD0"));
+ expect(SDLStaticIconNamePlaylist).to(equal(@"0x4F"));
+ expect(SDLStaticIconNamePopUp).to(equal(@"0x76"));
+ expect(SDLStaticIconNamePositiveRatingThumbsUp).to(equal(@"0x13"));
+ expect(SDLStaticIconNamePower).to(equal(@"0x5b"));
+ expect(SDLStaticIconNamePrimaryPhone).to(equal(@"0x1F"));
+ expect(SDLStaticIconNameRadioButtonChecked).to(equal(@"0x25"));
+ expect(SDLStaticIconNameRadioButtonUnchecked).to(equal(@"0x26"));
+ expect(SDLStaticIconNameRecentCalls).to(equal(@"0xe7"));
+ expect(SDLStaticIconNameRecentDestinations).to(equal(@"0xf2"));
+ expect(SDLStaticIconNameRedo).to(equal(@"0x19"));
+ expect(SDLStaticIconNameRefresh).to(equal(@"0x97"));
+ expect(SDLStaticIconNameRemoteDiagnosticsCheckEngine).to(equal(@"0x7E"));
+ expect(SDLStaticIconNameRendered911Assist).to(equal(@"0xac"));
+ expect(SDLStaticIconNameRepeat).to(equal(@"0xe6"));
+ expect(SDLStaticIconNameRepeatPlay).to(equal(@"0x73"));
+ expect(SDLStaticIconNameReply).to(equal(@"0x04"));
+ expect(SDLStaticIconNameRewind30Secs).to(equal(@"0x07"));
+ expect(SDLStaticIconNameRight).to(equal(@"0xa3"));
+ expect(SDLStaticIconNameRightExit).to(equal(@"0xb1"));
+ expect(SDLStaticIconNameRingtones).to(equal(@"0x5A"));
+ expect(SDLStaticIconNameRoundaboutLeftHand1).to(equal(@"0xee"));
+ expect(SDLStaticIconNameRoundaboutLeftHand2).to(equal(@"0x8c"));
+ expect(SDLStaticIconNameRoundaboutLeftHand3).to(equal(@"0x84"));
+ expect(SDLStaticIconNameRoundaboutLeftHand4).to(equal(@"0x72"));
+ expect(SDLStaticIconNameRoundaboutLeftHand5).to(equal(@"0x6e"));
+ expect(SDLStaticIconNameRoundaboutLeftHand6).to(equal(@"0x64"));
+ expect(SDLStaticIconNameRoundaboutLeftHand7).to(equal(@"0x60"));
+ expect(SDLStaticIconNameRoundaboutRightHand1).to(equal(@"0x62"));
+ expect(SDLStaticIconNameRoundaboutRightHand2).to(equal(@"0x6c"));
+ expect(SDLStaticIconNameRoundaboutRightHand3).to(equal(@"0x70"));
+ expect(SDLStaticIconNameRoundaboutRightHand4).to(equal(@"0x7a"));
+ expect(SDLStaticIconNameRoundaboutRightHand5).to(equal(@"0x8a"));
+ expect(SDLStaticIconNameRoundaboutRightHand6).to(equal(@"0xec"));
+ expect(SDLStaticIconNameRoundaboutRightHand7).to(equal(@"0xf0"));
+ expect(SDLStaticIconNameRSS).to(equal(@"0x89"));
+ expect(SDLStaticIconNameSettings).to(equal(@"0x49"));
+ expect(SDLStaticIconNameSharpLeft).to(equal(@"0xa5"));
+ expect(SDLStaticIconNameSharpRight).to(equal(@"0xa7"));
+ expect(SDLStaticIconNameShow).to(equal(@"0xe1"));
+ expect(SDLStaticIconNameShufflePlay).to(equal(@"0x74"));
+ expect(SDLStaticIconNameSkiPlaces).to(equal(@"0xab"));
+ expect(SDLStaticIconNameSlightLeft).to(equal(@"0x9d"));
+ expect(SDLStaticIconNameSlightRight).to(equal(@"0xa1"));
+ expect(SDLStaticIconNameSmartphone).to(equal(@"0x05"));
+ expect(SDLStaticIconNameSortList).to(equal(@"0x7B"));
+ expect(SDLStaticIconNameSpeedDialNumbersNumber0).to(equal(@"0xE0"));
+ expect(SDLStaticIconNameSpeedDialNumbersNumber1).to(equal(@"0xD7"));
+ expect(SDLStaticIconNameSpeedDialNumbersNumber2).to(equal(@"0xD8"));
+ expect(SDLStaticIconNameSpeedDialNumbersNumber3).to(equal(@"0xD9"));
+ expect(SDLStaticIconNameSpeedDialNumbersNumber4).to(equal(@"0xDA"));
+ expect(SDLStaticIconNameSpeedDialNumbersNumber5).to(equal(@"0xDB"));
+ expect(SDLStaticIconNameSpeedDialNumbersNumber6).to(equal(@"0xDC"));
+ expect(SDLStaticIconNameSpeedDialNumbersNumber7).to(equal(@"0xDD"));
+ expect(SDLStaticIconNameSpeedDialNumbersNumber8).to(equal(@"0xDE"));
+ expect(SDLStaticIconNameSpeedDialNumbersNumber9).to(equal(@"0xDF"));
+ expect(SDLStaticIconNameSuccess).to(equal(@"0xD5"));
+ expect(SDLStaticIconNameTrackTitle).to(equal(@"0x4C"));
+ expect(SDLStaticIconNameTrafficReport).to(equal(@"0x2A"));
+ expect(SDLStaticIconNameTurnList).to(equal(@"0x10"));
+ expect(SDLStaticIconNameUTurnLeftTraffic).to(equal(@"0xad"));
+ expect(SDLStaticIconNameUTurnRightTraffic).to(equal(@"0xa9"));
+ expect(SDLStaticIconNameUndo).to(equal(@"0x18"));
+ expect(SDLStaticIconNameUnlocked).to(equal(@"0x23"));
+ expect(SDLStaticIconNameUSBMediaAudioSource).to(equal(@"0x0B"));
+ expect(SDLStaticIconNameVoiceControlScrollbarListItemNo1).to(equal(@"0xC7"));
+ expect(SDLStaticIconNameVoiceControlScrollbarListItemNo2).to(equal(@"0xC8"));
+ expect(SDLStaticIconNameVoiceControlScrollbarListItemNo3).to(equal(@"0xC9"));
+ expect(SDLStaticIconNameVoiceControlScrollbarListItemNo4).to(equal(@"0xCA"));
+ expect(SDLStaticIconNameVoiceRecognitionFailed).to(equal(@"0x90"));
+ expect(SDLStaticIconNameVoiceRecognitionPause).to(equal(@"0x92"));
+ expect(SDLStaticIconNameVoiceRecognitionSuccessful).to(equal(@"0x8F"));
+ expect(SDLStaticIconNameVoiceRecognitionSystemActive).to(equal(@"0x11"));
+ expect(SDLStaticIconNameVoiceRecognitionSystemListening).to(equal(@"0x91"));
+ expect(SDLStaticIconNameVoiceRecognitionTryAgain).to(equal(@"0x93"));
+ expect(SDLStaticIconNameWarning).to(equal(@"0xfe"));
+ expect(SDLStaticIconNameWeather).to(equal(@"0xeb"));
+ expect(SDLStaticIconNameWifiFull).to(equal(@"0x43"));
+ expect(SDLStaticIconNameZoomIn).to(equal(@"0x98"));
+ expect(SDLStaticIconNameZoomOut).to(equal(@"0x9a"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSupportedSeatSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSupportedSeatSpec.m
new file mode 100644
index 000000000..d01bda43f
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSupportedSeatSpec.m
@@ -0,0 +1,22 @@
+//
+// SDLSupportedSeatSpec.m
+// SmartDeviceLinkTests
+//
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLSupportedSeat.h"
+
+QuickSpecBegin(SDLSupportedSeatSpec)
+
+describe(@"Individual Enum Value Tests", ^ {
+ it(@"Should match internal values", ^ {
+ expect(SDLSupportedSeatDriver).to(equal(@"DRIVER"));
+ expect(SDLSupportedSeatFrontPassenger).to(equal(@"FRONT_PASSENGER"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLTurnSignalSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLTurnSignalSpec.m
new file mode 100644
index 000000000..6be1c9439
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLTurnSignalSpec.m
@@ -0,0 +1,27 @@
+//
+// SDLTurnSignalSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Nicole on 7/19/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLTurnSignal.h"
+
+QuickSpecBegin(SDLTurnSignalSpec)
+
+describe(@"Individual Enum Value Tests", ^ {
+ it(@"Should match internal values", ^ {
+ expect(SDLTurnSignalOff).to(equal(@"OFF"));
+ expect(SDLTurnSignalLeft).to(equal(@"LEFT"));
+ expect(SDLTurnSignalRight).to(equal(@"RIGHT"));
+ expect(SDLTurnSignalBoth).to(equal(@"BOTH"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m
index ee79864fa..2d9812475 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m
@@ -42,6 +42,8 @@ describe(@"Individual Enum Value Tests", ^ {
expect(SDLVehicleDataTypeEngineTorque).to(equal(@"VEHICLEDATA_ENGINETORQUE"));
expect(SDLVehicleDataTypeAccelerationPedal).to(equal(@"VEHICLEDATA_ACCPEDAL"));
expect(SDLVehicleDataTypeSteeringWheel).to(equal(@"VEHICLEDATA_STEERINGWHEEL"));
+ expect(SDLVehicleDataTypeElectronicParkBrakeStatus).to(equal(@"VEHICLEDATA_ELECTRONICPARKBRAKESTATUS"));
+ expect(SDLVehicleDataTypeTurnSignal).to(equal(@"VEHICLEDATA_TURNSIGNAL"));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVideoStreamingStateSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVideoStreamingStateSpec.m
new file mode 100644
index 000000000..9bb2b6900
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVideoStreamingStateSpec.m
@@ -0,0 +1,15 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLVideoStreamingState.h"
+
+QuickSpecBegin(SDLVideoStreamingStateSpec)
+
+describe(@"Individual Enum Value Tests", ^ {
+ it(@"Should match internal values", ^ {
+ expect(SDLVideoStreamingStateStreamable).to(equal(@"STREAMABLE"));
+ expect(SDLVideoStreamingStateNotStreamable).to(equal(@"NOT_STREAMABLE"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnHMIStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnHMIStatusSpec.m
index 5f442276e..649e7aa74 100644
--- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnHMIStatusSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnHMIStatusSpec.m
@@ -24,24 +24,28 @@ describe(@"Getter/Setter Tests", ^ {
testNotification.hmiLevel = SDLHMILevelLimited;
testNotification.audioStreamingState = SDLAudioStreamingStateAttenuated;
testNotification.systemContext = SDLSystemContextHMIObscured;
+ testNotification.videoStreamingState = SDLVideoStreamingStateStreamable;
expect(testNotification.hmiLevel).to(equal(SDLHMILevelLimited));
expect(testNotification.audioStreamingState).to(equal(SDLAudioStreamingStateAttenuated));
expect(testNotification.systemContext).to(equal(SDLSystemContextHMIObscured));
+ expect(testNotification.videoStreamingState).to(equal(SDLVideoStreamingStateStreamable));
});
it(@"Should get correctly when initialized", ^ {
NSMutableDictionary* dict = [@{SDLNameNotification:
@{SDLNameParameters:
- @{SDLNameHMILevel:SDLHMILevelLimited,
- SDLNameAudioStreamingState:SDLAudioStreamingStateAttenuated,
- SDLNameSystemContext:SDLSystemContextHMIObscured},
+ @{SDLNameHMILevel: SDLHMILevelLimited,
+ SDLNameAudioStreamingState: SDLAudioStreamingStateAttenuated,
+ SDLNameSystemContext: SDLSystemContextHMIObscured,
+ SDLNameVideoStreamingState: SDLVideoStreamingStateStreamable},
SDLNameOperationName:SDLNameOnHMIStatus}} mutableCopy];
SDLOnHMIStatus* testNotification = [[SDLOnHMIStatus alloc] initWithDictionary:dict];
expect(testNotification.hmiLevel).to(equal(SDLHMILevelLimited));
expect(testNotification.audioStreamingState).to(equal(SDLAudioStreamingStateAttenuated));
expect(testNotification.systemContext).to(equal(SDLSystemContextHMIObscured));
+ expect(testNotification.videoStreamingState).to(equal(SDLVideoStreamingStateStreamable));
});
it(@"Should return nil if not set", ^ {
@@ -50,6 +54,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testNotification.hmiLevel).to(beNil());
expect(testNotification.audioStreamingState).to(beNil());
expect(testNotification.systemContext).to(beNil());
+ expect(testNotification.videoStreamingState).to(beNil());
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnRCStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnRCStatusSpec.m
new file mode 100644
index 000000000..4f733d7a8
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnRCStatusSpec.m
@@ -0,0 +1,54 @@
+// SDLOnRCStatusSpec.m
+//
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLOnRCStatus.h"
+#import "SDLModuleData.h"
+#import "SDLNames.h"
+
+QuickSpecBegin(SDLOnRCStatusSpec)
+SDLModuleData * allocatedModule = [[SDLModuleData alloc] init];
+SDLModuleData * freeModule = [[SDLModuleData alloc] init];
+
+describe(@"Getter/Setter Tests", ^ {
+ it(@"Should set and get correctly", ^ {
+ SDLOnRCStatus* testNotification = [[SDLOnRCStatus alloc] init];
+ testNotification.allowed = @YES;
+ testNotification.allocatedModules = [@[allocatedModule] copy];
+ testNotification.freeModules = [@[freeModule] copy];
+
+ expect(testNotification.allowed).to(equal(@YES));
+ expect(testNotification.allocatedModules).to(equal([@[allocatedModule] copy]));
+ expect(testNotification.freeModules).to(equal([@[freeModule] copy]));
+
+ });
+
+ it(@"Should get correctly when initialized", ^ {
+ NSMutableDictionary<NSString *, id> *dict = [@{SDLNameNotification:
+ @{SDLNameParameters:
+ @{SDLNameAllocatedModules:[@[allocatedModule] copy],
+ SDLNameFreeModules:[@[freeModule] copy],
+ SDLNameAllowed:@YES
+ },
+ SDLNameOperationName:SDLNameOnRCStatus}} mutableCopy];
+ SDLOnRCStatus* testNotification = [[SDLOnRCStatus alloc] initWithDictionary:dict];
+
+ expect(testNotification.allowed).to(equal(@YES));
+ expect(testNotification.allocatedModules).to(equal([@[allocatedModule] copy]));
+ expect(testNotification.freeModules).to(equal([@[freeModule] copy]));
+ });
+
+ it(@"Should return nil if not set", ^ {
+ SDLOnRCStatus* testNotification = [[SDLOnRCStatus alloc] init];
+
+ expect(testNotification.allowed).to(beNil());
+ expect(testNotification.allocatedModules).to(beNil());
+ expect(testNotification.freeModules).to(beNil());
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m
index bb7a040f2..aba995df9 100644
--- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m
@@ -39,6 +39,7 @@ describe(@"Getter/Setter Tests", ^ {
testNotification.deviceStatus = device;
testNotification.driverBraking = SDLVehicleDataEventStatusYes;
testNotification.eCallInfo = eCall;
+ testNotification.electronicParkBrakeStatus = SDLElectronicParkBrakeStatusDriveActive;
testNotification.emergencyEvent = event;
testNotification.engineOilLife = @34.45;
testNotification.engineTorque = @-200.124;
@@ -56,6 +57,7 @@ describe(@"Getter/Setter Tests", ^ {
testNotification.speed = @70.1;
testNotification.steeringWheelAngle = @0.000000001;
testNotification.tirePressure = tires;
+ testNotification.turnSignal = SDLTurnSignalRight;
testNotification.vin = @"222222222722";
testNotification.wiperStatus = SDLWiperStatusStalled;
@@ -67,6 +69,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testNotification.deviceStatus).to(equal(device));
expect(testNotification.driverBraking).to(equal(SDLVehicleDataEventStatusYes));
expect(testNotification.eCallInfo).to(equal(eCall));
+ expect(testNotification.electronicParkBrakeStatus).to(equal(SDLElectronicParkBrakeStatusDriveActive));
expect(testNotification.emergencyEvent).to(equal(event));
expect(testNotification.engineOilLife).to(equal(@34.45));
expect(testNotification.engineTorque).to(equal(@-200.124));
@@ -84,41 +87,44 @@ describe(@"Getter/Setter Tests", ^ {
expect(testNotification.speed).to(equal(@70.1));
expect(testNotification.steeringWheelAngle).to(equal(@0.000000001));
expect(testNotification.tirePressure).to(equal(tires));
+ expect(testNotification.turnSignal).to(equal(SDLTurnSignalRight));
expect(testNotification.vin).to(equal(@"222222222722"));
expect(testNotification.wiperStatus).to(equal(SDLWiperStatusStalled));
});
it(@"Should get correctly when initialized", ^ {
NSDictionary* dict = @{SDLNameNotification:
- @{SDLNameParameters:
- @{SDLNameAccelerationPedalPosition:@99.99999999,
- SDLNameAirbagStatus:airbag,
- SDLNameBeltStatus:belt,
- SDLNameBodyInformation:body,
- SDLNameClusterModeStatus:clusterMode,
- SDLNameDeviceStatus:device,
- SDLNameDriverBraking:SDLVehicleDataEventStatusYes,
- SDLNameECallInfo:eCall,
- SDLNameEmergencyEvent:event,
- SDLNameEngineOilLife:@45.1,
- SDLNameEngineTorque:@-200.124,
- SDLNameExternalTemperature:@-10,
- SDLNameFuelLevel:@10.3,
- SDLNameFuelLevelState:SDLComponentVolumeStatusAlert,
- SDLNameFuelRange:@[fuelRange],
- SDLNameGPS:gps,
- SDLNameHeadLampStatus:headLamp,
- SDLNameInstantFuelConsumption:@4000.63,
- SDLNameMyKey:myKey,
- SDLNameOdometer:@100050,
- SDLNamePRNDL:SDLPRNDLDrive,
- SDLNameRPM:@4242,
- SDLNameSpeed:@70.1,
- SDLNameSteeringWheelAngle:@0.000000001,
- SDLNameTirePressure:tires,
- SDLNameVIN:@"222222222722",
- SDLNameWiperStatus:SDLWiperStatusStalled},
- SDLNameOperationName:SDLNameOnVehicleData}};
+ @{SDLNameParameters:
+ @{SDLNameAccelerationPedalPosition:@99.99999999,
+ SDLNameAirbagStatus:airbag,
+ SDLNameBeltStatus:belt,
+ SDLNameBodyInformation:body,
+ SDLNameClusterModeStatus:clusterMode,
+ SDLNameDeviceStatus:device,
+ SDLNameDriverBraking:SDLVehicleDataEventStatusYes,
+ SDLNameECallInfo:eCall,
+ SDLNameElectronicParkBrakeStatus:SDLElectronicParkBrakeStatusDriveActive,
+ SDLNameEmergencyEvent:event,
+ SDLNameEngineOilLife:@45.1,
+ SDLNameEngineTorque:@-200.124,
+ SDLNameExternalTemperature:@-10,
+ SDLNameFuelLevel:@10.3,
+ SDLNameFuelLevelState:SDLComponentVolumeStatusAlert,
+ SDLNameFuelRange:@[fuelRange],
+ SDLNameGPS:gps,
+ SDLNameHeadLampStatus:headLamp,
+ SDLNameInstantFuelConsumption:@4000.63,
+ SDLNameMyKey:myKey,
+ SDLNameOdometer:@100050,
+ SDLNamePRNDL:SDLPRNDLDrive,
+ SDLNameRPM:@4242,
+ SDLNameSpeed:@70.1,
+ SDLNameSteeringWheelAngle:@0.000000001,
+ SDLNameTirePressure:tires,
+ SDLNameTurnSignal:SDLTurnSignalOff,
+ SDLNameVIN:@"222222222722",
+ SDLNameWiperStatus:SDLWiperStatusStalled},
+ SDLNameOperationName:SDLNameOnVehicleData}};
SDLOnVehicleData* testNotification = [[SDLOnVehicleData alloc] initWithDictionary:dict];
expect(testNotification.accPedalPosition).to(equal(@99.99999999));
@@ -129,6 +135,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testNotification.deviceStatus).to(equal(device));
expect(testNotification.driverBraking).to(equal(SDLVehicleDataEventStatusYes));
expect(testNotification.eCallInfo).to(equal(eCall));
+ expect(testNotification.electronicParkBrakeStatus).to(equal(SDLElectronicParkBrakeStatusDriveActive));
expect(testNotification.emergencyEvent).to(equal(event));
expect(testNotification.engineOilLife).to(equal(@45.1));
expect(testNotification.engineTorque).to(equal(@-200.124));
@@ -146,6 +153,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testNotification.speed).to(equal(@70.1));
expect(testNotification.steeringWheelAngle).to(equal(@0.000000001));
expect(testNotification.tirePressure).to(equal(tires));
+ expect(testNotification.turnSignal).to(equal(SDLTurnSignalOff));
expect(testNotification.vin).to(equal(@"222222222722"));
expect(testNotification.wiperStatus).to(equal(SDLWiperStatusStalled));
});
@@ -161,6 +169,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testNotification.deviceStatus).to(beNil());
expect(testNotification.driverBraking).to(beNil());
expect(testNotification.eCallInfo).to(beNil());
+ expect(testNotification.electronicParkBrakeStatus).to(beNil());
expect(testNotification.emergencyEvent).to(beNil());
expect(testNotification.engineOilLife).to(beNil());
expect(testNotification.engineTorque).to(beNil());
@@ -178,6 +187,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testNotification.speed).to(beNil());
expect(testNotification.steeringWheelAngle).to(beNil());
expect(testNotification.tirePressure).to(beNil());
+ expect(testNotification.turnSignal).to(beNil());
expect(testNotification.vin).to(beNil());
expect(testNotification.wiperStatus).to(beNil());
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m
index 8dd5742cb..f082671b5 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m
@@ -9,21 +9,60 @@
#import <Nimble/Nimble.h>
#import "SDLAddSubMenu.h"
+#import "SDLImage.h"
#import "SDLNames.h"
QuickSpecBegin(SDLAddSubMenuSpec)
describe(@"Getter/Setter Tests", ^ {
+ __block UInt32 menuId = 4345645;
+ __block UInt8 position = 27;
+ __block NSString *menuName = @"Welcome to the menu";
+ __block SDLImage *image = nil;
+
+ beforeEach(^{
+ image = [[SDLImage alloc] initWithName:@"Test"];
+ });
+
+ it(@"should correctly initialize with initWithId:menuName:", ^{
+ SDLAddSubMenu *testRequest = [[SDLAddSubMenu alloc] initWithId:menuId menuName:menuName];
+
+ expect(testRequest.menuID).to(equal(@(menuId)));
+ expect(testRequest.position).to(beNil());
+ expect(testRequest.menuName).to(equal(menuName));
+ expect(testRequest.menuIcon).to(beNil());
+ });
+
+ it(@"should correctly initialize with initWithId:menuName:position:", ^{
+ SDLAddSubMenu *testRequest = [[SDLAddSubMenu alloc] initWithId:menuId menuName:menuName position:position];
+
+ expect(testRequest.menuID).to(equal(@(menuId)));
+ expect(testRequest.position).to(equal(@(position)));
+ expect(testRequest.menuName).to(equal(menuName));
+ expect(testRequest.menuIcon).to(beNil());
+ });
+
+ it(@"should correctly initialize with initWithId:menuName:menuIcon:position:", ^{
+ SDLAddSubMenu *testRequest = [[SDLAddSubMenu alloc] initWithId:menuId menuName:menuName menuIcon:image position:position];
+
+ expect(testRequest.menuID).to(equal(@(menuId)));
+ expect(testRequest.position).to(equal(@(position)));
+ expect(testRequest.menuName).to(equal(menuName));
+ expect(testRequest.menuIcon).to(equal(image));
+ });
+
it(@"Should set and get correctly", ^ {
SDLAddSubMenu* testRequest = [[SDLAddSubMenu alloc] init];
testRequest.menuID = @4345645;
testRequest.position = @27;
testRequest.menuName = @"Welcome to the menu";
+ testRequest.menuIcon = image;
- expect(testRequest.menuID).to(equal(@4345645));
- expect(testRequest.position).to(equal(@27));
- expect(testRequest.menuName).to(equal(@"Welcome to the menu"));
+ expect(testRequest.menuID).to(equal(@(menuId)));
+ expect(testRequest.position).to(equal(@(position)));
+ expect(testRequest.menuName).to(equal(menuName));
+ expect(testRequest.menuIcon).to(equal(image));
});
it(@"Should get correctly when initialized", ^ {
@@ -31,13 +70,18 @@ describe(@"Getter/Setter Tests", ^ {
@{SDLNameParameters:
@{SDLNameMenuId:@4345645,
SDLNamePosition:@27,
- SDLNameMenuName:@"Welcome to the menu"},
+ SDLNameMenuName:@"Welcome to the menu",
+ SDLNameMenuIcon: @{
+ SDLNameValue: @"Test"
+ }
+ },
SDLNameOperationName:SDLNameAddSubMenu}} mutableCopy];
SDLAddSubMenu* testRequest = [[SDLAddSubMenu alloc] initWithDictionary:dict];
- expect(testRequest.menuID).to(equal(@4345645));
- expect(testRequest.position).to(equal(@27));
- expect(testRequest.menuName).to(equal(@"Welcome to the menu"));
+ expect(testRequest.menuID).to(equal(@(menuId)));
+ expect(testRequest.position).to(equal(@(position)));
+ expect(testRequest.menuName).to(equal(menuName));
+ expect(testRequest.menuIcon.value).to(equal(@"Test"));
});
it(@"Should return nil if not set", ^ {
@@ -46,6 +90,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.menuID).to(beNil());
expect(testRequest.position).to(beNil());
expect(testRequest.menuName).to(beNil());
+ expect(testRequest.menuIcon).to(beNil());
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m
index c1df0f946..d5575fe7b 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m
@@ -25,6 +25,7 @@ describe(@"Getter/Setter Tests", ^ {
testRequest.deviceStatus = @NO;
testRequest.driverBraking = @YES;
testRequest.eCallInfo = @YES;
+ testRequest.electronicParkBrakeStatus = @YES;
testRequest.emergencyEvent = @YES;
testRequest.engineOilLife = @YES;
testRequest.engineTorque = @NO;
@@ -42,6 +43,7 @@ describe(@"Getter/Setter Tests", ^ {
testRequest.speed = @NO;
testRequest.steeringWheelAngle = @NO;
testRequest.tirePressure = @NO;
+ testRequest.turnSignal = @YES;
testRequest.wiperStatus = @NO;
expect(testRequest.accPedalPosition).to(equal(@YES));
@@ -52,6 +54,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.deviceStatus).to(equal(@NO));
expect(testRequest.driverBraking).to(equal(@YES));
expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@YES));
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@NO));
@@ -69,6 +72,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.speed).to(equal(@NO));
expect(testRequest.steeringWheelAngle).to(equal(@NO));
expect(testRequest.tirePressure).to(equal(@NO));
+ expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@NO));
});
@@ -83,6 +87,7 @@ describe(@"Getter/Setter Tests", ^ {
SDLNameDeviceStatus:@YES,
SDLNameDriverBraking:@YES,
SDLNameECallInfo:@YES,
+ SDLNameElectronicParkBrakeStatus:@YES,
SDLNameEmergencyEvent:@NO,
SDLNameEngineOilLife:@YES,
SDLNameEngineTorque:@YES,
@@ -100,6 +105,7 @@ describe(@"Getter/Setter Tests", ^ {
SDLNameSpeed:@YES,
SDLNameSteeringWheelAngle:@NO,
SDLNameTirePressure:@YES,
+ SDLNameTurnSignal:@NO,
SDLNameWiperStatus:@YES},
SDLNameOperationName:SDLNameGetVehicleData}};
SDLGetVehicleData* testRequest = [[SDLGetVehicleData alloc] initWithDictionary:dict];
@@ -112,6 +118,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.deviceStatus).to(equal(@YES));
expect(testRequest.driverBraking).to(equal(@YES));
expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@YES));
expect(testRequest.emergencyEvent).to(equal(@NO));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
@@ -129,6 +136,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@NO));
expect(testRequest.tirePressure).to(equal(@YES));
+ expect(testRequest.turnSignal).to(equal(@NO));
expect(testRequest.wiperStatus).to(equal(@YES));
});
});
@@ -145,6 +153,7 @@ describe(@"initializers", ^{
expect(testRequest.deviceStatus).to(beNil());
expect(testRequest.driverBraking).to(beNil());
expect(testRequest.eCallInfo).to(beNil());
+ expect(testRequest.electronicParkBrakeStatus).to(beNil());
expect(testRequest.emergencyEvent).to(beNil());
expect(testRequest.engineOilLife).to(beNil());
expect(testRequest.engineTorque).to(beNil());
@@ -162,6 +171,7 @@ describe(@"initializers", ^{
expect(testRequest.speed).to(beNil());
expect(testRequest.steeringWheelAngle).to(beNil());
expect(testRequest.tirePressure).to(beNil());
+ expect(testRequest.turnSignal).to(beNil());
expect(testRequest.wiperStatus).to(beNil());
});
@@ -176,6 +186,7 @@ describe(@"initializers", ^{
expect(testRequest.deviceStatus).to(equal(@YES));
expect(testRequest.driverBraking).to(equal(@YES));
expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@NO));
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@NO));
expect(testRequest.engineTorque).to(equal(@YES));
@@ -193,11 +204,12 @@ describe(@"initializers", ^{
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
expect(testRequest.tirePressure).to(equal(@YES));
+ expect(testRequest.turnSignal).to(equal(@NO));
expect(testRequest.wiperStatus).to(equal(@YES));
});
context(@"initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:", ^{
- SDLGetVehicleData *testRequest = [[SDLGetVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation:YES clusterModeStatus:YES deviceStatus:YES driverBraking:YES eCallInfo:YES emergencyEvent:YES engineOilLife:YES engineTorque:YES externalTemperature:YES fuelLevel:YES fuelLevelState:YES fuelRange:YES gps:YES headLampStatus:YES instantFuelConsumption:YES myKey:YES odometer:YES prndl:YES rpm:YES speed:YES steeringWheelAngle:YES tirePressure:YES vin:YES wiperStatus:YES];
+ SDLGetVehicleData *testRequest = [[SDLGetVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation:YES clusterModeStatus:YES deviceStatus:YES driverBraking:YES eCallInfo:YES electronicParkBrakeStatus:YES emergencyEvent:YES engineOilLife:YES engineTorque:YES externalTemperature:YES fuelLevel:YES fuelLevelState:YES fuelRange:YES gps:YES headLampStatus:YES instantFuelConsumption:YES myKey:YES odometer:YES prndl:YES rpm:YES speed:YES steeringWheelAngle:YES tirePressure:YES turnSignal:YES vin:YES wiperStatus:YES];
expect(testRequest.accPedalPosition).to(equal(@YES));
expect(testRequest.airbagStatus).to(equal(@YES));
@@ -207,6 +219,7 @@ describe(@"initializers", ^{
expect(testRequest.deviceStatus).to(equal(@YES));
expect(testRequest.driverBraking).to(equal(@YES));
expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@YES));
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
@@ -224,6 +237,7 @@ describe(@"initializers", ^{
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
expect(testRequest.tirePressure).to(equal(@YES));
+ expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m
index 79575e019..3ec8a0adb 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m
@@ -25,6 +25,7 @@ describe(@"Getter/Setter Tests", ^ {
testRequest.deviceStatus = @NO;
testRequest.driverBraking = @YES;
testRequest.eCallInfo = @YES;
+ testRequest.electronicParkBrakeStatus = @YES;
testRequest.emergencyEvent = @YES;
testRequest.engineOilLife = @YES;
testRequest.engineTorque = @NO;
@@ -42,6 +43,7 @@ describe(@"Getter/Setter Tests", ^ {
testRequest.speed = @NO;
testRequest.steeringWheelAngle = @NO;
testRequest.tirePressure = @NO;
+ testRequest.turnSignal = @YES;
testRequest.wiperStatus = @NO;
expect(testRequest.accPedalPosition).to(equal(@YES));
@@ -52,6 +54,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.deviceStatus).to(equal(@NO));
expect(testRequest.driverBraking).to(equal(@YES));
expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@YES));
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@NO));
@@ -69,39 +72,42 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.speed).to(equal(@NO));
expect(testRequest.steeringWheelAngle).to(equal(@NO));
expect(testRequest.tirePressure).to(equal(@NO));
+ expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@NO));
});
it(@"Should get correctly when initialized", ^ {
NSDictionary<NSString *, id> *dict = @{SDLNameRequest:
- @{SDLNameParameters:
- @{SDLNameAccelerationPedalPosition:@YES,
- SDLNameAirbagStatus:@YES,
- SDLNameBeltStatus:@YES,
- SDLNameBodyInformation:@YES,
- SDLNameClusterModeStatus:@YES,
- SDLNameDeviceStatus:@YES,
- SDLNameDriverBraking:@YES,
- SDLNameECallInfo:@YES,
- SDLNameEmergencyEvent:@NO,
- SDLNameEngineOilLife:@YES,
- SDLNameEngineTorque:@YES,
- SDLNameExternalTemperature:@NO,
- SDLNameFuelLevel:@YES,
- SDLNameFuelLevelState:@YES,
- SDLNameFuelRange:@YES,
- SDLNameGPS:@YES,
- SDLNameHeadLampStatus:@YES,
- SDLNameInstantFuelConsumption:@YES,
- SDLNameMyKey:@YES,
- SDLNameOdometer:@YES,
- SDLNamePRNDL:@YES,
- SDLNameRPM:@YES,
- SDLNameSpeed:@YES,
- SDLNameSteeringWheelAngle:@NO,
- SDLNameTirePressure:@YES,
- SDLNameWiperStatus:@NO},
- SDLNameOperationName:SDLNameSubscribeVehicleData}};
+ @{SDLNameParameters:
+ @{SDLNameAccelerationPedalPosition:@YES,
+ SDLNameAirbagStatus:@YES,
+ SDLNameBeltStatus:@YES,
+ SDLNameBodyInformation:@YES,
+ SDLNameClusterModeStatus:@YES,
+ SDLNameDeviceStatus:@YES,
+ SDLNameDriverBraking:@YES,
+ SDLNameECallInfo:@YES,
+ SDLNameElectronicParkBrakeStatus: @YES,
+ SDLNameEmergencyEvent:@NO,
+ SDLNameEngineOilLife:@YES,
+ SDLNameEngineTorque:@YES,
+ SDLNameExternalTemperature:@NO,
+ SDLNameFuelLevel:@YES,
+ SDLNameFuelLevelState:@YES,
+ SDLNameFuelRange:@YES,
+ SDLNameGPS:@YES,
+ SDLNameHeadLampStatus:@YES,
+ SDLNameInstantFuelConsumption:@YES,
+ SDLNameMyKey:@YES,
+ SDLNameOdometer:@YES,
+ SDLNamePRNDL:@YES,
+ SDLNameRPM:@YES,
+ SDLNameSpeed:@YES,
+ SDLNameSteeringWheelAngle:@NO,
+ SDLNameTirePressure:@YES,
+ SDLNameTurnSignal:@NO,
+ SDLNameWiperStatus:@NO},
+ SDLNameOperationName:SDLNameSubscribeVehicleData}};
SDLSubscribeVehicleData* testRequest = [[SDLSubscribeVehicleData alloc] initWithDictionary:dict];
expect(testRequest.accPedalPosition).to(equal(@YES));
@@ -112,6 +118,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.deviceStatus).to(equal(@YES));
expect(testRequest.driverBraking).to(equal(@YES));
expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@YES));
expect(testRequest.emergencyEvent).to(equal(@NO));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
@@ -129,6 +136,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@NO));
expect(testRequest.tirePressure).to(equal(@YES));
+ expect(testRequest.turnSignal).to(equal(@NO));
expect(testRequest.wiperStatus).to(equal(@NO));
});
});
@@ -145,6 +153,7 @@ describe(@"initializers", ^{
expect(testRequest.deviceStatus).to(beNil());
expect(testRequest.driverBraking).to(beNil());
expect(testRequest.eCallInfo).to(beNil());
+ expect(testRequest.electronicParkBrakeStatus).to(beNil());
expect(testRequest.emergencyEvent).to(beNil());
expect(testRequest.engineOilLife).to(beNil());
expect(testRequest.engineTorque).to(beNil());
@@ -162,11 +171,12 @@ describe(@"initializers", ^{
expect(testRequest.speed).to(beNil());
expect(testRequest.steeringWheelAngle).to(beNil());
expect(testRequest.tirePressure).to(beNil());
+ expect(testRequest.turnSignal).to(beNil());
expect(testRequest.wiperStatus).to(beNil());
});
context(@"initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:", ^{
- SDLSubscribeVehicleData* testRequest = [[SDLSubscribeVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation:YES clusterModeStatus:YES deviceStatus:YES driverBraking:YES eCallInfo:YES emergencyEvent:YES engineOilLife:YES engineTorque:YES externalTemperature:YES fuelLevel:YES fuelLevelState:YES fuelRange:YES gps:YES headLampStatus:YES instantFuelConsumption:YES myKey:YES odometer:YES prndl:YES rpm:YES speed:YES steeringWheelAngle:YES tirePressure:YES wiperStatus:YES];
+ SDLSubscribeVehicleData* testRequest = [[SDLSubscribeVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation:YES clusterModeStatus:YES deviceStatus:YES driverBraking:YES eCallInfo:YES electronicParkBrakeStatus:YES emergencyEvent:YES engineOilLife:YES engineTorque:YES externalTemperature:YES fuelLevel:YES fuelLevelState:YES fuelRange:YES gps:YES headLampStatus:YES instantFuelConsumption:YES myKey:YES odometer:YES prndl:YES rpm:YES speed:YES steeringWheelAngle:YES tirePressure:YES turnSignal:YES wiperStatus:YES];
expect(testRequest.accPedalPosition).to(equal(@YES));
expect(testRequest.airbagStatus).to(equal(@YES));
@@ -176,6 +186,7 @@ describe(@"initializers", ^{
expect(testRequest.deviceStatus).to(equal(@YES));
expect(testRequest.driverBraking).to(equal(@YES));
expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@YES));
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
@@ -193,6 +204,7 @@ describe(@"initializers", ^{
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
expect(testRequest.tirePressure).to(equal(@YES));
+ expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
});
@@ -207,6 +219,7 @@ describe(@"initializers", ^{
expect(testRequest.deviceStatus).to(equal(@YES));
expect(testRequest.driverBraking).to(equal(@YES));
expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@NO));
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@NO));
expect(testRequest.engineTorque).to(equal(@YES));
@@ -224,6 +237,7 @@ describe(@"initializers", ^{
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
expect(testRequest.tirePressure).to(equal(@YES));
+ expect(testRequest.turnSignal).to(equal(@NO));
expect(testRequest.wiperStatus).to(equal(@YES));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m
index f2131d8e7..d571d743e 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m
@@ -25,6 +25,7 @@ describe(@"Getter/Setter Tests", ^ {
testRequest.deviceStatus = @YES;
testRequest.driverBraking = @YES;
testRequest.eCallInfo = @YES;
+ testRequest.electronicParkBrakeStatus = @YES;
testRequest.emergencyEvent = @YES;
testRequest.engineOilLife = @YES;
testRequest.engineTorque = @YES;
@@ -42,6 +43,7 @@ describe(@"Getter/Setter Tests", ^ {
testRequest.speed = @YES;
testRequest.steeringWheelAngle = @YES;
testRequest.tirePressure = @YES;
+ testRequest.turnSignal = @NO;
testRequest.wiperStatus = @YES;
expect(testRequest.accPedalPosition).to(equal(@YES));
@@ -52,6 +54,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.deviceStatus).to(equal(@YES));
expect(testRequest.driverBraking).to(equal(@YES));
expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@YES));
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
@@ -69,39 +72,42 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
expect(testRequest.tirePressure).to(equal(@YES));
+ expect(testRequest.turnSignal).to(equal(@NO));
expect(testRequest.wiperStatus).to(equal(@YES));
});
it(@"Should get correctly when initialized", ^ {
NSDictionary<NSString *, id> *dict = @{SDLNameRequest:
- @{SDLNameParameters:
- @{SDLNameAccelerationPedalPosition:@YES,
- SDLNameAirbagStatus:@YES,
- SDLNameBeltStatus:@YES,
- SDLNameBodyInformation:@YES,
- SDLNameClusterModeStatus:@YES,
- SDLNameDeviceStatus:@YES,
- SDLNameDriverBraking:@YES,
- SDLNameECallInfo:@YES,
- SDLNameEmergencyEvent:@YES,
- SDLNameEngineOilLife:@YES,
- SDLNameEngineTorque:@YES,
- SDLNameExternalTemperature:@YES,
- SDLNameFuelLevel:@YES,
- SDLNameFuelLevelState:@YES,
- SDLNameFuelRange:@YES,
- SDLNameGPS:@YES,
- SDLNameHeadLampStatus:@YES,
- SDLNameInstantFuelConsumption:@YES,
- SDLNameMyKey:@YES,
- SDLNameOdometer:@YES,
- SDLNamePRNDL:@YES,
- SDLNameRPM:@YES,
- SDLNameSpeed:@YES,
- SDLNameSteeringWheelAngle:@YES,
- SDLNameTirePressure:@YES,
- SDLNameWiperStatus:@YES},
- SDLNameOperationName:SDLNameUnsubscribeVehicleData}};
+ @{SDLNameParameters:
+ @{SDLNameAccelerationPedalPosition:@YES,
+ SDLNameAirbagStatus:@YES,
+ SDLNameBeltStatus:@YES,
+ SDLNameBodyInformation:@YES,
+ SDLNameClusterModeStatus:@YES,
+ SDLNameDeviceStatus:@YES,
+ SDLNameDriverBraking:@YES,
+ SDLNameECallInfo:@YES,
+ SDLNameElectronicParkBrakeStatus: @YES,
+ SDLNameEmergencyEvent:@YES,
+ SDLNameEngineOilLife:@YES,
+ SDLNameEngineTorque:@YES,
+ SDLNameExternalTemperature:@YES,
+ SDLNameFuelLevel:@YES,
+ SDLNameFuelLevelState:@YES,
+ SDLNameFuelRange:@YES,
+ SDLNameGPS:@YES,
+ SDLNameHeadLampStatus:@YES,
+ SDLNameInstantFuelConsumption:@YES,
+ SDLNameMyKey:@YES,
+ SDLNameOdometer:@YES,
+ SDLNamePRNDL:@YES,
+ SDLNameRPM:@YES,
+ SDLNameSpeed:@YES,
+ SDLNameSteeringWheelAngle:@YES,
+ SDLNameTirePressure:@YES,
+ SDLNameTurnSignal:@YES,
+ SDLNameWiperStatus:@YES},
+ SDLNameOperationName:SDLNameUnsubscribeVehicleData}};
SDLUnsubscribeVehicleData* testRequest = [[SDLUnsubscribeVehicleData alloc] initWithDictionary:dict];
expect(testRequest.accPedalPosition).to(equal(@YES));
@@ -112,6 +118,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.deviceStatus).to(equal(@YES));
expect(testRequest.driverBraking).to(equal(@YES));
expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@YES));
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
@@ -129,6 +136,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
expect(testRequest.tirePressure).to(equal(@YES));
+ expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
});
});
@@ -145,6 +153,7 @@ describe(@"initializers", ^{
expect(testRequest.deviceStatus).to(beNil());
expect(testRequest.driverBraking).to(beNil());
expect(testRequest.eCallInfo).to(beNil());
+ expect(testRequest.electronicParkBrakeStatus).to(beNil());
expect(testRequest.emergencyEvent).to(beNil());
expect(testRequest.engineOilLife).to(beNil());
expect(testRequest.engineTorque).to(beNil());
@@ -162,11 +171,12 @@ describe(@"initializers", ^{
expect(testRequest.speed).to(beNil());
expect(testRequest.steeringWheelAngle).to(beNil());
expect(testRequest.tirePressure).to(beNil());
+ expect(testRequest.turnSignal).to(beNil());
expect(testRequest.wiperStatus).to(beNil());
});
- context(@"initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:", ^{
- SDLUnsubscribeVehicleData *testRequest = [[SDLUnsubscribeVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation:YES clusterModeStatus:YES deviceStatus:YES driverBraking:YES eCallInfo:YES emergencyEvent:YES engineOilLife:YES engineTorque:YES externalTemperature:YES fuelLevel:YES fuelLevelState:YES fuelRange:YES gps:YES headLampStatus:YES instantFuelConsumption:YES myKey:YES odometer:YES prndl:YES rpm:YES speed:YES steeringWheelAngle:YES tirePressure:YES wiperStatus:YES];
+ context(@"initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:", ^{
+ SDLUnsubscribeVehicleData *testRequest = [[SDLUnsubscribeVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation:YES clusterModeStatus:YES deviceStatus:YES driverBraking:YES eCallInfo:YES electronicParkBrakeStatus:YES emergencyEvent:YES engineOilLife:YES engineTorque:YES externalTemperature:YES fuelLevel:YES fuelLevelState:YES fuelRange:YES gps:YES headLampStatus:YES instantFuelConsumption:YES myKey:YES odometer:YES prndl:YES rpm:YES speed:YES steeringWheelAngle:YES tirePressure:YES turnSignal:YES wiperStatus:YES];
expect(testRequest.accPedalPosition).to(equal(@YES));
expect(testRequest.airbagStatus).to(equal(@YES));
@@ -176,6 +186,7 @@ describe(@"initializers", ^{
expect(testRequest.deviceStatus).to(equal(@YES));
expect(testRequest.driverBraking).to(equal(@YES));
expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@YES));
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
@@ -193,6 +204,7 @@ describe(@"initializers", ^{
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
expect(testRequest.tirePressure).to(equal(@YES));
+ expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
});
@@ -207,6 +219,7 @@ describe(@"initializers", ^{
expect(testRequest.deviceStatus).to(equal(@YES));
expect(testRequest.driverBraking).to(equal(@YES));
expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@NO));
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@NO));
expect(testRequest.engineTorque).to(equal(@YES));
@@ -224,6 +237,7 @@ describe(@"initializers", ^{
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
expect(testRequest.tirePressure).to(equal(@YES));
+ expect(testRequest.turnSignal).to(equal(@NO));
expect(testRequest.wiperStatus).to(equal(@YES));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m
index 1696ab8c9..9d7a69713 100644
--- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m
@@ -39,6 +39,7 @@ describe(@"Getter/Setter Tests", ^ {
testResponse.deviceStatus = device;
testResponse.driverBraking = SDLVehicleDataEventStatusNoEvent;
testResponse.eCallInfo = eCall;
+ testResponse.electronicParkBrakeStatus = SDLElectronicParkBrakeStatusDriveActive;
testResponse.emergencyEvent = event;
testResponse.engineOilLife = @56.3;
testResponse.engineTorque = @630.4;
@@ -56,6 +57,7 @@ describe(@"Getter/Setter Tests", ^ {
testResponse.speed = @100;
testResponse.steeringWheelAngle = @-1500;
testResponse.tirePressure = tires;
+ testResponse.turnSignal = SDLTurnSignalBoth;
testResponse.vin = @"6574839201";
testResponse.wiperStatus = SDLWiperStatusAutomaticHigh;
@@ -67,6 +69,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.deviceStatus).to(equal(device));
expect(testResponse.driverBraking).to(equal(SDLVehicleDataEventStatusNoEvent));
expect(testResponse.eCallInfo).to(equal(eCall));
+ expect(testResponse.electronicParkBrakeStatus).to(equal(SDLElectronicParkBrakeStatusDriveActive));
expect(testResponse.emergencyEvent).to(equal(event));
expect(testResponse.engineOilLife).to(equal(@56.3));
expect(testResponse.engineTorque).to(equal(@630.4));
@@ -84,6 +87,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.speed).to(equal(@100));
expect(testResponse.steeringWheelAngle).to(equal(@-1500));
expect(testResponse.tirePressure).to(equal(tires));
+ expect(testResponse.turnSignal).to(equal(SDLTurnSignalBoth));
expect(testResponse.vin).to(equal(@"6574839201"));
expect(testResponse.wiperStatus).to(equal(SDLWiperStatusAutomaticHigh));
});
@@ -100,6 +104,7 @@ describe(@"Getter/Setter Tests", ^ {
SDLNameDeviceStatus:device,
SDLNameDriverBraking:SDLVehicleDataEventStatusNoEvent,
SDLNameECallInfo:eCall,
+ SDLNameElectronicParkBrakeStatus:SDLElectronicParkBrakeStatusDriveActive,
SDLNameEmergencyEvent:event,
SDLNameEngineOilLife:@23.22,
SDLNameEngineTorque:@630.4,
@@ -117,6 +122,7 @@ describe(@"Getter/Setter Tests", ^ {
SDLNameSpeed:@100,
SDLNameSteeringWheelAngle:@-1500,
SDLNameTirePressure:tires,
+ SDLNameTurnSignal:SDLTurnSignalOff,
SDLNameVIN:@"6574839201",
SDLNameWiperStatus:SDLWiperStatusAutomaticHigh},
SDLNameOperationName:SDLNameGetVehicleData}} mutableCopy];
@@ -130,6 +136,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.deviceStatus).to(equal(device));
expect(testResponse.driverBraking).to(equal(SDLVehicleDataEventStatusNoEvent));
expect(testResponse.eCallInfo).to(equal(eCall));
+ expect(testResponse.electronicParkBrakeStatus).to(equal(SDLElectronicParkBrakeStatusDriveActive));
expect(testResponse.emergencyEvent).to(equal(event));
expect(testResponse.engineOilLife).to(equal(@23.22));
expect(testResponse.engineTorque).to(equal(@630.4));
@@ -147,6 +154,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.speed).to(equal(@100));
expect(testResponse.steeringWheelAngle).to(equal(@-1500));
expect(testResponse.tirePressure).to(equal(tires));
+ expect(testResponse.turnSignal).to(equal(SDLTurnSignalOff));
expect(testResponse.vin).to(equal(@"6574839201"));
expect(testResponse.wiperStatus).to(equal(SDLWiperStatusAutomaticHigh));
});
@@ -162,6 +170,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.deviceStatus).to(beNil());
expect(testResponse.driverBraking).to(beNil());
expect(testResponse.eCallInfo).to(beNil());
+ expect(testResponse.electronicParkBrakeStatus).to(beNil());
expect(testResponse.emergencyEvent).to(beNil());
expect(testResponse.engineOilLife).to(beNil());
expect(testResponse.engineTorque).to(beNil());
@@ -179,6 +188,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.speed).to(beNil());
expect(testResponse.steeringWheelAngle).to(beNil());
expect(testResponse.tirePressure).to(beNil());
+ expect(testResponse.turnSignal).to(beNil());
expect(testResponse.vin).to(beNil());
expect(testResponse.wiperStatus).to(beNil());
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m
index b608a0174..aa8000b14 100644
--- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m
@@ -29,6 +29,7 @@ describe(@"Getter/Setter Tests", ^ {
testResponse.deviceStatus = vehicleDataResult;
testResponse.driverBraking = vehicleDataResult;
testResponse.eCallInfo = vehicleDataResult;
+ testResponse.electronicParkBrakeStatus = vehicleDataResult;
testResponse.emergencyEvent = vehicleDataResult;
testResponse.engineOilLife = vehicleDataResult;
testResponse.engineTorque = vehicleDataResult;
@@ -46,6 +47,7 @@ describe(@"Getter/Setter Tests", ^ {
testResponse.speed = vehicleDataResult;
testResponse.steeringWheelAngle = vehicleDataResult;
testResponse.tirePressure = vehicleDataResult;
+ testResponse.turnSignal = vehicleDataResult;
testResponse.wiperStatus = vehicleDataResult;
expect(testResponse.accPedalPosition).to(equal(vehicleDataResult));
@@ -56,6 +58,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.deviceStatus).to(equal(vehicleDataResult));
expect(testResponse.driverBraking).to(equal(vehicleDataResult));
expect(testResponse.eCallInfo).to(equal(vehicleDataResult));
+ expect(testResponse.electronicParkBrakeStatus).to(equal(vehicleDataResult));
expect(testResponse.emergencyEvent).to(equal(vehicleDataResult));
expect(testResponse.engineOilLife).to(equal(vehicleDataResult));
expect(testResponse.engineTorque).to(equal(vehicleDataResult));
@@ -73,6 +76,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.speed).to(equal(vehicleDataResult));
expect(testResponse.steeringWheelAngle).to(equal(vehicleDataResult));
expect(testResponse.tirePressure).to(equal(vehicleDataResult));
+ expect(testResponse.turnSignal).to(equal(vehicleDataResult));
expect(testResponse.wiperStatus).to(equal(vehicleDataResult));
});
@@ -87,6 +91,7 @@ describe(@"Getter/Setter Tests", ^ {
SDLNameDeviceStatus:vehicleDataResult,
SDLNameDriverBraking:vehicleDataResult,
SDLNameECallInfo:vehicleDataResult,
+ SDLNameElectronicParkBrakeStatus:vehicleDataResult,
SDLNameEmergencyEvent:vehicleDataResult,
SDLNameEngineOilLife:vehicleDataResult,
SDLNameEngineTorque:vehicleDataResult,
@@ -104,6 +109,7 @@ describe(@"Getter/Setter Tests", ^ {
SDLNameSpeed:vehicleDataResult,
SDLNameSteeringWheelAngle:vehicleDataResult,
SDLNameTirePressure:vehicleDataResult,
+ SDLNameTurnSignal:vehicleDataResult,
SDLNameWiperStatus:vehicleDataResult},
SDLNameOperationName:SDLNameSubscribeVehicleData}};
SDLSubscribeVehicleDataResponse* testResponse = [[SDLSubscribeVehicleDataResponse alloc] initWithDictionary:dict];
@@ -116,6 +122,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.deviceStatus).to(equal(vehicleDataResult));
expect(testResponse.driverBraking).to(equal(vehicleDataResult));
expect(testResponse.eCallInfo).to(equal(vehicleDataResult));
+ expect(testResponse.electronicParkBrakeStatus).to(equal(vehicleDataResult));
expect(testResponse.emergencyEvent).to(equal(vehicleDataResult));
expect(testResponse.engineOilLife).to(equal(vehicleDataResult));
expect(testResponse.engineTorque).to(equal(vehicleDataResult));
@@ -133,6 +140,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.speed).to(equal(vehicleDataResult));
expect(testResponse.steeringWheelAngle).to(equal(vehicleDataResult));
expect(testResponse.tirePressure).to(equal(vehicleDataResult));
+ expect(testResponse.turnSignal).to(equal(vehicleDataResult));
expect(testResponse.wiperStatus).to(equal(vehicleDataResult));
});
@@ -147,6 +155,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.deviceStatus).to(beNil());
expect(testResponse.driverBraking).to(beNil());
expect(testResponse.eCallInfo).to(beNil());
+ expect(testResponse.electronicParkBrakeStatus).to(beNil());
expect(testResponse.emergencyEvent).to(beNil());
expect(testResponse.engineOilLife).to(beNil());
expect(testResponse.engineTorque).to(beNil());
@@ -164,6 +173,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.speed).to(beNil());
expect(testResponse.steeringWheelAngle).to(beNil());
expect(testResponse.tirePressure).to(beNil());
+ expect(testResponse.turnSignal).to(beNil());
expect(testResponse.wiperStatus).to(beNil());
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m
index ce36c0c13..8af7ef673 100644
--- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m
@@ -47,6 +47,8 @@ describe(@"Getter/Setter Tests", ^ {
testResponse.emergencyEvent = vehicleDataResult;
testResponse.clusterModes = vehicleDataResult;
testResponse.myKey = vehicleDataResult;
+ testResponse.electronicParkBrakeStatus = vehicleDataResult;
+ testResponse.turnSignal = vehicleDataResult;
expect(testResponse.gps).to(equal(vehicleDataResult));
expect(testResponse.speed).to(equal(vehicleDataResult));
@@ -74,6 +76,8 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.emergencyEvent).to(equal(vehicleDataResult));
expect(testResponse.clusterModes).to(equal(vehicleDataResult));
expect(testResponse.myKey).to(equal(vehicleDataResult));
+ expect(testResponse.electronicParkBrakeStatus).to(equal(vehicleDataResult));
+ expect(testResponse.turnSignal).to(equal(vehicleDataResult));
});
it(@"Should get correctly when initialized", ^ {
@@ -104,7 +108,10 @@ describe(@"Getter/Setter Tests", ^ {
SDLNameAirbagStatus:vehicleDataResult,
SDLNameEmergencyEvent:vehicleDataResult,
SDLNameClusterModes:vehicleDataResult,
- SDLNameMyKey:vehicleDataResult},
+ SDLNameMyKey:vehicleDataResult,
+ SDLNameElectronicParkBrakeStatus:vehicleDataResult,
+ SDLNameTurnSignal:vehicleDataResult,
+ },
SDLNameOperationName:SDLNameUnsubscribeVehicleData}} mutableCopy];
SDLUnsubscribeVehicleDataResponse* testResponse = [[SDLUnsubscribeVehicleDataResponse alloc] initWithDictionary:dict];
@@ -134,6 +141,8 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.emergencyEvent).to(equal(vehicleDataResult));
expect(testResponse.clusterModes).to(equal(vehicleDataResult));
expect(testResponse.myKey).to(equal(vehicleDataResult));
+ expect(testResponse.electronicParkBrakeStatus).to(equal(vehicleDataResult));
+ expect(testResponse.turnSignal).to(equal(vehicleDataResult));
});
it(@"Should return nil if not set", ^ {
@@ -165,6 +174,8 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.emergencyEvent).to(beNil());
expect(testResponse.clusterModes).to(beNil());
expect(testResponse.myKey).to(beNil());
+ expect(testResponse.electronicParkBrakeStatus).to(beNil());
+ expect(testResponse.turnSignal).to(beNil());
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageSpec.m
index b4a0b2be6..56939ee0e 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageSpec.m
@@ -137,6 +137,16 @@ describe(@"initializers", ^{
expect(testImage.imageType).to(equal(SDLImageTypeStatic));
expect(testImage.isTemplate).to(beTrue());
});
+
+ context(@"initWithStaticIconName:", ^{
+ SDLStaticIconName staticIconName = SDLStaticIconNameFavoriteStar;
+ testImage = [[SDLImage alloc] initWithStaticIconName:staticIconName];
+
+ expect(testImage).toNot(beNil());
+ expect(testImage.value).to(equal(staticIconName));
+ expect(testImage.imageType).to(equal(SDLImageTypeStatic));
+ expect(testImage.isTemplate).to(beTrue());
+ });
});
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageCushionFirmnessSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageCushionFirmnessSpec.m
new file mode 100644
index 000000000..4fc8f0b43
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageCushionFirmnessSpec.m
@@ -0,0 +1,52 @@
+//
+// SDLMassageCushionFirmnessSpec.m
+// SmartDeviceLinkTests
+//
+
+#import <Foundation/Foundation.h>
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLNames.h"
+#import "SDLMassageCushionFirmness.h"
+
+QuickSpecBegin(SDLMassageCushionFirmnessSpec)
+
+describe(@"Getter/Setter Tests", ^ {
+ it(@"Should set and get correctly", ^ {
+ SDLMassageCushionFirmness* testStruct = [[SDLMassageCushionFirmness alloc] init];
+
+ testStruct.cushion = SDLMassageCushionSeatBolsters;
+ testStruct.firmness = @2;
+
+ expect(testStruct.cushion).to(equal(SDLMassageCushionSeatBolsters));
+ expect(testStruct.firmness).to(equal(@2));
+ });
+
+ it(@"Should set and get correctly", ^ {
+ SDLMassageCushionFirmness* testStruct = [[SDLMassageCushionFirmness alloc] initWithMassageCushion:SDLMassageCushionBackBolsters firmness:12];
+
+ expect(testStruct.cushion).to(equal(SDLMassageCushionBackBolsters));
+ expect(testStruct.firmness).to(equal(@12));
+ });
+
+ it(@"Should get correctly when initialized", ^ {
+ NSMutableDictionary* dict = [@{SDLNameCushion:SDLMassageCushionSeatBolsters,
+ SDLNameFirmness:@12
+ } mutableCopy];
+ SDLMassageCushionFirmness* testStruct = [[SDLMassageCushionFirmness alloc] initWithDictionary:dict];
+
+ expect(testStruct.cushion).to(equal(SDLMassageCushionSeatBolsters));
+ expect(testStruct.firmness).to(equal(@12));
+
+ });
+
+ it(@"Should return nil if not set", ^ {
+ SDLMassageCushionFirmness* testStruct = [[SDLMassageCushionFirmness alloc] init];
+
+ expect(testStruct.cushion).to(beNil());
+ expect(testStruct.firmness).to(beNil());
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageModeDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageModeDataSpec.m
new file mode 100644
index 000000000..6b52a36b2
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageModeDataSpec.m
@@ -0,0 +1,53 @@
+//
+// SDLMassageModeDataSpec.m
+// SmartDeviceLinkTests
+//
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLNames.h"
+#import "SDLMassageModeData.h"
+
+QuickSpecBegin(SDLMassageModeDataSpec)
+
+describe(@"Getter/Setter Tests", ^ {
+ it(@"Should set and get correctly", ^ {
+ SDLMassageModeData* testStruct = [[SDLMassageModeData alloc] init];
+
+ testStruct.massageMode = SDLMassageModeHigh;
+ testStruct.massageZone = SDLMassageZoneLumbar;
+
+ expect(testStruct.massageZone).to(equal(SDLMassageZoneLumbar));
+ expect(testStruct.massageMode).to(equal(SDLMassageModeHigh));
+ });
+
+ it(@"Should set and get correctly", ^ {
+ SDLMassageModeData* testStruct = [[SDLMassageModeData alloc] initWithMassageMode:SDLMassageZoneLumbar massageZone:SDLMassageModeHigh];
+
+ expect(testStruct.massageZone).to(equal(SDLMassageModeHigh));
+ expect(testStruct.massageMode).to(equal(SDLMassageZoneLumbar));
+ });
+
+ it(@"Should get correctly when initialized", ^ {
+ NSMutableDictionary* dict = [@{SDLNameMassageMode:SDLMassageModeLow,
+ SDLNameMassageZone:SDLMassageZoneLumbar
+ } mutableCopy];
+ SDLMassageModeData* testStruct = [[SDLMassageModeData alloc] initWithDictionary:dict];
+
+ expect(testStruct.massageZone).to(equal(SDLMassageZoneLumbar));
+ expect(testStruct.massageMode).to(equal(SDLMassageModeLow));
+ });
+
+ it(@"Should return nil if not set", ^ {
+ SDLMassageModeData* testStruct = [[SDLMassageModeData alloc] init];
+
+ expect(testStruct.massageZone).to(beNil());
+ expect(testStruct.massageMode).to(beNil());
+ });
+});
+
+QuickSpecEnd
+
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLModuleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLModuleDataSpec.m
index ee14ff803..136d79c1c 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLModuleDataSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLModuleDataSpec.m
@@ -12,6 +12,7 @@
#import "SDLModuleType.h"
#import "SDLClimateControlData.h"
#import "SDLRadioControlData.h"
+#import "SDLSeatControlData.h"
#import "SDLNames.h"
QuickSpecBegin(SDLModuleDataSpec)
@@ -19,24 +20,30 @@ QuickSpecBegin(SDLModuleDataSpec)
describe(@"Initialization tests", ^{
__block SDLRadioControlData* someRadioData = [[SDLRadioControlData alloc] init];
__block SDLClimateControlData* someClimateData = [[SDLClimateControlData alloc] init];
+ __block SDLSeatControlData* someSeatData = [[SDLSeatControlData alloc] init];
+
it(@"should properly initialize init", ^{
SDLModuleData* testStruct = [[SDLModuleData alloc] init];
-
+
expect(testStruct.moduleType).to(beNil());
expect(testStruct.radioControlData).to(beNil());
expect(testStruct.climateControlData).to(beNil());
+ expect(testStruct.seatControlData).to(beNil());
});
it(@"should properly initialize initWithDictionary", ^{
NSMutableDictionary* dict = [@{SDLNameModuleType:SDLModuleTypeRadio,
SDLNameRadioControlData:someRadioData,
- SDLNameClimateControlData:someClimateData} mutableCopy];
+ SDLNameClimateControlData:someClimateData,
+ SDLNameSeatControlData:someSeatData
+ } mutableCopy];
SDLModuleData* testStruct = [[SDLModuleData alloc] initWithDictionary:dict];
expect(testStruct.moduleType).to(equal(SDLModuleTypeRadio));
expect(testStruct.radioControlData).to(equal(someRadioData));
+ expect(testStruct.seatControlData).to(equal(someSeatData));
expect(testStruct.climateControlData).to(equal(someClimateData));
});
@@ -45,8 +52,10 @@ describe(@"Initialization tests", ^{
testStruct.moduleType = SDLModuleTypeRadio;
testStruct.radioControlData = someRadioData;
testStruct.climateControlData = someClimateData;
+ testStruct.seatControlData = someSeatData;
expect(testStruct.moduleType).to(equal(SDLModuleTypeRadio));
+ expect(testStruct.seatControlData).to(equal(someSeatData));
expect(testStruct.radioControlData).to(equal(someRadioData));
expect(testStruct.climateControlData).to(equal(someClimateData));
});
@@ -57,6 +66,7 @@ describe(@"Initialization tests", ^{
expect(testStruct.moduleType).to(equal(SDLModuleTypeRadio));
expect(testStruct.radioControlData).to(equal(someRadioData));
expect(testStruct.climateControlData).to(beNil());
+ expect(testStruct.seatControlData).to(beNil());
});
it(@"Should get correctly when initialized with ClimateControlData", ^ {
@@ -65,6 +75,16 @@ describe(@"Initialization tests", ^{
expect(testStruct.moduleType).to(equal(SDLModuleTypeClimate));
expect(testStruct.climateControlData).to(equal(someClimateData));
expect(testStruct.radioControlData).to(beNil());
+ expect(testStruct.seatControlData).to(beNil());
+ });
+
+ it(@"Should get correctly when initialized with ClimateControlData", ^ {
+ SDLModuleData* testStruct = [[SDLModuleData alloc] initWithSeatControlData:someSeatData];
+
+ expect(testStruct.moduleType).to(equal(SDLModuleTypeSeat));
+ expect(testStruct.seatControlData).to(equal(someSeatData));
+ expect(testStruct.radioControlData).to(beNil());
+ expect(testStruct.climateControlData).to(beNil());
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlCapabilitiesSpec.m
index d6e07fe11..78a640dae 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlCapabilitiesSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlCapabilitiesSpec.m
@@ -28,6 +28,8 @@ describe(@"Initialization tests", ^{
expect(testStruct.stateAvailable).to(beNil());
expect(testStruct.signalStrengthAvailable).to(beNil());
expect(testStruct.signalChangeThresholdAvailable).to(beNil());
+ expect(testStruct.hdRadioEnableAvailable).to(beNil());
+ expect(testStruct.siriusXMRadioAvailable).to(beNil());
});
it(@"should properly initialize initWithDictionary", ^{
@@ -41,7 +43,10 @@ describe(@"Initialization tests", ^{
SDLNameAvailableHDsAvailable : @NO,
SDLNameStateAvailable : @YES,
SDLNameSignalStrengthAvailable : @YES,
- SDLNameSignalChangeThresholdAvailable : @NO} mutableCopy];
+ SDLNameSignalChangeThresholdAvailable : @NO,
+ SDLNameHDRadioEnableAvailable : @YES,
+ SDLNameSiriusXMRadioAvailable : @NO
+ } mutableCopy];
SDLRadioControlCapabilities* testStruct = [[SDLRadioControlCapabilities alloc] initWithDictionary:dict];
expect(testStruct.moduleName).to(equal(@"someName"));
@@ -54,6 +59,8 @@ describe(@"Initialization tests", ^{
expect(testStruct.stateAvailable).to(equal(@YES));
expect(testStruct.signalStrengthAvailable).to(equal(@YES));
expect(testStruct.signalChangeThresholdAvailable).to(equal(@NO));
+ expect(testStruct.hdRadioEnableAvailable).to(equal(@YES));
+ expect(testStruct.siriusXMRadioAvailable).to(equal(@NO));
});
it(@"Should set and get correctly", ^{
@@ -69,6 +76,8 @@ describe(@"Initialization tests", ^{
testStruct.stateAvailable = @YES;
testStruct.signalStrengthAvailable = @YES;
testStruct.signalChangeThresholdAvailable = @NO;
+ testStruct.hdRadioEnableAvailable = @YES;
+ testStruct.siriusXMRadioAvailable = @YES;
expect(testStruct.moduleName).to(equal(@"someName"));
expect(testStruct.radioEnableAvailable).to(equal(@YES));
@@ -80,8 +89,10 @@ describe(@"Initialization tests", ^{
expect(testStruct.stateAvailable).to(equal(@YES));
expect(testStruct.signalStrengthAvailable).to(equal(@YES));
expect(testStruct.signalChangeThresholdAvailable).to(equal(@NO));
+ expect(testStruct.hdRadioEnableAvailable).to(equal(@YES));
+ expect(testStruct.siriusXMRadioAvailable).to(equal(@YES));
});
-
+
it(@"Should get correctly when initialized with Module Name and other radio control capabilite's parameters", ^ {
SDLRadioControlCapabilities* testStruct = [[SDLRadioControlCapabilities alloc] initWithModuleName:@"someName" radioEnableAvailable:YES radioBandAvailable:NO radioFrequencyAvailable:YES hdChannelAvailable:NO rdsDataAvailable:NO availableHDsAvailable:NO stateAvailable:YES signalStrengthAvailable:YES signalChangeThresholdAvailable:NO];
@@ -95,6 +106,25 @@ describe(@"Initialization tests", ^{
expect(testStruct.stateAvailable).to(equal(@YES));
expect(testStruct.signalStrengthAvailable).to(equal(@YES));
expect(testStruct.signalChangeThresholdAvailable).to(equal(@NO));
+ expect(testStruct.hdRadioEnableAvailable).to(equal(@NO));
+ expect(testStruct.siriusXMRadioAvailable).to(equal(@NO));
+ });
+
+ it(@"Should get correctly when initialized with Module Name and other radio control capabilite's parameters", ^ {
+ SDLRadioControlCapabilities* testStruct = [[SDLRadioControlCapabilities alloc] initWithModuleName:@"someName" radioEnableAvailable:YES radioBandAvailable:NO radioFrequencyAvailable:YES hdChannelAvailable:NO rdsDataAvailable:NO availableHDsAvailable:NO stateAvailable:YES signalStrengthAvailable:YES signalChangeThresholdAvailable:NO hdRadioEnableAvailable:NO siriusXMRadioAvailable:YES];
+
+ expect(testStruct.moduleName).to(equal(@"someName"));
+ expect(testStruct.radioEnableAvailable).to(equal(@YES));
+ expect(testStruct.radioBandAvailable).to(equal(@NO));
+ expect(testStruct.radioFrequencyAvailable).to(equal(@YES));
+ expect(testStruct.hdChannelAvailable).to(equal(@NO));
+ expect(testStruct.rdsDataAvailable).to(equal(@NO));
+ expect(testStruct.availableHDsAvailable).to(equal(@NO));
+ expect(testStruct.stateAvailable).to(equal(@YES));
+ expect(testStruct.signalStrengthAvailable).to(equal(@YES));
+ expect(testStruct.signalChangeThresholdAvailable).to(equal(@NO));
+ expect(testStruct.hdRadioEnableAvailable).to(equal(@NO));
+ expect(testStruct.siriusXMRadioAvailable).to(equal(@YES));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlDataSpec.m
index 4a5ebee64..11a16f83e 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlDataSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlDataSpec.m
@@ -32,6 +32,7 @@ describe(@"Initialization tests", ^{
expect(testStruct.signalChangeThreshold).to(beNil());
expect(testStruct.radioEnable).to(beNil());
expect(testStruct.state).to(beNil());
+ expect(testStruct.hdRadioEnable).to(beNil());
});
it(@"should properly initialize initWithDictionary", ^{
@@ -45,7 +46,9 @@ describe(@"Initialization tests", ^{
SDLNameSignalStrength : @54,
SDLNameSignalChangeThreshold : @76,
SDLNameRadioEnable : @YES,
- SDLNameState : SDLRadioStateNotFound} mutableCopy];
+ SDLNameState : SDLRadioStateNotFound,
+ SDLNameHDRadioEnable : @NO
+ } mutableCopy];
SDLRadioControlData* testStruct = [[SDLRadioControlData alloc] initWithDictionary:dict];
expect(testStruct.frequencyInteger).to(equal(@101));
@@ -58,6 +61,7 @@ describe(@"Initialization tests", ^{
expect(testStruct.signalChangeThreshold).to(equal(@76));
expect(testStruct.radioEnable).to(equal(@YES));
expect(testStruct.state).to(equal(SDLRadioStateNotFound));
+ expect(testStruct.hdRadioEnable).to(equal(@NO));
});
it(@"Should set and get correctly", ^{
@@ -72,6 +76,7 @@ describe(@"Initialization tests", ^{
testStruct.signalChangeThreshold = @76;
testStruct.radioEnable = @YES;
testStruct.state = SDLRadioStateNotFound;
+ testStruct.hdRadioEnable = @YES;
expect(testStruct.frequencyInteger).to(equal(@101));
expect(testStruct.frequencyFraction).to(equal(@7));
@@ -83,6 +88,7 @@ describe(@"Initialization tests", ^{
expect(testStruct.signalChangeThreshold).to(equal(@76));
expect(testStruct.radioEnable).to(equal(@YES));
expect(testStruct.state).to(equal(SDLRadioStateNotFound));
+ expect(testStruct.hdRadioEnable).to(equal(@YES));
});
it(@"Should get correctly when initialized with Module Name and other radio control capabilite's parameters", ^ {
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRemoteControlCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRemoteControlCapabilitiesSpec.m
index 0dc04323a..e7a472400 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRemoteControlCapabilitiesSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRemoteControlCapabilitiesSpec.m
@@ -11,6 +11,7 @@
#import "SDLRemoteControlCapabilities.h"
#import "SDLClimateControlCapabilities.h"
#import "SDLRadioControlCapabilities.h"
+#import "SDLSeatControlCapabilities.h"
#import "SDLButtonCapabilities.h"
#import "SDLNames.h"
@@ -19,12 +20,15 @@ QuickSpecBegin(SDLRemoteControlCapabilitiesSpec)
__block SDLClimateControlCapabilities* someClimateControlCapabilities = [[SDLClimateControlCapabilities alloc] init];
__block SDLRadioControlCapabilities* someRadioControlCapabilities = [[SDLRadioControlCapabilities alloc] init];
__block SDLButtonCapabilities* someButtonControlCapabilities = [[SDLButtonCapabilities alloc] init];
+__block SDLSeatControlCapabilities* someSeatControlCapabilities = [[SDLSeatControlCapabilities alloc] init];
+
describe(@"Initialization tests", ^{
it(@"should properly initialize init", ^{
SDLRemoteControlCapabilities* testStruct = [[SDLRemoteControlCapabilities alloc] init];
-
+
+ expect(testStruct.seatControlCapabilities).to(beNil());
expect(testStruct.climateControlCapabilities).to(beNil());
expect(testStruct.radioControlCapabilities).to(beNil());
expect(testStruct.buttonCapabilities).to(beNil());
@@ -34,9 +38,12 @@ describe(@"Initialization tests", ^{
NSMutableDictionary* dict = [@{SDLNameClimateControlCapabilities : [@[someClimateControlCapabilities] copy],
SDLNameRadioControlCapabilities :[@[someRadioControlCapabilities] copy],
- SDLNameButtonCapabilities :[@[someButtonControlCapabilities] copy] } mutableCopy];
+ SDLNameButtonCapabilities :[@[someButtonControlCapabilities] copy],
+ SDLNameSeatControlCapabilities:[@[someSeatControlCapabilities]copy]
+ } mutableCopy];
SDLRemoteControlCapabilities* testStruct = [[SDLRemoteControlCapabilities alloc] initWithDictionary:dict];
-
+
+ expect(testStruct.seatControlCapabilities).to(equal([@[someSeatControlCapabilities] copy]));
expect(testStruct.climateControlCapabilities).to(equal([@[someClimateControlCapabilities] copy]));
expect(testStruct.radioControlCapabilities).to(equal([@[someRadioControlCapabilities] copy]));
expect(testStruct.buttonCapabilities).to(equal([@[someButtonControlCapabilities] copy]));
@@ -44,11 +51,13 @@ describe(@"Initialization tests", ^{
it(@"Should set and get correctly", ^{
SDLRemoteControlCapabilities* testStruct = [[SDLRemoteControlCapabilities alloc] init];
-
+
+ testStruct.seatControlCapabilities = ([@[someSeatControlCapabilities] copy]);
testStruct.climateControlCapabilities = ([@[someClimateControlCapabilities] copy]);
testStruct.radioControlCapabilities = [@[someRadioControlCapabilities] copy];
testStruct.buttonCapabilities = [@[someButtonControlCapabilities] copy];
-
+
+ expect(testStruct.seatControlCapabilities).to(equal([@[someSeatControlCapabilities] copy]));
expect(testStruct.climateControlCapabilities).to(equal(([@[someClimateControlCapabilities] copy])));
expect(testStruct.radioControlCapabilities).to(equal([@[someRadioControlCapabilities] copy]));
expect(testStruct.buttonCapabilities).to(equal([@[someButtonControlCapabilities] copy]));
@@ -57,6 +66,16 @@ describe(@"Initialization tests", ^{
it(@"Should get correctly when initialized with climateControlCapabilities and other RemoteControlCapabilities parameters", ^ {
SDLRemoteControlCapabilities* testStruct = [[SDLRemoteControlCapabilities alloc] initWithClimateControlCapabilities:[@[someClimateControlCapabilities] copy] radioControlCapabilities:[@[someRadioControlCapabilities] copy] buttonCapabilities:[@[someButtonControlCapabilities] copy]];
+ expect(testStruct.seatControlCapabilities).to(beNil());
+ expect(testStruct.climateControlCapabilities).to(equal(([@[someClimateControlCapabilities] copy])));
+ expect(testStruct.radioControlCapabilities).to(equal([@[someRadioControlCapabilities] copy]));
+ expect(testStruct.buttonCapabilities).to(equal([@[someButtonControlCapabilities] copy]));
+ });
+
+ it(@"Should get correctly when initialized with climateControlCapabilities and other RemoteControlCapabilities parameters", ^ {
+ SDLRemoteControlCapabilities* testStruct = [[SDLRemoteControlCapabilities alloc] initWithClimateControlCapabilities:[@[someClimateControlCapabilities] copy] radioControlCapabilities:[@[someRadioControlCapabilities] copy] buttonCapabilities:[@[someButtonControlCapabilities] copy] seatControlCapabilities:[@[someSeatControlCapabilities] copy]];
+
+ expect(testStruct.seatControlCapabilities).to(equal([@[someSeatControlCapabilities] copy]));
expect(testStruct.climateControlCapabilities).to(equal(([@[someClimateControlCapabilities] copy])));
expect(testStruct.radioControlCapabilities).to(equal([@[someRadioControlCapabilities] copy]));
expect(testStruct.buttonCapabilities).to(equal([@[someButtonControlCapabilities] copy]));
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlCapabilitiesSpec.m
new file mode 100644
index 000000000..07f6b8c4a
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlCapabilitiesSpec.m
@@ -0,0 +1,162 @@
+//
+// SDLSeatControlCapabilitiesSpec.m
+// SmartDeviceLinkTests
+//
+#import <Foundation/Foundation.h>
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLNames.h"
+#import "SDLSeatControlCapabilities.h"
+
+
+QuickSpecBegin(SDLSeatControlCapabilitiesSpec)
+
+describe(@"Getter/Setter Tests", ^ {
+ it(@"Should set and get correctly", ^ {
+ SDLSeatControlCapabilities* testStruct = [[SDLSeatControlCapabilities alloc] init];
+
+ testStruct.moduleName = @"moduleName";
+ testStruct.heatingEnabledAvailable = @YES;
+ testStruct.coolingEnabledAvailable = @NO;
+ testStruct.heatingLevelAvailable = @YES;
+ testStruct.coolingLevelAvailable = @NO;
+ testStruct.horizontalPositionAvailable = @NO;
+ testStruct.verticalPositionAvailable = @NO;
+ testStruct.frontVerticalPositionAvailable = @NO;
+ testStruct.backVerticalPositionAvailable = @NO;
+ testStruct.backTiltAngleAvailable = @YES;
+ testStruct.headSupportVerticalPositionAvailable = @NO;
+ testStruct.headSupportHorizontalPositionAvailable = @YES;
+ testStruct.massageEnabledAvailable = @NO;
+ testStruct.massageModeAvailable = @YES;
+ testStruct.massageCushionFirmnessAvailable = @NO;
+ testStruct.memoryAvailable = @NO;
+
+ expect(testStruct.moduleName).to(equal(@"moduleName"));
+ expect(testStruct.heatingEnabledAvailable).to(equal(@YES));
+ expect(testStruct.coolingEnabledAvailable).to(equal(@NO));
+ expect(testStruct.heatingLevelAvailable).to(equal(@YES));
+ expect(testStruct.coolingLevelAvailable).to(equal(@NO));
+ expect(testStruct.horizontalPositionAvailable).to(equal(@NO));
+ expect(testStruct.verticalPositionAvailable).to(equal(@NO));
+ expect(testStruct.frontVerticalPositionAvailable).to(equal(@NO));
+ expect(testStruct.backVerticalPositionAvailable).to(equal(@NO));
+ expect(testStruct.backTiltAngleAvailable).to(equal(@YES));
+ expect(testStruct.headSupportVerticalPositionAvailable).to(equal(@NO));
+ expect(testStruct.headSupportHorizontalPositionAvailable).to(equal(@YES));
+ expect(testStruct.massageEnabledAvailable).to(equal(@NO));
+ expect(testStruct.massageModeAvailable).to(equal(@YES));
+ expect(testStruct.massageCushionFirmnessAvailable).to(equal(@NO));
+ expect(testStruct.memoryAvailable).to(equal(@NO));
+
+ });
+
+ it(@"Should set and get correctly", ^ {
+ SDLSeatControlCapabilities* testStruct = [[SDLSeatControlCapabilities alloc] initWithName:@"moduleName" heatingEnabledAvailable:YES coolingEnabledAvailable:NO heatingLevelAvailable:YES coolingLevelAvailable:NO horizontalPositionAvailable:NO verticalPositionAvailable:NO frontVerticalPositionAvailable:NO backVerticalPositionAvailable:NO backTiltAngleAvailable:YES headSupportHorizontalPositionAvailable:NO headSupportVerticalPositionAvailable:YES massageEnabledAvailable:NO massageModeAvailable:YES massageCushionFirmnessAvailable:NO memoryAvailable:YES];
+
+ expect(testStruct.moduleName).to(equal(@"moduleName"));
+ expect(testStruct.heatingEnabledAvailable).to(equal(@YES));
+ expect(testStruct.coolingEnabledAvailable).to(equal(@NO));
+ expect(testStruct.heatingLevelAvailable).to(equal(@YES));
+ expect(testStruct.coolingLevelAvailable).to(equal(@NO));
+ expect(testStruct.horizontalPositionAvailable).to(equal(@NO));
+ expect(testStruct.verticalPositionAvailable).to(equal(@NO));
+ expect(testStruct.frontVerticalPositionAvailable).to(equal(@NO));
+ expect(testStruct.backVerticalPositionAvailable).to(equal(@NO));
+ expect(testStruct.backTiltAngleAvailable).to(equal(@YES));
+ expect(testStruct.headSupportHorizontalPositionAvailable).to(equal(@NO));
+ expect(testStruct.headSupportVerticalPositionAvailable).to(equal(@YES));
+ expect(testStruct.massageEnabledAvailable).to(equal(@NO));
+ expect(testStruct.massageModeAvailable).to(equal(@YES));
+ expect(testStruct.massageCushionFirmnessAvailable).to(equal(@NO));
+ expect(testStruct.memoryAvailable).to(equal(@YES));
+
+ });
+
+ it(@"Should set and get correctly", ^ {
+ SDLSeatControlCapabilities* testStruct = [[SDLSeatControlCapabilities alloc] initWithName:@"moduleName"];
+
+ expect(testStruct.moduleName).to(equal(@"moduleName"));
+ expect(testStruct.heatingEnabledAvailable).to(beNil());
+ expect(testStruct.heatingEnabledAvailable).to(beNil());
+ expect(testStruct.heatingLevelAvailable).to(beNil());
+ expect(testStruct.coolingLevelAvailable).to(beNil());
+ expect(testStruct.horizontalPositionAvailable).to(beNil());
+ expect(testStruct.verticalPositionAvailable).to(beNil());
+ expect(testStruct.frontVerticalPositionAvailable).to(beNil());
+ expect(testStruct.backVerticalPositionAvailable).to(beNil());
+ expect(testStruct.backTiltAngleAvailable).to(beNil());
+ expect(testStruct.headSupportHorizontalPositionAvailable).to(beNil());
+ expect(testStruct.headSupportVerticalPositionAvailable).to(beNil());
+ expect(testStruct.massageEnabledAvailable).to(beNil());
+ expect(testStruct.massageModeAvailable).to(beNil());
+ expect(testStruct.massageCushionFirmnessAvailable).to(beNil());
+ expect(testStruct.memoryAvailable).to(beNil());
+
+ });
+
+ it(@"Should get correctly when initialized", ^ {
+ NSMutableDictionary* dict = [@{SDLNameModuleName:@"moduleName",
+ SDLNameHeatingEnabledAvailable:(@YES),
+ SDLNameCoolingEnabledAvailable:@YES,
+ SDLNameHeatingLevelAvailable:@YES,
+ SDLNameCoolingLevelAvailable:@NO,
+ SDLNameHorizontalPositionAvailable:@NO,
+ SDLNameVerticalPositionAvailable:@NO,
+ SDLNameFrontVerticalPositionAvailable:@NO,
+ SDLNameBackVerticalPositionAvailable:@NO,
+ SDLNameBackTiltAngleAvailable:@YES,
+ SDLNameHeadSupportHorizontalPositionAvailable:@NO,
+ SDLNameHeadSupportVerticalPositionAvailable:@YES,
+ SDLNameMassageEnabledAvailable:@NO,
+ SDLNameMassageModeAvailable:@YES,
+ SDLNameMassageCushionFirmnessAvailable:@NO,
+ SDLNameMemoryAvailable:@NO
+ } mutableCopy];
+ SDLSeatControlCapabilities *testStruct = [[SDLSeatControlCapabilities alloc] initWithDictionary:dict];
+
+ expect(testStruct.moduleName).to(equal(@"moduleName"));
+ expect(testStruct.heatingEnabledAvailable).to(equal(@YES));
+ expect(testStruct.coolingEnabledAvailable).to(equal(@YES));
+ expect(testStruct.heatingLevelAvailable).to(equal(@YES));
+ expect(testStruct.coolingLevelAvailable).to(equal(@NO));
+ expect(testStruct.horizontalPositionAvailable).to(equal(@NO));
+ expect(testStruct.verticalPositionAvailable).to(equal(@NO));
+ expect(testStruct.frontVerticalPositionAvailable).to(equal(@NO));
+ expect(testStruct.backVerticalPositionAvailable).to(equal(@NO));
+ expect(testStruct.backTiltAngleAvailable).to(equal(@YES));
+ expect(testStruct.headSupportHorizontalPositionAvailable).to(equal(@NO));
+ expect(testStruct.headSupportVerticalPositionAvailable).to(equal(@YES));
+ expect(testStruct.massageEnabledAvailable).to(equal(@NO));
+ expect(testStruct.massageModeAvailable).to(equal(@YES));
+ expect(testStruct.massageCushionFirmnessAvailable).to(equal(@NO));
+ expect(testStruct.memoryAvailable).to(equal(@NO));
+ });
+
+ it(@"Should return nil if not set", ^ {
+ SDLSeatControlCapabilities* testStruct = [[SDLSeatControlCapabilities alloc] init];
+
+ expect(testStruct.moduleName).to(beNil());
+ expect(testStruct.heatingEnabledAvailable).to(beNil());
+ expect(testStruct.heatingEnabledAvailable).to(beNil());
+ expect(testStruct.heatingLevelAvailable).to(beNil());
+ expect(testStruct.coolingLevelAvailable).to(beNil());
+ expect(testStruct.horizontalPositionAvailable).to(beNil());
+ expect(testStruct.verticalPositionAvailable).to(beNil());
+ expect(testStruct.frontVerticalPositionAvailable).to(beNil());
+ expect(testStruct.backVerticalPositionAvailable).to(beNil());
+ expect(testStruct.backTiltAngleAvailable).to(beNil());
+ expect(testStruct.headSupportHorizontalPositionAvailable).to(beNil());
+ expect(testStruct.headSupportVerticalPositionAvailable).to(beNil());
+ expect(testStruct.massageEnabledAvailable).to(beNil());
+ expect(testStruct.massageModeAvailable).to(beNil());
+ expect(testStruct.massageCushionFirmnessAvailable).to(beNil());
+ expect(testStruct.memoryAvailable).to(beNil());
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlDataSpec.m
new file mode 100644
index 000000000..02dc0500f
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlDataSpec.m
@@ -0,0 +1,171 @@
+//
+// SDLSeatControlDataSpec.m
+// SmartDeviceLinkTests
+//
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLNames.h"
+#import "SDLSeatControlData.h"
+#import "SDLMassageModeData.h"
+#import "SDLMassageCushionFirmness.h"
+#import "SDLSeatMemoryAction.h"
+
+
+QuickSpecBegin(SDLSeatControlDataSpec)
+
+SDLMassageCushionFirmness* massageCushionFirmness = [[SDLMassageCushionFirmness alloc] init];
+SDLMassageModeData *massageModeData = [[SDLMassageModeData alloc] init];
+SDLSeatMemoryAction *seatMemoryAction = [[SDLSeatMemoryAction alloc] init];
+
+describe(@"Getter/Setter Tests", ^ {
+ it(@"Should set and get correctly", ^ {
+ SDLSeatControlData* testStruct = [[SDLSeatControlData alloc] init];
+
+ testStruct.id = SDLSupportedSeatDriver;
+ testStruct.heatingEnabled = @NO;
+ testStruct.coolingEnabled = @YES;
+ testStruct.heatingLevel = @25;
+ testStruct.coolingLevel = @10;
+
+ testStruct.horizontalPosition = @23;
+ testStruct.verticalPosition = @25;
+ testStruct.frontVerticalPosition = @12;
+ testStruct.backVerticalPosition = @34;
+ testStruct.backTiltAngle = @12;
+
+ testStruct.headSupportHorizontalPosition = @3;
+ testStruct.headSupportVerticalPosition = @43;
+
+ testStruct.massageEnabled = @YES;
+ testStruct.massageMode = [@[massageModeData] copy];
+ testStruct.massageCushionFirmness = [@[massageCushionFirmness] copy];
+ testStruct.memory = seatMemoryAction;
+
+ expect(testStruct.id).to(equal(SDLSupportedSeatDriver));
+ expect(testStruct.heatingEnabled).to(equal(@NO));
+ expect(testStruct.coolingEnabled).to(equal(@YES));
+ expect(testStruct.heatingLevel).to(equal(@25));
+ expect(testStruct.coolingLevel).to(equal(@10));
+ expect(testStruct.horizontalPosition).to(equal(@23));
+ expect(testStruct.verticalPosition).to(equal(@25));
+ expect(testStruct.frontVerticalPosition).to(equal(@12));
+ expect(testStruct.backVerticalPosition).to(equal(@34));
+ expect(testStruct.backTiltAngle).to(equal(@12));
+ expect(testStruct.headSupportHorizontalPosition).to(equal(@3));
+ expect(testStruct.headSupportVerticalPosition).to(equal(@43));
+ expect(testStruct.massageEnabled).to(equal(@YES));
+ expect(testStruct.massageMode).to(equal([@[massageModeData] copy]));
+ expect(testStruct.massageCushionFirmness).to(equal([@[massageCushionFirmness] copy]));
+ expect(testStruct.memory).to(equal(seatMemoryAction));
+
+ });
+
+ it(@"Should set and get correctly", ^ {
+ SDLSeatControlData* testStruct = [[SDLSeatControlData alloc] initWithId:SDLSupportedSeatDriver heatingEnabled:NO coolingEnable:YES heatingLevel:25 coolingLevel:10 horizontalPostion:23 verticalPostion:25 frontVerticalPostion:12 backVerticalPostion:25 backTiltAngle:2 headSupportedHorizontalPostion:3 headSupportedVerticalPostion:43 massageEnabled:YES massageMode:[@[massageModeData] copy] massageCussionFirmness:[@[massageCushionFirmness] copy] memory:seatMemoryAction];
+
+ expect(testStruct.id).to(equal(SDLSupportedSeatDriver));
+ expect(testStruct.heatingEnabled).to(equal(@NO));
+ expect(testStruct.coolingEnabled).to(equal(@YES));
+ expect(testStruct.heatingLevel).to(equal(@25));
+ expect(testStruct.coolingLevel).to(equal(@10));
+ expect(testStruct.horizontalPosition).to(equal(@23));
+ expect(testStruct.verticalPosition).to(equal(@25));
+ expect(testStruct.frontVerticalPosition).to(equal(@12));
+ expect(testStruct.backVerticalPosition).to(equal(@25));
+ expect(testStruct.backTiltAngle).to(equal(@2));
+ expect(testStruct.headSupportHorizontalPosition).to(equal(@3));
+ expect(testStruct.headSupportVerticalPosition).to(equal(@43));
+ expect(testStruct.massageEnabled).to(equal(@YES));
+ expect(testStruct.massageMode).to(equal([@[massageModeData] copy]));
+ expect(testStruct.massageCushionFirmness).to(equal([@[massageCushionFirmness] copy]));
+ expect(testStruct.memory).to(equal(seatMemoryAction));
+
+ });
+
+ it(@"Should set and get correctly", ^ {
+ SDLSeatControlData* testStruct = [[SDLSeatControlData alloc] initWithId:SDLSupportedSeatDriver];
+
+ expect(testStruct.id).to(equal(SDLSupportedSeatDriver));
+ expect(testStruct.heatingEnabled).to(beNil());
+ expect(testStruct.coolingEnabled).to(beNil());
+ expect(testStruct.heatingLevel).to(beNil());
+ expect(testStruct.coolingLevel).to(beNil());
+ expect(testStruct.horizontalPosition).to(beNil());
+ expect(testStruct.verticalPosition).to(beNil());
+ expect(testStruct.frontVerticalPosition).to(beNil());
+ expect(testStruct.backVerticalPosition).to(beNil());
+ expect(testStruct.backTiltAngle).to(beNil());
+ expect(testStruct.headSupportHorizontalPosition).to(beNil());
+ expect(testStruct.headSupportVerticalPosition).to(beNil());
+ expect(testStruct.massageEnabled).to(beNil());
+ expect(testStruct.massageMode).to(beNil());
+ expect(testStruct.massageCushionFirmness).to(beNil());
+ expect(testStruct.memory).to(beNil());
+
+ });
+
+ it(@"Should get correctly when initialized", ^ {
+ NSMutableDictionary* dict = [@{SDLNameId:SDLSupportedSeatDriver,
+ SDLNameHeatingEnabled:@NO,
+ SDLNameCoolingEnabled:@YES,
+ SDLNameHeatingLevel:@25,
+ SDLNameCoolingLevel:@10,
+ SDLNameHorizontalPosition:@23,
+ SDLNameVerticalPosition:@25,
+ SDLNameFrontVerticalPosition:@12,
+ SDLNameBackVerticalPosition:@34,
+ SDLNameBackTiltAngle:@2,
+ SDLNameHeadSupportHorizontalPosition:@3,
+ SDLNameHeadSupportVerticalPosition:@43,
+ SDLNameMassageEnabled:@YES,
+ SDLNameMassageMode:[@[massageModeData] mutableCopy],
+ SDLNameMassageCushionFirmness:[@[massageCushionFirmness] mutableCopy],
+ SDLNameMemory:seatMemoryAction
+ } mutableCopy];
+ SDLSeatControlData *testStruct = [[SDLSeatControlData alloc] initWithDictionary:dict];
+
+ expect(testStruct.id).to(equal(SDLSupportedSeatDriver));
+ expect(testStruct.heatingEnabled).to(equal(@NO));
+ expect(testStruct.coolingEnabled).to(equal(@YES));
+ expect(testStruct.heatingLevel).to(equal(@25));
+ expect(testStruct.coolingLevel).to(equal(@10));
+ expect(testStruct.horizontalPosition).to(equal(@23));
+ expect(testStruct.verticalPosition).to(equal(@25));
+ expect(testStruct.frontVerticalPosition).to(equal(@12));
+ expect(testStruct.backVerticalPosition).to(equal(@34));
+ expect(testStruct.backTiltAngle).to(equal(@2));
+ expect(testStruct.headSupportHorizontalPosition).to(equal(@3));
+ expect(testStruct.headSupportVerticalPosition).to(equal(@43));
+ expect(testStruct.massageEnabled).to(equal(@YES));
+ expect(testStruct.massageMode).to(equal([@[massageModeData] mutableCopy]));
+ expect(testStruct.massageCushionFirmness).to(equal([@[massageCushionFirmness] mutableCopy]));
+ expect(testStruct.memory).to(equal(seatMemoryAction));
+ });
+
+ it(@"Should return nil if not set", ^ {
+ SDLSeatControlData* testStruct = [[SDLSeatControlData alloc] init];
+
+ expect(testStruct.id).to(beNil());
+ expect(testStruct.heatingEnabled).to(beNil());
+ expect(testStruct.coolingEnabled).to(beNil());
+ expect(testStruct.heatingLevel).to(beNil());
+ expect(testStruct.coolingLevel).to(beNil());
+ expect(testStruct.horizontalPosition).to(beNil());
+ expect(testStruct.verticalPosition).to(beNil());
+ expect(testStruct.frontVerticalPosition).to(beNil());
+ expect(testStruct.backVerticalPosition).to(beNil());
+ expect(testStruct.backTiltAngle).to(beNil());
+ expect(testStruct.headSupportHorizontalPosition).to(beNil());
+ expect(testStruct.headSupportVerticalPosition).to(beNil());
+ expect(testStruct.massageEnabled).to(beNil());
+ expect(testStruct.massageMode).to(beNil());
+ expect(testStruct.massageCushionFirmness).to(beNil());
+ expect(testStruct.memory).to(beNil());
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatMemoryActionSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatMemoryActionSpec.m
new file mode 100644
index 000000000..a256e50a8
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatMemoryActionSpec.m
@@ -0,0 +1,60 @@
+//
+// SDLSeatMemoryActionSpec.m
+// SmartDeviceLinkTests
+//
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLNames.h"
+#import "SDLSeatMemoryAction.h"
+
+QuickSpecBegin(SDLSeatMemoryActionSpec)
+
+describe(@"Getter/Setter Tests", ^ {
+ it(@"Should set and get correctly", ^ {
+ SDLSeatMemoryAction* testStruct = [[SDLSeatMemoryAction alloc] init];
+
+ testStruct.id = @12;
+ testStruct.action = SDLSeatMemoryActionTypeSave;
+ testStruct.label = @"Save";
+
+ expect(testStruct.id).to(equal(@12));
+ expect(testStruct.action).to(equal(SDLSeatMemoryActionTypeSave));
+ expect(testStruct.label).to(equal(@"Save"));
+
+ });
+
+ it(@"Should set and get correctly", ^ {
+ SDLSeatMemoryAction* testStruct = [[SDLSeatMemoryAction alloc] initWithId:23 label:@"restore" action:SDLSeatMemoryActionTypeRestore];
+
+ expect(testStruct.id).to(equal(@23));
+ expect(testStruct.action).to(equal(SDLSeatMemoryActionTypeRestore));
+ expect(testStruct.label).to(equal(@"restore"));
+
+ });
+
+ it(@"Should get correctly when initialized", ^ {
+ NSMutableDictionary* dict = [@{SDLNameId:@54,
+ SDLNameLabel:@"none",
+ SDLNameAction: SDLSeatMemoryActionTypeNone
+ } mutableCopy];
+ SDLSeatMemoryAction *testStruct = [[SDLSeatMemoryAction alloc] initWithDictionary:dict];
+
+ expect(testStruct.id).to(equal(@54));
+ expect(testStruct.action).to(equal(SDLSeatMemoryActionTypeNone));
+ expect(testStruct.label).to(equal(@"none"));
+ });
+
+ it(@"Should return nil if not set", ^ {
+ SDLSeatMemoryAction* testStruct = [[SDLSeatMemoryAction alloc] init];
+
+ expect(testStruct.id).to(beNil());
+ expect(testStruct.action).to(beNil());
+ expect(testStruct.label).to(beNil());
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSingleTireStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSingleTireStatusSpec.m
index 69c0d347d..1fc06535e 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSingleTireStatusSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSingleTireStatusSpec.m
@@ -19,21 +19,33 @@ describe(@"Getter/Setter Tests", ^ {
SDLSingleTireStatus* testStruct = [[SDLSingleTireStatus alloc] init];
testStruct.status = SDLComponentVolumeStatusNormal;
+ testStruct.monitoringSystemStatus = SDLTPMSLow;
+ testStruct.pressure = @67.78;
expect(testStruct.status).to(equal(SDLComponentVolumeStatusNormal));
+ expect(testStruct.monitoringSystemStatus).to(equal(SDLTPMSLow));
+ expect(testStruct.pressure).to(equal(@67.78));
});
it(@"Should get correctly when initialized", ^ {
- NSMutableDictionary* dict = [@{SDLNameStatus:SDLComponentVolumeStatusLow} mutableCopy];
+ NSDictionary* dict = @{
+ SDLNameStatus: SDLComponentVolumeStatusLow,
+ SDLNameTPMS: SDLTPMSLow,
+ SDLNamePressure: @67.78
+ };
SDLSingleTireStatus* testStruct = [[SDLSingleTireStatus alloc] initWithDictionary:dict];
expect(testStruct.status).to(equal(SDLComponentVolumeStatusLow));
+ expect(testStruct.monitoringSystemStatus).to(equal(SDLTPMSLow));
+ expect(testStruct.pressure).to(equal(@67.78));
});
it(@"Should return nil if not set", ^ {
SDLSingleTireStatus* testStruct = [[SDLSingleTireStatus alloc] init];
expect(testStruct.status).to(beNil());
+ expect(testStruct.monitoringSystemStatus).to(beNil());
+ expect(testStruct.pressure).to(beNil());
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTTSChunkSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTTSChunkSpec.m
index 52fef2d53..ef4d741ec 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTTSChunkSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTTSChunkSpec.m
@@ -15,32 +15,98 @@
QuickSpecBegin(SDLTTSChunkSpec)
-describe(@"Getter/Setter Tests", ^ {
- it(@"Should set and get correctly", ^ {
- SDLTTSChunk* testStruct = [[SDLTTSChunk alloc] init];
-
- testStruct.text = @"TEXT";
- testStruct.type = SDLSpeechCapabilitiesPrerecorded;
-
- expect(testStruct.text).to(equal(@"TEXT"));
- expect(testStruct.type).to(equal(SDLSpeechCapabilitiesPrerecorded));
- });
-
- it(@"Should get correctly when initialized", ^ {
- NSMutableDictionary* dict = [@{SDLNameText:@"TEXT",
- SDLNameType:SDLSpeechCapabilitiesPrerecorded} mutableCopy];
- SDLTTSChunk* testStruct = [[SDLTTSChunk alloc] initWithDictionary:dict];
-
- expect(testStruct.text).to(equal(@"TEXT"));
- expect(testStruct.type).to(equal(SDLSpeechCapabilitiesPrerecorded));
+describe(@"TTS Chunk Tests", ^{
+ __block SDLTTSChunk *testStruct = nil;
+ __block NSArray<SDLTTSChunk *> *testChunks = nil;
+ __block NSString *testText = @"Text";
+ __block SDLSpeechCapabilities testCapabilities = SDLSpeechCapabilitiesFile;
+
+ describe(@"initializers", ^{
+ it(@"should correctly initialize with init", ^{
+ testStruct = [[SDLTTSChunk alloc] init];
+
+ expect(testStruct.text).to(beNil());
+ expect(testStruct.type).to(beNil());
+ });
+
+ it(@"should correctly initialize with initWithDictionary", ^{
+ NSDictionary* dict = @{SDLNameText: testText,
+ SDLNameType: testCapabilities};
+ testStruct = [[SDLTTSChunk alloc] initWithDictionary:dict];
+
+ expect(testStruct.text).to(equal(testText));
+ expect(testStruct.type).to(equal(testCapabilities));
+ });
+
+ it(@"should correctly initialize with initWithText:type:", ^{
+ testStruct = [[SDLTTSChunk alloc] initWithText:testText type:testCapabilities];
+
+ expect(testStruct.text).to(equal(testText));
+ expect(testStruct.type).to(equal(testCapabilities));
+ });
+
+ it(@"should correctly initialize with textChunksFromString:", ^{
+ testChunks = [SDLTTSChunk textChunksFromString:testText];
+
+ expect(testChunks).to(haveCount(1));
+ expect(testChunks[0].text).to(equal(testText));
+ expect(testChunks[0].type).to(equal(SDLSpeechCapabilitiesText));
+ });
+
+ it(@"should correctly initialize with sapiChunksFromString:", ^{
+ testChunks = [SDLTTSChunk sapiChunksFromString:testText];
+
+ expect(testChunks).to(haveCount(1));
+ expect(testChunks[0].text).to(equal(testText));
+ expect(testChunks[0].type).to(equal(SDLSpeechCapabilitiesSAPIPhonemes));
+ });
+
+ it(@"should correctly initialize with lhPlusChunksFromString:", ^{
+ testChunks = [SDLTTSChunk lhPlusChunksFromString:testText];
+
+ expect(testChunks).to(haveCount(1));
+ expect(testChunks[0].text).to(equal(testText));
+ expect(testChunks[0].type).to(equal(SDLSpeechCapabilitiesLHPlusPhonemes));
+ });
+
+ it(@"should correctly initialize with prerecordedChunksFromString:", ^{
+ testChunks = [SDLTTSChunk prerecordedChunksFromString:testText];
+
+ expect(testChunks).to(haveCount(1));
+ expect(testChunks[0].text).to(equal(testText));
+ expect(testChunks[0].type).to(equal(SDLSpeechCapabilitiesPrerecorded));
+ });
+
+ it(@"should correctly initialize with silenceChunksFromString:", ^{
+ testChunks = [SDLTTSChunk silenceChunks];
+
+ expect(testChunks).to(haveCount(1));
+ expect(testChunks[0].text).to(beEmpty());
+ expect(testChunks[0].type).to(equal(SDLSpeechCapabilitiesSilence));
+ });
+
+ it(@"should correctly initialize with fileChunksWithName:", ^{
+ testChunks = [SDLTTSChunk fileChunksWithName:testText];
+
+ expect(testChunks).to(haveCount(1));
+ expect(testChunks[0].text).to(equal(testText));
+ expect(testChunks[0].type).to(equal(SDLSpeechCapabilitiesFile));
+ });
});
-
- it(@"Should return nil if not set", ^ {
- SDLTTSChunk* testStruct = [[SDLTTSChunk alloc] init];
-
- expect(testStruct.text).to(beNil());
- expect(testStruct.type).to(beNil());
+
+ describe(@"Getter/Setter Tests", ^ {
+ it(@"Should set and get correctly", ^ {
+ SDLTTSChunk* testStruct = [[SDLTTSChunk alloc] init];
+
+ testStruct.text = testText;
+ testStruct.type = testCapabilities;
+
+ expect(testStruct.text).to(equal(testText));
+ expect(testStruct.type).to(equal(testCapabilities));
+ });
});
});
+
+
QuickSpecEnd
diff --git a/SmartDeviceLink_Example/AppConstants.h b/SmartDeviceLink_Example/AppConstants.h
index 91c615fde..649909d43 100644
--- a/SmartDeviceLink_Example/AppConstants.h
+++ b/SmartDeviceLink_Example/AppConstants.h
@@ -82,6 +82,7 @@ extern NSString * const ACClusterModeStatusMenuName;
extern NSString * const ACDeviceStatusMenuName;
extern NSString * const ACDriverBrakingMenuName;
extern NSString * const ACECallInfoMenuName;
+extern NSString * const ACElectronicParkBrakeStatus;
extern NSString * const ACEmergencyEventMenuName;
extern NSString * const ACEngineOilLifeMenuName;
extern NSString * const ACEngineTorqueMenuName;
@@ -99,6 +100,7 @@ extern NSString * const ACRPMMenuName;
extern NSString * const ACSpeedMenuName;
extern NSString * const ACSteeringWheelAngleMenuName;
extern NSString * const ACTirePressureMenuName;
+extern NSString * const ACTurnSignalMenuName;
extern NSString * const ACVINMenuName;
extern NSString * const ACWiperStatusMenuName;
diff --git a/SmartDeviceLink_Example/AppConstants.m b/SmartDeviceLink_Example/AppConstants.m
index ff4e54cbd..490016105 100644
--- a/SmartDeviceLink_Example/AppConstants.m
+++ b/SmartDeviceLink_Example/AppConstants.m
@@ -80,6 +80,7 @@ NSString * const ACClusterModeStatusMenuName = @"Cluster Mode Status";
NSString * const ACDeviceStatusMenuName = @"Device Status";
NSString * const ACDriverBrakingMenuName = @"Driver Braking";
NSString * const ACECallInfoMenuName = @"eCall Info";
+NSString * const ACElectronicParkBrakeStatus = @"Electronic Parking Brake Status";
NSString * const ACEmergencyEventMenuName = @"Emergency Event";
NSString * const ACEngineOilLifeMenuName = @"Engine Oil Life";
NSString * const ACEngineTorqueMenuName = @"Engine Torque";
@@ -97,6 +98,7 @@ NSString * const ACRPMMenuName = @"RPM";
NSString * const ACSpeedMenuName = @"Speed";
NSString * const ACSteeringWheelAngleMenuName = @"Steering Wheel Angle";
NSString * const ACTirePressureMenuName = @"Tire Pressure";
+NSString * const ACTurnSignalMenuName = @"Turn Signal";
NSString * const ACVINMenuName = @"VIN";
NSString * const ACWiperStatusMenuName = @"Wiper Status";
diff --git a/SmartDeviceLink_Example/ConnectionIAPTableViewController.storyboard b/SmartDeviceLink_Example/ConnectionIAPTableViewController.storyboard
index ef04daa8e..44ec1e58b 100644
--- a/SmartDeviceLink_Example/ConnectionIAPTableViewController.storyboard
+++ b/SmartDeviceLink_Example/ConnectionIAPTableViewController.storyboard
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="J12-ul-Tx1">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="J12-ul-Tx1">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
@@ -13,7 +13,7 @@
<!--ConnectionIAP Table View Controller-->
<scene sceneID="kGx-OZ-JDF">
<objects>
- <tableViewController storyboardIdentifier="ConnectionIAPTableViewController" id="J12-ul-Tx1" customClass="ConnectionIAPTableViewController" customModule="SmartDeviceLink_Example_Swift" customModuleProvider="target" sceneMemberID="viewController">
+ <tableViewController storyboardIdentifier="ConnectionIAPTableViewController" id="J12-ul-Tx1" customClass="ConnectionIAPTableViewController" customModule="SDL_Example_Swift" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="MzB-GZ-Ook">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
diff --git a/SmartDeviceLink_Example/ConnectionTCPTableViewController.storyboard b/SmartDeviceLink_Example/ConnectionTCPTableViewController.storyboard
index fc112572c..ff8be7363 100644
--- a/SmartDeviceLink_Example/ConnectionTCPTableViewController.storyboard
+++ b/SmartDeviceLink_Example/ConnectionTCPTableViewController.storyboard
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="l5Q-ZP-1BO">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="l5Q-ZP-1BO">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
@@ -13,7 +13,7 @@
<!--ConnectionTCP Table View Controller-->
<scene sceneID="geJ-kX-PTm">
<objects>
- <tableViewController storyboardIdentifier="ConnectionTCPTableViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="l5Q-ZP-1BO" customClass="ConnectionTCPTableViewController" customModule="SDL_Example" customModuleProvider="target" sceneMemberID="viewController">
+ <tableViewController storyboardIdentifier="ConnectionTCPTableViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="l5Q-ZP-1BO" customClass="ConnectionTCPTableViewController" customModule="SDL_Example_Swift" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="7ZH-AV-Zyf">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
diff --git a/SmartDeviceLink_Example/Main.storyboard b/SmartDeviceLink_Example/Main.storyboard
index 81cd0bdcf..7415d792f 100644
--- a/SmartDeviceLink_Example/Main.storyboard
+++ b/SmartDeviceLink_Example/Main.storyboard
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="mM3-m6-I5t">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="mM3-m6-I5t">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
@@ -30,7 +30,7 @@
<!--Connection Container View Controller-->
<scene sceneID="vG9-Hv-OW2">
<objects>
- <viewController id="cXb-Co-0MA" customClass="ConnectionContainerViewController" customModule="SDL_Example" customModuleProvider="target" sceneMemberID="viewController">
+ <viewController id="cXb-Co-0MA" customClass="ConnectionContainerViewController" customModule="SDL_Example_Swift" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="bfp-O0-sxl"/>
<viewControllerLayoutGuide type="bottom" id="fet-m3-F1O"/>
diff --git a/SmartDeviceLink_Example/MenuManager.m b/SmartDeviceLink_Example/MenuManager.m
index d9af5d408..1a7a86db3 100644
--- a/SmartDeviceLink_Example/MenuManager.m
+++ b/SmartDeviceLink_Example/MenuManager.m
@@ -55,11 +55,11 @@ NS_ASSUME_NONNULL_BEGIN
[submenuItems addObject:cell];
}
- return [[SDLMenuCell alloc] initWithTitle:ACGetAllVehicleDataMenuName subCells:submenuItems];
+ return [[SDLMenuCell alloc] initWithTitle:ACGetAllVehicleDataMenuName icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:CarBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] subCells:submenuItems];
}
+ (NSArray<NSString *> *)sdlex_allVehicleDataTypes {
- return @[ACAccelerationPedalPositionMenuName, ACAirbagStatusMenuName, ACBeltStatusMenuName, ACBodyInformationMenuName, ACClusterModeStatusMenuName, ACDeviceStatusMenuName, ACDriverBrakingMenuName, ACECallInfoMenuName, ACEmergencyEventMenuName, ACEngineOilLifeMenuName, ACEngineTorqueMenuName, ACExternalTemperatureMenuName, ACFuelLevelMenuName, ACFuelLevelStateMenuName, ACFuelRangeMenuName, ACGPSMenuName, ACHeadLampStatusMenuName, ACInstantFuelConsumptionMenuName, ACMyKeyMenuName, ACOdometerMenuName, ACPRNDLMenuName, ACRPMMenuName, ACSpeedMenuName, ACSteeringWheelAngleMenuName, ACTirePressureMenuName, ACVINMenuName, ACWiperStatusMenuName];
+ return @[ACAccelerationPedalPositionMenuName, ACAirbagStatusMenuName, ACBeltStatusMenuName, ACBodyInformationMenuName, ACClusterModeStatusMenuName, ACDeviceStatusMenuName, ACDriverBrakingMenuName, ACECallInfoMenuName, ACElectronicParkBrakeStatus, ACEmergencyEventMenuName, ACEngineOilLifeMenuName, ACEngineTorqueMenuName, ACExternalTemperatureMenuName, ACFuelLevelMenuName, ACFuelLevelStateMenuName, ACFuelRangeMenuName, ACGPSMenuName, ACHeadLampStatusMenuName, ACInstantFuelConsumptionMenuName, ACMyKeyMenuName, ACOdometerMenuName, ACPRNDLMenuName, ACRPMMenuName, ACSpeedMenuName, ACSteeringWheelAngleMenuName, ACTirePressureMenuName, ACTurnSignalMenuName, ACVINMenuName, ACWiperStatusMenuName];
}
+ (SDLMenuCell *)sdlex_menuCellShowPerformInteractionWithManager:(SDLManager *)manager performManager:(PerformInteractionManager *)performManager {
@@ -95,7 +95,7 @@ NS_ASSUME_NONNULL_BEGIN
[submenuItems addObject:cell];
}
- return [[SDLMenuCell alloc] initWithTitle:ACSubmenuMenuName subCells:[submenuItems copy]];
+ return [[SDLMenuCell alloc] initWithTitle:ACSubmenuMenuName icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:MenuBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] subCells:[submenuItems copy]];
}
#pragma mark - Voice Commands
diff --git a/SmartDeviceLink_Example/MenuManager.swift b/SmartDeviceLink_Example/MenuManager.swift
index 775c05f5c..959265a74 100644
--- a/SmartDeviceLink_Example/MenuManager.swift
+++ b/SmartDeviceLink_Example/MenuManager.swift
@@ -59,16 +59,17 @@ private extension MenuManager {
/// - Returns: A SDLMenuCell object
class func menuCellGetAllVehicleData(with manager: SDLManager) -> SDLMenuCell {
let submenuItems = allVehicleDataTypes.map { submenuName in
- SDLMenuCell(title: submenuName, icon: nil, voiceCommands: [submenuName], handler: { triggerSource in
+ SDLMenuCell(title: submenuName, icon: nil, voiceCommands: nil, handler: { triggerSource in
VehicleDataManager.getAllVehicleData(with: manager, triggerSource: triggerSource, vehicleDataType: submenuName)
})
}
- return SDLMenuCell(title: ACGetAllVehicleDataMenuName, subCells: submenuItems)
+
+ return SDLMenuCell(title: ACGetAllVehicleDataMenuName, icon: SDLArtwork(image: UIImage(named: CarBWIconImageName)!.withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), subCells: submenuItems)
}
/// A list of all possible vehicle data types
static var allVehicleDataTypes: [String] {
- return [ACAccelerationPedalPositionMenuName, ACAirbagStatusMenuName, ACBeltStatusMenuName, ACBodyInformationMenuName, ACClusterModeStatusMenuName, ACDeviceStatusMenuName, ACDriverBrakingMenuName, ACECallInfoMenuName, ACEmergencyEventMenuName, ACEngineOilLifeMenuName, ACEngineTorqueMenuName, ACExternalTemperatureMenuName, ACFuelLevelMenuName, ACFuelLevelStateMenuName, ACFuelRangeMenuName, ACGPSMenuName, ACHeadLampStatusMenuName, ACInstantFuelConsumptionMenuName, ACMyKeyMenuName, ACOdometerMenuName, ACPRNDLMenuName, ACRPMMenuName, ACSpeedMenuName, ACSteeringWheelAngleMenuName, ACTirePressureMenuName, ACVINMenuName, ACWiperStatusMenuName]
+ return [ACAccelerationPedalPositionMenuName, ACAirbagStatusMenuName, ACBeltStatusMenuName, ACBodyInformationMenuName, ACClusterModeStatusMenuName, ACDeviceStatusMenuName, ACDriverBrakingMenuName, ACECallInfoMenuName, ACElectronicParkBrakeStatus, ACEmergencyEventMenuName, ACEngineOilLifeMenuName, ACEngineTorqueMenuName, ACExternalTemperatureMenuName, ACFuelLevelMenuName, ACFuelLevelStateMenuName, ACFuelRangeMenuName, ACGPSMenuName, ACHeadLampStatusMenuName, ACInstantFuelConsumptionMenuName, ACMyKeyMenuName, ACOdometerMenuName, ACPRNDLMenuName, ACRPMMenuName, ACSpeedMenuName, ACSteeringWheelAngleMenuName, ACTirePressureMenuName, ACTurnSignalMenuName, ACVINMenuName, ACWiperStatusMenuName]
}
/// Menu item that shows a custom menu (i.e. a Perform Interaction Choice Set) when selected
@@ -119,9 +120,9 @@ private extension MenuManager {
/// - Returns: A SDLMenuCell object
class func menuCellWithSubmenu(with manager: SDLManager) -> SDLMenuCell {
var submenuItems = [SDLMenuCell]()
- for i in 0..<75 {
+ for i in 0 ..< 10 {
let submenuTitle = "Submenu Item \(i)"
- submenuItems.append(SDLMenuCell(title: submenuTitle, icon: SDLArtwork(image: UIImage(named: MenuBWIconImageName)!, persistent: true, as: .PNG), voiceCommands: [submenuTitle, "Item \(i)", "\(i)"], handler: { (triggerSource) in
+ submenuItems.append(SDLMenuCell(title: submenuTitle, icon: SDLArtwork(image: UIImage(named: MenuBWIconImageName)!.withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), voiceCommands: nil, handler: { (triggerSource) in
let message = "\(submenuTitle) selected!"
switch triggerSource {
case .menu:
@@ -132,8 +133,8 @@ private extension MenuManager {
}
}))
}
-
- return SDLMenuCell(title: ACSubmenuMenuName, subCells: submenuItems)
+
+ return SDLMenuCell(title: ACSubmenuMenuName, icon: SDLArtwork(image: #imageLiteral(resourceName: "choice_set").withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), subCells: submenuItems)
}
}
diff --git a/SmartDeviceLink_Example/TextValidator.h b/SmartDeviceLink_Example/TextValidator.h
new file mode 100644
index 000000000..df8a12321
--- /dev/null
+++ b/SmartDeviceLink_Example/TextValidator.h
@@ -0,0 +1,19 @@
+//
+// TextValidator.h
+// SmartDeviceLink
+//
+// Created by Nicole on 7/20/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TextValidator : NSObject
+
++ (NSString *)validateText:(NSString *)text length:(UInt8)length;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink_Example/TextValidator.m b/SmartDeviceLink_Example/TextValidator.m
new file mode 100644
index 000000000..2e14c4797
--- /dev/null
+++ b/SmartDeviceLink_Example/TextValidator.m
@@ -0,0 +1,43 @@
+//
+// TextValidator.m
+// SmartDeviceLink
+//
+// Created by Nicole on 7/20/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+#import "TextValidator.h"
+
+@implementation TextValidator
+
+static NSString *validCharacters = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789. ";
+
++ (NSString *)validateText:(NSString *)text length:(UInt8)length {
+ if (text.length == 0) { return text; }
+ NSString *filteredText = [self sdlex_filterUnsupportedCharactersFromText:text];
+ NSString *condensedText = [self sdlex_condenseWhitespace:filteredText];
+ NSString *truncatedText = [self sdlex_truncateText:condensedText length:length];
+ return truncatedText;
+}
+
++ (NSString *)sdlex_filterUnsupportedCharactersFromText:(NSString *)text {
+ NSCharacterSet *supportedCharacters = [NSCharacterSet characterSetWithCharactersInString:validCharacters];
+ return [[text componentsSeparatedByCharactersInSet:supportedCharacters.invertedSet] componentsJoinedByString:@" "];
+}
+
++ (NSString *)sdlex_truncateText:(NSString *)text length:(UInt8)length {
+ return [text substringToIndex:MIN(length, text.length)];
+}
+
++ (NSString *)sdlex_condenseWhitespace:(NSString *)text {
+ NSArray<NSString *> *components = [text componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
+
+ NSMutableArray<NSString *> *nonEmptyComponents = [NSMutableArray array];
+ for (NSString *string in components) {
+ if (string.length == 0) { continue; }
+ [nonEmptyComponents addObject:string];
+ }
+ return [nonEmptyComponents componentsJoinedByString:@" "];
+}
+
+@end
diff --git a/SmartDeviceLink_Example/TextValidator.swift b/SmartDeviceLink_Example/TextValidator.swift
new file mode 100644
index 000000000..3c0e5645e
--- /dev/null
+++ b/SmartDeviceLink_Example/TextValidator.swift
@@ -0,0 +1,36 @@
+//
+// TextValidator.swift
+// SmartDeviceLink
+//
+// Created by Nicole on 7/20/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+import Foundation
+
+class TextValidator {
+ private static let validCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789. "
+
+ class func validateText(_ text: String, length: Int) -> String {
+ if text.isEmpty { return text }
+ let filteredText = filterUnsupportedCharacters(text)
+ let condensedString = filteredText.condenseWhitespace
+ let truncatedString = condensedString.truncate(length: length)
+ return truncatedString
+ }
+
+ private class func filterUnsupportedCharacters(_ text:String) -> String {
+ return String(text.filter { validCharacters.contains($0) } )
+ }
+}
+
+extension String {
+ func truncate(length: Int, trailing: String = "…") -> String {
+ return (self.count > length) ? self.prefix(length) + trailing : self
+ }
+
+ var condenseWhitespace: String {
+ let components = self.components(separatedBy: .whitespacesAndNewlines)
+ return components.filter { !$0.isEmpty }.joined(separator: " ")
+ }
+}
diff --git a/SmartDeviceLink_Example/VehicleDataManager.m b/SmartDeviceLink_Example/VehicleDataManager.m
index 85ac0ff1c..999a22616 100644
--- a/SmartDeviceLink_Example/VehicleDataManager.m
+++ b/SmartDeviceLink_Example/VehicleDataManager.m
@@ -7,9 +7,10 @@
//
#import "AlertManager.h"
-#import "VehicleDataManager.h"
#import "AppConstants.h"
#import "SmartDeviceLink.h"
+#import "TextValidator.h"
+#import "VehicleDataManager.h"
NS_ASSUME_NONNULL_BEGIN
@@ -127,12 +128,12 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Get Vehicle Data
/**
- * Retreives the current vehicle speed
+ * Retreives the current vehicle data
*
- * @param manager The SDL manager
+ * @param manager The SDL Manager
+ * @param triggerSource Whether the menu item was selected by voice or touch
+ * @param vehicleDataType The vehicle data to look for
*/
-
-
+ (void)getAllVehicleDataWithManager:(SDLManager *)manager triggerSource:(SDLTriggerSource)triggerSource vehicleDataType:(NSString *)vehicleDataType {
SDLLogD(@"Checking if app has permission to access vehicle data...");
if (![manager.permissionManager isRPCAllowed:@"GetVehicleData"]) {
@@ -141,9 +142,9 @@ NS_ASSUME_NONNULL_BEGIN
}
SDLLogD(@"App has permission to access vehicle data. Requesting vehicle data...");
- SDLGetVehicleData *getVehicleSpeed = [[SDLGetVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation:YES clusterModeStatus:YES deviceStatus:YES driverBraking:YES eCallInfo:YES emergencyEvent:YES engineOilLife:YES engineTorque:YES externalTemperature:YES fuelLevel:YES fuelLevelState:YES fuelRange:YES gps:YES headLampStatus:YES instantFuelConsumption:YES myKey:YES odometer:YES prndl:YES rpm:YES speed:YES steeringWheelAngle:YES tirePressure:YES vin:YES wiperStatus:YES];
+ SDLGetVehicleData *getAllVehicleData = [[SDLGetVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation:YES clusterModeStatus:YES deviceStatus:YES driverBraking:YES eCallInfo:YES electronicParkBrakeStatus:YES emergencyEvent:YES engineOilLife:YES engineTorque:YES externalTemperature:YES fuelLevel:YES fuelLevelState:YES fuelRange:YES gps:YES headLampStatus:YES instantFuelConsumption:YES myKey:YES odometer:YES prndl:YES rpm:YES speed:YES steeringWheelAngle:YES tirePressure:YES turnSignal:YES vin:YES wiperStatus:YES];
- [manager sendRequest:getVehicleSpeed withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ [manager sendRequest:getAllVehicleData withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
if (error || ![response isKindOfClass:SDLGetVehicleDataResponse.class]) {
[manager sendRequest:[AlertManager alertWithMessageAndCloseButton:@"Something went wrong while getting vehicle data" textField2:nil]];
return;
@@ -152,30 +153,39 @@ NS_ASSUME_NONNULL_BEGIN
SDLGetVehicleDataResponse *getVehicleDataResponse = (SDLGetVehicleDataResponse *)response;
SDLResult resultCode = getVehicleDataResponse.resultCode;
- NSMutableString *alertMessage = [NSMutableString string];
+ NSString *alertTitle = vehicleDataType;
+ NSString *alertMessage = nil;
+
if ([resultCode isEqualToEnum:SDLResultRejected]) {
SDLLogD(@"The request for vehicle data was rejected");
- [alertMessage appendString:@"Rejected"];
+ alertMessage = @"Rejected";
} else if ([resultCode isEqualToEnum:SDLResultDisallowed]) {
SDLLogD(@"This app does not have the required permissions to access vehicle data.");
- [alertMessage appendString:@"Disallowed"];
+ alertMessage = @"Disallowed";
} else if ([resultCode isEqualToEnum:SDLResultSuccess] || [resultCode isEqualToEnum:SDLResultDataNotAvailable]) {
SDLLogD(@"Request for vehicle data successful");
if (getVehicleDataResponse) {
- NSString *vehicleDataTypeDescription = [self sdlex_vehicleDataDescription:getVehicleDataResponse vehicleDataType:vehicleDataType];
- [alertMessage appendString:vehicleDataTypeDescription];
+ alertMessage = [self sdlex_vehicleDataDescription:getVehicleDataResponse vehicleDataType:vehicleDataType];
} else {
SDLLogE(@"No vehicle data returned");
- [alertMessage appendString:@"No vehicle data returned"];
+ alertMessage = @"No vehicle data returned";
}
}
- [triggerSource isEqualToEnum:SDLTriggerSourceMenu] ? [manager sendRequest:[AlertManager alertWithMessageAndCloseButton:alertMessage textField2:nil]] : [manager sendRequest:[[SDLSpeak alloc] initWithTTS:alertMessage]];
+ alertTitle = [TextValidator validateText:alertTitle length:25];
+ alertMessage = [TextValidator validateText:alertMessage length:200];
+
+ if ([triggerSource isEqualToEnum:SDLTriggerSourceMenu]) {
+ [manager sendRequest:[AlertManager alertWithMessageAndCloseButton:alertTitle textField2:alertMessage]];
+ } else {
+ NSString *spokenAlert = alertMessage ?: alertTitle;
+ [manager sendRequest:[[SDLSpeak alloc] initWithTTS:spokenAlert]];
+ }
}];
}
+ (NSString *)sdlex_vehicleDataDescription:(SDLGetVehicleDataResponse *)vehicleData vehicleDataType:(NSString *)vehicleDataType {
- NSString *vehicleDataDescription = @"";
+ NSString *vehicleDataDescription = nil;
if ([vehicleDataType isEqualToString:ACAccelerationPedalPositionMenuName]) {
vehicleDataDescription = vehicleData.accPedalPosition.description;
@@ -193,6 +203,8 @@ NS_ASSUME_NONNULL_BEGIN
vehicleDataDescription = vehicleData.driverBraking.description;
} else if ([vehicleDataType isEqualToString:ACECallInfoMenuName]) {
vehicleDataDescription = vehicleData.eCallInfo.description;
+ } else if ([vehicleDataType isEqualToEnum:ACElectronicParkBrakeStatus]) {
+ vehicleDataDescription = vehicleData.electronicParkBrakeStatus.description;
} else if ([vehicleDataType isEqualToString:ACEmergencyEventMenuName]) {
vehicleDataDescription = vehicleData.emergencyEvent.description;
} else if ([vehicleDataType isEqualToString:ACEngineOilLifeMenuName]) {
@@ -225,18 +237,13 @@ NS_ASSUME_NONNULL_BEGIN
vehicleDataDescription = vehicleData.steeringWheelAngle.description;
} else if ([vehicleDataType isEqualToString:ACTirePressureMenuName]) {
vehicleDataDescription = vehicleData.tirePressure.description;
+ } else if ([vehicleDataType isEqualToString:ACTurnSignalMenuName]) {
+ vehicleDataDescription = vehicleData.turnSignal.description;
} else if ([vehicleDataType isEqualToString: ACVINMenuName]) {
vehicleDataDescription = vehicleData.vin.description;
}
- NSString *vehicleDataTypeDescription = [NSString stringWithFormat:@"%@: %@", vehicleDataType, vehicleDataDescription != nil ? vehicleDataDescription : @"Vehicle data not available"];
-
- NSString *filteredNewlines = [vehicleDataTypeDescription stringByReplacingOccurrencesOfString:@"\\n" withString:@""];
- NSArray<NSString *> *filteredCharacters = [filteredNewlines componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 :."] invertedSet]];
- NSString *filteredString = [filteredCharacters componentsJoinedByString:@" "];
- NSString *truncatedString = [filteredString substringToIndex:MIN(500, [filteredString length])];
-
- return truncatedString;
+ return vehicleDataDescription ?: @"Vehicle data not available";
}
#pragma mark - Phone Calls
diff --git a/SmartDeviceLink_Example/VehicleDataManager.swift b/SmartDeviceLink_Example/VehicleDataManager.swift
index d670a5ec5..08b2881c3 100644
--- a/SmartDeviceLink_Example/VehicleDataManager.swift
+++ b/SmartDeviceLink_Example/VehicleDataManager.swift
@@ -111,41 +111,46 @@ extension VehicleDataManager {
guard hasPermissionToAccessVehicleData(with: manager) else { return }
SDLLog.d("App has permission to access vehicle data. Requesting all vehicle data...")
- let getAllVehicleData = SDLGetVehicleData(accelerationPedalPosition: true, airbagStatus: true, beltStatus: true, bodyInformation: true, clusterModeStatus: true, deviceStatus: true, driverBraking: true, eCallInfo: true, emergencyEvent: true, engineOilLife: true, engineTorque: true, externalTemperature: true, fuelLevel: true, fuelLevelState: true, fuelRange: true, gps: true, headLampStatus: true, instantFuelConsumption: true, myKey: true, odometer: true, prndl: true, rpm: true, speed: true, steeringWheelAngle: true, tirePressure: true, vin: true, wiperStatus: true)
+ let getAllVehicleData = SDLGetVehicleData(accelerationPedalPosition: true, airbagStatus: true, beltStatus: true, bodyInformation: true, clusterModeStatus: true, deviceStatus: true, driverBraking: true, eCallInfo: true, electronicParkBrakeStatus: true, emergencyEvent: true, engineOilLife: true, engineTorque: true, externalTemperature: true, fuelLevel: true, fuelLevelState: true, fuelRange: true, gps: true, headLampStatus: true, instantFuelConsumption: true, myKey: true, odometer: true, prndl: true, rpm: true, speed: true, steeringWheelAngle: true, tirePressure: true, turnSignal: true, vin: true, wiperStatus: true)
manager.send(request: getAllVehicleData) { (request, response, error) in
guard didAccessVehicleDataSuccessfully(with: manager, response: response, error: error) else { return }
- var alertMessage = ""
+ var alertTitle: String = ""
+ var alertMessage: String = ""
+
switch response!.resultCode {
case .rejected:
SDLLog.d("The request for vehicle data was rejected")
- alertMessage = "Rejected"
+ alertTitle = "Rejected"
case .disallowed:
SDLLog.d("This app does not have the required permissions to access vehicle data")
- alertMessage = "Disallowed"
+ alertTitle = "Disallowed"
case .success, .dataNotAvailable:
- SDLLog.d("Request for vehicle data successful")
if let vehicleData = response as? SDLGetVehicleDataResponse {
+ alertTitle = vehicleDataType
alertMessage = vehicleDataDescription(vehicleData, vehicleDataType: vehicleDataType)
+ SDLLog.d("Request for \(vehicleDataType) vehicle data successful, \(alertMessage)")
} else {
- SDLLog.e("No vehicle data returned")
- alertMessage = "No vehicle data returned"
+ alertTitle = "No vehicle data returned"
+ SDLLog.e(alertTitle)
}
default: break
}
- triggerSource == .menu ? manager.send(AlertManager.alertWithMessageAndCloseButton(alertMessage.isEmpty ? "No data available" : alertMessage)) : manager.send(SDLSpeak(tts: alertMessage))
- }
- }
+ alertTitle = TextValidator.validateText(alertTitle, length: 25)
+ alertMessage = TextValidator.validateText(alertMessage, length: 200)
- class func createVehicleDataAlertMessage(response: SDLRPCResponse?, vehicleDataType: String) -> String {
- if let vehicleData = response as? SDLGetVehicleDataResponse {
- SDLLog.d("Some vehicle data returned successfully")
- return vehicleDataDescription(vehicleData, vehicleDataType: vehicleDataType)
- } else {
- SDLLog.e("Vehicle data request successful, but no data was returned")
- return "Unknown"
+ if triggerSource == .menu {
+ let title = !alertTitle.isEmpty ? alertTitle : "No Vehicle Data Available"
+ let detailMessage = !alertMessage.isEmpty ? alertMessage : nil
+ let alert = AlertManager.alertWithMessageAndCloseButton(title,
+ textField2: detailMessage)
+ manager.send(alert)
+ } else {
+ let spokenAlert = !alertMessage.isEmpty ? alertMessage : alertTitle
+ manager.send(SDLSpeak(tts: spokenAlert))
+ }
}
}
@@ -161,62 +166,63 @@ extension VehicleDataManager {
var vehicleDataDescription = ""
switch vehicleDataType {
case ACAccelerationPedalPositionMenuName:
- vehicleDataDescription += vehicleData.accPedalPosition?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.accPedalPosition?.description ?? notAvailable
case ACAirbagStatusMenuName:
- vehicleDataDescription += vehicleData.airbagStatus?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.airbagStatus?.description ?? notAvailable
case ACBeltStatusMenuName:
- vehicleDataDescription += vehicleData.beltStatus?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.beltStatus?.description ?? notAvailable
case ACBodyInformationMenuName:
- vehicleDataDescription += vehicleData.bodyInformation?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.bodyInformation?.description ?? notAvailable
case ACClusterModeStatusMenuName:
- vehicleDataDescription += vehicleData.clusterModeStatus?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.clusterModeStatus?.description ?? notAvailable
case ACDeviceStatusMenuName:
- vehicleDataDescription += vehicleData.deviceStatus?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.deviceStatus?.description ?? notAvailable
case ACDriverBrakingMenuName:
- vehicleDataDescription += vehicleData.driverBraking?.rawValue.rawValue ?? notAvailable
+ vehicleDataDescription = vehicleData.driverBraking?.rawValue.rawValue ?? notAvailable
case ACECallInfoMenuName:
- vehicleDataDescription += vehicleData.eCallInfo?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.eCallInfo?.description ?? notAvailable
+ case ACElectronicParkBrakeStatus:
+ vehicleDataDescription = vehicleData.electronicParkBrakeStatus?.rawValue.rawValue ?? notAvailable
case ACEmergencyEventMenuName:
- vehicleDataDescription += vehicleData.emergencyEvent?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.emergencyEvent?.description ?? notAvailable
case ACEngineOilLifeMenuName:
- vehicleDataDescription += vehicleData.engineOilLife?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.engineOilLife?.description ?? notAvailable
case ACEngineTorqueMenuName:
- vehicleDataDescription += vehicleData.engineTorque?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.engineTorque?.description ?? notAvailable
case ACExternalTemperatureMenuName:
- vehicleDataDescription += vehicleData.externalTemperature?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.externalTemperature?.description ?? notAvailable
case ACFuelLevelMenuName:
- vehicleDataDescription += vehicleData.fuelLevel?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.fuelLevel?.description ?? notAvailable
case ACFuelLevelStateMenuName:
- vehicleDataDescription += vehicleData.fuelLevel_State?.rawValue.rawValue ?? notAvailable
+ vehicleDataDescription = vehicleData.fuelLevel_State?.rawValue.rawValue ?? notAvailable
case ACFuelRangeMenuName:
- vehicleDataDescription += vehicleData.fuelRange?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.fuelRange?.description ?? notAvailable
case ACGPSMenuName:
- vehicleDataDescription += vehicleData.gps?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.gps?.description ?? notAvailable
case ACHeadLampStatusMenuName:
- vehicleDataDescription += vehicleData.headLampStatus?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.headLampStatus?.description ?? notAvailable
case ACInstantFuelConsumptionMenuName:
- vehicleDataDescription += vehicleData.instantFuelConsumption?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.instantFuelConsumption?.description ?? notAvailable
case ACMyKeyMenuName:
- vehicleDataDescription += vehicleData.myKey?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.myKey?.description ?? notAvailable
case ACOdometerMenuName:
- vehicleDataDescription += vehicleData.odometer?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.odometer?.description ?? notAvailable
case ACPRNDLMenuName:
- vehicleDataDescription += vehicleData.prndl?.rawValue.rawValue ?? notAvailable
+ vehicleDataDescription = vehicleData.prndl?.rawValue.rawValue ?? notAvailable
case ACSpeedMenuName:
- vehicleDataDescription += vehicleData.speed?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.speed?.description ?? notAvailable
case ACSteeringWheelAngleMenuName:
- vehicleDataDescription += vehicleData.steeringWheelAngle?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.steeringWheelAngle?.description ?? notAvailable
case ACTirePressureMenuName:
- vehicleDataDescription += vehicleData.tirePressure?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.tirePressure?.description ?? notAvailable
+ case ACTurnSignalMenuName:
+ vehicleDataDescription = vehicleData.turnSignal?.rawValue.rawValue ?? notAvailable
case ACVINMenuName:
- vehicleDataDescription += vehicleData.vin?.description ?? notAvailable
+ vehicleDataDescription = vehicleData.vin?.description ?? notAvailable
default: break
}
- // Trim all non a-Z0-9 characters and truncate description to 500 characters
- let alertMessage = "\(vehicleDataType): \(vehicleDataDescription)"
- let alertMessageFiltered = String(alertMessage.filter { "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 :.".contains($0) })
- return alertMessageFiltered.trunc(length: 495, trailing: "")
+ return vehicleDataDescription
}
/// Checks if the app has the required permissions to access vehicle data
@@ -291,9 +297,3 @@ extension VehicleDataManager {
}
}
}
-
-extension String {
- func trunc(length: Int, trailing: String = "…") -> String {
- return (self.count > length) ? self.prefix(length) + trailing : self
- }
-}