Change CanMessage_c to can_message_t class name
[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                         it_event = event_map.find(s_msg->name);
41                         afb_event_push(it_event->second, jsonify_simple(s_msg));
42                 }
43         }
44 }
45
46 void jsonify_DynamicField(openxc_DynamicField *field, json_object *value)
47 {
48         if(field->has_numeric_value)
49                 json_object_object_add(value, "value", json_object_new_double(field->numeric_value));
50         else if(field->has_boolean_value)
51                 json_object_object_add(value, "value", json_object_new_boolean(field->boolean_value));
52         else if(field->has_string_value)
53                 json_object_object_add(value, "value", json_object_new_string(field->string_value));
54
55         return value;
56 }
57
58 /* Extract the simple message value from an openxc_VehicleMessage
59  * and return it, or null if there isn't.
60  */
61 openxc_SimpleMessage* get_simple_message(openxc_VehicleMessage *v_msg)
62 {
63         if(v_msg->has_simple_message)
64                 return v_msg->simple_message;
65         
66         return nullptr;
67 }
68
69 json_object* jsonify_simple(openxc_SimpleMessage *s_msg)
70 {
71         json_object *json;
72         json = json_object_new_object();
73
74         if(!s_msg->has_name)
75                 return nullptr;
76
77         json_object_object_add(json, "name", json_object_new_string(s_msg->name));
78         jsonify_DynamicField(&s_msg->value, json);
79
80         return json;
81 }