From b3c68220793c49331fb52dd5ae607a1948821aa3 Mon Sep 17 00:00:00 2001 From: igapchuck Date: Thu, 10 Jan 2019 18:32:47 +0200 Subject: Feature: Remote Control - Radio and Climate Parameter Update. SDL remote control shall allow a mobile application to know which HD sub-channel index has a signal, so that the app can tune the HD radio to that sub-channel successfully. According to this motivation, "availableHDs" parameter of RadioControlData structure marks as deprecated since 5.1 API version and add new parameter "availableHdChannels" that is a collection of available HD radio channels. This parameter will be available since 5.1 API version. Also "availableHDsAvailable" parameter of RadioControlCapabilities structure marks as deprecated since 5.1 API version and add new parameter "availableHdChannelsAvailable" that will be available since 5.1 API version. SDL remote control shall allow a mobile application to turn the climate control on or off if the vehicle supports it. According to this motivation, "climateEnable" parameter add to ClimateControlData structure. Also "climateEnableAvailable" parameter add to ClimateControlCapabilities structure. --- src/appMain/hmi_capabilities.json | 3 ++- .../include/rc_rpc_plugin/rc_module_constants.h | 4 ++- .../mobile/get_interior_vehicle_data_request.cc | 2 +- .../mobile/set_interior_vehicle_data_request.cc | 8 +++--- .../hmi/rc_get_capabilities_response_test.cc | 2 +- src/components/interfaces/HMI_API.xml | 16 +++++++++--- src/components/interfaces/MOBILE_API.xml | 30 +++++++++++++++++++--- 7 files changed, 50 insertions(+), 15 deletions(-) diff --git a/src/appMain/hmi_capabilities.json b/src/appMain/hmi_capabilities.json index 873c80d32e..481c6d0c6b 100755 --- a/src/appMain/hmi_capabilities.json +++ b/src/appMain/hmi_capabilities.json @@ -428,6 +428,7 @@ "acMaxEnableAvailable": true, "autoModeEnableAvailable": true, "circulateAirEnableAvailable": true, + "climateEnableAvailable": true, "currentTemperatureAvailable": true, "defrostZone": [ "FRONT", @@ -455,7 +456,7 @@ ], "radioControlCapabilities": [ { - "availableHDsAvailable": true, + "availableHdChannelsAvailable": true, "hdChannelAvailable": true, "moduleName": "radio", "radioBandAvailable": true, diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_module_constants.h b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_module_constants.h index 92ff7e5f01..3178bab1fe 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_module_constants.h +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_module_constants.h @@ -151,7 +151,7 @@ const char kFrequencyFraction[] = "frequencyFraction"; const char kBand[] = "band"; const char kRdsData[] = "rdsData"; const char kHdRadioEnable[] = "hdRadioEnable"; -const char kAvailableHDs[] = "availableHDs"; +const char kAvailableHdChannels[] = "availableHdChannels"; const char kHdChannel[] = "hdChannel"; const char kSignalStrength[] = "signalStrength"; const char kSignalChangeThreshold[] = "signalChangeThreshold"; @@ -176,6 +176,8 @@ const char kHeatedSteeringWheelEnable[] = "heatedSteeringWheelEnable"; const char kHeatedWindshieldEnable[] = "heatedWindshieldEnable"; const char kHeatedRearWindowEnable[] = "heatedRearWindowEnable"; const char kHeatedMirrorsEnable[] = "heatedMirrorsEnable"; +const char kClimateEnable[] = "climateEnable"; +const char kClimateEnableAvailable[] = "climateEnableAvailable"; // ClimateControlData struct // LightControlData diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc index 47363bddcd..cd6e8b998e 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc @@ -108,7 +108,7 @@ void GetInteriorVehicleDataRequest::FilterDisabledModuleData( if (module_data.keyExists(message_params::kHdRadioEnable) && module_data[message_params::kHdRadioEnable].asBool() == false) { module_data.erase(message_params::kHdChannel); - module_data.erase(message_params::kAvailableHDs); + module_data.erase(message_params::kAvailableHdChannels); module_data.erase(message_params::kSisData); } } diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc index 2bf8fbbe92..5f7fbfae48 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc @@ -54,7 +54,7 @@ std::vector GetModuleReadOnlyParams( module_ro_params.push_back(kCurrentTemperature); } else if (enums_value::kRadio == module_type) { module_ro_params.push_back(kRdsData); - module_ro_params.push_back(kAvailableHDs); + module_ro_params.push_back(kAvailableHdChannels); module_ro_params.push_back(kSignalStrength); module_ro_params.push_back(kSignalChangeThreshold); module_ro_params.push_back(kState); @@ -92,14 +92,16 @@ const std::map GetModuleDataToCapabilitiesMapping() { mapping["heatedWindshieldEnable"] = "heatedWindshieldAvailable"; mapping["heatedMirrorsEnable"] = "heatedMirrorsAvailable"; mapping["heatedRearWindowEnable"] = "heatedRearWindowAvailable"; + mapping["climateEnable"] = "climateEnable"; + mapping["climateEnableAvailable"] = "climateEnableAvailable"; // radio mapping["band"] = "radioBandAvailable"; mapping["frequencyInteger"] = "radioFrequencyAvailable"; mapping["frequencyFraction"] = "radioFrequencyAvailable"; mapping["rdsData"] = "rdsDataAvailable"; - mapping["availableHDs"] = "availableHDsAvailable"; - mapping["hdChannel"] = "availableHDsAvailable"; + mapping["availableHdChannels"] = "availableHdChannelsAvailable"; + mapping["hdChannel"] = "availableHdChannelsAvailable"; mapping["hdRadioEnable"] = "hdRadioEnableAvailable"; mapping["signalStrength"] = "signalStrengthAvailable"; mapping["signalChangeThreshold"] = "signalChangeThresholdAvailable"; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/rc_get_capabilities_response_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/rc_get_capabilities_response_test.cc index d6df3e61ee..57c8069540 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/rc_get_capabilities_response_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/rc_get_capabilities_response_test.cc @@ -138,7 +138,7 @@ TEST_F(RCGetCapabilitiesResponseTest, RUN_SUCCESSS) { radio_control_capability["radioFrequencyAvailable"] = true; radio_control_capability["hdChannelAvailable"] = true; radio_control_capability["rdsDataAvailable"] = true; - radio_control_capability["availableHDsAvailable"] = true; + radio_control_capability["availableHdChannelsAvailable"] = true; radio_control_capability["stateAvailable"] = true; radio_control_capability["signalStrengthAvailable"] = true; radio_control_capability["signalChangeThresholdAvailable"] = true; diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index 55a3a99e9d..cd9e717b1d 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -1879,8 +1879,8 @@ True if the hd radio is on, false is the radio is off - - number of HD sub-channels if available + + The list of available hd sub-channel indexes. Empty list means no Hd channel is available. Read-only. Current HD sub-channel if available @@ -1935,9 +1935,9 @@ True: Available, False: Not Available, Not present: Not Available. - + - Availability of the getting the number of available HD channels. + Availability of the list of available HD sub-channel indexes. True: Available, False: Not Available, Not present: Not Available. @@ -2040,6 +2040,8 @@ value false means disabled, value true means enabled. + + @@ -2141,6 +2143,12 @@ True: Available, False: Not Available, Not present: Not Available. + + + Availability of the control of enable/disable climate control. + True: Available, False: Not Available, Not present: Not Available. + + diff --git a/src/components/interfaces/MOBILE_API.xml b/src/components/interfaces/MOBILE_API.xml index 9bc321fde8..6952eced29 100644 --- a/src/components/interfaces/MOBILE_API.xml +++ b/src/components/interfaces/MOBILE_API.xml @@ -3100,16 +3100,21 @@ True if the hd radio is on, false if the radio is off - - number of HD sub-channels if available + + Number of HD sub-channels if available + - + + The list of available HD sub-channel indexes. Empty list means no Hd channel is available. Read-only. + + Current HD sub-channel if available + @@ -3160,6 +3165,8 @@ value false means disabled, value true means enabled. + + @@ -3201,11 +3208,20 @@ True: Available, False: Not Available, Not present: Not Available. - + Availability of the getting the number of available HD channels. True: Available, False: Not Available, Not present: Not Available. + + + + + + + Availability of the list of available HD sub-channel indexes. + True: Available, False: Not Available, Not present: Not Available. + @@ -3346,6 +3362,12 @@ True: Available, False: Not Available, Not present: Not Available. + + + Availability of the control of enable/disable climate control. + True: Available, False: Not Available, Not present: Not Available. + + -- cgit v1.2.1 From 5ad1ec608c31d34c2248cd62e46384da6910f34b Mon Sep 17 00:00:00 2001 From: oivin Date: Mon, 21 Jan 2019 10:14:49 +0200 Subject: Unit tests. --- .../mobile/set_interior_vehicle_data_request.cc | 2 +- .../get_interior_vehicle_data_request_test.cc | 137 +++++++++++++++++++++ .../set_interior_vehicle_data_request_test.cc | 99 ++++++++++++++- src/components/interfaces/HMI_API.xml | 2 +- src/components/interfaces/MOBILE_API.xml | 8 +- 5 files changed, 241 insertions(+), 7 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc index 5f7fbfae48..54716fe9f6 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc @@ -92,7 +92,7 @@ const std::map GetModuleDataToCapabilitiesMapping() { mapping["heatedWindshieldEnable"] = "heatedWindshieldAvailable"; mapping["heatedMirrorsEnable"] = "heatedMirrorsAvailable"; mapping["heatedRearWindowEnable"] = "heatedRearWindowAvailable"; - mapping["climateEnable"] = "climateEnable"; + mapping["climateEnable"] = "climateEnableAvailable"; mapping["climateEnableAvailable"] = "climateEnableAvailable"; // radio diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc index 9549830cec..25083d5f64 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc @@ -44,6 +44,7 @@ #include "rc_rpc_plugin/rc_module_constants.h" #include "rc_rpc_plugin/rc_rpc_plugin.h" +#include #include #include @@ -205,6 +206,8 @@ TEST_F(GetInteriorVehicleDataRequestTest, HMIResultCodeIs(hmi_apis::FunctionID::RC_GetInteriorVehicleData), _)) .WillOnce(Return(true)); // Act + + command->Init(); command->Run(); } @@ -232,6 +235,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, HMIResultCodeIs(hmi_apis::FunctionID::RC_GetInteriorVehicleData), _)) .WillOnce(Return(true)); // Act + command->Init(); command->Run(); } @@ -263,6 +267,7 @@ TEST_F( .WillOnce(DoAll(SaveArg<0>(&command_result), Return(true))); // Act + command->Init(); command->Run(); // Assert @@ -314,6 +319,7 @@ TEST_F( command = CreateRCCommand< rc_rpc_plugin::commands::GetInteriorVehicleDataRequest>( mobile_message); + command->Init(); command->Run(); application_manager::event_engine::Event event( hmi_apis::FunctionID::RC_GetInteriorVehicleData); @@ -358,6 +364,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, .WillOnce(DoAll(SaveArg<0>(&command_result), Return(true))); // Act + command->Init(); command->Run(); // Assert @@ -393,6 +400,7 @@ TEST_F( MobileResultCodeIs(mobile_apis::Result::UNSUPPORTED_RESOURCE), _)) .WillOnce((Return(true))); // Act + command->Init(); command->Run(); } @@ -418,6 +426,7 @@ TEST_F( .WillOnce((Return(true))); // Act + command->Init(); command->Run(); } @@ -458,6 +467,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, application_manager::event_engine::Event event( hmi_apis::FunctionID::RC_GetInteriorVehicleData); event.set_smart_object(*hmi_response_message); + command->Init(); command->Run(); command->on_event(event); } @@ -498,6 +508,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, hmi_apis::FunctionID::RC_GetInteriorVehicleData); event.set_smart_object(*hmi_message); auto command = CreateRCCommand(mobile_message); + command->Init(); command->Run(); command->on_event(event); } @@ -542,6 +553,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, command = CreateRCCommand< rc_rpc_plugin::commands::GetInteriorVehicleDataRequest>( mobile_message); + command->Init(); command->Run(); application_manager::event_engine::Event event( hmi_apis::FunctionID::RC_GetInteriorVehicleData); @@ -583,6 +595,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, _)) .WillRepeatedly(Return(true)); // Act + command->Init(); command->Run(); } @@ -597,6 +610,130 @@ TEST_F(GetInteriorVehicleDataRequestTest, EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_, _)).Times(0); // Act + command->Init(); command->Run(); } + +TEST_F(GetInteriorVehicleDataRequestTest, + OnEvent_ValidHmiResponse_AvailableHDChanelsIsArrayWithHDChanels) { + using rc_rpc_plugin::commands::GetInteriorVehicleDataRequest; + namespace hmi_response = application_manager::hmi_response; + namespace strings = application_manager::strings; + + const uint32_t chanel1_index = 1u; + const uint32_t chanel2_index = 2u; + const uint32_t chanel3_index = 3u; + + const uint32_t expected_array_length = 3u; + + // Arrange + MessageSharedPtr mobile_message = CreateBasicMessage(); + + MessageSharedPtr hmi_response_message = CreateBasicMessage(); + auto& hmi_response_params = (*hmi_response_message)[strings::msg_params]; + hmi_response_params[hmi_response::code] = hmi_apis::Common_Result::SUCCESS; + hmi_response_params[strings::connection_key] = kAppId; + + auto& msg_params = (*hmi_response_message)[strings::msg_params]; + msg_params[message_params::kModuleType] = module_type; + + auto available_hd_chanels = + smart_objects::SmartObject(smart_objects::SmartType_Array); + + available_hd_chanels[0] = chanel1_index; + available_hd_chanels[1] = chanel2_index; + available_hd_chanels[2] = chanel3_index; + + msg_params[message_params::kModuleData][message_params::kRadioControlData] + [message_params::kAvailableHdChannels] = available_hd_chanels; + + ON_CALL(mock_interior_data_cache_, Contains(_)).WillByDefault(Return(false)); + ON_CALL(mock_interior_data_manager_, CheckRequestsToHMIFrequency(_)) + .WillByDefault(Return(true)); + + MessageSharedPtr message_to_mob = CreateBasicMessage(); + + // Expectations + EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_)).WillOnce(Return(true)); + EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)) + .WillOnce(DoAll(SaveArg<0>(&message_to_mob), Return(true))); + + // Act + auto command = CreateRCCommand(mobile_message); + application_manager::event_engine::Event event( + hmi_apis::FunctionID::RC_GetInteriorVehicleData); + + command->Init(); + command->Run(); + + event.set_smart_object(*hmi_response_message); + command->on_event(event); + + auto& hd_chanels = + (*message_to_mob)[strings::msg_params][message_params::kModuleData] + [message_params::kRadioControlData] + [message_params::kAvailableHdChannels]; + const size_t array_length = hd_chanels.length(); + + EXPECT_EQ(expected_array_length, array_length); + + EXPECT_EQ(chanel1_index, hd_chanels[0].asUInt()); + EXPECT_EQ(chanel2_index, hd_chanels[1].asUInt()); + EXPECT_EQ(chanel3_index, hd_chanels[2].asUInt()); +} + +TEST_F(GetInteriorVehicleDataRequestTest, + OnEvent_ValidHmiResponse_ClimateEnableAvailable) { + using rc_rpc_plugin::commands::GetInteriorVehicleDataRequest; + namespace hmi_response = application_manager::hmi_response; + namespace strings = application_manager::strings; + + // Arrange + MessageSharedPtr mobile_message = CreateBasicMessage(); + + MessageSharedPtr hmi_response_message = CreateBasicMessage(); + auto& hmi_response_params = (*hmi_response_message)[strings::msg_params]; + hmi_response_params[hmi_response::code] = hmi_apis::Common_Result::SUCCESS; + hmi_response_params[strings::connection_key] = kAppId; + + auto& msg_params = (*hmi_response_message)[strings::msg_params]; + + auto climate_control_data = + smart_objects::SmartObject(smart_objects::SmartType_Boolean); + climate_control_data = true; + + msg_params[message_params::kModuleData][message_params::kClimateControlData] + [message_params::kClimateEnableAvailable] = climate_control_data; + + ON_CALL(mock_interior_data_cache_, Contains(_)).WillByDefault(Return(false)); + ON_CALL(mock_interior_data_manager_, CheckRequestsToHMIFrequency(_)) + .WillByDefault(Return(true)); + + auto message_to_mob = CreateBasicMessage(); + + // Expectations + EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_)).WillOnce(Return(true)); + EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)) + .WillOnce(DoAll(SaveArg<0>(&message_to_mob), Return(true))); + + // Act + auto command = CreateRCCommand(mobile_message); + application_manager::event_engine::Event event( + hmi_apis::FunctionID::RC_GetInteriorVehicleData); + + command->Init(); + command->Run(); + + event.set_smart_object(*hmi_response_message); + command->on_event(event); + + const bool climate_enable_available = + (*message_to_mob)[strings::msg_params][message_params::kModuleData] + [message_params::kClimateControlData] + [message_params::kClimateEnableAvailable] + .asBool(); + + EXPECT_TRUE(climate_enable_available); +} + } // namespace rc_rpc_plugin_test diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc index 66280eb183..fc50288214 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc @@ -34,7 +34,6 @@ #include "application_manager/application.h" #include "application_manager/commands/command_request_test.h" #include "application_manager/mock_application.h" -#include "gtest/gtest.h" #include "interfaces/MOBILE_API.h" #include "rc_rpc_plugin/mock/mock_interior_data_cache.h" #include "rc_rpc_plugin/mock/mock_interior_data_manager.h" @@ -42,6 +41,9 @@ #include "rc_rpc_plugin/rc_module_constants.h" #include "rc_rpc_plugin/rc_rpc_plugin.h" +#include +#include "gtest/gtest.h" + using application_manager::ApplicationSet; using application_manager::commands::MessageSharedPtr; using test::components::application_manager_test::MockApplication; @@ -51,6 +53,7 @@ using test::components::commands_test::CommandsTestMocks; using ::testing::_; using ::testing::NiceMock; using ::testing::Return; +using ::testing::SaveArg; namespace { const uint32_t kAppId = 0u; @@ -159,6 +162,7 @@ TEST_F(SetInteriorVehicleDataRequestTest, command = CreateRCCommand< rc_rpc_plugin::commands::SetInteriorVehicleDataRequest>( mobile_message); + command->Init(); command->Run(); } @@ -198,6 +202,7 @@ TEST_F( command = CreateRCCommand< rc_rpc_plugin::commands::SetInteriorVehicleDataRequest>( mobile_message); + command->Init(); command->Run(); } @@ -229,7 +234,99 @@ TEST_F( command = CreateRCCommand< rc_rpc_plugin::commands::SetInteriorVehicleDataRequest>( mobile_message); + command->Init(); command->Run(); } +TEST_F(SetInteriorVehicleDataRequestTest, + Execute_ValidWithSettableParams_SUCCESSSendToHMI) { + MessageSharedPtr mobile_message = CreateBasicMessage(); + auto& msg_params = + (*mobile_message)[application_manager::strings::msg_params]; + msg_params[message_params::kModuleData][message_params::kModuleType] = + mobile_apis::ModuleType::CLIMATE; + + msg_params[message_params::kModuleData][message_params::kClimateControlData] = + smart_objects::SmartObject(smart_objects::SmartType_Map); + + msg_params[message_params::kModuleData][message_params::kClimateControlData] + [message_params::kClimateEnable] = true; + + // Expectations + EXPECT_CALL(mock_policy_handler_, CheckModule(kPolicyAppId, _)) + .WillOnce(Return(rc_rpc_plugin::TypeAccess::kAllowed)); + + EXPECT_CALL(mock_hmi_capabilities_, rc_capability()) + .WillOnce(Return(nullptr)); + + MessageSharedPtr message_from_mobile = CreateBasicMessage(); + + EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_)) + .WillOnce(DoAll(SaveArg<0>(&message_from_mobile), Return(true))); + + std::shared_ptr + command = CreateRCCommand< + rc_rpc_plugin::commands::SetInteriorVehicleDataRequest>( + mobile_message); + + command->Init(); + command->Run(); + + auto& msg_params_from_mobile = + (*message_from_mobile)[application_manager::strings::msg_params]; + + const bool climate_enable = + msg_params_from_mobile[message_params::kModuleData] + [message_params::kClimateControlData] + [message_params::kClimateEnable] + .asBool(); + EXPECT_TRUE(climate_enable); +} + +TEST_F(SetInteriorVehicleDataRequestTest, + Execute_ValidWithSettableParams_SUCCESSSendToHMI_HDChannel) { + MessageSharedPtr mobile_message = CreateBasicMessage(); + auto& msg_params = + (*mobile_message)[application_manager::strings::msg_params]; + msg_params[message_params::kModuleData][message_params::kModuleType] = + mobile_apis::ModuleType::RADIO; + + msg_params[message_params::kModuleData][message_params::kRadioControlData] = + smart_objects::SmartObject(smart_objects::SmartType_Map); + + const std::uint32_t hd_channel = 2u; + msg_params[message_params::kModuleData][message_params::kRadioControlData] + [message_params::kHdChannel] = hd_channel; + + // Expectations + EXPECT_CALL(mock_policy_handler_, CheckModule(kPolicyAppId, _)) + .WillOnce(Return(rc_rpc_plugin::TypeAccess::kAllowed)); + + EXPECT_CALL(mock_hmi_capabilities_, rc_capability()) + .WillOnce(Return(nullptr)); + + auto message_from_mobile = CreateBasicMessage(); + + EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_)) + .WillOnce(DoAll(SaveArg<0>(&message_from_mobile), Return(true))); + + std::shared_ptr + command = CreateRCCommand< + rc_rpc_plugin::commands::SetInteriorVehicleDataRequest>( + mobile_message); + + command->Init(); + command->Run(); + + auto& msg_params_from_mobile = + (*message_from_mobile)[application_manager::strings::msg_params]; + + const uint64_t hd_channel_from_hmi = + msg_params_from_mobile[message_params::kModuleData] + [message_params::kRadioControlData] + [message_params::kHdChannel] + .asUInt(); + + EXPECT_EQ(hd_channel, hd_channel_from_hmi); +} } // namespace rc_rpc_plugin_test diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index cd9e717b1d..0c7720e740 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -1882,7 +1882,7 @@ The list of available hd sub-channel indexes. Empty list means no Hd channel is available. Read-only. - + Current HD sub-channel if available diff --git a/src/components/interfaces/MOBILE_API.xml b/src/components/interfaces/MOBILE_API.xml index 6952eced29..0a3d7bb28d 100644 --- a/src/components/interfaces/MOBILE_API.xml +++ b/src/components/interfaces/MOBILE_API.xml @@ -3107,10 +3107,10 @@ - + The list of available HD sub-channel indexes. Empty list means no Hd channel is available. Read-only. - + Current HD sub-channel if available @@ -3208,7 +3208,7 @@ True: Available, False: Not Available, Not present: Not Available. - + Availability of the getting the number of available HD channels. True: Available, False: Not Available, Not present: Not Available. @@ -3217,7 +3217,7 @@ - + Availability of the list of available HD sub-channel indexes. True: Available, False: Not Available, Not present: Not Available. -- cgit v1.2.1 From 06b0461502c5ec2fdf3f4ed889dbd2463ee7e368 Mon Sep 17 00:00:00 2001 From: igapchuck Date: Fri, 17 May 2019 10:34:57 +0300 Subject: Update Unit tests because of incorrect behavior. --- .../get_interior_vehicle_data_request_test.cc | 28 +++++++++++----------- .../set_interior_vehicle_data_request_test.cc | 26 +++++++++++--------- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc index 25083d5f64..d17112f611 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc @@ -207,7 +207,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, .WillOnce(Return(true)); // Act - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); } @@ -235,7 +235,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, HMIResultCodeIs(hmi_apis::FunctionID::RC_GetInteriorVehicleData), _)) .WillOnce(Return(true)); // Act - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); } @@ -267,7 +267,7 @@ TEST_F( .WillOnce(DoAll(SaveArg<0>(&command_result), Return(true))); // Act - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); // Assert @@ -319,7 +319,7 @@ TEST_F( command = CreateRCCommand< rc_rpc_plugin::commands::GetInteriorVehicleDataRequest>( mobile_message); - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); application_manager::event_engine::Event event( hmi_apis::FunctionID::RC_GetInteriorVehicleData); @@ -364,7 +364,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, .WillOnce(DoAll(SaveArg<0>(&command_result), Return(true))); // Act - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); // Assert @@ -400,7 +400,7 @@ TEST_F( MobileResultCodeIs(mobile_apis::Result::UNSUPPORTED_RESOURCE), _)) .WillOnce((Return(true))); // Act - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); } @@ -426,7 +426,7 @@ TEST_F( .WillOnce((Return(true))); // Act - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); } @@ -467,7 +467,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, application_manager::event_engine::Event event( hmi_apis::FunctionID::RC_GetInteriorVehicleData); event.set_smart_object(*hmi_response_message); - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); command->on_event(event); } @@ -508,7 +508,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, hmi_apis::FunctionID::RC_GetInteriorVehicleData); event.set_smart_object(*hmi_message); auto command = CreateRCCommand(mobile_message); - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); command->on_event(event); } @@ -553,7 +553,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, command = CreateRCCommand< rc_rpc_plugin::commands::GetInteriorVehicleDataRequest>( mobile_message); - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); application_manager::event_engine::Event event( hmi_apis::FunctionID::RC_GetInteriorVehicleData); @@ -595,7 +595,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, _)) .WillRepeatedly(Return(true)); // Act - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); } @@ -610,7 +610,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_, _)).Times(0); // Act - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); } @@ -663,7 +663,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, application_manager::event_engine::Event event( hmi_apis::FunctionID::RC_GetInteriorVehicleData); - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); event.set_smart_object(*hmi_response_message); @@ -721,7 +721,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, application_manager::event_engine::Event event( hmi_apis::FunctionID::RC_GetInteriorVehicleData); - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); event.set_smart_object(*hmi_response_message); diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc index fc50288214..cdb4a4b48c 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc @@ -50,6 +50,7 @@ using test::components::application_manager_test::MockApplication; using test::components::application_manager_test::MockApplicationManager; using test::components::commands_test::CommandRequestTest; using test::components::commands_test::CommandsTestMocks; +using test::components::commands_test::HMIResultCodeIs; using ::testing::_; using ::testing::NiceMock; using ::testing::Return; @@ -143,8 +144,11 @@ TEST_F(SetInteriorVehicleDataRequestTest, (*mobile_message)[application_manager::strings::msg_params]; msg_params[message_params::kModuleData][message_params::kModuleType] = mobile_apis::ModuleType::CLIMATE; + smart_objects::SmartObject climate_control_data(smart_objects::SmartType_Map); + climate_control_data[message_params::kFanSpeed] = 10; + msg_params[message_params::kModuleData][message_params::kClimateControlData] = - smart_objects::SmartObject(smart_objects::SmartType_Map); + climate_control_data; // Expectations EXPECT_CALL(mock_policy_handler_, CheckModule(kPolicyAppId, _)) .WillOnce(Return(rc_rpc_plugin::TypeAccess::kAllowed)); @@ -154,15 +158,15 @@ TEST_F(SetInteriorVehicleDataRequestTest, EXPECT_CALL( mock_rpc_service_, - ManageMobileCommand(test::components::commands_test::MobileResultCodeIs( - mobile_apis::Result::READ_ONLY), - application_manager::commands::Command::SOURCE_SDL)); + ManageHMICommand( + HMIResultCodeIs(hmi_apis::FunctionID::RC_SetInteriorVehicleData), _)) + .WillOnce(Return(true)); // Act std::shared_ptr command = CreateRCCommand< rc_rpc_plugin::commands::SetInteriorVehicleDataRequest>( mobile_message); - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); } @@ -193,16 +197,16 @@ TEST_F( EXPECT_CALL( mock_rpc_service_, - ManageMobileCommand(test::components::commands_test::MobileResultCodeIs( - mobile_apis::Result::OUT_OF_MEMORY), - application_manager::commands::Command::SOURCE_SDL)); + ManageHMICommand( + HMIResultCodeIs(hmi_apis::FunctionID::RC_SetInteriorVehicleData), _)) + .WillOnce(Return(true)); // Act std::shared_ptr command = CreateRCCommand< rc_rpc_plugin::commands::SetInteriorVehicleDataRequest>( mobile_message); - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); } @@ -234,7 +238,7 @@ TEST_F( command = CreateRCCommand< rc_rpc_plugin::commands::SetInteriorVehicleDataRequest>( mobile_message); - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); } @@ -269,7 +273,7 @@ TEST_F(SetInteriorVehicleDataRequestTest, rc_rpc_plugin::commands::SetInteriorVehicleDataRequest>( mobile_message); - command->Init(); + ASSERT_TRUE(command->Init()); command->Run(); auto& msg_params_from_mobile = -- cgit v1.2.1 From 008024eba0b1a9979c102fa92b0687b7aa5c13c1 Mon Sep 17 00:00:00 2001 From: igapchuck Date: Tue, 7 May 2019 16:44:46 +0300 Subject: Refactor CutOffReadOnlyParams() method for better readable. --- .../mobile/set_interior_vehicle_data_request.cc | 24 ++++++++-------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc index 54716fe9f6..f7ef2ed6cc 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc @@ -718,21 +718,6 @@ void SetInteriorVehicleDataRequest::CutOffReadOnlyParams( const smart_objects::SmartObject& module_type_params = ControlData(module_data); const std::string module_type = ModuleType(); - std::vector ro_params = GetModuleReadOnlyParams(module_type); - - for (auto& it : ro_params) { - if (module_type_params.keyExists(it)) { - if (enums_value::kClimate == module_type) { - module_data[message_params::kClimateControlData].erase(it); - } else if (enums_value::kRadio == module_type) { - module_data[message_params::kRadioControlData].erase(it); - } else { - continue; - } - - LOG4CXX_DEBUG(logger_, "Cutting-off READ ONLY parameter: " << it); - } - } if (enums_value::kAudio == module_type) { auto& equalizer_settings = module_data[message_params::kAudioControlData] @@ -747,6 +732,15 @@ void SetInteriorVehicleDataRequest::CutOffReadOnlyParams( } } } + + std::vector ro_params = GetModuleReadOnlyParams(module_type); + const auto& data_mapping = RCHelpers::GetModuleTypeToDataMapping(); + for (const auto& param : ro_params) { + if (module_type_params.keyExists(param)) { + module_data[data_mapping(module_type)].erase(param); + LOG4CXX_DEBUG(logger_, "Cutting-off READ ONLY parameter: " << param); + } + } } std::string SetInteriorVehicleDataRequest::ModuleType() { -- cgit v1.2.1 From 503a316d5107c98e2c8850dbbe51cffe736c85c7 Mon Sep 17 00:00:00 2001 From: igapchuck Date: Fri, 17 May 2019 13:09:58 +0300 Subject: Updates after rebase on release/5.1.1 --- .../test/commands/get_interior_vehicle_data_request_test.cc | 4 ++-- .../test/commands/set_interior_vehicle_data_request_test.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc index d17112f611..1adc8caf93 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc @@ -654,7 +654,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, MessageSharedPtr message_to_mob = CreateBasicMessage(); // Expectations - EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_)).WillOnce(Return(true)); + EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_, _)).WillOnce(Return(true)); EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)) .WillOnce(DoAll(SaveArg<0>(&message_to_mob), Return(true))); @@ -712,7 +712,7 @@ TEST_F(GetInteriorVehicleDataRequestTest, auto message_to_mob = CreateBasicMessage(); // Expectations - EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_)).WillOnce(Return(true)); + EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_, _)).WillOnce(Return(true)); EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)) .WillOnce(DoAll(SaveArg<0>(&message_to_mob), Return(true))); diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc index cdb4a4b48c..f7718a7248 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc @@ -265,7 +265,7 @@ TEST_F(SetInteriorVehicleDataRequestTest, MessageSharedPtr message_from_mobile = CreateBasicMessage(); - EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_)) + EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_, _)) .WillOnce(DoAll(SaveArg<0>(&message_from_mobile), Return(true))); std::shared_ptr @@ -311,7 +311,7 @@ TEST_F(SetInteriorVehicleDataRequestTest, auto message_from_mobile = CreateBasicMessage(); - EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_)) + EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_, _)) .WillOnce(DoAll(SaveArg<0>(&message_from_mobile), Return(true))); std::shared_ptr -- cgit v1.2.1 From e8153d66adf7e284368d091f5dfd4de602d53840 Mon Sep 17 00:00:00 2001 From: igapchuck Date: Thu, 30 May 2019 14:53:18 +0300 Subject: Answer to PR comments. Update API's version --- src/components/interfaces/HMI_API.xml | 2 +- src/components/interfaces/MOBILE_API.xml | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index 0c7720e740..2b577aba0b 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -2040,7 +2040,7 @@ value false means disabled, value true means enabled. - + diff --git a/src/components/interfaces/MOBILE_API.xml b/src/components/interfaces/MOBILE_API.xml index 0a3d7bb28d..19d5158103 100644 --- a/src/components/interfaces/MOBILE_API.xml +++ b/src/components/interfaces/MOBILE_API.xml @@ -3100,21 +3100,21 @@ True if the hd radio is on, false if the radio is off - + Number of HD sub-channels if available - + - + The list of available HD sub-channel indexes. Empty list means no Hd channel is available. Read-only. - + Current HD sub-channel if available - + @@ -3165,7 +3165,7 @@ value false means disabled, value true means enabled. - + @@ -3208,16 +3208,16 @@ True: Available, False: Not Available, Not present: Not Available. - + Availability of the getting the number of available HD channels. True: Available, False: Not Available, Not present: Not Available. - + - + Availability of the list of available HD sub-channel indexes. True: Available, False: Not Available, Not present: Not Available. @@ -3362,7 +3362,7 @@ True: Available, False: Not Available, Not present: Not Available. - + Availability of the control of enable/disable climate control. True: Available, False: Not Available, Not present: Not Available. -- cgit v1.2.1 From be2dd5badfc9fef8734b56fce1a1827f8ac1aee0 Mon Sep 17 00:00:00 2001 From: igapchuck Date: Thu, 6 Jun 2019 14:48:14 +0300 Subject: fixup! Feature: Remote Control - Radio and Climate Parameter Update. --- .../include/rc_rpc_plugin/rc_module_constants.h | 1 + .../commands/mobile/get_interior_vehicle_data_request.cc | 1 + .../commands/mobile/set_interior_vehicle_data_request.cc | 2 ++ .../commands/hmi/rc_get_capabilities_response_test.cc | 1 + src/components/interfaces/HMI_API.xml | 16 +++++++++++++++- src/components/interfaces/MOBILE_API.xml | 10 +++++----- 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_module_constants.h b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_module_constants.h index 3178bab1fe..b9f922a1be 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_module_constants.h +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_module_constants.h @@ -151,6 +151,7 @@ const char kFrequencyFraction[] = "frequencyFraction"; const char kBand[] = "band"; const char kRdsData[] = "rdsData"; const char kHdRadioEnable[] = "hdRadioEnable"; +const char kAvailableHDs[] = "availableHDs"; const char kAvailableHdChannels[] = "availableHdChannels"; const char kHdChannel[] = "hdChannel"; const char kSignalStrength[] = "signalStrength"; diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc index cd6e8b998e..ded96461f5 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc @@ -108,6 +108,7 @@ void GetInteriorVehicleDataRequest::FilterDisabledModuleData( if (module_data.keyExists(message_params::kHdRadioEnable) && module_data[message_params::kHdRadioEnable].asBool() == false) { module_data.erase(message_params::kHdChannel); + module_data.erase(message_params::kAvailableHDs); module_data.erase(message_params::kAvailableHdChannels); module_data.erase(message_params::kSisData); } diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc index f7ef2ed6cc..44d302276d 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc @@ -54,6 +54,7 @@ std::vector GetModuleReadOnlyParams( module_ro_params.push_back(kCurrentTemperature); } else if (enums_value::kRadio == module_type) { module_ro_params.push_back(kRdsData); + module_ro_params.push_back(kAvailableHDs); module_ro_params.push_back(kAvailableHdChannels); module_ro_params.push_back(kSignalStrength); module_ro_params.push_back(kSignalChangeThreshold); @@ -100,6 +101,7 @@ const std::map GetModuleDataToCapabilitiesMapping() { mapping["frequencyInteger"] = "radioFrequencyAvailable"; mapping["frequencyFraction"] = "radioFrequencyAvailable"; mapping["rdsData"] = "rdsDataAvailable"; + mapping["availableHDs"] = "availableHDsAvailable"; mapping["availableHdChannels"] = "availableHdChannelsAvailable"; mapping["hdChannel"] = "availableHdChannelsAvailable"; mapping["hdRadioEnable"] = "hdRadioEnableAvailable"; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/rc_get_capabilities_response_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/rc_get_capabilities_response_test.cc index 57c8069540..67c36dce9c 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/rc_get_capabilities_response_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/rc_get_capabilities_response_test.cc @@ -138,6 +138,7 @@ TEST_F(RCGetCapabilitiesResponseTest, RUN_SUCCESSS) { radio_control_capability["radioFrequencyAvailable"] = true; radio_control_capability["hdChannelAvailable"] = true; radio_control_capability["rdsDataAvailable"] = true; + radio_control_capability["availableHDsAvailable"] = true; radio_control_capability["availableHdChannelsAvailable"] = true; radio_control_capability["stateAvailable"] = true; radio_control_capability["signalStrengthAvailable"] = true; diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index 2b577aba0b..bff05fa853 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -1879,10 +1879,16 @@ True if the hd radio is on, false is the radio is off + + + Number of HD sub-channels if available. + Note that this parameter is deprecated in MOBILE API. + + The list of available hd sub-channel indexes. Empty list means no Hd channel is available. Read-only. - + Current HD sub-channel if available @@ -1935,6 +1941,14 @@ True: Available, False: Not Available, Not present: Not Available. + + + Availability of the getting the number of available HD channels. + True: Available, False: Not Available, Not present: Not Available. + Note that this parameter is deprecated in MOBILE API + + + Availability of the list of available HD sub-channel indexes. diff --git a/src/components/interfaces/MOBILE_API.xml b/src/components/interfaces/MOBILE_API.xml index 19d5158103..8c0f29667c 100644 --- a/src/components/interfaces/MOBILE_API.xml +++ b/src/components/interfaces/MOBILE_API.xml @@ -3100,21 +3100,21 @@ True if the hd radio is on, false if the radio is off - + Number of HD sub-channels if available - + The list of available HD sub-channel indexes. Empty list means no Hd channel is available. Read-only. - + Current HD sub-channel if available - + @@ -3214,7 +3214,7 @@ True: Available, False: Not Available, Not present: Not Available. - + -- cgit v1.2.1 From c6a2ca96156c32abdd65038aa5946f0fb1d9cb41 Mon Sep 17 00:00:00 2001 From: JackLivio Date: Fri, 7 Jun 2019 11:50:12 -0400 Subject: Configure bt uuid via ini entry --- src/appMain/smartDeviceLink.ini | 3 +++ .../include/config_profile/profile.h | 7 +++++++ src/components/config_profile/src/profile.cc | 24 ++++++++++++++++++++++ .../application_manager_settings.h | 1 + .../transport_manager/transport_manager_settings.h | 2 ++ .../bluetooth/bluetooth_device_scanner.h | 5 +++++ .../src/bluetooth/bluetooth_device_scanner.cc | 20 ++++++++++++++++++ .../src/bluetooth/bluetooth_transport_adapter.cc | 11 +++++----- 8 files changed, 68 insertions(+), 5 deletions(-) diff --git a/src/appMain/smartDeviceLink.ini b/src/appMain/smartDeviceLink.ini index 54c2395c47..1bf7c92924 100644 --- a/src/appMain/smartDeviceLink.ini +++ b/src/appMain/smartDeviceLink.ini @@ -202,6 +202,9 @@ TCPAdapterPort = 12345 ; If the name is omitted, Core will listen on all network interfaces by binding to INADDR_ANY. TCPAdapterNetworkInterface = +; 128 bit uuid for bluetooth device discovery. Please format as 16 seperate bytes. +BluetoothUUID = 0x93, 0x6D, 0xA0, 0x1F, 0x9A, 0xBD, 0x4D, 0x9D, 0x80, 0xC7, 0x02, 0xAF, 0x85, 0xC8, 0x22, 0xA8 + [CloudAppConnections] ; Value in milliseconds for time between retry attempts on a failed websocket connection CloudAppRetryTimeout = 1000 diff --git a/src/components/config_profile/include/config_profile/profile.h b/src/components/config_profile/include/config_profile/profile.h index 1d3766ca97..0a1e8b2c17 100644 --- a/src/components/config_profile/include/config_profile/profile.h +++ b/src/components/config_profile/include/config_profile/profile.h @@ -423,6 +423,8 @@ class Profile : public protocol_handler::ProtocolHandlerSettings, */ uint16_t cloud_app_max_retry_attempts() const OVERRIDE; + const uint8_t* bluetooth_uuid() const OVERRIDE; + // TransportManageMMESettings interface const std::string& event_mq_name() const OVERRIDE; @@ -610,6 +612,10 @@ class Profile : public protocol_handler::ProtocolHandlerSettings, const char* const pKey, bool* out_result) const; + std::vector ReadUint8Container(const char* const pSection, + const char* const pKey, + bool* out_result) const; + /** * @brief Returns delimiter for SDL-generated TTS chunks * @return TTS delimiter @@ -975,6 +981,7 @@ class Profile : public protocol_handler::ProtocolHandlerSettings, std::string transport_manager_tcp_adapter_network_interface_; uint32_t cloud_app_retry_timeout_; uint16_t cloud_app_max_retry_attempts_; + std::vector bluetooth_uuid_; std::string tts_delimiter_; uint32_t audio_data_stopped_timeout_; uint32_t video_data_stopped_timeout_; diff --git a/src/components/config_profile/src/profile.cc b/src/components/config_profile/src/profile.cc index a5b2daa130..336bd9a2d1 100644 --- a/src/components/config_profile/src/profile.cc +++ b/src/components/config_profile/src/profile.cc @@ -184,6 +184,7 @@ const char* kAppHmiLevelNoneRequestsTimeScaleKey = const char* kPendingRequestsAmoundKey = "PendingRequestsAmount"; const char* kSupportedDiagModesKey = "SupportedDiagModes"; const char* kTransportManagerDisconnectTimeoutKey = "DisconnectTimeout"; +const char* kBluetoothUUIDKey = "BluetoothUUID"; const char* kTTSDelimiterKey = "TTSDelimiter"; const char* kRecordingFileNameKey = "RecordingFileName"; const char* kRecordingFileSourceKey = "RecordingFileSource"; @@ -806,6 +807,10 @@ uint16_t Profile::cloud_app_max_retry_attempts() const { return cloud_app_max_retry_attempts_; } +const uint8_t* Profile::bluetooth_uuid() const { + return bluetooth_uuid_.data(); +} + const std::string& Profile::tts_delimiter() const { return tts_delimiter_; } @@ -1821,6 +1826,9 @@ void Profile::UpdateValues() { kCloudAppMaxRetryAttemptsKey, kCloudAppTransportSection); + bluetooth_uuid_ = + ReadUint8Container(kTransportManagerSection, kBluetoothUUIDKey, NULL); + // Event MQ ReadStringValue( &event_mq_name_, kDefaultEventMQ, kTransportManagerSection, kEventMQKey); @@ -2449,6 +2457,10 @@ int32_t hex_to_int(const std::string& value) { return static_cast(strtol(value.c_str(), NULL, 16)); } +int32_t hex_to_uint8(const std::string& value) { + return static_cast(strtol(value.c_str(), NULL, 16)); +} + std::string trim_string(const std::string& str) { const char* delims = " \t"; @@ -2474,6 +2486,18 @@ std::vector Profile::ReadIntContainer(const char* const pSection, return value_list; } +std::vector Profile::ReadUint8Container(const char* const pSection, + const char* const pKey, + bool* out_result) const { + const std::vector string_list = + ReadStringContainer(pSection, pKey, out_result); + std::vector value_list; + value_list.resize(string_list.size()); + std::transform( + string_list.begin(), string_list.end(), value_list.begin(), hex_to_uint8); + return value_list; +} + std::vector Profile::ReadStringContainer( const char* const pSection, const char* const pKey, diff --git a/src/components/include/application_manager/application_manager_settings.h b/src/components/include/application_manager/application_manager_settings.h index 0f73ea94ed..cf8669d8d8 100644 --- a/src/components/include/application_manager/application_manager_settings.h +++ b/src/components/include/application_manager/application_manager_settings.h @@ -88,6 +88,7 @@ class ApplicationManagerSettings : public RequestControlerSettings, virtual uint32_t rpc_pass_through_timeout() const = 0; virtual uint32_t cloud_app_retry_timeout() const = 0; virtual uint16_t cloud_app_max_retry_attempts() const = 0; + virtual const uint8_t* bluetooth_uuid() const = 0; virtual bool use_db_for_resumption() const = 0; virtual const uint32_t& app_resumption_save_persistent_data_timeout() const = 0; diff --git a/src/components/include/transport_manager/transport_manager_settings.h b/src/components/include/transport_manager/transport_manager_settings.h index cbc1516c29..4a183ad22d 100644 --- a/src/components/include/transport_manager/transport_manager_settings.h +++ b/src/components/include/transport_manager/transport_manager_settings.h @@ -79,6 +79,8 @@ class TransportManagerSettings : public TransportManagerMMESettings { * @brief Returns maximum retry attempts for cloud app connections */ virtual uint16_t cloud_app_max_retry_attempts() const = 0; + + virtual const uint8_t* bluetooth_uuid() const = 0; }; } // namespace transport_manager #endif // SRC_COMPONENTS_INCLUDE_TRANSPORT_MANAGER_TRANSPORT_MANAGER_SETTINGS_H_ diff --git a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h index 13fef1d017..768d9ebb54 100644 --- a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h +++ b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h @@ -70,6 +70,11 @@ class BluetoothDeviceScanner : public DeviceScanner { BluetoothDeviceScanner(TransportAdapterController* controller, bool auto_repeat_search, int repeat_search_pause_sec); + + BluetoothDeviceScanner(TransportAdapterController* controller, + bool auto_repeat_search, + int repeat_search_pause_sec, + const uint8_t* smart_device_link_service_uuid_data); /** * @brief Destructor. */ diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc b/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc index 7e9b4c1332..083943e61f 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc @@ -137,6 +137,26 @@ BluetoothDeviceScanner::BluetoothDeviceScanner( new BluetoothDeviceScannerDelegate(this)); } +BluetoothDeviceScanner::BluetoothDeviceScanner( + TransportAdapterController* controller, + bool auto_repeat_search, + int auto_repeat_pause_sec, + const uint8_t* smart_device_link_service_uuid_data) + : controller_(controller) + , thread_(NULL) + , shutdown_requested_(false) + , ready_(true) + , device_scan_requested_(false) + , device_scan_requested_lock_() + , device_scan_requested_cv_() + , auto_repeat_search_(auto_repeat_search) + , auto_repeat_pause_sec_(auto_repeat_pause_sec) { + sdp_uuid128_create(&smart_device_link_service_uuid_, + smart_device_link_service_uuid_data); + thread_ = threads::CreateThread("BT Device Scaner", + new BluetoothDeviceScannerDelegate(this)); +} + BluetoothDeviceScanner::~BluetoothDeviceScanner() { thread_->join(); delete thread_->delegate(); diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc index 95265cad2e..911658bc56 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc @@ -58,11 +58,12 @@ BluetoothTransportAdapter::~BluetoothTransportAdapter() {} BluetoothTransportAdapter::BluetoothTransportAdapter( resumption::LastState& last_state, const TransportManagerSettings& settings) - : TransportAdapterImpl(new BluetoothDeviceScanner(this, true, 0), - new BluetoothConnectionFactory(this), - NULL, - last_state, - settings) {} + : TransportAdapterImpl( + new BluetoothDeviceScanner(this, true, 0, settings.bluetooth_uuid()), + new BluetoothConnectionFactory(this), + NULL, + last_state, + settings) {} DeviceType BluetoothTransportAdapter::GetDeviceType() const { return BLUETOOTH; -- cgit v1.2.1 From 5f353766c2ffc1dbef53a5594b9e64ba47cd7e88 Mon Sep 17 00:00:00 2001 From: JackLivio Date: Mon, 17 Jun 2019 16:26:21 -0400 Subject: Address comments --- src/appMain/smartDeviceLink.ini | 2 +- src/components/config_profile/src/profile.cc | 28 ++++++++++++++++++---- .../application_manager_settings.h | 1 - .../mock_transport_manager_settings.h | 1 + .../src/bluetooth/bluetooth_device_scanner.cc | 4 ++-- .../test/transport_manager_default_test.cc | 22 +++++++++++++++++ 6 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/appMain/smartDeviceLink.ini b/src/appMain/smartDeviceLink.ini index 1bf7c92924..40c1bf08a7 100644 --- a/src/appMain/smartDeviceLink.ini +++ b/src/appMain/smartDeviceLink.ini @@ -203,7 +203,7 @@ TCPAdapterPort = 12345 TCPAdapterNetworkInterface = ; 128 bit uuid for bluetooth device discovery. Please format as 16 seperate bytes. -BluetoothUUID = 0x93, 0x6D, 0xA0, 0x1F, 0x9A, 0xBD, 0x4D, 0x9D, 0x80, 0xC7, 0x02, 0xAF, 0x85, 0xC8, 0x22, 0xA8 +;BluetoothUUID = 0x93, 0x6D, 0xA0, 0x1F, 0x9A, 0xBD, 0x4D, 0x9D, 0x80, 0xC7, 0x02, 0xAF, 0x85, 0xC8, 0x22, 0xA8 [CloudAppConnections] ; Value in milliseconds for time between retry attempts on a failed websocket connection diff --git a/src/components/config_profile/src/profile.cc b/src/components/config_profile/src/profile.cc index 336bd9a2d1..c38b28db5f 100644 --- a/src/components/config_profile/src/profile.cc +++ b/src/components/config_profile/src/profile.cc @@ -398,6 +398,22 @@ const bool kDefaultMultipleTransportsEnabled = false; const char* kDefaultLowBandwidthResumptionLevel = "NONE"; const uint32_t kDefaultRpcPassThroughTimeout = 10000; const char* kDefaultHMIOriginId = "HMI_ID"; +const std::vector kDefaultBluetoothUUID = {0x93, + 0x6D, + 0xA0, + 0x1F, + 0x9A, + 0xBD, + 0x4D, + 0x9D, + 0x80, + 0xC7, + 0x02, + 0xAF, + 0x85, + 0xC8, + 0x22, + 0xA8}; } // namespace namespace profile { @@ -1826,9 +1842,13 @@ void Profile::UpdateValues() { kCloudAppMaxRetryAttemptsKey, kCloudAppTransportSection); - bluetooth_uuid_ = - ReadUint8Container(kTransportManagerSection, kBluetoothUUIDKey, NULL); - + bool read_result = true; + bluetooth_uuid_ = ReadUint8Container( + kTransportManagerSection, kBluetoothUUIDKey, &read_result); + if (!read_result || bluetooth_uuid_.size() != 16) { + bluetooth_uuid_ = kDefaultBluetoothUUID; + } + // Event MQ ReadStringValue( &event_mq_name_, kDefaultEventMQ, kTransportManagerSection, kEventMQKey); @@ -2457,7 +2477,7 @@ int32_t hex_to_int(const std::string& value) { return static_cast(strtol(value.c_str(), NULL, 16)); } -int32_t hex_to_uint8(const std::string& value) { +uint8_t hex_to_uint8(const std::string& value) { return static_cast(strtol(value.c_str(), NULL, 16)); } diff --git a/src/components/include/application_manager/application_manager_settings.h b/src/components/include/application_manager/application_manager_settings.h index cf8669d8d8..0f73ea94ed 100644 --- a/src/components/include/application_manager/application_manager_settings.h +++ b/src/components/include/application_manager/application_manager_settings.h @@ -88,7 +88,6 @@ class ApplicationManagerSettings : public RequestControlerSettings, virtual uint32_t rpc_pass_through_timeout() const = 0; virtual uint32_t cloud_app_retry_timeout() const = 0; virtual uint16_t cloud_app_max_retry_attempts() const = 0; - virtual const uint8_t* bluetooth_uuid() const = 0; virtual bool use_db_for_resumption() const = 0; virtual const uint32_t& app_resumption_save_persistent_data_timeout() const = 0; diff --git a/src/components/include/test/transport_manager/mock_transport_manager_settings.h b/src/components/include/test/transport_manager/mock_transport_manager_settings.h index 2d9f25a44c..eb12ce1b55 100644 --- a/src/components/include/test/transport_manager/mock_transport_manager_settings.h +++ b/src/components/include/test/transport_manager/mock_transport_manager_settings.h @@ -65,6 +65,7 @@ class MockTransportManagerSettings std::string&()); MOCK_CONST_METHOD0(cloud_app_retry_timeout, uint32_t()); MOCK_CONST_METHOD0(cloud_app_max_retry_attempts, uint16_t()); + MOCK_CONST_METHOD0(bluetooth_uuid, const uint8_t*()); }; } // namespace transport_manager_test diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc b/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc index 083943e61f..4759b2003a 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc @@ -133,7 +133,7 @@ BluetoothDeviceScanner::BluetoothDeviceScanner( 0xA8}; sdp_uuid128_create(&smart_device_link_service_uuid_, smart_device_link_service_uuid_data); - thread_ = threads::CreateThread("BT Device Scaner", + thread_ = threads::CreateThread("BT Device Scanner", new BluetoothDeviceScannerDelegate(this)); } @@ -153,7 +153,7 @@ BluetoothDeviceScanner::BluetoothDeviceScanner( , auto_repeat_pause_sec_(auto_repeat_pause_sec) { sdp_uuid128_create(&smart_device_link_service_uuid_, smart_device_link_service_uuid_data); - thread_ = threads::CreateThread("BT Device Scaner", + thread_ = threads::CreateThread("BT Device Scanner", new BluetoothDeviceScannerDelegate(this)); } diff --git a/src/components/transport_manager/test/transport_manager_default_test.cc b/src/components/transport_manager/test/transport_manager_default_test.cc index d8bf51ef88..e102458b96 100644 --- a/src/components/transport_manager/test/transport_manager_default_test.cc +++ b/src/components/transport_manager/test/transport_manager_default_test.cc @@ -57,6 +57,22 @@ const std::string kTransportManager = "TransportManager"; const std::string kTcpAdapter = "TcpAdapter"; const std::string kBluetoothAdapter = "BluetoothAdapter"; const std::string kDevices = "devices"; +std::vector kBTUUID = {0x93, + 0x6D, + 0xA0, + 0x1F, + 0x9A, + 0xBD, + 0x4D, + 0x9D, + 0x80, + 0xC7, + 0x02, + 0xAF, + 0x85, + 0xC8, + 0x22, + 0xA8}; } // namespace TEST(TestTransportManagerDefault, Init_LastStateNotUsed) { @@ -78,6 +94,8 @@ TEST(TestTransportManagerDefault, Init_LastStateNotUsed) { EXPECT_CALL(transport_manager_settings, transport_manager_tcp_adapter_network_interface()) .WillRepeatedly(ReturnRef(network_interface)); + EXPECT_CALL(transport_manager_settings, bluetooth_uuid()) + .WillRepeatedly(Return(kBTUUID.data())); transport_manager.Init(mock_last_state); transport_manager.Stop(); @@ -114,6 +132,8 @@ TEST(TestTransportManagerDefault, Init_LastStateUsed) { EXPECT_CALL(transport_manager_settings, transport_manager_tcp_adapter_network_interface()) .WillRepeatedly(ReturnRef(network_interface)); + EXPECT_CALL(transport_manager_settings, bluetooth_uuid()) + .WillRepeatedly(Return(kBTUUID.data())); transport_manager.Init(mock_last_state); transport_manager.Stop(); } @@ -149,6 +169,8 @@ TEST(TestTransportManagerDefault, Init_LastStateUsed_InvalidPort) { EXPECT_CALL(transport_manager_settings, transport_manager_tcp_adapter_network_interface()) .WillRepeatedly(ReturnRef(network_interface)); + EXPECT_CALL(transport_manager_settings, bluetooth_uuid()) + .WillRepeatedly(Return(kBTUUID.data())); transport_manager.Init(mock_last_state); transport_manager.Stop(); } -- cgit v1.2.1 From f75d6bc793f18d8ce6692726e8e760c75f90012e Mon Sep 17 00:00:00 2001 From: JackLivio Date: Tue, 18 Jun 2019 14:43:52 -0400 Subject: Fix double declaration of nav_capability --- .../sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc index 2a25928b97..5c6839660f 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc @@ -89,7 +89,7 @@ void GetSystemCapabilityRequest::Run() { bool has_nav_capability = false; if (hmi_capabilities.navigation_capability()) { has_nav_capability = true; - auto nav_capability = *hmi_capabilities.navigation_capability(); + nav_capability = *hmi_capabilities.navigation_capability(); } has_nav_capability = application_manager_.GetAppServiceManager() -- cgit v1.2.1 From cca42bff92087e6dd3ee7ab30fd29d378a3c1015 Mon Sep 17 00:00:00 2001 From: Jacob Keeler Date: Wed, 19 Jun 2019 16:18:54 -0400 Subject: Update MOBILE API to version 6.0.0 --- src/components/interfaces/MOBILE_API.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/interfaces/MOBILE_API.xml b/src/components/interfaces/MOBILE_API.xml index a2cdb88b4d..e57d102d15 100644 --- a/src/components/interfaces/MOBILE_API.xml +++ b/src/components/interfaces/MOBILE_API.xml @@ -1,7 +1,7 @@ - + The request succeeded @@ -3830,7 +3830,7 @@ Audiobook: The total number of sections in the playback queue (e.g. the number of chapters in the book) - + Music: The album art of the current track Podcast: The podcast or chapter artwork of the current podcast episode -- cgit v1.2.1 From 99a756db08cdc0cf4a071c69a332616ba6391cd4 Mon Sep 17 00:00:00 2001 From: JackLivio Date: Thu, 20 Jun 2019 14:53:50 -0400 Subject: Update version since tags to 6.0 --- src/components/interfaces/MOBILE_API.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/interfaces/MOBILE_API.xml b/src/components/interfaces/MOBILE_API.xml index 8c0f29667c..fbbf09db9a 100644 --- a/src/components/interfaces/MOBILE_API.xml +++ b/src/components/interfaces/MOBILE_API.xml @@ -1,7 +1,7 @@ - + The request succeeded @@ -3100,14 +3100,14 @@ True if the hd radio is on, false if the radio is off - + Number of HD sub-channels if available - + - + The list of available HD sub-channel indexes. Empty list means no Hd channel is available. Read-only. @@ -3165,7 +3165,7 @@ value false means disabled, value true means enabled. - + @@ -3208,16 +3208,16 @@ True: Available, False: Not Available, Not present: Not Available. - + Availability of the getting the number of available HD channels. True: Available, False: Not Available, Not present: Not Available. - + - + Availability of the list of available HD sub-channel indexes. True: Available, False: Not Available, Not present: Not Available. @@ -3362,7 +3362,7 @@ True: Available, False: Not Available, Not present: Not Available. - + Availability of the control of enable/disable climate control. True: Available, False: Not Available, Not present: Not Available. -- cgit v1.2.1 From 009949655f9e34154a5a1ad75eb64a141fc9a44f Mon Sep 17 00:00:00 2001 From: JackLivio Date: Fri, 21 Jun 2019 10:50:40 -0400 Subject: Fixed min value for proposal implementation --- src/components/interfaces/HMI_API.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index beefad9863..488c986df5 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -1888,7 +1888,7 @@ The list of available hd sub-channel indexes. Empty list means no Hd channel is available. Read-only. - + Current HD sub-channel if available -- cgit v1.2.1