summaryrefslogtreecommitdiffstats
path: root/ahl-binding
diff options
context:
space:
mode:
authorLoïc Collignon <loic.collignon@iot.bzh>2018-12-18 11:55:58 +0100
committerLoïc Collignon [ IoT.bzh ] <loic.collignon@iot.bzh>2018-12-18 18:17:44 +0000
commit735112ef9923306539023c158d9ff9930f000b6b (patch)
tree8d344a645a220612141132b7b0159f09add241c5 /ahl-binding
parent9bbaea899215448ab1985ddb59f326218e75db77 (diff)
Added an 'activerole' verb
Control the currently opened role with the higher priority. Volume changed event nows specify if the corresponding role was the active one when the event was emitted. Bug: SPEC-1313 Change-Id: I87ae89ef03357a3537ada86f1dd3f319d13cbe85 Signed-off-by: Loïc Collignon <loic.collignon@iot.bzh>
Diffstat (limited to 'ahl-binding')
-rw-r--r--ahl-binding/ahl-api.cpp9
-rw-r--r--ahl-binding/ahl-api.hpp1
-rw-r--r--ahl-binding/ahl-binding.cpp44
-rw-r--r--ahl-binding/ahl-binding.hpp4
4 files changed, 56 insertions, 2 deletions
diff --git a/ahl-binding/ahl-api.cpp b/ahl-binding/ahl-api.cpp
index c5ade37..7ab3add 100644
--- a/ahl-binding/ahl-api.cpp
+++ b/ahl-binding/ahl-api.cpp
@@ -88,6 +88,15 @@ void ahl_api_get_roles(afb_req_t req)
}
/**
+ * @brief Callback invoked when clients call the verb 'activerole'.
+ * @param[in] req Request to handle.
+ */
+void ahl_api_activerole(afb_req_t req)
+{
+ ahl_binding_t::instance().activerole(req);
+}
+
+/**
* @brief Callback invoked when clients call the verb 'subscribe'.
* @param[in] req Request to handle.
*/
diff --git a/ahl-binding/ahl-api.hpp b/ahl-binding/ahl-api.hpp
index fed48ba..7561ab4 100644
--- a/ahl-binding/ahl-api.hpp
+++ b/ahl-binding/ahl-api.hpp
@@ -25,6 +25,7 @@ int ahl_api_init(afb_api_t);
void ahl_api_on_event(afb_api_t, const char* e, struct json_object* o);
int ahl_api_config_roles(afb_api_t, CtlSectionT*, json_object* o);
void ahl_api_get_roles(afb_req_t req);
+void ahl_api_activerole(afb_req_t req);
void ahl_api_subscribe(afb_req_t req);
void ahl_api_unsubscribe(afb_req_t req);
void ahl_api_role(afb_req_t req); \ No newline at end of file
diff --git a/ahl-binding/ahl-binding.cpp b/ahl-binding/ahl-binding.cpp
index af1ae79..84ba60a 100644
--- a/ahl-binding/ahl-binding.cpp
+++ b/ahl-binding/ahl-binding.cpp
@@ -46,6 +46,18 @@ void ahl_binding_t::load_static_verbs()
if (afb_api_add_verb(
handle_,
+ "activerole",
+ "Controls the currently active role",
+ ahl_api_activerole,
+ nullptr,
+ nullptr,
+ AFB_SESSION_NONE_X2, 0))
+ {
+ throw std::runtime_error("Failed to add 'activerole' verb to the API.");
+ }
+
+ if (afb_api_add_verb(
+ handle_,
"subscribe",
"Subscribe to \"volume_changed\" event",
ahl_api_subscribe,
@@ -250,6 +262,18 @@ int ahl_binding_t::create_api_verb(role_t* r)
return 0;
}
+role_t* ahl_binding_t::get_active_role()
+{
+ role_t* active = nullptr;
+ for(auto& r : roles_)
+ {
+ if (r.opened() && (active == nullptr || r.priority() > active->priority()))
+ active = &r;
+ }
+
+ return active;
+}
+
/**
* @brief Get the singleton instance.
* @return The unique instance.
@@ -352,12 +376,19 @@ void ahl_binding_t::event(std::string name, json_object* arg)
* @param[in] volume New volume.
* @return Zero on success, non-zero otherwise.
*/
-int ahl_binding_t::emit_volume_changed(const std::string& role, int volume) const
+int ahl_binding_t::emit_volume_changed(const std::string& role, int volume)
{
json_object* data = json_object_new_object();
json_object_object_add(data, "role", json_object_new_string(role.c_str()));
json_object_object_add(data, "volume", json_object_new_int(volume));
+ bool active = false;
+ role_t* activerole = get_active_role();
+ if (activerole && activerole->uid() == role)
+ active = true;
+
+ json_object_object_add(data, "active", json_object_new_boolean(active));
+
return afb_event_push(volume_changed_, data);
}
@@ -416,6 +447,17 @@ void ahl_binding_t::get_roles(afb_req_t req) const
}
/**
+ * @brief Controls the currently active role.
+ * @param[in] req Request to answer.
+ */
+void ahl_binding_t::activerole(afb_req_t req)
+{
+ role_t* role = get_active_role();
+ if (!role) afb_req_fail(req, "No active role!", nullptr);
+ else role->invoke(req);
+}
+
+/**
* @brief Subscribe to events.
* @param[in] req Request to answer.
*/
diff --git a/ahl-binding/ahl-binding.hpp b/ahl-binding/ahl-binding.hpp
index 881d906..47c343a 100644
--- a/ahl-binding/ahl-binding.hpp
+++ b/ahl-binding/ahl-binding.hpp
@@ -51,6 +51,7 @@ private:
int update_streams();
void update_stream(std::string hal, std::string stream, std::string deviceuri);
int create_api_verb(role_t* r);
+ role_t* get_active_role();
public:
static ahl_binding_t& instance();
@@ -60,10 +61,11 @@ public:
int preinit(afb_api_t handle);
int init();
void event(std::string name, json_object* arg);
- int emit_volume_changed(const std::string& role, int volume) const;
+ int emit_volume_changed(const std::string& role, int volume);
int parse_roles_config(json_object* o);
void get_roles(afb_req_t req) const;
+ void activerole(afb_req_t req);
void subscribe(afb_req_t req) const;
void unsubscribe(afb_req_t req) const;
};