X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fcan-signals.cpp;h=5f23c40a19a01522aca38cc47367fbe064f9162a;hb=2e93fc880e497ac553111ba27f2de4b44ea94027;hp=610a5a8d137b6962c839d986a1cf43e237971739;hpb=6f6364f74a4c454d096b0525bdb7563783ee80b7;p=apps%2Fagl-service-can-low-level.git diff --git a/src/can-signals.cpp b/src/can-signals.cpp index 610a5a8d..5f23c40a 100644 --- a/src/can-signals.cpp +++ b/src/can-signals.cpp @@ -15,60 +15,85 @@ * limitations under the License. */ -#include -#include +#include "can-signals.hpp" + #include -#include "can-signals.h" -/* Can signal event map making access to afb_event - * external to openxc existing structure. +#include "can-decoder.hpp" +#include "low-can-binding.hpp" + +std::vector> CAN_MESSAGES = { + {{620, CanMessageFormat::STANDARD, {10, 0, nullptr}, false, (uint8_t)NULL}}, +}; + +/** + * @brief Dumb SIGNALS array. It is composed by CanMessageSet + * SIGNALS[MESSAGE_SET_ID][CanSignal] */ -std::map subscribed_signals; -std::map ::iterator subscribed_signals_i; +std::vector> SIGNALS = { + {{&(CAN_MESSAGES[0][0]), "can.driver_door.open", 2, 4, 1.000000, 0.000000, 0.000000, 0.000000, {10, 0, nullptr}, false, true, nullptr, 0, false, decoder_t::booleanDecoder, nullptr, false, (float)NULL}}, +}; -/* Find one or many signals based on its name or id -* passed through openxc_DynamicField. +/** +* @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. */ -#define MESSAGE_SET_ID 0 -std::vector find_can_signals(openxc_DynamicField &key) +std::mutex subscribed_signals_mutex; + +std::mutex& get_subscribed_signals_mutex() +{ + return subscribed_signals_mutex; +} + +const std::vector getSignals() +{ + return SIGNALS[MESSAGE_SET_ID]; +} + +size_t getSignalCount() { - std::vector signals; - int n_signals, i; + return SIGNALS[MESSAGE_SET_ID].size(); +} - n_signals = getSignalCount(); +std::vector find_can_signals(const openxc_DynamicField &key) +{ + std::vector signals; - switch(key->type): + switch(key.type) { case openxc_DynamicField_Type::openxc_DynamicField_Type_STRING: - for(const CanSignal& s : SIGNALS[MESSAGE_SET_ID]) + for(const CanSignal& s : getSignals()) { - if(fnmatch(key->string_value, s.genericName) == 0) + if(fnmatch(key.string_value, s.genericName, FNM_CASEFOLD) == 0) signals.push_back(s); } break; case openxc_DynamicField_Type::openxc_DynamicField_Type_NUM: - for(const CanSignal& s : SIGNALS[MESSAGE_SET_ID]) + for(const CanSignal& s : getSignals()) { CanMessageDefinition *msg_def = s.message; - if(msg_def->id == key->numeric_value) - signals.push_back(s) + if(msg_def->id == key.numeric_value) + signals.push_back(s); } break; default: - ERROR(interface, "find_can_signals: wrong openxc_DynamicField specified. Use openxc_DynamicField_Type_NUM or openxc_DynamicField_Type_STRING type only."); - return NULL; + ERROR(binder_interface, "find_can_signals: wrong openxc_DynamicField specified. Use openxc_DynamicField_Type_NUM or openxc_DynamicField_Type_STRING type only."); + CanSignal cs; + ::memset(&cs, 0, sizeof(CanSignal)); + signals.push_back(cs); + return signals; break; } - return signals; } -std::vector& getSignals() +inline uint32_t get_CanSignal_id(const CanSignal& sig) { - return SIGNALS[MESSAGE_SET_ID]; + return sig.message->id; } -int getSignalCount() +const std::map get_subscribed_signals() { - return SIGNALS[MESSAGE_SET_ID].size(); + return subscribed_signals; } \ No newline at end of file