diff options
6 files changed, 470 insertions, 124 deletions
diff --git a/src/appMain/hmi_capabilities.json b/src/appMain/hmi_capabilities.json index a3f7bcd0a1..46fd31a352 100755 --- a/src/appMain/hmi_capabilities.json +++ b/src/appMain/hmi_capabilities.json @@ -504,204 +504,292 @@ "moduleName": "light", "supportedLights":[ { + "statusAvailable":true, "densityAvailable":true, "name":"FRONT_LEFT_HIGH_BEAM", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"FRONT_RIGHT_HIGH_BEAM", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"FRONT_LEFT_LOW_BEAM", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"FRONT_RIGHT_LOW_BEAM", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"FRONT_LEFT_PARKING_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"FRONT_RIGHT_PARKING_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"FRONT_LEFT_FOG_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"FRONT_RIGHT_FOG_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"FRONT_LEFT_DAYTIME_RUNNING_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"FRONT_RIGHT_DAYTIME_RUNNING_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"FRONT_LEFT_TURN_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"FRONT_RIGHT_TURN_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"REAR_LEFT_FOG_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"REAR_RIGHT_FOG_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"REAR_LEFT_TAIL_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"REAR_RIGHT_TAIL_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, - "name":"REAR_LEFT_BREAK_LIGHT", + "name":"REAR_LEFT_BRAKE_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, - "name":"REAR_RIGHT_BREAK_LIGHT", + "name":"REAR_RIGHT_BRAKE_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"REAR_LEFT_TURN_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"REAR_RIGHT_TURN_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"REAR_REGISTRATION_PLATE_LIGHT", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"HIGH_BEAMS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"LOW_BEAMS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"FOG_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"RUNNING_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"PARKING_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"BRAKE_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"REAR_REVERSING_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"SIDE_MARKER_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"LEFT_TURN_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"RIGHT_TURN_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"HAZARD_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"AMBIENT_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"OVERHEAD_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"READING_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"TRUNK_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"EXTERIOR_FRONT_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"EXTERIOR_REAR_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"EXTERIOR_LEFT_LIGHTS", "rgbColorSpaceAvailable":true }, { + "statusAvailable":true, "densityAvailable":true, "name":"EXTERIOR_RIGHT_LIGHTS", "rgbColorSpaceAvailable":true + }, + { + "statusAvailable":false, + "densityAvailable":false, + "name":"REAR_CARGO_LIGHTS", + "rgbColorSpaceAvailable":false + }, + { + "statusAvailable":false, + "densityAvailable":false, + "name":"REAR_TRUCK_BED_LIGHTS", + "rgbColorSpaceAvailable":false + }, + { + "statusAvailable":false, + "densityAvailable":false, + "name":"REAR_TRAILER_LIGHTS", + "rgbColorSpaceAvailable":false + }, + { + "statusAvailable":false, + "densityAvailable":false, + "name":"LEFT_SPOT_LIGHTS", + "rgbColorSpaceAvailable":false + }, + { + "statusAvailable":false, + "densityAvailable":false, + "name":"RIGHT_SPOT_LIGHTS", + "rgbColorSpaceAvailable":false + }, + { + "statusAvailable":false, + "densityAvailable":false, + "name":"LEFT_PUDDLE_LIGHTS", + "rgbColorSpaceAvailable":false + }, + { + "statusAvailable":false, + "densityAvailable":false, + "name":"RIGHT_PUDDLE_LIGHTS", + "rgbColorSpaceAvailable":false + }, + { + "statusAvailable":true, + "densityAvailable":false, + "name":"EXTERIOR_ALL_LIGHTS", + "rgbColorSpaceAvailable":false } ] }, diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/commands/mobile/set_interior_vehicle_data_request.h b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/commands/mobile/set_interior_vehicle_data_request.h index d5de4981c6..128c668ee9 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/commands/mobile/set_interior_vehicle_data_request.h +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/commands/mobile/set_interior_vehicle_data_request.h @@ -39,6 +39,11 @@ namespace rc_rpc_plugin { namespace app_mngr = application_manager; namespace commands { + +enum capabilitiesStatus { success, missedLightName, missedParam, readOnly }; + +typedef std::pair<std::string, capabilitiesStatus> ModuleCapability; + class SetInteriorVehicleDataRequest : public RCCommandRequest { public: SetInteriorVehicleDataRequest( @@ -81,10 +86,12 @@ class SetInteriorVehicleDataRequest : public RCCommandRequest { /** * @brief Method that check if READ_ONLY parameters present - * @param request_params params from received message + * @param request_params params from received message, + * @param module_data_capabilities info for notification to mobile * @return true if present , false - otherwise */ - bool AreReadOnlyParamsPresent(const smart_objects::SmartObject& module_data); + bool AreReadOnlyParamsPresent(const smart_objects::SmartObject& module_data, + ModuleCapability& module_data_capabilities); /** * @brief Method that check if all request parameters are READ_ONLY @@ -95,7 +102,7 @@ class SetInteriorVehicleDataRequest : public RCCommandRequest { /** * @brief Method that cuts-off READ_ONLY parameters - * @param request_params params to handle + * @param module_data params to handle */ void CutOffReadOnlyParams(smart_objects::SmartObject& module_data); 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 e80507445b..1951af1a24 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 @@ -52,6 +52,7 @@ const char kSupportedLights[] = "supportedLights"; // LightControlCapabilities const char kName[] = "name"; +const char kStatusAvailable[] = "statusAvailable"; const char kDensityAvailable[] = "densityAvailable"; const char kRGBColorSpaceAvailable[] = "rgbColorSpaceAvailable"; @@ -178,9 +179,9 @@ const char kHeatedMirrorsEnable[] = "heatedMirrorsEnable"; // LightControlData const char kLightState[] = "lightState"; -const char kStatus[] = "status"; -const char kDensity[] = "density"; -const char kColor[] = "color"; +const char kLightStatus[] = "status"; +const char kLightDensity[] = "density"; +const char kLightColor[] = "color"; // AudioControlData const char kSource[] = "source"; 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 17a492b5aa..e6f19a889c 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 @@ -59,10 +59,22 @@ std::vector<std::string> GetModuleReadOnlyParams( module_ro_params.push_back(kSignalChangeThreshold); module_ro_params.push_back(kState); module_ro_params.push_back(kSisData); + } else if (enums_value::kLight == module_type) { + module_ro_params.push_back(kLightStatus); } + return module_ro_params; } +const std::map<std::string, std::string> GetLightCapabilitiesMapping() { + std::map<std::string, std::string> mapping = { + {message_params::kId, strings::kName}, + {message_params::kLightStatus, strings::kStatusAvailable}, + {message_params::kLightDensity, strings::kDensityAvailable}, + {message_params::kLightColor, strings::kRGBColorSpaceAvailable}}; + return mapping; +} + const std::map<std::string, std::string> GetModuleDataToCapabilitiesMapping() { std::map<std::string, std::string> mapping; // climate @@ -113,6 +125,7 @@ const std::map<std::string, std::string> GetModuleDataToCapabilitiesMapping() { mapping["massageMode"] = "massageModeAvailable"; mapping["massageCushionFirmness"] = "massageCushionFirmnessAvailable"; mapping["memory"] = "memoryAvailable"; + // audio mapping["source"] = "sourceAvailable"; mapping["keepContext"] = "keepContextAvailable"; @@ -146,45 +159,98 @@ const std::string LightName(const smart_objects::SmartObject& light_name) { return ok ? name : "unknown"; } -bool CheckLightDataByCapabilities( +/** + * @brief Check whether the parameter exist in capabilities + * @param smart object of capabilities + * @param mapping - map of module data and capabilities + * @param request_parameter - string + * @param switched_off_result - ref of mobile_apis::Result + * @return success if parameter exist in capabilities missedParam otherwise + */ +capabilitiesStatus GetItemCapability( const smart_objects::SmartObject& capabilities, - const smart_objects::SmartObject& light_data) { + const std::map<std::string, std::string>& mapping, + const std::string& request_parameter, + const mobile_apis::Result::eType& switched_off_result) { + const auto it = mapping.find(request_parameter); + + if (it == mapping.end()) { + LOG4CXX_DEBUG(logger_, + "Parameter " << request_parameter + << " doesn't exist in capabilities."); + return capabilitiesStatus::missedParam; + } + + const std::string& caps_key = it->second; + + LOG4CXX_DEBUG(logger_, + "Checking request parameter " + << request_parameter + << " with capabilities. Appropriate key is " << caps_key); + + if (!capabilities.keyExists(caps_key)) { + LOG4CXX_DEBUG(logger_, + "Capability " << caps_key + << " is missed in RemoteControl capabilities"); + return capabilitiesStatus::missedParam; + } + + if (!capabilities[caps_key].asBool()) { + LOG4CXX_DEBUG(logger_, + "Capability " + << caps_key + << " is switched off in RemoteControl capabilities"); + capabilitiesStatus status = capabilitiesStatus::missedParam; + if (mobile_apis::Result::READ_ONLY == switched_off_result) { + status = capabilitiesStatus::readOnly; + } + return status; + } + + return capabilitiesStatus::success; +} + +/** + * @brief Check whether the cpabilities for light allowed + * @param smart object of capabilities + * @param smart object of control_data + * @return pair of state and capability status - ModuleCapability + */ +ModuleCapability GetLightDataCapabilities( + const smart_objects::SmartObject& capabilities, + const smart_objects::SmartObject& control_data) { LOG4CXX_AUTO_TRACE(logger_); - std::map<std::string, std::string> lightCapsMapping = { - {message_params::kId, strings::kName}, - {message_params::kDensity, strings::kDensityAvailable}, - {message_params::kColor, strings::kRGBColorSpaceAvailable}}; - auto it = light_data.map_begin(); - for (; it != light_data.map_end(); ++it) { - if (message_params::kStatus == it->first || - message_params::kId == it->first) { + std::map<std::string, std::string> mapping = GetLightCapabilitiesMapping(); + + for (auto it = control_data.map_begin(); it != control_data.map_end(); ++it) { + const std::string& request_parameter = it->first; + + if (message_params::kId == request_parameter) { continue; } - const std::string& caps_key = lightCapsMapping[it->first]; - LOG4CXX_DEBUG(logger_, - "Checking request parameter " - << it->first << " with capabilities. Appropriate key is " - << caps_key); - - if (!capabilities.keyExists(caps_key)) { - LOG4CXX_DEBUG(logger_, - "Capability " - << caps_key - << " is missed in RemoteControl capabilities"); - return false; - } - if (!capabilities[caps_key].asBool()) { - LOG4CXX_DEBUG(logger_, - "Capability " - << caps_key - << " is switched off in RemoteControl capabilities"); - return false; + + const capabilitiesStatus status_item_capability = + GetItemCapability(capabilities, + mapping, + request_parameter, + mobile_apis::Result::READ_ONLY); + + if (capabilitiesStatus::success != status_item_capability) { + return std::make_pair(message_params::kLightState, + status_item_capability); } } - return true; + + return std::make_pair("", capabilitiesStatus::success); } -bool CheckLightNameByCapabilities( +/** + * @brief Check whether the light name exists in capabilities + * @param smart object of capabilities_status + * @param smart object of light_data + * @return pair of state and capability status - ModuleCapability + */ +ModuleCapability GetLightNameCapabilities( const smart_objects::SmartObject& capabilities_status, const smart_objects::SmartObject& light_data) { LOG4CXX_AUTO_TRACE(logger_); @@ -193,90 +259,101 @@ bool CheckLightNameByCapabilities( const smart_objects::SmartObject& so = *it; const int64_t current_id = so[message_params::kName].asInt(); if (current_id == light_data[message_params::kId].asInt()) { - return CheckLightDataByCapabilities(so, light_data); + return GetLightDataCapabilities(so, light_data); } } LOG4CXX_DEBUG(logger_, "There is no such light name in capabilities"); - return false; -} - -bool CheckRadioBandByCapabilities( - const smart_objects::SmartObject& capabilities_status, - const smart_objects::SmartObject& request_parameter) { - mobile_apis::RadioBand::eType radio_band = - static_cast<mobile_apis::RadioBand::eType>(request_parameter.asUInt()); - if (mobile_apis::RadioBand::XM == radio_band) { - if (!capabilities_status.keyExists(strings::kSiriusxmRadioAvailable)) { - LOG4CXX_DEBUG(logger_, - "Capability " - << strings::kSiriusxmRadioAvailable - << " is missed in RemoteControl capabilities"); - return false; - } - if (!capabilities_status[strings::kSiriusxmRadioAvailable].asBool()) { - LOG4CXX_DEBUG(logger_, - "Capability " - << strings::kSiriusxmRadioAvailable - << " is switched off in RemoteControl capabilities"); - return false; - } - } - return true; + return std::make_pair(message_params::kLightState, + capabilitiesStatus::missedLightName); } -bool CheckControlDataByCapabilities( - const smart_objects::SmartObject& capabilities_status, +/** + * @brief Check whether the exists light data related to correspondent + * capabilities + * @param smart object of capabilities + * @param smart object of control_data + * @return pair of state and capability status - ModuleCapability + */ +ModuleCapability GetControlDataCapabilities( + const smart_objects::SmartObject& capabilities, const smart_objects::SmartObject& control_data) { LOG4CXX_AUTO_TRACE(logger_); std::map<std::string, std::string> mapping = GetModuleDataToCapabilitiesMapping(); - auto it = control_data.map_begin(); - for (; it != control_data.map_end(); ++it) { + + for (auto it = control_data.map_begin(); it != control_data.map_end(); ++it) { const std::string& request_parameter = it->first; if (message_params::kId == request_parameter) { continue; } if (message_params::kLightState == request_parameter) { auto light_data = control_data[request_parameter].asArray()->begin(); + ModuleCapability light_capability = + std::make_pair("", capabilitiesStatus::success); + for (; light_data != control_data[request_parameter].asArray()->end(); ++light_data) { - if (!CheckLightNameByCapabilities( - capabilities_status[strings::kSupportedLights], *light_data)) { - return false; + light_capability = GetLightNameCapabilities( + capabilities[strings::kSupportedLights], *light_data); + + if (capabilitiesStatus::success != light_capability.second) { + return light_capability; } } - return true; - } - const std::string& caps_key = mapping[request_parameter]; - LOG4CXX_DEBUG(logger_, - "Checking request parameter " - << request_parameter - << " with capabilities. Appropriate key is " << caps_key); - - if (!capabilities_status.keyExists(caps_key)) { - LOG4CXX_DEBUG(logger_, - "Capability " - << caps_key - << " is missed in RemoteControl capabilities"); - return false; + + return light_capability; } - if (!capabilities_status[caps_key].asBool()) { - LOG4CXX_DEBUG(logger_, - "Capability " - << caps_key - << " is switched off in RemoteControl capabilities"); - return false; + + const capabilitiesStatus status_item_capability = + GetItemCapability(capabilities[0], + mapping, + request_parameter, + mobile_apis::Result::UNSUPPORTED_RESOURCE); + + if (capabilitiesStatus::success != status_item_capability) { + return std::make_pair("", status_item_capability); } - if (message_params::kBand == request_parameter && - !CheckRadioBandByCapabilities(capabilities_status, - control_data[request_parameter])) { - return false; + } + + return std::make_pair("", capabilitiesStatus::success); +} + +/** + * @brief Check whether the exists hmi data related to correspondent + * capabilities + * @param smart object of capabilities + * @param smart object of control_data + * @return pair of state and capability status - ModuleCapability + */ +ModuleCapability GetHmiControlDataCapabilities( + const smart_objects::SmartObject& capabilities, + const smart_objects::SmartObject& control_data) { + LOG4CXX_AUTO_TRACE(logger_); + std::map<std::string, std::string> mapping = + GetModuleDataToCapabilitiesMapping(); + + for (auto it = control_data.map_begin(); it != control_data.map_end(); ++it) { + const capabilitiesStatus status_item_capability = + GetItemCapability(capabilities, + mapping, + it->first, + mobile_apis::Result::UNSUPPORTED_RESOURCE); + + if (capabilitiesStatus::success != status_item_capability) { + return std::make_pair("", status_item_capability); } } - return true; + + return std::make_pair("", capabilitiesStatus::success); } -bool CheckIfModuleDataExistInCapabilities( +/** + * @brief Check whether rc module data capabilities are presented + * @param smart object of rc_capabilities + * @param smart object of module_data + * @return pair of state and capability status - ModuleCapability + */ +ModuleCapability GetModuleDataCapabilities( const smart_objects::SmartObject& rc_capabilities, const smart_objects::SmartObject& module_data) { LOG4CXX_AUTO_TRACE(logger_); @@ -285,29 +362,31 @@ bool CheckIfModuleDataExistInCapabilities( const auto& get_module_data_key = RCHelpers::GetModuleTypeToDataMapping(); const auto& get_capabilities_key = RCHelpers::GetModuleTypeToCapabilitiesMapping(); + ModuleCapability module_data_capabilities = + std::make_pair("", capabilitiesStatus::missedParam); - bool is_module_data_valid = false; for (const auto& module_type : all_module_types) { const auto module_data_key = get_module_data_key(module_type); const auto capabilities_key = get_capabilities_key(module_type); if (module_data.keyExists(module_data_key)) { if (!rc_capabilities.keyExists(capabilities_key)) { LOG4CXX_DEBUG(logger_, module_data_key << " capabilities not present"); - return false; + return module_data_capabilities; } const smart_objects::SmartObject& caps = rc_capabilities[capabilities_key]; - if (message_params::kHmiSettingsControlData == module_data_key || - message_params::kLightControlData == module_data_key) { - is_module_data_valid = - CheckControlDataByCapabilities(caps, module_data[module_data_key]); + + if (message_params::kHmiSettingsControlData == module_data_key) { + module_data_capabilities = + GetHmiControlDataCapabilities(caps, module_data[module_data_key]); } else { - is_module_data_valid = CheckControlDataByCapabilities( - caps[0], module_data[module_data_key]); + module_data_capabilities = + GetControlDataCapabilities(caps, module_data[module_data_key]); } } } - return is_module_data_valid; + + return module_data_capabilities; } bool isModuleTypeAndDataMatch(const std::string& module_type, @@ -325,6 +404,35 @@ bool isModuleTypeAndDataMatch(const std::string& module_type, return module_type_and_data_match; } +mobile_apis::Result::eType PrepareResultCodeAndInfo( + const ModuleCapability module_data_capabilities, std::string& info) { + mobile_apis::Result::eType result_code = + mobile_apis::Result::UNSUPPORTED_RESOURCE; + if (message_params::kLightState == module_data_capabilities.first) { + switch (module_data_capabilities.second) { + case capabilitiesStatus::missedLightName: + info = "The requested LightName is not supported by the vehicle."; + break; + case capabilitiesStatus::missedParam: + info = + "The requested parameter of the given LightName is not supported " + "by the vehicle."; + break; + case capabilitiesStatus::readOnly: + info = "The requested parameter is read-only."; + result_code = mobile_apis::Result::READ_ONLY; + break; + default: + break; + } + + } else { + info = "Accessing not supported module data."; + } + return result_code; + LOG4CXX_WARN(logger_, info); +} + void SetInteriorVehicleDataRequest::Execute() { LOG4CXX_AUTO_TRACE(logger_); @@ -335,15 +443,22 @@ void SetInteriorVehicleDataRequest::Execute() { if (isModuleTypeAndDataMatch(module_type, module_data)) { const smart_objects::SmartObject* rc_capabilities = hmi_capabilities_.rc_capability(); - if (rc_capabilities && - !CheckIfModuleDataExistInCapabilities(*rc_capabilities, module_data)) { - LOG4CXX_WARN(logger_, "Accessing not supported module data"); - SetResourceState(ModuleType(), ResourceState::FREE); - SendResponse(false, - mobile_apis::Result::UNSUPPORTED_RESOURCE, - "Accessing not supported module data"); - return; + ModuleCapability module_data_capabilities; + + if (rc_capabilities) { + module_data_capabilities = + GetModuleDataCapabilities(*rc_capabilities, module_data); + + if (capabilitiesStatus::success != module_data_capabilities.second) { + SetResourceState(ModuleType(), ResourceState::FREE); + std::string info; + mobile_apis::Result::eType result = + PrepareResultCodeAndInfo(module_data_capabilities, info); + SendResponse(false, result, info.c_str()); + return; + } } + if (AreAllParamsReadOnly(module_data)) { LOG4CXX_WARN(logger_, "All request params in module type are READ ONLY!"); SetResourceState(ModuleType(), ResourceState::FREE); @@ -352,11 +467,27 @@ void SetInteriorVehicleDataRequest::Execute() { "All request params in module type are READ ONLY!"); return; } - if (AreReadOnlyParamsPresent(module_data)) { + + module_data_capabilities = std::make_pair("", capabilitiesStatus::success); + + if (AreReadOnlyParamsPresent(module_data, module_data_capabilities)) { LOG4CXX_DEBUG(logger_, "Request module type has READ ONLY parameters"); + + if (enums_value::kLight == module_data_capabilities.first && + capabilitiesStatus::success != module_data_capabilities.second) { + SetResourceState(ModuleType(), ResourceState::FREE); + SendResponse( + false, + mobile_apis::Result::READ_ONLY, + "The LightStatus enum passed is READ ONLY and cannot be written."); + return; + } + LOG4CXX_DEBUG(logger_, "Cutting-off READ ONLY parameters... "); + CutOffReadOnlyParams(module_data); } + application_manager_.RemoveHMIFakeParameters(message_); app_mngr::ApplicationSharedPtr app = @@ -478,6 +609,8 @@ bool SetInteriorVehicleDataRequest::AreAllParamsReadOnly( return false; } } + + LOG4CXX_DEBUG(logger_, "All params are ReadOnly"); return true; } @@ -487,33 +620,84 @@ bool CheckReadOnlyParamsForAudio( const auto& equalizer_settings = module_type_params[message_params::kEqualizerSettings]; auto it = equalizer_settings.asArray()->begin(); + for (; it != equalizer_settings.asArray()->end(); ++it) { if (it->keyExists(message_params::kChannelName)) { LOG4CXX_DEBUG(logger_, - " READ ONLY parameter: " << message_params::kChannelName); + "READ ONLY parameter. ChannelName = " + << (*it)[message_params::kChannelName].asString()); return true; } } } + + return false; +} + +bool CheckReadOnlyParamsForLight( + const smart_objects::SmartObject& module_type_params) { + if (module_type_params.keyExists(message_params::kLightState)) { + const auto& light_state = module_type_params[message_params::kLightState]; + auto it = light_state.asArray()->begin(); + + for (; it != light_state.asArray()->end(); ++it) { + if (it->keyExists(message_params::kLightStatus)) { + const mobile_apis::LightStatus::eType light_status = + static_cast<mobile_apis::LightStatus::eType>( + (*it)[message_params::kLightStatus].asUInt()); + + if (helpers::Compare<mobile_apis::LightStatus::eType, + helpers::EQ, + helpers::ONE>(light_status, + mobile_apis::LightStatus::RAMP_UP, + mobile_apis::LightStatus::RAMP_DOWN, + mobile_apis::LightStatus::UNKNOWN, + mobile_apis::LightStatus::INVALID)) { + LOG4CXX_DEBUG(logger_, + "READ ONLY parameter. Status = " + << (*it)[message_params::kLightStatus].asInt()); + return true; + } + } + } + } + return false; } bool SetInteriorVehicleDataRequest::AreReadOnlyParamsPresent( - const smart_objects::SmartObject& module_data) { + const smart_objects::SmartObject& module_data, + ModuleCapability& module_data_capabilities) { LOG4CXX_AUTO_TRACE(logger_); const smart_objects::SmartObject& module_type_params = ControlData(module_data); - auto it = module_type_params.map_begin(); const std::string module_type = ModuleType(); - std::vector<std::string> ro_params = GetModuleReadOnlyParams(module_type); + if (enums_value::kAudio == module_type) { return CheckReadOnlyParamsForAudio(module_type_params); } + + if (enums_value::kLight == module_type) { + const bool result = CheckReadOnlyParamsForLight(module_type_params); + + if (result) { + module_data_capabilities = + std::make_pair(module_type, capabilitiesStatus::readOnly); + } + + return result; + } + + const std::vector<std::string> ro_params = + GetModuleReadOnlyParams(module_type); + auto it = module_type_params.map_begin(); + for (; it != module_type_params.map_end(); ++it) { if (helpers::in_range(ro_params, it->first)) { return true; } } + return false; } @@ -529,11 +713,13 @@ void SetInteriorVehicleDataRequest::CutOffReadOnlyParams( if (module_type_params.keyExists(it)) { if (enums_value::kClimate == module_type) { module_data[message_params::kClimateControlData].erase(it); - LOG4CXX_DEBUG(logger_, "Cutting-off READ ONLY parameter: " << it); } else if (enums_value::kRadio == module_type) { module_data[message_params::kRadioControlData].erase(it); - LOG4CXX_DEBUG(logger_, "Cutting-off READ ONLY parameter: " << it); + } else { + continue; } + + LOG4CXX_DEBUG(logger_, "Cutting-off READ ONLY parameter: " << it); } } diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index a9854ef730..a6f8bd3ce2 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -2244,6 +2244,27 @@ <element name="HAZARD_LIGHTS" value="511"> <description>Include all hazard lights: front_left, front_right, rear_left and rear_right.</description> </element> + <element name="REAR_CARGO_LIGHTS" value="512"> + <description>Cargo lamps illuminate the cargo area.</description> + </element> + <element name="REAR_TRUCK_BED_LIGHTS" value="513"> + <description>Truck bed lamps light up the bed of the truck.</description> + </element> + <element name="REAR_TRAILER_LIGHTS" value="514"> + <description>Trailer lights are lamps mounted on a trailer hitch.</description> + </element> + <element name="LEFT_SPOT_LIGHTS" value="515"> + <description>It is the spotlights mounted on the left side of a vehicle.</description> + </element> + <element name="RIGHT_SPOT_LIGHTS" value="516"> + <description>It is the spotlights mounted on the right side of a vehicle.</description> + </element> + <element name="LEFT_PUDDLE_LIGHTS" value="517"> + <description>Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.</description> + </element> + <element name="RIGHT_PUDDLE_LIGHTS" value="518"> + <description>Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.</description> + </element> <!-- Interior Lights by common function groups 801~900 --> <element name="AMBIENT_LIGHTS" value="801"/> @@ -2264,16 +2285,27 @@ <element name="EXTERIOR_RIGHT_LIGHTS" value="904"> <description>Include exterior lights located at the right side of the vehicle. For example, right puddle lights and spot lights.</description> </element> + <element name="EXTERIOR_ALL_LIGHTS" value="905"> + <description> Include all exterior lights around the vehicle.</description> + </element> </enum> <enum name="LightStatus"> <element name="ON"/> <element name="OFF"/> + <element name="RAMP_UP"/> + <element name="RAMP_DOWN"/> + <element name="UNKNOWN"/> + <element name="INVALID"/> </enum> <struct name="LightCapabilities"> <param name="name" type="LightName" mandatory="true" /> - <!-- Assuming light ON/OFF status is always available --> + <param name="statusAvailable" type="Boolean" mandatory="false"> + <description> + Indicates if the status (ON/OFF) can be set remotely. App shall not use read-only values (RAMP_UP/RAMP_DOWN/UNKNOWN/INVALID) in a setInteriorVehicleData request. + </description> + </param> <param name="densityAvailable" type="Boolean" mandatory="false"> <description> Indicates if the light's density can be set remotely (similar to a dimmer). diff --git a/src/components/interfaces/MOBILE_API.xml b/src/components/interfaces/MOBILE_API.xml index f2c05d99be..272f801381 100644 --- a/src/components/interfaces/MOBILE_API.xml +++ b/src/components/interfaces/MOBILE_API.xml @@ -3396,6 +3396,27 @@ <element name="HAZARD_LIGHTS" value="511"> <description>Include all hazard lights: front_left, front_right, rear_left and rear_right.</description> </element> + <element name="REAR_CARGO_LIGHTS" value="512"> + <description>Cargo lamps illuminate the cargo area.</description> + </element> + <element name="REAR_TRUCK_BED_LIGHTS" value="513"> + <description>Truck bed lamps light up the bed of the truck.</description> + </element> + <element name="REAR_TRAILER_LIGHTS" value="514"> + <description>Trailer lights are lamps mounted on a trailer hitch.</description> + </element> + <element name="LEFT_SPOT_LIGHTS" value="515"> + <description>It is the spotlights mounted on the left side of a vehicle.</description> + </element> + <element name="RIGHT_SPOT_LIGHTS" value="516"> + <description>It is the spotlights mounted on the right side of a vehicle.</description> + </element> + <element name="LEFT_PUDDLE_LIGHTS" value="517"> + <description>Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.</description> + </element> + <element name="RIGHT_PUDDLE_LIGHTS" value="518"> + <description>Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.</description> + </element> <!-- Interior Lights by common function groups 801~900 --> <element name="AMBIENT_LIGHTS" value="801"/> @@ -3416,16 +3437,27 @@ <element name="EXTERIOR_RIGHT_LIGHTS" value="904"> <description>Include exterior lights located at the right side of the vehicle. For example, right puddle lights and spot lights.</description> </element> + <element name="EXTERIOR_ALL_LIGHTS" value="905"> + <description> Include all exterior lights around the vehicle.</description> + </element> </enum> <enum name="LightStatus" since="5.0"> <element name="ON"/> <element name="OFF"/> + <element name="RAMP_UP"/> + <element name="RAMP_DOWN"/> + <element name="UNKNOWN"/> + <element name="INVALID"/> </enum> <struct name="LightCapabilities" since="5.0"> <param name="name" type="LightName" mandatory="true" /> - <!-- Assuming light ON/OFF status is always available --> + <param name="statusAvailable" type="Boolean" mandatory="false"> + <description> + Indicates if the status (ON/OFF) can be set remotely. App shall not use read-only values (RAMP_UP/RAMP_DOWN/UNKNOWN/INVALID) in a setInteriorVehicleData request. + </description> + </param> <param name="densityAvailable" type="Boolean" mandatory="false"> <description> Indicates if the light's density can be set remotely (similar to a dimmer). |