summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrii Kalinich <AKalinich@luxoft.com>2018-07-13 00:01:02 +0300
committerAndrii Kalinich <AKalinich@luxoft.com>2018-07-14 23:15:28 +0300
commit2f05a630fe5f35bc46f3003d9fc35d3451c130c4 (patch)
tree6e241855bd3cdadfe949939bfb42febb0a1c3a71
parentab214008bfeb92248cce1812421b62dc125cfbb7 (diff)
downloadsdl_core-feature/handling_VR_help_requests.tar.gz
Updated logic regarding VR commands caching and limitationsfeature/handling_VR_help_requests
Also adressed review comments
-rw-r--r--src/components/application_manager/include/application_manager/help_prompt_manager_impl.h26
-rw-r--r--src/components/application_manager/src/help_prompt_manager_impl.cc143
2 files changed, 87 insertions, 82 deletions
diff --git a/src/components/application_manager/include/application_manager/help_prompt_manager_impl.h b/src/components/application_manager/include/application_manager/help_prompt_manager_impl.h
index 176adb6fac..42125375e2 100644
--- a/src/components/application_manager/include/application_manager/help_prompt_manager_impl.h
+++ b/src/components/application_manager/include/application_manager/help_prompt_manager_impl.h
@@ -34,6 +34,10 @@
#define SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_HELP_PROMPT_MANAGER_IMPL_H_
#include "application_manager/help_prompt_manager.h"
+
+#include <algorithm>
+#include <vector>
+
#include "utils/lock.h"
#include "utils/timer.h"
@@ -51,9 +55,10 @@ class ApplicationManager;
class HelpPromptManagerImpl : public HelpPromptManager {
public:
/**
- * @brief Continer for buffering VR help commands
+ * @brief Container for buffering VR help commands
*/
- typedef std::map<uint32_t, smart_objects::SmartObjectSPtr> VRCommandsMap;
+ typedef std::pair<uint32_t, smart_objects::SmartObjectSPtr> VRCommandPair;
+ typedef std::vector<VRCommandPair> VRCommandPairs;
/**
* @brief Class constructor
@@ -111,14 +116,16 @@ class HelpPromptManagerImpl : public HelpPromptManager {
* @brief Add new smart object with VR command to the map
* @param cmd_id ID of VR command
* @param command smart object containing VR command structure
- * @return true if command was added successfully otherwise returns false
+ * @return true if first kLimitCommand commands was changed after adding
+ * of the current command otherwise returns false
*/
bool AddCommand(const uint32_t cmd_id,
const smart_objects::SmartObject& command);
/**
* @brief Delete VR command from map by its cmd_id
* @param cmd_id ID of VR command
- * @return true if command was successfully deleted otherwise returns false
+ * @return true if first kLimitCommand commands was changed after deleting
+ * of the current command otherwise returns false
*/
bool DeleteCommand(const uint32_t cmd_id);
@@ -159,12 +166,19 @@ class HelpPromptManagerImpl : public HelpPromptManager {
*/
void SetSendingType(const smart_objects::SmartObject& msg);
+ /**
+ * @brief Get the total count of commands in VRCommand pairs
+ * @param end_element pointer to VRCommandPairs element to which commands
+ * should be counted
+ * @return total count of commands
+ */
+ size_t GetCommandsCount(VRCommandPairs::const_iterator end_element) const;
+
Application& app_;
ApplicationManager& app_manager_;
- VRCommandsMap vr_commands_;
+ VRCommandPairs vr_commands_;
sync_primitives::Lock vr_commands_lock_;
SendingType sending_type_;
- std::size_t count_vr_commands_;
bool is_tts_send_;
bool is_ui_send_;
};
diff --git a/src/components/application_manager/src/help_prompt_manager_impl.cc b/src/components/application_manager/src/help_prompt_manager_impl.cc
index 6581c7edd1..0587327791 100644
--- a/src/components/application_manager/src/help_prompt_manager_impl.cc
+++ b/src/components/application_manager/src/help_prompt_manager_impl.cc
@@ -43,7 +43,7 @@
CREATE_LOGGERPTR_GLOBAL(logger_, "HelpPromptManagerImpl")
namespace {
-const std::size_t kLimitCommand = 30;
+const size_t kLimitCommand = 30;
}
namespace application_manager {
@@ -53,7 +53,6 @@ HelpPromptManagerImpl::HelpPromptManagerImpl(Application& app,
: app_(app)
, app_manager_(app_manager)
, sending_type_(SendingType::kSendBoth)
- , count_vr_commands_(0)
, is_tts_send_(false)
, is_ui_send_(false) {}
@@ -63,66 +62,71 @@ HelpPromptManagerImpl::~HelpPromptManagerImpl() {
bool HelpPromptManagerImpl::AddCommand(
const uint32_t cmd_id, const smart_objects::SmartObject& command) {
+ if (!command.keyExists(strings::vr_commands)) {
+ LOG4CXX_DEBUG(logger_, "vr_commands does`t present");
+ return false;
+ }
+
sync_primitives::AutoLock lock(vr_commands_lock_);
- auto it = vr_commands_.find(cmd_id);
+ auto it = std::find_if(
+ vr_commands_.begin(),
+ vr_commands_.end(),
+ [cmd_id](const VRCommandPair& pair) { return pair.first == cmd_id; });
+
if (vr_commands_.end() != it) {
LOG4CXX_DEBUG(logger_, "Commands with id:" << cmd_id << " already exists");
return false;
}
- if (false == command.keyExists(strings::vr_commands)) {
- LOG4CXX_DEBUG(logger_, "vr_commands does`t present");
- return false;
- }
const smart_objects::SmartObject& commands = command[strings::vr_commands];
- const std::size_t count_new_commands = commands.length();
+ const size_t count_new_commands = commands.length();
+ const bool limit_exceeded =
+ kLimitCommand <= GetCommandsCount(vr_commands_.end());
- LOG4CXX_DEBUG(logger_, "Commands to add: " << count_new_commands);
- if (count_vr_commands_ >= kLimitCommand) {
- LOG4CXX_DEBUG(logger_, "Commands limit is exceeded");
- return false;
- }
-
- const std::size_t available_count = kLimitCommand - count_vr_commands_;
- const std::size_t count_to_add = available_count > count_new_commands
- ? count_new_commands
- : available_count;
- LOG4CXX_DEBUG(logger_, "Will be added " << count_to_add << " commands");
+ LOG4CXX_DEBUG(logger_, "Will be added " << count_new_commands << " commands");
- vr_commands_[cmd_id] = utils::MakeShared<smart_objects::SmartObject>(
- smart_objects::SmartType_Array);
- smart_objects::SmartArray& ar_vr_cmd = *(vr_commands_[cmd_id]->asArray());
+ smart_objects::SmartObjectSPtr vr_item =
+ utils::MakeShared<smart_objects::SmartObject>(
+ smart_objects::SmartType_Array);
+ smart_objects::SmartArray& ar_vr_cmd = *(vr_item->asArray());
smart_objects::SmartArray& ar_cmd = *(commands.asArray());
- ar_vr_cmd.reserve(count_vr_commands_ + count_to_add);
+ ar_vr_cmd.reserve(count_new_commands);
ar_vr_cmd.insert(
- ar_vr_cmd.end(), ar_cmd.begin(), ar_cmd.begin() + count_to_add);
+ ar_vr_cmd.end(), ar_cmd.begin(), ar_cmd.begin() + count_new_commands);
+ vr_commands_.push_back(std::make_pair(cmd_id, vr_item));
LOG4CXX_DEBUG(logger_,
"VR commands with id: " << cmd_id << " added for appID: "
- << app_.app_id());
- count_vr_commands_ += count_to_add;
- return true;
+ << app_.app_id() << ". Total "
+ << vr_commands_.size() << " in cache");
+
+ return !limit_exceeded;
}
bool HelpPromptManagerImpl::DeleteCommand(const uint32_t cmd_id) {
LOG4CXX_AUTO_TRACE(logger_);
+
sync_primitives::AutoLock lock(vr_commands_lock_);
- auto it = vr_commands_.find(cmd_id);
+ auto it = std::find_if(
+ vr_commands_.begin(),
+ vr_commands_.end(),
+ [cmd_id](const VRCommandPair& pair) { return pair.first == cmd_id; });
+
if (vr_commands_.end() == it) {
LOG4CXX_WARN(logger_, "VR command with id: " << cmd_id << " not found");
return false;
}
- count_vr_commands_ -= it->second->length();
-
+ const size_t commands_before_current = GetCommandsCount(it);
vr_commands_.erase(it);
- LOG4CXX_DEBUG(
- logger_,
- "VR command with id: "
- << cmd_id << " deleted for appID: " << app_.app_id()
- << ". Remaining number of commands: " << count_vr_commands_);
- return true;
+ LOG4CXX_DEBUG(logger_,
+ "VR command with id: "
+ << cmd_id << " found after " << commands_before_current
+ << " commands was deleted for appID: " << app_.app_id()
+ << " Cache size after deleting: " << vr_commands_.size());
+
+ return commands_before_current < kLimitCommand;
}
void HelpPromptManagerImpl::OnVrCommandAdded(
@@ -185,27 +189,22 @@ void HelpPromptManagerImpl::OnSetGlobalPropertiesReceived(
HelpPromptManagerImpl::SendingType HelpPromptManagerImpl::GetSendingType()
const {
- if (is_tts_send_ && is_ui_send_) {
- return sending_type_;
- } else if (is_tts_send_) {
- return SendingType::kSendHelpPrompt == sending_type_
- ? SendingType::kNoneSend
- : SendingType::kSendVRHelp;
- } else if (is_ui_send_) {
- return SendingType::kSendVRHelp == sending_type_
- ? SendingType::kNoneSend
- : SendingType::kSendHelpPrompt;
- }
-
return sending_type_;
}
+size_t HelpPromptManagerImpl::GetCommandsCount(
+ VRCommandPairs::const_iterator end_element) const {
+ size_t commands_count = 0;
+ std::for_each(vr_commands_.begin(),
+ end_element,
+ [&commands_count](const VRCommandPair& pair) {
+ commands_count += pair.second->length();
+ });
+ return commands_count;
+}
+
void HelpPromptManagerImpl::SendTTSRequest() {
LOG4CXX_AUTO_TRACE(logger_);
- if (vr_commands_.empty()) {
- LOG4CXX_DEBUG(logger_, "vr_commands_ is empty");
- return;
- }
LOG4CXX_DEBUG(logger_, "TTS request for appID:" << app_.app_id());
smart_objects::SmartObjectSPtr tts_global_properties =
utils::MakeShared<smart_objects::SmartObject>(
@@ -240,10 +239,6 @@ void HelpPromptManagerImpl::SendTTSRequest() {
void HelpPromptManagerImpl::SendUIRequest() {
LOG4CXX_AUTO_TRACE(logger_);
- if (vr_commands_.empty()) {
- LOG4CXX_DEBUG(logger_, "vr_commands_ is empty");
- return;
- }
LOG4CXX_DEBUG(logger_, "UI request for appID:" << app_.app_id());
smart_objects::SmartObjectSPtr ui_global_properties =
utils::MakeShared<smart_objects::SmartObject>(
@@ -286,11 +281,6 @@ void HelpPromptManagerImpl::SendRequests() {
LOG4CXX_AUTO_TRACE(logger_);
sync_primitives::AutoLock lock(vr_commands_lock_);
- if (vr_commands_.empty()) {
- LOG4CXX_DEBUG(logger_, "vr_commands_ is empty");
- return;
- }
-
switch (sending_type_) {
case SendingType::kSendHelpPrompt:
SendTTSRequest();
@@ -312,18 +302,16 @@ void HelpPromptManagerImpl::SendRequests() {
void HelpPromptManagerImpl::CreatePromptMsg(
smart_objects::SmartObject& out_msg_params) {
LOG4CXX_AUTO_TRACE(logger_);
- if (vr_commands_.empty()) {
- LOG4CXX_DEBUG(logger_, "vr_commands_ is empty");
- return;
- }
out_msg_params[strings::help_prompt] =
smart_objects::SmartObject(smart_objects::SmartType_Array);
uint32_t index = 0;
- for (const auto& it : vr_commands_) {
- for (std::size_t i = 0; i < it.second->length(); ++i) {
+ for (size_t i = 0; i < vr_commands_.size(); ++i) {
+ const VRCommandPair& pair = vr_commands_[i];
+ for (size_t j = 0; j < pair.second->length() && index < kLimitCommand;
+ ++j) {
smart_objects::SmartObject item(smart_objects::SmartType_Map);
- item[strings::text] = it.second->getElement(i).asString();
+ item[strings::text] = pair.second->getElement(j).asString();
item[strings::type] = mobile_apis::SpeechCapabilities::SC_TEXT;
out_msg_params[strings::help_prompt][index++] = item;
@@ -335,10 +323,6 @@ void HelpPromptManagerImpl::CreatePromptMsg(
void HelpPromptManagerImpl::CreateVRMsg(
smart_objects::SmartObject& out_msg_params) {
LOG4CXX_AUTO_TRACE(logger_);
- if (vr_commands_.empty()) {
- LOG4CXX_DEBUG(logger_, "vr_commands_ is empty");
- return;
- }
if (false == out_msg_params.keyExists(strings::vr_help_title)) {
if (app_.vr_help_title()) {
out_msg_params[strings::vr_help_title] = (*app_.vr_help_title());
@@ -349,17 +333,24 @@ void HelpPromptManagerImpl::CreateVRMsg(
out_msg_params[strings::vr_help] =
smart_objects::SmartObject(smart_objects::SmartType_Array);
uint32_t index = 0;
- for (const auto& it : vr_commands_) {
- for (std::size_t i = 0; i < it.second->length(); ++i) {
+ for (size_t i = 0; i < vr_commands_.size(); ++i) {
+ const VRCommandPair& pair = vr_commands_[i];
+ for (size_t j = 0; j < pair.second->length() && index < kLimitCommand;
+ ++j) {
smart_objects::SmartObject item(smart_objects::SmartType_Map);
- item[strings::text] = it.second->getElement(i).asString();
+ item[strings::text] = pair.second->getElement(j).asString();
item[strings::position] = index + 1;
out_msg_params[strings::vr_help][index++] = item;
}
}
- app_.set_vr_help(out_msg_params[strings::vr_help]);
+ if (out_msg_params[strings::vr_help].empty()) {
+ out_msg_params.erase(strings::vr_help);
+ app_.reset_vr_help();
+ } else {
+ app_.set_vr_help(out_msg_params[strings::vr_help]);
+ }
}
void HelpPromptManagerImpl::SetSendingType(