2cf4b03849fc2042e59f0de8195db9d66d0d24c4
[apps/agl-service-can-low-level.git] / src / can-signals.cpp
1 /*
2  * Copyright (C) 2015, 2016 "IoT.bzh"
3  * Author "Romain Forlot" <romain.forlot@iot.bzh>
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *       http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 #include "can-signals.hpp"
19
20 /**
21  * @brief Dumb SIGNALS array. It is composed by CanMessageSet
22  * SIGNALS[MESSAGE_SET_ID][CanSignal]
23  */
24 std::vector<std::vector<CanSignal>> SIGNALS {
25         {}// message set: example
26 };
27
28 const std::vector<CanSignal> getSignals()
29 {
30         return SIGNALS[MESSAGE_SET_ID];
31 }
32
33 size_t getSignalCount()
34 {
35         return SIGNALS[MESSAGE_SET_ID].size();
36 }
37
38 std::vector<CanSignal> find_can_signals(openxc_DynamicField& key)
39 {
40         std::vector<CanSignal> signals;
41
42         switch(key.type)
43         {
44                 case openxc_DynamicField_Type::openxc_DynamicField_Type_STRING:
45                         for(const CanSignal& s : getSignals())
46                         {
47                                 if(fnmatch(key.string_value, s.genericName, FNM_CASEFOLD) == 0)
48                                         signals.push_back(s);
49                         }
50                         break;
51                 case openxc_DynamicField_Type::openxc_DynamicField_Type_NUM:
52                         for(const CanSignal& s : getSignals())
53                         {
54                                 CanMessageDefinition *msg_def = s.message;
55                                 if(msg_def->id == key.numeric_value)
56                                         signals.push_back(s);
57                         }
58                         break;
59                 default:
60                         ERROR(binder_interface, "find_can_signals: wrong openxc_DynamicField specified. Use openxc_DynamicField_Type_NUM or openxc_DynamicField_Type_STRING type only.");
61                         CanSignal cs;
62                         ::memset(&cs, 0, sizeof(CanSignal));
63                         signals.push_back(cs);
64                         return signals;
65                         break;
66         }
67         return signals;
68 }
69
70 inline uint32_t get_CanSignal_id(const CanSignal& sig)
71 {
72         return sig.message->id;
73 }
74
75 const std::map<std::string, struct afb_event> get_subscribed_signals()
76 {
77         return subscribed_signals;
78 }