Languages changing depending on identity logged in 67/13067/3
authorLoïc Collignon <loic.collignon@iot.bzh>
Sat, 30 Dec 2017 15:04:18 +0000 (16:04 +0100)
committerRomain Forlot <romain.forlot@iot.bzh>
Thu, 4 Jan 2018 14:20:51 +0000 (14:20 +0000)
Change-Id: I8eca6e0f7ddd042c9434132537eeccd74b982718
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
update translation on language changed

Change-Id: I12130b4a1c5c6dad9658972d32b4b9e362a8d1cc
Signed-off-by: Loïc Collignon <loic.collignon@iot.bzh>
app/HVAC.qml
app/api/Binding.qml
binding/export.map
binding/hvac-demo-binding.c
package/config.xml

index c375f2f..b1925dd 100644 (file)
@@ -26,13 +26,14 @@ ApplicationWindow {
 
     Translator {
         id: translator
-//        language: 'ja_JP'
+        language: binding.language
     }
 
     API.Binding {
         id: binding
         url: bindingAddress
         onFanSpeedChanged: fanSpeedSlider.value = fanSpeed
+        onLanguageChanged: translator.language = language
     }
 
     ColumnLayout {
index 93da6f4..25388df 100644 (file)
@@ -27,6 +27,7 @@ WebSocket {
     property real fanSpeed: 0.0
     property real leftTemperature: 21.0
     property real rightTemperature: 21.0
+    property string language: "en_US"
 
     property Connections c : Connections {
         target: root
@@ -45,6 +46,11 @@ WebSocket {
             console.debug(JSON.stringify(json))
             sendTextMessage(JSON.stringify(json))
         }
+        onLanguageChanged: {
+            var json = [MessageId.call, '9999', 'hvac/set', {'Language': language}]
+            console.debug(JSON.stringify(json))
+            sendTextMessage(JSON.stringify(json))
+        }
     }
 
     onTextMessageReceived: {
@@ -62,6 +68,10 @@ WebSocket {
             root.statusString = "Bad return value, binding probably not installed"
             break
         case MessageId.event:
+            if (json[1] == "hvac/language")
+                console.log("HVAC event received: ",json[2])
+                root.language = json[2].data
+                root.statusString = "Language changed to "+language
             break
         }
     }
index 52c1b4a..eea0d7b 100644 (file)
@@ -1 +1 @@
-{ global: afbBindingV1*; local: *; };
+{ global: afbBindingV2*; local: *; };
index 72bdf06..8565b56 100644 (file)
 
 #include <json-c/json.h>
 
-#define AFB_BINDING_VERSION   1
+#define AFB_BINDING_VERSION 2
 #include <afb/afb-binding.h>
 
 #define CAN_DEV "vcan0"
 
+#ifndef NULL
+#define NULL 0
+#endif
+
 static const struct afb_binding_interface *interface;
+static struct afb_event event;
 
 /*****************************************************************************************/
 /*****************************************************************************************/
@@ -105,13 +110,13 @@ static int open_can_dev_helper()
 {
        struct ifreq ifr;
 
-       AFB_DEBUG(interface, "CAN Handler socket : %d", can_handler.socket);
+       AFB_DEBUG("CAN Handler socket : %d", can_handler.socket);
        close(can_handler.socket);
 
        can_handler.socket = socket(PF_CAN, SOCK_RAW, CAN_RAW);
        if (can_handler.socket < 0)
        {
-               AFB_ERROR(interface, "socket could not be created");
+               AFB_ERROR("socket could not be created");
        }
        else
        {
@@ -119,7 +124,7 @@ static int open_can_dev_helper()
                strcpy(ifr.ifr_name, CAN_DEV);
                if(ioctl(can_handler.socket, SIOCGIFINDEX, &ifr) < 0)
                {
-                       AFB_ERROR(interface, "ioctl failed");
+                       AFB_ERROR("ioctl failed");
                }
                else
                {
@@ -129,7 +134,7 @@ static int open_can_dev_helper()
                        // And bind it to txAddress
                        if (bind(can_handler.socket, (struct sockaddr *)&can_handler.txAddress, sizeof(can_handler.txAddress)) < 0)
                        {
-                               AFB_ERROR(interface, "bind failed");
+                               AFB_ERROR("bind failed");
                        }
                        else {
                                return 0;
@@ -146,7 +151,7 @@ static int open_can_dev()
        int rc = retry(open_can_dev_helper);
        if(rc < 0)
        {
-               AFB_ERROR(interface, "Open of interface %s failed. Falling back to simulation mode", CAN_DEV);
+               AFB_ERROR("Open of interface %s failed. Falling back to simulation mode", CAN_DEV);
                can_handler.socket = 0;
                can_handler.simulation = true;
                can_handler.send_msg = "FAKE CAN FRAME";
@@ -207,7 +212,7 @@ static int write_can()
                txCanFrame.data[6] = 0;
                txCanFrame.data[7] = 0;
 
-               AFB_DEBUG(interface, "%s: %d %d [%02x %02x %02x %02x %02x %02x %02x %02x]\n",
+               AFB_DEBUG("%s: %d %d [%02x %02x %02x %02x %02x %02x %02x %02x]\n",
                        can_handler.send_msg,
                        txCanFrame.can_id, txCanFrame.can_dlc,
                        txCanFrame.data[0], txCanFrame.data[1], txCanFrame.data[2], txCanFrame.data[3],
@@ -215,17 +220,17 @@ static int write_can()
 
                if(!can_handler.simulation)
                {
-                       rc = sendto(can_handler.socket, &txCanFrame, sizeof(struct can_frame), 0,
+                       rc = (int)sendto(can_handler.socket, &txCanFrame, sizeof(struct can_frame), 0,
                                    (struct sockaddr*)&can_handler.txAddress, sizeof(can_handler.txAddress));
                        if (rc < 0)
                        {
-                               AFB_ERROR(interface, "Sending CAN frame failed.");
+                               AFB_ERROR("Sending CAN frame failed.");
                        }
                }
        }
        else
        {
-               AFB_ERROR(interface, "socket not initialized. Attempt to reopen can device socket.");
+               AFB_ERROR("socket not initialized. Attempt to reopen can device socket.");
                open_can_dev();
        }
        return rc;
@@ -300,7 +305,7 @@ static void get_temp_left_zone(struct afb_req request)
  */
 static void get(struct afb_req request)
 {
-       AFB_DEBUG(interface, "Getting all values");
+       AFB_DEBUG("Getting all values");
        json_object *ret_json;
 
        ret_json = json_object_new_object();
@@ -326,7 +331,7 @@ static void set(struct afb_req request)
        uint8_t saves[sizeof hvac_values / sizeof *hvac_values];
 
        /* records initial values */
-       AFB_DEBUG(interface, "Records initial values");
+       AFB_DEBUG("Records initial values");
        i = (int)(sizeof hvac_values / sizeof *hvac_values);
        while (i) {
                i--;
@@ -337,22 +342,22 @@ static void set(struct afb_req request)
        query = afb_req_json(request);
        changed = 0;
        i = (int)(sizeof hvac_values / sizeof *hvac_values);
-       AFB_DEBUG(interface, "Looping for args. i: %d", i);
+       AFB_DEBUG("Looping for args. i: %d", i);
        while (i)
        {
                i--;
-               AFB_DEBUG(interface, "Searching... query: %s, i: %d, comp: %s", json_object_to_json_string(query), i, hvac_values[i].name);
+               AFB_DEBUG("Searching... query: %s, i: %d, comp: %s", json_object_to_json_string(query), i, hvac_values[i].name);
                if (json_object_object_get_ex(query, hvac_values[i].name, &val))
                {
-                       AFB_DEBUG(interface, "We got it. Tests if it is an int or double.");
+                       AFB_DEBUG("We got it. Tests if it is an int or double.");
                        if (json_object_is_type(val, json_type_int)) {
                                x = json_object_get_int(val);
-                               AFB_DEBUG(interface, "We get an int: %d",x);
+                               AFB_DEBUG("We get an int: %d",x);
                        }
                        else if (json_object_is_type(val, json_type_double)) {
                                d = json_object_get_double(val);
                                x = (int)round(d);
-                               AFB_DEBUG(interface, "We get a double: %f => %d",d,x);
+                               AFB_DEBUG("We get a double: %f => %d",d,x);
                        }
                        else {
                                afb_req_fail_f(request, "bad-request",
@@ -368,16 +373,16 @@ static void set(struct afb_req request)
                        if (values[i] != x) {
                                values[i] = (uint8_t)x;
                                changed = 1;
-                               AFB_DEBUG(interface,"%s changed to %d",hvac_values[i].name,x);
+                               AFB_DEBUG("%s changed to %d",hvac_values[i].name,x);
                        }
                }
                else {
-                       AFB_DEBUG(interface, "%s not found in query!",hvac_values[i].name);
+                       AFB_DEBUG("%s not found in query!",hvac_values[i].name);
                }
        }
 
        /* attemps to set new values */
-       AFB_DEBUG(interface, "Diff: %d", changed);
+       AFB_DEBUG("Diff: %d", changed);
        if (changed)
        {
                i = (int)(sizeof hvac_values / sizeof *hvac_values);
@@ -403,33 +408,91 @@ static void set(struct afb_req request)
        }
 }
 
-// TODO: Have to change session management flag to AFB_SESSION_CHECK to use token auth
-static const struct afb_verb_desc_v1 verbs[]= {
-       {"get_temp_left_zone"    , AFB_SESSION_NONE, get_temp_left_zone , "Get the left zone temperature"},
-       {"get_temp_right_zone"   , AFB_SESSION_NONE, get_temp_right_zone        , "Get the right zone temperature"},
-       {"get_fanspeed"  , AFB_SESSION_NONE, get_fanspeed       , "Read fan speed"},
-       {"get"   , AFB_SESSION_NONE, get        , "Read all values"},
-       {"set"   , AFB_SESSION_NONE, set        , "Set a HVAC component value"},
-       {NULL}
-};
-
-static const struct afb_binding binding_desc = {
-       .type = AFB_BINDING_VERSION_1,
-       .v1 = {
-               .info = "hvac service",
-               .prefix = "hvac",
-               .verbs = verbs
-       }
-};
-
-const struct afb_binding *afbBindingV1Register (const struct afb_binding_interface *itf)
+int bindingServicePreInit(struct afb_service service)
 {
-       interface = itf;
+       return open_can_dev();
+}
 
-       return &binding_desc;
+int bindingServiceInit(struct afb_service service)
+{
+       event = afb_daemon_make_event("language");
+       if(afb_daemon_require_api("identity", 1))
+               return -1;
+       return afb_service_call_sync("identity", "subscribe", NULL, NULL);
 }
 
-int afbBindingV1ServiceInit(struct afb_service service)
+void onEvent(const char *event_name, struct json_object *object)
 {
-       return open_can_dev();
+       json_object *args, *language = json_object_new_object();
+       json_object *id_evt_name, *current_identity;
+
+       AFB_NOTICE("Event '%s' received: %s", event_name,
+               json_object_to_json_string_ext(object, JSON_C_TO_STRING_PRETTY));
+
+       if (json_object_object_get_ex(object, "eventName", &id_evt_name) &&
+         !strcmp(json_object_get_string(id_evt_name), "login") &&
+         !afb_service_call_sync("identity", "get", NULL, &current_identity)) {
+               json_object *response;
+               if (! json_object_object_get_ex(current_identity, "response", &response) || ! json_object_object_get_ex(response, "graphPreferredLanguage", &language)) {
+                       language = json_object_new_string("en_US");
+               }
+               afb_event_broadcast(event, language);
+       }
 }
+
+// TODO: Have to change session management flag to AFB_SESSION_CHECK to use token auth
+static const struct afb_verb_v2 _afb_verbs_v2_hvac[]= {
+       {
+               .verb = "get_temp_left_zone",
+               .callback = get_temp_left_zone,
+               .auth = NULL,
+               .info = "Get the left zone temperature",
+               .session = AFB_SESSION_NONE_V2
+       },
+       {
+               .verb = "get_temp_right_zone",
+               .callback = get_temp_right_zone,
+               .auth = NULL,
+               .info = "Get the right zone temperature",
+               .session = AFB_SESSION_NONE_V2
+       },
+       {
+               .verb = "get_fanspeed",
+               .callback = get_fanspeed,
+               .auth = NULL,
+               .info = "Read fan speed",
+               .session = AFB_SESSION_NONE_V2
+       },
+       {
+               .verb = "get",
+               .callback = get,
+               .auth = NULL,
+               .info = "Read all speed",
+               .session = AFB_SESSION_NONE_V2
+       },
+       {
+               .verb = "set",
+               .callback = set,
+               .auth = NULL,
+               .info = "Set a HVAC component value",
+               .session = AFB_SESSION_NONE_V2
+       },
+       {
+               .verb = NULL,
+               .callback = NULL,
+               .auth = NULL,
+               .info = NULL,
+               .session = 0
+       }
+};
+
+const struct afb_binding_v2 afbBindingV2 = {
+    .api = "hvac",
+    .specification = NULL,
+    .info = "HVAC service",
+    .verbs = _afb_verbs_v2_hvac,
+    .preinit = bindingServicePreInit,
+    .init = bindingServiceInit,
+    .onevent = onEvent,
+    .noconcurrency = 0
+};
index 9748f0b..b68838a 100644 (file)
@@ -9,6 +9,7 @@
   <feature name="urn:AGL:widget:required-api">
     <param name="windowmanager" value="ws" />
     <param name="homescreen" value="ws" />
+    <param name="identity" value="ws" />
     <param name="lib/libhvac-demo-binding.so" value="local" />
   </feature>
   <feature name="urn:AGL:widget:required-permission">