summaryrefslogtreecommitdiffstats
path: root/src/can-signals.hpp
blob: fb77df5cfb928086320ffe9021481ae2e3790a39 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 * Copyright (C) 2015, 2016 "IoT.bzh"
 * Author "Romain Forlot" <romain.forlot@iot.bzh>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *	 http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <map>
#include <queue>
#include <vector>
#include <string>
#include <thread>
#include <linux/can.h>
#include <mutex>
#include <condition_variable>

#include "timer.hpp"
#include "openxc.pb.h"
#include "can-utils.hpp"

extern "C"
{
	#include <afb/afb-binding.h>
	#include <afb/afb-event-itf.h>
}

#define MESSAGE_SET_ID 0

/** 
 * @brief Can signal event map making access to afb_event
 * externaly to an openxc existing structure.
 *
 * @desc Event map is making relation between CanSignal generic name
 * and the afb_event struct used by application framework to pushed
 * to the subscriber.
 */
static std::map<std::string, struct afb_event> subscribed_signals;

/**
* @brief Mutex allowing safe manipulation on subscribed_signals map.
* @desc To ensure that the map object isn't modified when we read it, you
*  have to set this mutex before use subscribed_signals map object.
*/
extern std::mutex subscribed_signals_mutex;

/** Public: Return the currently active CAN configuration. */
CanMessageSet* getActiveMessageSet();

/** Public: Retrive a list of all possible CAN configurations.
 *
 * Returns a pointer to an array of all configurations.
 */
CanMessageSet* getMessageSets();

/** Public: Return the length of the array returned by getMessageSets() */
int getMessageSetCount();

/* Public: Return the number of CAN buses configured in the active
 * configuration. This is limited to 2, as the hardware controller only has 2
 * CAN channels.
 */
int getCanBusCount();

/* Public: Return an array of all CAN messages to be processed in the active
 * configuration.
 */
CanMessageDefinition* getMessages();

/* Public: Return signals from an signals array filtered on name.
 */
const std::vector<CanSignal> getSignals();

/* Public: Return an array of all OpenXC CAN commands enabled in the active
 * configuration that can write back to CAN with a custom handler.
 *
 * * Commands not defined here are handled using a 1-1 mapping from the signals
 * list.
 *		*/
CanCommand* getCommands();

/* Public: Return the length of the array returned by getCommandCount(). */
int getCommandCount();

/* Public: Return the length of the array returned by getSignals(). */
size_t getSignalCount();

/* Public: Return the length of the array returned by getMessages(). */
int getMessageCount();

/**
 * @brief Return an array of the metadata for the 2 CAN buses you want to
 * monitor. The size of this array is fixed at 2.
 */
CanBus* getCanBuses();

/**
 * @brief Find one or many signals based on its name or id
 * passed through openxc_DynamicField.
 *
 * @param[in] openxc_DynamicField& - a const reference with the key to search into signal.
 * Key is either a signal name or its CAN arbitration id.
 *
 * @return std::vector<std::string> return found CanSignal generic name vector.
 */
std::vector<CanSignal> find_can_signals(const openxc_DynamicField &key);

/**
 * @brief Retrieve can arbitration id of a given CanSignal
 *
 * @param[in] CanSignal& - a const reference to a CanSignal
 *
 * @return uint32_t - unsigned integer representing the arbitration id.
 */
inline uint32_t get_CanSignal_id(const CanSignal& sig);

/**
 * @brief return the subscribed_signals map.
 * 
 * return std::map<std::string, struct afb_event> - map of subscribed signals.
 */
const std::map<std::string, struct afb_event> get_subscribed_signals();