diff options
author | Andriy Byzhynar <AByzhynar@luxoft.com> | 2017-07-26 16:29:21 +0300 |
---|---|---|
committer | Andriy Byzhynar <AByzhynar@luxoft.com> | 2017-07-26 17:21:16 +0300 |
commit | 6877663729a70e3af2ddfd6c0be4f24575b8ec8c (patch) | |
tree | 926072be50a7f27c07ee7fa2833b0f0bde617dc7 | |
parent | cb7310c2670c9d073514ee1958bff311bc3c594f (diff) | |
download | sdl_core-6877663729a70e3af2ddfd6c0be4f24575b8ec8c.tar.gz |
Implement READ_ONLY parameters handling in SetInteriorVehicleData mobile
request
Added response to mobile generation when all request module type params
are READ ONLY
Added cutting-off of READ ONLY params when in request present both READ
ONLY and settable parameters
3 files changed, 110 insertions, 4 deletions
diff --git a/src/components/remote_control/include/remote_control/commands/set_interior_vehicle_data_request.h b/src/components/remote_control/include/remote_control/commands/set_interior_vehicle_data_request.h index b02e9fe2c3..9454909cca 100644 --- a/src/components/remote_control/include/remote_control/commands/set_interior_vehicle_data_request.h +++ b/src/components/remote_control/include/remote_control/commands/set_interior_vehicle_data_request.h @@ -69,6 +69,26 @@ class SetInteriorVehicleDataRequest : public BaseCommandRequest { std::string>& event); /** + * @brief Method that check if READ_ONLY parameters present + * @param request_params params from received message + * @return true if present , false - otherwise + */ + bool AreReadOnlyParamsPresent(const Json::Value& request_params); + + /** + * @brief Method that check if all request parameters are READ_ONLY + * @param request_params params from received message + * @return true if all are read only , false - otherwise + */ + bool AreAllParamsReadOnly(const Json::Value& request_params); + + /** + * @brief Method that cuts-off READ_ONLY parameters + * @param request_params params to handle + */ + void CutOffReadOnlyParams(Json::Value& request_params); + + /** * @brief SetInteriorVehicleDataRequest class destructor */ virtual ~SetInteriorVehicleDataRequest(); diff --git a/src/components/remote_control/include/remote_control/rc_module_constants.h b/src/components/remote_control/include/remote_control/rc_module_constants.h index 8c59062e61..457241de8e 100644 --- a/src/components/remote_control/include/remote_control/rc_module_constants.h +++ b/src/components/remote_control/include/remote_control/rc_module_constants.h @@ -209,14 +209,16 @@ const char kState[] = "state"; // ClimateControlData struct const char kFanSpeed[] = "fanSpeed"; -const char kCurrentTemp[] = "currentTemp"; -const char kDesiredTemp[] = "desiredTemp"; +const char kCurrentTemperature[] = "currentTemperature"; +const char kDesiredTemperature[] = "desiredTemperature"; const char kTemperatureUnit[] = "temperatureUnit"; const char kACEnable[] = "acEnable"; const char kCirculateAirEnable[] = "circulateAirEnable"; const char kAutoModeEnable[] = "autoModeEnable"; const char kDefrostZone[] = "defrostZone"; const char kDualModeEnable[] = "dualModeEnable"; +const char kACMaxEnable[] = "acMaxEnable"; +const char kVentilationMode[] = "ventilationMode"; // ClimateControlData struct // ModuleData struct @@ -261,7 +263,6 @@ const char kAll[] = "ALL"; // DefrostZone enum // TemperatureUnit enum -const char kKelvin[] = "KELVIN"; const char kFahrenheit[] = "FAHRENHEIT"; const char kCelsius[] = "CELSIUS"; // TemperatureUnit enum diff --git a/src/components/remote_control/src/commands/set_interior_vehicle_data_request.cc b/src/components/remote_control/src/commands/set_interior_vehicle_data_request.cc index d821f60760..1a91eefba0 100644 --- a/src/components/remote_control/src/commands/set_interior_vehicle_data_request.cc +++ b/src/components/remote_control/src/commands/set_interior_vehicle_data_request.cc @@ -36,6 +36,7 @@ #include "remote_control/message_helper.h" #include "functional_module/function_ids.h" #include "json/json.h" +#include "utils/helpers.h" namespace remote_control { @@ -44,6 +45,25 @@ namespace commands { using namespace json_keys; using namespace message_params; +namespace { +std::vector<std::string> GetModuleReadOnlyParams( + const std::string& module_type) { + std::vector<std::string> module_ro_params; + if (enums_value::kClimate == module_type) { + 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(kSignalStrength); + module_ro_params.push_back(kSignalChangeThreshold); + module_ro_params.push_back(kState); + module_ro_params.push_back(kRadioEnable); + } + return module_ro_params; +} + +} // namespace + CREATE_LOGGERPTR_GLOBAL(logger_, "SetInteriorVehicleDataRequest") SetInteriorVehicleDataRequest::SetInteriorVehicleDataRequest( @@ -56,7 +76,7 @@ SetInteriorVehicleDataRequest::~SetInteriorVehicleDataRequest() {} void SetInteriorVehicleDataRequest::Execute() { LOG4CXX_AUTO_TRACE(logger_); - const Json::Value request_params = + Json::Value request_params = MessageHelper::StringToValue(message_->json_message()); const Json::Value module_data = request_params[kModuleData]; const std::string module_type = module_data[kModuleType].asString(); @@ -71,6 +91,18 @@ void SetInteriorVehicleDataRequest::Execute() { } if (module_type_and_data_match) { + if (AreAllParamsReadOnly(request_params)) { + LOG4CXX_WARN(logger_, "All request params in module type are READ ONLY!"); + SendResponse(false, + result_codes::kReadOnly, + "All request params in module type are READ ONLY!"); + return; + } + if (AreReadOnlyParamsPresent(request_params)) { + LOG4CXX_DEBUG(logger_, "Request module type has READ ONLY parameters"); + LOG4CXX_DEBUG(logger_, "Cutting-off READ ONLY parameters... "); + CutOffReadOnlyParams(request_params); + } application_manager::MessagePtr hmi_request = CreateHmiRequest( functional_modules::hmi_api::set_interior_vehicle_data, request_params); service()->RemoveHMIFakeParameters(hmi_request); @@ -83,6 +115,58 @@ void SetInteriorVehicleDataRequest::Execute() { } } +bool SetInteriorVehicleDataRequest::AreReadOnlyParamsPresent( + const Json::Value& request_params) { + LOG4CXX_AUTO_TRACE(logger_); + std::vector<std::string> module_type_params = ControlData(request_params); + std::vector<std::string>::iterator it = module_type_params.begin(); + std::vector<std::string> ro_params = + GetModuleReadOnlyParams(ModuleType(request_params)); + for (; it != module_type_params.end(); ++it) { + if (helpers::in_range(ro_params, *it)) { + return true; + } + } + return false; +} + +void SetInteriorVehicleDataRequest::CutOffReadOnlyParams( + Json::Value& request_params) { + LOG4CXX_AUTO_TRACE(logger_); + std::vector<std::string> module_type_params = ControlData(request_params); + std::vector<std::string>::iterator it = module_type_params.begin(); + const std::string module_type = ModuleType(request_params); + std::vector<std::string> ro_params = GetModuleReadOnlyParams(module_type); + for (; it != module_type_params.end(); ++it) { + if (helpers::in_range(ro_params, *it)) { + if (enums_value::kClimate == module_type) { + request_params[message_params::kModuleData] + [message_params::kClimateControlData].removeMember(*it); + LOG4CXX_DEBUG(logger_, "Cutting-off READ ONLY parameter: " << *it); + } else if (enums_value::kRadio == module_type) { + request_params[message_params::kModuleData] + [message_params::kRadioControlData].removeMember(*it); + LOG4CXX_DEBUG(logger_, "Cutting-off READ ONLY parameter: " << *it); + } + } + } +} + +bool SetInteriorVehicleDataRequest::AreAllParamsReadOnly( + const Json::Value& request_params) { + LOG4CXX_AUTO_TRACE(logger_); + std::vector<std::string> module_type_params = ControlData(request_params); + std::vector<std::string>::iterator it = module_type_params.begin(); + std::vector<std::string> ro_params = + GetModuleReadOnlyParams(ModuleType(request_params)); + for (; it != module_type_params.end(); ++it) { + if (!helpers::in_range(ro_params, *it)) { + return false; + } + } + return true; +} + void SetInteriorVehicleDataRequest::OnEvent( const rc_event_engine::Event<application_manager::MessagePtr, std::string>& event) { @@ -116,6 +200,7 @@ std::string SetInteriorVehicleDataRequest::ModuleType( message.get(message_params::kModuleData, Json::Value(Json::objectValue)); return module_data.get(message_params::kModuleType, "").asString(); } + std::vector<std::string> SetInteriorVehicleDataRequest::ControlData( const Json::Value& message) { Json::Value data = |