summaryrefslogtreecommitdiff
path: root/src/components/application_manager/include/application_manager/help_prompt_manager_impl.h
blob: 3cd22a6afccacbc29208d965feb0bc6eb990077d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
/*
 * Copyright (c) 2018, Ford Motor Company
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following
 * disclaimer in the documentation and/or other materials provided with the
 * distribution.
 *
 * Neither the name of the Ford Motor Company nor the names of its contributors
 * may be used to endorse or promote products derived from this software
 * without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_HELP_PROMPT_MANAGER_IMPL_H_
#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"

namespace application_manager {

class Application;
class ApplicationManager;

/**
 * @brief The HelpPromptManagerImpl class implemented interface
 * HelpPromptManager
 * is a mechanism for handling "help" requests
 * by the user when the application does not provide any or such information.
 */
class HelpPromptManagerImpl : public HelpPromptManager {
 public:
  /**
   * @brief Container for buffering VR help commands
   */
  typedef std::pair<uint32_t, smart_objects::SmartObjectSPtr> VRCommandPair;
  typedef std::vector<VRCommandPair> VRCommandPairs;

  /**
   * @brief Class constructor
   * @param app owner for this class
   */
  HelpPromptManagerImpl(Application& app, ApplicationManager& app_manager);

  /**
   * @brief Class destructor
   */
  ~HelpPromptManagerImpl();

  /**
   * @brief Adds command to constructed values, and sends SetGlobalProperties if
   * required
   * @param cmd_id command unique ID
   * @param command smart object with commands to add
   * @param is_resumption flag for identifying if command was added during data
   * resumption process
   */
  void OnVrCommandAdded(const uint32_t cmd_id,
                        const smart_objects::SmartObject& command,
                        const bool is_resumption) OVERRIDE;

  /**
   * @brief Removes command from constructed values, and send
   * SetGlobalProperties if required
   * @param cmd_id command unique ID
   * @param is_resumption flag for identifying if command was added during data
   * resumption process
   */
  void OnVrCommandDeleted(const uint32_t cmd_id,
                          const bool is_resumption) OVERRIDE;

  /**
   * @brief Stop constructing vrHelp and/or helpPrompt if they are present in
   * message
   * @param msg containing GlobalProperties
   * @param is_response determines is the request or response for the for
   * the SetGlobalPropertiesRequest
   */
  void OnSetGlobalPropertiesReceived(const smart_objects::SmartObject& msg,
                                     const bool is_response) OVERRIDE;

  /**
   * @brief Get current sending type
   * @return current sending type
   */
  SendingType GetSendingType() const OVERRIDE;

 private:
  DISALLOW_COPY_AND_ASSIGN(HelpPromptManagerImpl);

  /**
   * @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 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 first kLimitCommand commands was changed after deleting
   * of the current command otherwise returns false
   */
  bool DeleteCommand(const uint32_t cmd_id);

  /**
   * @brief Send TTS request to HMI
   */
  void SendTTSRequest();

  /**
   * @brief Send UI request to HMI
   */
  void SendUIRequest();

  /**
   * @brief Send TTS and UI requests to HMI
   */
  void SendBothRequests();

  /**
   * @brief Send TTS or UI or both Requests
   */
  void SendRequests();

  /**
   * @brief Construct the helpPrompt parameter
   */
  void CreatePromptMsg(smart_objects::SmartObject& out_msg_params);

  /**
   * @brief Construct the vrHelp parameter
   */
  void CreateVRMsg(smart_objects::SmartObject& out_msg_params);

  /**
   * @brief Setting request type to send HMI
   * @param msg containing request or response for the
   * SetGlobalPropertiesRequest
   */
  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;

  /**
   * @brief Generate help prompt/vr help items array and write it into provided
   * smart object
   * @param out_msg_params output smart object
   * @param vr_key name of vr item in response
   */
  void GenerateVrItems(smart_objects::SmartObject& out_msg_params,
                       const char* vr_key) const;

  Application& app_;
  ApplicationManager& app_manager_;
  VRCommandPairs vr_commands_;
  sync_primitives::Lock vr_commands_lock_;
  SendingType sending_type_;
  bool is_tts_send_;
  bool is_ui_send_;
};

}  //  namespace application_manager

#endif  // SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_HELP_PROMPT_MANAGER_IMPL_H_