std::map<std::string, std::shared_ptr<can_bus_dev_t>> can_bus_t::can_devices_;
-/// @brief Listen for all device sockets and fill can_messages_queue with them.
-/// Reading blocks until message arrive on listened sockets.
-///
-/// @return 0 if ok -1 if not
-int can_bus_t::can_reader()
-{
- fd_set rfds;
- int sock_max = INVALID_SOCKET;
-
- FD_ZERO(&rfds);
-
- for(auto& can_dev : can_devices_)
- {
- FD_SET(can_dev.second->get_socket().socket(), &rfds);
- if (sock_max < can_dev.second->get_socket().socket())
- sock_max = can_dev.second->get_socket().socket();
- }
-
- int ret;
- while(is_reading_)
- {
- ret = select(sock_max + 1, &rfds, nullptr, nullptr, nullptr);
-
- if(ret == -1)
- perror("select()");
- else if(ret > 0)
- {
- for(const auto& s: can_devices_)
- {
- if(FD_ISSET(s.second->get_socket().socket(), &rfds))
- {
- can_message_t msg;
- s.second->get_socket() >> msg;
- std::lock_guard<std::mutex> can_message_lock(get_can_message_mutex());
- { push_new_can_message(msg); }
- get_new_can_message_cv().notify_one();
- }
- }
- }
- else
- printf("Timeout\n");
- }
- return 0;
-}
-
/// @brief Will make the decoding operation on a classic CAN message. It will not
/// handle CAN commands nor diagnostic messages that have their own method to get
/// this happens.
/// @param[in] can_message - a single CAN message from the CAN socket read, to be decode.
///
/// @return How many signals has been decoded.
-int can_bus_t::process_can_signals(can_message_t& can_message)
+int can_bus_t::process_can_signals(const can_message_t& can_message)
{
int processed_signals = 0;
struct utils::signals_found signals;
signals = sm.find_signals(search_key);
// Decoding the message ! Don't kill the messenger !
- for(auto& sig : signals.can_signals)
+ for(const auto& sig : signals.can_signals)
{
std::lock_guard<std::mutex> subscribed_signals_lock(sm.get_subscribed_signals_mutex());
std::map<std::string, struct afb_event>& s = sm.get_subscribed_signals();
- // DEBUG message to make easier debugger STL containers...
- //DEBUG(binder_interface, "Operator[] key char: %s, event valid? %d", sig.generic_name, afb_event_is_valid(s[sig.generic_name]));
- //DEBUG(binder_interface, "Operator[] key string: %s, event valid? %d", sig.generic_name, afb_event_is_valid(s[std::string(sig.generic_name)]));
- //DEBUG(binder_interface, "Nb elt matched char: %d", (int)s.count(sig.generic_name));
- //DEBUG(binder_interface, "Nb elt matched string: %d", (int)s.count(std::string(sig.generic_name));
if( s.find(sig->get_name()) != s.end() && afb_event_is_valid(s[sig->get_name()]))
{
bool send = true;
/// and push subscribed events.
void can_bus_t::start_threads()
{
- is_reading_ = true;
- th_reading_ = std::thread(&can_bus_t::can_reader, this);
- if(!th_reading_.joinable())
- is_reading_ = false;
-
is_decoding_ = true;
th_decoding_ = std::thread(&can_bus_t::can_decode_message, this);
if(!th_decoding_.joinable())
/// they'll finish their job.
void can_bus_t::stop_threads()
{
- is_reading_ = false;
is_decoding_ = false;
is_pushing_ = false;
}