Add gitlab issue/merge request templates
[apps/agl-service-can-low-level.git] / low-can-binding / utils / 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 "signals.hpp"
19
20 namespace utils
21 {
22         signals_manager_t::signals_manager_t()
23         {}
24
25         /// @brief Return singleton instance of configuration object.
26         signals_manager_t& signals_manager_t::instance()
27         {
28                 static signals_manager_t sm;
29                 return sm;
30         }
31
32         /// @brief Return Subscribed signals map mutex.
33         std::mutex& signals_manager_t::get_subscribed_signals_mutex()
34         {
35                 return subscribed_signals_mutex_;
36         }
37
38         ///
39         /// @brief return the subscribed_signals map.
40         ///
41         /// @return Map of subscribed signals.
42         map_subscription& signals_manager_t::get_subscribed_signals()
43         {
44                 return subscribed_signals_;
45         }
46
47         ///
48         /// @fn std::vector<std::string> find_signals(const openxc_DynamicField &key)
49         /// @brief return signals name found searching through signals and OBD2 pid
50         ///
51         /// @param[in] key : can contain numeric or string value in order to search against
52         ///   can signals or obd2 signals name.
53         ///
54         /// @return Vector of signals name found.
55         ///
56         struct signals_found signals_manager_t::find_signals(const openxc_DynamicField &key)
57         {
58                 struct signals_found sf;
59
60                 switch(key.type)
61                 {
62                         case openxc_DynamicField_Type::openxc_DynamicField_Type_STRING:
63                                         lookup_signals_by_name(key.string_value, application_t::instance().get_all_signals(), sf.signals);
64                                         lookup_signals_by_name(key.string_value, application_t::instance().get_diagnostic_messages(), sf.diagnostic_messages);
65                                 break;
66                         case openxc_DynamicField_Type::openxc_DynamicField_Type_NUM:
67                                         lookup_signals_by_id(key.numeric_value, application_t::instance().get_all_signals(), sf.signals);
68                                         lookup_signals_by_id(key.numeric_value, application_t::instance().get_diagnostic_messages(), sf.diagnostic_messages);
69                                 break;
70                         default:
71                                 AFB_ERROR("wrong openxc_DynamicField specified. Use openxc_DynamicField_Type_NUM or openxc_DynamicField_Type_STRING type only.");
72                                 break;
73                 }
74                 AFB_DEBUG("Found %d signal(s)", (int)(sf.signals.size() + sf.diagnostic_messages.size()));
75                 return sf;
76         }
77 }