Change hpp include file directive
[apps/agl-service-can-low-level.git] / src / can_event_push.cpp
1 /*
2  * Copyright (C) 2015, 2016 "IoT.bzh"
3  * Author "Romain Forlot" <romain.forlot@iot.bzh>
4  * Author "Loic Collignon" <loic.collignon@iot.bzh>
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *       http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18
19 #include <linux/can.h>
20 #include <linux/can/raw.h>
21 #include <queue>
22
23 #include <afb/afb-binding.h>
24
25 #include "can-utils.h"
26 #include "openxc.pb.h"
27 #include "json-c/json.h"
28
29 void can_event_push(can_bus_t& can_bus)
30 {
31         openxc_VehicleMessage v_message;
32         openxc_SimpleMessage s_message;
33         iterator it_event;
34
35         while(true)
36         {
37                 if(v_message = can_bus->next_vehicle_message())
38                 {
39                         s_message = get_simple_message(v_msg);
40                         const auto& it_event = subscribed_signals.find(s_msg.name);
41                         if(! it_event->end() && afb_event_is_valid(it_event->second))
42                                 afb_event_push(it_event->second, jsonify_simple(s_msg));
43                 }
44         }
45 }
46
47 void jsonify_DynamicField(const openxc_DynamicField& field, const json_object& value)
48 {
49         if(field.has_numeric_value)
50                 json_object_object_add(value, "value", json_object_new_double(field.numeric_value));
51         else if(field.has_boolean_value)
52                 json_object_object_add(value, "value", json_object_new_boolean(field.boolean_value));
53         else if(field.has_string_value)
54                 json_object_object_add(value, "value", json_object_new_string(field.string_value));
55
56         return value;
57 }
58
59 /* Extract the simple message value from an openxc_VehicleMessage
60  * and return it, or null if there isn't.
61  */
62 openxc_SimpleMessage get_simple_message(const openxc_VehicleMessage& v_msg)
63 {
64         return v_msg.has_simple_message ? v_msg.simple_message : {0};
65 }
66
67 json_object jsonify_simple(const openxc_SimpleMessage& s_msg)
68 {
69         json_object *json;
70         json = nullptr;
71
72         if(s_msg->has_name)
73         {
74           json = json_object_new_object();
75         json_object_object_add(json, "name", json_object_new_string(s_msg->name));
76         jsonify_DynamicField(&s_msg->value, json);
77   }
78         return json;
79 }